Узнаем, что же случилось с Павлом Ивановичем Васиным, жителем городка Зареченска. Любящий муж и отец, отзывчивый сосед и сослуживец, словом, душа-человек в один прекрасный день превратился в недовольного всем чинушу и формалиста. А все из-за того, что ему в глаз попал осколок волшебного зеркала…
Телеведущая Елена Летучая показала подписчикам кадры своего пляжного отдыха. Звезда шоу «Ревизорро» опубликовала фото в Instagram (принадлежит Meta, признанной в РФ экстремистской и запрещенной организацией).
Виктор Дробыш жестко прошелся по образу певца Akmal в эфире шоу «Соль. Легенда» от VK Видео. Поводом для критики стал аксессуар, с которым артист вышел на сцену. Дробыш заявил, что не видит смысла в
Художница и писательница Елена Задорнова-Тартуси, дочь известного сатирика Михаила Задорнова, показала публике своего мужа и детей. Семейные кадры она опубликовала в личном блоге. На снимках, сделанных дома,
Экс-солистка группы Serebro Ольга Серябкина примерила откровенный вечерний образ для съемок нового клипа. Кадрами с площадки певица поделилась в личном блоге. На фото 41-летняя артистка запечатлена в черном
Дана Борисова откровенно высказалась о личной драме своей дочери Полины Аксеновой. В центре скандала оказался продюсер Дмитрия Диброва Артур Якобсон, который старше девушки на 17 лет. Ранее у них были
Певица Сати Казанова рассказала, что ей приходилось сталкиваться с опасным поведением фанатов. Некоторые из них доходили до настоящего преследования. Подробностями артистка поделилась с kp.ru. Как вспоминает
Телеведущая и блогер Ксения Бородина рассказала подписчикам своей личной страницы в социальной сети, что ее планы на стремительное похудение после смены образа жизни не оправдались. Звезда призналась: она
Певица Сати Казанова в разговоре с kp.ru выразила сомнение в том, что искусственный интеллект можно взять под контроль. Она подчеркнула: ИИ, как и любую другую технологию, можно применять как во благо, так и во
Экс-солистка группы Serebro Ольга Серябкина примерила ультракороткое кожаное платье для новой фотосессии. Артистка выбрала откровенный наряд, который выгодно подчеркнул ее силуэт. Образ звезда дополнила
Блогер Александра Митрошина вышла из зала суда с чувством облегчения. В беседе с журналистами издания Super.ru она призналась, что приговор в виде трех лет условно стал для нее лучшим из возможных вариантов.
В российском кинематографе немало актрис, которые не скрывают отсутствие у них заветной «корочки». Дар от природы, страсть к профессии, желание совершенствоваться — вот что помогло звездам без образования
Вера Брежнева вышла на связь с поклонниками и показала кадры с отдыха. 44-летняя артистка опубликовала снимок в купальнике, сделанный на шезлонге у моря. Фото появилось на ее личной странице в социальной сети.
На сцене Игорь Золотовицкий часто играл обаятельных, остроумных и уверенных в себе мужчин. Но за кулисами его жизни были несчастная первая любовь, фиктивный брак и случайная встреча, которая подарила ему
В Москве прошла церемония прощания с актрисой Татьяной Плетневой. Об этом пишет «СтарХит». Гражданская панихида состоялась в ритуальном зале морга ГКБ № 36 имени Иноземцева. Актрису похоронили на
Российская певица и телеведущая Ольга Бузова похвасталась бриллиантовыми покупками на 1,2 миллиона рублей. На сторис, размещенные в Instagram (принадлежит компании Meta, признанной экстремистской организацией и
Звезда «Кухни» Сергей Лавыгин выступил в роли личного фотографа для своей жены. Актриса Мария Луговая устроила фотосессию в бикини прямо в бассейне во время семейного отпуска. Получившимися снимками она
Певица и телеведущая Ольга Бузова второй день подряд нарушает больничный режим. Об этом сообщает издание Super. Игнорируя запреты врачей и превозмогая боль, звезда покидает палату ради работы. Накануне артистка
Модель Карина Истомина, супруга футболиста Федора Смолова, показала кадры с отпуска в Италии. Снимки появились в ее Instagram (принадлежит Meta, признанной в РФ экстремистской и запрещенной организации). На
Ко дню рождения Виктора Цоя прослушивания русского рока выросли в пять раз. Об этом «Газете.Ru» сообщили в сервисе «КИОН Музыка». Аналитики выяснили, что с 1 апреля по 14 июня 2026 года количество проигрываний
Продюсер Яна Рудковская в личном блоге разместила снимки, сделанные на пляже в Бодруме. На фото 51-летняя бизнесвумен запечатлена в монокини от Chanel. Пляжный наряд подчеркнул стройную фигуру звезды.
\ No newline at end of file
diff --git a/sites/tv.mail.ru/__data__/program2.html b/sites/tv.mail.ru/__data__/program2.html
new file mode 100644
index 000000000..5bd4254f3
--- /dev/null
+++ b/sites/tv.mail.ru/__data__/program2.html
@@ -0,0 +1,126 @@
+
Музыкальная комедия по пьесе французского драматурга Эжена Лабиша. Двое молодых людей - Арман и Даниэль - влюбляются в дочь каретника Перришона. Девушка тоже пока не поняла, кто ей больше нравится. Она решила проверить их в деле: отправилась с ними в горы искать клад. Пусть в полевых условиях поухаживают. Вот тогда и станет ясно, кто из женихов больше достоин руки девушки…
Телеведущая Елена Летучая показала подписчикам кадры своего пляжного отдыха. Звезда шоу «Ревизорро» опубликовала фото в Instagram (принадлежит Meta, признанной в РФ экстремистской и запрещенной организацией).
Виктор Дробыш жестко прошелся по образу певца Akmal в эфире шоу «Соль. Легенда» от VK Видео. Поводом для критики стал аксессуар, с которым артист вышел на сцену. Дробыш заявил, что не видит смысла в
Художница и писательница Елена Задорнова-Тартуси, дочь известного сатирика Михаила Задорнова, показала публике своего мужа и детей. Семейные кадры она опубликовала в личном блоге. На снимках, сделанных дома,
Экс-солистка группы Serebro Ольга Серябкина примерила откровенный вечерний образ для съемок нового клипа. Кадрами с площадки певица поделилась в личном блоге. На фото 41-летняя артистка запечатлена в черном
Дана Борисова откровенно высказалась о личной драме своей дочери Полины Аксеновой. В центре скандала оказался продюсер Дмитрия Диброва Артур Якобсон, который старше девушки на 17 лет. Ранее у них были
Певица Сати Казанова рассказала, что ей приходилось сталкиваться с опасным поведением фанатов. Некоторые из них доходили до настоящего преследования. Подробностями артистка поделилась с kp.ru. Как вспоминает
Телеведущая и блогер Ксения Бородина рассказала подписчикам своей личной страницы в социальной сети, что ее планы на стремительное похудение после смены образа жизни не оправдались. Звезда призналась: она
Певица Сати Казанова в разговоре с kp.ru выразила сомнение в том, что искусственный интеллект можно взять под контроль. Она подчеркнула: ИИ, как и любую другую технологию, можно применять как во благо, так и во
Экс-солистка группы Serebro Ольга Серябкина примерила ультракороткое кожаное платье для новой фотосессии. Артистка выбрала откровенный наряд, который выгодно подчеркнул ее силуэт. Образ звезда дополнила
Блогер Александра Митрошина вышла из зала суда с чувством облегчения. В беседе с журналистами издания Super.ru она призналась, что приговор в виде трех лет условно стал для нее лучшим из возможных вариантов.
В российском кинематографе немало актрис, которые не скрывают отсутствие у них заветной «корочки». Дар от природы, страсть к профессии, желание совершенствоваться — вот что помогло звездам без образования
Вера Брежнева вышла на связь с поклонниками и показала кадры с отдыха. 44-летняя артистка опубликовала снимок в купальнике, сделанный на шезлонге у моря. Фото появилось на ее личной странице в социальной сети.
На сцене Игорь Золотовицкий часто играл обаятельных, остроумных и уверенных в себе мужчин. Но за кулисами его жизни были несчастная первая любовь, фиктивный брак и случайная встреча, которая подарила ему
В Москве прошла церемония прощания с актрисой Татьяной Плетневой. Об этом пишет «СтарХит». Гражданская панихида состоялась в ритуальном зале морга ГКБ № 36 имени Иноземцева. Актрису похоронили на
Российская певица и телеведущая Ольга Бузова похвасталась бриллиантовыми покупками на 1,2 миллиона рублей. На сторис, размещенные в Instagram (принадлежит компании Meta, признанной экстремистской организацией и
Звезда «Кухни» Сергей Лавыгин выступил в роли личного фотографа для своей жены. Актриса Мария Луговая устроила фотосессию в бикини прямо в бассейне во время семейного отпуска. Получившимися снимками она
Певица и телеведущая Ольга Бузова второй день подряд нарушает больничный режим. Об этом сообщает издание Super. Игнорируя запреты врачей и превозмогая боль, звезда покидает палату ради работы. Накануне артистка
Модель Карина Истомина, супруга футболиста Федора Смолова, показала кадры с отпуска в Италии. Снимки появились в ее Instagram (принадлежит Meta, признанной в РФ экстремистской и запрещенной организации). На
Ко дню рождения Виктора Цоя прослушивания русского рока выросли в пять раз. Об этом «Газете.Ru» сообщили в сервисе «КИОН Музыка». Аналитики выяснили, что с 1 апреля по 14 июня 2026 года количество проигрываний
Продюсер Яна Рудковская в личном блоге разместила снимки, сделанные на пляже в Бодруме. На фото 51-летняя бизнесвумен запечатлена в монокини от Chanel. Пляжный наряд подчеркнул стройную фигуру звезды.
\ No newline at end of file
diff --git a/sites/tv.mail.ru/readme.md b/sites/tv.mail.ru/readme.md
index bf0763a04..90b41bab4 100644
--- a/sites/tv.mail.ru/readme.md
+++ b/sites/tv.mail.ru/readme.md
@@ -1,6 +1,6 @@
# tv.mail.ru
-https://tv.mail.ru/
+https://tv.mail.ru/moskva/
### Download the guide
diff --git a/sites/tv.mail.ru/tv.mail.ru.channels.xml b/sites/tv.mail.ru/tv.mail.ru.channels.xml
index 3da103652..1889c0f12 100644
--- a/sites/tv.mail.ru/tv.mail.ru.channels.xml
+++ b/sites/tv.mail.ru/tv.mail.ru.channels.xml
@@ -1,494 +1,225 @@
- Eurosport 1
- MTV 00s
- МИР
- Bloomberg
- РТР Беларусь
- Рыболов
- Москва. Доверие
- viju History
- Русский Экстрим
- Discovery Channel
- Shopping Live
- Тонус
- Телепутешествия
- Nickelodeon
- 360TV
- Шокирующее HD
- PRO Business
- Hustler TV Europe
- Mezzo Live HD
- viju TV1000 action
- World Fashion Channel
- СТВ
- viju TV1000
- НТВ Беларусь
- viju Explore
- Жара
- Радость Моя
- Paramount Comedy Russia
- MCM TOP
- Наше новое кино
- BRIDGE TV Русский ХитLuxe HD
- Индийское кино
- Stingray CMusic
- CNN
- Киносерия
- Москва-24
- Первый канал
- BRIDGE TV
- МАТЧ! Футбол 1
- Кто есть кто
- HDL
- Наука
- Ретро
- Союз
- Ля-минор. Мой музыкальный
- ОНТ
- Fashion TV HD
- Телеканал КХЛ
- Hollywood
- ЖИВИ!
- ЕДА
- Кинопоказ HD
- Усадьба
- Успех
- Настоящее Страшное Телевидение
- Discovery Science
- О2ТВ
- Luxe.TV
- ТВ Центр
- 5 канал
- Ю
- Мир сериала
- 365 дней ТВ
- Футбол
- FoodTime
- Звезда
- Зоо ТВ
- Загородный
- Русский Иллюзион
- Иллюзион +
- Совершенно секретно
- Феникс+Кино
- Мужской
- TV club
- MTV 80s
- БелМуз-ТВ
- 8 Канал
- 2x2
- Телекафе
- Dомашний
- Music Box Gold
- Вопросы и ответы
- Extreme Sports
- Комедийное HD
- Евроновости
- Кинокомедия
- .red
- ТВ-3
- Психология 21
- Кухня ТВ
- Top Shop TV
- Индия
- Родное кино
- Музыка Первого
- МУЗ ТВ
- СТС
- CNBC
- Авто Плюс
- РБК
- RUSSIAN MUSICBOX
- Русская ночь
- Шансон-TB
- Первый Городской
- Киномикс
- Время
- МАТЧ! Боец
- viju TV1000 русское
- РЕН ТВ
- myZen.tv
- Киносвидание
- Карусель
- Беларусь 2
- Культура
- ТНВ
- Сарафан
- Mezzo
- ТНТ MUSIC
- Спас ТВ
- Загородная жизнь
- Russia Today
- Дом Кино
- France 24
- Ностальгия
- Da VinciКинохит
- Здоровое ТВ
- .sci-fi
- Приключения HD
- TDK
- HD Медиа
- Кинопремьера
- Любимое кино
- Cinema
- National Geographic
- TV XXI
- Россия 1
- Fashion TV
- Беларусь 1
- viju+ Sport
- Blue Hustler
- Оружие
- Ocean TV
- Санкт-Петербург
- Уникум
- Gulli Girl
- Домашние животные
- Моя Планета
- Zooпарк
- English Club TV
- Ru.TVBBC
- Охота и рыбалка
- TiJi
- Russian Travel Guide
- viju Nature
- Мама
- Русский бестселлер
- Playboy TV
- BBC World
- Мультиландия
- БелРос
- Беларусь 24
- НТВ
- Драйв
- Русский роман
- МАТЧ! Футбол 2 HD
- Fashion One HD
- France 24 Francais
- Hollywood HD
- ТНВ-планета
- Просвещение
- МАТЧ! Футбол 1 HD
- НТВ Международное
- ACB TV
- Карусель International
- viju+ Planet
- French Lover
- Fashion One
- viju+ Megahit
- TV Mall
- .black
- Домашний Магазин
- Hustler HD
- Boomerang
- Travel+Adventure HD
- CGTN Русский
- Ростов-папа
- MTV Live International HD
- МАТЧ! Футбол 2
- SHOT TV
- А2
- Театр
- Stingray iConcerts
- Trace Sports HD
- Shop24
- Baby TV
- Eurosport 1 HD
- Телеканал КХЛ HD
- viju+ Comedy
- Nick Jr
- NHK WORLD
- Нано
- Outdoor HD
- .red HDCNN (eng)
- Global Star
- CBS Reality
- РЖД
- Arirang TV
- ТБН
- SHANT
- Киносемья
- Candy TV
- Кино ТВ
- Russia Today Documentary
- Europa Plus TV HD
- Россия 1 HD
- Еврокино
- ОТР
- Пятница!
- Amedia Premium HD
- Эхо TV
- Первый канал HD
- ВТВ
- ТВ-3
- Беларусь 3
- Охотник и Рыболов HD
- Candy TV HD
- Travel+Adventure
- Теледом
- BRIDGE TV HITS
- 8 канал
- А1 HD
- Моя стихия
- HD Media 3D
- История
- MTV Россия
- Остросюжетное HD
- Премиальное HD
- LUXURY
- Перец International
- Brazzers TV Europe
- Беларусь 5
- Candy Man
- Paramount Channel
- Paramount Channel HD
- Paramount Comedy Russia HD
- Авто 24 HD
- O-la-la
- Русский Детектив
- History HD
- History
- СТС Love
- Три Ангела
- Планета HD
- ID Investigation Discovery HD
- МАТЧ! Футбол 3
- Крик ТВ
- Вместе-РФ
- Russian Travel Guide HD
- viju+ Sport HD
- 1 HD Music Television
- Мульт
- МИР 24
- Discovery Science HD
- Candy 3D HD
- BRIDGE TV CLASSIC
- Телеканал 360° HD
- Russia Today Doc HD
- В мире животных
- Первый Космический HD
- Живая природа
- Бокс ТВ
- Страшное HD
- Setanta Sports 1
- Bollywood HD
- Точка ТВ
- Кубань 24 ОрбитаRussia Today Documentary HD
- Food Network
- ЛДПР ТВ
- Amedia Hit
- Техно 24
- ЕГЭ ТВ
- TVM Channel
- Живая планета
- MTV Rocks International
- БелБизнесЧенел
- TV1 KG HD
- ТНТ International
- Дом Кино Премиум
- Мир Увлечений
- Рыжий
- Тайны галактики
- Надежда
- Капитан Фантастика
- Красная линия
- SONGTV Armenia
- Бобер
- Ani
- Ювелирочка
- Мужское кино
- МАТЧ!
- Че
- Комедия
- ТНТ4
- Калейдоскоп ТВMuseum HDInsight Ultra HD
- МАТЧ! Планета
- МАТЧ! Игра
- МАТЧ! Арена
- МАТЧ! Арена HD
- E TV
- Конный мир
- Dомашний International
- КВН ТВ
- History 2
- Центральное телевидение
- Открытый мир
- ТЛУМ HD
- Fashion One 4K
- Русский роман HD
- Живая природа HD
- BRIDGE TV Deluxe HD
- Кино ТВ HDРадио Страна ФМ
- Eurosport 2 International
- RUSSIAN MUSICBOX HD
- Анекдот ТВ
- Малыш ТВ
- Noise
- Наше Крутое
- Наш Кинороман
- CCTV4
- Food Network HD
- Шалун
- Шалун HD
- В гостях у сказки
- НТВ Право
- НТВ Сериал
- НТВ Стиль
- HITV
- О!
- ТНТ HDRussian Extreme ULTRA HD
- TVRUS
- Продвижение
- Spike
- World Business Channel
- History 2 HD
- Поехали!
- FilmBox Arthouse
- 7 TV
- Армения ТВ
- HOME 4K
- KBS WorldFast & FunBox HD
- Erox
- FightBox
- 360 TuneBox
- Охотник и Рыболов IntChina TV
- Доктор
- Диалоги о рыбалке
- Пес и Ко
- Eurochannel
- Наша Сибирь 4К
- Clubbing TV
- C4K360
- Первый вегетарианский
- ТНТ
- Классика Кино
- Известия
- Неизвестная Планета
- Восток ТВ
- Eurosport Gold
- Ратник
- Дикий
- Barely legal
- Дорама HD
- Старт
- Большая Азия
- FRESHTV
- Любимое.ТВ
- ТВТУР
- Дикая рыбалка HD
- Дикая охота HD
- Детский мир
- Festival 4K
- Babes TV
- Eurosport Gold HD
- Дайвинг.TV
- Мультимузыка
- Blue Hustler 24
- Суббота!
- Точка отрыва
- РЕН ТВ International
- Сериал Ultra HD
- Кино Ultra HD
- Загородный Int
- M1 GLOBAL
- НТВ Хит
- Московский образовательныйFoodman.club
- Пятый International
- Жар Птица
- Motorsport.tv
- Russian Extreme TV ULTRA HD CINEMA
- Светлое ТВ
- СТС Kids
- МАТЧ! ПремьерХабар 24
- NANO HD
- Eurosport 4K
- BOLT
- 360° Новости
- Rai 1
- Тайна
- TV BRICSСмайлик ТВDeutsche Welle (Rus)
- Советское кино
- Советские мультфильмы
- Вкусное TV
- Сказки Зайки
- Романтичное HDМир вокруг HD
- FAN
- NickToons
- JOY COOK
- Терра Инкогнита
- Наша ТемаThe World Live
- viju+ Serial
- Setanta Sports 2
- NGC HD
- Europa Plus TV
- Мир Баскетбола
- О!Кино
+ Travel XP HD
+ Gagsnetwork
+ Удар
+ Travelxp 4K
+ KION ХИТ
+ Кино без границ
+ News Front TV
+ Киномульт
+ Советская киноклассика
+ Криминальное
+ Cartoon Classics
+ Советская киноклассика HD
+ День Победы
+ Scream
+ Лавстори
+ Лавстори HD
+ Saga TV
+ Наука
+ Патриот
+ 1 HD Music Television
+ 2x2
+ Три Ангела
+ 7 TV
+ 360° Новости
+ 360 TuneBox
+ Телеканал 360° HD
+ 360TV
+ 365 дней ТВ HD
+ 365 дней ТВ
+ А1 HD
+ А1
+ А2AIVA
- Бьюти.TV
- МАТЧ! Страна
- SONGTV Russia
- Победа
- Shant Music
- Киноман
- Россия 24
- РЕН ТВ HD
- Первый СНГ
- ТНТ International
- Перец International
- РЖД HD
- Дикая рыбалка
- Дикая охота
- НТВ HD
- ТНТ4 international
- Любимое SD
- МАТЧ! Премьер HD
- Discovery HD Showcase
- MTV Россия HD
- MTV European
- FOX HD
- Матч! Игра HD
- МАТЧ! Футбол 3 HD
- МАТЧ! HD
- ОТРК Баластан
- ОТРК Маданият
- ОТРК МузыкаAl JaZeera
- МИР 24 HD
- Star Family
- Star Cinema
- Точка отрыва HD
- Русская ночь HD
- Shant TV Сериал
- viju TV1000 action
- DTV TV1000 HD
- viju TV1000 Global KinoAmedia Hit HD
+ Amedia Hit
+ Amedia Premium HDAmedia Premium
+ Анекдот ТВ
+ Angel TV
+ AniAnimaux
- Карапуз ТВ
+ Arirang TV
+ H1
+ Арсенал
+ Авто Плюс
+ Авто 24 HD
+ Авто 24
+ Babes TV
+ Barely legal
+ Бьюти.TV
+ Беларусь 24
+ БелРос
+ Большая Азия
+ Big Planet HD
+ .black
+ Блокбастер HD
+ Блокбастер
+ Bloomberg
+ Blue Hustler
+ Blue Hustler 24
+ Бобер
+ Бокс ТВ
+ Bollywood HD
+ Bollywood
+ BOLT
+ Brazzers TV Europe
+ BRIDGE TV
+ BRIDGE TV CLASSIC
+ BRIDGE TV Deluxe HD
+ BRIDGE TV HITS
+ BRIDGE ROCK
+ BRIDGE TV Русский Хит
+ BRiDGE TV Шлягер
+ C4K360
+ Candy Man
+ Candy TV HD
+ Candy TV
+ Карусель
+ CCTV4
+ Центральное телевидение
+ CGTN
+ CGTN Русский
+ Пятый канал
+ 8 канал
+ Первый канал HD
+ Первый канал
+ Че
+ Cinema
+ Classic Music
+ Clubbing TV
+ CNBC
+ Curiosity Stream
+ Da Vinci
+ Детский мир
+ Диалоги о рыбалке
+ Дикая охота HD
+ Дикая охота
+ Дикая рыбалка HD
+ Дикая рыбалка
+ Дикий
+ Дайвинг.TV
+ Доктор
+ Домашние животные
+ Dомашний
+ Дом кино HD
+ Дом Кино
+ Дом кино Премиум HD
+ Дом Кино Премиум
+ Дорама HDДорама
- Russia Today HD
- Беларусь 5 HD
- Беларусь 24 HD
- RTVi Архив
+ Dorcel TV
+ Драйв
+ Дума ТВ
+ Эхо TV
+ ЕДА
+ Еда Премиум Международный
+ ЕГЭ ТВ
+ English Club HD
+ English Club TV
+ Erox
+ E TV
+ Europa Plus TV HD
+ Europa Plus TV
+ Еврокино HD
+ Еврокино
+ Евроновости
+ Extreme Sports
+ Exxxotica
+ FAN HD
+ FAN
+ FashionBox HD
+ Fashion One 4K
+ Fashion One HD
+ Fashion One
+ Fashion TV
+ Fashion TV HD
+ Fast & FunBox
+ Феникс+Кино
+ FightBox
+ FilmBox Arthouse
+ Fine Living HD
+ 1 российский национальный канал
+ FlixSnip
+ FoodTime
+ Футбол HD
+ Футбол
+ FOX HD
+ France 24
+ France 24 Francais
+ Френчлавер
+ FRESHTV
+ Пятница!
+ Global Star
+ Gulli Girl
+ HDL
+ HD Медиа
+ Телеканал HHQ
+ Хит HD
+ Хит
+ HITV
+ Hollywood HD
+ Hollywood
+ HOME 4K
+ Надежда
+ Hustler HD
+ Hustler TV Europe
+ Иллюзион +
+ Индия
+ Индийское кино
+ ID Investigation Discovery HD
+ История
+ Известия
+ JOY COOK
+ Калейдоскоп ТВ
+ Камеди
+ Капитан Фантастика
+ Карапуз ТВ
+ KBS World HD
+ KBS World
+ Телеканал КХЛ HD
+ Телеканал КХЛ
+ Кинеко
+ KINO24
+ KinoJam 1
+ KinoJam 2
+ Кинокомедия
+ KINOLIVING
+ Киноман
+ Киномикс HD
+ Киномикс
+ Кинопоказ HD
+ Кинопоказ
+ Кинопремьера HD
+ Кинопремьера
+ Киносемья
+ Киносерия
+ КиноСезон
+ Киносвидание
+ Кино ТВ HD
+ Кино ТВ
+ Кино Ultra HD
+ КиноужасКинозал 1Кинозал 2Кинозал 3
@@ -501,167 +232,292 @@
Кинозал 10Кинозал 11Кинозал 12
- Еврокино HD
- Trace Urban HD
- Cinema
+ Ключ
+ Комедия
+ Комедийное HD
+ Конный мир HD
+ Конный мир
+ Крик ТВ
+ Кто есть кто
+ Кухня ТВ
+ КВН ТВ
+ Ля-минор. Мой музыкальный
+ ЛДПР ТВ
+ Домашний Магазин
+ Лева ТВ
+ LifeNews HD
+ Luxe.TV
+ Luxury HD
+ LUXURY
+ Любимое SD
+ Любимое
+ Любимое.ТВ
+ M6 Suisse HD
+ Мама
+ МАТЧ! HD
+ МАТЧ!
+ МАТЧ! Арена HD
+ МАТЧ! Арена
+ МАТЧ! Боец
+ МАТЧ! Футбол 1 HD
+ МАТЧ! Футбол 1
+ МАТЧ! Футбол 2 HD
+ МАТЧ! Футбол 2
+ МАТЧ! Футбол 3 HD
+ МАТЧ! Футбол 3
+ Матч! Игра HD
+ МАТЧ! Игра
+ МАТЧ! Планета
+ МАТЧ! Премьер HD
+ МАТЧ! Премьер
+ МАТЧ! Страна
+ MCM TOP
+ Mezzo
+ Mezzo Live HD
+ МИР 24 HD
+ МИР 24
+ МИР
+ Мир Баскетбола
+ Мир сериала
+ Мир Увлечений
+ M1 Global HD
+ M1 GLOBAL
+ Мосфильм. Золотая коллекция
+ Москва-24
+ Москва. Доверие
+ Московский образовательный
+ Классика Кино
+ Моя Планета
+ Моя стихия HD
+ Моя стихия
+ MTV European
+ Мульт
+ Мультиландия
+ Мультимузыка
+ Music Box Gold
+ Мужское кино HD
+ Мужское кино
+ Мужской
+ МУЗ ТВ
+ Музыка Первого
+ myZen.tv
+ NANO HD
+ Нано
+ Наша Сибирь 4К
+ Наша сибирь HD
+ Наша Тема
+ Наше
+ Наше
+ Любимое кино
+ Наше мужское HD
+ Наше мужское
+ Наше новое кино
+ Наш Кинопоказ HD
+ Наш Кинопоказ
+ Душевное HD
+ Душевное
+ Неизвестная Планета
+ NHK World HD
+ NHK WORLD
+ Noise
+ Ностальгия
+ Настоящее Страшное Телевидение
+ НТВ HD
+ НТВ
+ НТВ Хит
+ НТВ Право
+ НТВ Сериал
+ НТВ Стиль
+ О2ТВ
+ О!
+ Ocean TV
+ Охотник и Рыболов HD
+ Охота и рыбалка
+ Оружие
+ Остросюжетное HD
+ Остросюжетное SD
+ Открытый мир
+ ОТР
+ Outdoor HD
+ Penthouse
+ Первый Космический HD
+ Первый вегетарианский
+ Пес и Ко
+ Plan_B
+ Планета HD
+ Playboy TV
+ Победа
+ Поехали!
+ Премиальное HD
+ Премиальное SD
+ Приключения HD
+ Private Spice
+ Pro100TV
+ PRO Business
+ Продвижение
+ Про любовь
+ Просвещение
+ Психология 21
+ Quadro
+ Радость Моя
+ Rai 1
+ Ратник
+ РБК
+ .red HD
+ .redRedlightRedlight HD
- ТВ-3 International
- World Business Channel HD
- FashionBox HD
- А1
- EuroSport 2 HD
- EuroSport 2
- 21TV
- History 2
- Yerkir Media
- Kentron TV
- Shoghakat
- ArmNews
- KBS World HD
- Penthouse
- Русский Экстрим HD
- AzTV
- Ictimai TV
- Medeniyyet TV
- Футбол HD
- LifeNews HD
- Наша сибирь HD
- Моя стихия HD
- World Fashion
- Bollywood
- Сила ТВ
- Space TV
- Мужское кино HD
- Живи! HD
- Xezer
- Xezer HD
- AR TV
- КТРК
- КТРК Спорт
- Dorcel TV
- CBC
- ЭлТр
- BELSAT TV
- Наше ТВ
- M6 Suisse HD
- Авто 24
- Конный мир HD
- Luxury HD
- 5 TV
- Nor Hayastan
- Киномикс HD
- Скиф
- Travel XP HD
- Fine Living HD
- Кинопремьера HD
- Muzzon TV
- 365 дней ТВ HD
- Дом кино Премиум HD
- Дом кино HD
- Кинопоказ
- KINO24
- Армения ТВ HD
- Рыжий
- M1 Global HD
- Motorsport.tv HD
- Angel TV
- Stingray iConcerts HD
- FAN HD
- Pro100TV
- +ТВ
- ЯСНАе ТV
- Private Spice
- Витебск
- Теледом HD
- Fast & FunBox
- Лида ТВ
- Fitnes TV
- USArmenia
- ATV
- ARTN
- HAY TV
- FILMZONE
- TAVA TV
- Setanta Sports 1 HD
- Setanta Sports 2 HD
- Ала-Тоо 24
- KINOMAN TV
- ТБН
- Luys
- Любимое
- Премиальное SD
- Остросюжетное SD
- Наше Крутое
- Наш Кинороман SD
- English Club HD
- Live Music Channel HD
- Дикий International
- H1
- H1
- Еркир Медиа
- ARB Gunes
- Варяг
- Bazmoc TV
- NHK World HD
- ICFN TV
- ARB TV
- CBC Sport HD
- Под елкой HD
- Киноужас
- Арсенал
- Love Nature
- КиноСезон
- Idman
- CGTN
- Наш Кинопоказ HD
- Блокбастер HD
- Наше мужское HD
- Про любовь
- Хит HD
- Камеди
- Trash
- Наш Кинопоказ
- Наше мужское
- Блокбастер
- Хит
- Мосфильм. Золотая коллекция
- Ключ
- FlixSnip
- Зал суда
- Gagsnetwork
- KinoJam 1
- KinoJam 2
- Timeless Dizi Channel
- ТВ Центр Открытый МИР
- ATV
- Звезда Плюс
- Classic Music
- СуперГерои
- Дума ТВ
- Big Planet HD
- Сапфир
- Кинеко
- Terra
- Лева ТВ
+ Красная линияRed Lips
- Еда Премиум Международный
- Здоровье HD
- Start Air
- Plan_B
- Exxxotica
- BRiDGE TV Шлягер
+ РЕН ТВ HD
+ РЕН ТВ
+ Ретро
+ Родное кино
+ Романтичное HD
+ Russia Today HD
+ Russia Today
+ Russia Today Documentary
+ Russia Today Doc HD
+ Russian Travel Guide HD
+ Russian Travel Guide
+ RTVi Архив
+ Россия 1 HD
+ Россия 1
+ Россия 24
+ Культура
+ Русский Экстрим HD
+ Русский Экстрим
+ RUSSIAN MUSICBOX HD
+ RUSSIAN MUSICBOX
+ Русская ночь HD
+ Русская ночь
+ Русский бестселлер
+ Русский Детектив
+ Русский Иллюзион
+ Русский роман HD
+ Русский роман
+ Ru.TV
+ Рыболов
+ Рыжий
+ РЖД HD
+ РЖД
+ Санкт-Петербург
+ Сапфир
+ Сарафан
+ .sci-fi
+ Шалун HD
+ Шалун
+ Шансон-TB
+ Шокирующее HD
+ Shop24
+ Shopping Live
+ SHOT TVШелк
- 1 российский национальный канал
- Start World
- Старт Триумф
- KINOLIVING
- Quadro
+ Сказки ЗайкиСОЛНЦЕ
- Телеканал HHQ
- BRIDGE ROCK
- Travelxp 4K
+ SONGTV Russia
+ Советские мультфильмы
+ Советское кино
+ Союз
+ Спас ТВ
+ Star Cinema
+ Star Family
+ Старт
+ Start Air
+ Старт Триумф
+ Start World
+ Stingray CMusic
+ Stingray iConcerts HD
+ Stingray iConcerts
+ Страшное HD
+ СТС
+ СТС Kids
+ СТС Love
+ Суббота!
+ TV club
+ Техно 24
+ Тайна
+ Тайны галактики
+ ТБН
+ TDK
+ Театр
+ Телекафе
+ Теледом HD
+ Теледом
+ Телепутешествия
+ Terra
+ Терра Инкогнита
+ TiJi
+ Timeless Dizi Channel
+ ТЛУМ HD
+ ТНТ4
+ ТНТ HD
+ ТНТ
+ ТНТ MUSIC
+ ТНВ-планета
+ ТНВ
+ Точка отрыва HD
+ Точка отрыва
+ Точка ТВ
+ Тонус
+ Совершенно секретно
+ Top Shop TV
+ Trace Sports HD
+ Trace Urban HD
+ Trash
+ Travel+Adventure HD
+ Travel+Adventure
+ ТВ-3
+ DTV TV1000 HD
+ TV BRICS
+ ТВ Центр
+ TV Mall
+ TVM Channel
+ ТВТУР
+ TV XXI
+ Ю
+ Russian Extreme TV ULTRA HD CINEMA
+ Уникум
+ Усадьба
+ Успех
+ В гостях у сказки
+ viju Explore
+ viju History
+ viju Nature
+ viju+ Comedy
+ viju+ Megahit
+ viju+ Planetviju+ Premiere
- Знание ТВ
- Curiosity Stream
+ viju+ Serial
+ viju+ Sport HD
+ viju+ Sport
+ viju TV1000
+ viju TV1000 action
+ viju TV1000 action
+ viju TV1000 русское
+ Вместе-РФ
+ В мире животных
+ Вопросы и ответы
+ Восток ТВ
+ Время
+ World Business Channel HD
+ World Business Channel
+ World Fashion
+ Ювелирочка
+ Загородная жизнь
+ Загородный
+ Зал суда
+ Здоровье HD
+ Здоровое ТВ
+ Жара
+ Жар Птица
+ Живая планета
+ Живая природа HD
+ Живая природа
+ Живи! HD
+ ЖИВИ!
+ Zooпарк
+ Зоо ТВ
+ Звезда
+ Звезда Плюс
diff --git a/sites/tv.mail.ru/tv.mail.ru.config.js b/sites/tv.mail.ru/tv.mail.ru.config.js
index 846365c51..36117ec83 100644
--- a/sites/tv.mail.ru/tv.mail.ru.config.js
+++ b/sites/tv.mail.ru/tv.mail.ru.config.js
@@ -1,126 +1,245 @@
+const axios = require('axios')
+const cheerio = require('cheerio')
+const crypto = require('crypto')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
-const timezone = require('dayjs/plugin/timezone')
-const axios = require('axios')
-const uniqBy = require('lodash.uniqby')
+const doFetch = require('@ntlab/sfetch')
+
dayjs.extend(utc)
-dayjs.extend(timezone)
+
+const eventIds = []
+const caches = {}
+const headers = {
+ 'user-agent':
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36',
+}
module.exports = {
site: 'tv.mail.ru',
days: 2,
- delay: 1000,
- url({ channel, date }) {
- return `https://tv.mail.ru/ajax/channel/?region_id=70&channel_id=${
- channel.site_id
- }&date=${date.format('YYYY-MM-DD')}`
+ request: {
+ cache: {
+ ttl: 24 * 60 * 60 * 1000 // 1 day
+ },
+ headers
},
- parser({ content, date }) {
+ async url({ date }) {
+ return await followUrl(getUrl(date))
+ },
+ async parser({ content, channel, date }) {
const programs = []
- const items = parseItems(content)
- items.forEach(item => {
- const prev = programs[programs.length - 1]
- let start = parseStart(item, date)
- if (prev) {
- if (start < prev.start) {
- start = start.add(1, 'day')
- date = date.add(1, 'day')
+ if (content) {
+ // common utility
+ const v = { e: [], d: date, p: 1 }
+ const ev = (res, url) => {
+ if (typeof res === 'string' || Buffer.isBuffer(res)) {
+ res = JSON.parse(res)
+ }
+ if (Array.isArray(res?.data?.schedule?.items)) {
+ res.data.schedule.items
+ .filter(schedule => schedule.id == channel.site_id)
+ .forEach(schedule => {
+ if (Array.isArray(schedule.events)) {
+ schedule.events
+ .filter(event => !eventIds.includes(event.id))
+ .forEach(event => {
+ // use event id as unique filter
+ if (!v.e.find(item => item.id === event.id)) {
+ v.e.push(event)
+ }
+ })
+ }
+ })
+ // cache result
+ if (url) {
+ caches[url] = res
+ }
}
- prev.stop = start
}
- const stop = start.add(1, 'hour')
- programs.push({
- title: item.name,
- category: parseCategory(item),
- start,
- stop
+ const mu = (next = true, dt = null) => {
+ return getUrl(dt ? dt : v.d, next ? ++v.p : v.p)
+ }
+ const mq = oUrl => ({
+ async url(queue) {
+ return await followUrl(queue.oUrl)
+ },
+ oUrl,
+ params: module.exports.request
})
- })
+ const cr = async (next = true, dt = null) => {
+ const oUrl = mu(next, dt)
+ if (caches[oUrl]) {
+ ev(caches[oUrl])
+ } else {
+ await doFetch([mq(oUrl)], (queue, res) => {
+ ev(res, queue.oUrl)
+ })
+ }
+ }
+ // add main content
+ ev(content)
+ // fetch next page until site is found
+ await new Promise(resolve => {
+ const f = async () => {
+ if (v.e.length) {
+ resolve()
+ } else {
+ await cr()
+ f()
+ }
+ }
+ f()
+ })
+ if (v.e.length) {
+ date = date.startOf('d')
+ v.n = [...v.e]
+ v.e = []
+ // fetch previous day
+ await cr(false, date.subtract(1, 'd'))
+ v.e.push(...v.n)
+ // process collected events
+ const queues = []
+ const events = []
+ v.e
+ .forEach(event => {
+ const start = dayjs.utc(event.start_ts * 1000)
+ const stop = dayjs.utc(event.stop_ts * 1000)
+ if (date.isSame(start, 'd') || (date.isSame(stop, 'd') && stop > date)) {
+ eventIds.push(event.id)
+ const url = `https://tv.mail.ru${event.url}`
+ const evt = {
+ program: {
+ title: event.name,
+ image: event.image,
+ start,
+ stop
+ }
+ }
+ if (caches[url]) {
+ evt.detail = caches[url]
+ } else {
+ queues.push({
+ async url(queue) {
+ return await followUrl(queue.oUrl)
+ },
+ oUrl: url,
+ params: module.exports.request,
+ evt
+ })
+ }
+ events.push(evt)
+ }
+ })
+ // fetch detailed programs
+ if (process.env.EPG_DETAILED_GUIDE) {
+ await doFetch(queues, (queue, res) => {
+ queue.evt.detail = res
+ caches[queue.oUrl] = res
+ })
+ }
+ // add programs
+ programs.push(...events
+ .map(evt => ({
+ ...evt.program,
+ ...parseProgram(evt.detail)
+ })
+ )
+ )
+ }
+ }
return programs
},
async channels() {
- const regions = [5506, 1096, 1125, 285]
-
- let channels = []
- for (let region of regions) {
- const totalPages = await getTotalPageCount(region)
- const pages = Array.from(Array(totalPages).keys())
- for (let page of pages) {
- const data = await axios
- .get('https://tv.mail.ru/ajax/channel/list/', {
- params: { page },
- headers: {
- cookie: `s=fver=0|geo=${region};`
- }
- })
- .then(r => r.data)
- .catch(console.log)
-
- data.channels.forEach(item => {
- channels.push({
+ const channels = []
+ const args = { date: dayjs(), page: 0 }
+ const queues = [getUrl(args.date, ++args.page)]
+ await doFetch(queues, (url, res) => {
+ if (res?.data?.schedule?.has_next_page) {
+ queues.push(getUrl(args.date, ++args.page))
+ }
+ if (Array.isArray(res?.data?.schedule?.items)) {
+ channels.push(...res.data.schedule.items
+ .map(item => ({
lang: 'ru',
name: item.name,
site_id: item.id
- })
- })
- }
- }
-
- return uniqBy(channels, 'site_id')
- }
-}
-
-async function getTotalPageCount(region) {
- const data = await axios
- .get('https://tv.mail.ru/ajax/channel/list/', {
- params: { page: 0 },
- headers: {
- cookie: `s=fver=0|geo=${region};`
+ }))
+ )
}
})
- .then(r => r.data)
- .catch(console.log)
- return data.total
+ return channels
+ }
}
-function parseStart(item, date) {
- const dateString = `${date.format('YYYY-MM-DD')} ${item.start}`
-
- return dayjs.tz(dateString, 'YYYY-MM-DD HH:mm', 'Europe/Moscow').utc()
-}
-
-function parseCategory(item) {
- const categories = {
- 1: 'Фильм',
- 2: 'Сериал',
- 6: 'Документальное',
- 7: 'Телемагазин',
- 8: 'Позновательное',
- 10: 'Другое',
- 14: 'ТВ-шоу',
- 16: 'Досуг,Хобби',
- 17: 'Ток-шоу',
- 18: 'Юмористическое',
- 23: 'Музыка',
- 24: 'Развлекательное',
- 25: 'Игровое',
- 26: 'Новости'
+function parseProgram(data) {
+ const res = {}
+ if (data) {
+ const props = {
+ title: '.fa7d86047b [data-qa="Title"]',
+ sub_title: '.d4a57e7163',
+ category: '[data-qa="TagLink"] [data-qa="Text"]',
+ description: ['.f9cbc7a035', 'h2'],
+ actor: '[data-qa*="TEST_IDS__EVENT_ATTR__actors_link_"]',
+ director: '[data-qa*="TEST_IDS__EVENT_ATTR__director_link_"]',
+ date: '[data-qa="TEST_IDS__TEVENT_META__start_year"]',
+ country: '.ec1bc00977'
+ }
+ const $ = cheerio.load(data)
+ for (const [prop, selector] of Object.entries(props)) {
+ const item = $(Array.isArray(selector) ? selector[0] : selector)
+ if (item.length) {
+ // prune children
+ if (Array.isArray(selector)) {
+ item.find(selector[1]).remove()
+ }
+ if (item.length > 1) {
+ res[prop] = item.toArray()
+ .map(item => $(item).text().trim())
+ } else {
+ res[prop] = item.text().trim()
+ }
+ }
+ }
}
- return categories[item.category_id]
- ? {
- lang: 'ru',
- value: categories[item.category_id]
- }
- : null
+ return res
}
-function parseItems(content) {
- const json = JSON.parse(content)
- if (!Array.isArray(json.schedule) || !json.schedule[0]) return []
- const event = json.schedule[0].event || []
-
- return [...event.past, ...event.current]
+function getUrl(date, page = 1) {
+ page = page > 1 ? `&page=${page}` : ''
+ return `https://tv.mail.ru/ajax/service/index/schedule/?region_id=70&channel_type=all&date=${
+ date.format('YYYY-MM-DD')
+ }&appearance=grid&period=all${
+ page
+ }`
+}
+
+async function followUrl(url) {
+ const f = async (m = 'head') => {
+ await axios[m](url, { headers })
+ .then(res => {
+ if (res.headers && res.headers['x-challenge'] === 'required') {
+ const challengeUrl = new URL(res.request.res.responseUrl)
+ if (challengeUrl.searchParams.has('hash429')) {
+ const key = crypto.hash('md5', challengeUrl.searchParams.get('hash429'))
+ if (challengeUrl.searchParams.has('key')) {
+ challengeUrl.searchParams.set('key', key)
+ } else {
+ challengeUrl.searchParams.append('key', key)
+ }
+ url = challengeUrl.toString()
+ } else {
+ throw new Error('Unknown challenge page!')
+ }
+ }
+ })
+ // @todo: handle captcha on 429
+ .catch(console.error)
+
+ return url
+ }
+
+ return await f()
}
diff --git a/sites/tv.mail.ru/tv.mail.ru.test.js b/sites/tv.mail.ru/tv.mail.ru.test.js
index 49f76081a..36db8fb93 100644
--- a/sites/tv.mail.ru/tv.mail.ru.test.js
+++ b/sites/tv.mail.ru/tv.mail.ru.test.js
@@ -1,77 +1,91 @@
const { parser, url } = require('./tv.mail.ru.config.js')
+const axios = require('axios')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const customParseFormat = require('dayjs/plugin/customParseFormat')
const fs = require('fs')
const path = require('path')
+
dayjs.extend(customParseFormat)
dayjs.extend(utc)
+process.env.EPG_DETAILED_GUIDE = 1
-const date = dayjs.utc('2021-11-24', 'YYYY-MM-DD').startOf('d')
+jest.mock('axios')
+
+const date = dayjs.utc('2026-06-18').startOf('d')
const channel = {
- site_id: '2785',
- xmltv_id: '21TV.am'
+ site_id: '3161',
+ xmltv_id: 'MosfilmGoldCollection.ru@SD'
}
-const content = fs.readFileSync(path.join(__dirname, '__data__', 'content.json'), 'utf8')
-it('can generate valid url', () => {
- expect(url({ channel, date })).toBe(
- 'https://tv.mail.ru/ajax/channel/?region_id=70&channel_id=2785&date=2021-11-24'
+axios.head.mockImplementation(() => Promise.resolve({}))
+axios.get.mockImplementation(url => {
+ const urls = {
+ 'https://tv.mail.ru/ajax/service/index/schedule/?region_id=70&channel_type=all&date=2026-06-18&appearance=grid&period=all':
+ 'content1.json',
+ 'https://tv.mail.ru/ajax/service/index/schedule/?region_id=70&channel_type=all&date=2026-06-18&appearance=grid&period=all&page=2':
+ 'content2.json',
+ 'https://tv.mail.ru/ajax/service/index/schedule/?region_id=70&channel_type=all&date=2026-06-17&appearance=grid&period=all&page=2':
+ 'content2a.json',
+ 'https://tv.mail.ru/moskva/event/777111/?event_id=277465076':
+ 'program1.html',
+ 'https://tv.mail.ru/moskva/event/702859/?event_id=277466578':
+ 'program2.html'
+ }
+ let data = ''
+ if (urls[url] !== undefined) {
+ data = fs.readFileSync(path.join(__dirname, '__data__', urls[url])).toString()
+ }
+ return Promise.resolve({ data })
+})
+
+it('can generate valid url', async () => {
+ expect(await url({ date })).toBe(
+ 'https://tv.mail.ru/ajax/service/index/schedule/?region_id=70&channel_type=all&date=2026-06-18&appearance=grid&period=all'
)
})
-it('can parse response', () => {
- const result = parser({ content, date }).map(p => {
- p.start = p.start.toJSON()
- p.stop = p.stop.toJSON()
- return p
- })
+it('can parse response', async () => {
+ const content = fs.readFileSync(path.join(__dirname, '__data__', 'content1.json'))
+ const result = (await parser({ content, channel, date }))
+ .map(p => {
+ p.start = p.start.toJSON()
+ p.stop = p.stop.toJSON()
+ return p
+ })
- expect(result).toMatchObject([
- {
- start: '2021-11-24T20:35:00.000Z',
- stop: '2021-11-24T22:40:00.000Z',
- title: 'Նոնստոպ․ Տեսահոլովակներ',
- category: {
- lang: 'ru',
- value: 'Музыка'
- }
- },
- {
- start: '2021-11-24T22:40:00.000Z',
- stop: '2021-11-24T23:40:00.000Z',
- title: 'Վերջին թագավորությունը',
- category: {
- lang: 'ru',
- value: 'Сериал'
- }
- },
- {
- start: '2021-11-24T23:40:00.000Z',
- stop: '2021-11-25T00:25:00.000Z',
- title: 'Պրոֆեսիոնալները',
- category: {
- lang: 'ru',
- value: 'Позновательное'
- }
- },
- {
- start: '2021-11-25T00:25:00.000Z',
- stop: '2021-11-25T01:25:00.000Z',
- title: 'Նոնստոպ․ Տեսահոլովակներ',
- category: {
- lang: 'ru',
- value: 'Музыка'
- }
- }
- ])
+ expect(result.length).toBe(26)
+ expect(result[0]).toMatchObject({
+ start: '2026-06-17T23:50:00.000Z',
+ stop: '2026-06-18T01:15:00.000Z',
+ title: 'Слезы капали',
+ description:
+ 'Узнаем, что же случилось с Павлом Ивановичем Васиным, жителем городка Зареченска. Любящий муж и отец, отзывчивый сосед и сослуживец, словом, душа-человек в один прекрасный день превратился в недовольного всем чинушу и формалиста. А все из-за того, что ему в глаз попал осколок волшебного зеркала…',
+ category: 'драма',
+ country: 'СССР',
+ date: '1982',
+ image: 'https://tv.mail.ru/tvpic/3/72/8639450.jpg'
+ })
+ expect(result[25]).toMatchObject({
+ start: '2026-06-18T23:45:00.000Z',
+ stop: '2026-06-19T01:00:00.000Z',
+ title: 'Путешествие мсье Перришона',
+ description:
+ 'Музыкальная комедия по пьесе французского драматурга Эжена Лабиша. Двое молодых людей - Арман и Даниэль - влюбляются в дочь каретника Перришона. Девушка тоже пока не поняла, кто ей больше нравится. Она решила проверить их в деле: отправилась с ними в горы искать клад. Пусть в полевых условиях поухаживают. Вот тогда и станет ясно, кто из женихов больше достоин руки девушки…',
+ actor:
+ ['Валентин Гафт', 'Олег Табаков', 'Татьяна Васильева', 'Георгиос Совчис', 'Игорь Скляр', 'Татьяна Догилева', 'Марина Зудина', 'Александр Филиппенко', 'Александр Мохов', 'Екатерина Васильева'],
+ director: 'Сергей Микаэлян',
+ country: 'СССР',
+ date: '1986',
+ image: 'https://tv.mail.ru/tvpic/2/71/6928921.jpg'
+ })
})
-it('can handle empty guide', () => {
- const result = parser({
+it('can handle empty guide', async () => {
+ const result = await parser({
date,
channel,
- content: fs.readFileSync(path.join(__dirname, '__data__', 'no_content.json'), 'utf8')
+ content: ''
})
expect(result).toMatchObject([])
})