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"
}
}