This commit is contained in:
freearhey 2021-03-10 17:37:12 +03:00
parent df0819f1f1
commit ed1b894044
19 changed files with 597 additions and 1560 deletions

3
.gitignore vendored
View file

@ -1,4 +1,3 @@
/siteini.pack/
*.log.txt
hot_cookies.txt
robots/
node_modules

Binary file not shown.

View file

@ -1,105 +0,0 @@
#!/bin/bash
#/**
# * @file SiteIni.Pack.Update.sh
# * @brief will update the siteini.pack folder
# * @author Francis De Paemeleere
# * @date 31/07/2016
# */
#backup the current working dir
WG_BCKP_DIR="$(pwd)"
function quit {
#restore previous working dir
cd "$WG_BCKP_DIR"
exit $1;
}
which unzip >/dev/null 2>&1 || { echo >&2 "unzip required, but it's not installed."; quit 1; }
which wget >/dev/null 2>&1 || { echo >&2 "wget required, but it's not installed."; quit 1; }
# set wget progress option
wget --help | grep -q '\--show-progress' && \
_PROGRESS_OPT="-q --show-progress" || _PROGRESS_OPT=""
function download {
wget $_PROGRESS_OPT "$1"
if [[ $? -ne 0 ]]
then
return 1
fi
return 0
}
# get the absolute path of the link (or relative path)
if [ -L $0 ] ; then
DIR=$(dirname $(readlink -f $0)) ;
else
DIR=$PWD/$(dirname $0) ;
fi ;
# move to the real folder
cd "$DIR/.."
#check if we can see the current siteini.pack
echo " ==> detecting siteini.pack"
if [ ! -d "siteini.pack" ]
then
echo "$(pwd)"
echo "[error] Can't find current siteini.pack folder"
quit 1
fi
currentVersion="siteini.pack/*.txt"
files=( $currentVersion )
versionCurrent=${files[0]//[!0-9]/}
echo " ==> Current version: ($versionCurrent)"
content=$(wget http://www.webgrabplus.com/sites/default/files/download/ini/latest_version.txt -q -O -)
#echo "${content//[!0-9]/}"
versionOnline=${content//[!0-9]/}
echo " ==> Online version: ($versionOnline)"
if (( "$versionCurrent" >= "$versionOnline" ))
then
echo " ==> Already up-to-date"
quit 0
fi
echo " ==> removing history file"
#remove older downloaded file (if it would exist)
rm -f SiteIniPack_current.zip
echo " ==> download new siteini.pack package"
#download new file
download "http://webgrabplus.com/sites/default/files/download/ini/SiteIniPack_current.zip"
if [[ $? -ne 0 ]]
then
echo "[error] Download of the siteini.pack failed"
quit 1
fi
echo " ==> remove old siteini.pack"
#remove old siteini.pack
rm -rf siteini.pack
#check if the siteini.pack was deleted correctly
if [ -d "siteini.pack" ]
then
echo "[error] Can't delete old siteini.pack folder"
rm -f SiteIniPack_current.zip
quit 1
fi
echo " ==> extract new siteini.pack"
#extract new siteini.pack
unzip -q SiteIniPack_current.zip -d .
echo " ==> cleanup"
#remove older downloaded file
rm -f SiteIniPack_current.zip
quit 0

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load diff

82
bin/epg-grabber/index.js Executable file
View file

@ -0,0 +1,82 @@
#! /usr/bin/env node
const fs = require('fs')
const path = require('path')
const axios = require('axios')
const utils = require('./utils')
const { Command } = require('commander')
const program = new Command()
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
dayjs.extend(utc)
program
.version('0.1.0', '-v, --version')
.name('epg-grabber')
.description('EPG grabber')
.usage('[options] [file-or-url]')
.option('-c, --config <config>', 'Path to config.xml file', './config.xml')
.option('-s, --sites <sites>', 'Path to /sites folder', './sites')
.parse(process.argv)
const options = program.opts()
const config = utils.parseConfig(options.config)
return console.log(config)
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() {
const d = dayjs.utc()
const dates = Array.from({ length: config.days }, (_, i) => d.add(i, 'd'))
const channels = config.channels
const promises = []
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 })
})
promises.push(promise)
})
})
Promise.allSettled(promises).then(results => {
let programs = []
results.forEach(result => {
if (result.status === 'fulfilled') {
programs = programs.concat(result.value)
}
})
const xml = utils.convertToXMLTV({ channels, programs })
fs.writeFileSync(path.resolve(__dirname, config.filename), xml)
})
}
main()

69
bin/epg-grabber/utils.js Normal file
View file

@ -0,0 +1,69 @@
const fs = require('fs')
const path = require('path')
const convert = require('xml-js')
const dayjs = require('dayjs')
const utils = {}
utils.convertToXMLTV = function ({ channels, programs }) {
let output = `<?xml version="1.0" encoding="UTF-8" ?><tv>`
for (let channel of channels) {
output += `
<channel id="${channel['xmltv_id']}">
<display-name>${channel.name}</display-name>
</channel>`
}
for (let program of programs) {
const start = dayjs(program.start).format('YYYYMMDDHHmmss ZZ')
const stop = dayjs(program.stop).format('YYYYMMDDHHmmss ZZ')
output += `
<programme start="${start}" stop="${stop}" channel="${program.channel}">
<title lang="${program.lang}">${program.title}</title>`
if (program.category) {
output += `<category lang="${program.lang}">${program.category}</category>`
}
output += `</programme>`
}
output += '</tv>'
return output
}
utils.parseConfig = function (config) {
const xml = fs.readFileSync(path.resolve(process.cwd(), config), {
encoding: 'utf-8'
})
const result = convert.xml2js(xml)
const settings = result.elements.find(el => el.name === 'settings')
const filename = this.getElementText('filename', settings.elements)
const days = this.getElementText('days', settings.elements)
const userAgent = this.getElementText('user-agent', settings.elements)
const channels = settings.elements
.filter(el => el.name === 'channel')
.map(el => {
const channel = el.attributes
channel.name = el.elements.find(el => el.type === 'text').text
return channel
})
return {
filename,
days,
userAgent,
channels
}
}
utils.getElementText = function (name, elements) {
const el = elements.find(el => el.name === name)
return el ? el.elements.find(el => el.type === 'text').text : null
}
module.exports = utils

View file

