=encoding utf8

=for syntax specification:
https://perldoc.perl.org/perlpod

=head1 NAME

F<EPGSearch> – Suchtimer und Ersatz für das Standard-Programm-Menü des VDR

=head1 BESCHREIBUNG

EPGSearch kann als Ersatz für das übliche Programm-Menü des VDR verwendet
werden. Es sieht zwar genauso aus, erweitert es aber um einige zusätzliche
Funktionen:

=over 2

=item * Im Hauptmenü kann die normale Programmübersicht des VDR durch
einen erweiterten Programmführer ersetzt werden.

=item * Der Programmführer erlaubt den Wechsel zwischen den nächsten
und den gerade laufenden Sendungen.

=item * Neben den zeitnahen Sendungen erlaubt der Programmführer die
Anzeige von Sendungen für bis zu vier benutzerdefinierte Zeiten sowie
eine Übersicht selbstdefinierter Favoriten.

=item * Verschiebung der im Programmführer angezeigten Zeit per Tastendruck
(bspw. um 30 Minuten).

=item * Fortschrittsanzeige in der Programmübersicht für die laufenden
und die nächsten Sendungen.

=item * Integrierte Befehle, um etwa Wiederholungen von Sendungen anzuzeigen
oder Suchtimer für diese anzulegen. Zudem lassen sich eigene Befehle einbinden,
um beispielsweise VDRAdmin-Autotimer zu erstellen.

=item * Suche im EPG: Anlegen von wiederverwendbaren Abfragen, die auch
als Suchtimer verwendet werden können.

=item * Suchtimer: Hintergrundsuche nach zutreffenden Sendungen und
Anlegen entsprechender Timer (ähnlich der Autotimer von VDRAdmin)
oder Benachrichtigung über Sendungen per OSD.

=item * Unterstützung von Inhaltskennungen und erweiterten EPG-Informationen
in Suchtimern.

=item * Vermeidung von mehrfachen Aufnahmen der gleichen Sendung:

=over 2

=item – Timer-Vorschau

=item – Erkennung unbrauchbarer Aufnahmen

=item – Unscharfer Vergleich von Sendungen

=back

Z<>

=item * Erweiterung des Timer-Editieren-Menüs um Verzeichnisse, flexible
Auswahl von Wochentagen und Ergänzung von Untertiteln ("Episodennamen").

=item * Hintergrundüberwachung auf Timer-Konflikte in Verbindung mit
einem Timer-Konfliktmanager.

=item * Benachrichtigung über erkannte Timer-Konflikte per OSD.

=item * Detaillierte Anzeige der Timer-Konflikte und Unterstützung
bei deren Auflösung.

=item * E-Mail-Benachrichtigungen über Suchtimer-Aktualisierungen und
Timer-Konflikte.

=back

Teile der Quelltexte basieren auf dem F<Repeating-EPG>-Patch von Gerhard Steiner,
der die Erlaubnis gab, diese zu verwenden. Danke für seine Arbeit!

=head1 OPTIONEN

=over 4

=item B<−f> I<file>,  B<−−svdrpsendcmd>=I<file>

Pfad zu F<svdrpsend> für externe SVDRP-Kommunikation. Standard ist interne
Kommunikation, weshalb diese Option normalerweise nicht erforderlich ist.

=item B<−c> I<path>,  B<−−config>=I<path>

Festlegung eines eigenen Konfigurationsverzeichnisses für alle EPGSearch-Dateien
(Standard ist F<E<lt>Plugin-KonfigurationsverzeichnisE<gt>/epgsearch>).

=item B<−l> I<file>,  B<−−logfile>=I<file>

Festlegung eines abweichenden Dateipfades für das Log-File von EPGSearch.
Standard ist F<epgsearch.log> im Konfigurationsverzeichnis von EPGSearch.

=item -B<v> I<n>,  B<−−verbose>=I<n>

Detailgrad für das Log-File. Der Wert 0 bedeutet kein Logging. Weitere Werte sind
1 (allgemeine Meldungen), 2 (detaillierte Meldungen), 3 (für Debug-Zwecke).

=item B<−r>,  B<−−reloadmenuconf>

Bewirkt ein Neuladen der Datei F<epgsearchmenu.conf> bei jedem Plugin-Aufruf im
OSD. Dies kann für das Testen eines selbst angepassten Menü-Layouts praktisch sein.

=item B<−m> I<file>,  B<−−mailcmd>=I<file>

Externes Kommando für den E-Mail-Versand. Als Standard wird F<sendEmail.pl>
benutzt. Wenn ein abweichendes Kommando oder Skript verwendet werden soll, muss
sichergestellt sein, dass das gleiche Parameter-Interface verwendet wird wie
bei F<sendEmail.pl>.

=back

=head1 INHALT

=over 3

=item 1. Beschreibung

=over 4

=item 1.1 Menü C<Befehle>

=item 1.2 Menü C<Suche>

=over 6

=item 1.2.1 Menü C<Suche editieren>

=item 1.2.2 Menü C<Suchergebnisse>

=back

=item 1.3 Erweitertes C<Jetzt> und C<Nächste>

=item 1.4 Menü C<Einstellungen>

=over 6

=item 1.4.1 Allgemein

=item 1.4.2 EPG-Menüs

=item 1.4.3 Benutzerdefinierte EPG-Zeiten

=item 1.4.4 Timer-Programmierung

=item 1.4.5 Suche und Suchtimer

=item 1.4.6 Timer-Konfliktprüfung

=item 1.4.7 E-Mail-Benachrichtigung

=back

=back

=item 2. Suchtimer

=over 4

=item 2.1 Wiederholungen vermeiden im Detail

=item 2.2 Wie funktioniert der Vergleichstest zweier Sendungen?

=item 2.3 Wie und wo wird der Vergleichstest eingesetzt?

=over 6

=item 2.3.1 Wie verwenden?

=item 2.3.2 Wenn es nicht richtig funktioniert

=back

=back

=item 3. Verwendung der Suche durch andere Plugins oder Skripte

=item 4. Verwendung erweiterter EPG-Informationen

=item 5. Ersetzen des Standard-Programm-Menüs

=item 6. Add-ons

=back

=head1 1. Beschreibung

Auf den ersten Blick sieht EPGSearch wie das Programm-Menü des VDR aus.
Ein Tastendruck auf C<0> schaltet die Farbtasten um, so dass weitere
Funktionen erreicht werden können (die vorgegebene Zuweisung kann per
Setup angepasst werden).

=head2 1.1 Menü Befehle

Dieses Menü zeigt Befehle an, die auf den ausgewählten Menüeintrag
angewandt werden können. Es gibt acht vorgegebene Befehle:

=over 4

=item B<Wiederholungen>

Zeigt weitere Sendungen mit gleichem Titel.

=item B<Aufnehmen>

Legt einen Timer zum Aufnehmen der Sendung an.

=item B<Umschalten>

Schaltet zum Kanal der Sendung um.

=item B<Suche anlegen>

Schaltet zum Suchmenü und erzeugt eine Suche mit dem Namen der
aktuellen Sendung als Suchbegriff (um eine manuelle Erfassung
zu vermeiden).

=item B<Suche in Aufnahmen>

Durchsucht die Aufnahmen nach einer Sendung gleichen Namens.

=item B<Als 'bereits aufgezeichnet' markieren?>

Übernimmt die ausgewählte Sendung in die Datei F<epgsearchdone.data>
und weist EPGSearch an, diese Sendung nicht aufzunehmen, falls
der zugehörige Suchtimer auf C<Wiederholung vermeiden> gestellt ist. Ein
bereits erzeugter Timer wird beim nächsten Suchtimer-Update automatisch
gelöscht.

=item B<In/aus Umschaltliste?>

Zum Bearbeiten der Umschaltliste. Wenn eine Sendung in der Umschaltliste
enthalten ist, wird kurz vor Beginn eine Ankündigung eingeblendet und dann
umgeschaltet. Um die gesamte Umschaltliste einzusehen, bitte
C<Suche> » C<Aktionen> » C<Zeige Umschaltliste> aufrufen.

=item B<Ausschlussliste anlegen>

Eine Ausschlussliste wird verwendet, um bestimmte Sendungen bei der
Verwendung von Suchtimern zu ignorieren. Ein Suchtimer kann beliebige
Ausschlusslisten verwenden.

