summaryrefslogtreecommitdiff
path: root/Tools/epg2timers/epg2timers.cxx
diff options
context:
space:
mode:
authorKlaus Schmidinger <kls (at) cadsoft (dot) de>2001-09-16 18:00:00 +0200
committerKlaus Schmidinger <kls (at) cadsoft (dot) de>2001-09-16 18:00:00 +0200
commit156831036e9b0fcbfc719033cc89e08c1985cad6 (patch)
treedede3254f8982f36fe40a11f7ce333b13f2297d6 /Tools/epg2timers/epg2timers.cxx
parentbb18b9e0b449afff418f010c1b2e255acd3fbad3 (diff)
downloadvdr-patch-lnbsharing-156831036e9b0fcbfc719033cc89e08c1985cad6.tar.gz
vdr-patch-lnbsharing-156831036e9b0fcbfc719033cc89e08c1985cad6.tar.bz2
Version 0.95vdr-0.95
- Fixed behaviour in case the shutdown didn't take place (there were many "next timer event at..." messages in that case). - Reduced the default value for MinEventTimeout to 30 minutes. - Fixed detecting manual start in shutdown feature. - An error message is now displayed in case the Transfer Mode can't be started because the necessary DVB card is currently recording (or there is no DVB card that can access this channel). - Fixed toggling channels with the '0' key in case the "Ok" button has been pressed to display the current/next information. - Pressing the "Power" key now always initiates the shutdown sequence (after user confirmation in case of a recording timer), event if there is currently a menu or a replay session active. Note the additional remarks in INSTALL regarding the values of the two parameters given to the shutdown program in case of a currently recording timer. - Switching through channel groups with the "Left" and "Right" keys now always starts at the group that contains the current channel. - Implemented "Multi Speed Mode" (thanks to Stefan Huelswitt). - Implemented backtracing to hit the right spot after fast forward/rewind (thanks to Stefan Huelswitt). - Implemented replay mode display (thanks to Stefan Huelswitt, with a few rewrites by kls). - Changed the size of all input buffers used to parse config files or receive SVDRP commands to the same value of 10KB. This allows long strings to be used in the 'summary' field of a timer, for instance. - The pipe to the Dolby Digital replay command (option '-a') now closes all unused file descriptors in the child process to avoid crashing when the OSD is used (thanks to Andreas Vitting). - Switched to the driver's new tuning API (VDR now requires a driver version dated 2001-09-14 or higher). - Changed obsolete macro VIDEO_WINDOW_CHROMAKEY to VID_TYPE_CHROMAKEY (thanks to Guido Fiala). - New version of the "Master-Timer" tool (thanks to Matthias Schniedermeyer). - Better error handling when writing configuration files. - Fixed putting the final editing mark into the edited version's marks file. - Fixed manipulating an editing mark at the very end of a recording. - Fixed starting a new replay immediately after stopping a previous one (had caused a mix between live video and replay). - Three new keys ("Volume+", Volume-" and "Mute") to control the DVB card's audio output volume. - New version of the 'epg2timers' tool (thanks to Carsten Koch).
Diffstat (limited to 'Tools/epg2timers/epg2timers.cxx')
-rw-r--r--Tools/epg2timers/epg2timers.cxx578
1 files changed, 483 insertions, 95 deletions
diff --git a/Tools/epg2timers/epg2timers.cxx b/Tools/epg2timers/epg2timers.cxx
index 07e8182..94e1c8a 100644
--- a/Tools/epg2timers/epg2timers.cxx
+++ b/Tools/epg2timers/epg2timers.cxx
@@ -1,13 +1,13 @@
/*
- * epg2timers.cxx: Convert an EPG "merkliste" page (http://www.tvtv.de) to a timers.conf
- * file for Klaus Schmidinger's vdr (http://www.cadsoft.de/people/kls/vdr).
+ * epg2timers.cxx: Convert an EPG "merkliste" HTML page (http://tvtv.de)
+ * to timers.conf format for Klaus Schmidinger's vdr
+ * (http://www.cadsoft.de/people/kls/vdr).
*
- * Copyright (C) 2000 Carsten Koch
+ * Copyright (C) 2000, 2001 Carsten Koch
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
+ * version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -23,65 +23,349 @@
*/
+#include <malloc.h>
#include <stdio.h>
#include <string.h>
+#include <unistd.h>
+// User-configurable options.
-static const char date_line[] = "\t<td align=center valign=middle colspan=3><span id=fb-b10>";
-static const char start_time_line[] = " \t\t<td bgcolor=\"#7f98bf\" align=center><span id=\"fb-w14\"><nobr>&nbsp;";
-static const char stop_time_line[] = "\t\t\t<tr><td bgcolor=\"#002b64\" align=center><span id=\"fn-w9\">bis ";
-static const char channel_line[] = "\t\t\t<tr><td bgcolor=\"#002b64\" align=center><span id=\"fb-w9\">";
-static const char title_line[] = "\t\t\t\t<td bgcolor=\"#002b64\" align=left width=100%><span id=\"fb-w10\">";
-static const char summary_line[] = "\t\t\t<table border=0 cellpadding=10 cellspacing=0 bgcolor=\"white\" width=100%>";
-static const char * const channel_names[] =
+static const int stop_time_safety_margin = 10; // add 10 minutes to stop time in case start was delayed
+static const int recording_priority = 50; // vdr recording priority setting for all timer entries generated
+static const int recording_lifetime = 98; // vdr recording life time setting for all timer entries generated
+
+
+// Usually, you should not want to change any of these.
+
+static const int max_title = 256; // maximum length+1 of title file name generated
+static const int max_genre = 32; // maximum length+1 of genre text parsed
+static const int max_line = 1024; // line buffer (not used when parsing summary text)
+static const int max_summary = 9000; // Summary can be up to 9000 bytes long (a bit shorter than vdr's SVDRP command buffer)
+static const int max_vdr_channel = 1000; // maximum size+1 of your channels.conf
+
+// The following table maps http://tvtv.de channel names into Astra 19.2E PIDs.
+// It is incomplete. Contributions welcome.
+
+typedef struct
{
-"3sat",
-"ARTE",
-"*B1 Berlin",
-"BR3",
-"Bloomberg TV",
-"BR Alpha",
-"CNN",
-"ARD",
-"*DW-tv",
-"Eins Extra",
-"Eins Festival",
-"Eins MuXx",
-"euroNEWS",
-"HR3",
-"Kabel1",
-"Kinderkanal",
-"MDR",
-"MTV",
-"NDR",
-"NTV",
-"ORB",
-"*ORF1",
-"Phoenix",
-"PRO7",
-"RTL",
-"RTL2",
-"SAT1",
-"skynews",
-"SWF",
-"Super RTL",
-"TM3",
-"TW1",
-"VOX",
-"WDR",
-"Theaterkanal",
-"ZDF",
-"ZDF.doku",
-"ZDF.info",
-""
+ const char * tvtv_name;
+ unsigned short pnr;
+} map_entry;
+
+
+static const map_entry channel_map[] =
+{
+ // Deutschsprachig
+ {"13th Street", 42},
+ {"3sat", 28007},
+ {"ARTE", 28109},
+ {"B1", 28206},
+ {"BR3", 28107},
+ {"BR-alpha", 28112},
+ {"ARD", 28106},
+ {"Discovery", 14},
+ {"Disney Channel", 34},
+ {"Eins Extra", 28201},
+ {"Eins Festival", 28202},
+ {"Eins MuXx", 28203},
+ {"Filmpalast", 516},
+ {"FOX KIDS", 28},
+ {"Heimatkanal", 517},
+ {"HR", 28108},
+ {"Junior", 19},
+ {"Kabel 1", 899},
+ {"Kinderkanal", 28008},
+ {"Krimi&Co", 23},
+ {"K-Toon", 12},
+ {"Liberty TV.com", 12199},
+ {"MDR", 28204},
+ {"NDR", 28224},
+ {"NEUN LIVE", 897},
+ {"ORB", 28205},
+ {"ORF1", 13001},
+ {"ORF2", 13002},
+ {"Phoenix", 28114},
+ {"Planet", 13},
+ {"Premiere 1", 10},
+ {"Premiere 2", 11},
+ {"Premiere 3", 43},
+ {"Premiere Action", 20},
+ {"Premiere Comedy", 29},
+ {"Premiere SCI-FI", 41},
+ {"Premiere Star", 9},
+ {"PREMIERE WORLD", 8},
+ {"ProSieben", 898},
+ {"RTL", 12003},
+ {"RTL2", 12020},
+ {"SAT.1", 46},
+ {"SeaSonS", 33},
+ {"SR", 28110},
+ {"Studio Universal", 36},
+ {"Sunset", 16},
+ {"Super RTL", 12040},
+ {"Test-Z1", 28305},
+ {"TW1", 13013},
+ {"Via 1 - Schöner Reise", 44},
+ {"VOX", 12060},
+ {"WDR", 28111},
+ {"ZDF", 28006},
+ {"ZDF.doku", 28014},
+ {"ZDF.info", 28011},
+ // Movies
+ {"AXN", 29506},
+ {"CANAL+", 29100},
+ {"CANAL+ AZUL", 29101},
+ {"CANAL+ ROJO", 29102},
+ {"CANAL+ VERT", 8208},
+ {"CANAL+ 16/9", 8204},
+ {"CANAL+ 16|9", 29024},
+ {"C+ROOD", 4005},
+ {"CINE CINEMA I", 8206},
+ {"CINE CINEMA II", 8002},
+ {"CINE CINEMA III", 8003},
+ {"CINE CLASSICS", 8709},
+ {"CINE CINEMA 16/9", 8301},
+ {"cinecinemas", 4008},
+ {"CINECLASSICS", 29203},
+ {"Cinedom 1", 176},
+ {"Cinedom 1B", 178},
+ {"Cinedom 1C", 180},
+ {"Cinedom 1D", 190},
+ {"Cinedom 2", 179},
+ {"Cinedom 2B", 183},
+ {"Cinedom 2C", 184},
+ {"Cinedom 2D", 188},
+ {"Cinedom 2E", 193},
+ {"Cinedom 3", 182},
+ {"Cinedom 3B", 185},
+ {"Cinedom 3C", 192},
+ {"Cinedom 3D", 195},
+ {"Cinedom 4", 181},
+ {"Cinedom 4B", 187},
+ {"Cinedom 4C", 191},
+ {"Cinedom 5", 186},
+ {"Cinedom 5B", 194},
+ {"Cindedom Deluxe", 189},
+ {"CINEMANÍA AZUL", 29501},
+ {"CINEMANÍA ROJO", 29605},
+ {"CINEMANÍA", 29500},
+ {"K1", 8401},
+ {"K2", 8402},
+ {"K3", 8403},
+ {"K4", 8404},
+ {"K5", 8405},
+ {"K6", 8406},
+ {"K7", 8407},
+ {"K9", 8409},
+ {"K12", 8412},
+ {"TAQUILLA 1", 29206},
+ {"TAQUILLA 2", 29207},
+ {"TAQUILLA 3", 29502},
+ {"TAQUILLA 4", 29503},
+ {"TAQUILLA 5", 29504},
+ {"TAQUILLA 6", 29301},
+ {"TAQUILLA 7", 29302},
+ {"TAQUILLA 8", 29303},
+ {"TAQUILLA 11", 29316},
+ {"TAQUILLA 12", 29610},
+ {"TAQUILLA 13", 29402},
+ {"TAQUILLA 14", 29212},
+ {"TAQUILLA 16|9", 29606},
+ // Music
+ {"40 LATINO", 29031},
+ {"40 TV", 29110},
+ {"CANAL+ JAUNE", 8203},
+ {"CLASSICA", 15},
+ {"GOLDSTAR TV", 518},
+ {"MCM 2", 8305},
+ {"MCM AFRICA", 8307},
+ {"MCM", 8302},
+ {"MTV 2", 28649},
+ {"MTV 6", 28641},
+ {"MTV Base", 28645},
+ {"MTV Central", 28643},
+ {"MTV F", 28642},
+ {"MTV Hits", 28644},
+ {"MUZZIK", 8007},
+ {"RFM TV", 17008},
+ {"TMF", 5015},
+ {"VH1 Classic", 28647},
+ {"VH1", 28646},
+ {"Video Italia", 12220},
+ {"VIVA ZWEI", 12120},
+ {"VIVA", 12732},
+ {"ZIK'/XXL", 17004},
+ // News
+ {"BBC WORLD", 17007},
+ {"Bloomberg TV", 12160},
+ {"CNBC", 28010},
+ {"CNBC", 35},
+ {"CNBC-NBC", 29202},
+ {"CNN", 28512},
+ {"DW-tv", 9005},
+ {"EuroNews", 28015},
+ {"FOX NEWS", 29032},
+ {"N24", 47},
+ {"n-tv", 12730},
+ {"Sky News", 3995},
+ // Netherlands
+ {"NED1", 4011},
+ {"NED2", 4012},
+ {"NED3", 4013},
+ {"NET5", 5004},
+ {"RTL4", 2004},
+ {"RTL5", 2005},
+ {"SBS6", 5005},
+ {"V8/Fox Kids", 5020},
+ {"Yorin", 5010},
+ // Porn
+ {"BEATE-UHSE.TV", 21},
+ {"Blue Movie1", 513},
+ {"Blue Movie2", 514},
+ {"Blue Movie3", 515},
+ {"K10", 8410},
+ {"TAQUILLA X", 29213},
+ {"TAQUILLA X", 29602},
+ {"TAQUILLA XX", 29607},
+ {"X-ZONE", 4009},
+ // Sports
+ {"C+BLAUW", 4006},
+ {"DSF", 900},
+ {"EUROSPORT", 8101},
+ {"Eurosport", 28009},
+ {"EUROSPORT", 29310},
+ {"EUROSPORTNEWS", 29037},
+ {"PATHE SPORT|", 8009},
+ {"PREMIERE SPORT 1", 17},
+ {"PREMIERE SPORT 2", 27},
+ {"SUPERDOM", 26},
+ // French
+ {"13EME RUE", 8703},
+ {"AB 1", 17001},
+ {"AB MOTEURS", 17000},
+ {"ACTION", 17010},
+ {"ALLOCINE TV", 8308},
+ {"ANIMAUX", 17002},
+ {"ARTE", 9009},
+ {"BLOOMBERG TV", 8004},
+ {"CA TV", 8610},
+ {"CANAL+", 8201},
+ {"CANAL+ BLEU", 8202},
+ {"CANAL J", 8108},
+ {"CANAL JIMMY", 8006},
+ {"CANALCLUB", 8812},
+ {"Cartoon Network", 28511},
+ {"CLUB TELEACHAT", 8303},
+ {"COMEDIE !", 8702},
+ {"CONTACT TV", 8804},
+ {"CUISINE.TV", 8112},
+ {"DEMAIN !", 8701},
+ {"DISNEY CHANNEL", 8207},
+ {"DT CSAT 10", 9159},
+ {"ENCYCLOPEDIA", 17003},
+ {"ESCALES", 17005},
+ {"EURONEWS", 8505},
+ {"FORUM", 8707},
+ {"FRANCE 2", 8801},
+ {"FRANCE 3", 8802},
+ {"GAME ONE", 8717},
+ {"i TELEVISION", 8010},
+ {"KIOSQUE", 8704},
+ {"KTO", 8304},
+ {"LA CHAINE METEO", 8008},
+ {"LA CINQUIEME", 8501},
+ {"LaChaîneHistoire", 17006},
+ {"LCI", 8107},
+ {"LCP", 8506},
+ {"L'EQUIPE TV", 8706},
+ {"LibertyTV.com", 12280},
+ {"MANGAS", 17011},
+ {"MONTECARLO TMC", 8102},
+ {"Motors TV", 12300},
+ {"NAT GEOGRAPHIC", 8310},
+ {"PAD", 8211},
+ {"PARIS PREMIERE", 8104},
+ {"PLANETE 2", 8507},
+ {"PLANETE", 8103},
+ {"PMU sur Canal+", 8210},
+ {"RFO SAT", 8708},
+ {"SANTE - VIE", 8110},
+ {"SEASONS", 8001},
+ {"TCM", 28515},
+ {"TEST CDN 1", 8616},
+ {"TEST CDN 3", 8627},
+ {"TiJi", 8309},
+ {"TV 5", 9001},
+ {"TV BREIZH", 8502},
+ {"TV Puls", 20601},
+ {"TV5 Europe", 12240},
+ {"VOYAGE", 8105},
+ // Spanish
+ {"ANDALUCÍA TV", 29011},
+ {"Bloomberg", 12721},
+ {"CALLE 13", 29609},
+ {"Canal Canarias", 29700},
+ {"Cartoon Network", 29314},
+ {"CNN+", 29020},
+ {"DISCOVERY", 29116},
+ {"DISNEY CHANNEL", 29111},
+ {"DOCUMANÍA", 29200},
+ {"ESTILO", 29305},
+ {"ETB", 29035},
+ {"FASHION TV", 29115},
+ {"FOX KIDS", 29209},
+ {"FOX", 29507},
+ {"MOSAICO", 29315},
+ {"MÉTEO", 29014},
+ {"Nat Geo Channel", 29034},
+ {"NICK-PARAMOUNT", 29312},
+ {"RTPI", 9006},
+ {"SEASONS", 29204},
+ {"TAQUILLA 0", 29205},
+ {"TCM.", 28516},
+ {"TVC INT.", 29701},
+ {"VIAJAR", 29306},
+ // Miscellaneous
+ {"Alice", 12200},
+ {"Canal Algerie", 9008},
+ {"CANALPRO TV", 8516},
+ {"ESC1 - EGYPTE", 9003},
+ {"FASHION TV.COM", 17009},
+ {"Home Shopping Euro", 45},
+ {"Home Shopping Euro", 40},
+ {"Kabel 1 Austria", 20004},
+ {"Kabel 1 Schweiz", 20003},
+ {"Polonia 1/Top Sho", 20366},
+ {"ProSieben A", 20002},
+ {"ProSieben Schweiz", 20001},
+ {"QVC GERMANY", 12100},
+ {"RAI 1", 9004},
+ {"REAL MADRID TV", 29019},
+ {"RealityTV", 20309},
+ {"RTL TELE Letzebuerg", 3994},
+ {"RTM - MAROC", 9002},
+ {"SÜDWEST BW", 28113},
+ {"SÜDWEST RP", 28231},
+ {"Super 1", 20364},
+ {"Travel", 28001},
+ {"TV7", 9007},
+ {"TV-NIEP II", 12740},
+ {"Wishline", 12320}
};
+
+
+// Nothing user-configurable below this line.
+
+static const char date_line[] = "\t<td align=center valign=middle colspan=3><span id=fb-b10>";
+static const char start_time_line[] = " \t\t<td id=\"jobview-box-date\" align=center><nobr>&nbsp;";
+static const char stop_time_line[] = "\t\t\t<tr><td id=\"line\" align=center><span id=\"fn-w9\">bis ";
+static const char channel_line[] = "\t\t\t<tr><td align=center><span id=\"fb-w9\">";
+static const char title_line[] = "\t\t\t\t<td align=left width=100%><span id=\"fb-w10\">";
+static const char summary_line[] = "<span id=\"fn-b8\">";
+static const char genre_line[] = "\t\t\t\t<td align=right valign=center nowrap><span id=\"fn-w10\">";
+
static const int month_lengths[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
-static const int max_channel = sizeof(channel_names)/sizeof(char *);
-static const int max_title = 50; // maximum length of title file name generated
-static const int max_line = 1024; // line buffer (not used when parsing summary text)
-static const int max_summary = 5000; // Summary can be up to 5000 bytes long
-static const int stop_time_safety_margin = 10; // add 10 minutes to stop time in case start was delayed
@@ -102,6 +386,10 @@ char map_special_char(const char * const word)
return 'Ü';
else if (strcmp(word, "szlig") == 0)
return 'ß';
+ else if (strcmp(word, "nbsp") == 0)
+ return ' ';
+ else if (strcmp(word, "amp") == 0)
+ return '&';
return ' ';
}
@@ -109,40 +397,52 @@ char map_special_char(const char * const word)
-void read_file_name(const char * const line, char * const file_name)
+void read_file_name_and_title(const char * const line, char * const file_name, char * const title)
{
int line_index = sizeof(title_line) - 1;
int title_index = 0;
- char ch = line[line_index++];
+ int file_name_index = 0;
+ char ch;
do
{
+ ch = line[line_index++];
if (ch == '&')
{
char word[10];
int i = 0;
while ((line[line_index + i] != ';') && (i < 9))
- word[i++] = line[line_index + i];
- word[i] = 0;
- ch = map_special_char(word);
- line_index += i;
+ {
+ word[i] = line[line_index + i]; i++;
+ }
+ if (line[line_index + i] == ';')
+ {
+ word[i] = 0;
+ ch = map_special_char(word);
+ line_index += i;
+ }
}
switch (ch)
{
- case 'ä': file_name[title_index++] = 'a'; file_name[title_index++] = 'e'; break;
- case 'ö': file_name[title_index++] = 'o'; file_name[title_index++] = 'e'; break;
- case 'ü': file_name[title_index++] = 'u'; file_name[title_index++] = 'e'; break;
- case 'Ä': file_name[title_index++] = 'A'; file_name[title_index++] = 'e'; break;
- case 'Ö': file_name[title_index++] = 'O'; file_name[title_index++] = 'e'; break;
- case 'Ü': file_name[title_index++] = 'U'; file_name[title_index++] = 'e'; break;
- case 'ß': file_name[title_index++] = 's'; file_name[title_index++] = 's'; break;
+ case 'ä': file_name[file_name_index++] = 'a'; file_name[file_name_index++] = 'e'; break;
+ case 'ö': file_name[file_name_index++] = 'o'; file_name[file_name_index++] = 'e'; break;
+ case 'ü': file_name[file_name_index++] = 'u'; file_name[file_name_index++] = 'e'; break;
+ case 'Ä': file_name[file_name_index++] = 'A'; file_name[file_name_index++] = 'e'; break;
+ case 'Ö': file_name[file_name_index++] = 'O'; file_name[file_name_index++] = 'e'; break;
+ case 'Ü': file_name[file_name_index++] = 'U'; file_name[file_name_index++] = 'e'; break;
+ case 'ß': file_name[file_name_index++] = 's'; file_name[file_name_index++] = 's'; break;
+ case ' ': file_name[file_name_index++] = '_'; break;
+ case '&':
+ file_name[file_name_index++] = 'u'; file_name[file_name_index++] = 'n'; file_name[file_name_index++] = 'd';
+ break;
default:
- if (((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) || ((ch >= '0') && (ch <= '9')))
- file_name[title_index++] = ch;
+ if (((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) || ((ch >= '0') && (ch <= '9')) || (ch == '-'))
+ file_name[file_name_index++] = ch;
}
- ch = int(line[line_index++]);
- } while ((title_index < max_title-1) && (ch != '<') && (ch != 0) && (line_index < max_line-1));
- file_name[title_index] = 0;
+ title[title_index++] = ch;
+ } while ((file_name_index < max_title-5) && (ch != '<') && (ch != 0));
+ file_name[file_name_index] = 0;
+ title[title_index-1] = 0;
}
@@ -184,7 +484,7 @@ void read_summary(char * const summary)
word[word_index++] = ch;
} while ((word_index < 6) && (ch != '>') && (ch != EOF));
while ((ch != '>') && (ch != EOF)) ch = getchar();
- if (strncmp("/table", word, 6) == 0)
+ if (strncmp("/span", word, 4) == 0)
done = true;
}
break;
@@ -207,62 +507,150 @@ void read_summary(char * const summary)
+int find_channel_number(const unsigned short * const vdr_pnrs, const char * const channel_name)
+
+{
+ for (int tvtv_channel_number = 0; tvtv_channel_number < sizeof(channel_map)/sizeof(map_entry); tvtv_channel_number++)
+ if (strcmp(channel_name, channel_map[tvtv_channel_number].tvtv_name) == 0)
+ for (int vdr_channel_number = 0; vdr_pnrs[vdr_channel_number] != 0xFFFF; vdr_channel_number++)
+ if (vdr_pnrs[vdr_channel_number] == channel_map[tvtv_channel_number].pnr)
+ return vdr_channel_number;
+ fprintf(stderr, "Error - channel '%s' not recognized.\n", channel_name);
+ exit(1);
+ /*NOTREACHED*/
+}
+
+
-main()
+unsigned short * read_vdr_pnrs(const char * const channels_conf_file_name)
+
{
- int channel = 0;
+ FILE * channels_conf = fopen(channels_conf_file_name, "r");
+ if (channels_conf == NULL)
+ {
+ perror("unable to open channels.conf.");
+ exit(1);
+ }
+ unsigned short * vdr_pnrs = (unsigned short *) malloc(max_vdr_channel * sizeof(unsigned short));
+ int vdr_channel_number = 0;
+ while (!feof(channels_conf) && (vdr_channel_number < max_vdr_channel-1))
+ {
+ char line[1024];
+ fgets(line, sizeof(line)-1, channels_conf);
+ int pnr;
+ if ((line[0] != ':') &&
+ (sscanf(line, "%*[^:]:%*[^:]:%*[^:]:%*[^:]:%*[^:]:%*[^:]:%*[^:]:%*[^:]:%*[^:]:%d", &pnr) == 1))
+ vdr_pnrs[vdr_channel_number++] = pnr;
+ }
+ vdr_pnrs[vdr_channel_number++] = 0xFFFF; // sentinel
+ fprintf(stderr, "%d pnrs.\n", vdr_channel_number);
+ return (unsigned short *) realloc(vdr_pnrs, vdr_channel_number * sizeof(unsigned short));
+}
+
+
+
+
+void process_input(const unsigned short * const vdr_pnrs)
+
+{
+
+ int channel = -1;
int day = -1;
int next_day = -1;
int start_time = -1;
- int stop_time = -1;
+ int stop_hour = -1;
+ int stop_minute= -1;
+ char genre[max_genre] = {0};
char summary[max_summary] = {0};
char file_name[max_title] = {0};
+ char title[max_title] = {0};
while (!feof(stdin))
{
char line[max_line];
fgets(line, max_line-1, stdin);
+ line[max_line-1] = 0;
if (strncmp(line, date_line, sizeof(date_line)-1) == 0)
{
const int month = (line[sizeof(date_line) + 6]- '0') * 10 + line[sizeof(date_line) + 7]-'0';
day = (line[sizeof(date_line) + 3]- '0') * 10 + line[sizeof(date_line) + 4]-'0';
- next_day = day == month_lengths[month]? 1 : day + 1;
+ next_day = day == month_lengths[month-1]? 1 : day + 1;
}
else if (strncmp(line, start_time_line, sizeof(start_time_line)-1) == 0)
- {
start_time = (line[sizeof(start_time_line) - 1] - '0') * 1000 +
(line[sizeof(start_time_line) ] - '0') * 100 +
(line[sizeof(start_time_line) + 2] - '0') * 10 +
(line[sizeof(start_time_line) + 3] - '0');
- }
else if (strncmp(line, stop_time_line, sizeof(stop_time_line)-1) == 0)
{
- stop_time = ((line[sizeof(stop_time_line) - 1] - '0') * 1000 +
- (line[sizeof(stop_time_line) ] - '0') * 100 +
- (line[sizeof(stop_time_line) + 2] - '0') * 10 +
- (line[sizeof(stop_time_line) + 3] - '0') + stop_time_safety_margin) % 2400;
- if ((day < 0) || (start_time < 0) || (file_name[0] == 0) || (channel == max_channel))
+ stop_hour = (line[sizeof(stop_time_line) - 1] - '0') * 10 +
+ (line[sizeof(stop_time_line) ] - '0');
+ stop_minute = (line[sizeof(stop_time_line) + 2] - '0') * 10 +
+ (line[sizeof(stop_time_line) + 3] - '0') +
+ stop_time_safety_margin;
+ if (stop_minute > 59)
+ {
+ stop_minute -= 60;
+ if (stop_hour == 23)
+ stop_hour = 0;
+ else
+ stop_hour++;
+ }
+ if ((day < 0) || (start_time < 0) || (file_name[0] == 0) || (channel == -1))
+ {
fprintf(stderr, "Input data error.\n");
+ exit(1);
+ }
else
- printf("1:%03d:%02d:%04d:%04d:2:7:%s:%s\n", channel+1, start_time < 600? next_day : day, start_time, stop_time, file_name, summary);
- start_time = -1; stop_time = -1; file_name[0] = 0; summary[0] = 0; channel = max_channel;
+ printf("1:%03d:%02d:%04d:%02d%02d:%d:%d:%s:\"%s\" %s||%s||||||(epg2timers)\n",
+ channel+1, start_time < 600? next_day : day, start_time, stop_hour, stop_minute,
+ recording_priority, recording_lifetime, file_name,
+ title, genre, summary);
+ start_time = -1; channel = -1;
+ file_name[0] = 0; summary[0] = 0; genre[0] = 0;
}
else if (strncmp(line, title_line, sizeof(title_line)-1) == 0)
- read_file_name(line, file_name);
+ read_file_name_and_title(line, file_name, title);
else if (strncmp(line, channel_line, sizeof(channel_line)-1) == 0)
{
int i = sizeof(channel_line);
- while ((i < max_line-1) && (line[i] != '<')) i++;
+ while ((line[i] != '<') && (line[i] != 0)) i++;
line[i] = 0; // end of string
- for (channel = 0; (channel < max_channel) &&
- (strcmp(line + sizeof(channel_line) - 1, channel_names[channel]) != 0);
- channel++);
- if (channel == max_channel)
- fprintf(stderr, "Error - channel '%s' not recognized.\n", line + sizeof(channel_line) - 1);
+ channel = find_channel_number(vdr_pnrs, line + sizeof(channel_line) - 1);
}
else if (strncmp(line, summary_line, sizeof(summary_line)-1) == 0)
read_summary(summary);
+ else if (strncmp(line, genre_line, sizeof(genre_line)-1) == 0)
+ {
+ int genre_index;
+ for (genre_index = 0; genre_index < max_genre-1; genre_index++)
+ {
+ const char ch = line[genre_index + sizeof(genre_line)-1];
+ if ((ch == 0) || (ch == '&') || (ch == '<'))
+ break;
+ genre[genre_index] = ch;
+ }
+ genre[genre_index] = 0;
+ }
}
}
+
+
+
+main(int argc, char *argv[])
+
+{
+ fprintf(stderr, "epg2timers Version 0.5, 15-Sep-2001.\n");
+
+ if (argc != 2)
+ {
+ fprintf(stderr, "usage: %s channels.conf\n", argv[0]);
+ exit(1);
+ }
+
+ const unsigned short * const vdr_pnrs = read_vdr_pnrs(argv[1]);
+ process_input(vdr_pnrs);
+ exit(0);
+}