@ -1,171 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Configuration file for the REX (Re-arrange and Edit Xmltv) postprocessor of WebGrab+Plus
by Jan van Straaten
Version 4 Januari 2020 Postprocess V2.0.9
- added xmltv attributes processing for the elements to expand in 'Content and Values' section
- added all Webgrab+Plus xmltv elements are now supported
WebGrab+Plus Version V3.0.0 or higher
Version 3 April 2019 Postprocess v2.0.8
- added optional 'source_file' variable in >filename
- added optional operations of the elements to expand in 'Content and Values' section
WebGrab+Plus Version V2.1.9 or higher-->
<!--This configuration file can be made fully functional, change the settings to your own needs as explained and save it in the rex sub-folder of the
WebGrab+Plus homefolder as rex.config.xl-->
<!-- Introduction:
The purpose of this post-processor is to re-arrange and edit the xmltv file created by the grabber section of WebGrab+Plus.
This can be useful or necessary if the EPG viewer of the PVR/Media-Centre used, or the xmltv importer it uses, does not support all the xmltv elements
in the xmltv file created by WG++ or simply because of some users wishes.
It can:
- Move the content of xmltv elements to other xmltv elements
- Merge the content of several xmltv elements
- Add comments/prefix/postfix text
- Remove or create xmltv elements
E.g.: If the PVR doesn't support import of credit elements (actors, directors etc.) it can add the content of them to the description and remove the
original credit elements which are useless.
Or, it can move the episode data to the beginning or end of the subtitle element
Etc. ..
This file (rex.config.xml), is stored in the REX postprocess home folder. By default, that is a subfolder named rex of the WebGrab+Plus home folder
(default C:\Users\username\AppData\Local\WebGrab+Plus)
Remark: This post-processor is only fully effective if the xmltv input has a 'clean' xmltv structure in which the data is properly allocated to the elements.
If that is the case depends on the EPG source site and the design of the SiteIni file . Some of the (e.g. customized) SiteIni files produce xmltv data that
targets certain PVR/Media-Centre requirements already. In these cases this postprocessor is less effective/useful.-->
<settings>
<!--xmltv file :
The xmltv target file in which the updated data will be merged with the grabbed EPG.
Because of the incremental nature of the grabbing process this file must be different (name and/or path) from the target file of the grabbing as <filename>,
specified in WebGrab++.config.xml . Specify path (obtional) + filename. Path can be specified absolute, like
<filename>C:\Users\username\AppData\Local\WebGrab+Plus\rex\guide.xml</filename> or relative to the path of this config file (rex.config.xml),
like (if guide.xml is in the same folder as the config file) : <filename>guide.xml</filename> !!
It may contain a variable 'source_file' that will take the value of the xmltv source file (without .xml) plus text elements:
e.g <filename>final_'source_file'_1.xml</filename> will result in final_guide_1.xml if source_file is guide.xml-->
<filename>guide.xml</filename>
<!-- Configuration of the elements:-->
<![CDATA[
1. Content and Values:
This is best explained in a step by step fashion:
Suppose you want to move the actors to the end of the description. You then specify:
<desc>'description'\n'actor'</desc>
The result is the existing 'description', followed by, on a newline, the actor(s) separated by the standard WG++ element separator |.
The result:
<desc>This is the original description.
Michael Douglas|Kim Basinger</desc>
You probably don't like the | as separator between the actors, so you specify another separator like this:
<desc>'description'\n'actor(, )'</desc>
The result:
<desc>This is the original description.
Michael Douglas, Kim Basinger</desc>
You can make this prettier by adding some text to the actors addition:
<desc>'description'\nActors: 'actor(, )'.</desc>
The result:
<desc>This is the original description.
Actors: Michael Douglas, Kim Basinger.</desc>
A small problem: Suppose the source xmltv show doesn't have any actors, then the result would be not so pretty:
<desc>This is the original description.
Actors: .</desc>
To avoid that, the added text can be linked to the element it must be added to, like this:
<desc>'description'{\nActors: 'actor(, )'.}</desc>
Result with actors:
<desc>This is the original description.
Actors: Michael Douglas, Kim Basinger.</desc>
And without actors:
<desc>This is the original description.</desc>
An example with some more elements:
<desc>'description'{\n\tYear of production: 'productiondate'.}{\n\tProducer: 'producer(, )'.}{\n\tActors: 'actor(, )'.}</desc>
Result:
<desc>This is the original description.
Year of production: 2002.
Producer: Steven Spielberg.
Actors: Michael Douglas, Kim Basinger.</desc>
And another one:
<sub-title>{Episode: 'episode'\t}'subtitle'</sub-title>
Result:
<sub-title>Episode: 3.2/12.1 The original subtitle</sub-title>
You can also remove elements (but not the title!) from the xmltv listing by specifying an empty element, like this:
<actor></actor> or simply <actor />
This will remove all <actor> elements
And this:
<credits />
Will remove the <credits> element, including all its child elements like <actor> , <producer> etc.
Additional options :
** Operations : optionally to do certain operations on the element value to expand e.g:
These operations must be specified within the ' ' characters that specify the elementname, enclosed by [] and separated by a , e.g.
<desc>{Summary: 'description[cleanup(style=upper), max_chars=500]'}{\nActors: 'actor(, )'}</desc>
supported operations :
- cleanup with style and tags arguments,
- max_chars, max_words and max_sentences to limit the content data of the expanded element.
** Xmltv Attributes in content to expand: If the source xmltv element has an attribute, like lang="en" or role="rolename" (in actor) or system="US",
it is possible to add it to the expanded content by add /a (for attribute value only) or /a+ (for attributename and value) to the element name.
This /a or /a+ addition must be added directly after the element name, like 'actor/a' or combined with a custom separator, 'actor/a(, )'
or combined with an operation 'country/a(/)[cleanup(style=lower)]'
Example (assuming the actors role values are provided in the source xmltv file):
<desc>'description'{\n\tYear of production: 'productiondate',}{ Rating: 'rating/a+'.}{\n\tProducer: 'producer(, )'.}{\n\tActors: 'actor/a+(, )'.}</desc>
Result:
<desc>This is the original description.
Year of production: 2002, Rating TV-14(system=US).
Producer: Steven Spielberg.
Actors: Michael Douglas(role=The carpenter), Kim Basinger(role=Mary).</desc>
Summary of Content/Values:
1. Syntax
<xmltv-element-name optional-attribute="attribute-value">content</xmltv-element-name>
- the content of the xmltv-target elements can be specified by means of a mixture of text and element-values.
- content can be left empty to remove the xmltv element (except the element <title>)
- the element-values must be entered by their (wg++) element-name enclosed by ' '
- optionally, element values can be processed by means of certain operations,
E.g. 'description[cleanup(style=upper), max_sentences=2]'
- optionally, element xmltv attribute values can be added to the content by adding /a (only attribute value) or /a+ (value + attributename) to the 'elementname'
- multiple value elements (like actor) will be converted to single value elements if the xmltv-target element is a single value element, like <desc>.
The individual values will be listed with a (standard WG++ internal element separator character) | as separator unless another separator is specified as follows:
'element-name(separator-string)' e.g. 'actor(, )' or with attribute 'actor/a(, )'
- text and element-names can be linked together by enclosing them by {}. This will ensure that, when the element in it is empty, everything between the {} is
ignored. E.g. {\nProduced in : ('productiondate')}
- the text in the xmltv-target elements may contain the following simple formatting :
- \n or \r to force a newline
- \t to add a tab
2. The allowed xmltv-target elements (the ones in the target file specified above) are :
- IMPORTANT! : any of the next listed xmltv-target elements that is specified in this allocation specification, replaces the existing xmltv element and
its content!
2.1 'Full' function , these can be added, changed and removed
<title> <sub-title> <desc> <star-rating> <director> <actor> <category> <episode> <icon>
<review> (=optional new xmltv element)
2.2 'Remove/Keep' only, cannot be added, changed, only removed or kept as 'is'
<date> <producer> <writer> <presenter> <composer> <commentator> <rating> <aspect> <quality> <url> <country>
3. Supported element-names (from the existing xmltv listing, name definitions as in Appendix E of the documentation) to be used as content to expand:
'title' 'description' 'starrating' 'subtitle' 'productiondate' 'category' 'director' 'actor' 'presenter' 'writer' 'composer' 'producer' 'commentator' 'rating'
'episode' 'showicon' 'review' 'subtitles' 'premiere' 'previously-shown' 'aspect' 'quality' 'country' 'url'
4. Attributes
- for each of the xmltv-elements the following attribute can be specified
(if not specified, the existing one, if present in the xmltv, will be used) :
- lang for <title> and <desc> , default : no attribute
- system for <star-rating> , default : no attribute
- type for <review> , default: type="text"
- Existing xmltv attribute values can be added to expanded content. (see above)
]]>
<!-- examples-->
<sub-title>{Episode: 'episode' }'subtitle'</sub-title>
<desc>'description[max_words=100]'{\n\t¤ Produced in: 'productiondate'. }{¤ Category: 'category(, )'. }{\n\t¤ Actors: 'actor/a+(, )'}{\n\t¤ Director: 'director(, )'}{\n\t¤ Presenter: 'presenter(, )'}</desc>
<credits></credits>
<episode-num></episode-num>
<date></date>
<category></category>
<review>{Ratings: 'rating(, )'.}</review>
<rating></rating>
</settings>

View file

@ -1,16 +0,0 @@
<?xml version="1.0"?>
<settings>
<filename>../../.gh-pages/guide_ru.xml</filename>
<mode></mode>
<postprocess grab="y" run="n">rex</postprocess>
<user-agent>Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36 Edg/79.0.309.71</user-agent>
<logging>off</logging>
<retry time-out="5">4</retry>
<timespan>0</timespan>
<update>f</update>
<channel update="i" site="tv.yandex.ru" site_id="213##323" xmltv_id="2x2.ru">2x2</channel>
<channel update="i" site="tv.yandex.ru" site_id="213##920" xmltv_id="ParamountComedy.ru">Paramount Comedy</channel>
</settings>

320
config/ru/config.xml Executable file
View file