=back

Man kann eigene Befehle hinzufügen, indem man die Datei
F<epgsearchcmds.conf> im Konfigurationsverzeichnis von EPGSearch editiert. Eine
Beispieldatei mit exemplarischen Skripten liegt dem Plugin bei (siehe Unterverzeichnis
F<scripts>; sie stammt von C<vdr-wiki.de> – Dank an die Autoren).

Das Format der Datei ist identisch zur Datei F<commands.conf> oder F<reccmds.conf>
des VDR; siehe auch B<epgsearchcmds.conf>(5).

Wenn ein Befehl ausgeführt wird, werden folgende Parameter übergeben:

=over 4

=item B<$1>

Titel des Programmeintrags.

=item B<$2>

Startzeitpunkt des Programmeintrags in I<Epoch>-Notation
(Sekunden seit dem 01.01.1970, 00:00 UTC), wie auch beim Shutdown-Skript.

=item B<$3>

Endzeitpunkt des Programmeintrags in I<Epoch>-Notation
(Sekunden seit dem 01.01.1970, 00:00 UTC).

=item B<$4>

Kanalnummer des Programmeintrags.

=item B<$5>

Vollständiger Kanalname des Programmeintrags.

=item B<$6>

Untertitel des Programmeintrags oder ein leerer String, falls nicht vorhanden.

=back

Zum Ausführen eines Befehls aus dem Hauptmenü ohne Öffnen des
Befehlsmenüs genügt es, die zugehörige Nummer des Befehls zu drücken.

=head2 1.2 Menü C<Suche>

Hier kann man eine Suche im EPG erzeugen, editieren, löschen und
ausführen. Bedienung und Verhalten ist ähnlich wie im Timer-Menü des VDR.

=head3 1.2.1 Menü C<Suche editieren>

Das Meiste in diesem Menü ist selbsterklärend. Deshalb nur einige
Anmerkungen zu ausgewählten Elementen:

=over 4

=item B<Suche>

Der Suchbegriff. Bei der Suche nach mehreren Worten, sind diese mit
Leerzeichen zu trennen. Lässt man den Suchbegriff leer (in Verbindung
mit Suchmodus C<Ausdruck>), wird alles akzeptiert. Das kann praktisch
sein, um etwa alles zu suchen, was zu einer bestimmten Zeit auf
einem bestimmten Sender kommt.

Mit Taste C<Blau> kann man auch eine Vorlage für eine Suche
übernehmen. Falls eine Vorlage als Standard definiert wurde, wird
bei einer neuen Suche automatisch der Inhalt der Standard-Vorlage
verwendet.

B<Hinweis:> Die unscharfe Suche ist auf 32 Zeichen begrenzt!

=item B<Suchmodus>

Für die Suche stehen mehrere Varianten zur Auswahl:

=over 4

=item I<Ausdruck>

Sucht nach dem entsprechenden Ausdruck innerhalb eines EPG-Eintrags.

=item I<Alle Worte>

Erfordert, dass jedes Wort im EPG-Eintrag vorkommt.

=item I<Ein Wort>

Erfordert, dass zumindest eines der Worte im EPG-Eintrag enthalten ist.

=item I<Exakt>

Vergleicht den gesamten Suchbegriff mit dem EPG-Eintrag.
Dies ist vor allem praktisch bei kurzen Titeln, wie etwa "Alf".

=item I<Regulärer Ausdruck>

Erlaubt die Angabe eines regulären Ausdrucks zur Suche. Umschließende
Schrägstriche (C</>) sind nicht erforderlich.

