diff --git a/.gitignore b/.gitignore index 0c59d26d..ed136f23 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ /siteini.pack/ -*.log.txt hot_cookies.txt -robots/ \ No newline at end of file +node_modules \ No newline at end of file diff --git a/bin/Microsoft.Azure.Storage.Common.dll b/bin/Microsoft.Azure.Storage.Common.dll deleted file mode 100755 index adc5964d..00000000 Binary files a/bin/Microsoft.Azure.Storage.Common.dll and /dev/null differ diff --git a/bin/Microsoft.Azure.Storage.File.dll b/bin/Microsoft.Azure.Storage.File.dll deleted file mode 100755 index 4fc74bd0..00000000 Binary files a/bin/Microsoft.Azure.Storage.File.dll and /dev/null differ diff --git a/bin/SiteIni.Pack.Update.sh b/bin/SiteIni.Pack.Update.sh deleted file mode 100755 index a6436d01..00000000 --- a/bin/SiteIni.Pack.Update.sh +++ /dev/null @@ -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 diff --git a/bin/WebGrab+Plus.azure.dll b/bin/WebGrab+Plus.azure.dll deleted file mode 100755 index 5bdc5d2a..00000000 Binary files a/bin/WebGrab+Plus.azure.dll and /dev/null differ diff --git a/bin/WebGrab+Plus.exe b/bin/WebGrab+Plus.exe deleted file mode 100755 index 7249dfda..00000000 Binary files a/bin/WebGrab+Plus.exe and /dev/null differ diff --git a/bin/WebGrab+Plus.logger.dll b/bin/WebGrab+Plus.logger.dll deleted file mode 100755 index 59ef841b..00000000 Binary files a/bin/WebGrab+Plus.logger.dll and /dev/null differ diff --git a/bin/WebGrab+Plus.timezone.dll b/bin/WebGrab+Plus.timezone.dll deleted file mode 100755 index f151937e..00000000 Binary files a/bin/WebGrab+Plus.timezone.dll and /dev/null differ diff --git a/bin/WebGrab+Plus.xmltv.dll b/bin/WebGrab+Plus.xmltv.dll deleted file mode 100755 index 4bfd9173..00000000 Binary files a/bin/WebGrab+Plus.xmltv.dll and /dev/null differ diff --git a/bin/changelog.txt b/bin/changelog.txt deleted file mode 100755 index 5564c83b..00000000 --- a/bin/changelog.txt +++ /dev/null @@ -1,1095 +0,0 @@ -Changelog WebGrab+Plus - -16/06/2020 -Version 3.1 ---------------------------------------------------------------------------------------------- -- (3.0.3.5) new : WG.common.azure.dll V1.5.1 with encrypted connection string - fixed : the mess with all the azure references and nuget packages -- (3.0.3.4) changed : WG_Azure.dll is now an included project WG.common.azure.dll - also revert to the code of WG_Azure.dll version 1.3 - fixed : missing ssl statement in GrabHtmlPage: ServicePointManager.ServerCertificateValidationCallback = Validator; -- (3.0.3.3) changed : using WG_Azure version 1.4 that uses the azureconfiguration manager and the azure access data in app.config -- (3.0.3.2) fixed : grabexe for subdetail was not yet implemented - improved: grabexe speedup, will no longer write to console, only response.txt file - improved: path setting of the response file -- (3.0.3.1) fixed : conditional urldate in postback error - -09/05/2020 -Version 3.0.3 beta ---------------------------------------------------------------------------------------------- -- (3.0.2.4) fixed : urldate in postback expanded always to urldate day 0 -- (3.0.2.3) added : custom license data file will deleted 30 days after being expired - added : the response.txt data file used with grabexe will be deleted after being read -- (3.0.2.2) added : custom license handling - changed : default values of license update interval 1 day (was 14 days), hwupdate interval 1 hour (was 1 day) -- (3.0.2.1) added : the option to specify header value contenttype 'null' to overwrite the default value 'application/x-www-form-urlencode' - update : new tzdatabase based on tzdata2019c - -15/04/2020 -Version 3.0.2 beta (codebase 3.0.1.1) ---------------------------------------------------------------------------------------------- - 12/04/2020 3.0.2 beta prerelease (send to jose Rodriguez for evaluation) based on code 3.0.1.1 -- (3.0.1.1) fixed : license_option_enabled has wrong default value 'false' now 'true' (this caused disabling of license checks unless use of 'force') - changed : a new more relaxed version of hwid creation and matching - added : azure hwid data created with previous versions of hwid will be replaced by the new values - added : license 'h' (besides license 'f' for force) will force a hwid update in case of the hw_update status , e.g. >f,h for both - - Postprocess 2.11 - fixed : wrong seriesrun conditional in line 279 - -05/04/2020 -Version 3.0.1 beta (= codebase 3.0.0.25) ---------------------------------------------------------------------------------------------- -- (3.0.0.25) added : default security protocol setting Tls Tls11 Tls12 Tls13 and Ssl3 , which probably avoids using the site {securityprotcol=value} -- (3.0.0.24) added : security protcol setting of the http request/response by means of a sitei site {securityprotocol=value} setting -- (3.0.0.23) - - Postprocess 2.10 - fixed : bug in xmltv parsing of country - improved: in all html pages \n replaced by \r to allow easy regex matching - improved: block of operations in mdb that are already done on the same element value -23/03/2020 -Version 3.0.0 build 2 (= source code 3.0.0.22) --- ---------------------------------------------------------------------------------------------- -- (3.0.0.22) fixed : decryption key was erased due to a remaining test line - improved: license update on_off option, update is default off, was on - -21/03/2020 -Version 3.0.0 (= source code 3.0.0.21) ---> use obfuscar ---------------------------------------------------------------------------------------------- -- (3.0.0.21) fixed : subpage was not properly expanded in postdata in case method POST_BACK - fixed : crash when no decrypt key is present in config -- (3.0.0.20) added : license_on_off check enables to disable or enable license check for usersnames starting with certain chars - fixed : bug in config when no license or decrypt key element in config file - changed: benefit set when no or false password change to default (same as unregistered user) -- (3.0.0.19) fixed : the previous fix created a new error condition - added : in license a check of a license_on_off azure file to enable or disable license check - added : optional password handling for license - added : force license in config to override license update interval -- (3.0.0.18) fixed : a few rare conditions for which the headerlists returned errors or false values -- (3.0.0.17) changed: the option to use an executable external grabber uses a data file 'response.txt' as interface, replacing the console interface -- (3.0.0.16) fixed : and another error in new code for headerlists (3.0.0.13 - 14 - 15) - - - added : a dummy hot_cookies.txt file is created if loadcookie=hot_cookies.txt and that file doesn't exist yet -- (3.0.0.15) fixed : another error in new code for headerlists (3.0.0.13 - 14) -- (3.0.0.14) fixed : error in new code for headerlists (3.0.0.13) - fixed : crash when two headers with the same headername are specified, the last occuring will be kept (overwrite) -- (3.0.0.13) fixed : allocation of headersets without a headerlist crash because headerindex > number of headersets - added : 'channel' in url_index operations in postback expands to config_site_id - improved : creation of headerlist, new code in 'static private Dictionary HeaderSets(ChannelToUpdate chan , int page)' -- (3.0.0.12) fixed : the combination of subpage and postback - improved : headersets & headerlists for user in subpages and postback - added : in license : create a backup of a azure user file before saving the update - added : in license : use backup of azure user file if file is corrupt - added : option to specify and use multiple url_index with an operation, the index pages will be merged into one -- (3.0.0.11) fixed : a condition that the second request in postback has no headers specified - improved : use default http header values when siteini value is 'blank' -- (3.0.0.10) added : WG++ version update check and warning - fixed : headerset builder missing customheader name in header 2 and following - improved : in scope postback and in url_index.modify 'urldate' and 'subpage' are default expanded to 'urldate_formatted' and 'subpage_formatted' - fixed : a condition that a channel doesn't exist and grabbing with subpages created an exception -- (3.0.0.9) added : external grabengine option for html pages , specify url|exepath arg_1 .. arg_n} - added : new readonly elements urldate_formatted and subpage_formatted -- (3.0.0.8) fixed : a very rare condition that a show is added to the xmltv without a title -- added title="??" - completed : expansion of variables for the second url of POST_BACK with method sequence -- (3.0.0.7) added : option to specify the request method sequence for POST_BACK e.g. POST_BACK(POST,GET) - - Postprocess 2.09 REX - added : xmltv attributes can be added in to rex target elements -- (3.0.0.6) added : license benefit set value debug 'false' for 'donator_license' can be overruled by a debug attribute in the config logging element - fixed : exception logging blocked when unknown timezone or request for a list of all timezones in siteini - - Postprocess 2.09 REX - added : epg elements 'country', 'url', 'subtitles', 'premiere' and 'previously-shown' -- (3.0.0.5) added : benefit set value index_only effect -- (3.0.0.4) fixed : license accepted an email mismatch -- (3.0.0.3) added : all benefit value effects on options and performance except channels_siteini - added : windows & linux path for local license file -- (3.0.0.2) changed : statistic upload permanently disabled - added : license benefit set values effect imolemented for postprocess, decryption, debug, channels_total -- (3.0.0.1) added : license option (license.cs) - added : azure access dll - added : 'new' mode decryption in addition of the existing 'legacy' mode - -dd/MM/yyyy : not yet public -Version 2.1.12 ---> don't forget dotrefiner ---------------------------------------------------------------------------------------------- -- (2.1.11.3) fixed : argument 'alloc' in scrubstring caused the cleared the actual scrub values - fixed : auto channellist removed all leading * not just only the first -- (2.1.11.2) fixed : in new grabengine the option to specify a different url for the second request (POST) in case POST_BACK - optimized : header expansion of the postdata header of the second request in case of POST_BACK - added : the option to specify headersets for multi urlindex'es - changed : headersets are now specified with urlindex.headers {list|} also for subpages - : (subpage.headers {list|} remains possible for compatiblity) - added : the option to do channel list creation in POST_BACK - cleanup : a lot of code warnings -- (2.1.11.1) fixed : new grabengine missing postback boolean - fixed : incorrect error message "subpage headerlist value : must be an integer!!" with the default subpageheaderlist - -04/09/2019 -Version 2.1.11 ---> use dotrefiner ---------------------------------------------------------------------------------------------- -- (2.1.10.3) added : check and log of subpage headerlist values errors (only integers, no 0, not > number of headers sets) - added : default subpage headerlist {list|} which ignores all header sets except the first one - fixed : bug in url file mode , must start with // or file:// (was \\) -- (2.1.10.2) added : option to use a global element in a subpage.format {list|'global_element'} -- (2.1.10.1) new : grabengine overhaul, completely rewritten . - It solves the problem of save and reload of cookies, e.g. in method POST-BACK - new : temporary re-introduction of grabengine as sitedependant element - added : new grabengine supports 'Brotli' compressed stream decompression - fixed : method=POST wan not overwritten when later method with other value - fixed : if no headers specified , always take the defaults - -10/07/2019 -Version 2.1.10 ---> use dotrefiner ---------------------------------------------------------------------------------------------- -- (2.1.9.4) fixed : crash when no headers are specified - added : header-set log - - Postprocess 2.08 REX - fixed : operations max_char, max_words not properly implemented -- (2.1.9.3) fixed : crash when no subpage header list is specified - fixed : logging of exceptions shows meaningfull stacktrace -- (2.1.9.2) fixed : incorrect string composr for datetime calculations due to adding >> to input value (see 2.1.9.1) - added : different headers sets for subpages, (unfinished? -needs more testing) -- (2.1.9.1) fixed : converting to other timezone inverted the timespan used to correct the time - added : nesting of 'if' operation(s) within a 'loop' operation - added : nesting of 'loop' operation(s) as part of an 'if' operation - added : 'else' operation als part of 'if' - added : boolean operators & (and) | (or) ^ (xor) and ! (not) to be used in RPN style boolean preconditional expressions - added : 'if' operation to enable multiple scrubstrings under the same condition - fixed : operation calculate, added inputvalue>> to start of operation string if not there - fixed : removed logging of special operation of config_timespan_days - changed : all (5) projects of WG++ are targetted to .net 4.7.2 (prepared for possible move to .net core) - -11/04/2019 -Version V2.1.9 ---> use dotrefiner ---------------------------------------------------------------------------------------------- -- fixed the use of confuserEx caused crashes on the LINUX distro, .net 4.7 not fully supported -- added use of dotrefiner - -31/03/2019 -Version V2.1.8 ---> use confuser before distribution!!! ---------------------------------------------------------------------------------------------- -- (2.1.7.1) changed : timespan definitions and implementation --integers are minutes, decimals are hours - added : 'legacy' mode for timespan, if swminversion < 2.1.7.1 legacy mode - added : special timespan handling of 'config_timespan_days' , converts to days as default - fixed : regex pattern for encrypt message , handles the normal date variants - changed : decryption is based on new init vector, same as SiteIni_Encrypt - - Postprocess 2.07 REX - fixed : elements containing certain string values (used as placeholder for control chars) - were 'pruned' - added : in rex.config can contain a variable 'source_file' that will take the - value of the xmltv source file (without .xml) plus text elements: - e.g rex_'source_file'_1.xml - added : the option to do certain operations on the element value to expand e.g: - {Sunmary: 'description[cleanup(style=upper), max_chars=500]'}{\nActors: 'actor(, )'} - supported operation : cleanup with style and tags aruments, max_chars, max_words and max_sentences - - -14/03/2019 -Version V2.1.7 ---> possibly V3.0? (based on V2.1.5) ---------------------------------------------------------------------------------------------- -- (2.1.6.7) added : handles siteini encryption with expiry date set -- (2.1.6.6) improved: title match procedure removes any attributes added to the title value - fixed : method SOAP - fixed : method POST_BACK - update : decryption following SiteIni_Encrypt V1.2 rules (leaves site {..} lines unencrypted) - added : control elements from site{} line : episodesystem, subtitlestype and ratingsystem, these can be - expanded to its value by 'site_episodesystem' , 'site_subtitlestype' and 'site:ratingsystem' - added : siteini scrubstrings before site {} are blocked -- (2.1.6.5) improved: only first channel in config for a site that has a channellist request - will get the attribute update set to "c", the other get "" (none) -- (2.1.6.4) added : channellist creation through Version 2.1.6 (Unfinished, cannot be published, kept on hold! ) - | --------------------------------------------------------------------------------- - | - (2.1.5.6) added : method REST - | - (2.1.5.5) work in progress - | - (2.1.5.4) work in progress - | - (2.1.5.3) linux test evaluation version - | - (2.1.5.2) work in progress - | - (2.1.5.1) fixed : show.Programme.Titles.First() not expanded to its value - | - (2.1.5.1) fixed : bug in cleanup style=roman2arabicnumeral - | - Postprocess 2.0.6: - | - (2.1.5.6) added : method REST - | - (2.1.5.5) added : condition to prevent that unselected shows are procesed with - | allocation/presentation setting that erase them because missing mdb elements - | - (2.1.5.4) fixed : allocation/presentation for category - | - (2.1.5.2) added : all xmtv elements processed in update xmltv - | - (2.1.5.2) fixed : a few errors in evaluate content of rexconfig - | - (2.1.5.1) added : expand primarysearch headers for mdb_variable_element, x_title, x_subtitle - | and x_productiondate - | - (2.1.5.1) in progress : implement allocation /presentation to use attributes and attribute matching - | -28/09/2017 -Version V2.1.5 ---------------------------------------------------------------------------------------------- -- (2.1.4.1) fixed : index_title is selected if detail_title fails with no value -- (2.1.4.1) fixed : url_mdb_p7 and url_mdb_p8 were missing in ScrubOperations -- Postprocess 2.06: - - in progress : implementing the xmltv attributes , using the xmltv class - - fixed : matching with totals (St, Et and Pt) in xmltv episode-num failed - - optimized : scrub of the mdbepisodenumlist - - fixed : due to operations done several times in the various scopes - elements can get multiple duplicate values - -19/09/2017 -Version V2.1.4 ---------------------------------------------------------------------------------------------- -- (2.1.3.2) update : new tzdatabase based on tzdata2017b (again) -- (2.1.3.2) fixed : set(type=run) error in path composition in linux -- (2.1.3.1) fixed : previous elements were not properly implemented in class Times - -30/08/2017 -Version V2.1.3 ---------------------------------------------------------------------------------------------- -- (2.1.2.1) fixed : episode values having chars like - , : etc not matched with correct pattern -- (2.1.2.1) changed : upgrade to .NET Framework 4.7 - -26/08/2017 -Version V2.1.2 ---------------------------------------------------------------------------------------------- -- (2.1.1.3) improved : set(type=run) accepts absolute and relative executable file locations -- (2.1.1.3) fixed : global temp elements no longer overwritten with empty values in subsequent scopes -- (2.1.1.3) improved : xmltv attribute name and value extraction (no false names , value may contain ()) -- (2.1.1.3) fixed : incomplete debug logging for calculate format conversion operations -- (2.1.1.3) improved : set(type=run) looks for the exe to run in the siteini folders -- (2.1.1.2) fixed : country element without value no longer created if only lang attribute -- (2.1.1.1) improved : episode pattern matching values St, Et and Pt are now included in the evaluation -- (2.1.1.1) fixed : incorrect error logging episode pattern matching -- (2.1.1.1) fixed : incomplete debug logging for cleanup operations - -09/08/2017 -Version V2.1.1 ---------------------------------------------------------------------------------------------- -- (2.1.0.5) fixed : removed index_title from xmltv output if detail/subdetail_title available -- (2.1.0.4) fixed : bug in UrlsShow composition causing exception -- (2.1.0.3) added : preload url for showdetails + support for headers -- (2.1.0.2) fixed : bug in ParseElementAttributes() -- (2.1.0.2) improved : element/attribute composition of starrating , video and rating/icon -- (2.1.0.1) added : full support of xmltv attributes -- (2.1.0.1) improved : xmltv.dll -- (2.1.0.1) added : general site dependent parameter 'langoverrule' which value overrules the lang - component of cultureinfo as default lang attribute value. -- (2.1.0.1) added : log warning if siteini is in channelfile creation mode -- (2.1.0.1) added : log warning if siteini contains active debug arguments - -19/06/2017 -Version V2.1 ---------------------------------------------------------------------------------------------- -- Full version release, same source as V2.0.7 beta - -02/06/2017 -Version V2.0.7 ---------------------------------------------------------------------------------------------- -- (2.0.6.1) added : cleanup(style=roman2arabicnumeral) Converts roman numerals into arabic -- (2.0.6.2) Postprocess 2.05: - - fixed : starratingvotes was not properly implemented (missing as mdb value) -- (2.0.6.3) improved : start and stop time handling from mixed index and detail pages - -14/05/2017 -Version V2.0.6 ---------------------------------------------------------------------------------------------- -- added : the option to keep epg data for a number of past days, using the new - 3 9:30 is maintained) - example 3 -- fixed : config d , the path of the output xmltv file was not properly composed. - - -02/04/2017 -Version V2.0.5 ---------------------------------------------------------------------------------------------- -- update : new tzdatabase based on tzdata2017b -- added : element list only debugging mode : element.modify {(debug)} -- added : urldate type weekdayname longer than 7 days - -23/03/2017 -Version V2.0.4 ---------------------------------------------------------------------------------------------- -- fixed : exception during subdetailurlheader composition. - -17/03/2017 -Version V2.0.3 ---------------------------------------------------------------------------------------------- -- fixed : exception while grabbing robots data due to missing dummy headers (required since V2.0.2) -- Postprocess 2.04: - - added : log of output file written succesfully in MDB and REX - - added : log warnings of irregular mdb.config and rex.config allocation specifications - -06/03/2017 -Version V2.0.2 ----------------------------------------------------------------------------------------------- -- fixed : an exception occured with hour value 24 while parsing to a datetime -- added : header and element expansion support for preload url -- improved : console logging of c,r,g updates -- Postprocess 2.03: - - changed : headers in dictionary (needed because of preload headers) - - fixed : wrong error report when wrong mdinitype - -19/02/2017 -Version V2.0.1 ----------------------------------------------------------------------------------------------- -- fixed : fix global_temp_x.scrub -- fixed : fix global_temp_x.modify in datalogo - -12/02/2017 -Version V2.0 (same as Beta 1.57.1) ----------------------------------------------------------------------------------------------- -- update : new installer - -Old style installer -Run patchexe.bat 'as administrator' will update your (windows) WebGrab+Plus V1.1.1 to the latest build. -Linux users can use the included WebGrab+Plus.exe and xmltv.dll to replace it manually with the one in use. - -Beta 1.57.1 -- fixed : cleanup(style=htmlencodespecialchar) to encode the whole range and not only above char 160. -- improved : logging of episode pattern handling -- fixed : remove significance of spaces and uppercase in episode pattern handling -- added : bitwise calculations shift right and shift left, operators 'shiftr' and 'shiftl' resp -- added : base64decode output format : string (default) and decimal, specified in cleanup as (style=base64decode,dec) or (style=base64decode,decimal) -- update : new tzdatabase based on tzdata2016g -- update : new tzdatabase based on tzdata2016h -- update : new tzdatabase based on tzdata2016i -- fixed : incremental update process failed (always (c)) if indexstart was only determined by a modify - -03/08/2016 -Version V1.57.0 (same as Beta 56.29) ----------------------------------------------------------------------------------------------- - -Beta 56.29 -- update : update the V2 version schema -- fixed : when duration or stop without a date component is specified - the date of the next start- and stoptime is sometimes 1 day off -- improved : calculate(timezone=timezone_id) uses start or stop pattern when the element is any start or stop -- improved : error and warning logging of calculate(timezone=timezone_id) - -Beta 56.28 -- changed : date time calculation result uses the cultinfo from the siteini (not the currentculture) -- added : default episodesystem "onscreen" if episode pattern is used and no system defined in siteini -- update : new tzdatabase based on tzdata2016f -- fixed : extracting preconditionals when episide pattern has multiple patterns - -Beta 56.27 -- fixed : index_episode was processed while applying episode pattern to (detail-) or (subdetail_)episode -- fixed : error that rejected a episode pattern that matched the one element minimum requirement -- Postprocess 2.02: - - fixed : a movie show that was also selected and matched as serie will not be updated in the target xmltv - because it's already updated as serie - - fixed : a serie show in ldb will be ignored for a movie - - fixed : a movie match with the same showid as a serie in ldb will be saved as a separate entry - - improved : logging of select (re)added in logfile and console - -Beta 56.26 -- improved : datetime patterns in start and stop also supported for scrub and modify. -- added : episodenum pattern support in scrub and modify -- update : new tzdatabase based on tzdata2016e -- improved : description will remain empty if composed of multi empty elements (was a single .) -- Postprocess 2.01: - - added : attribute lang support for subtitle and mdb-subtitle in REX - - fixed : when both episode-title and episode-num are in mustmatch - the mustnum is decreased by 1 to allow matching if only one of the two is matched - -Beta 56.25 -- added : cleanup style htmlencodespecialchar and style htmldecodespecialchar -- improved : cleanup converts html character entities (like ä) to the actual char by default -- added : time pattern without date component -- fixed : calculate 'indexof' @ , small bug that removed the first and last char of the inputstring -- added : WG.common.xmltv containing (among others) episodenum class to validate and convert episodenum values. -- Postprocess 2.0: - - MDB part: - - added : scopes, 3 levels; primarysearch, match and getelements - - added : for series, mustmatch of episode-num implemented, allows series episode matching with episede numbers; - - added : two new elements : episodenumlist and episodetitlelist - that will contain all episodenums or episodetitles for the serie under inspection - - added : in mdb.config the element to describe the episodenumber format of the xmltv input. - - added : default settings for select and match in mdb.config - . added : MdbIniType in MdbIni to verify if a mdbini is of type "movie" or "serie" - -Beta 56.24 -- Postprocess 1.15: - - added : muti charset support (for primary search and mdbsite) - -Beta 56.23 -- fixed : time pattern for nextstart was not properly implemented -- fixed : in calculate, format=date,"formatstring", formatstring containing space was not properly implemented -- fixed : correct error handling on page download fail -- fixed : command select crashes if 'whathow' cannot be split in 'what' and 'how' -- fixed : Time pattern handling for nextstart fixed -- fixed : subpage calculations 64-bit -- fixed : channel update with ' in the channelId -- added : cleanup(style=base64decode), will decode a base64 encoded string -- added : calculate(format=chartodec), will a character to a decimal value (padding with 0's until 3 digits, ma.255). If the element is longer that 1 char, it will concatenate all converted chars into one long string. -- Postprocess 1.14: - - fixed : retry run with series mdbini's failed due to leftover mdb_episode_id from previous first run - - fixed : mdb run fails (no config settins available) - -Beta 56.22 -- update : new tzdatabase based on tzdata2016c -- fixed : escaped config entries are causing problems - -Beta 56.21 -- added : file:// now supports relative paths (relative from the siteini file) -- fix : combi-channel fails if update=incremental -- fix : a channel update value of "" means None and not Undefined -- update : new tzdatabase based on tzdata2016b - -Beta 56.20 -- fixed : failing incremental update on mode when xmltv_id contained a backslash - -Beta 56.19 -- fixed : empty resulted in no grabbing -- fixed : adding better logging when identical revisions were found in the siteini header - -Beta 56.18 -- fixed : broken incremental update -- fixed : same_as broken after new config implementation (channel grouping) -- added : extra config validation - -Beta 56.17 -- added : calculate(timezone=timezone_id) Converts a time into another timezone -- added : calculate(format=timespan,hours)|t1 t2 -} t1 and t2 times in decimal Unix, Java or ticks time format -- fixed : date calculation if stop from detail (next date more than 1 day later) - -Beta 56.16 -- removed : wget is no longer supported -- added : can now be a relative path (seen from the WebGrab++.config.xml file) -- added : channel grouping with -- changed : Searching for siteini's now in fixed locations, WGHome (commandline or default), subfolder siteini.user and siteini.user -- Postprocess 1.13: - - changed : Searching for mdbini's now in fixed locations, WGHome(commandline or default) subfolder MDB, subfolder siteini.user - and siteini.user - - added : & can now be a relative path (seen from the mdb.config.xml file) - - added : can now be a relative path (seen from the rex.config.xml file) - -Beta 56.15 -- update : new tzdatabase based on tzdata2016a -- Postprocess 1.12: - - fix : matchoptionals in series didn't work because the episode_id was not yet available - -Beta 56.14 -- fix : crash during removing overlapping shows -- fix : crash during cleanup(style=name) -- fix : timespan calculations with integer values - -Beta 56.12 -- fix : crash when no index_start or index_stop scrub was defined -- Postproces 1.11: - - mdb_title will also be scrubbed if not in mustmatch list - - Elementnames show_id and episode_id replaced by mdb_show_id and mdb_episode_id for mdbini's SWMinVersion below 56.12 - - improved unselect options (accepts tags) - - added mdb_temp_7 .. 9 - - allow loop {(each ..)} - - IMdbElements added -Beta 56.11 -- fix : bug introduced in 56.10 (invalid "time parsing error") -- improved : better recovery of guide data when error occurs during grabbing -Beta 56.10 -- fix : invalid "time parsing error" -- change : now modifies, should not change the number of multi elements - : just clear and remove(type=elements) should change that -- improved : MDB 'mustcontain' and 'unselect' -Beta 56.09 -- improved : total timings -- improved : datetime pattern, stoppattern doesn't default to startpattern anymore -- fix : wrong channel numbering during logging (+ refactor the code) -Beta 56.08 -- fix : global_ issues in datelogo and postdata scrubs -- added : xmltv time logging -- added : times logging after string to time converge -- change : in split titles to improve title matching -Beta 56.07 -- PostProcess V1.10: logging improved, XPath bug fixed, mdb_production date improved -- update : change some logging -- fix : in SelectNodes , PostProcess, Xpath. Added Utils XPathEscapeDoubleQuotes -- fix : in removeduplicates, keeplast -- fix : HTTP header Accept default value to */* -Beta 56.06 -- make cookie file reader more robust (now lines without expires are accepted) -- adding global_temp_1 -> global_temp_9 -- speedup slow StringBuilder parts -Beta 56.05 -- bug fixed: fixing failing siteini header parsing -Beta 56.04 -Beta 56.03 -- same as 56.02, but now correct binary file -Beta 56.02 -- bug fixed: file:\\ changed to the correct file:// URI. (local file failing on mono/linux) -Beta 56.01 -- bug fixed in times with pattern that mixed up month and day -- added , command sort, sorting by datetime, e.g. sort(descending,datetime) - -28/09/2015 -Version V1.1.1/55 (same as Beta 55.27) ------------------------------------------------------------------------------------------------- -From Beta 55.27 - - PostProcess V1.9: added mdb-category - - bug fixed: issue on Mono with PostProcess (MDB and REX) during removing of elements - - improved: Date/Time Pattern to take into account the sites Culture info -From Beta 55.26 - - added: xmltv elements url (= program url) and country - - added: argument pattern= to specify a non standard start and/or stop time result from scrub. - - bug fixed: problem with include and/or exclude arguments in scrub - - ProgramInfo: add initialization check - - Logger: don't log to file, if no file was set - - bug fixed: error on cleanup/keeplast, when no info is found - - added: static ProgramInfo class. Contains info (author, fullname, co-author, ...) - - move some common stuff to WG.Common - - adjust minor logging - - An interface can never have attributes on its properties. So declare them on the real classes - - fix manifest issues (after renaming) - - rename namespaces + move logger to its own namespace - - Move LogSpecial() out of Log class - - move RandomWord to Utils class - - adding ideabox.txt file - - change Logger into Log - - only set in one place, the log file path - - moving IElements and co, to a separate file - - adding temp_7,temp_8 and temp_9 (thanks IElements) ? - - make advantage of IElements where possible - - Solves times without start.scrub, accepts datetime string of syntax 'dateTtime' - - add comment to notify a "bug" -From Beta 55.25 - - changed: grouping elements (internal data structure) - - bug fixed: AddScope bug with index_showsplit inside an already existing scope -From Beta 55.24 - - bug fixed: subdetails got copied from previous show, when no subdetail page was grabbed -From Beta 55.23 - - bug fixed: wget correct lowercase function call (fails on linux) - - bug fixed: partial fix for | edit - - changed: clear tmp index page, because it is not collected by the GC (reduce memory footprint) - - changed: adding out of memory info during exception -From Beta 55.22 - - bug fixed: crash when no user-agent was defined (introduced in Beta 55.21) - - changed: try to reduce the memory footprint (especially with very large index pages) -From Beta 55.21 - - added: profiler (only for developers) - - changed: util class now fully static - - changed: logger also more static - - changed: Remove \r and \n from user-agent, because this is an invalid value on linux. - - changed: Use also the encoder type for reading directly from a file:\\ - - changed: only read the stream if it is not a redirect (speed up during redirections) -From Beta 55.20 - - changed: small fix bug (but important) -From Beta 55.19 - - changed: speedup unidecode - - changed: speedup title matching + fix memory bug -From Beta 55.18 - - bug fixed: crash on logger in WebGrab.Grab.FetchHtmlPage (introduced in 55.16) -From Beta 55.17 - - bug fixed: formatted date not always correct done (now invariant culture output) -From Beta 55.16 - - added: new logger instance - - changed: speedup splitindex parsing - - changed: MDB fix crash on invalid ID - - changed: made productiondate detection more robust - - changed: some other minor fixes -From Beta 55.15 (first build from repo) - - bug fixed: "!?!?!" should be also "!??!" - - bug fixed: "!??!" replaced with "|" during output now -From Beta 55.14 - - PostProcess - - bug fixed: allows one letter subtitles in MDB -From Beta 55.13 - - added : command set: element.modify {set(opt args)|expression_1} - will set element to the value of expression_1 irrespective of the current value of element - - bug fixed: the date of the next start was not properly determined - - added : numeric datetimes values (e.g UNIX and Ticks) in start and stop are now supported - - added : the datetimeformat in calculate format=time,datetimeformat accept a space if entered between "" , like format=time,"yyyy/MM/dd HH:mm" - - bug fixed: headers for urlshow was identical to those for urlsubdetail. -From Beta 55.12 - - improved: loading cookies into the htpp request rejects non valid cookies -From Beta 55.11 - - bug fixed: logging of shows added in case of times from showdetail page was inaccurate - - changed : scope splitindex allows operations with the absence of index_showsplit.modify - - changed : index_showsplit.modify gets scope=splitindex automatically - - changed : de base date for urldate.format changed to site date (was computer date) - - added : error handling and logging of cultureinfo entry in siteini - - bug fixed: stop time with date component not always properly implemented - - bug fixed: unit test firstshow failed - - bug fixed: basic unittest stop time not properly saved - - first evaluation version with the new 'times' class - - details of this class: - -- allows a date component in start and stop - -- possible time input combinations: - start only - start with date only - start and stop - start with date and stop - start and date both with date - start and duration - start with date and duration - all the combinations above from the detail show - (these 'mode' have reduced functionality elsewhere, no incremental grabbing and no 'oneshow-only' debugging) - date from index_page with all the combinations above without date component - start from index show (with or without date) and stop from detail show - start from index show (with or without date) and duration from detail show - -- allows duration in minutes besides the HH:mm - -- allows duration in dd:HH:mm (recommended, enables > 24h) - -- improved globalisation of datetime formats - -- automatic timeoverlap detection and correction - - improved: the addition of 55.11.2 now also works if the an error occurred during grabbing - - added : if the index_page fails to grab the existing xmltv data will be restored and the update process will be interrupted. - - changed : the bug fixed in beta 55.7 that corrected the error that shows were blocked that happened on the day before of the user timezone - into shows being blocked that are actually already past, is now changed that all shows are blocked that took place on the day before the actual day in the tvguide timezone. - - added : logging of the .net version and the mono version -From Beta 55.10 - - MDB/REX postprocess V1.8 - - bug fixed: in REX : runtime error if description end with () - - improved : in REX : expand logged a warning if the input string is "" - from Eval 55.10.2 - - bug fixed: introduced through the changes made in 5.10.1 in scrub type url composing the headstring and the scrubresult - from Eval 55.10.1 - - improved: scrub results for empty values , for single, multi and regex, are properly passed. -From Beta 55.9 - - MDB postprocess V 1.7 - - improved : new matching algoritme for serie location in the local DB. Now finds the best matching serie episode rather than - the first one that passes the matching criteria. -From Beta 55.8 - - bug fixed: update mode in XmlSource was implemented on basis of local times instead of guide-site times -From Beta 55.7 - - improved : statistics upload error handling when webgrabplus.com is unavailable. - - bug fixed: shows were blocked that have showtimes before local time instead of before guide-site time - - MDB postprocess V 1.6 - - added: log and console warning if a match cannot be added to the local mdb file because of a conflicting show -From Beta 55.6 - - bug fixed: the 'improvement' in calculate in 55.3 causes errors. Reverted -From Beta 55.5 - - bug fixed: the combination of certain escape values resulted in a mix up -From Beta 55.4 - - bug fixed: in method POSTBACK VIEWSTATE value was kept in header postdata for subsequent channels -From Beta 55.3 - - improved : calculate returns "" if input is "" - - bug fixed: sort called for the wrong 'getelement' variant - - bug fixed: introduced with beta 55.1, spaces in some preconditionals where removed -From Beta 55.2 - - added : for operation 'select' the operator can be negated with the addition 'not' in front of it -From Beta 55.1 - - added : argument keeplast or keepfirst (default) in cleanup removeduplicates - -07/08/2014 -Version V1.1.1/54 (= assembly version 1.1.1.5407 = evaluation version 1.54.07) --------------------------------------------------------------------------------------------------------- - - bug fixed: when the config calls a non existend siteini loading empty.ini was not properly implemented - - bug fixed: argument value 'minimum=' was not properly implemented in MDBpostprocessor - - update : new tzdatabase based on tzdata2014e - - changed : default max value in each loop is length source element with a limit of 10000 - - improved : unmatched timezone now logs al timezones sorted with coming DST date - - added : timezone query , (add ? to timezone name in ini), lists timezone details in log file - - bug fixed: not fully working debug switch in loops - - bug fixed: index_variable_element in each loop didn't work - - improved : parsing and error handling maxdays -From Evaluatie V1.1.1.54.4.1 - - bug fixed: replace type regex did not accept #### as new string (that was internally used) -From Evaluatie V1.1.1.54.3.7 - - improved : logging and error handling loops -From Evaluatie V1.1.1.54.3.6 - - added : 'foreach' loop first implementatie - e.g loop {(debug each 'index_temp_6' in 'index_actor' max=15)|end} -From Evaluatie V1.1.1.54.3.5 - - changed : loop condition is now executed as real precondition, condition false -- loop not executed - - improved : loop debug logging -From Evaluatie V1.1.1.54.3.4 - - added : config mode switch ~ , as in #~ to switch off the 3 seconds wait at the end of a run -From Evaluatie V1.1.1.54.3.3 - - added : forgotten arguments for command sort (descending ascending string integer) added to argument and preconditional ectraction -From Evaluatie V1.1.1.54.3.2 - - bug fixed: error in the new argument extraction corrected - - improved : MinSWversion check syntax check -From Evaluatie V1.1.1.54.3.1 - - bug fixed: the order of the arguments in an operation created problems when the preconditional was not the first after debug - - improved : the overall internal extraction of preconditionals and other arguments in operations - - bug fixed: small typo in log "pdate" changed in "update" - - bug fixed: datetime globalization error in // indexpage overlaps ? (date MM/dd/yyyy cannot parse in dd/MM/yyyy) - - bug fixed: preconditionals ~~ and == were not properly implemented - - Postprocess V1.5 - - added url headers -From Evaluation 1.54.2.1 - - bug fixed: a conditional string between [] is considered a wildcard even if it is no * or ? - - bug fixed: request header host cannot be empty, condition added - - added : loadcookie=cookiefilename,domain domain=* will disable domain filter - - bug fixed: request header referer was not used in method GET - - added : request header host - -26/05/2014 -Version V1.1.1/53 (= assembly version 1.1.1.5317 = evaluation version 1.53.17) --------------------------------------------------------------------------------------------------------- -From Beta 53.17 - - added : the default timezone=UTC+00:00 or WET - - improved : cookie syntax testing now done only for relevant cookies - - improved : the config credential were not expanded in the headers - - bug fixed: lang attribute for titleoriginal was not properly passed to xmltv in case of index_titleoriginal and subdetail_titleoriginal - - added : the option to grab multiple subdetail pages - - improved : loadcookie (accepts empty cookie values plus generally more robust due to syntax checking) - - improved : firstshow=now skips all shows before fist dayjump as intended - - improved : shows that are fully scheduled in the dst transitions period are skipped - - changed : title check actual index_title with (detail_)title now uses titlematchlev , (previously just a simple trim and lowercase) - - changed : allow a space at the the beginning of a valid siteini line - - added : in class TimeZones Dst cutoverDates DateTime.Kind handling - - added : TimeZones classes IsDst and InTransition - - fixed : TimeZones classes GetCutoverWindows, GetOffsets, ConvertToLocal and ConvertToUtc for the Dst cutoverDates DateTime.Kind parameter - - added : Dst Transition period handling for transitions from standard to dst - - removed : all debug additions from 1.53.15.13 - - added : embedded tzdata handling - - added : tzdata is accepted from a single file, or if single file not exist a tzdata folder or - if tzdata folder not exist the embedded tzdata - - debug : the timezones classes used are listed in the logfile to trace the linux error - - bug fixed: error in converttolocal in timezones.cs (double adding of the offset) - - changed : forward looking dst addapted to the timezones classes - - changed : converttotime in utils is now independent from the system timezone - - added : more logging of the tz addition - - changed : location of the tzdata to the .exe loaction - - added : error logging , try catch in the TimeZones constructor to locate the Linux failure. - - added : tzdata base, must be located in homefolder/tzdata - - added : the timezone in the siteini will accept timezone names from a tzdata base. - consequently the dst changes reflect the changes at the transmitter side - - changed : logging and console text more standardised, mostly lower case - - added : debug.n, n specifies the show index number in the indexshowslit result. Limits the debug logging to show[n] only. - - bug fixed: xmltv_id and channelname accept " in value - - added : xmltv_id and channelname values cannot contain both ' and " during channelfile creation, then " is replaced by . - PostProcess version 1.4 - - improved : A channel excluded from MDB processing will now get the REX presentation update - - bug fixed: cleanup style=name fails when last char is a space - - added : Statistic upload to the site: # in mode of config to disable, ## to test it - - bug fixed: regex in substring, replace and remove with {} in it were interpreted as scrubstrings - - bug fixed: headers were only expanded once , therefore subsequent shows got the same headers. This of course is a problem when the headers contains variables. - - bug fixed: error if all channels from a site in the config have an empty update argument. This error was introduced with the new config class in 53.13.2 - - bug fixed: urlshow.header postdata was not properly parsed - - improved : speed of the auto siteini locator -From Beta 53.15 - - bug fixed: cookie expiration correction didn't work properly after 53.14.3 -From Evaluatie 1.53.14.3 - - changed : read cookie ignores non standard 'undefined' added by the FireBug cookie exporter. -From Evaluatie 1.53.14.2 - - bug fixed: auto siteini file locator didn't work properly with revision 0 of a siteini -From Evaluatie 1.53.14.1 - - added : auto siteini file locator -From Beta 53.14 - - bug fixed: in REX missing element icon - - bug fixed: in REX missing instance of mdbscrub -From Evaluatie 1.53.13.5 - - added : HttpWebrequestHeader expect experiment: - specify as url_index.headers {expect=100-continue=false} or - url_index.headers {expect=100-continue=true} or - url_index.headers {expect=100-continue} (also true) -From Evaluatie 1.53.13.4 - - bug fixed: update mode for all channels was not properly implemented -From Evaluatie 1.53.13.3 - - improved : warning when credentials are not in the config - - added : icon -From Evaluatie 1.53.13.2 - - updated : new config class based on xml classes rather then datatables - - added : config element 127 into the html char sequence for it -From Beta 53.1 - - changed - - added : the mdb postprocessor is now able to extract series details - - improved : xmltv attributes handling - - improved : allocation handling - - added : xmltv target elements icon and episode-num for the mdb postproceesor - - added : in mdbpostprocessor a extra grab layer for the series details - - added : in mdbposrprocessor two extra urls (p7 and p8) - - added : in mdbpostprocessor expand of episode_id - - improved : operation select more robust - -10/11/2013 -Version 1.1.1/52 --------------------------------------------------------------------------------------------------------- -- changed : the index_variable_element is saved and kept throughout any following scrub and operation untill updated -- added : cleanup(style=regex) adds all escapes to regex meta chars -- added : regex in scrub accepts 'index_variable_element' as component -- bug fixed: the bug fixed :remove and replace accepts 'real' \ characters specified as \\ was not properly implemented -- bug fixed: index_duration was not properly formatted to the culture info used inside the program -- added : log of OsVersion -- bug fixed: Mono runtime error wrt XPathstring containing / -- bug fixed: httpwebresponse was not closed -- changed : httpwebrequest header accept-encoding= "gzip, deflate" is no longer default -- improved : timespan calcuations -- bug fixed: regex scrub accepts a \| as a 'real' | -- added : remove and replace accepts 'real' \ characters specified as \\ -- improved : unicode character sequence in cleanup handles also \\n, \\r and \\t -- added : default default httpwebrequest headers accept-encoding, pargma and cache-control -- added : timespan calculation -- bug fixed: trimmed regex scrub elements from leading and trailing | -- added : support for SOAP web services (required for Schedules Direct EPG service) -- bug fixed: the captures in regex scrub were not added together. -- added : url header credentials -- improved : urlshow and urlsubdetail will be empty "" if the grab part doesn't return a value -- added : grab a local file in the indexpage with url_index {url|\\computername\path\filename} -- added : servicepoint experiments in grab -- added : cleanup arguments type=urlencode en urldecode -- bug fixed: Regex scrub was not enabled for single value scrubstring element like title -- improved : Regex Operations remove and replace using index and length of the relevant match -- added : httpwebrequest method POST_BACK for url_index -- added : suppages in channellist creation -- added : index_variable_element accepts 'config_timespan_days' -- added : url header 'customheader' -- added : the max value in a loop may contain an element name - -04/08/2013 -Version V1.1.1/51 --------------------------------------------------------------------------------------------------------- -- added : url header 'accept' -- bug fixed: some conditional arguments were disabled by the automatic addition of the scope -- bug fixed: datenumber urldate was not properly calculated (timezone problem) -- changed : support for half hour timezone -- changed : forward looking dst mode is now default. To switch back to old style mode=f -- bug fixed: in setting the scope.range when the first ( char occurs without a | char. (As in cleanup tags) -- bug fixed: in GetInsertMode when only one channel and a show needs to be inserted before the none existing second channel -- added (experimental) : Regex Operations and Regex scrub - -10/06/2013 -Version V1.1.1/50 --------------------------------------------------------------------------------------------------------- -- improved : robots exclusion handling, now following the 'Cosa Brazil' agreements. -- added : site {allowlastdayoverflow} allows the last day to overflow into the next morning. -- bug fixed: in setting the scope.range when the first ( char occurs after the | char. -- bug fixed: cookie expires value calculation crashes when expires value > max datetime value (9999 31/12 23.59.59) -- added : bitwise calculations 'and' 'or' 'xor' and 'not' -- bug fixed: In MDB postprocess runtime error if no ldb path is specified -- added : in urldate format datenumber, the offset can now be specified in decimal hours 5.5 or timespan 5:30 -- bug fixed: in titlematch that forced an unnecessary update if the title ends with a number -- bug fixed: error in postdata extraction if no subpagelist is listed in the siteini -- MDB & REX: xmltv elements videoaspect, videoquality, presenter, writer, producer, composer and commentator added - as elements that can be removed from the xmltv file -- MDB & REX: added xmltv elements videoaspect and videoquality as source element -- bug fixed: endless loop in scrub.result() -- bug fixed: that was introduced in /49 which disabled channel file creation -- bug fixed: in showicon .modify that was handled as .scrub -- added : minSWversion check of siteini -- changed : console heading -- solved : cookie expiry with a decimal point as in chrome cookie export - -15/04/2013 -Version V1.1.1/49 --------------------------------------------------------------------------------------------------------- -- added: postdata accepts 'subpage' as value to expand. This enables subpages defined by postdata. -- added: subpage list accepts 'index_variable_element' as value to expand -- added: new feature sort, enables to sort multi value elements for a part of its value -- credits and channel elements in xmltv follow the xmltv standard -- bug fixed : forward looking dst switch didn't work properly for the 'spring' switch. -- added: new option in operations with indices, operators: start (optional)length/(optional)repeat - works for commands substring, remove and replace. -- url subpage list builder with variable - subpage.format {list(step=21600 count=3)|'index_variable_element'} -- bug fixed in calculate: syntax like : element.modify {calculate(format=date,unix)} - -10/03/2013 -Version V1.1.1/48 --------------------------------------------------------------------------------------------------------- -- changed : xpath selection strings that handles char ' correctly -- improved : xpath selection string with better efficiency -- bug fixed : in subpage introduced in build 46 -- Updated Postprocessor constructor. Included controlled errorhandling in case of missing mdb and rex folder and config files. - -24/02/2013 -Version V1.1.1/47 --------------------------------------------------------------------------------------------------------- -- bug fixed : the cleanup(tags= ) introduced in 1.1.1/46 crashed in the postprocessor - -23/02/2013 -Version V1.1.1/46 --------------------------------------------------------------------------------------------------------- -- bug fixed : order of xmltv elements in outputfile conform xmltv specification -- added : {cleanup(removeduplicates=type, matchingquality link="elementname""elementname")} -- bug fixed : added missing < an > as word separator char in extractproductiondate -- added : {cleanup(tags="string1""string2)} , removes the string between string1 and string2 including these -- added : switched to titlematchlev() in postprocess for subtitlematch -- loadcookie : cookies with a 'zero' expiry are now passed to the output cookie file - -11/02/2013 -Version V1.1.1/45 --------------------------------------------------------------------------------------------------------- -- added command select in operations -- fixed small bug in loop end counter -- major update of the MDB postprocessor to allow series grabbing in thetvdb.com and the series in IMDb.com -- added alloc attribute for index_site_id and index_site_channel to specify the target xml element in the channel file - -19/01/2013 -Version V1.1.1/44 --------------------------------------------------------------------------------------------------------- -- MDB postprocessor replace | in the grabbed pages in !?!?! -- fixed small bug in addscope - -09/01/2013 -Version V1.1.1/43 --------------------------------------------------------------------------------------------------------- -- added in MDB postprocessor the possibility to add the mdb-showid to the xmltv output - -04/01/2013 -Version V1.1.1/42 --------------------------------------------------------------------------------------------------------- -- added explicit SSL support in the default grabengine (https and ftps). Needed for LINUX. -- improved WGet grabengine, without the need for wget.bat, SSL support through --no-check-certificate - -02/01/2013 -Version V1.1.1/41 --------------------------------------------------------------------------------------------------------- -- removed bug, introduced in V1.1.1/39, in grab of subdetail page if from index_urlsubdetail - -30/12/2012 -Version V1.1.1/40 --------------------------------------------------------------------------------------------------------- -- header contenttype implemented for method Get -- changed the replacement of the char | in the html page from !??! in !?!?! - (!??! is also used as escape char for | , this replaces it back to | in operations) - -17/12/2012 -Version V1.1.1/39 --------------------------------------------------------------------------------------------------------- -- Added the possibility to scrub urlsubdetail from the detail page and grab this subdetail page -- Added an automatic xmltv repair for corrupted input files - -30/11/2012 -Version V1.1.1/38 --------------------------------------------------------------------------------------------------------- -- Change in site argument value in the header of the channel-list file. -Now equal to the url value of the general site dependant data of the siteini. - -30/11/2012 -Version V1.1.1/37 --------------------------------------------------------------------------------------------------------- -- added element index_titleoriginal -- added ftp file download - -26/11/2012 -version V1.1.1/36 --------------------------------------------------------------------------------------------------------- -- improved nextday handling when stoptime is scrubbed - -23/11/2012 -version V1.1.1/35 --------------------------------------------------------------------------------------------------------- -- do not use build 1.1.1/34 !! -- removed stupid error in urlbuilder in V1.1.1/34 - -23/11/2012 -version V1.1.1/34 --------------------------------------------------------------------------------------------------------- -- added expand for index_urlsubdetail -- remove bug in composition of the description - -11/11/2012 -version V1.1.1/33 --------------------------------------------------------------------------------------------------------- -- improved escape handling in calculate @ and # - -10/11/2012 -version V1.1.1/32 --------------------------------------------------------------------------------------------------------- -- removed bug in nextday jump when a show is already determined as invalid - -06/11/2012 -version V1.1.1/31 --------------------------------------------------------------------------------------------------------- -- improved loadcookie handling: -- ignores session cookie -- channel update canceled if loadcookie fails - -01/11/2012 -version V1.1.1/30 --------------------------------------------------------------------------------------------------------- -- corrected bug in path of home folder when entered as command line parameter - -20/10/2012 -version V1.1.1/29 --------------------------------------------------------------------------------------------------------- -- spaces and tabs allowed in urldate and subpage - -19/10/2012 -version V1.1.1/28 --------------------------------------------------------------------------------------------------------- -- removed bug xmltv output of composer and commenter node - -18/10/2012 -version V1.1.1/27 --------------------------------------------------------------------------------------------------------- -- added cleanup(removeduplicates=type,matchfactor) type: equal, name, title matchfactor: 0 to 100 -- added element commentator : all prefixes, multi xmltv -- improved cleanup(style=name) - -10/10/2012 -This version V1.1.1/26 --------------------------------------------------------------------------------------------------------- -- forward looking dst change optional, has own f in config -- added site attribute compression , possible values gzip and deflate, to decompress compressed webpages - -06/10/2012 -This version V1.1.1/25 --------------------------------------------------------------------------------------------------------- -- small bug fixed in composition of element description - -05/10/2012 -This version V1.1.1/24 --------------------------------------------------------------------------------------------------------- -Adds : -- wild cards in conditional expressions , like "ab[*]ef" and "ab[?]ef" -- 'daylight time saving' changes now looks ahead -- chars " and ' in calculate count # and index-of @, must be entered as \" and \' - -26/09/2012 -This version V1.1.1/23 --------------------------------------------------------------------------------------------------------- -Adds : -- stop or duration can also be scrubbed from the show detail page -- site control 'nopageoverlap' indicates that the site doesn't list overlapping shows on subsequent index pages (disables auto removal) -- site control 'skip' as in config file, overrules the setting of the config -- some minor bug fixing \ No newline at end of file diff --git a/bin/epg-grabber/index.js b/bin/epg-grabber/index.js new file mode 100755 index 00000000..d1a4ba70 --- /dev/null +++ b/bin/epg-grabber/index.js @@ -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 ', 'Path to config.xml file', './config.xml') + .option('-s, --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() diff --git a/bin/epg-grabber/utils.js b/bin/epg-grabber/utils.js new file mode 100644 index 00000000..c31e8d17 --- /dev/null +++ b/bin/epg-grabber/utils.js @@ -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 = `` + + for (let channel of channels) { + output += ` + + ${channel.name} +` + } + + for (let program of programs) { + const start = dayjs(program.start).format('YYYYMMDDHHmmss ZZ') + const stop = dayjs(program.stop).format('YYYYMMDDHHmmss ZZ') + + output += ` + + ${program.title}` + + if (program.category) { + output += `${program.category}` + } + + output += `` + } + + output += '' + + 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 diff --git a/config/en/WebGrab++.config.xml b/config/en/config.xml similarity index 100% rename from config/en/WebGrab++.config.xml rename to config/en/config.xml diff --git a/config/en/rex/rex.config.xml b/config/en/rex/rex.config.xml deleted file mode 100755 index d8bbf072..00000000 --- a/config/en/rex/rex.config.xml +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - - - guide.xml - - - 'description'\n'actor' - The result is the existing 'description', followed by, on a newline, the actor(s) separated by the standard WG++ element separator |. - The result: - This is the original description. - Michael Douglas|Kim Basinger - - You probably don't like the | as separator between the actors, so you specify another separator like this: - 'description'\n'actor(, )' - The result: - This is the original description. - Michael Douglas, Kim Basinger - - You can make this prettier by adding some text to the actors addition: - 'description'\nActors: 'actor(, )'. - The result: - This is the original description. - Actors: Michael Douglas, Kim Basinger. - - A small problem: Suppose the source xmltv show doesn't have any actors, then the result would be not so pretty: - This is the original description. - Actors: . - - To avoid that, the added text can be linked to the element it must be added to, like this: - 'description'{\nActors: 'actor(, )'.} - Result with actors: - This is the original description. - Actors: Michael Douglas, Kim Basinger. - And without actors: - This is the original description. - - An example with some more elements: - 'description'{\n\tYear of production: 'productiondate'.}{\n\tProducer: 'producer(, )'.}{\n\tActors: 'actor(, )'.} - Result: - This is the original description. - Year of production: 2002. - Producer: Steven Spielberg. - Actors: Michael Douglas, Kim Basinger. - - And another one: - {Episode: 'episode'\t}'subtitle' - Result: - Episode: 3.2/12.1 The original subtitle - - You can also remove elements (but not the title!) from the xmltv listing by specifying an empty element, like this: - or simply - This will remove all elements - And this: - - Will remove the element, including all its child elements like , 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. - {Summary: 'description[cleanup(style=upper), max_chars=500]'}{\nActors: 'actor(, )'} - 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): - 'description'{\n\tYear of production: 'productiondate',}{ Rating: 'rating/a+'.}{\n\tProducer: 'producer(, )'.}{\n\tActors: 'actor/a+(, )'.} - - Result: - 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). - -Summary of Content/Values: -1. Syntax -content - - 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 ) - - 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> \ No newline at end of file diff --git a/config/ru/WebGrab++.config.xml b/config/ru/WebGrab++.config.xml deleted file mode 100755 index 2f1f3fa8..00000000 --- a/config/ru/WebGrab++.config.xml +++ /dev/null @@ -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> diff --git a/config/ru/config.xml b/config/ru/config.xml new file mode 100755 index 00000000..cf14b70a --- /dev/null +++ b/config/ru/config.xml @@ -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 & FunBox HD">Fast & 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> diff --git a/config/ru/rex/rex.config.xml b/config/ru/rex/rex.config.xml deleted file mode 100755 index d8bbf072..00000000 --- a/config/ru/rex/rex.config.xml +++ /dev/null @@ -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> \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..f8c87484 --- /dev/null +++ b/package-lock.json @@ -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" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..fab9e0e5 --- /dev/null +++ b/package.json @@ -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" + } +}