@ -0,0 +1,320 @@
<?xml version="1.0"?>
<settings>
<filename>../../.gh-pages/guide_ru.xml</filename>
<user-agent>Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36 Edg/79.0.309.71</user-agent>
<days>1</days>
<channel site="tv.yandex.ru" site_id="pervyy-16" xmltv_id="Первый">Первый</channel>
<channel site="tv.yandex.ru" site_id="rossiya-1-31" xmltv_id="Россия 1">Россия 1</channel>
<channel site="tv.yandex.ru" site_id="match-tv-49" xmltv_id="Матч!">Матч!</channel>
<channel site="tv.yandex.ru" site_id="ntv-11" xmltv_id="НТВ">НТВ</channel>
<channel site="tv.yandex.ru" site_id="pyatyy-kanal-12" xmltv_id="Пятый канал">Пятый канал</channel>
<channel site="tv.yandex.ru" site_id="kultura-14" xmltv_id="Культура">Культура</channel>
<channel site="tv.yandex.ru" site_id="rossiya-24-3" xmltv_id="Россия 24">Россия 24</channel>
<channel site="tv.yandex.ru" site_id="karusel-20" xmltv_id="Карусель">Карусель</channel>
<channel site="tv.yandex.ru" site_id="obshchestvennoe-televidenie-rossii-51" xmltv_id="ОТР">ОТР</channel>
<channel site="tv.yandex.ru" site_id="tv-centr-32" xmltv_id="ТВ Центр">ТВ Центр</channel>
<channel site="tv.yandex.ru" site_id="ren-30" xmltv_id="РЕН ТВ">РЕН ТВ</channel>
<channel site="tv.yandex.ru" site_id="spas-52" xmltv_id="Спас ТВ">Спас ТВ</channel>
<channel site="tv.yandex.ru" site_id="sts-8" xmltv_id="СТС">СТС</channel>
<channel site="tv.yandex.ru" site_id="domashniy-5" xmltv_id="Домашний">Домашний</channel>
<channel site="tv.yandex.ru" site_id="tv-3-17" xmltv_id="ТВ-3">ТВ-3</channel>
<channel site="tv.yandex.ru" site_id="pyatnica-42" xmltv_id="Пятница">Пятница</channel>
<channel site="tv.yandex.ru" site_id="zvezda-15" xmltv_id="Звезда">Звезда</channel>
<channel site="tv.yandex.ru" site_id="mir-54" xmltv_id="МИР">МИР</channel>
<channel site="tv.yandex.ru" site_id="tnt-33" xmltv_id="ТНТ">ТНТ</channel>
<channel site="tv.yandex.ru" site_id="muz-tv-55" xmltv_id="МУЗ-ТВ">МУЗ-ТВ</channel>
<channel site="tv.yandex.ru" site_id="kanal-disney-4" xmltv_id="Канал Disney">Канал Disney</channel>
<channel site="tv.yandex.ru" site_id="che-50" xmltv_id="Че">Че</channel>
<channel site="tv.yandex.ru" site_id="tnt4-56" xmltv_id="ТНТ4">ТНТ4</channel>
<channel site="tv.yandex.ru" site_id="yu-40" xmltv_id="Ю">Ю</channel>
<channel site="tv.yandex.ru" site_id="2x2-29" xmltv_id="2x2">2x2</channel>
<channel site="tv.yandex.ru" site_id="moskva-doverie-641" xmltv_id="Москва. Доверие">Москва. Доверие</channel>
<channel site="tv.yandex.ru" site_id="360-95" xmltv_id="360°">360°</channel>
<channel site="tv.yandex.ru" site_id="moskva-24-73" xmltv_id="Москва-24">Москва-24</channel>
<channel site="tv.yandex.ru" site_id="eho-tv-66" xmltv_id="Эхо TV">Эхо TV</channel>
<channel site="tv.yandex.ru" site_id="kino-tv-795" xmltv_id="Кино ТВ">Кино ТВ</channel>
<channel site="tv.yandex.ru" site_id="a2-89" xmltv_id="A2">A2</channel>
<channel site="tv.yandex.ru" site_id="sony-turbo-744" xmltv_id="Sony Turbo">Sony Turbo</channel>
<channel site="tv.yandex.ru" site_id="sony-sci-fi-576" xmltv_id="SONY SCI-FI">SONY SCI-FI</channel>
<channel site="tv.yandex.ru" site_id="amc-615" xmltv_id="AMC">AMC</channel>
<channel site="tv.yandex.ru" site_id="tv1000-427" xmltv_id="TV1000">TV1000</channel>
<channel site="tv.yandex.ru" site_id="tv1000-russkoe-kino-475" xmltv_id="TV1000 Русское кино">TV1000 Русское кино</channel>
<channel site="tv.yandex.ru" site_id="tv-xxi-492" xmltv_id="TV XXI">TV XXI</channel>
<channel site="tv.yandex.ru" site_id="dom-kino-715" xmltv_id="Дом кино">Дом кино</channel>
<channel site="tv.yandex.ru" site_id="illyuzion-424" xmltv_id="Иллюзион +">Иллюзион +</channel>
<channel site="tv.yandex.ru" site_id="indiyskoe-kino-700" xmltv_id="Индийское кино">Индийское кино</channel>
<channel site="tv.yandex.ru" site_id="kinosvidanie-551" xmltv_id="Киносвидание">Киносвидание</channel>
<channel site="tv.yandex.ru" site_id="kinopokaz-391" xmltv_id="Кинопоказ">Кинопоказ</channel>
<channel site="tv.yandex.ru" site_id="kinohit-586" xmltv_id="Кинохит">Кинохит</channel>
<channel site="tv.yandex.ru" site_id="nastoyashchee-strashnoe-televidenie-577" xmltv_id="Настоящее Страшное Телевидение">Настоящее Страшное Телевидение</channel>
<channel site="tv.yandex.ru" site_id="rodnoe-kino-386" xmltv_id="Родное кино">Родное кино</channel>
<channel site="tv.yandex.ru" site_id="nashe-novoe-kino-565" xmltv_id="Наше Новое Кино">Наше Новое Кино</channel>
<channel site="tv.yandex.ru" site_id="kinopremera-595" xmltv_id="Кинопремьера">Кинопремьера</channel>
<channel site="tv.yandex.ru" site_id="russkiy-illyuzion-402" xmltv_id="Русский Иллюзион">Русский Иллюзион</channel>
<channel site="tv.yandex.ru" site_id="feniks-kino-659" xmltv_id="Феникс+ Кино">Феникс+ Кино</channel>
<channel site="tv.yandex.ru" site_id="fox-643" xmltv_id="FOX">FOX</channel>
<channel site="tv.yandex.ru" site_id="fox-life-619" xmltv_id="Fox Life">Fox Life</channel>
<channel site="tv.yandex.ru" site_id="evrokino-505" xmltv_id="Еврокино">Еврокино</channel>
<channel site="tv.yandex.ru" site_id="zee-tv-627" xmltv_id="Zee-TV">Zee-TV</channel>
<channel site="tv.yandex.ru" site_id="mir-seriala-209" xmltv_id="Мир сериала">Мир сериала</channel>
<channel site="tv.yandex.ru" site_id="kinomiks-635" xmltv_id="Киномикс">Киномикс</channel>
<channel site="tv.yandex.ru" site_id="tv1000-action-426" xmltv_id="TV1000 Action">TV1000 Action</channel>
<channel site="tv.yandex.ru" site_id="rtv-lyubimoe-kino-559" xmltv_id="РТВ - Любимое кино">РТВ - Любимое кино</channel>
<channel site="tv.yandex.ru" site_id="sony-channel-493" xmltv_id="Sony Channel">Sony Channel</channel>
<channel site="tv.yandex.ru" site_id="kinoseriya-701" xmltv_id="Киносерия">Киносерия</channel>
<channel site="tv.yandex.ru" site_id="kinokomediya-710" xmltv_id="Кинокомедия">Кинокомедия</channel>
<channel site="tv.yandex.ru" site_id="russkiy-roman-520" xmltv_id="Русский роман">Русский роман</channel>
<channel site="tv.yandex.ru" site_id="russkiy-bestseller-771" xmltv_id="Русский бестселлер">Русский бестселлер</channel>
<channel site="tv.yandex.ru" site_id="a1-237" xmltv_id="A1">A1</channel>
<channel site="tv.yandex.ru" site_id="russkiy-detektiv-1137" xmltv_id="Русский Детектив">Русский Детектив</channel>
<channel site="tv.yandex.ru" site_id="mujskoe-kino-1145" xmltv_id="Мужское кино">Мужское кино</channel>
<channel site="tv.yandex.ru" site_id="komediya-1159" xmltv_id="Комедия">Комедия</channel>
<channel site="tv.yandex.ru" site_id="r1-1180" xmltv_id="R1">R1</channel>
<channel site="tv.yandex.ru" site_id="istoriya-794" xmltv_id="История">История</channel>
<channel site="tv.yandex.ru" site_id="tayny-galaktiki-736" xmltv_id="Тайны Галактики">Тайны Галактики</channel>
<channel site="tv.yandex.ru" site_id="discovery-vostochnaya-evropa-740" xmltv_id="Discovery Восточная Европа">Discovery Восточная Европа</channel>
<channel site="tv.yandex.ru" site_id="animal-planet-22" xmltv_id="Animal Planet">Animal Planet</channel>
<channel site="tv.yandex.ru" site_id="discovery-channel-21" xmltv_id="Discovery Channel">Discovery Channel</channel>
<channel site="tv.yandex.ru" site_id="discovery-science-524" xmltv_id="Discovery Science">Discovery Science</channel>
<channel site="tv.yandex.ru" site_id="national-geographic-418" xmltv_id="National Geographic">National Geographic</channel>
<channel site="tv.yandex.ru" site_id="ocean-tv-71" xmltv_id="OCEAN-TV">OCEAN-TV</channel>
<channel site="tv.yandex.ru" site_id="viasat-explore-579" xmltv_id="Viasat Explore">Viasat Explore</channel>
<channel site="tv.yandex.ru" site_id="viasat-history-478" xmltv_id="Viasat History">Viasat History</channel>
<channel site="tv.yandex.ru" site_id="vremya-649" xmltv_id="Время">Время</channel>
<channel site="tv.yandex.ru" site_id="zoo-tv-477" xmltv_id="Зоо ТВ">Зоо ТВ</channel>
<channel site="tv.yandex.ru" site_id="moya-planeta-653" xmltv_id="Моя Планета">Моя Планета</channel>
<channel site="tv.yandex.ru" site_id="teleputeshestviya-697" xmltv_id="Телепутешествия">Телепутешествия</channel>
<channel site="tv.yandex.ru" site_id="domashnie-jivotnye-578" xmltv_id="Домашние животные">Домашние животные</channel>
<channel site="tv.yandex.ru" site_id="viasat-nature-cee-684" xmltv_id="Viasat Nature CEE">Viasat Nature CEE</channel>
<channel site="tv.yandex.ru" site_id="nat-geo-wild-459" xmltv_id="Nat Geo WILD">Nat Geo WILD</channel>
<channel site="tv.yandex.ru" site_id="russian-travel-guide-638" xmltv_id="Russian Travel Guide">Russian Travel Guide</channel>
<channel site="tv.yandex.ru" site_id="voprosy-i-otvety-501" xmltv_id="Вопросы и ответы">Вопросы и ответы</channel>
<channel site="tv.yandex.ru" site_id="kto-est-kto-685" xmltv_id="Кто есть кто">Кто есть кто</channel>
<channel site="tv.yandex.ru" site_id="nauka-674" xmltv_id="Наука">Наука</channel>
<channel site="tv.yandex.ru" site_id="travel-channel-617" xmltv_id="Travel Channel">Travel Channel</channel>
<channel site="tv.yandex.ru" site_id="zoopark-509" xmltv_id="Zooпарк">Zooпарк</channel>
<channel site="tv.yandex.ru" site_id="outdoor-channel-497" xmltv_id="Outdoor Channel">Outdoor Channel</channel>
<channel site="tv.yandex.ru" site_id="365-dney-tv-470" xmltv_id="365 дней ТВ">365 дней ТВ</channel>
<channel site="tv.yandex.ru" site_id="cbs-reality-729" xmltv_id="CBS Reality">CBS Reality</channel>
<channel site="tv.yandex.ru" site_id="traveladventure-773" xmltv_id="Travel+Adventure">Travel+Adventure</channel>
<channel site="tv.yandex.ru" site_id="english-club-tv-683" xmltv_id="English Club TV">English Club TV</channel>
<channel site="tv.yandex.ru" site_id="prosveshchenie-658" xmltv_id="Просвещение">Просвещение</channel>
<channel site="tv.yandex.ru" site_id="nano-395" xmltv_id="Нано">Нано</channel>
<channel site="tv.yandex.ru" site_id="history-1104" xmltv_id="History">History</channel>
<channel site="tv.yandex.ru" site_id="jivaya-priroda-1090" xmltv_id="Живая природа">Живая природа</channel>
<channel site="tv.yandex.ru" site_id="tehno-24-1109" xmltv_id="Техно 24">Техно 24</channel>
<channel site="tv.yandex.ru" site_id="jivaya-planeta-1134" xmltv_id="Живая планета">Живая планета</channel>
<channel site="tv.yandex.ru" site_id="dtx-1146" xmltv_id="DTX">DTX</channel>
<channel site="tv.yandex.ru" site_id="match-futbol-3-797" xmltv_id="Матч! Футбол 3">Матч! Футбол 3</channel>
<channel site="tv.yandex.ru" site_id="eurosport-2-720" xmltv_id="Eurosport 2">Eurosport 2</channel>
<channel site="tv.yandex.ru" site_id="extreme-sports-484" xmltv_id="Extreme Sports">Extreme Sports</channel>
<channel site="tv.yandex.ru" site_id="match-boec-547" xmltv_id="Матч! Боец">Матч! Боец</channel>
<channel site="tv.yandex.ru" site_id="russkiy-ekstrim-523" xmltv_id="Русский Экстрим">Русский Экстрим</channel>
<channel site="tv.yandex.ru" site_id="futbol-105" xmltv_id="Футбол">Футбол</channel>
<channel site="tv.yandex.ru" site_id="viasat-sport-548" xmltv_id="Viasat Sport">Viasat Sport</channel>
<channel site="tv.yandex.ru" site_id="eurosport-677" xmltv_id="Eurosport">Eurosport</channel>
<channel site="tv.yandex.ru" site_id="khl-562" xmltv_id="КХЛ">КХЛ</channel>
<channel site="tv.yandex.ru" site_id="match-futbol-1-646" xmltv_id="Матч! Футбол 1">Матч! Футбол 1</channel>
<channel site="tv.yandex.ru" site_id="match-futbol-2-593" xmltv_id="Матч! Футбол 2">Матч! Футбол 2</channel>
<channel site="tv.yandex.ru" site_id="boks-tv-1095" xmltv_id="Бокс ТВ">Бокс ТВ</channel>
<channel site="tv.yandex.ru" site_id="match-arena-1173" xmltv_id="Матч! Арена">Матч! Арена</channel>
<channel site="tv.yandex.ru" site_id="match-igra-1174" xmltv_id="Матч! Игра">Матч! Игра</channel>
<channel site="tv.yandex.ru" site_id="match-planeta-1177" xmltv_id="Матч! Планета">Матч! Планета</channel>
<channel site="tv.yandex.ru" site_id="mult-1080" xmltv_id="МУЛЬТ">МУЛЬТ</channel>
<channel site="tv.yandex.ru" site_id="nick-jr-731" xmltv_id="Nick Jr">Nick Jr</channel>
<channel site="tv.yandex.ru" site_id="boomerang-741" xmltv_id="Boomerang">Boomerang</channel>
<channel site="tv.yandex.ru" site_id="cartoon-network-612" xmltv_id="Cartoon Network">Cartoon Network</channel>
<channel site="tv.yandex.ru" site_id="nickelodeon-596" xmltv_id="Nickelodeon">Nickelodeon</channel>
<channel site="tv.yandex.ru" site_id="detskiy-408" xmltv_id="Детский">Детский</channel>
<channel site="tv.yandex.ru" site_id="da-vinci-525" xmltv_id="Da Vinci">Da Vinci</channel>
<channel site="tv.yandex.ru" site_id="gulli-girl-707" xmltv_id="Gulli Girl">Gulli Girl</channel>
<channel site="tv.yandex.ru" site_id="jimjam-569" xmltv_id="JimJam">JimJam</channel>
<channel site="tv.yandex.ru" site_id="multimaniya-246" xmltv_id="Мультимания">Мультимания</channel>
<channel site="tv.yandex.ru" site_id="tiji-590" xmltv_id="TiJi">TiJi</channel>
<channel site="tv.yandex.ru" site_id="baby-tv-491" xmltv_id="Baby TV">Baby TV</channel>
<channel site="tv.yandex.ru" site_id="ryjiy-1141" xmltv_id="Рыжий">Рыжий</channel>
<channel site="tv.yandex.ru" site_id="mir-24-98" xmltv_id="МИР 24">МИР 24</channel>
<channel site="tv.yandex.ru" site_id="nhk-world-japan-734" xmltv_id="NHK WORLD TV">NHK WORLD TV</channel>
<channel site="tv.yandex.ru" site_id="bloomberg-552" xmltv_id="Bloomberg">Bloomberg</channel>
<channel site="tv.yandex.ru" site_id="cnn-570" xmltv_id="CNN">CNN</channel>
<channel site="tv.yandex.ru" site_id="evronovosti-121" xmltv_id="Евроновости">Евроновости</channel>
<channel site="tv.yandex.ru" site_id="tv5-monde-607" xmltv_id="TV5-Monde">TV5-Monde</channel>
<channel site="tv.yandex.ru" site_id="rbk-18" xmltv_id="РБК">РБК</channel>
<channel site="tv.yandex.ru" site_id="bbc-572" xmltv_id="BBC">BBC</channel>
<channel site="tv.yandex.ru" site_id="dojd-101" xmltv_id="Дождь">Дождь</channel>
<channel site="tv.yandex.ru" site_id="russia-today-70" xmltv_id="RT">RT</channel>
<channel site="tv.yandex.ru" site_id="pro-biznes-58" xmltv_id="Про Бизнес">Про Бизнес</channel>
<channel site="tv.yandex.ru" site_id="bbc-world-news-712" xmltv_id="BBC World News">BBC World News</channel>
<channel site="tv.yandex.ru" site_id="deutsche-welle-122" xmltv_id="Deutsche Welle">Deutsche Welle</channel>
<channel site="tv.yandex.ru" site_id="bbc-entertainment-479" xmltv_id="BBC Entertainment">BBC Entertainment</channel>
<channel site="tv.yandex.ru" site_id="cnbc-713" xmltv_id="CNBC">CNBC</channel>
<channel site="tv.yandex.ru" site_id="france-24-86" xmltv_id="France 24">France 24</channel>
<channel site="tv.yandex.ru" site_id="pervyy-meteo-404" xmltv_id="Первый метео">Первый метео</channel>
<channel site="tv.yandex.ru" site_id="chpinfo-495" xmltv_id="ЧП.Info">ЧП.Info</channel>
<channel site="tv.yandex.ru" site_id="newsone-467" xmltv_id="NewsOne">NewsOne</channel>
<channel site="tv.yandex.ru" site_id="mtv-russia-783" xmltv_id="MTV Russia">MTV Russia</channel>
<channel site="tv.yandex.ru" site_id="stingray-iconcerts-739" xmltv_id="Stingray iConcerts">Stingray iConcerts</channel>
<channel site="tv.yandex.ru" site_id="mezzo-600" xmltv_id="Mezzo">Mezzo</channel>
<channel site="tv.yandex.ru" site_id="vh1-classic-438" xmltv_id="VH1 Classic">VH1 Classic</channel>
<channel site="tv.yandex.ru" site_id="rutv-77" xmltv_id="RU TV">RU TV</channel>
<channel site="tv.yandex.ru" site_id="tnt-music-655" xmltv_id="ТНТ Music">ТНТ Music</channel>
<channel site="tv.yandex.ru" site_id="shanson-tb-644" xmltv_id="Шансон-TB">Шансон-TB</channel>
<channel site="tv.yandex.ru" site_id="europa-plus-tv-656" xmltv_id="Europa Plus TV">Europa Plus TV</channel>
<channel site="tv.yandex.ru" site_id="muzyka-pervogo-671" xmltv_id="Музыка Первого">Музыка Первого</channel>
<channel site="tv.yandex.ru" site_id="c-music-tv-496" xmltv_id="C Music TV">C Music TV</channel>
<channel site="tv.yandex.ru" site_id="mcm-top-583" xmltv_id="MCM TOP">MCM TOP</channel>
<channel site="tv.yandex.ru" site_id="russian-musicbox-177" xmltv_id="Russian MusicBox">Russian MusicBox</channel>
<channel site="tv.yandex.ru" site_id="musicbox-tv-634" xmltv_id="MusicBox TV">MusicBox TV</channel>
<channel site="tv.yandex.ru" site_id="bridge-tv-russkiy-hit-608" xmltv_id="Bridge TV Русский Хит">Bridge TV Русский Хит</channel>
<channel site="tv.yandex.ru" site_id="vh1-european-567" xmltv_id="VH1 European">VH1 European</channel>
<channel site="tv.yandex.ru" site_id="bridge-tv-102" xmltv_id="Bridge TV">Bridge TV</channel>
<channel site="tv.yandex.ru" site_id="lya-minor-tv-472" xmltv_id="Ля-минор">Ля-минор</channel>
<channel site="tv.yandex.ru" site_id="fashion-one-732" xmltv_id="Fashion One">Fashion One</channel>
<channel site="tv.yandex.ru" site_id="fashion-tv-152" xmltv_id="Fashion TV">Fashion TV</channel>
<channel site="tv.yandex.ru" site_id="world-fashion-channel-88" xmltv_id="World Fashion Channel">World Fashion Channel</channel>
<channel site="tv.yandex.ru" site_id="ohota-i-rybalka-621" xmltv_id="Охота и рыбалка">Охота и рыбалка</channel>
<channel site="tv.yandex.ru" site_id="telekafe-443" xmltv_id="Телекафе">Телекафе</channel>
<channel site="tv.yandex.ru" site_id="usadba-689" xmltv_id="Усадьба">Усадьба</channel>
<channel site="tv.yandex.ru" site_id="mujskoy-412" xmltv_id="Мужской">Мужской</channel>
<channel site="tv.yandex.ru" site_id="psihologiya-21-538" xmltv_id="Психология 21">Психология 21</channel>
<channel site="tv.yandex.ru" site_id="uspeh-63" xmltv_id="Успех">Успех</channel>
<channel site="tv.yandex.ru" site_id="orujie-511" xmltv_id="Оружие">Оружие</channel>
<channel site="tv.yandex.ru" site_id="zagorodnyy-666" xmltv_id="Загородный">Загородный</channel>
<channel site="tv.yandex.ru" site_id="zagorodnaya-jizn-390" xmltv_id="Загородная жизнь">Загородная жизнь</channel>
<channel site="tv.yandex.ru" site_id="zdorove-632" xmltv_id="Тонус-ТВ">Тонус-ТВ</channel>
<channel site="tv.yandex.ru" site_id="tdk-78" xmltv_id="TDK">TDK</channel>
<channel site="tv.yandex.ru" site_id="tlc-533" xmltv_id="TLC">TLC</channel>
<channel site="tv.yandex.ru" site_id="drayv-573" xmltv_id="Драйв">Драйв</channel>
<channel site="tv.yandex.ru" site_id="zdorovoe-tv-609" xmltv_id="Здоровое ТВ">Здоровое ТВ</channel>
<channel site="tv.yandex.ru" site_id="jivi-421" xmltv_id="Живи!">Живи!</channel>
<channel site="tv.yandex.ru" site_id="kuhnya-tv-618" xmltv_id="Кухня ТВ">Кухня ТВ</channel>
<channel site="tv.yandex.ru" site_id="avto-plyus-436" xmltv_id="Авто Плюс">Авто Плюс</channel>
<channel site="tv.yandex.ru" site_id="eda-64" xmltv_id="ЕДА">ЕДА</channel>
<channel site="tv.yandex.ru" site_id="ohotnik-i-rybolov-430" xmltv_id="Охотник и Рыболов">Охотник и Рыболов</channel>
<channel site="tv.yandex.ru" site_id="world-business-channel-115" xmltv_id="World Business Channel">World Business Channel</channel>
<channel site="tv.yandex.ru" site_id="rtg-international-1169" xmltv_id="RTG International">RTG International</channel>
<channel site="tv.yandex.ru" site_id="bober-1171" xmltv_id="Бобер">Бобер</channel>
<channel site="tv.yandex.ru" site_id="konnyy-mir-1184" xmltv_id="Конный мир">Конный мир</channel>
<channel site="tv.yandex.ru" site_id="luxury-785" xmltv_id="LUXURY">LUXURY</channel>
<channel site="tv.yandex.ru" site_id="sts-love-104" xmltv_id="СТС Love">СТС Love</channel>
<channel site="tv.yandex.ru" site_id="1hd-99" xmltv_id="1HD">1HD</channel>
<channel site="tv.yandex.ru" site_id="teatr-737" xmltv_id="Театр">Театр</channel>
<channel site="tv.yandex.ru" site_id="sarafan-645" xmltv_id="Сарафан">Сарафан</channel>
<channel site="tv.yandex.ru" site_id="paramount-comedy-733" xmltv_id="Paramount Comedy">Paramount Comedy</channel>
<channel site="tv.yandex.ru" site_id="o2tv-107" xmltv_id="О2ТВ">О2ТВ</channel>
<channel site="tv.yandex.ru" site_id="jara-440" xmltv_id="Жара">Жара</channel>
<channel site="tv.yandex.ru" site_id="e-tv-235" xmltv_id="Game Show">Game Show</channel>
<channel site="tv.yandex.ru" site_id="fashion-one-hd-789" xmltv_id="Fashion One HD">Fashion One HD</channel>
<channel site="tv.yandex.ru" site_id="khl-hd-796" xmltv_id="КХЛ HD">КХЛ HD</channel>
<channel site="tv.yandex.ru" site_id="outdoor-hd-791" xmltv_id="Outdoor HD">Outdoor HD</channel>
<channel site="tv.yandex.ru" site_id="vip-comedy-777" xmltv_id="ViP Comedy">ViP Comedy</channel>
<channel site="tv.yandex.ru" site_id="vip-megahit-778" xmltv_id="ViP Megahit">ViP Megahit</channel>
<channel site="tv.yandex.ru" site_id="vip-premiere-779" xmltv_id="ViP Premiere">ViP Premiere</channel>
<channel site="tv.yandex.ru" site_id="traveladventure-hd-793" xmltv_id="Travel+Adventure HD">Travel+Adventure HD</channel>
<channel site="tv.yandex.ru" site_id="fox-hd-790" xmltv_id="Fox HD">Fox HD</channel>
<channel site="tv.yandex.ru" site_id="sony-tv-hd-792" xmltv_id="Sony ТВ HD">Sony ТВ HD</channel>
<channel site="tv.yandex.ru" site_id="match-futbol-2-hd-800" xmltv_id="Матч! Футбол 2 HD">Матч! Футбол 2 HD</channel>
<channel site="tv.yandex.ru" site_id="match-futbol-1-hd-801" xmltv_id="Матч! Футбол 1 HD">Матч! Футбол 1 HD</channel>
<channel site="tv.yandex.ru" site_id="mgm-hd-743" xmltv_id="MGM HD">MGM HD</channel>
<channel site="tv.yandex.ru" site_id="shokiruyushchee-432" xmltv_id="Кинопоказ HD-1">Кинопоказ HD-1</channel>
<channel site="tv.yandex.ru" site_id="kinopokaz-hd-2-678" xmltv_id="Кинопоказ HD-2">Кинопоказ HD-2</channel>
<channel site="tv.yandex.ru" site_id="mezzo-live-hd-702" xmltv_id="Mezzo Live HD">Mezzo Live HD</channel>
<channel site="tv.yandex.ru" site_id="national-geographic-hd-516" xmltv_id="National Geographic HD">National Geographic HD</channel>
<channel site="tv.yandex.ru" site_id="travel-channel-hd-425" xmltv_id="Travel Channel HD">Travel Channel HD</channel>
<channel site="tv.yandex.ru" site_id="nickelodeon-hd-532" xmltv_id="Nickelodeon HD">Nickelodeon HD</channel>
<channel site="tv.yandex.ru" site_id="hdl-528" xmltv_id="HD Life">HD Life</channel>
<channel site="tv.yandex.ru" site_id="eda-premium-742" xmltv_id="Еда Премиум">Еда Премиум</channel>
<channel site="tv.yandex.ru" site_id="pervyy-hd-763" xmltv_id="Первый HD">Первый HD</channel>
<channel site="tv.yandex.ru" site_id="rossiya-1-hd-65" xmltv_id="Россия 1 HD">Россия 1 HD</channel>
<channel site="tv.yandex.ru" site_id="animal-planet-hd-769" xmltv_id="Animal Planet HD">Animal Planet HD</channel>
<channel site="tv.yandex.ru" site_id="kinosemya-766" xmltv_id="Киносемья">Киносемья</channel>
<channel site="tv.yandex.ru" site_id="luxe-hd-494" xmltv_id="Luxe HD">Luxe HD</channel>
<channel site="tv.yandex.ru" site_id="hd-media-80" xmltv_id="HD Медиа">HD Медиа</channel>
<channel site="tv.yandex.ru" site_id="priklyucheniya-hd-499" xmltv_id="Teletravel HD">Teletravel HD</channel>
<channel site="tv.yandex.ru" site_id="fashion-tv-hd-423" xmltv_id="Fashion TV HD">Fashion TV HD</channel>
<channel site="tv.yandex.ru" site_id="nat-geo-wild-hd-704" xmltv_id="Nat Geo Wild HD">Nat Geo Wild HD</channel>
<channel site="tv.yandex.ru" site_id="fox-life-hd-553" xmltv_id="Fox Life HD">Fox Life HD</channel>
<channel site="tv.yandex.ru" site_id="eurosport-1-hd-591" xmltv_id="Eurosport 1 HD">Eurosport 1 HD</channel>
<channel site="tv.yandex.ru" site_id="mtv-live-international-hd-513" xmltv_id="MTV Live International HD">MTV Live International HD</channel>
<channel site="tv.yandex.ru" site_id="amedia-premium-hd-238" xmltv_id="Amedia Premium HD">Amedia Premium HD</channel>
<channel site="tv.yandex.ru" site_id="strashnoe-hd-1096" xmltv_id="Страшное HD">Страшное HD</channel>
<channel site="tv.yandex.ru" site_id="bollywood-hd-1105" xmltv_id="Bollywood HD">Bollywood HD</channel>
<channel site="tv.yandex.ru" site_id="kinopremiumhd-1147" xmltv_id="КиноПремиумHD">КиноПремиумHD</channel>
<channel site="tv.yandex.ru" site_id="ostrosyujetnoe-hd-1149" xmltv_id="Остросюжетное HD">Остросюжетное HD</channel>
<channel site="tv.yandex.ru" site_id="discovery-channel-hd-1156" xmltv_id="Discovery Channel HD">Discovery Channel HD</channel>
<channel site="tv.yandex.ru" site_id="ginger-hd-1166" xmltv_id="Ginger HD">Ginger HD</channel>
<channel site="tv.yandex.ru" site_id="ohotnik-i-rybolov-hd-1185" xmltv_id="Охотник и Рыболов HD">Охотник и Рыболов HD</channel>
<channel site="tv.yandex.ru" site_id="insight-ultra-hd-1172" xmltv_id="Insight Ultra HD">Insight Ultra HD</channel>
<channel site="tv.yandex.ru" site_id="fuel-tv-hd-1176" xmltv_id="Fuel TV HD">Fuel TV HD</channel>
<channel site="tv.yandex.ru" site_id="museum-hd-1178" xmltv_id="Museum HD">Museum HD</channel>
<channel site="tv.yandex.ru" site_id="balashiha-tv-1115" xmltv_id="Балашиха ТВ">Балашиха ТВ</channel>
<channel site="tv.yandex.ru" site_id="belarus-24-468" xmltv_id="Беларусь-24">Беларусь-24</channel>
<channel site="tv.yandex.ru" site_id="tnv-planeta-188" xmltv_id="ТНВ-планета">ТНВ-планета</channel>
<channel site="tv.yandex.ru" site_id="mama-622" xmltv_id="Мама">Мама</channel>
<channel site="tv.yandex.ru" site_id="nostalgiya-691" xmltv_id="Ностальгия">Ностальгия</channel>
<channel site="tv.yandex.ru" site_id="radost-moya-185" xmltv_id="Радость Моя">Радость Моя</channel>
<channel site="tv.yandex.ru" site_id="tnv-446" xmltv_id="ТНВ">ТНВ</channel>
<channel site="tv.yandex.ru" site_id="cinema-396" xmltv_id="Cinema">Cinema</channel>
<channel site="tv.yandex.ru" site_id="sovershenno-sekretno-57" xmltv_id="Совершенно секретно">Совершенно секретно</channel>
<channel site="tv.yandex.ru" site_id="retro-tv-382" xmltv_id="Ретро ТВ">Ретро ТВ</channel>
<channel site="tv.yandex.ru" site_id="8-kanal-456" xmltv_id="8 Канал">8 Канал</channel>
<channel site="tv.yandex.ru" site_id="ajara-tv-682" xmltv_id="Ajara TV">Ajara TV</channel>
<channel site="tv.yandex.ru" site_id="luxetv-542" xmltv_id="Luxe.TV">Luxe.TV</channel>
<channel site="tv.yandex.ru" site_id="myzentv-434" xmltv_id="myZen.tv">myZen.tv</channel>
<channel site="tv.yandex.ru" site_id="shot-tv-537" xmltv_id="Эгоист ТВ">Эгоист ТВ</channel>
<channel site="tv.yandex.ru" site_id="raztv-84" xmltv_id="РазТВ">РазТВ</channel>
<channel site="tv.yandex.ru" site_id="rjd-575" xmltv_id="РЖД">РЖД</channel>
<channel site="tv.yandex.ru" site_id="belros-675" xmltv_id="БелРос (ТРО)">БелРос (ТРО)</channel>
<channel site="tv.yandex.ru" site_id="tbn-601" xmltv_id="ТБН">ТБН</channel>
<channel site="tv.yandex.ru" site_id="soyuz-108" xmltv_id="Союз">Союз</channel>
<channel site="tv.yandex.ru" site_id="tochkatv-68" xmltv_id="Точка ТВ">Точка ТВ</channel>
<channel site="tv.yandex.ru" site_id="ldpr-tv-1107" xmltv_id="ЛДПР ТВ">ЛДПР ТВ</channel>
<channel site="tv.yandex.ru" site_id="kaleydoskop-tv-232" xmltv_id="Калейдоскоп ТВ">Калейдоскоп ТВ</channel>
<channel site="tv.yandex.ru" site_id="h2-1191" xmltv_id="H2">H2</channel>
<channel site="tv.yandex.ru" site_id="kvn-tv-1192" xmltv_id="КВН ТВ">КВН ТВ</channel>
<channel site="tv.yandex.ru" site_id="pingvin-lolo-245" xmltv_id="Пингвин Лоло">Пингвин Лоло</channel>
<channel site="tv.yandex.ru" site_id="food-network-1194" xmltv_id="Food Network">Food Network</channel>
<channel site="tv.yandex.ru" site_id="centralnoe-televidenie-ctv-198" xmltv_id="Центральное телевидение (ЦТВ)">Центральное телевидение (ЦТВ)</channel>
<channel site="tv.yandex.ru" site_id="fashion-one-4k-1204" xmltv_id="Fashion One 4K">Fashion One 4K</channel>
<channel site="tv.yandex.ru" site_id="otkrytyy-mir-1199" xmltv_id="Открытый мир">Открытый мир</channel>
<channel site="tv.yandex.ru" site_id="global-star-62" xmltv_id="Global Star">Global Star</channel>
<channel site="tv.yandex.ru" site_id="mtv-dance-international-1206" xmltv_id="MTV Dance International">MTV Dance International</channel>
<channel site="tv.yandex.ru" site_id="mtv-hits-international-1207" xmltv_id="MTV Hits International">MTV Hits International</channel>
<channel site="tv.yandex.ru" site_id="mtv-rocks-international-1205" xmltv_id="MTV Rocks International">MTV Rocks International</channel>
<channel site="tv.yandex.ru" site_id="shant-premium-1208" xmltv_id="SHANT Premium">SHANT Premium</channel>
<channel site="tv.yandex.ru" site_id="paramount-channel-1209" xmltv_id="Paramount Channel">Paramount Channel</channel>
<channel site="tv.yandex.ru" site_id="v-mire-jivotnyh-1211" xmltv_id="Animal Family HD">Animal Family HD</channel>
<channel site="tv.yandex.ru" site_id="evrika-1212" xmltv_id="Eureka HD">Eureka HD</channel>
<channel site="tv.yandex.ru" site_id="rtd-82" xmltv_id="RTД">RTД</channel>
<channel site="tv.yandex.ru" site_id="dom-kino-premium-1213" xmltv_id="Дом Кино Премиум">Дом Кино Премиум</channel>
<channel site="tv.yandex.ru" site_id="nadejda-127" xmltv_id="Надежда">Надежда</channel>
<channel site="tv.yandex.ru" site_id="detektivtv-1216" xmltv_id="Detektiv.tv">Detektiv.tv</channel>
<channel site="tv.yandex.ru" site_id="malysh-1214" xmltv_id="Малыш">Малыш</channel>
<channel site="tv.yandex.ru" site_id="nash-detektiv-1217" xmltv_id="Наш Детектив">Наш Детектив</channel>
<channel site="tv.yandex.ru" site_id="dushevnoe-1218" xmltv_id="Наш Кинороман">Наш Кинороман</channel>
<channel site="tv.yandex.ru" site_id="anekdot-tv-85" xmltv_id="Анекдот ТВ">Анекдот ТВ</channel>
<channel site="tv.yandex.ru" site_id="novyy-mir-1220" xmltv_id="Новый мир">Новый мир</channel>
<channel site="tv.yandex.ru" site_id="sankt-peterburg-48" xmltv_id="Санкт-Петербург">Санкт-Петербург</channel>
<channel site="tv.yandex.ru" site_id="ntv-pravo-92" xmltv_id="НТВ Право">НТВ Право</channel>
<channel site="tv.yandex.ru" site_id="ntv-serial-93" xmltv_id="НТВ Сериал">НТВ Сериал</channel>
<channel site="tv.yandex.ru" site_id="ntv-stil-94" xmltv_id="НТВ Стиль">НТВ Стиль</channel>
<channel site="tv.yandex.ru" site_id="o-1225" xmltv_id="О!">О!</channel>
<channel site="tv.yandex.ru" site_id="hitv-75" xmltv_id="HITV">HITV</channel>
<channel site="tv.yandex.ru" site_id="spike-1226" xmltv_id="Spike">Spike</channel>
<channel site="tv.yandex.ru" site_id="docubox-hd-1227" xmltv_id="DocuBox HD">DocuBox HD</channel>
<channel site="tv.yandex.ru" site_id="filmbox-hd-1228" xmltv_id="FilmBox HD">FilmBox HD</channel>
<channel site="tv.yandex.ru" site_id="russian-extreme-ultra-hd-1229" xmltv_id="Russian Extreme Ultra HD">Russian Extreme Ultra HD</channel>
<channel site="tv.yandex.ru" site_id="tvrus-1230" xmltv_id="TVRUS">TVRUS</channel>
<channel site="tv.yandex.ru" site_id="tnt-hd-1232" xmltv_id="ТНТ HD">ТНТ HD</channel>
<channel site="tv.yandex.ru" site_id="h2-hd-1237" xmltv_id="H2 HD">H2 HD</channel>
<channel site="tv.yandex.ru" site_id="mujskoe-kino-hd-1238" xmltv_id="Мужское кино HD">Мужское кино HD</channel>
<channel site="tv.yandex.ru" site_id="7-tv-1241" xmltv_id="7 TV">7 TV</channel>
<channel site="tv.yandex.ru" site_id="fashion-box-hd-1242" xmltv_id="Fashion Box HD">Fashion Box HD</channel>
<channel site="tv.yandex.ru" site_id="fast-fun-box-hd-1243" xmltv_id="Fast &amp; FunBox HD">Fast &amp; FunBox HD</channel>
<channel site="tv.yandex.ru" site_id="filmbox-arthouse-1244" xmltv_id="FilmBox Arthouse">FilmBox Arthouse</channel>
<channel site="tv.yandex.ru" site_id="doktor-1245" xmltv_id="Доктор">Доктор</channel>
<channel site="tv.yandex.ru" site_id="poehali-1246" xmltv_id="Поехали!">Поехали!</channel>
</settings>