Wenn im F<Makefile> des Plugins (was standardmäßig der Fall ist) die
automatische Konfiguration aktiviert ist (kein C<#> vor C<AUTOCONFIG = 1>),
werden bevorzugt Perl-kompatible reguläre Ausdrücke (PCRE) verwendet;
dies erfordert, dass F<libpcre> oder F<libpcre2> installiert wurden.
Alternativ werden POSIX-konforme, erweiterte reguläre Ausdrücke genutzt,
die auch näherungsweise Vergleiche erlauben; dies erfordert die Bibliothek
F<libtre>.

Ohne automatische Konfiguration muss im F<Makefile> des Plugins lediglich
C<#REGEXLIB = pcre2> in C<REGEXLIB = pcre2> geändert, die gewünschte
Bibliothek für reguläre Ausdrücke eingesetzt und das Plugin neu kompiliert
werden. Die benötigte Bibliothek muss vorher gegebenenfalls mit Hilfe der
Paketverwaltung des Systems noch installiert.

=item I<Unscharf>

Vergleicht den Suchbegriff anhand des Levenshtein-Distanz-Algorithmus.
Der Wert C<Toleranz> legt fest, wie groß die Abweichung sein darf.

=back

Eine Beschreibung des Suchprozesses findet sich in B<epgsearch>(4).

=item B<Inhaltskennungen verwenden>

Einige Provider liefern Kennungen für den Inhalt einer Sendung, wie etwa
C<Film/Drama>, C<Sport> und dergleichen. Solche Kennungen können
ab VDR 1.7.11 zur Suche ausgewählt werden. Dabei ist auch eine Mehrfachauswahl
möglich, wobei die Art der Übereinstimmung für jede Suche individuell
einstellbar ist.

Standardmäßig müssen alle ausgewählten Kennungen übereinstimmen
(UND-Verknüpfung); doch kann auch festgelegt werden, dass schon
eine einzige Übereinstimmung genügt (ODER-Verknüpfung). Da ähnliche
Inhaltskennungen in Gruppen gegliedert sind, lässt sich alternativ
festlegen, dass mindestens eine Übereinstimmung in jeder genutzten
Gruppe vorliegen muss (ODER-Verknüpfung innerhalb einer Gruppe,
UND-Verknüpfung zwischen den Gruppen).

Besondere Merkmale von Sendungen (wie etwa Originalsprache oder
schwarzweiß) werden zudem in einer von diesem Ähnlichkeitsschema
abweichenden Gruppe von Inhaltskennungen geführt. Für diese Gruppe
lässt sich getrennt festlegen, ob standardmäßig alle gewählten
Merkmale übereinstimmen müssen (UND-Verknüpfung) oder nur eines
davon (ODER-Verknüpfung).

=item B<Erweiterte EPG-Informationen verwenden>

Diese Option ist nur verfügbar, sofern erweiterte EPG-Informationen
konfiguriert wurden; siehe C<Erweiterter EPG-Informationen verwenden>
weiter unten.

=item B<Art der Übereinstimmung>

Standardmäßig müssen alle gewählten Kategorien im EPG enthalten sein und den
angegebenen Werten entsprechen. Wenn C<alle außer fehlende Kategorien> gewählt
ist, verhindert dies, dass eine Sendung aus dem Suchergebnis ausgeschlossen wird,
nur weil eine gewählte Kategorie im EPG nicht vorhanden ist. Alternativ kann per
C<mindestens eine Kategorie> festlegt werden, dass schon die Übereinstimmung
einer einzigen Kategorie ausreichend soll.

B<Vorsicht:> Ohne weiter eingrenzende Suchkriterien können die beiden alternativen
Einstellungen zu einer Flut von Timern führen.

=item B<Kanal verwenden>

Sucht nur im angegebenen Kanalbereich, der hinterlegten
Kanalgruppe oder in frei empfangbaren Sendern (FTA-Sender).

Kanalgruppen, wie etwa Sportsender oder Pay-TV-Kanäle, können
anhand eines Untermenüs erstellt und verwaltet werden, das mittels
der Taste C<Blau> aufgerufen wird.

B<Achtung:> Nach einer Änderung der Kanalreihenfolge sollten die
Bereichseinstellungen von Suchtimern unbedingt kontrolliert werden!

=item B<Wochentag verwenden>

Neben einzelnen Wochentagen kann auch eine benutzerdefinierte Auswahl
getroffen werden, um etwa nur montags und freitags zu suchen.

Die benutzerdefinierte Auswahl findet sich am Ende der Liste der Wochentage
(C<So.>, C<Mo.>, ..., C<Sa.>, benutzerdefiniert) und kann über die Taste C<Rot>
bearbeitet werden.

=item B<Ausschlusslisten verwenden>

Ausschlusslisten können benutzt werden, um unerwünschte Sendungen auszuschließen.
Hier können entweder nur globale bzw. eine, mehrere oder alle Ausschlusslisten
selektiert werden. Falls ein Suchergebnis auch in einer der gewählten Ausschlusslisten
erscheint, wird es verworfen.

=item B<Im Favoriten-Menü verwenden>

Nur verfügbar, wenn im Setup aktiviert. Mit dieser Option kann eine Suche zur
Verwendung im Favoritenmenü markiert werden. Dieses Menü listet alle Suchergebnisse
von Suchen mit dieser Option.

=item B<Layout des Ergebnis-Menüs>

Nur verfügbar, wenn mehr als eine Menüvorlage für Suchergebnisse in
F<epgsearchmenu.conf> angegeben wurde. Mit dieser Option kann ein anderes Layout
für die Suchergebnisse dieser Suche gewählt werden.

=item B<Als Suchtimer verwenden>

Falls C<ja>, sucht das Plugin im Hintergrund nach passenden Sendungen
und erzeugt für jede gefundene einen Timer (im Setup muss dazu C<Suchtimer
verwenden> aktiviert sein). Bei der Einstellung C<benutzerdefiniert> lässt sich
über die Taste C<Blau> ein Zeitfenster einstellen, in dem der Suchtimer
aktiv sein soll.

=item B<Aktion>

Die Standardaktion ist C<aufnehmen>, also das Erzeugen eines Timers für jedes
Suchergebnis. Man kann aber auch festlegen, dass nur eine Ankündigung
der Sendung per OSD vorgenommen werden soll, sobald diese gefunden wird.
Eine weitere Möglichkeit ist C<nur umschalten>, womit automatisch eine
Minute vor Beginn der Sendung auf deren Kanal gewechselt wird. Ebenso kann
mit C<ankündigen und umschalten> die Sendung vor ihrem Beginn angekündigt werden
und mit der Taste C<OK> daraufhin zum entsprechenden Kanal gewechselt werden.
Weitere Aktionen sind C<per E-Mail ankündigen> und C<inaktive Aufnahme>.

=item B<Serienaufnahme>

Falls C<ja>, werden die Aufzeichnungen in einem Ordner mit dem Titel als
Serienname gespeichert, wobei der Untertitel als Episodenname dient. Falls
ein Untertitel fehlt, werden ersatzweise Datum und Uhrzeit der Sendung als
Episodenname verwendet.

=item B<Verzeichnis>

Hier kann man ein Verzeichnis angeben, in dem die Aufzeichnung
gespeichert wird, wie etwa C<SciFi>. Mit der Taste C<Blau> kann ein
Verzeichnis gewählt werden, das bereits bei anderen Sucheinträgen
verwendet wird. Die Liste kann außerdem durch Einträge in der Datei
F<epgsearchdirs.conf> erweitert werden. Sie enthält jeweils ein
Verzeichnis pro Zeile ohne den vorausgehenden Pfad des Video-Verzeichnisses;
siehe auch B<epgsearch>(4).

Wenn man erweiterte EPG-Informationen von einem Provider erhält, können
im Verzeichnis-Eintrag auch Variablen wie C<%Genre%> oder C<%Category%>
verwendet werden. Diese werden durch die vorgefundenen erweiterten
EPG-Informationen ersetzt, sobald ein Timer erzeugt wird.

Siehe auch "Verwendung von Variablen im Verzeichniseintrag eines Suchtimers"
in B<epgsearch>(4).

=item B<Aufzeichnungen nach ... Tagen löschen>

Manche Aufzeichnungen sollen nur ein paar Tage existieren, wie etwa Nachrichten.
Mit diesem Feature kann man EPGSearch anweisen, dass es die Aufzeichnungen
automatisch nach einer bestimmten Zahl von Tagen löschen soll.

=item B<Pause, wenn ... Aufzeichnungen existieren>

Wenn die angegebene Anzahl von Aufzeichnungen existiert, pausiert
EPGSearch mit dem Erzeugen neuer Timer. Erst nach Löschen einer oder
mehrerer dieser Aufzeichnungen wird wieder nach neuen Sendungen gesucht.

=item B<Wiederholungen vermeiden>

Wenn man keine Wiederholungen aufnehmen will, versucht dieses Feature
festzustellen, ob eine Sendung bereits programmiert oder aufgezeichnet
wurde und überspringt diese dann. Bitte vor Verwendung weiter unten
den Abschnitt "Wiederholungen vermeiden im Detail" lesen.

=item B<Erlaubte Wiederholungen>

Will man eine gewisse Anzahl von Wiederholungen einer Sendung
erlauben, kann dies hier hinterlegt werden.

=item B<Nur innerhalb von ... Tagen>

Falls Wiederholungen nur innerhalb einer anzugebenden Anzahl von Tagen
erlaubt werden sollen, kann dies hier eingestellt werden. Der Wert 0
entspricht einer unbegrenzten Anzahl von Aufnahmen.

=item B<Titel vergleichen>

Legt fest, ob beim Test, ob eine Sendung identisch ist, der Titel
verglichen werden soll.

=item B<Untertitel vergleichen>

Legt fest, ob beim Test, ob eine Sendung identisch ist, auch der Untertitel
verglichen werden soll. Bei C<ja> stuft EPGSearch zwei Sendungen nur dann
als identisch ein, wenn die Untertitel gleich sind und nicht leer.

Bei C<falls vorhanden> können Sendungen auch identisch sein, wenn beide Untertitel leer
sind. Im Normalfall sollte dann besser C<nein> eingestellt werden.

=item B<Beschreibung vergleichen>

Legt fest, ob beim Test, ob eine Sendung identisch ist, auch die
Inhaltsbeschreibung verglichen werden soll.

Zum Vergleich zweier Inhaltsbeschreibungen werden zunächst alle Teile aus
den Inhalten entfernt, die Kategorienangaben gleichen könnten; die verbleibenden
Texte werden dann miteinander verglichen. Genügt der anhand des
Levenshtein-Distanz-Algorithmus ermittelte Prozentsatz an Übereinstimmung
dem in der folgenden Option angegebenen Wert, werden die Beschreibungen als
gleich betrachtet.

=item B<Minimale Übereinstimmung in %>

Die notwendige Übereinstimmung zweier Inhaltsbeschreibungen in Prozent.

=item B<Zeitpunkt vergleichen>

Manchmal wird eine Sendung häufig innerhalb einer gewissen Zeitspanne (Tag,
Woche, Monat usw.) wiederholt, ohne dass sich die einzelnen Sendungen anhand
des EPG-Inhalts unterscheiden lassen. Die Sendezeit ist somit die einzig
verwertbare Information. Für den Vergleich kann hier die entsprechende
Zeitspanne auswählt werden, um die Wiederholungen zu ignorieren.

=item B<Kategorien vergleichen>

Über die Schaltfläche C<Einstellungen> kann angegeben werden, welche der
erweiterten EPG-Kategorien ebenfalls miteinander verglichen werden sollen.
Wie schon bei den Untertiteln gilt eine Sendung als unterschiedlich, wenn
sie keine entsprechende Kategorie aufweist.

=item B<Priorität, Lebensdauer, Vor- und Nachlauf>

Jeder Suchtimer kann für diese Parameter eigene Einstellungen
haben. Die Voreinstellung wird im Setup vorgenommen.

=item B<VPS verwenden>

Nutzt VPS, falls im VDR-Setup aktiv und die gefundene
Sendung über VPS-Daten verfügt.

=item B<Automatisch löschen>

Zum automatischen Löschen eines Suchtimers anhand folgender Bedingungen:

=over 2

=item * nach ... Aufnahmen

=item * nach ... Tagen nach der ersten Aufnahme

=back

Gezählt werden dabei nur erfolgreiche Aufnahmen. Das Löschen erfolgt
direkt nach dem Ende der entsprechenden Aufnahme.

=back

Um den Status C<Als Suchtimer verwenden> zu ändern, ohne das Menü zu
öffnen, kann die Taste C<2> verwendet werden. Dies ruft direkt den
zweiten Befehl im Befehlsmenü auf.

=head3 1.2.2 Menü C<Suchergebnisse>

Dieses Menü zeigt die Suchergebnisse an. Ein C<T> sagt aus, dass es
zu diesem Eintrag bereits einen Timer gibt, ein C<t>, dass es nur
teilweise aufgenommen wird, also wie im Standard-Programm-Menü.

=head2 1.3 Erweitertes C<Jetzt> und C<Nächste>

Im Setup können bis zu vier zusätzliche Zeiten als Erweiterung zu C<Jetzt>
und C<Nächste> angegeben werden, um die Auswahl für die Taste C<Grün> zu
erweitern, beispielsweise C<Nachmittag>, C<Abend> oder C<Nacht>. Bereits
verstrichene Zeiten werden übersprungen, sodass man etwa am Abend kein
C<Nachmittag> mehr angeboten bekommt. Liegt aber ein Zeitpunkt nicht mehr
als 20 Stunden in der Zukunft, wird das Menü des nächsten Tages angezeigt.

In diesem Menü kann die aktuell angezeigte Zeit durch Drücken auf
C<FRew> und C<FFwd> nach hinten oder vorne verschoben werden. Falls
diese Tasten auf der Fernbedienung nicht existieren, kann die Funktion
durch Umschalten mit C<0> erreicht werden. Die Tasten C<Grün> und C<Gelb>
wechseln dann zu C<E<lt>E<lt>> und C<E<gt>E<gt>>. Das Umschalten kann
über das Setup angepasst werden.

Zudem lässt sich ein Fortschrittsbalken ins Menü C<Jetzt> / C<Nächste>
einblenden.

Des Weiteren kann in den Einstellungen ein Favoriten-Menü zugeschaltet werden.
Für eine Suche lässt sich mittels C<Im Favoriten-Menü verwenden> festgelegen,
dass die Suchergebnisse dort angezeigt werden sollen. Das Favoriten-Menü
zeigt Sendungen der (standardmäßig) nächsten 24 Stunden in chronologischer
Reihenfolge.

=head2 1.4 Menü C<Einstellungen>

=head3 1.4.1 Allgemein

=over 4

=item B<Hauptmenü-Eintrag verbergen>

Damit wird der Eintrag C<Suche> im Hauptmenü ausgeblendet.

B<Achtung:> Wenn das Plugin der Taste C<Grün> zugeordnet ist, dann bewirkt das
Ausblenden, dass wieder das VDR-Standardmenü aufgerufen wird. Siehe unten, wie
sich das vermeiden lässt.

=item B<Hauptmenü-Eintrag>

Falls nicht ausgeblendet, kann hier der Name des Hauptmenü-Eintrags
hinterlegt werden. Vorgabe ist C<Programmführer>.

B<Hinweis:> Wenn der Name von der Standardeinstellung abweicht, ist der
Hauptmenü-Eintrag nicht mehr mit der gewählten OSD-Sprache verknüpft.
Setzt man den Namen aber wieder auf die Standardeinstellung zurück oder
löscht ihn, ist die Verknüpfung mit der OSD-Sprache wieder gegeben.

=item B<Starte mit>

Auswahl von C<Programm> oder C<Jetzt> als Startmenü.

=back

=head3 1.4.2 EPG-Menüs

=over 4

=item B<Taste 'OK'>

Hier kann das Verhalten der Taste C<OK> festgelegt werden. Man kann damit
die Inhaltsangabe anzeigen oder zum entsprechenden Sender wechseln.

B<Hinweis:> Die Funktion der Taste C<Blau> (C<Umschalten>, C<Info> oder C<Suche>)
hängt von dieser Einstellung ab.

=item B<Taste 'Rot'>

Legt fest, ob man C<Aufnehmen> (Standardeinstellung) oder
C<Befehle> als Vorbelegung möchte.

=item B<Taste 'Blau'>

Legt fest, ob man C<Umschalten> (Standardeinstellung) oder
C<Suche> als Vorbelegung möchte.

=item B<Fortschritt in 'Jetzt' anzeigen>

Im Menü C<Jetzt> kann ein Fortschrittsbalken eingeblendet werden, der
die bereits verstrichene Zeit der laufenden Sendung anzeigt.

=item B<Kanalnummern anzeigen>

Auswählen, um eine führende Kanalnummer vor jedem EPG-Eintrag
anzuzeigen.

=item B<Kanaltrennlinien anzeigen>

Zur Anzeige einer Trennzeile zwischen Kanalgruppen im Menü
C<Übersicht - Jetzt> und den anderen Menüs von Programmübersichten.

=item B<Tagestrennlinien anzeigen>

Zur Anzeige einer Trennzeile zwischen Sendungen unterschiedlicher
Tage im Menü C<Programm>.

=item B<Radiokanäle anzeigen>

Erlaubt die Anzeige von Radiokanälen.

=item B<Kanäle begrenzen von 1 bis>

Bei einer sehr großen Kanalliste lässt sich der Menüaufbau mit dieser
Einstellung durch eine Einschränkung der angezeigten Kanäle beschleunigen. Mit
C<0> wird das Limit aufgehoben. Wenn der aktuelle Kanal über dem Limit liegt,
wird das Limit ignoriert, sodass wieder alle Kanäle angezeigt werden.

=item B<Timer mit 'Aufnehmen' sofort anlegen>

Falls C<ja>, wird nach Drücken von C<Aufnahme> sofort ein Timer angelegt.
Andernfalls erscheint stattdessen das Timer-Editieren-Menü.

=item B<Kanäle ohne EPG anzeigen>

Zur Anzeige von Programmen ohne EPG, um auf diese umschalten
oder einen Timer programmieren zu können.

=item B<Zeitintervall für 'FRew' / 'FFwd' [min]>

In den Menüs C<Jetzt> und C<Nächste> sowie den Menüs mit benutzerdefinierten
Zeiten kann der angezeigte Zeitpunkt durch drücken von C<FRew> bzw. C<FFwd>
verschoben werden. Die Sprungweite in Minuten kann hier festgelegt werden.

=item B<Tasten 'Grün' / 'Gelb' umschalten>

Auf C<ja> setzen, falls die Tasten C<FRew> bzw. C<FFwd> auf der Fernbedienung
nicht vorhanden sind. In entsprechenden Menüs werden damit nach Drücken der
Taste C<0> die Tasten C<Grün> und C<Gelb> beispielsweise auf C<E<lt>E<lt>> und
C<E<gt>E<gt>> umgeschaltet.

=item B<Favoriten-Menü anzeigen>

Das Favoriten-Menü kann dazu verwendet werden, eine Liste von bevorzugten
Sendungen anzuzeigen, die innerhalb der nächsten Stunden laufen. Je nach
Einstellung erscheint dieses Menü vor oder nach den EPG-Menüs mit
benutzerdefinierten Zeiten. Die Auswahl von Sendungen wird durch Setzen der
Option C<Im Favoriten-Menü verwenden> innerhalb einer Suche vorgenommen.

=item B<für die nächsten ... Stunden>

Mit diesem Wert wird die Zeitspanne eingestellt, für die Favoriten angezeigt
werden sollen.

=back

=head3 1.4.3 Benutzerdefinierte EPG-Zeiten

=over 4

=item B<Benutzerdefinierte Zeit 1..4 verwenden>

Bis zu vier benutzerdefinierte Zeiten können zu C<Jetzt> und C<Nächste>
hinzugefügt werden.

=item B<Beschreibung>

Name der benutzerdefinierten Zeit, etwa C<Nachmittag>, C<Abend> oder
C<Nacht>.

=item B<Zeit>

Uhrzeit, ab der die benutzerdefinierte Zeitspanne beginnt.

=back

=head3 1.4.4 Timer-Programmierung

=over 4

=item B<Timer-Editieren-Menü des VDR verwenden>

Beim normalen Programmieren eines Timers verwendet EPGSearch ein
erweitertes Timer-Editieren-Menü, das einen Verzeichniseintrag,
benutzerdefinierte Wochentage und die Vervollständigung um
Untertitel anbietet. Falls man einen gepatchten VDR verwendet, der
ebenfalls ein erweitertes Timer-Editieren-Menü-Menü anbietet und lieber
dieses verwenden möchte, dann diese Option auf C<ja> setzen.

=item B<Standard-Aufnahmeverzeichnis>

Dieser Eintrag wird beim normalen Programmieren eines Timers
verwendet. Die Nutzung von EPG-Variablen ist ebenfalls möglich,
etwa C<Filme~%Category%~%Genre%>. Wird das Timer-Editieren-Menü
aufgerufen, versucht EPGSearch, alle Variablen durch die Werte aus
der Beschreibung der Sendung zu ersetzen. Konnten nicht alle ersetzt
werden, bleibt der Verzeichniseintrag leer.

=item B<Untertitel in manuellen Timern>

Beim manuellen Programmieren eines Timers kann EPGSearch den Dateinamen
automatisch um den Untertitel ergänzen. Dies bewirkt, dass die spätere
Aufnahme in einem nach dem Titel benannten "Serienverzeichnis" mit dem
Untertitel als Episodenname gespeichert wird.

Hier legt man fest, ob bzw. wie die Ergänzung erfolgen soll:
C<intelligent> versucht anhand der Länge einer Sendung festzustellen,
ob ein Untertitel als Episodenname sinnvoll ist. Ist die Sendung länger
als 80 Minuten, wird kein Episodenname ergänzt.

=item B<Standard-Timer-Prüfmethode>

Manuell angelegte Timer können auf Änderungen im EPG überprüft werden. Hier
kann die Standardeinstellung für die Prüfmethode je Kanal hinterlegt
werden. Folgende Prüfmethoden existieren:

=over 4

=item I<Ohne Überwachung>

Z<>

=item I<Anhand Sendungskennung>

Geprüft wird anhand einer Kennung, die durch den Sender vergeben wird.

=item I<Anhand Sender/Uhrzeit>

Geprüft wird anhand der Sendung, die am besten zur Dauer der ursprünglichen
Sendung passt.

=back

Nicht alle Sender liefern eine vernünftige Sendungskennung. Deshalb kann hier
die Standardeinstellung für jeden Kanal einzeln gesetzt werden. Bei der
Programmierung eines manuellen Timers wird diese im Timer-Editieren-Menü
vorgegeben, falls das Menü von EPGSearch benutzt wird.

=back

=head3 1.4.5 Suche und Suchtimer

=over 4

=item B<Suchtimer verwenden>

Falls C<ja>, untersucht das Plugin im Hintergrund die EPG-Daten und
erzeugt Timer, falls passende Einträge gefunden werden. Dies
betrifft nur Sucheinträge, die mit C<Als Suchtimer verwenden>
markiert sind.

Suchtimer werden immer lokal erzeugt, auch wenn ein anderer Default-Host
für Aufnahmen definiert ist.

=item B<Aktualisierungsintervall>

Das Intervall in Minuten, in dem die Hintergrundsuche vorgenommen
wird.

=item B<SVDRP-Port>

Falls nicht der Standard-SVDRP-Port 6419 (Port 2001 vor VDR 1.7.15)
verwendet wird, bitte hier anpassen, damit die Suchtimer funktionieren.

=item B<Verzögerung der internen Threads>

Der Start des Suchtimer-Update-Threads und der folgenden Konfliktprüfung
kann um 0..300 Sekunden ab C<VDR Ready> verzögert werden. Standardmäßig
sind dies 10 Sekunden.

=item B<Priorität, Lebensdauer, Vorlauf und Nachlauf>

Legen die entsprechenden Voreinstellungen für neu erzeugte Suchtimer fest.

=item B<Erlaubte Aufnahmefehler>

Erlaubte Fehler in einer Aufnahme, bevor sie als unvollständig gekennzeichnet
wird (verfügbar seit VDR 2.5.4)

=item B<Ankündigungen bei Wiedergabe unterdrücken>

Zum Unterdrücken von Sendungsankündigungen während einer aktiven Wiedergabe.

=item B<Timer nach Löschen neu programmieren>

EPGSearch merkt sich standardmäßig, welche Timer bereits durch Suchtimer
angelegt wurden, und programmiert diese nicht erneut, wenn sie gelöscht
wurden. Zum Abschalten dieses Verhaltens bitte C<ja> wählen.

=item B<Prüfen, ob EPG für ... Stunden existiert>

Falls das EPG von externen Anbietern bezogen wird, kann es vorkommen, dass der
Abruf fehlschlägt und somit Aufzeichnungen wegen fehlender EPG-Daten verlorengehen.
Hiermit kann geprüft werden, ob für die vorgegebene Zahl von Stunden bei den
gewünschten Sendern ein EPG vorhanden ist. Ein Wert von C<0> deaktiviert die Prüfung.

=item B<Per OSD warnen>

Falls C<ja>, erscheint die Warnung als OSD-Einblendung.

=item B<Per E-Mail warnen>

Falls ja, wird die Warnung per E-Mail versandt. Hierfür bitte das
E-Mail-Konto unter C<E-Mail-Benachrichtigung> konfigurieren.

=item B<Zeitbegrenzung für Timer>

Timer werden nur in dieser Zeitspanne (Tage) erzeugt.

=item B<Zu prüfende Kanalgruppe>

Hier die Kanalgruppe auswählen, für welche die Prüfung durchgeführt
werden soll. Diese gegebenenfalls zuvor unter C<Kanalgruppen> anlegen.

=item B<PayTV-Sender ignorieren>

Auf C<ja> setzen, wenn der Suche nach Wiederholungen keine Sendungen
von PayTV-Sendern gewünscht sind.

=item B<Suchvorlagen>

Hier können Suchvorlagen verwaltet werden, die beim Anlegen neuer Suchen
und Suchtimer verwendbar sind.

=item B<Ausschlusslisten>

Hier können Ausschlusslisten verwaltet werden. Diese können innerhalb einer
Suche verwendet werden, um unerwünschte Sendungen zu vermeiden.

Eine Ausschlussliste kann auch als global gekennzeichnet werden. Da die
Standardeinstellung beim Suchtimer für die Option C<Ausschlusslisten verwenden>
auf C<nur globale> steht, lassen sich damit unerwünschte Sendungen von
allen Suchtimern unkompliziert ausschließen.

B<Ausnahme:> Falls bei einem Suchtimer für C<Ausschlusslisten verwenden>
die Option C<keine> gewählt ist, hat eine globale Ausschlussliste keine
Auswirkung. Ebenso werden globale Ausschlusslisten bei der Suche nach
Wiederholungen über das OSD ignoriert.

=item B<Kanalgruppen>

Verwaltet die Kanalgruppen, die als Suchkriterium in einer Suche
verwendet werden können. Die Verwaltung ist auch im Editieren-Menü
einer Suche möglich.

=back

B<Wichtig:> Wenn die EPG-Daten von einer externen Quelle bezogen werden,
sollte dafür gesorgt werden, dass die Suchtimer-Updates während des EPG-Updates
abgeschaltet sind. Der Grund hierfür ist, dass EPGSearch alle Timer löscht,
denen keine Sendungen zugeordnet sind. Diese Situation kann auftreten, solange
die neuen EPG-Daten vom VDR eingelesen werden.

Die Abschaltung der Updates geht am einfachsten mit dem SVDRP-Befehl C<SETS>
im EPG-Update-Skript:

=over 4

    svdrpsend PLUG epgsearch SETS off
    epg-updates-laden
    svdrpsend PLUG epgsearch SETS on

=back

=head3 1.4.6 Timer-Konfliktprüfung

=over 4

=item B<Priorität kleiner als ... ignorieren>

Falls ein Timer fehlschlagen sollte, dessen Priorität unter dem angegebenen
Wert liegt, wird darauf nicht per OSD-Nachricht hingewiesen und der Konflikt
wird als irrelevant in der Konfliktübersicht angezeigt.

=item B<Konfliktdauer unter ... Minuten ignorieren>

Falls ein Konflikt nicht länger als die angegebene Zahl von Minuten dauert,
wird darauf nicht per OSD-Nachricht hingewiesen und der Konflikt wird als
irrelevant in der Konfliktübersicht angezeigt.

=item B<Nur die nächsten ... Tage prüfen>

Hier kann der Zeitraum für die Konfliktprüfung angegeben werden.

=item B<Konflikte auch für Remote-Timer prüfen>

Falls SVDRP-Peering aktiv ist und C<ja> gewählt ist, werden auch Konflikte bei
Remote-Timern überprüft. Dazu muss am entsprechenden Remote-Rechner das Plugin
EGPSearch ebenfalls aktiviert sein. Default ist C<nein>.

=item B<Nach jeder Timer-Programmierung>

Dies bewirkt eine Konfliktprüfung nach jeder manuellen Timer-Programmierung
und erzeugt eine OSD-Nachricht, falls der neue bzw. geänderte Timer in einen
Konflikt involviert ist.

=item B<Beim Beginn einer Aufnahme>

Auf C<ja> setzen, wenn die Konfliktprüfung beim Beginn einer jeden Aufnahme
erfolgen soll. Im Falle eines Konflikts wird dann sofort eine OSD-Meldung
angezeigt. Diese erscheint aber nur, wenn der Konflikt innerhalb der nächsten
zwei Stunden auftritt.

=item B<Nach jedem Suchtimer-Update>

Hier kann eingestellt werden, ob eine Konfliktprüfung nach jedem
Suchtimer-Update erfolgen soll. Andernfalls greifen die nachfolgend
beschriebenen Einstellungen.

=item B<Alle ... Minuten>

Gibt an, in welchem Intervall im Hintergrund eine automatische
Konfliktprüfung erfolgen soll. Bei relevanten Konflikten erfolgt eine
Benachrichtigung per OSD. Mit C<0> wird diese Funktion deaktiviert.

=item B<Wenn nächster Konflikt in ... Minuten>

Wenn ein Konflikt in der angegebenen Zahl von Minuten eintritt, soll
das nachfolgend angegebene Prüfintervall verwendet werden.

=over 4

=item B<Alle ... Minuten>

Um einen kurz bevorstehenden Konflikt nicht zu übersehen, kann hier ein kürzeres
Prüfintervall eingestellt werden.

=back

=item B<Nachricht bei Wiedergabe vermeiden>

Bitte auf C<ja> setzen, wenn während einer Wiedergabe keine OSD-Benachrichtigungen
über Timer-Konflikte gewünscht sind. Die Benachrichtigung erfolgt trotzdem,
wenn der nächste Konflikt innerhalb der nächsten zwei Stunden auftritt.

=back

Bitte ebenfalls den Abschnitt "Working with the timer-conflict menu" in B<epgsearch>(4)
berücksichtigen.

=head3 1.4.7 E-Mail-Benachrichtigung

Hierzu bitte sicherstellen, dass F<sendEmail.pl> in einem Verzeichnis von C<$PATH>
liegt und F<epgsearchupdmail.templ> und F<epgsearchconflmail.templ> im
Konfigurationsverzeichnis von EPGSearch vorliegen.

=over 4

=item B<Suchtimer-Benachrichtigung>

Diese Option aktivieren, wenn eine E-Mail-Benachrichtigung gewünscht wird, sobald
der Suchtimer-Hintergrund-Thread

=over 2

=item • neue Timer angelegt hat;

=item • vorhandene Timer geändert hat;

=item • Timer gelöscht hat, weil diese wegen EPG-Änderungen oder anderen
Benutzeraktionen nicht mehr gültig sind.

=back

Hierfür muss ebenfalls die Option C<Suchtimer verwenden> im Suchtimer-Setup
aktiv sein.

=item B<Zeit zwischen E-Mails [h]>

Für Benachrichtigungen zu Suchtimern kann hier angegeben werden, welchen Mindestabstand
in Stunden die E-Mails haben sollen. Sobald die entsprechende Zeit verstrichen ist,
wird eine E-Mail nach dem nächsten Suchtimer-Update versandt. Der Wert C<0> bewirkt
einen sofortigen E-Mail-Versand.

=item B<Timer-Konflikt-Benachrichtigung>

Diese Option aktivieren, wenn eine E-Mail-Benachrichtigung bei
Timer-Konflikten gewünscht wird. Es werden nur Konflikte gemeldet, die
gemäß den Einstellungen zur Timer-Konfliktprüfung relevant sind. Neue
Benachrichtigungen werden nur versandt, wenn sich bei den Konflikten
Veränderungen ergeben haben.

B<Hinweis:> Hierfür muss in den Einstellungen der Timer-Konfliktprüfung die
Option C<Nach jedem Suchtimer-Update> oder C<alle ... Minuten>  aktiviert sein.

=item B<Senden an>

Hier die vollständige (!) E-Mail-Adresse hinterlegen, an welche die
Nachrichten versandt werden sollen.

B<Hinweis:> Einige Provider (wie etwa Arcor) erlauben keine identischen
E-Mail-Adressen für Sender und Empfänger.

=item B<E-Mail-Versandmethode>

Zur Auswahl stehen:

=over 4

=item I<sendEmail.pl>

Ein einfaches Skript, das auch auf Systemen ohne konfigurierten Mailserver
den Versand von E-Mails erlaubt. Das Skript wird mit EPGSearch ausgeliefert
und sollte in einem Verzeichnis von C<$PATH> liegen.

=item I<sendmail>

Setzt ein korrekt aufgesetztes Mailsystem voraus.

=back

=item B<E-Mail-Adresse>

Hier die volle (!) E-Mail-Adresse hinterlegen, von der die Nachricht versandt
werden soll.

=item B<SMTP-Server>

Der Name des SMTP-Servers, über den der E-Mail-Versand erfolgen soll.

=item B<SMTP-Authentifizierung verwenden>

Bitte C<ja> wählen, wenn das E-Mail-Konto eine SMTP-Authentifizierung für den
E-Mail-Versand benötigt.

=item B<Benutzername>

Hier bitte den Benutzernamen angeben, falls das E-Mail-Konto eine
Authentifizierung erfordert.

=item B<Passwort>

Hier bitte das Passwort angeben, falls das E-Mail-Konto eine
Authentifizierung erfordert.

B<Achtung:> Das Passwort wird im Klartext gespeichert. Es liegt in der
eigenen Verantwortung, dafür Sorge zu tragen, dass das System sicher ist
und dass unautorisierten Personen kein Zugriff auf VDR-Konfigurationsdateien
möglich ist.

=back

Nach Eingabe der E-Mail-Kontoeinstellungen bitte mittels C<Test> prüfen, ob alles
funktioniert. Wenn mit F<sendEmail.pl> gearbeitet wird, sollte am Ende der
Testausgabe etwas wie C<Email sent successfully> erscheinen. Eine Testfunktion
gibt es für C<sendmail> leider nicht.

Bitte ebenfalls den Abschnitt C<E-mail notifications> in B<epgsearch>(4) berücksichtigen.

=head1 2. Suchtimer

Die Suchtimer entsprechen in etwa den Autotimern von VDRAdmin, benötigen jedoch
kein externes Programm. Beim Anlegen einer Suche kann man festlegen,
ob diese als Suchtimer verwendet werden soll. Das Plugin sucht
dann im Hintergrund in bestimmten Zeitabständen (siehe C<Aktualisierungsintervall>)
nach passenden Sendungen und erzeugt Timer für die gefundenen Sendungen.
Sollen keine Timer angelegt, sondern die Sendungen nur gemeldet werden,
dann bitte C<per OSD ankündigen> einstellen.

Gerade für Serien ist dies sehr praktisch, weshalb es in der Suche die
Option C<Serienaufnahme> gibt. In diesem Fall wird ein Timer mit zusätzlichem
Episodennamen angelegt. Die Aufnahme wird dann in einem Ordner mit Titel als
Seriennamen gespeichert, wobei der Untertitel als Episodenname dient. Falls
ein Untertitel fehlt, werden ersatzweise Datum und Uhrzeit der Sendung als
Episodenname verwendet.

Die Suchtimer-Funktion muss außerdem im Setup aktiviert werden. Falls für
SVDRP nicht der Standardport verwendet wird, den gewünschten Port bitte
ebenfalls im Setup eintragen.

Um eine Hintergrund-Suche manuell anzustoßen, genügt die Ausführung von:

=over 4

    touch /etc/vdr/plugins/epgsearch/.epgsearchupdate

=back

Diese Anweisung kann ebenfalls Teil des shutdown-Skripts sein. Dort sollte man
dann aber noch eine Verzögerung von ein paar Sekunden vorsehen, damit das Plugin
ausreichend Zeit hat, den Scan zu beenden.

Mehr Infos zu Suchtimern finden sich in B<epgsearch>(4) unter "Description of the
search process" und "How do Search Timers work?".

=head2 2.1 Wiederholungen vermeiden im Detail

Nicht immer lässt sich durch entsprechende Suchkriterien vermeiden, dass auch
Timer für Wiederholungen erzeugt werden. Dieser Abschnitt erläutert, wie die
Option C<Wiederholungen vermeiden> eines Suchtimers funktioniert.

Um möglichst keine Duplikate von Sendungen zu erhalten, versucht das Feature
C<Wiederholungen vermeiden> vor dem Programmieren einer Sendung zu prüfen, ob
eine gleiche Sendung schon einmal aufgenommen wurde oder ob ein Timer existiert,
der die gleiche (nicht dieselbe!) Sendung aufzeichnet. Ist dies der Fall, wird
kein Timer für die zu überprüfende Sendung erzeugt.

=head2 2.2 Wie funktioniert der Vergleichstest zweier Sendungen?

Für den Test auf Gleichheit zweier Sendungen gibt es viele
Einstellmöglichkeiten bei Suchtimern. Man kann wählen, ob Titel,
Untertitel, Beschreibung und bestimmte Kategorien innerhalb der
Beschreibung einer Sendung mit den jeweiligen Angaben einer anderen
Sendung verglichen werden sollen.

Der Vergleich prüft die einzelnen Angaben immer auf vollständige Übereinstimmung,
einschließlich der Schreibweise. Die Beschreibung einer Sendung stellt jedoch
eine Ausnahme dar: Hier wird zunächst alles aus dem Text eliminiert, was eine
erweiterte Kategorie darstellen könnte, wie etwa C<Bewertung: Tagestipp>.
Eine solche erweiterte Kategorie entspricht einer Zeile, die mit bis zu
40 Zeichen beginnt, von einem C<:> gefolgt wird und dann maximal
weitere 60 Zeichen umfasst. Hintergrund für diese Filterung sind
oft vorhandene Bewertungen wie C<Tagestipp>, die bei der Wiederholung
vielfach aber nicht mehr enthalten sind.

Der verbleibende Text wird nun zunächst in der Länge verglichen. Ist
der Unterschied größer als 90 Prozent, wird die Beschreibung als
unterschiedlich gewertet. Andernfalls erfolgt eine Prüfung per
Levenshtein-Distanz-Algorithmus (LD), der einen Fuzzy-Textvergleich
durchführt. Die Beschreibung wird als gleich akzeptiert, wenn LD eine
Übereinstimmung von mehr als 90 Prozent meldet.

Da dieser Algorithmus ziemlich laufzeitintensiv ist (Komplexität I<O(mn)>), sollte
nach Möglichkeit nicht nur C<Beschreibung vergleichen> als einziges
Vergleichskriterium ausgewählt werden, sondern am besten immer nur in
Kombination mit anderen Kriterien.

=head2 2.3 Wie und wo wird der Vergleichstest eingesetzt?

Wie zuvor erwähnt, wird bei einem Suchtimer-Update für Suchtimer mit
diesem Feature zusätzlich geprüft, ob eine Sendung bereits irgendwann
schon aufgezeichnet wurde oder ob in der Timer-Liste ein Timer vorhanden
ist, der die gleiche Sendung aufzeichnen würde.
Nach jeder Aufnahme, die durch einen Suchtimer mit C<Wiederholungen vermeiden>
erzeugt wurde, werden alle Angaben zu dieser Sendung der Datei F<epgsearchdone.data>
gespeichert. Mittels C<Erledigte Aufnahmen anzeigen> in den C<Aktionen> des Menüs
C<Suche> kann man sich alle Sendungen, die ein solcher Timer bisher aufgenommen hat,
anzeigen lassen und diese auch bearbeiten. In die Datei fließen nur Aufnahmen
ein, die bezüglich der Timer-Angaben korrekt begonnen haben und auch
beendet wurden. Das heißt, dass unvollständige Aufnahmen nicht
registriert werden und somit beim nächsten Suchtimer-Update
automatisch ein neuer Timer für diese Sendung erzeugt wird, falls
eine Wiederholung gefunden wurde.

Seit VDR 2.5.4 werden auch Aufnahmen mit Fehlern nicht registriert. Möchte
man eine bestimmte Anzahl von Aufnahmefehlern zulassen, kann der Wert für
C<Erlaubte Aufnahmefehler> entsprechend gesetzt werden.

=head3 2.3.1 Wie verwenden?

Man sieht, dass das ganze Feature stark von der Qualität und dem
Umfang des verwendeten EPGs abhängt. Hat man einen entsprechenden
Suchtimer angelegt, ist es sinnvoll, erst einmal zu prüfen, ob er sich wie
gewünscht verhält. Dazu gibt es für solche Timer im Menü C<Suchergebnisse> auf
der Taste C<Blau> die zusätzliche Belegung C<Timer-Vorschau>. Sendungen,
die noch keinen Timer haben (C<T>), für die aber einer aufgrund des
Features beim nächsten Suchtimer-Update programmiert werden würde, haben dort
ein C<P> stehen.

B<Hinweis:> Möchte man aufgrund von Konflikten einen bereits programmierten
Timer nicht verwenden, sollte dieser im Timer-Menü deaktiviert werden.
Beim nächsten Suchtimer-Update wird dann einfach die nächstmögliche
Wiederholung programmiert, falls vorhanden.

=head3 2.3.2 Wenn es nicht richtig funktioniert

Damit bei Verwendung dieses Features besser nachvollziehbar ist, warum Timer
erzeugt wurden oder warum nicht, steht für EPGSearch ein eigenes Log-File
zur Verfügung. Startet man EPGSearch mit einem Log-Level von 2 oder höher
(C<−v 2>), werden beim Suchtimer-Update in der Datei F<epgsearch.log>
weiterführende Informationen abgelegt. Siehe auch die Kommandozeilen-Optionen
weiter oben.

=head1 3. Verwendung der Suche durch andere Plugins oder Skripte

Siehe B<epgsearch>(4).

=head1 4. Verwendung erweiterter EPG-Informationen

Einige EPG-Provider liefern zusätzliche EPG-Informationen, wie
die Art der Sendung, das Video- und Audio-Format, die Besetzung
usw. in der Beschreibung einer Sendung.

B<Anmerkung:> Dies hat nichts mit den Inhaltskategorien zu tun, die gemäß
DIN EN 300 468, Tabelle 18, als zusätzliche Daten ausgeliefert und seit
VDR 1.7.11 unterstützt werden. Leider liefern nicht alle Provider solche
Daten bzw. setzen die Kennungen korrekt. Deshalb gibt es den Ansatz der
"erweiterten EPG-Informationen", der versucht, diese Information aus der
Inhaltsbeschreibung zu extrahieren.

Mit Tools wie F<tvmovie2vdr> oder F<epg4vdr> können derartige
EPG-Inhalte in den VDR importiert werden.
Anhand solcher Daten lässt sich beispielsweise relativ einfach eine
Suche erzeugen, die alle Tagestipps findet, die in 16:9 ausgestrahlt
werden. Dazu durchsucht EPGSearch die Beschreibung einer Sendung nach
Zeilen, die mit den Namen von Kategorien beginnen, gefolgt von C<:>
und einem Leerzeichen, für die im Suchtimer ein oder mehrere Werte
festgelegt sind. Die Suche berücksichtigt Groß- und Kleinschreibung
sowohl bei den Kategorienamen als auch bei deren Werten.

Um Informationen dieser Art in Suchtimern verwenden zu können, müssen
anhand der Datei F<epgsearchcats.conf> im Konfigurationsverzeichnis
von EPGSearch entsprechende Einstellungen vorliegen.
Zeilen dieser Datei haben folgendes Format:

=over 4

    ID|Kategorienname[,Format]|Bezeichnung im Menü|Kategorienwerte|Suchmodus

=back

Die einzelnen Felder einer Zeile haben folgende Bedeutung:

=over 4

=item 1 – B<Eindeutige Kennung (ID)>

Integer mit einem positiven Wert.

B<Achtung:> Ändert man später die Kennung, müssen die Suchtimer angepasst werden!

=item 2 – B<Kategoriename>

String mit dem Namen der EPG-Kategorie laut EPG-Provider, etwa C<Genre>.

Wenn ein optionales C<Format> angegeben ist, wird der Kategoriewert als
Ganzzahl interpretiert und gemäß der Formatangabe dargestellt (siehe
C<man printf> für anwendbare Formatangaben).

=item 3 – B<Bezeichnung im Menü>

String mit dem Namen der EPG-Kategorie in Auswahlmenüs von EPGSearch.

=item 4 – B<Kategoriewerte>

String mit einer optionalen, kommaseparierten Liste von Werten für die EPG-Kategorie.

=item  5 – B<Suchmodus>

Optionale Enumeration mit den folgenden Werten:

=over 4

B<Textvergleich:>

=over 4

=item 0 = der gesamte Begriff muss enthalten sein

=item 1 = jedes Wort (durch eines der Zeichen C<,;|~> getrennt) muss
enthalten sein; dies ist die Standardeinstellung

=item 2 = mindestens ein Wort (durch eines der Zeichen C<,;|~> getrennt)
muss enthalten sein

=item 3 = exakte Übereinstimmung

=item 4 = regulärer Ausdruck

=back

B<Numerischer Vergleich:>

=over 4

=item 10 = kleiner

=item 11 = kleiner oder gleich

=item 12 = größer

=item 13 = größer oder gleich

=item 14 = gleich

=item 15 = ungleich

=back

=back

=back

Beispieldateien finden sich im Verzeichnis F<conf> von EPGSearch. Oft
genügt es, eine (weitgehend) passende Vorlage als F<epgsearchcats.conf>
ins Konfigurationsverzeichnis des Plugins zu kopieren und gegebenenfalls
ein paar kleinere Anpassungen vorzunehmen. Zur Nutzung der EPG-Kategorien
muss man den VDR danach lediglich neu starten und das Editieren-Menü eines
Suchtimers aufrufen.

Weil das Aufsetzen einer neuen F<epgsearchcats.conf> aber ziemlich
mühselig ist, wird F<createcats> als kleines Tool mitgeliefert, das
den Großteil der Arbeit übernimmt. Es findet sich im  Binärverzeichnis
des VDR ind wird folgendermaßen aufgerufen:

=over 4

    createcats <Pfad_zu>/epg.data

=back

Das Tool scannt die vorhandenen EPG-Informationen und versucht, daraus
die erweiterten Informationen zu extrahieren. Das Ergebnis ist eine neue Datei
F<epgsearchcats.conf>, die aber noch bearbeitet werden muss, weil sicher
nicht alles genau passt. Danach muss die Datei ins Konfigurationsverzeichnis
des Plugins kopiert werden.

Siehe auch B<createcats>(1) für weitergehende Informationen zu seiner
Verwendung.

=head1 5. Ersetzen des Standard-Programm-Menüs

Um das Plugin als Ersatz für das über die Taste C<Grün> aufgerufene
Standard-Menü C<Programm> des VDR zu verwenden, genügt es, die Zeile:

=over 4

    Green @epgsearch

=back

in die Datei F<keymacros.conf> einzufügen. Falls kein weiterer Menüeintrag
C<Programmführer> im Hauptmenü erscheinen soll, kann der Eintrag des Plugins
über die Einstellungen verborgen werden.

=head1 6. Add-ons

Mit EPGSearch werden zwei weitere Mini-Plugins ausgeliefert. Beide Plugins
erfordern, dass EPGSearch ebenfalls installiert ist (EPGSearch kann aber aus
dem Hauptmenü ausgeblendet werden):

=over 4

=item B<F<epgsearchonly>>

Werden nur die Suchfunktionen bzw. Suchtimer von EPGSearch benötigt
oder lediglich ein eigener Hauptmenüeintrag für die Suche gewünscht,
kann dies mit diesem Plugin erreicht werden. Es erzeugt einen
Hauptmenüeintrag C<Schnellsuche>, der direkt in das Menü
C<Suche editieren> führt.

Die Aktivierung erfolgt im VDR-Startskript mit C<−Pepgsearchonly>.

=item B<F<conflictcheckonly>>

Die Timer-Konfliktprüfung kann ebenfalls als eigener Hauptmenüeintrag
angelegt werden. Über eine Option in den Einstellungen lässt sich auch
das Ergebnis der letzten Konfliktprüfung direkt im Hauptmenü anzeigen.

Die Aktivierung erfolgt im VDR-Startskript mit C<−Pconflictcheckonly>.

=back

=head1 DATEIEN

=over 4

=item B<F<epgsearch.conf>>

Enthält die Suchtimer; siehe B<epgsearch.conf>(5).

=item B<F<epgsearchblacklists.conf>>

Enthält die Ausschlusslisten; siehe B<epgsearchblacklists.conf>(5).

=item B<F<epgsearchcats.conf>>

Enthält die Kategorien für die erweiterten EPG-Informationen;
siehe B<epgsearchcats.conf>(5).

=item B<F<epgsearchchangrps.conf>>

Enthält die Kanalgruppen; siehe B<epgsearchchangrps.conf>(5).

=item B<F<epgsearchcmds.conf>>

Enthält Befehle ähnlich der Datei F<commands.conf>, die auf EPG-Einträge
angewandt werden können; siehe B<epgsearchcmds.conf>(5).

=item B<F<epgsearchdirs.conf>>

Enthält Pfade, die beim Bearbeiten eines Suchtimers ausgewählt werden können;

siehe B<epgsearchdirs.conf>(5).

=item B<F<epgsearchdone.data>>

Enthält die Liste erledigter Suchtimer; siehe B<epgsearchdone.data>(5).

=item B<F<epgsearchmenu.conf>>

Enthält die vom Benutzer gewählte Konfiguration der OSD-Menüdarstellung;
siehe B<epgsearchmenu.conf>(5).

=item B<F<epgsearchswitchtimers.conf>>

Enthält die Umschalttimer; siehe B<epgsearchswitchtimer.conf>(5).

=item B<F<epgsearchtemplates.conf>>

Enthält die Vorlagen für Suchtimer; siehe B<epgsearchtemplates.conf>(5).

=item B<F<epgsearchuservars.conf>>

Enthält die benutzerspezifischen Variablen; siehe B<epgsearchuservars.conf>(5).

=back

=head1 HINWEISE

Die ausführliche Beschreibung der internen Funktionen des Plugins findet
sich in B<epgsearch>(4).

=head1 AUTOREN (Man-Pages)

Ursprünglich erstellt von Mike Constabel <epgsearch (at) constabel (dot) net>.

Überarbeitet und an die aktuellen Features von EPGSearch adaptiert durch die
derzeitigen Maintainer.

=head1 PROJEKTSEITE

Das Plugin wird als Projekt auf GitHub geführt:

L<https://github.com/vdr-projects/vdr-plugin-epgsearch/>

=head1 FEHLER MELDEN

Fehlerberichte sowie Feature-Anfragen können über den Bugtracker
des Projekts eingespeist werden:

L<https://github.com/vdr-projects/vdr-plugin-epgsearch/issues/>

=head1 COPYRIGHT und LIZENZ

Copyright © 2004-2010 Christian Wieninger

Copyright © 2011-2025 TomJoad (VDR-Portal) et al.

Dieses Programm ist freie Software. Sie können es unter den Bedingungen
der GNU General Public License, wie von der Free Software Foundation
veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß Version 2
der Lizenz oder (nach Ihrer Option) jeder späteren Version.

Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, dass es
Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die
implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN
ZWECK. Details finden Sie in der GNU General Public License.

Sie sollten ein Exemplar der GNU General Public License zusammen mit
diesem Programm erhalten haben. Falls nicht, schreiben Sie an die
Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
Oder rufen Sie in Ihrem Browser L<https://www.gnu.org/licenses/old-licenses/gpl-2.0.html>
auf.

Der ursprüngliche Autor kann über L<cwieninger@gmx.de> erreicht werden.

Die aktuellen Maintainer können über die Projektseite auf GitHub
(siehe oben) erreicht werden.

Der MD5-Code ist abgeleitet aus dem Message-Digest-Algorithmus MD5
von RSA Data Security, Inc.

=head1 SIEHE AUCH

B<epgsearch>(4),
B<epgsearch.conf>(5),
B<epgsearchblacklists.conf>(5),
B<epgsearchcats.conf>(5),
B<epgsearchchangrps.conf>(5),
B<epgsearchcmds.conf>(5),
B<epgsearchdirs.conf>(5),
B<epgsearchdone.data>(5),
B<epgsearchmenu.conf>(5),
B<epgsearchswitchtimer.conf>(5),
B<epgsearchuservars.conf>(5)
