From 96eb13d2e64f6d3cd0b25c81d5688a3d6ce09dfc Mon Sep 17 00:00:00 2001 From: freearhey Date: Wed, 10 Mar 2021 21:31:32 +0300 Subject: [PATCH] wip --- .gh-pages/guide_ru.xml | 1118 +++++++++++++++++++++++++++++++ bin/epg-grabber/index.js | 69 +- bin/epg-grabber/utils.js | 32 +- config/ru/sites/tv.yandex.ru.js | 21 + package-lock.json | 277 ++++++++ package.json | 4 +- 6 files changed, 1470 insertions(+), 51 deletions(-) create mode 100644 .gh-pages/guide_ru.xml create mode 100644 config/ru/sites/tv.yandex.ru.js diff --git a/.gh-pages/guide_ru.xml b/.gh-pages/guide_ru.xml new file mode 100644 index 00000000..77dd7757 --- /dev/null +++ b/.gh-pages/guide_ru.xml @@ -0,0 +1,1118 @@ + + + 1 HD Music Television + + + 2x2 + + + 360° + + + 365 дней ТВ + + + 7 TV + + + 8 Канал + + + A1 + + + A2 + + + Ajara TV + + + AMC Russia + + + Amedia Premium HD + + + Анекдот ТВ + + + Animal Planet Россия + + + Animal Planet HD Россия + + + Авто Плюс + + + Exclusive + + Only Hits + + Pop music + + Dance Music + + Good Morning + + Dance Music + + Hot New + + Only Hits + + Exclusive + + Exclusive: latino + + Russian Hits + + Hot New + + Pop music + + Dance Music + + Only Hits + + Dance Music + + Hot New + + Dance Music + + Pop music + + Exclusive: Asia + + Indie Music + + Dance Music + + Hip-Hop + + Hot New + + Russian Hits + + Exclusive: latino + + Pop music + + Dance Music + + Fun For Fan + + Dance Music + + Hot New + + Hip-Hop + + Crazy Beat + + Indie Music + + Pop music + + Dance Music + + Hot New + + Hip-Hop + + Pop music + + Exclusive: latino + + Only Hits + + Russian Hits + + Dance Music + + Indie Music + + ДП. 2-я серия + + Пыхчево. Сезон 2. 1-я серия + + Подозрительная Сова. Сезон 8. 13-я серия + + Русские мультфильмы + + Бешеные кролики: Вторжение + + 2X2 Music + + Луча Андеграунд. Сезон 4. 21-я серия + + 2X2 Music + + Симпсоны. Сезон 12. 19-я серия - "Богопарк" + + Симпсоны. Сезон 12. 20-я серия - "Детский сад Гомера Симпсона" + + Симпсоны. Сезон 12. 21-я серия - "Небылицы Симпсонов" + + Симпсоны. Сезон 13. 1-я серия - "Дом ужасов-12" + + Удивительный мир Гамбола. Сезон 2. 25-я и 26-я серии + + Удивительный мир Гамбола. Сезон 2. 27-я и 28-я серии + + Удивительный мир Гамбола. Сезон 2. 29-я и 30-я серии + + Космические цыплята в космосе. 1-я - 3-я серии + + Аватар: легенда о Корре. Сезон 1. 5-я серия + + Аватар: легенда о Корре. Сезон 1. 6-я серия + + Футурама. Сезон 9. 11-я серия + + Футурама. Сезон 9. 12-я серия + + Симпсоны. Сезон 26. 16-я серия + + Губка Боб квадратные штаны. Сезон 7. 148-я серия - "Шедевр. Атака улиток" + + Губка Боб квадратные штаны. Сезон 7. 149-я серия - "Ты не знаешь Губку. Туннель-перчатка" + + Губка Боб квадратные штаны. Сезон 7. 150-я серия - "Красти доги. Обломки Моны Лоа" + + Губка Боб квадратные штаны. Сезон 7. 151-я серия - "Новый сосед. Обожаю Скриди" + + Губка Боб квадратные штаны. Сезон 7. 152-я серия - "Морозные гонки" + + Губка Боб квадратные штаны. Сезон 8. 153-я серия + + Губка Боб квадратные штаны. Сезон 8. 154-я серия + + Губка Боб квадратные штаны. Сезон 8. 155-я серия + + Губка Боб квадратные штаны. Сезон 8. 156-я серия + + Футурама. Сезон 3. 1-я серия + + Футурама. Сезон 3. 2-я серия + + Футурама. Сезон 3. 3-я серия + + Американский папаша. Сезон 11. 15-я серия + + Американский папаша. Сезон 11. 16-я серия + + Симпсоны. Сезон 26. 19-я серия + + Симпсоны. Сезон 26. 21-я серия + + Нереальный Stand Up. Сезон 1. 4-я серия + + Мульtouch. Сезон 1. 4-я серия + + Суперособняк. Сезон 3. 15-я серия + + Проповедник. Сезон 4. 2-я серия + + Южный парк. Сезон 11. 10-я серия + + Металлоапокалипсис. Сезон 3. 5-я и 8-я серии + + Шоу Кливленда. Сезон 2. 6-я серия + + Шоу Кливленда. Сезон 2. 8-я серия + + Шоу Кливленда. Сезон 2. 9-я серия + + 2X2 Music + + ДП. 3-я серия + + Самое яркое + + Мультфильмы + + Петр Лещенко. Все, что было... 1-я серия + + Петр Лещенко. Все, что было... 2-я серия + + Вкусно 360 + + Вкусно 360 + + Самое вкусное + + Новости 360 + + Миф об идеальном мужчине. 2-я серия + + Седьмое небо. 1-я серия + + Самара. 11-я серия + + Самара. 12-я серия + + Самое яркое + + Петр Лещенко. Все, что было... 3-я серия + + Петр Лещенко. Все, что было... 4-я серия + + Новости 360 + + Самое яркое + + Самара. 13-я серия + + Самара. 14-я серия + + Самое яркое + + Историада. 23-я серия - "Русофобия: исторические предпосылки возникновения " + + Историограф. 6-я серия + + Красные горы. 11-я серия + + Подлинная история Русской революции. 3-я серия - "Февраль" + + Манон Леско + + Апокалипсис. Нескончаемая война 1918-1926. 1-я серия - "Месть" + + Албазинские скаски + + Великие живописцы. 11-я серия - "Жорж Сёра" + + Софийский крест. Голубь мира + + Подлинная история Русской революции. 3-я серия - "Февраль" + + На пути к Великой Победе. 37-я серия - "Последний штурм" + + Исаев. 12-я серия + + Исаев. 13-я серия + + Тутанхамон. Жизнь, смерть и бессмертие. 3-я серия - "Проклятие мумии" + + Исаев. 14-я серия + + На пути к Великой Победе. 20-я серия - "ППШ - Символ победы" + + Забытый полководец. 1-я серия - "Свиклин Теодор-Вернер Андреевич" + + Хроники общественного быта. 1-я серия - "Дворник" + + Подземная Италия. 2-я серия - "Бергамо" + + Антагонисты. Соперники в искусстве. 2-я серия - "Ван Гог против Гогена" + + Тайны великих картин. 18-я серия - "Женщины на террасе кафе вечером" + + Час истины. 599-я серия - "Древняя Индия. Рамаяна" + + На пути к Великой Победе. 38-я серия - "Второй фронт" + + Обыкновенная История. 117-я серия - "Спортивная одежда. История вторая" + + Красные горы. 11-я серия + + На пути к Великой Победе. 4-я серия - "Партизаны" + + Тайное становится явным. 4-я серия - "Убил ли Иван Грозный своего сына?" + + Семь дней истории. 504-я серия + + Историада. 24-я серия - "История и мифы" + + Прямой эфир + + Разрушители мифов + + Закрытая школа. 38-я серия + + Прямой эфир + + В мире чудес + + Разрушители мифов + + Прямой эфир + + Закрытая школа. 39-я серия + + В мире чудес + + Прямой эфир + + Разрушители мифов + + Прямой эфир + + Закрытая школа. 40-я серия + + В мире чудес + + Разрушители мифов + + Закрытая школа. 40-я серия + + В мире чудес + + Прямой эфир + + Разрушители мифов + + Интерактивный канал + + Женщины в любви. 155-я серия + + Восьмое чувство + + Лучшие покупки + + Восьмое чувство + + Удачный день + + Восьмое чувство + + Закрытая школа. Сезон 3. 64-я серия + + Восьмое чувство + + Удачный день + + Белая рабыня. 22-я серия + + Удачный вечер + + Восьмое чувство + + Башня. 4-я серия + + Восьмое чувство + + Интерактивный канал + + Острые козырьки. Сезон 3. 2-я серия + + Римские свидания + + Королевство. Сезон 2. 12-я серия + + Христиане как мы. 1-я серия + + Жизнь и приключения Мишки Япончика. 9-я серия + + Бездельник. Сезон 2. 1-я серия + + Бездельник. Сезон 2. 2-я серия + + Прослушка. Сезон 4. 2-я серия - "Закройте на это глаза" + + Острые козырьки. Сезон 3. 3-я серия + + Христиане как мы. 2-я серия + + Жизнь и приключения Мишки Япончика. 9-я серия + + Барбершоп. 3-я серия + + Вечеринка + + Бездельник. Сезон 2. 1-я серия + + Бездельник. Сезон 2. 2-я серия + + Прослушка. Сезон 4. 2-я серия - "Закройте на это глаза" + + Острые козырьки. Сезон 3. 3-я серия + + Королевство. Сезон 2. 12-я серия + + Барбершоп. 3-я серия + + Лига чемпионов ФИБА. "АЕК" (Греция) - "Тюрк Телеком" (Турция) + + Лига чемпионов ФИБА. "Страсбур" (Франция) - "Нижний Новгород" (Россия) + + Жизнь и приключения Мишки Япончика. 9-я серия + + Бездельник. Сезон 2. 1-я серия + + Бездельник. Сезон 2. 2-я серия + + Прослушка. Сезон 4. 2-я серия - "Закройте на это глаза" + + Христиане как мы. 1-я серия + + Христиане как мы. 2-я серия + + Творение Господне + + Вне Рая + + Расскажи мне сказку. Сезон 2. 2-я серия + + Темпл. 5-я серия + + Во тьме. Сезон 2. 9-я серия + + Американская история ужасов. Сезон 9. 8-я серия + + Ритаулы. 2-я серия + + Творение Господне + + Свобода + + Расскажи мне сказку. Сезон 2. 3-я серия + + Томми. 7-я серия + + Томми. 8-я серия + + Темпл. 5-я серия + + Во тьме. Сезон 2. 9-я серия + + Американская история ужасов. Сезон 9. 8-я серия + + Развод. Сезон 2. 3-я серия + + Развод. Сезон 2. 4-я серия + + Развод. Сезон 2. 5-я серия + + Развод. Сезон 2. 6-я серия + + Томми. 7-я серия + + Томми. 8-я серия + + Во тьме. Сезон 2. 9-я серия + + Темпл. 5-я серия + + Американская история ужасов. Сезон 9. 8-я серия + + Ученик + + Расскажи мне сказку. Сезон 2. 3-я серия + + Развод. Сезон 2. 3-я серия + + Развод. Сезон 2. 4-я серия + + Развод. Сезон 2. 5-я серия + + Развод. Сезон 2. 6-я серия + + Томми. 7-я серия + + Томми. 8-я серия + + Дети шоу-бизнеса + + Радио FM 104, 5 + + Анимация + + Грузинский художественный фильм + + Зум-арт-эксперт + + Библиотека + + Новости + + Проект DW + + Полдень + + Документальный фильм + + Новости + + Грузинский художественный фильм + + Я - фермер + + Проект DW + + Новости + + Документальный фильм + + Зум-импульс + + Новости + + Новогодняя программа + + Радио FM 104, 5 + + Три девятки + + Новости Голливуда. 83-я серия + + Малавита + + Орел девятого легиона + + Кровью и потом: Анаболики + + Новости Голливуда. 84-я серия + + Лофт + + Стукач + + Новости Голливуда. 82-я серия + + Трамбо + + Новости Голливуда. 85-я серия + + Славные парни + + Иностранец + + Новости Голливуда. 86-я серия + + Берлин, я люблю тебя + + Голливудские истории. Джим Керри + + Новости Голливуда. 85-я серия + + Опасная игра Слоун + + Новая эра Z + + Александр + + Зал славы рок-н-ролла + + Тёмные начала. Сезон 2. 3-я серия + + Викинги. Сезон 6. 12-я серия + + Нация в состоянии стресса + + Барри. Сезон 2. 3-я серия + + Барри. Сезон 2. 4-я серия + + Городские легенды. Сезон 3. Гость Холодного дома + + Это грех. 4-я серия + + Идеальный пациент + + Воин. Сезон 1. 6-я серия + + Воин. Сезон 1. 7-я серия + + Воин. Сезон 1. 8-я серия + + Воин. Сезон 1. 9-я серия + + Воин. Сезон 1. 10-я серия + + Чёрное искусство: в отсутствие света + + Это грех. 4-я серия + + Барри. Сезон 2. 3-я серия + + Барри. Сезон 2. 4-я серия + + Тёмные начала. Сезон 2. 3-я серия + + Викинги. Сезон 6. 12-я серия + + Аллен против Фэрроу. 3-я серия + + Мой друг Зигмунд Фрейд + + Нация в состоянии стресса + + Аллен против Фэрроу. 3-я серия + + Барри. Сезон 2. 3-я серия + + Барри. Сезон 2. 4-я серия + + Идеальный пациент + + Анекдоты-2. 85-я серия + + Анекдоты. 85-я серия + + Весёлые истории из жизни + + Студия звёзд + + Анекдоты-2. 27-я серия + + Анекдоты. Спецвыпуск. 4-я серия + + Анекдоты. 74-я серия + + Анекдоты-2. 82-я серия + + Улётные животные + + Анекдоты-2. 242-я серия + + Анекдоты. 35-я серия + + Анекдоты-2. 26-я серия + + Попкорн + + Анекдоты-2. 203-я серия + + Анекдоты-2. 30-я серия + + Анекдоты. 36-я серия + + Анекдоты-2. 85-я серия + + Анекдоты. 85-я серия + + Весёлые истории из жизни + + Студия звёзд + + Анекдоты-2. 27-я серия + + Анекдоты. Спецвыпуск. 4-я серия + + Анекдоты. 74-я серия + + Анекдоты-2. 82-я серия + + Анекдоты-2. 242-я серия + + Анекдоты. 35-я серия + + Анекдоты-2. 26-я серия + + Анекдоты-2. 203-я серия + + Анекдоты-2. 30-я серия + + Анекдоты. 36-я серия + + Анекдоты-2. 85-я серия + + Анекдоты. 85-я серия + + Весёлые истории из жизни + + Студия звёзд + + Анекдоты-2. 27-я серия + + Анекдоты. Спецвыпуск. 4-я серия + + Анекдоты. 74-я серия + + Анекдоты-2. 82-я серия + + Улётные животные + + Анекдоты-2. 242-я серия + + Анекдоты. 35-я серия + + Анекдоты-2. 26-я серия + + Попкорн + + Анекдоты-2. 203-я серия + + Анекдоты-2. 30-я серия + + Анекдоты. 36-я серия + + Анекдоты-2. 85-я серия + + Анекдоты. 85-я серия + + Весёлые истории из жизни + + Студия звёзд + + Анекдоты-2. 27-я серия + + Анекдоты. Спецвыпуск. 4-я серия + + Анекдоты. 74-я серия + + Анекдоты-2. 82-я серия + + Анекдоты-2. 242-я серия + + Анекдоты. 35-я серия + + Анекдоты-2. 26-я серия + + Анекдоты-2. 203-я серия + + Анекдоты-2. 30-я серия + + Анекдоты. 36-я серия + + Анекдоты-2. 85-я серия + + Анекдоты. 85-я серия + + Весёлые истории из жизни + + Студия звёзд + + Анекдоты-2. 27-я серия + + Анекдоты. Спецвыпуск. 4-я серия + + Анекдоты. 74-я серия + + Анекдоты-2. 82-я серия + + Улётные животные + + Анекдоты-2. 242-я серия + + Анекдоты. 35-я серия + + Анекдоты-2. 26-я серия + + Попкорн + + Анекдоты-2. 227-я серия + + Анекдоты. 57-я серия + + Анекдоты-2. 31-я серия + + Анекдоты. 74-я серия + + Анекдоты-2. 82-я серия + + Весёлые истории из жизни + + Студия звёзд + + Анекдоты-2. 30-я серия + + Анекдоты. 36-я серия + + Анекдоты. 85-я серия + + Анекдоты-2. 68-я серия + + Улётные животные + + Анекдоты. 62-я серия, 1-я часть + + Анекдоты-2. 27-я серия + + Анекдоты. Спецвыпуск. 4-я серия + + Попкорн + + Анекдоты-2. 227-я серия + + Анекдоты. 57-я серия + + Анекдоты-2. 31-я серия + + Монстры внутри меня. Сезон 8. 9-я серия - "Разрушитель органов" + + Горные монстры. Сезон 1. 16-я серия - "Медведь-монстр из округа Роли" + + Адская кошка. Сезон 7. 8-я серия - "Мерцай, мерцай, маленькая звездочка" + + Звезды и звери. Сезон 1. 9-я серия - "Фон Миллер и быки" + + Суровая справедливость. Сезон 3. 2-я серия - "Освободить оленя" + + На свободу с питбулем. Сезон 9. 7-я серия + + Правосудие Техаса. Сезон 4. 1-я серия - "Торжество закона" + + Большие кошки Кении. Сезон 1. 3-я серия + + Рыба или смерть. Сезон 1. 10-я серия + + Найджел Марвен предстваляет: Другой Китай. Сезон 1. 1-я серия + + Найджел Марвен предстваляет: Другой Китай. Сезон 1. 2-я серия + + В поисках йети. Сезон 2. 33-я серия - "Возвращение в Бугги Крик" + + Правосудие Техаса. Сезон 4. 2-я серия - "Работа до упаду" + + На свободу с питбулем. Сезон 9. 8-я серия - "Убежище от бури" + + Легенды дикой природы. Сезон 1. 2-я серия + + Герои среди нас. Сезон 1. 1-я серия - "Псы войны" + + Герои среди нас. Сезон 1. 2-я серия - "Одинокий шимпанзе" + + Герои среди нас. Сезон 1. 3-я серия - "Протез для слона" + + Большие кошки Кении. Сезон 1. 4-я серия + + Хранители болот Эверглейдс. Сезон 1. 2-я серия + + Дома для животных. Сезон 2. 5-я серия - "Дворец для вислобрюхой свиньи" + + В поисках йети. Сезон 2. 34-я серия - "Бигфут из страны Оз" + + Горные монстры. Сезон 1. 17-я серия - "Дракон из округа Престон" + + Монстры внутри меня. Сезон 8. 10-я серия - "Подарки к Рождеству" + + Зоопарк Сан-Диего. Сезон 1. 7-я серия + + Большие кошки Кении. Сезон 1. 4-я серия + + В поисках йети. Сезон 2. 34-я серия - "Бигфут из страны Оз" + + Живой или вымерший. Сезон 2. 4-я серия - "Апапорисский крокодиловый кайман" + + На свободу с питбулем. Сезон 9. 17-я серия - "Под опекой Эрла" + + Монстры внутри меня. Сезон 8. 10-я серия - "Подарки к Рождеству" + + Монстры внутри меня. Сезон 8. 9-я серия - "Разрушитель органов" + + Горные монстры. Сезон 1. 16-я серия - "Медведь-монстр из округа Роли" + + Адская кошка. Сезон 7. 8-я серия - "Мерцай, мерцай, маленькая звездочка" + + Звезды и звери. Сезон 1. 9-я серия - "Фон Миллер и быки" + + Суровая справедливость. Сезон 3. 2-я серия - "Освободить оленя" + + На свободу с питбулем. Сезон 9. 7-я серия + + Правосудие Техаса. Сезон 4. 1-я серия - "Торжество закона" + + Большие кошки Кении. Сезон 1. 3-я серия + + Рыба или смерть. Сезон 1. 10-я серия + + Найджел Марвен предстваляет: Другой Китай. Сезон 1. 1-я серия + + Найджел Марвен предстваляет: Другой Китай. Сезон 1. 2-я серия + + В поисках йети. Сезон 2. 33-я серия - "Возвращение в Бугги Крик" + + Правосудие Техаса. Сезон 4. 2-я серия - "Работа до упаду" + + На свободу с питбулем. Сезон 9. 8-я серия - "Убежище от бури" + + Легенды дикой природы. Сезон 1. 2-я серия + + Герои среди нас. Сезон 1. 1-я серия - "Псы войны" + + Герои среди нас. Сезон 1. 2-я серия - "Одинокий шимпанзе" + + Герои среди нас. Сезон 1. 3-я серия - "Протез для слона" + + Большие кошки Кении. Сезон 1. 4-я серия + + Хранители болот Эверглейдс. Сезон 1. 2-я серия + + Дома для животных. Сезон 2. 5-я серия - "Дворец для вислобрюхой свиньи" + + В поисках йети. Сезон 2. 34-я серия - "Бигфут из страны Оз" + + Горные монстры. Сезон 1. 17-я серия - "Дракон из округа Престон" + + Монстры внутри меня. Сезон 8. 10-я серия - "Подарки к Рождеству" + + Зоопарк Сан-Диего. Сезон 1. 7-я серия + + Большие кошки Кении. Сезон 1. 4-я серия + + В поисках йети. Сезон 2. 34-я серия - "Бигфут из страны Оз" + + Живой или вымерший. Сезон 2. 4-я серия - "Апапорисский крокодиловый кайман" + + На свободу с питбулем. Сезон 9. 17-я серия - "Под опекой Эрла" + + Монстры внутри меня. Сезон 8. 10-я серия - "Подарки к Рождеству" + + Новости с колес + + Спорткары. 40-я серия + + Наши тесты плюс. 33-я серия - "Hyundai Grand Santa Fe" + + Своими глазами. 702-я серия - "Экспедиция "Открывая Россию". Северная Осетия, 1-я часть" + + Своими глазами. 703-я серия - "Экспедиция "Открывая Россию". Северная Осетия, 2-я часть" + + Новости с колес + + Вторая жизнь фургонов. Сезон 1. 10-я серия + + Наши тесты плюс. 83-я серия - "Volkswagen Golf R-Line" + + Новости с колес + + Наши тесты. 1032-я серия - "Mazda 3" + + Наши тесты. 917-я серия - "Porsche Carrera 911 " + + Наши тесты. 1082-я серия - "Audi A4" + + Новости с колес + + Обзор от журнала "За рулём". 8-я серия + + Машины прошлого. 20-я серия - "Borgward Isabella" + + Подержанные автомобили. 208-я серия - "HAVAL H8" + + Подержанные автомобили. 281-я серия - "Ravon Gentra " + + Новости с колес + + Своими глазами. 714-я серия - "Гонка "24 часа Ле-Мана", 1-я часть" + + Своими глазами. 715-я серия - "Гонка "24 часа Ле-Мана", 2-я часть" + + Новости с колес + + Мега Транспорт. Сезон 2. 6-я серия + + Новости с колес + + Наши тесты. 1067-я серия - "Audi e-tron" + + Обзор от журнала "За рулём". 24-я серия - "Gac gs8" + + Новости с колес + + Американский чоппер. Сезон 8. 3-я серия + + Новости с колес + + Обзор от журнала "За рулём". 12-я серия - "Haval H9" + + Наши тесты. 1084-я серия - "Jeep Grand Cherokee S" + + Машины прошлого. 38-я серия - "Лаз 695т Львов" + + Новости с колес + + Машины прошлого. 3-я серия - "ВАЗ 2103" + + Подержанные автомобили. 206-я серия - "Ford Mondeo" + + Подержанные автомобили. 370-я серия + + Новости с колес + + Вторая жизнь фургонов. Сезон 1. 10-я серия + + Своими глазами. 863-я серия - "Audi Quattro Winter Experience 2021" + + Новости с колес + + Обзор от журнала "За рулём". 14-я серия - "Skoda Karoq и Kia Seltos" + + Тест-драйв с Иваном Зенкевичем. 7-я серия - "Chery Tiggo 5" + + Новости с колес + + Суперзаводы. 3-я серия + + Новости с колес + + Наши тесты. 950-я серия - "Mazda CX-5" + + Коллективное управление. 55-я серия + + Новости с колес + + Наши тесты. 1025-я серия - "Lada Granta Cross " + + Машины прошлого. 17-я серия - "ОКА 4х4" + + Подержанные автомобили. 287-я серия - "Opel Corsa " + + Новости с колес + + Наши тесты. 999-я серия - "Lada xray Cross" + + Обзор от журнала "За рулём". 3-я серия + + Подержанные автомобили. 183-я серия - "Renault Laguna, 2006" + + Новости с колес + + Автомобильные технологии будущего. 2-я серия + + Платформа. 2-я серия + + Новости с колес + + Наши тесты. 1001-я серия - "УАЗ Патриот" + + Наши тесты. 932-я серия - "BMW 530D XDRIVE" + + Подержанные автомобили. 283-я серия - "Skoda Rapid " + + Новости с колес + + Audi S в большом городе + + Подержанные автомобили. 347-я серия - "Chery Arrizo" + + Новости с колес + + Помешанные на скорости. 6-я серия + + Новости с колес + + Тюнинг-ателье. 64-я серия - "Nissan GT-R" + + Наши тесты плюс. 46-я серия - "Citroen DS4" + + Обзор от журнала "За рулём". 3-я серия + + Подержанные автомобили. 370-я серия + + Новости с колес + + Наши тесты. 950-я серия - "Mazda CX-5" + + Наши тесты плюс. 71-я серия - "Mitsubishi ASX" + + Своими глазами. 831-я серия - "Audi Quattro Winter Experience" + + Подержанные автомобили. 283-я серия - "Skoda Rapid " + + Подержанные автомобили. 287-я серия - "Opel Corsa " + + Новости с колес + + Вторая жизнь фургонов. Сезон 1. 10-я серия + + Новости с колес + + Спорткары. 39-я серия + + Спорткары. 40-я серия \ No newline at end of file diff --git a/bin/epg-grabber/index.js b/bin/epg-grabber/index.js index d1a4ba70..b1619b3c 100755 --- a/bin/epg-grabber/index.js +++ b/bin/epg-grabber/index.js @@ -3,6 +3,7 @@ const fs = require('fs') const path = require('path') const axios = require('axios') +const axiosDelayAdapter = require('axios-delay').default const utils = require('./utils') const { Command } = require('commander') const program = new Command() @@ -22,61 +23,47 @@ program const options = program.opts() const config = utils.parseConfig(options.config) +const sites = utils.loadSites(options.sites) -return console.log(config) +const client = axios.create({ + adapter: axiosDelayAdapter(axios.defaults.adapter), + headers: { 'User-Agent': config.userAgent } +}) -const sites = { - 'tv.yandex.ru': { - url: function ({ date, channel }) { - return `https://tv.yandex.ru/channel/${channel.site_id}?date=${date.format('YYYY-MM-DD')}` - }, - parser: function ({ channel, content }) { - const initialState = content.match(/window.__INITIAL_STATE__ = (.*);/i)[1] - const data = JSON.parse(initialState, null, 2) - const programs = data.channel.schedule.events.map(i => { - return { - title: i.title, - description: i.program.description, - start: i.start, - stop: i.finish, - lang: 'ru', - channel: channel['xmltv_id'] - } - }) - - return programs - } - } -} - -function main() { +async function main() { const d = dayjs.utc() const dates = Array.from({ length: config.days }, (_, i) => d.add(i, 'd')) const channels = config.channels - const promises = [] + const requests = [] channels.forEach(channel => { const site = sites[channel.site] dates.forEach(date => { const url = site.url({ date, channel }) - const promise = axios.get(url).then(response => { - return site.parser({ channel, content: response.data }) + const promise = client.get(url).catch(console.log) + + requests.push({ + url, + site, + channel, + promise }) - - promises.push(promise) }) }) - Promise.allSettled(promises).then(results => { - let programs = [] - results.forEach(result => { - if (result.status === 'fulfilled') { - programs = programs.concat(result.value) - } - }) + let programs = [] + for (let request of requests) { + const progs = await request.promise + .then(response => { + const channel = request.channel + console.log(`${channel.site} - ${channel.xmltv_id}`) - const xml = utils.convertToXMLTV({ channels, programs }) - fs.writeFileSync(path.resolve(__dirname, config.filename), xml) - }) + return request.site.parser({ channel, content: response.data }) + }) + .then(utils.sleep(3000)) + programs = programs.concat(progs) + } + const xml = utils.convertToXMLTV({ channels, programs }) + fs.writeFileSync(path.resolve(__dirname, config.filename), xml) } main() diff --git a/bin/epg-grabber/utils.js b/bin/epg-grabber/utils.js index c31e8d17..e721857a 100644 --- a/bin/epg-grabber/utils.js +++ b/bin/epg-grabber/utils.js @@ -2,16 +2,15 @@ const fs = require('fs') const path = require('path') const convert = require('xml-js') const dayjs = require('dayjs') +const glob = require('glob') const utils = {} utils.convertToXMLTV = function ({ channels, programs }) { - let output = `` + let output = '' for (let channel of channels) { output += ` - - ${channel.name} -` +${channel.name}` } for (let program of programs) { @@ -19,14 +18,13 @@ utils.convertToXMLTV = function ({ channels, programs }) { const stop = dayjs(program.stop).format('YYYYMMDDHHmmss ZZ') output += ` - - ${program.title}` +${program.title}` if (program.category) { output += `${program.category}` } - output += `` + output += '' } output += '' @@ -34,8 +32,8 @@ utils.convertToXMLTV = function ({ channels, programs }) { return output } -utils.parseConfig = function (config) { - const xml = fs.readFileSync(path.resolve(process.cwd(), config), { +utils.parseConfig = function (configPath) { + const xml = fs.readFileSync(path.resolve(process.cwd(), configPath), { encoding: 'utf-8' }) const result = convert.xml2js(xml) @@ -66,4 +64,20 @@ utils.getElementText = function (name, elements) { return el ? el.elements.find(el => el.type === 'text').text : null } +utils.loadSites = function (sitesPath) { + const sites = {} + glob.sync(`${sitesPath}/*.js`).forEach(function (file) { + const name = path.parse(file).name + sites[name] = require(path.resolve(file)) + }) + + return sites +} + +utils.sleep = function (ms) { + return function (x) { + return new Promise(resolve => setTimeout(() => resolve(x), ms)) + } +} + module.exports = utils diff --git a/config/ru/sites/tv.yandex.ru.js b/config/ru/sites/tv.yandex.ru.js new file mode 100644 index 00000000..d332d4bb --- /dev/null +++ b/config/ru/sites/tv.yandex.ru.js @@ -0,0 +1,21 @@ +module.exports = { + url: function ({ date, channel }) { + return `https://tv.yandex.ru/channel/${channel.site_id}?date=${date.format('YYYY-MM-DD')}` + }, + parser: function ({ channel, content }) { + const initialState = content.match(/window.__INITIAL_STATE__ = (.*);/i)[1] + const data = JSON.parse(initialState, null, 2) + const programs = data.channel.schedule.events.map(i => { + return { + title: i.title, + description: i.program.description, + start: i.start, + stop: i.finish, + lang: 'ru', + channel: channel['xmltv_id'] + } + }) + + return programs + } +} diff --git a/package-lock.json b/package-lock.json index f8c87484..38e05e8d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,8 +7,10 @@ "license": "MIT", "dependencies": { "axios": "^0.21.1", + "axios-delay": "^1.0.0-rc6", "commander": "^7.1.0", "dayjs": "^1.10.4", + "glob": "^7.1.6", "xml-js": "^1.6.11" } }, @@ -20,6 +22,49 @@ "follow-redirects": "^1.10.0" } }, + "node_modules/axios-delay": { + "version": "1.0.0-rc6", + "resolved": "https://registry.npmjs.org/axios-delay/-/axios-delay-1.0.0-rc6.tgz", + "integrity": "sha512-l52QkvPb3/T1b5NqyjhXt3LU5lkYOSn0AFb9tXI8qApBv9kGvLQj0PG69s7T9aVtJDMsKakekIMNhJMyXzTJZg==", + "dependencies": { + "axios": "^0.18.0" + } + }, + "node_modules/axios-delay/node_modules/axios": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", + "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", + "deprecated": "Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410", + "dependencies": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + } + }, + "node_modules/axios-delay/node_modules/follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "dependencies": { + "debug": "=3.1.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/commander": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz", @@ -28,11 +73,24 @@ "node": ">= 10" } }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, "node_modules/dayjs": { "version": "1.10.4", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.4.tgz", "integrity": "sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw==" }, + "node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, "node_modules/follow-redirects": { "version": "1.13.3", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", @@ -52,11 +110,108 @@ } } }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, "node_modules/xml-js": { "version": "1.6.11", "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", @@ -78,26 +233,148 @@ "follow-redirects": "^1.10.0" } }, + "axios-delay": { + "version": "1.0.0-rc6", + "resolved": "https://registry.npmjs.org/axios-delay/-/axios-delay-1.0.0-rc6.tgz", + "integrity": "sha512-l52QkvPb3/T1b5NqyjhXt3LU5lkYOSn0AFb9tXI8qApBv9kGvLQj0PG69s7T9aVtJDMsKakekIMNhJMyXzTJZg==", + "requires": { + "axios": "^0.18.0" + }, + "dependencies": { + "axios": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", + "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", + "requires": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + } + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + } + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "commander": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz", "integrity": "sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==" }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, "dayjs": { "version": "1.10.4", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.4.tgz", "integrity": "sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw==" }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, "follow-redirects": { "version": "1.13.3", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==" }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, "xml-js": { "version": "1.6.11", "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", diff --git a/package.json b/package.json index fab9e0e5..47e21ed8 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,17 @@ { "name": "epg", "scripts": { - "update": "./bin/epg-grabber/index.js --config=config/ru/config.xml" + "update": "./bin/epg-grabber/index.js --config=config/ru/config.xml --sites=config/ru/sites" }, "private": true, "author": "Arhey", "license": "MIT", "dependencies": { "axios": "^0.21.1", + "axios-delay": "^1.0.0-rc6", "commander": "^7.1.0", "dayjs": "^1.10.4", + "glob": "^7.1.6", "xml-js": "^1.6.11" } }