View file

@ -1,171 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Configuration file for the REX (Re-arrange and Edit Xmltv) postprocessor of WebGrab+Plus
by Jan van Straaten
Version 4 Januari 2020 Postprocess V2.0.9
- added xmltv attributes processing for the elements to expand in 'Content and Values' section
- added all Webgrab+Plus xmltv elements are now supported
WebGrab+Plus Version V3.0.0 or higher
Version 3 April 2019 Postprocess v2.0.8
- added optional 'source_file' variable in >filename
- added optional operations of the elements to expand in 'Content and Values' section
WebGrab+Plus Version V2.1.9 or higher-->
<!--This configuration file can be made fully functional, change the settings to your own needs as explained and save it in the rex sub-folder of the
WebGrab+Plus homefolder as rex.config.xl-->
<!-- Introduction:
The purpose of this post-processor is to re-arrange and edit the xmltv file created by the grabber section of WebGrab+Plus.
This can be useful or necessary if the EPG viewer of the PVR/Media-Centre used, or the xmltv importer it uses, does not support all the xmltv elements
in the xmltv file created by WG++ or simply because of some users wishes.
It can:
- Move the content of xmltv elements to other xmltv elements
- Merge the content of several xmltv elements
- Add comments/prefix/postfix text
- Remove or create xmltv elements
E.g.: If the PVR doesn't support import of credit elements (actors, directors etc.) it can add the content of them to the description and remove the
original credit elements which are useless.
Or, it can move the episode data to the beginning or end of the subtitle element
Etc. ..
This file (rex.config.xml), is stored in the REX postprocess home folder. By default, that is a subfolder named rex of the WebGrab+Plus home folder
(default C:\Users\username\AppData\Local\WebGrab+Plus)
Remark: This post-processor is only fully effective if the xmltv input has a 'clean' xmltv structure in which the data is properly allocated to the elements.
If that is the case depends on the EPG source site and the design of the SiteIni file . Some of the (e.g. customized) SiteIni files produce xmltv data that
targets certain PVR/Media-Centre requirements already. In these cases this postprocessor is less effective/useful.-->
<settings>
<!--xmltv file :
The xmltv target file in which the updated data will be merged with the grabbed EPG.
Because of the incremental nature of the grabbing process this file must be different (name and/or path) from the target file of the grabbing as <filename>,
specified in WebGrab++.config.xml . Specify path (obtional) + filename. Path can be specified absolute, like
<filename>C:\Users\username\AppData\Local\WebGrab+Plus\rex\guide.xml</filename> or relative to the path of this config file (rex.config.xml),
like (if guide.xml is in the same folder as the config file) : <filename>guide.xml</filename> !!
It may contain a variable 'source_file' that will take the value of the xmltv source file (without .xml) plus text elements:
e.g <filename>final_'source_file'_1.xml</filename> will result in final_guide_1.xml if source_file is guide.xml-->
<filename>guide.xml</filename>
<!-- Configuration of the elements:-->
<![CDATA[
1. Content and Values:
This is best explained in a step by step fashion:
Suppose you want to move the actors to the end of the description. You then specify:
<desc>'description'\n'actor'</desc>
The result is the existing 'description', followed by, on a newline, the actor(s) separated by the standard WG++ element separator |.
The result:
<desc>This is the original description.
Michael Douglas|Kim Basinger</desc>
You probably don't like the | as separator between the actors, so you specify another separator like this:
<desc>'description'\n'actor(, )'</desc>
The result:
<desc>This is the original description.
Michael Douglas, Kim Basinger</desc>
You can make this prettier by adding some text to the actors addition:
<desc>'description'\nActors: 'actor(, )'.</desc>
The result:
<desc>This is the original description.
Actors: Michael Douglas, Kim Basinger.</desc>
A small problem: Suppose the source xmltv show doesn't have any actors, then the result would be not so pretty:
<desc>This is the original description.
Actors: .</desc>
To avoid that, the added text can be linked to the element it must be added to, like this:
<desc>'description'{\nActors: 'actor(, )'.}</desc>
Result with actors:
<desc>This is the original description.
Actors: Michael Douglas, Kim Basinger.</desc>
And without actors:
<desc>This is the original description.</desc>
An example with some more elements:
<desc>'description'{\n\tYear of production: 'productiondate'.}{\n\tProducer: 'producer(, )'.}{\n\tActors: 'actor(, )'.}</desc>
Result:
<desc>This is the original description.
Year of production: 2002.
Producer: Steven Spielberg.
Actors: Michael Douglas, Kim Basinger.</desc>
And another one:
<sub-title>{Episode: 'episode'\t}'subtitle'</sub-title>
Result:
<sub-title>Episode: 3.2/12.1 The original subtitle</sub-title>
You can also remove elements (but not the title!) from the xmltv listing by specifying an empty element, like this:
<actor></actor> or simply <actor />
This will remove all <actor> elements
And this:
<credits />
Will remove the <credits> element, including all its child elements like <actor> , <producer> etc.
Additional options :
** Operations : optionally to do certain operations on the element value to expand e.g:
These operations must be specified within the ' ' characters that specify the elementname, enclosed by [] and separated by a , e.g.
<desc>{Summary: 'description[cleanup(style=upper), max_chars=500]'}{\nActors: 'actor(, )'}</desc>
supported operations :
- cleanup with style and tags arguments,
- max_chars, max_words and max_sentences to limit the content data of the expanded element.
** Xmltv Attributes in content to expand: If the source xmltv element has an attribute, like lang="en" or role="rolename" (in actor) or system="US",
it is possible to add it to the expanded content by add /a (for attribute value only) or /a+ (for attributename and value) to the element name.
This /a or /a+ addition must be added directly after the element name, like 'actor/a' or combined with a custom separator, 'actor/a(, )'
or combined with an operation 'country/a(/)[cleanup(style=lower)]'
Example (assuming the actors role values are provided in the source xmltv file):
<desc>'description'{\n\tYear of production: 'productiondate',}{ Rating: 'rating/a+'.}{\n\tProducer: 'producer(, )'.}{\n\tActors: 'actor/a+(, )'.}</desc>
Result:
<desc>This is the original description.
Year of production: 2002, Rating TV-14(system=US).
Producer: Steven Spielberg.
Actors: Michael Douglas(role=The carpenter), Kim Basinger(role=Mary).</desc>
Summary of Content/Values:
1. Syntax
<xmltv-element-name optional-attribute="attribute-value">content</xmltv-element-name>
- the content of the xmltv-target elements can be specified by means of a mixture of text and element-values.
- content can be left empty to remove the xmltv element (except the element <title>)
- the element-values must be entered by their (wg++) element-name enclosed by ' '
- optionally, element values can be processed by means of certain operations,
E.g. 'description[cleanup(style=upper), max_sentences=2]'
- optionally, element xmltv attribute values can be added to the content by adding /a (only attribute value) or /a+ (value + attributename) to the 'elementname'
- multiple value elements (like actor) will be converted to single value elements if the xmltv-target element is a single value element, like <desc>.
The individual values will be listed with a (standard WG++ internal element separator character) | as separator unless another separator is specified as follows:
'element-name(separator-string)' e.g. 'actor(, )' or with attribute 'actor/a(, )'
- text and element-names can be linked together by enclosing them by {}. This will ensure that, when the element in it is empty, everything between the {} is
ignored. E.g. {\nProduced in : ('productiondate')}
- the text in the xmltv-target elements may contain the following simple formatting :
- \n or \r to force a newline
- \t to add a tab
2. The allowed xmltv-target elements (the ones in the target file specified above) are :
- IMPORTANT! : any of the next listed xmltv-target elements that is specified in this allocation specification, replaces the existing xmltv element and
its content!
2.1 'Full' function , these can be added, changed and removed
<title> <sub-title> <desc> <star-rating> <director> <actor> <category> <episode> <icon>
<review> (=optional new xmltv element)
2.2 'Remove/Keep' only, cannot be added, changed, only removed or kept as 'is'
<date> <producer> <writer> <presenter> <composer> <commentator> <rating> <aspect> <quality> <url> <country>
3. Supported element-names (from the existing xmltv listing, name definitions as in Appendix E of the documentation) to be used as content to expand:
'title' 'description' 'starrating' 'subtitle' 'productiondate' 'category' 'director' 'actor' 'presenter' 'writer' 'composer' 'producer' 'commentator' 'rating'
'episode' 'showicon' 'review' 'subtitles' 'premiere' 'previously-shown' 'aspect' 'quality' 'country' 'url'
4. Attributes
- for each of the xmltv-elements the following attribute can be specified
(if not specified, the existing one, if present in the xmltv, will be used) :
- lang for <title> and <desc> , default : no attribute
- system for <star-rating> , default : no attribute
- type for <review> , default: type="text"
- Existing xmltv attribute values can be added to expanded content. (see above)
]]>
<!-- examples-->
<sub-title>{Episode: 'episode' }'subtitle'</sub-title>
<desc>'description[max_words=100]'{\n\t¤ Produced in: 'productiondate'. }{¤ Category: 'category(, )'. }{\n\t¤ Actors: 'actor/a+(, )'}{\n\t¤ Director: 'director(, )'}{\n\t¤ Presenter: 'presenter(, )'}</desc>
<credits></credits>
<episode-num></episode-num>
<date></date>
<category></category>
<review>{Ratings: 'rating(, )'.}</review>
<rating></rating>
</settings>

