summaryrefslogtreecommitdiff
path: root/Tools/master-timer
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/master-timer')
-rw-r--r--Tools/master-timer/LIESMICH70
-rw-r--r--Tools/master-timer/README58
-rw-r--r--Tools/master-timer/THANKS18
-rw-r--r--Tools/master-timer/Todo6
-rwxr-xr-xTools/master-timer/convert-DTV2VDR.pl151
-rwxr-xr-xTools/master-timer/convert-oldtorecord.pl61
-rwxr-xr-xTools/master-timer/master-timer.pl1412
-rwxr-xr-xTools/master-timer/process_summary.pl79
-rw-r--r--Tools/master-timer/sample/channels-to-scan6
-rw-r--r--Tools/master-timer/sample/config32
-rw-r--r--Tools/master-timer/sample/convert-channel-list26
-rw-r--r--Tools/master-timer/sample/deepblack172
-rw-r--r--Tools/master-timer/sample/done1
-rw-r--r--Tools/master-timer/sample/subtitle-movie52
-rw-r--r--Tools/master-timer/sample/torecord90
-rwxr-xr-xTools/master-timer/scan-channels8
16 files changed, 0 insertions, 2242 deletions
diff --git a/Tools/master-timer/LIESMICH b/Tools/master-timer/LIESMICH
deleted file mode 100644
index 8e53da9..0000000
--- a/Tools/master-timer/LIESMICH
+++ /dev/null
@@ -1,70 +0,0 @@
-Master-Timer
-============
-(w) by Matthias Schniedermeyer (ms@citd.de)
-
-
-1. Einleitung
--------------
-
-Master-Timer ist ein System zum automatischen Aufnehmen von Serien und Filmen.
-Beim Aufruf werden die Konfigurationsdateien gelesen, die Datei "epg.data" im
-aktuellen Verzeichnis nach passenden Sendungen durchsucht und die ermittelten
-Timer per SVDRP in VDR programmiert. Danach beendet sich Master-Timer.
-
-Entsprechend empfiehlt es sich, Master-Timer per cronjob aufzurufen.
-
-2. Konfigurationsdateien
-------------------------
-
-Alle Konfigurationsdateien liegen unter "~/.master-timer". Es werden
-regulaere Ausdruecke ohne Unterscheidung der Gross-/Kleinschreibung
-benutzt.
-
-config: Die Hauptkonfigurationsdatei.
-
-deepblack: Eine Negativliste von Titeln, die man NIEMALS NIMMER sehen will.
- Die epg-datensaetze werden beim Parsen einfach entfernt.
-
-subtitle-movies: Eine Liste der "Subtitel", die ein Zeichen fuer einen Film
- sind (soweit die von den Sendern richtig ausgefuellt sind). Die
- Einstellungen in dieser Datei werden fuer das Makro "MOVIE" in torecord
- benutzt.
- Kommentarzeilen sind nicht erlaubt.
-
-torecord: Liste der aufzunehmenden Filme.
-
-done: Liste der Titel/Subtitel, die bereits aufgenommen wurden. Timer, die
- hier auftauchen, werden in VDR automatisch geloescht.
-
-channels-to-scan: Diese Kanaele werden vom Skript "scan-channels" durch-
- geschaltet (zwecks Einlesen der EPG-Daten). Die Datei wird von Master-
- Timer selbst nicht benutzt.
-
-3. Anmerkungen
---------------
-
-- einige Sender fuellen die EPG-Felder nicht korrekt aus. Diese Fehler
- werden von Master-Timer automatisch korrigiert.
-
- Pro7: Title aus dem Subtitle entfernen '<Title> / <Subtitle>'
- Pro7: Timer zwischen 00:00 und 05:00 werden einen Tag in die Zukunft
- verschoben (Als unguten Nebeneffekt hat dies zur Folge das zum
- aktuellen Tag NICHT die epg-Daten das folgenden Tags (=Das was in
- der Fernsehzeitschrift noch auf der gleichen Seite ist) mehr gesendet
- werden. Wenn man also "Last Minute" etwas aufnehmen will, dann muss
- man (leider) einen Timer "per Hand" in VDR einprogrammieren!)
- VOX/VIVA: Subtitle ist in "" eingeschlossen nd nach ". " steht die description
- VIVA: Wenn der Subtitle mit einem Space beginnt, dann wird der komplette
- Subtitle in die Description verschoben
- RTL2: Wenn der EPG-Datensatz eine Dauer von kleiner/gleich 1 Sekunde hat,
- wird er einfach verworfen.
-
-Bis auf den jeweils 2ten VIVA&Pro-7 Bug werden die Fixes an jedem
-epg-Datensatz ausprobiert.
-
-4. Bekannte Bugs
-----------------
-
-- Es wird nicht geprueft ob noch genug DVB-Karten vorhanden sind
-- "Joined timers" werden nur automatisch geloescht wenn alle dazugehoerigen
- Sendungen "done" sind.
diff --git a/Tools/master-timer/README b/Tools/master-timer/README
deleted file mode 100644
index 05cc41a..0000000
--- a/Tools/master-timer/README
+++ /dev/null
@@ -1,58 +0,0 @@
-Master-Timer
-============
-(w) by Matthias Schniedermeyer (ms@citd.de)
-
-
-1. Introduction
----------------
-
-Master-Timer is a system designed for automatically recording movies.
-Upon execution it reads its configuration files, scans the file "epg.data"
-in the current directory for matching titles and programs them via SVDRP
-into VDR.
-
-You may for example run Master-Timer as a cron job.
-
-2. Config files
----------------
-
-Configuration files are located in "~/.master-timer". Each entry is a
-regular expression so you can use all Perl style REs you want. They are
-processed case insensitive.
-
-config: Main configuration file.
-
-deepblack: Blacklist of "titles" you NEVER EVER want to see.
-
-subtitle-movies: A list of "Subtitles" which indicate a movie (used
- by the "MOVIE" macro in torecord).
- For channels that correctly fill out the subtitle e.g. it will not
- work with *eRTL*.
-
-torecord: The titles you want to record.
-
-done: The titles/subtitles which are already recorded/should not be recorded
- Programmed timers which got inserted into "done" will be deleted
- automatically.
-
-channels-to-scan: Used only by the separate "scan-channels" script which
- switches through channels in order to get EPG data.
-
-4. Notices
-----------
-
-- Recordings overlapping on the same channel will be joined into one timer
-- Title/Subtitle/Descriptions are "fixed" for channels that don't fill them
- out correctly (Pro-7/VOX/VIVA)
- Pro7: Remove the Title from the Subtitle '<Title> / <Subtitle>'
- VOX/VIVA: Subtitle is enclosed into "" and after ". " is the description
- VIVA: When the Subtitle beginns with space the subtitle is moved to
- description
- All (except the second VIVA one) fixes are tried onto ALL Subtitles.
-
-5. Known-Bugs
--------------
-
-- It isn't checked if there are enough DVB-Cards
-- Overlapping timers on the same channel are always joined
-- Joined timers which are "done" don't get deleted automatically
diff --git a/Tools/master-timer/THANKS b/Tools/master-timer/THANKS
deleted file mode 100644
index 04bb13b..0000000
--- a/Tools/master-timer/THANKS
+++ /dev/null
@@ -1,18 +0,0 @@
-Klaus Schmidinger
- - VDR
-
-Malte Kiesel
- - Suggestions
- - Bug Reports
- - Documentation Updates for README/LIESMICH/torecord/deepblack/config
-
-Guido Fiala
- - Suggestions
- - Bug Repots
- - finding bugs i found just before i read that part of his mails
- (First the bug, then the errormessages! Otherwise i will search/find
- the bug myself :-))) )
-
-Axel Gruber
- - Suggestions
- - Bug Reports
diff --git a/Tools/master-timer/Todo b/Tools/master-timer/Todo
deleted file mode 100644
index 1757ade..0000000
--- a/Tools/master-timer/Todo
+++ /dev/null
@@ -1,6 +0,0 @@
-
-- "Komfortable" Anzeige, mit Black & Whitelisten, fuer Genres/Titeln usw.
-- Abspielen (mit automatischen "killen" des "Frontend"-VDRs) von
- Aufzeichnungen
-- "View"-Timer d.h. Timer der nicht Aufnimmt sondern nur den Kanal aendert
-- "unwichtige" Timer "verdraengen" wenn andere Aufnahmen anstehen.
diff --git a/Tools/master-timer/convert-DTV2VDR.pl b/Tools/master-timer/convert-DTV2VDR.pl
deleted file mode 100755
index fb2a783..0000000
--- a/Tools/master-timer/convert-DTV2VDR.pl
+++ /dev/null
@@ -1,151 +0,0 @@
-#!/usr/bin/perl -w
-
-use strict;
-
-# The EPG-Entrys
-my (%Entry, %channel, $mode);
-
-# 0 = VDR -> DTV
-# 1 = DTV -> VDR
-$mode = 0;
-
-read_channel_list();
-if ($mode) {
- &read_dtv();
- &read_epgdata();
-} else {
- &read_epgdata();
- &read_dtv();
-}
-&print_VDR();
-
-sub read_epgdata {
- my ($channel, $duration, $title, $subtitle, $description, $time);
- open (FI,"epg.data") or die ("Can't open file \"epg.data\"\n");
-
- while (<FI>) {
- # Begin Channel
- if (/^C\s(\d+)\s+(.+)/) {
- $channel=$2;
- while (<FI>) {
- # End Channel
- if (/^c$/) {
- last;
- }
- # Begin Timer
- elsif (/^E\s(\d+)\s+(\d+)\s+(\d+)$/) {
- # Undef this Variables because it is possibel that not every timer uses this values
- undef $duration;
- undef $subtitle;
- undef $description;
-
- $time=$2;
- $duration=$3;
- }
- # Title
- elsif (/^T\s(.*)/) {
- $title=$1;
- }
- # Subtitle
- elsif (/^S\s(.*)/) {
- $subtitle=$1;
- }
- # Description
- elsif (/^D\s(.*)/) {
- $description=$1;
- }
- # End Timer
- elsif (/^e$/) {
- if ($mode) {
- # DTV -> VDR
- $Entry{$channel}{$time}{subtitle}=$subtitle if ($subtitle);
- if ($description) {
- if ($Entry{$channel}{$time}{description}) {
- $Entry{$channel}{$time}{description} = "DTV: '$Entry{$channel}{$time}{description}' VDR: '$description'";
- } else {
- $Entry{$channel}{$time}{description} = "DTV: '' VDR: '$description'";
- }
- }
- } else {
- # VDR -> DTV
- $Entry{$channel}{$time}{title}=$title;
- $Entry{$channel}{$time}{duration}=$duration;
- $Entry{$channel}{$time}{subtitle}=$subtitle if ($subtitle);
- $Entry{$channel}{$time}{description}=$description if ($description);
- }
- }
- }
- }
- }
- close (FI);
-}
-
-sub read_dtv {
- my ($channel, $time, $duration, $title, $category, $subtitle, $description);
- open (FI,$ARGV[0]) or die "Can't open DTV-File";
-
- while (<FI>) {
- chomp;
- ($channel, $time, $duration, $title, $category, $subtitle, $description) = split (/\|/);
- if (!$channel{$channel}) {
- next;
- }
- $channel = $channel{$channel};
- if ($mode) {
- # DTV -> VDR
- if (!$subtitle && $description =~ /^\"(.*?)\"\:\s(.*)/) {
- $Entry{$channel}{$time}{subtitle} = $1;
- $description = $2;
- }
- $Entry{$channel}{$time}{title} = $title;
- $Entry{$channel}{$time}{duration} = $duration;
- $Entry{$channel}{$time}{subtitle} = $subtitle if ($subtitle);
- $Entry{$channel}{$time}{category} = $category if ($category);
- $Entry{$channel}{$time}{description} = $description if ($description);
- } else {
- # VDR -> DTV
- $Entry{$channel}{$time}{category} = $category if ($category);
- if ($description) {
- if (!$Entry{$channel}{$time}{subtitle} && $description =~ /^\"(.*?)\"\:\s(.*)/) {
- $Entry{$channel}{$time}{subtitle} = $1;
- $description = $2;
- }
- if ($Entry{$channel}{$time}{description}) {
- $Entry{$channel}{$time}{description} = "DTV: '$description' VDR: '$Entry{$channel}{$time}{description}'";
- } else {
- $Entry{$channel}{$time}{description} = "DTV: '$description' VDR: ''";
- }
- }
- }
- }
- close (FI);
-}
-
-sub read_channel_list {
- my ($old, $new);
- open (FI,"$ENV{HOME}/.master-timer/convert-channel-list") or die ("Can't read channel-List");
- while (<FI>) {
- chomp;
- ($old, $new) = split (/\|/);
- $channel{$old} = $new;
- }
- close (FI);
-}
-
-sub print_VDR() {
- my ($channel, $title, $time);
- foreach $channel (sort keys %Entry) {
- print "C 1 $channel\n";
- foreach $time (sort keys %{%Entry->{$channel}}) {
- if ($Entry{$channel}{$time}{duration}) {
- print "E 1 $time $Entry{$channel}{$time}{duration}\n";
- print "K $Entry{$channel}{$time}{category}\n" if ($Entry{$channel}{$time}{category});
- print "T $Entry{$channel}{$time}{title}\n";
- print "S $Entry{$channel}{$time}{subtitle}\n" if ($Entry{$channel}{$time}{subtitle});
- print "D $Entry{$channel}{$time}{description}\n" if ($Entry{$channel}{$time}{description});
- print "e\n";
- }
- }
- print "c\n";
- }
-}
diff --git a/Tools/master-timer/convert-oldtorecord.pl b/Tools/master-timer/convert-oldtorecord.pl
deleted file mode 100755
index 853c20b..0000000
--- a/Tools/master-timer/convert-oldtorecord.pl
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/usr/bin/perl
-
-while (<>)
- {
- chomp;
- if ($_ && !(/^\#/))
- {
- ($title, $subtitle, $description, $channel, $timeframe, $prio, $timer_title, $margin, $machine) = split (/\|/,$_);
-
- if ($timer_title) {
- print "[$timer_title]\n";
- } elsif ($title) {
- print "[$title]\n";
- } elsif ($subtitle) {
- print "[$subtitle]\n";
- } elsif ($description) {
- print "[$description]\n";
- } else {
- die ("Illegal Format");
- }
-
- # Accept torecord only if it is for the current machine
- if ($title)
- {
- print "Title = $title\n";
- }
- if ($subtitle)
- {
- print "Subtitle = $subtitle\n";
- }
- if ($description)
- {
- print "Description = $description\n";
- }
- if ($channel)
- {
- print "Channel = $channel\n";
- }
- if ($timeframe)
- {
- print "Timeframe = $timeframe\n";
- }
- if ($prio)
- {
- print "Prio = $prio\n";
- }
- if ($timer_title)
- {
- print "Timertitle = $timer_title\n";
- }
- if ($margin)
- {
- print "Margin = $margin\n";
- }
- if ($machine)
- {
- print "Instance = $machine\n";
- }
- print "\n";
- }
- }
diff --git a/Tools/master-timer/master-timer.pl b/Tools/master-timer/master-timer.pl
deleted file mode 100755
index 5ddf909..0000000
--- a/Tools/master-timer/master-timer.pl
+++ /dev/null
@@ -1,1412 +0,0 @@
-#!/usr/bin/perl -w
-
-use strict;
-# For the TCP-Connection to VDR
-use Socket;
-# For converting the Timers, read from VDR, back to Unix-Timestamps
-use Time::Local;
-# For parsing the command line
-use Getopt::Std;
-
-# Debugmode
-# You have to add the following numbers to build the debug-var
-# 1 : Dump the "torecord"
-# 2 : Dump all timers
-# 4 : Show when a timer will be deleted
-# 8 : Dump the "Done" REs
-# 16 : Verbose Config-Reading
-# 32 : Dump Program Variable
-# 64 : Excessive deepblack/torecord debuging
-my $debug = 6;
-
-# The Supervariable Program
-# %Program{$title}{$channel}{$time}{duration}
-# {subtitle}
-# {description}
-
-# The Supervariable Timer
-# %Timer{$time}{$channel}{$title}{duration}
-# {subtitle}
-# {description}
-# {prio}
-# {lifetime}
-# {real_title}
-# {VDR} (Already programmed)
-# The Value of VDR is ">0" for the position in the Timer-List or "R" for a "Repeating" Timer.
-# A Value of >1.000.000 is a Master Timer-Timer which is already programmed into VDR
-
-# The Supervariable torecord/deepblack
-# $torecord{timercount}
-# {titleRE}
-# {subtitleRE}
-# {descriptionRE}
-# {title}[COUNT]
-# {subtitle}[COUNT]
-# {description}[COUNT]
-# {timeframe}[COUNT]
-# {blackchannel}[COUNT] or {channel}[COUNT]
-# {weekday}[COUNT]
-# {minlength}[COUNT]
-# {maxlength}[COUNT]
-# {prio}[COUNT]
-# {timertitle}[COUNT]
-# {marginstart}[COUNT]
-# {marginstop}[COUNT]
-# {instance}[COUNT]
-
-# Variable-Definition
-my (%Program, @channels, %channels, %Timer);
-
-# Which Subtitles are Movies
-my ($subtitle_movie);
-my ($test_subtitle_movie);
-
-# Blacklist
-my (%deepblack);
-
-# What is already recorded/Should not be recorded
-my ($title_done, $subtitle_done);
-
-# What to record
-my (%torecord);
-
-# The Commandline
-my (%Opts);
-
-# Default Priority for Timers (Config: defaultprio)
-my $default_prio = 50;
-
-# How many DVB-S cards are there (Config: DVBCards)
-my $DVB_cards = 1;
-
-# How many seconds to substract from the time and to add to the duration
-my $marginstart = 60*10; # Config: Marginstart
-my $marginstop = 60*10; # Config: Marginstop
-
-# Shall Timers, on the same channel, be joined if they overlap
-my $jointimers = 0;
-
-# Hostname/IP of DVB-Computer and the Port of VDR
-my @Dest = ("localhost:2001"); # Config: Dest
-
-# Which VDR-Instance shall be used
-my $currentVDR = 1;
-
-# Where are the Config-Files
-my $configdir = "$ENV{HOME}/.master-timer";
-
-# Should the description be transfered to VDR?
-my $Description = 0;
-
-# Working-Variables
-my ($title, $duration, $subtitle, $channel, $time, $description, $category, $hit);
-my (@time, @date);
-
-END {
- &closesocket();
-}
-
-&init();
-&dumpdone() if ($debug & 8);
-&dumptorecord("torecord") if ($debug & 1);
-&dumptorecord("deepblack") if ($debug & 1);
-print "Subtitle-Movie \"$subtitle_movie\"\n" if($debug & 1);
-# If we only have to dump the running series then exit after dumping them
-if ($Opts{s}) {
- &dumpepgdata;
- exit 0;
-}
-&processdone();
-&fetchVDRTimers();
-&process_torecord();
-print "Timers before joining\n" if ($debug & 2 && $jointimers);
-&dumptimers() if ($debug & 2);
-
-if ($jointimers) {
- &jointimers();
- print "Timers after joining\n" if ($debug & 2);
- &dumptimers() if ($debug & 2);
-}
-
-&dumpepgdata if ($debug & 32);
-
-&printtimers();
-&transfertimers();
-
-#
-# End of Program
-#
-
-#
-# Subfunctions
-#
-
-sub dumpdone() {
- print "Start Done-dump\n";
- print "Titledone: \"$title_done\"\n";
- print "Subtitledone \"$subtitle_done\"\n";
- print "End Done-dump\n";
-}
-
-sub dumpepgdata () {
- print "Start EPG-Dump\n";
- foreach $title (sort keys %Program) {
- foreach $channel (sort keys %{%Program->{$title}}) {
- foreach $time (sort {$a <=> $b} keys %{%Program->{$title}->{$channel}}) {
- print "Title: \"$title\" ";
- if (!$Opts{s}) {
- print "Subtitle: \"$Program{$title}{$channel}{$time}{subtitle}\" " if ($Program{$title}{$channel}{$time}{subtitle});
- print "Time: \"$time\"";
- }
- print "Channel: \"$channel\"";
- print "\n";
- if ($Opts{s}) {
- last;
- }
- }
- }
- }
- print "End EPG-Dump\n";
-}
-
-
-sub dumptorecord() {
- my ($context) = shift;
- my ($rContext);
-
- if ($context eq "torecord") {
- $rContext = \%torecord;
- } elsif ($context eq "deepblack") {
- $rContext = \%deepblack;
- } else {
- die ("Illegal Context");
- }
-
- print "Start $context-dump\n";
- print "Regex-Title: $$rContext{titleRE}\n";
- print "Regex-Subtitle: $$rContext{subtitleRE}\n";
- print "Regex-Description: $$rContext{descriptionRE}\n";
- foreach my $num (0 .. $$rContext{timercount}) {
- print "Entry Number $num: ";
-
- print "Title: \"$$rContext{title}[$num]\" " if ($$rContext{title}[$num]);
- print "Title: \"\" " unless ($$rContext{title}[$num]);
-
- print "Subtitle: \"$$rContext{subtitle}[$num]\" "if ($$rContext{subtitle}[$num]);
- print "Subtitle: \"\" " unless ($$rContext{subtitle}[$num]);
-
- print "Description: \"$$rContext{description}[$num]\" " if ($$rContext{description}[$num]);
- print "Description: \"\" " unless ($$rContext{description}[$num]);
-
- print "Category: \"$$rContext{category}[$num]\" " if ($$rContext{category}[$num]);
- print "Category: \"\" " unless ($$rContext{category}[$num]);
-
- print "Timeframe: \"$$rContext{timeframe}[$num]\" " if ($$rContext{timeframe}[$num]);
- print "Timeframe: \"\" " unless ($$rContext{timeframe}[$num]);
-
- print "Weekday: \"$$rContext{weekday}[$num]\" " if ($$rContext{weekday}[$num]);
- print "Weekday: \"\" " unless ($$rContext{weekday}[$num]);
-
- print "Channel: \"$$rContext{channel}[$num]\" " if ($$rContext{channel}[$num]);
- print "Channel: \"\" " unless ($$rContext{channel}[$num]);
-
- print "Blackchannel: \"$$rContext{blackchannel}[$num]\" " if ($$rContext{blackchannel}[$num]);
- print "Blackchannel: \"\" " unless ($$rContext{blackchannel}[$num]);
-
- print "Prio: \"$$rContext{prio}[$num]\" " if ($$rContext{prio}[$num]);
- print "Prio: \"\" " unless ($$rContext{prio}[$num]);
-
- print "Timertitle: \"$$rContext{timertitle}[$num]\" " if ($$rContext{timertitle}[$num]);
- print "Timertitle: \"\" " unless ($$rContext{timertitle}[$num]);
-
- print "Marginstart: \"$$rContext{marginstart}[$num]\" " if ($$rContext{marginstart}[$num]);
- print "Marginstart: \"\" " unless ($$rContext{marginstart}[$num]);
-
- print "Marginstop: \"$$rContext{marginstop}[$num]\" " if ($$rContext{marginstop}[$num]);
- print "Marginstop: \"\" " unless ($$rContext{marginstop}[$num]);
-
- print "Minlength: \"$$rContext{minlength}[$num]\" " if ($$rContext{minlength}[$num]);
- print "Minlength: \"\" " unless ($$rContext{minlength}[$num]);
-
- print "Maxlength: \"$$rContext{maxlength}[$num]\" " if ($$rContext{maxlength}[$num]);
- print "Maxlength: \"\" " unless ($$rContext{maxlength}[$num]);
-
- print "Instance: \"$$rContext{instance}[$num]\" " if ($$rContext{instance}[$num]);
- print "Instance: \"\" " unless ($$rContext{instance}[$num]);
-
- print "\n";
- }
- print "End $context-dump\n";
-}
-
-sub dumptimers() {
- print "Start Timers-dump\n";
- foreach $time (sort {$a <=> $b} keys %Timer) {
- foreach $channel (sort keys %{%Timer->{$time}}) {
- foreach $title (sort keys %{%Timer->{$time}->{$channel}}) {
- my ($prio, $lifetime, @time, @date, @time2);
- my ($realtitle);
- @time = &GetTime ($time);
- @date = &GetDay ($time);
- @time2 = &GetTime ($time + $Timer{$time}{$channel}{$title}{duration});
- $subtitle = $Timer{$time}{$channel}{$title}{subtitle};
- $prio = $Timer{$time}{$channel}{$title}{prio};
- $lifetime = $Timer{$time}{$channel}{$title}{lifetime};
- $realtitle = $Timer{$time}{$channel}{$title}{real_title};
- print "2:$channels{$channel}{number}:$date[1]:$time[0]$time[1]:$time2[0]$time2[1]:$prio:$lifetime:$title:Title: \"$realtitle\"||Subtitle: \"$subtitle\":$Timer{$time}{$channel}{$title}{VDR}\n";
- }
- }
- }
- print "End Timers-dump\n";
-}
-
-sub printtimers() {
- foreach $time (sort {$a <=> $b} keys %Timer) {
- foreach $channel (sort keys %{%Timer->{$time}}) {
- foreach $title (sort keys %{%Timer->{$time}->{$channel}}) {
- my ($prio, $lifetime, @time, @date, @time2);
- if ($Timer{$time}{$channel}{$title}{VDR} eq 0) {
- my ($realtitle);
- @time = &GetTime ($time);
- @date = &GetDay ($time);
- @time2 = &GetTime ($time + $Timer{$time}{$channel}{$title}{duration});
- $subtitle = $Timer{$time}{$channel}{$title}{subtitle};
- $prio = $Timer{$time}{$channel}{$title}{prio};
- $lifetime = $Timer{$time}{$channel}{$title}{lifetime};
- $realtitle = $Timer{$time}{$channel}{$title}{real_title};
-
- print "2:$channels{$channel}{number}:$date[1]:$time[0]$time[1]:$time2[0]$time2[1]:$prio:$lifetime:$title:Title: \"$realtitle\"||Subtitle: \"$subtitle\"\n";
- }
- }
- }
- }
-}
-
-sub transfertimers() {
- foreach $time (sort {$a <=> $b} keys %Timer) {
- foreach $channel (sort keys %{%Timer->{$time}}) {
- foreach $title (sort keys %{%Timer->{$time}->{$channel}}) {
- my ($prio, $lifetime, $description, @time, @date, @time2, $realtitle, $result);
- if ($Timer{$time}{$channel}{$title}{VDR} eq 0) {
- @time = &GetTime ($time);
- @date = &GetDay ($time);
- @time2 = &GetTime ($time + $Timer{$time}{$channel}{$title}{duration});
- $subtitle = $Timer{$time}{$channel}{$title}{subtitle};
- $prio = $Timer{$time}{$channel}{$title}{prio};
- $lifetime = $Timer{$time}{$channel}{$title}{lifetime};
- if ($Description) {
- $description = "||Description :\"$Timer{$time}{$channel}{$title}{description}\"";
- } else {
- $description = "";
- }
- $realtitle = $Timer{$time}{$channel}{$title}{real_title};
-
- ($result) = GetSend ("newt 2:$channels{$channel}{number}:$date[1]:$time[0]$time[1]:$time2[0]$time2[1]:$prio:$lifetime:$title:Title: \"$realtitle\"||Subtitle: \"$subtitle\"$description");
- print "Timer: $result" if ($debug & 2);
- }
- }
- }
- }
-}
-
-# Convert the Unix-Time-Stamp into "month" and "Day of month"
-sub GetDay {
- my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(shift);
- $mon++;
- $mon = sprintf ("%02i",$mon);
- $mday = sprintf ("%02i",$mday);
- return ($mon, $mday);
-}
-# Convert the Unix-Time-Stramp into Weekday
-sub GetWDay {
- my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(shift);
- return ($wday);
-}
-
-# Convert the Unix-Time-Stramp into "hour" and "minute"
-sub GetTime {
- my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(shift);
- $hour = sprintf ("%02i",$hour);
- $min = sprintf ("%02i",$min);
- return ($hour, $min);
-}
-
-# Workaround some EPG-Bugs
-sub correct_epg_data {
- if ($subtitle) {
- # For Pro-7. Remove $title from $subtitle
- $subtitle =~ s/\Q$title\E\s\/\s//;
-
- # For VOX & VIVA. The Format it '"<Subtitle>". <Description>'
- if ($subtitle =~ /^\"(.*?)\"\.\s(.*)/) {
- # Lets see if there are Channels that where the VOX/VIVA scheme matches, but also have a description
- if ($description) {
- my $one = $1;
- my $two = $2;
- if ($description =~ /^DTV\:\s\'(.*)\' VDR:\s\'\'$/) {
- $description = "DTV: '$1' VDR: '$two'";
- $subtitle = $one;
- } else {
- die ("Title: \"$title\" Channel: \"$channel\" Subtitle: \"$subtitle\"\nDescription: \"$description\"\n");
- }
- }
- $subtitle = $1;
- $description = $2;
- }
- elsif ($channel eq "VIVA") {
- if ($subtitle =~ /^\s(.*)/) {
- $subtitle = "";
- $description = $1;
- }
- }
- }
-
- # Workaround for the broken PRO-7/Kabel-1 EPG-Date. If Time is between 00.00 and 05.00 the time is shifted forward by a day
- if ($channel eq "Pro-7" || $channel eq "Kabel-1") {
- my (@time);
- @time = GetTime ($time);
- if ($time[0] >= 0 && ($time[0] <= 4 || ($time[0] == 5 && $time[1] == 0))) {
- $time += 24*60*60;
- }
- }
-}
-
-# Add a Recording into the "to record"-List
-sub addtimer {
- my ($title, $realtitle, $subtitle, $channel, $time, $duration, $prio, $lifetime, $description, $VDR, $time2, $title2, $channel2, $marginstart, $marginstop);
- ($title, $realtitle, $subtitle, $description, $channel, $time, $duration, $prio, $lifetime, $VDR, $marginstart, $marginstop) = @_;
-# print "Title: \"$title\" Realtitle: \"$realtitle\" Subtitle: \"$subtitle\" Channel: \"$channel\" Time: \"$time\" Duration: \"$duration\" Prio: \"$prio\" VDR: \"$VDR\"\n";
-
- foreach $time2 (sort keys %Timer) {
- foreach $title2 (sort keys %{%Timer->{$time2}->{$channel}}) {
- my ($ctime, $ctime2);
- $ctime = $time2;
- $ctime2 = $time2 + $Timer{$time2}{$channel}{$title2}{duration};
-
- if (($time >= $ctime) && ($time <= $ctime2)) {
- return;
- }
- }
- }
-
- $time -= $marginstart;
- $duration += $marginstart + $marginstop;
- $Timer{$time}{$channel}{$title}{duration}=$duration;
- $Timer{$time}{$channel}{$title}{subtitle}=$subtitle;
- $Timer{$time}{$channel}{$title}{description}=$description;
- $Timer{$time}{$channel}{$title}{prio}=$prio;
- $Timer{$time}{$channel}{$title}{lifetime}=$lifetime;
- $Timer{$time}{$channel}{$title}{VDR}=$VDR;
- $Timer{$time}{$channel}{$title}{real_title}=$realtitle;
-}
-
-sub deltimer() {
- my ($time, $channel, $title, $delete_from_VDR);
- ($time, $channel, $title, $delete_from_VDR) = @_;
-
-# if ($delete_from_VDR) {
-# if ($Timer{$time}{$channel}{$title}{VDR}) {
-# if ($Timer{$time}{$channel}{$title}{VDR} =~ s/ ^R/) {
-# print "Error: A Repeating-Timer can't be deleted from VDR: \"$title\"\n";
-# }
-# elsif ($Timer{$time}{$channel}{$title}{VDR} < 1000000) {
-# print "A User-Programmed Timer has been deleted from VDR: \"$title\"\n";
-# }
-# else {
-#
-# }
-# }
-# }
-
- delete $Timer{$time}{$channel}{$title}{duration};
- delete $Timer{$time}{$channel}{$title}{subtitle};
- delete $Timer{$time}{$channel}{$title}{prio};
- delete $Timer{$time}{$channel}{$title}{VDR};
- delete $Timer{$time}{$channel}{$title}{real_title};
- delete $Timer{$time}{$channel}{$title};
- delete $Timer{$time}{$channel} if (keys %{ $Timer{$time}{$channel} } == 1);
- delete $Timer{$time} if (keys %{ $Timer{$time} } == 1);
-}
-
-sub delprogram() {
- my ($title, $channel, $time);
- ($title, $channel, $time) = @_;
-
- delete $Program{$title}{$channel}{$time};
- delete $Program{$title}{$channel} if (keys %{ $Program{$title}{$channel} } == 1);
- delete $Program{$title} if (keys %{ $Program{$title} } == 1);
-}
-
-sub jointimers {
- #
- # FIXME: 2 Timers on the same channel will always be joined.
- # It should be checked if there is another DVB-Card available.
- #
- # FIXME2: When one timer is already programmed in VDR, delete that timer in VDR.
- my ($running, $counter, @times, $channel, $title, $channel2, $title2);
- $running = 1;
- outer: while ($running) {
- $counter = 0;
- @times = sort {$a <=> $b} keys %Timer;
-
- # We only need to check till the second last timer. The last one can't have a overlapping one.
- while ($counter < $#times) {
- foreach $channel (sort keys %{%Timer->{$times[$counter]}}) {
- foreach $title (sort keys %{%Timer->{$times[$counter]}->{$channel}}) {
- if ($times[$counter + 1] < ($times[$counter] + $Timer{$times[$counter]}{$channel}{$title}{duration})) {
- foreach $channel2 (sort keys %{%Timer->{$times[$counter + 1]}}) {
- foreach $title2 (sort keys %{%Timer->{$times[$counter + 1]}->{$channel}}) {
- if ($channel eq $channel2) {
- my ($duration, $subtitle, $description, $prio, $lifetime, $realtitle, $duration2, $subtitle2, $description2, $prio2, $lifetime2, $realtitle2);
- # Values from Lower-Timer
- $duration = $Timer{$times[$counter]}{$channel}{$title}{duration};
- $subtitle = $Timer{$times[$counter]}{$channel}{$title}{subtitle};
- $description = $Timer{$times[$counter]}{$channel}{$title}{description};
- $prio = $Timer{$times[$counter]}{$channel}{$title}{prio};
- $lifetime = $Timer{$times[$counter]}{$channel}{$title}{lifetime};
- $realtitle = $Timer{$times[$counter]}{$channel}{$title}{real_title};
-
- # Values from Higher-Timer
- $duration2 = $Timer{$times[$counter + 1]}{$channel2}{$title2}{duration};
- $subtitle2 = $Timer{$times[$counter + 1]}{$channel2}{$title2}{subtitle};
- $description2 = $Timer{$times[$counter + 1]}{$channel2}{$title2}{description};
- $prio2 = $Timer{$times[$counter + 1]}{$channel2}{$title2}{prio};
- $lifetime2 = $Timer{$times[$counter + 1]}{$channel2}{$title2}{lifetime};
- $realtitle2 = $Timer{$times[$counter + 1]}{$channel2}{$title2}{real_title};
-
- # Use the Higher Priority/Lifetime for the new Timer
- $prio = ($prio > $prio2) ? $prio : $prio2;
- $lifetime = ($lifetime > $lifetime2) ? $lifetime : $lifetime2;
-
- # Delete the two "Obsolet" Timers
- &deltimer ($times[$counter], $channel, $title);
- &deltimer ($times[$counter + 1], $channel2, $title2);
-
- # And set the new one
- &addtimer ("$title + $title2", "$realtitle\~$realtitle2", "$subtitle\~$subtitle2", "$description\~$description2", $channel, $times[$counter], $duration2 + ($times[$counter + 1 ] - $times[$counter]),$prio,$lifetime,0,0,0);
-
- # Now a Value is "missing", so we will redo the whole thing. (This will do three-times JOIN correct)
- redo outer;
- }
- }
- }
- }
- }
- }
- $counter++;
- }
- undef $running;
- }
-}
-
-sub process_torecord {
- my ($subtitle, $description, $prio, $lifetime, $timertitle, $counter);
- foreach $title (sort keys %Program) {
- foreach $channel (sort keys %{%Program->{$title}}) {
- foreach $time (sort {$a <=> $b} keys %{%Program->{$title}->{$channel}}) {
-
- $counter = &testtimer("torecord", $title, $channel, $time);
- if ($counter ne "Nothing") {
-
- # What Priority
- if ($torecord{prio}[$counter]) {
- $prio = $torecord{prio}[$counter];
- }
- else {
- $prio = 50;
- }
-
- # What Lifetime
- if ($torecord{lifetime}[$counter]) {
- $lifetime = $torecord{lifetime}[$counter];
- }
- else {
- $lifetime = 50;
- }
-
- # What Title to use for the timer
- if ($torecord{timertitle}[$counter]) {
- $timertitle = $torecord{timertitle}[$counter]
- }
- elsif ($torecord{title}[$counter]) {
- $timertitle = $torecord{title}[$counter]
- }
- else {
- $timertitle = $title;
- }
-
- # What subtitle to use
- if ($Program{$title}{$channel}{$time}{subtitle}) {
- $subtitle = $Program{$title}{$channel}{$time}{subtitle};
- }
- else {
- $subtitle = "";
- }
-
- # What Description to use
- if ($Program{$title}{$channel}{$time}{description}) {
- $description = $Program{$title}{$channel}{$time}{description};
- }
- else {
- $description = "";
- }
-
- &addtimer ($timertitle,$title,$subtitle,$description,$channel,$time,$Program{$title}{$channel}{$time}{duration},$prio,$lifetime,0,$torecord{marginstart}[$counter],$torecord{marginstop}[$counter]);
- }
- }
- }
- }
-}
-
-# Test if a torecord/deepblack Entry matches the current EPG-Data-Field
-sub testtimer {
- my ($context) = shift;
- my ($title) = shift;
- my ($channel) = shift;
- my ($time) = shift;
- my ($counter, $rContext);
-
- if ($context eq "torecord") {
- $rContext = \%torecord;
- } elsif ($context eq "deepblack") {
- $rContext = \%deepblack;
- } else {
- die ("Illegal Context");
- }
-
- if ($debug & 64) {
- print "\n";
- print "Context: \"$context\"\nTitle: \"$title\"\n";
- print "Subtitle: \"$Program{$title}{$channel}{$time}{subtitle}\"\n" if ($Program{$title}{$channel}{$time}{subtitle});
- print "Description \"$Program{$title}{$channel}{$time}{description}\"\n" if ($Program{$title}{$channel}{$time}{description});
- print "Category \"$Program{$title}{$channel}{$time}{category}\"\n" if ($Program{$title}{$channel}{$time}{category});
- print "Channel: $channel\n";
- print "Time: $time\n";
- print "Duration: $Program{$title}{$channel}{$time}{duration}\n";
- }
-
- # First look if any of the Title/Subtitle/Description REs match
- if ($title =~ /$$rContext{titleRE}/i) {
- print "Title hit\n" if ($debug & 64);
- }
- elsif ($Program{$title}{$channel}{$time}{subtitle} && $Program{$title}{$channel}{$time}{subtitle} =~ /$$rContext{subtitleRE}/i) {
- print "SubTitle hit\n" if ($debug & 64);
- }elsif ($Program{$title}{$channel}{$time}{subtitle} && $test_subtitle_movie && $Program{$title}{$channel}{$time}{subtitle} =~ /$subtitle_movie/) {
- print "SubTitle-Movie hit\n" if ($debug & 64);
- }
- elsif ($Program{$title}{$channel}{$time}{description} && $Program{$title}{$channel}{$time}{description} =~ /$$rContext{descriptionRE}/i) {
- print "Description hit\n" if ($debug & 64);
- } else {
- # No "Fast"-hit. Exiting
- return "Nothing";
- }
-
- # Now look if we have a "exact" hit
- print "In Exact Hit Loop\n" if ($debug & 64);
- foreach my $counter (0 .. $$rContext{timercount}) {
-
- print "Before Title Match\n" if ($debug & 64);
- if ($$rContext{title}[$counter]) {
- print "In Title Match \"$$rContext{title}[$counter]\"\n" if ($debug & 64);
- if (!($title =~ /$$rContext{title}[$counter]/i)) {
- print "Title rejected\n" if ($debug & 64);
- next;
- }
- }
-
- print "Before Subtitle Match\n" if ($debug & 64);
- if ($$rContext{subtitle}[$counter]) {
- print "In Subtitle Match \"$$rContext{subtitle}[$counter]\"\n" if ($debug & 64);
- if ($Program{$title}{$channel}{$time}{subtitle}) {
- if ($$rContext{subtitle}[$counter] =~ /^movie$/i) {
- if (!($Program{$title}{$channel}{$time}{subtitle} =~ /$subtitle_movie/i)) {
- print "Subtitle rejected 1\n" if ($debug & 64);
- next;
- }
- }
- elsif ($$rContext{subtitle}[$counter] =~ /^\!movie$/i) {
- if (($Program{$title}{$channel}{$time}{subtitle} =~ /$subtitle_movie/i)) {
- print "Subtitle rejected 2\n" if ($debug & 64);
- next;
- }
- }
- elsif (!($Program{$title}{$channel}{$time}{subtitle} =~ /$$rContext{subtitle}[$counter]/i)) {
- print "Subtitle rejected 3\n" if ($debug & 64);
- next;
- }
- } else {
- # We had a Subtitle, but epg.data did not have a subtitle for this record so no chance to record this
- print "Subtitle rejected 4\n" if ($debug & 64);
- next;
- }
- }
-
- print "Before Description Match\n" if ($debug & 64);
- if ($$rContext{description}[$counter]) {
- print "In Description Match \"$$rContext{description}[$counter]\"\n" if ($debug & 64);
- if ($Program{$title}{$channel}{$time}{description}) {
- if (!($Program{$title}{$channel}{$time}{description} =~ /$$rContext{description}[$counter]/i)) {
- print "Description rejected 1\n" if ($debug & 64);
- next;
- }
- }
- elsif (!$$rContext{title}[$counter] && !$$rContext{subtitle}[$counter]) {
- print "Description rejected 2\n" if ($debug & 64);
- next;
- }
- }
-
- print "Before Category Match\n" if ($debug & 64);
- if ($$rContext{category}[$counter]) {
- print "In Category Match \"$$rContext{category}[$counter]\"\n" if ($debug & 64);
- if ($Program{$title}{$channel}{$time}{category}) {
- my ($left, $right);
- ($left, $right) = split (/\//, $$rContext{category}[$counter]);
- if ($left) {
- print "In Category Match Left \"$left\"\n" if ($debug & 64);
- if (!($Program{$title}{$channel}{$time}{category} =~ /^$left\//)) {
- print "Category rejected 1\n" if ($debug & 64);
- next;
- }
- }
- if ($right) {
- print "In Category Match Right \"$right\"\n" if ($debug & 64);
- if (!($Program{$title}{$channel}{$time}{category} =~ /\/$right$/)) {
- print "Category rejected 2\n" if ($debug & 64);
- next;
- }
- }
- } else {
- # We had a Category, but the epg.data not. So discard this Entry
- print "Category rejected 3\n" if ($debug & 64);
- next;
- }
- }
-
- print "Before Channel Match\n" if ($debug & 64);
- if ($$rContext{channel}[$counter]) {
- print "In Channel Match Whitelist-Mode \"$$rContext{channel}[$counter]\"\n" if ($debug & 64);
- if (!($channel =~ /$$rContext{channel}[$counter]/)) {
- print "Channel rejected\n" if ($debug & 64);
- next;
- }
- }
-
- if ($$rContext{blackchannel}[$counter]) {
- print "In Channel Match Blacklist-Mode \"$$rContext{blackchannel}[$counter]\"\n" if ($debug & 64);
- if ($channel =~ /$$rContext{blackchannel}[$counter]/) {
- print "Channel rejected\n" if ($debug & 64);
- next;
- }
- }
-
- print "Before Timeframe Match\n" if ($debug & 64);
- if ($$rContext{timeframe}[$counter]) {
- print "In Timeframe Match \"$$rContext{timeframe}[$counter]\"\n" if ($debug & 64);
- my (@time, $time2, $ctime, $ctime2);
- @time = GetTime($time);
- $time2 = "$time[0]$time[1]";
-
- ($ctime, $ctime2) = split (/\-/,$$rContext{timeframe}[$counter]);
-
- if (!$ctime) {
- $ctime = "0";
- }
- if (!$ctime2) {
- $ctime2 = "2400";
- }
-
- if ($ctime < $ctime2) {
- if (!($time2 >= $ctime && $time2 <= $ctime2)) {
- print "Timeframe rejected 1\n" if ($debug & 64);
- next;
- }
- }
- else {
- if (!(($time2 >= $ctime && $time2 <= "2400") || ($time2 >= "0" && $time2 <= $ctime2))) {
- print "Timeframe rejected 2\n" if ($debug & 64);
- next;
- }
- }
- }
-
- print "Before Weekday Match\n" if ($debug & 64);
- if ($$rContext{weekday}[$counter]) {
- print "In Weekday Match \"$$rContext{weekday}\"\n" if ($debug & 64);
- my ($wday);
- $wday = getWDay($time);
- $$rContext{weekday}[$counter] =~ /(.)(.)(.)(.)(.)(.)(.)/;
- if ($$wday eq "-") {
- print "Weekday rejected\n" if ($debug & 64);
- next;
- }
- }
-
- print "Before Minlength Match\n" if ($debug & 64);
- if ($$rContext{minlength}[$counter]) {
- print "In Minlength Match \"$$rContext{minlength}[$counter]\"\n" if ($debug & 64);
- if ($Program{$title}{$channel}{$time}{duration} < $$rContext{minlength}[$counter]) {
- print "Minlength rejected\n" if ($debug & 64);
- next;
- }
- }
-
- print "Before Maxlength Match\n" if ($debug & 64);
- if ($$rContext{maxlength}[$counter]) {
- print "In Maxlength Match \"$$rContext{maxlength}[$counter]\"\n" if ($debug & 64);
- if ($Program{$title}{$channel}{$time}{duration} > $$rContext{maxlength}[$counter]) {
- print "Maxlength rejected\n" if ($debug & 64);
- next;
- }
- }
-
- # All test passed. Accept this timer
- print "All Tests passed entry accepted/blacklisted\n" if ($debug & 64);
- return ($counter);
- }
- # Foreach ran out without a hit
- return "Nothing";
-}
-
-# Open the connection to VDR
-sub initsocket {
- my ($Dest, $Port) = split (/\:/,$Dest[$currentVDR - 1],2);
- my $iaddr = inet_aton($Dest);
- my $paddr = sockaddr_in($Port, $iaddr);
- my $Timeout = 10; # max. seconds to wait for response
-
- $SIG{ALRM} = sub { die("Timeout while connecting to VDR"); };
- alarm($Timeout);
-
- socket(SOCKET, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
- connect(SOCKET, $paddr) or die ("Can't connect to VDR\n");
- select(SOCKET); $| = 1;
- select(STDOUT);
-
- while (<SOCKET>) {
- last if substr($_, 3, 1) ne "-";
- }
- alarm(0);
-}
-
-# Send a command to VDR and read back the result
-sub GetSend {
- my ($command, @retval);
-
- while ($command = shift) {
- print SOCKET "$command\r\n";
- while (<SOCKET>) {
- s/\x0d//g;
- (@retval) = (@retval, $_);
- last if substr($_, 3, 1) ne "-";
- }
- }
- return (@retval);
-}
-
-# Close the socket to VDR
-sub closesocket {
- print SOCKET "Quit\r\n";
- close(SOCKET);
-}
-
-
-# Fetch the timers-List from VDR via SVDR and process it.
-sub fetchVDRTimers {
- my (@timers, $timer, $position, $active, $channel, $day, $start, $end, $prio, $lifetime, $title, $subtitle, $minute, $duration);
- my ($utime, $utime2);
-
- # First fetch the timers-list from VDR
- @timers = GetSend ("lstt");
-
- foreach $timer (@timers) {
- chomp $timer;
- # a Valid Timer-line beginns with "250"
- if ($timer =~ s/250-|250\s//) {
- # Extract the Position in front of the line
- ($position, $timer) = split (/\s/,$timer,2);
-
-# print "Position: \"$position\" Timer: \"$timer\"\n";
- # Split the : seperated values
- ($active, $channel, $day, $start, $end, $prio, $lifetime, $title, $subtitle) = split (/\:/,$timer,9);
-
- my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
-
- # If the string is exactly 7 char wide, then its a "repeating"-timer
- if ($active >= 1) {
- if ($day =~ /(.)(.)(.)(.)(.)(.)(.)/) {
- my (@days);
- @days = ($1, $2, $3, $4, $5, $6, $7);
- ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
-
- $start =~ /(\d\d)(\d\d)/;
- $hour = $1;
- $minute = $2;
- $utime = timelocal 0, $minute, $hour, $mday, $mon, $year;
- $end =~ /(\d\d)(\d\d)/;
- $hour = $1;
- $minute = $2;
- $utime2 = timelocal 0, $minute, $hour, $mday, $mon, $year;
- if ($end < $start) {
- $utime2 += 24*60*60;
- }
- $duration = $utime2 - $utime;
-
- # "Normalize" the timestamp to monday
- $utime = $utime - ($wday * 24 * 60 *60);
-
- foreach my $num (0 .. $#days) {
- if ($days[$num] ne "-") {
- my $utime3;
- # Days before today will be shifted in the next week
- if (($num + 1) < $wday) {
- $utime3 = $utime + (($num + 7 + 1) * 24 * 60 * 60);
- }
- else {
- $utime3 = $utime + (($num + 1) * 24 * 60 * 60);
- }
- &addtimer ($title,$title,$subtitle,"",$channels[$channel],$utime3,$duration,$prio,$lifetime,"R$position",0,0);
- }
- }
- }
-
- # When the Day-Value is between 1 and 31, then its a "One time" Timer
- elsif (($day >= 1) && ($day <= 31)) {
- if ($active == "2") {
- $position += 1000000;
- }
- # When the Day is before the Current-Day, then the Timer is for the next month
- if ($day < $mday) {
- $mon++;
- if ($mon == 12) {
- $mon = 0;
- $year ++;
- }
- }
- $start =~ /(\d\d)(\d\d)/;
- $hour = $1;
- $minute = $2;
- $utime = timelocal 0, $minute, $hour, $day, $mon, $year;
- $end =~ /(\d\d)(\d\d)/;
- $hour = $1;
- $minute = $2;
- $utime2 = timelocal 0, $minute, $hour, $day, $mon, $year;
- if ($end < $start) {
- $utime2 += 24*60*60;
- }
- $duration = $utime2 - $utime;
-
- &addtimer ($title,$title,$subtitle,"",$channels[$channel],$utime,$duration,$prio,$lifetime,$position,0,0);
- }
- }
- }
- }
-}
-
-# Parse file "epg.data"
-sub initepgdata {
- open (FI,"epg.data") or die ("Can't open file \"epg.data\"\n");
-
- while (<FI>) {
- # Begin Channel
- if (/^C\s(\d+)\s+(.+)/) {
- $channel=$2;
- while (<FI>) {
- # End Channel
- if (/^c$/) {
- last;
- }
- # Begin Timer
- elsif (/^E\s(\d+)\s+(\d+)\s+(\d+)$/) {
- # Undef this Variables because it is possibel that not every timer uses this values
- undef $duration;
- undef $subtitle;
- undef $description;
- undef $category;
-
- $time=$2;
- $duration=$3;
- }
- # Title
- elsif (/^T\s(.*)/) {
- $title=$1;
- }
- # Subtitle
- elsif (/^S\s(.*)/) {
- $subtitle=$1;
- }
- # Description
- elsif (/^D\s(.*)/) {
- $description=$1;
- }
- elsif (/^K\s(.*)/) {
- $category=$1;
- }
- # End Timer
- elsif (/^e$/) {
- # Only accept timers that are in the future
- if ($time < time) {
- next;
- }
- # Only accept timers that are at least 2 Seconds long
- if ($duration <= 1) {
- next;
- }
-
- # Work around the different Bugs in the data
- &correct_epg_data();
-
- # Check if the Title & Subtitle is in the Done-List (Only if Subtitle exists)
- if ($subtitle && $title =~ /$title_done/ && $subtitle =~ /$subtitle_done/) {
- next;
- }
-
- $Program{$title}{$channel}{$time}{duration}=$duration;
- if ($subtitle) {
- $Program{$title}{$channel}{$time}{subtitle}=$subtitle;
- }
- if ($description) {
- $Program{$title}{$channel}{$time}{description}=$description;
- }
- if ($category) {
- $Program{$title}{$channel}{$time}{category}=$category;
- }
- # Check if the title is in the DEEP-Blacklist
- if (&testtimer("deepblack", $title, $channel, $time) ne "Nothing") {
- print "Deepblack: \"$title\"" if ($debug & 64);
- print " $subtitle" if ($debug & 64 && $subtitle);
- print "\n" if ($debug & 64);
- &delprogram ($title, $channel, $time);
- }
- }
- }
- }
- }
- close (FI);
-}
-
-# What is a Movie (When correctly stored into Subtitle)
-sub initmovie {
- my (@list,$list);
- open (FI,"${configdir}/subtitle-movie") or return;
- @list = <FI>;
- close(FI);
-
- foreach $list (@list) {
- chomp $list;
- }
- $subtitle_movie = join ('|',@list);
-}
-
-# What is already recorded/Should not be recorded
-sub initdone {
- my (@list,$list, %title_done, %subtitle_done, $title_temp, $subtitle_temp);
- open (FI,"${configdir}/done") or return;
- @list = <FI>;
- close (FI);
-
- foreach $list (@list) {
- chomp $list;
- ($title_temp,$subtitle_temp) = split (/\|/,$list);
- if ($title_temp) {
- $title_done{"^\Q$title_temp\E\$"} = 1;
- }
- if ($subtitle_temp) {
- $subtitle_done{"^\Q$subtitle_temp\E\$"} = 1;
- }
- }
- $title_done = join ('|',sort keys %title_done);
- $subtitle_done = join ('|',sort keys %subtitle_done);
-}
-
-sub processdone {
- # Now delete Timers in VDR that are already in the done-List
- my ($list, @list, $position, $timer, $active, $g, $title, $subtitle, $counter, @todel);
- $counter = 0;
- @list = GetSend ("LSTT");
-
- foreach $timer (@list) {
- chomp $timer;
- if ($timer =~ s/250-|250\s//) {
- ($position, $timer) = split (/\s/,$timer,2);
- # Split the : seperated values
- ($active, $g, $g, $g, $g, $g, $g, $title, $subtitle) = split (/\:/,$timer,9);
- if ($active == 2) {
- # Title: "Shakespeare in Love"||Subtitle: "Romanze"
- my ($ctitle, $csubtitle);
- if ($subtitle && $subtitle =~ /^Title\:\s\"(.*)\"\|\|Subtitle\:\s\"(.*)\"/) {
- $title = $1;
- $subtitle = $2;
- if ($subtitle) {
- my (@titles, @subtitles, $num, $hit);
- undef $hit;
- @titles = split (/\~/,$title);
- @subtitles = split (/\~/,$subtitle);
- foreach $num (0 .. $#titles) {
- if ($titles[$num] =~ /$title_done/ && $subtitles[$num] =~ /$subtitle_done/) {
- $hit = 1;
- }
- else {
- undef $hit;
- last;
- }
- }
-
- if ($hit) {
- my ($result);
- print "Delete Timer: $title $subtitle\n" if ($debug & 4);
- $position -= $counter;
- ($result) = GetSend ("DELT $position");
- print "Result: $result" if ($debug & 4);
- if ($result =~ /^250/) {
- $counter++;
- }
- }
- }
- }
- }
- }
- }
-}
-
-# What should be recorded
-sub inittorecord {
- my ($context) = shift;
- my ($rContext);
- my (@title_list, @subtitle_list, @description_list, $line);
- my (%Input);
- my $counter = 0;
-
- if ($context eq "torecord") {
- $rContext = \%torecord;
- open (FI,"${configdir}/${context}") or die ("Can't open file \"$context\"\n");
- } elsif ($context eq "deepblack") {
- $rContext = \%deepblack;
- open (FI,"${configdir}/${context}") or return;
- } else {
- die ("Illegal Context");
- }
-
-
- outer: while (<FI>) {
- chomp if ($_);
- if ($_ && !(/^\#/) && /^\[.*\]$/) {
- $line = $.;
- undef %Input;
- while (<FI>) {
- chomp;
- if ($_ && !(/^\#/)) {
- if (/^\[.*?\]$/) {
- last;
- }
-
- my ($key, $value);
- ($key, $value) = split (/\s+=\s+/);
-
- if ($key =~ /^title$/i) {
- if ($Input{title}) {
- $Input{title} .= "|$value";
- } else {
- $Input{title} = $value;
- }
- print "Titel = $value\n" if ($debug & 16);
- }
- elsif ($key =~ /^subtitle$/i) {
- if ($Input{subtitle}) {
- $Input{subtitle} .= "|$value";
- } else {
- $Input{subtitle} = $value;
- }
- print "Subtitel = $value\n" if ($debug & 16);
- }
- elsif ($key =~ /^description$/i) {
- if ($Input{description}) {
- $Input{description} .= "|$value";
- } else {
- $Input{description} = $value;
- }
- print "Description = $value\n" if ($debug & 16);
- }
- elsif ($key =~ /^category$/i) {
- $Input{category} = $value;
- print "Category = $value\n" if ($debug & 16);
- }
- elsif ($key =~ /^channel$/i) {
- if ($Input{channel}) {
- $Input{channel} .= "|^$value\$";
- } else {
- $Input{channel} = $value;
- }
- print "Channel = $value\n" if ($debug & 16);
- }
- elsif ($key =~ /^timeframe$/i) {
- $Input{timeframe} = $value;
- print "Timeframe = $value\n" if ($debug & 16);
- }
- elsif ($key =~ /^weekday$/i) {
- $Input{weekday} = $value;
- print "Weekday = $value\n" if ($debug & 16);
- }
- elsif ($key =~ /^minlength$/i) {
- $Input{minlength} = $value;
- print "Minlength = $value\n" if ($debug & 16);
- }
- elsif ($key =~ /^maxlength$/i) {
- $Input{maxlength} = $value;
- print "Maxlength = $value\n" if ($debug & 16);
- }
- elsif ($key =~ /^prio$/i) {
- $Input{prio} = $value;
- print "Prio = $value\n" if ($debug & 16);
- }
- elsif ($key =~ /^lifetime$/i) {
- $Input{lifetime} = $value;
- print "Lifetime = $value\n" if ($debug & 16);
- }
- elsif ($key =~ /^timertitle$/i) {
- $Input{timertitle} = $value;
- print "Timertitel = $value\n" if ($debug & 16);
- }
- elsif ($key =~ /^margin$/i) {
- $Input{margin} = $value;
- print "Margin = $value\n" if ($debug & 16);
- }
- elsif ($key =~ /^instance$/i) {
- $Input{instance} = $value;
- print "Instance = $value\n" if ($debug & 16);
- } else {
- print "Unkown Key: \"$key\" with Value: \"$value\"\n";
- }
- }
- }
-
- # Accept entry only if it is for the current instance or for "no" instance
- if (($Opts{s} && $Input{instance} && $Input{instance} eq "s") || !$Input{instance} || ($Input{instance} ne "s" && $Input{instance} == $currentVDR)) {
- # Accept entry only if at least a Title/Subtitle/Description is provied
- if (!$Input{title} && !$Input{subtitle} && !$Input{description}) {
- print "No Title/Subtitle/Description Field. $context entry ignored. Block beginning at Line $line\n";
- redo outer;
- }
-
- if ($Input{title}) {
- $$rContext{title}[$counter] = $Input{title};
- $title_list[$#title_list + 1] = $Input{title};
- }
- if ($Input{subtitle}) {
- if ($Input{subtitle} =~ /^movie$/i || $Input{subtitle} =~ /^\!movie$/i) {
- $test_subtitle_movie = 1;
- }
- $$rContext{subtitle}[$counter] = $Input{subtitle};
- $subtitle_list[$#subtitle_list + 1] = $Input{subtitle};
- }
- if ($Input{description}) {
- $$rContext{description}[$counter] = $Input{description};
- $description_list[$#description_list + 1] = $Input{description};
- }
- if ($Input{category}) {
- $$rContext{category}[$counter] = $Input{category};
- }
- if ($Input{channel}) {
- if ($Input{channel} =~ /\!/) {
- $Input{channel} =~ s/\!//g;
- $$rContext{blackchannel}[$counter] = $Input{channel};
- } else {
- $$rContext{channel}[$counter] = $Input{channel};
- }
- }
- if ($Input{timeframe}) {
- $$rContext{timeframe}[$counter] = $Input{timeframe};
- }
- if ($Input{weekday}) {
- $$rContext{weekday}[$counter] = $Input{weekday};
- }
- if ($Input{minlength}) {
- if ($Input{minlength} =~ /^(\d+)m$/) {
- $Input{minlength} = $1 * 60
- } elsif ($Input{minlength} =~ /^(\d+)h$/) {
- $Input{minlength} = $1 * 60 * 60
- }
- $$rContext{minlength}[$counter] = $Input{minlength};
- }
- if ($Input{maxlength}) {
- if ($Input{maxlength} =~ /^(\d+)m$/) {
- $Input{maxlength} = $1 * 60
- } elsif ($Input{maxlength} =~ /^(\d+)h$/) {
- $Input{maxlength} = $1 * 60 * 60
- }
- $$rContext{maxlength}[$counter] = $Input{maxlength};
- }
- if ($Input{prio}) {
- $$rContext{prio}[$counter] = $Input{prio};
- }
- if ($Input{lifetime}) {
- $$rContext{lifetime}[$counter] = $Input{lifetime};
- }
- else {
- $$rContext{prio}[$counter] = $default_prio;
- }
- if ($Input{timertitle}) {
- $$rContext{timertitle}[$counter] = $Input{timertitle};
- }
- if ($Input{margin}) {
- my ($start, $stop);
- ($start, $stop) = split (/;/,$Input{margin}, 2);
- $$rContext{marginstart}[$counter] = $start if ($start);
- $$rContext{marginstop}[$counter] = $stop if ($stop);
- }
- # Set Default-Margins if no margins defined
- $$rContext{marginstart}[$counter] = $marginstart if (!$$rContext{marginstart}[$counter]);
- $$rContext{marginstop}[$counter] = $marginstop if (!$$rContext{marginstop}[$counter]);
- $counter++;
- if ($Input{instance}) {
- $$rContext{instance}[$counter] = $Input{instance};
- }
- }
- redo outer;
- }
- }
-
- $$rContext{timercount} = $counter - 1;
-
- $$rContext{titleRE} = join ('|',@title_list);
- if ($$rContext{titleRE} && $$rContext{titleRE} =~ /\|.\|/) {
- $$rContext{titleRE} = ".";
- }
- $$rContext{subtitleRE} = join ('|',@subtitle_list);
- if ($$rContext{subtitleRE} && $$rContext{subtitleRE} =~ /\|.\|/) {
- $$rContext{subtitleRE} = ".";
- }
- $$rContext{descriptionRE} = join ('|',@description_list);
- if ($$rContext{descriptionRE} && $$rContext{descriptionRE} =~ /\|.\|/) {
- $$rContext{descriptionRE} = ".";
- }
-
- if (!$$rContext{titleRE}) {
- $$rContext{titleRE} = "^Dieseshierwirdgarantiertnieundnimmeraufirgendetwassinnvollesmatchen\$";
- }
- if (!$$rContext{subtitleRE}) {
- $$rContext{subtitleRE} = "^Dieseshierwirdgarantiertnieundnimmeraufirgendetwassinnvollesmatchen\$";
- }
- if (!$$rContext{descriptionRE}) {
- $$rContext{descriptionRE} = "^Dieseshierwirdgarantiertnieundnimmeraufirgendetwassinnvollesmatchen\$";
- }
-}
-
-# Parse "LSTC"-Command of VDR
-sub initchannellist {
- my ($counter, $chan, $garbage, $card, @temp_channels, $temp, $i);
-
- @temp_channels = GetSend ("LSTC");
-
- foreach $i (0 .. $#temp_channels) {
- $temp = $temp_channels[$i];
- chomp $temp;
-
- if ($temp =~ s/250-|250\s//) {
- ($counter, $temp) = split (/\s/,$temp,2);
- ($chan, $garbage,$garbage, $garbage, $garbage, $garbage, $garbage, $card, $garbage) = split (/\:/,$temp);
- $channels[$counter] = $chan;
- $channels{$chan}{number} = $counter;
- $channels{$chan}{card} = $card;
- $counter++;
- }
- }
-}
-
-sub initconfigfile {
- open (FI,"${configdir}/config") or return;
- while (<FI>) {
- s/\#.*//;
- chomp;
- if ($_) {
- my ($key, $value);
- ($key, $value) = split (/\s+=\s+/);
- if ($key =~ /^debug$/i) {
- $debug = $value;
- print "Debug-Level = $value\n" if ($debug & 16);
- }
- elsif ($key =~ /^marginstart$/i) {
- print "Marginstart = $value\n" if ($debug & 16);
- $marginstart = $value;
- }
- elsif ($key =~ /^marginstop$/i) {
- print "Marginstop = $value\n" if ($debug & 16);
- $marginstop = $value;
- }
- elsif ($key =~ /^DVBCards$/i) {
- print "DVB_Cards = $value\n" if ($debug & 16);
- $DVB_cards = $value;
- }
- elsif ($key =~ /^defaultprio$/i) {
- print "Default Priority = $value\n" if ($debug & 16);
- $default_prio = $value;
- }
- elsif ($key =~ /^Dest$/i) {
- print "Destination Host/IP:Port = $value\n" if ($debug & 16);
- @Dest = split (/\s+/,$value);
- }
- elsif ($key =~ /^jointimers$/i) {
- print "Join Timers = $value\n" if ($debug & 16);
- $jointimers = $value;
- }
- elsif ($key =~ /^description$/i) {
- print "Description = $value\n" if ($debug & 16);
- $Description = $value;
- }
- else {
- print "Unkown Key: \"$key\" with Value: \"$value\"\n";
- }
- }
- }
- print "End Config\n" if ($debug & 16);
-}
-
-sub initcommandline() {
- my $Usage = qq{
-Usage: $0 [options] [Instance]...
-
-Options: -d hostname:Port hostname/ip:Port (localhost:2001)
- -c configdir Directory where all config files are located
- (~/.master-timer)
- -i instance Which VDR-Instance, from the config-file, should be
- used
- -s Print all series from epg.data and exit
- -v debuglevel Level of debug-messages to print
- -h This Help-Page
-};
-
- # Only process commandline if not already processed
- if (!$Opts{done}) {
- die $Usage if (!getopts("d:p:c:i:sv:h",\%Opts));
- }
- die $Usage if ($Opts{h});
- # Mark the options as already processed
- $Opts{done} = 1;
-
- if ($Opts{v}) {
- $debug = $Opts{v};
- }
- if ($Opts{i}) {
- $currentVDR = $Opts{i};
- }
- if ($Opts{d}) {
- @Dest = ($Opts{d});
- }
- if ($Opts{c}) {
- $configdir = $Opts{c};
- }
-}
-
-sub init {
- &initcommandline();
- &initconfigfile();
- # Process commandline a second time, so that configs from the config-file are overwritten
- &initcommandline();
- &initsocket();
- &initmovie();
- &initdone();
- &initchannellist();
- &inittorecord("deepblack");
- &initepgdata();
- &inittorecord("torecord");
-}
diff --git a/Tools/master-timer/process_summary.pl b/Tools/master-timer/process_summary.pl
deleted file mode 100755
index ebe6300..0000000
--- a/Tools/master-timer/process_summary.pl
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/usr/bin/perl -w
-
-$dir = "/home/ms/.master-timer";
-
-open (FI,"$dir/done") or die "Can't open \"done\"\n";
-while (<FI>)
- {
- chomp;
- if ($_)
- {
- ($title,$subtitle) = split (/\|/,$_,2);
- $Done{$title}{$subtitle}=1;
- }
- }
-close (FI);
-
-&traverse('/video');
-
-if ($hit)
- {
- rename ("$dir/done","$dir/done.bak");
- open (FO,">$dir/done");
- foreach $title (sort keys %Done)
- {
- foreach $subtitle (sort keys %{%Done->{$title}})
- {
- print FO "$title\|$subtitle\n";
- }
- }
- }
-
-sub traverse
- {
- local($dir) = shift;
- local($path);
- unless (opendir(DIR, $dir))
- {
- warn "Can't open $dir\n";
- closedir(DIR);
- return;
- }
- foreach (readdir(DIR))
- {
- next if $_ eq '.' || $_ eq '..';
- $path = "$dir/$_";
- if (-d $path) # a directory
- {
- &traverse($path);
- }
- if ($_ eq "summary.vdr")
- {
- open (FI,"$path") or die "Can't open \"$path\"\n";
- @lines = <FI>;
- close (FI);
- if ($lines[0] =~ /^Title\:\s\"(.*)\"/)
- {
- @titles = split (/\~/,$1);
- if ($lines[2] && $lines[2] =~ /^Subtitle\:\s\"(.*)\"/)
- {
- @subtitles = split (/\~/,$1);
- foreach $num (0 .. $#titles)
- {
- if ($titles[$num] && $subtitles[$num])
- {
- if (!$Done{$titles[$num]}{$subtitles[$num]})
- {
- $Done{$titles[$num]}{$subtitles[$num]}=1;
- $hit = 1;
- }
- }
- }
- }
- }
- }
- }
- closedir(DIR);
- }
-
-
diff --git a/Tools/master-timer/sample/channels-to-scan b/Tools/master-timer/sample/channels-to-scan
deleted file mode 100644
index 22f473d..0000000
--- a/Tools/master-timer/sample/channels-to-scan
+++ /dev/null
@@ -1,6 +0,0 @@
-1
-2
-3
-4
-5
-49
diff --git a/Tools/master-timer/sample/config b/Tools/master-timer/sample/config
deleted file mode 100644
index 3180943..0000000
--- a/Tools/master-timer/sample/config
+++ /dev/null
@@ -1,32 +0,0 @@
-# Master-Timer config file. Values shown here are defaults.
-
-# How many seconds "too early" should the timer begin
-marginstart = 600
-
-# How many seconds "too long" should the timer end
-marginstop = 600
-
-# When the Prio isn't provided in the config file use this value
-defaultprio = 50
-
-# How many DVB cards are installed in the computer (not used yet)
-DVBCards = 1
-
-# IP/Hostname:Port of the destination (space is used for delimiter)
-Dest = localhost:2001
-
-# Should timers on the same channels be joined when they overlap (0 = off)
-jointimers = 0
-
-# Should the description be transfered to VDR?
-description = 0
-
-# Debug level
-# 1 : Dump "torecord"
-# 2 : Dump all timers
-# 4 : Show when a timer will be deleted
-# 8 : Dump the "Done" REs
-# 16 : Verbose config reading
-# 32 : Dump program variables
-# 64 : Excessive deepblack/torecord debuging
-debug = 0
diff --git a/Tools/master-timer/sample/convert-channel-list b/Tools/master-timer/sample/convert-channel-list
deleted file mode 100644
index a97f3c5..0000000
--- a/Tools/master-timer/sample/convert-channel-list
+++ /dev/null
@@ -1,26 +0,0 @@
-Kabel 1|Kabel 1
-MTV|MTV Central
-PRW 13TH Street|13th Street
-PRW Discovery Channel|Discovery Channel
-PRW Disney Channel|Disney Channel
-PRW FOX KIDS|Fox Kids
-PRW Junior|Junior
-PRW K-Toon|K-Toon
-PRW Krimi & Co|Krimi &Co
-PRW Planet|Planet
-PRW Sci-Fantasy|Premiere Sci-Fi
-PRW Studio Universal|Studio Universal
-PRW Sunset|Sunset
-Premiere Action|Premiere Action
-Premiere Comedy|Premiere Comedy
-Premiere STAR|Premiere Star
-Premiere World 1|Premiere 1
-Premiere World 2|Premiere 2
-Premiere World 3|premiere 3
-Pro Sieben|Pro-7
-RTL|RTL
-RTL 2|RTL2
-Sat.1|Sat.1
-Super RTL|Super RTL
-Viva|VIVA
-Vox|VOX
diff --git a/Tools/master-timer/sample/deepblack b/Tools/master-timer/sample/deepblack
deleted file mode 100644
index 12884fe..0000000
--- a/Tools/master-timer/sample/deepblack
+++ /dev/null
@@ -1,172 +0,0 @@
-# [<Anytext>]
-# This marks the beginning of a deepblack-entry
-# Title = <text>
-# This matches a title
-# Subtitle = <text>
-# This matches a subtitle
-# Description = <text>
-# This matches a description
-# Category = <left>/<right>
-# This matches a DTV-Category
-# Channel = <Channel>
-# Restricts a deepblack-entry to a specific channel.
-# A single "!" at start of channel list negates the selection.
-# Timeframe = <begin>-<end>
-# Restricts a deepblack-entry to a specific timeframe.
-# No timers with start time in the timeframe will be programmed.
-# minlength = <Number>
-# Restricts a deepblack-entry to a specific minimum length
-# (postfix "m" for minutes, "h" for hours.)
-# maxlength = <Number>
-# Restricts a deepblack-entry to a specific maximum length
-# (postfix "m" for minutes, "h" for hours.)
-# weekday = MTWTFSS
-# Restricts a deepblack-entry to a specific weekday
-# instance = <Number>
-# Only apply this deepblack-entry for a specific Instance
-# "s" is a special value used for "-s"-Mode
-#
-# The "Title", "Subtitle", "Description", "Channel"-Lines can be
-# supplied any number of times for a specific entry
-#
-# To deepblack something at least one of the "Title", "Subtitle" or
-# "Description" (If you don't have anything "better" use "Title = ."
-# for this matches everything) fields has to be provided.
-# These three fields are "include" and the rest are "exclude" fields.
-
-[Blacklist all Talkshows]
-Title = .
-Category = Talk
-
-[Blacklist all Lifestyles]
-Title = .
-Category = /Lifestyles
-
-[Blacklist Sport/Tennis]
-Title = .
-Category = Sport/Tennis
-
-[Record only ZDF and Pro7]
-Title = .
-Channel = !ZDF
-Channel = ProSieben
-
-[Blacklist a timeframe]
-Title = .
-Timeframe = 1000-1400
-
-[Blacklist everything with less than 5 minutes duration]
-Title = .
-maxlength = 5m
-
-[Sinnlose Serien]
-Title = Für alle Fälle Stefanie
-Title = Chicago Hope - Endstation Hoffnung
-Title = Chicago Hope
-Title = Doppelter Einsatz
-Title = Dr. Stefan Frank - Der Arzt, dem die Frauen vertrauen
-Title = Ehekriege
-Title = Ein Bayer auf Rügen
-Title = Emergency Room
-Title = Gute Zeiten, schlechte Zeiten
-Title = Hallo, Onkel Doc!
-Title = Hercules
-Title = Hinter Gittern - Der Frauenknast
-Title = OP ruft Dr. Bruckner
-Title = Wolffs Revier
-Title = alphateam
-Title = SK Kölsch
-Title = ^Becker$
-Title = Kommissar Rex
-Title = Nur die Liebe zählt
-Title = Unsere kleine Farm
-Title = Die Waltons
-Title = ^Die Zwei$
-
-[Glueckspiele]
-Title = Die Quiz Show
-Title = Glücksrad
-Title = Jeder gegen Jeden
-Title = Kochduell
-
-[Infotainment und Boulevardzeug]
-Title = 'MAX' - Das ganze Leben!
-Title = ^BIZZ$
-Title = Big Brother
-Title = GIRLSCAMP
-Title = Call TV
-Title = DIE REDAKTION
-Title = EXCLUSIV
-Title = EXTRA
-Title = Explosiv - Das Magazin
-Title = K1 DIE REPORTAGE
-Title = K1 Das Magazin
-Title = PROSIEBEN REPORTAGE
-Title = Fit For Fun TV
-Title = peep!
-Title = s.a.m.
-Title = taff.
-Title = ^blitz$
-Title = Die Harald Schmidt Show
-Title = Spiegel TV-Reportage
-
-[Nachrichten]
-Title = 10 vor 11
-Title = 17:30 live
-Title = 18:30
-Title = 24 Stunden
-Title = Punkt 12
-Title = Punkt 6
-Title = Punkt 9
-Title = RTL II News
-Title = RTL aktuell
-Title = RTL-Nachtjournal
-Title = K1 Nachrichten
-Title = Nachrichten
-
-[Talkshows]
-Title = Andreas Türck
-Title = Arabella
-Title = Britt - Der Talk um Eins
-Title = Bärbel Schäfer
-Title = Die Oliver Geissen Show
-Title = Peter Imhof
-Title = Vera am Mittag
-Title = Hans Meiser
-Title = Nicole - Entscheidung am Nachmittag
-Title = Franklin
-
-[So richtig Sinnloses]
-Title = Dauerwerbesendungen
-Title = Infomercials
-Title = Kickers
-Title = RTL SHOP
-Title = SAT.1-FRÜHSTÜCKSFERNSEHEN
-Title = Zapping
-
-[PREMIERE WORLD - Das Programm]
-Title = PREMIERE WORLD - Das Programm
-Title = Programm ab
-Title = Programm von
-
-[Fussball]
-Title = fussball
-Title = fußball
-Title = UEFA Champions
-
-#Sonstiges
-[^Sieben$]
-Title = ^Sieben$
-
-[Starporträt Kevin Spacey]
-Title = Starporträt Kevin Spacey
-
-
-[All Movies for -s]
-Subtitle = MOVIE
-Instance = s
-
-[All >= 65m for -s]
-Title = .
-minlength = 65m
-Instance = s
diff --git a/Tools/master-timer/sample/done b/Tools/master-timer/sample/done
deleted file mode 100644
index 76819c7..0000000
--- a/Tools/master-timer/sample/done
+++ /dev/null
@@ -1 +0,0 @@
-Alles Routine|Komödie
diff --git a/Tools/master-timer/sample/subtitle-movie b/Tools/master-timer/sample/subtitle-movie
deleted file mode 100644
index 9bd3579..0000000
--- a/Tools/master-timer/sample/subtitle-movie
+++ /dev/null
@@ -1,52 +0,0 @@
-^Abenteuerfilm$
-^Actionfilm$
-^Actionkomödie$
-^Actionthriller$
-^Agentenfilm$
-^Beziehungskomödie$
-^Biografie$
-^Biographie$
-^Computeranimation$
-^Drama$
-^Episodenfilm$
-^Erotikfilm$
-^Familiendrama$
-^Fantasy$
-^Fantasykomödie$
-^Fantasy-Komödie$
-^Gangsterfilm$
-^Gerichtsfilm$
-^Gesellschaftsdrama$
-^Historiendrama$
-^Horrorfilm$
-^Horrorkomödie$
-^Jugenddrama$
-^Kinderfilm$
-^Komödie$
-^Kriegsfilm$
-^Krimikomödie$
-^Kriminalfilm$
-^Liebesfilm$
-^Liebeskomödie$
-^Melodram$
-^Melodrama$
-^Monumentalfilm$
-^Musical$
-^Politthriller$
-^Psychothriller$
-^Road Movie$
-^Romanze$
-^Satire$
-^Science-Fiction$
-^Science-Fiction-Komödie$
-^Spielfilm$
-^TV Movie$
-^TV-Drama$
-^Teil .$
-^Teil 0.$
-^Thriller$
-^Tragikomödie$
-^Western$
-^Westernkomödie$
-^Zeichentrick$
-^Zeichentrickkomödie$
diff --git a/Tools/master-timer/sample/torecord b/Tools/master-timer/sample/torecord
deleted file mode 100644
index 0c97b91..0000000
--- a/Tools/master-timer/sample/torecord
+++ /dev/null
@@ -1,90 +0,0 @@
-# [<Anytext>]
-# This marks the beginning of a timer entry
-# Title = <text>
-# This matches a title
-# Subtitle = <text>
-# This matches a subtitle.
-# You may use the magic "MOVIE" or "!MOVIE" which matches
-# all entries from file "subtitle-movie".
-# Description = <text>
-# This matches a description
-# Category = <left>/<right>
-# This matches a DTV-Category
-# Channel = <Channel>
-# Restricts a time to a specific channel.
-# A single "!" at start of channel list negates the selection.
-# Timeframe = <begin>-<end>
-# Restricts timer to a specific timeframe.
-# Only timers with start time in the timeframe will be programmed.
-# minlength = <Number>
-# Restricts timer entry to a specific minimum length
-# (postfix "m" for minutes, "h" for hours.)
-# maxlength = <Number>
-# Restricts a timer entry to a specific maximum length
-# (postfix "m" for minutes, "h" for hours.)
-# weekday = MTWTFSS
-# Restricts a timer to a specific weekday
-# Timertitle = <text>
-# The title used for this timer.
-# If this is not provided "Title" will be used.
-# If "Title" is not provided the EPG title will be used.
-# Margin = <Number>;<Number>
-# Seconds added to the beginning and end of the timer.
-# Positive numbers will lengthen the recording.
-# instance = <Number>
-# The instance of VDR for which this timer is.
-# If this is not provided the timer is valid for ALL instances.
-#
-# The "Title", "Subtitle", "Description", "Channel"-Lines can be
-# supplied any number of times for a specific entry
-#
-# To record something at least one of the "Title", "Subtitle" or "Description"
-# fields has to be provided. These three fields are "include" and the rest are
-# "exclude" fields!
-
-[Dies ist ein Test-Timer]
-Title = Titel
-Subtitle = Subtitel
-Description = Description
-Category = Serie/Krimi
-Channel = Pro-7
-Channel = VIVA
-Timeframe = 1230-1830
-Prio = 50
-Lifetime = 50
-minlength = 10m
-maxlength = 3h
-weekday = ---T---
-Timertitle = Test
-Margin = 600;600
-instance = 2
-
-# Record Babylon 5 only if NOT playing on Pro 7;
-# recording starts one minute too early and ends
-# one minute too early (to skip following ads).
-[Babylon 5]
-Title = Babylon 5
-Channel = !Pro-7
-Prio = 99
-Margin = 60;-60
-
-[DS9]
-Title = Deep Space Nine
-Prio = 99
-Timertitle = DS9
-Margin = 60;-60
-
-[Seven Days]
-Title = Seven Days
-Prio = 99
-
-[Stargate]
-Title = Stargate
-Prio = 99
-
-[Aniston]
-Description = Aniston
-Prio = 99
-
-[Matrix]
-Title = Matrix
diff --git a/Tools/master-timer/scan-channels b/Tools/master-timer/scan-channels
deleted file mode 100755
index 324181b..0000000
--- a/Tools/master-timer/scan-channels
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/sh
-old=`svdrpsend.pl chan | grep 250 | cut -d " " -f2`
-for dat in `cat $HOME/.master-timer/channels-to-scan`
-do
- svdrpsend.pl "chan $dat"
- sleep 30s
-done
-svdrpsend.pl "chan $old"