110
package-lock.json generated Normal file
View file

@ -0,0 +1,110 @@
{
"name": "epg",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"license": "MIT",
"dependencies": {
"axios": "^0.21.1",
"commander": "^7.1.0",
"dayjs": "^1.10.4",
"xml-js": "^1.6.11"
}
},
"node_modules/axios": {
"version": "0.21.1",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
"integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
"dependencies": {
"follow-redirects": "^1.10.0"
}
},
"node_modules/commander": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz",
"integrity": "sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==",
"engines": {
"node": ">= 10"
}
},
"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/follow-redirects": {
"version": "1.13.3",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz",
"integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
"engines": {
"node": ">=4.0"
},
"peerDependenciesMeta": {
"debug": {
"optional": true
}
}
},
"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/xml-js": {
"version": "1.6.11",
"resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz",
"integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==",
"dependencies": {
"sax": "^1.2.4"
},
"bin": {
"xml-js": "bin/cli.js"
}
}
},
"dependencies": {
"axios": {
"version": "0.21.1",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
"integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
"requires": {
"follow-redirects": "^1.10.0"
}
},
"commander": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz",
"integrity": "sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg=="
},
"dayjs": {
"version": "1.10.4",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.4.tgz",
"integrity": "sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw=="
},
"follow-redirects": {
"version": "1.13.3",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz",
"integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA=="
},
"sax": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
},
"xml-js": {
"version": "1.6.11",
"resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz",
"integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==",
"requires": {
"sax": "^1.2.4"
}
}
}
}

15
package.json Normal file
View file

@ -0,0 +1,15 @@
{
"name": "epg",
"scripts": {
"update": "./bin/epg-grabber/index.js --config=config/ru/config.xml"
},
"private": true,
"author": "Arhey",
"license": "MIT",
"dependencies": {
"axios": "^0.21.1",
"commander": "^7.1.0",
"dayjs": "^1.10.4",
"xml-js": "^1.6.11"
}
}