--- vdr-1.7.14.orig/debian/R90.custom +++ vdr-1.7.14/debian/R90.custom @@ -0,0 +1,43 @@ +# +# Custom VDR Recording Action Hook +# ---------------------------------- +# +# This is a custom Recording Action Hook. It gets called by vdr +# before a recording starts, after a recording ended and after a +# recording has been edited. It is maintained as a config file in the vdr +# package. All other recording hooks get executed before this one! +# +# If you want to create your own recording hook that may get executed +# before any other hook, create it in /usr/share/vdr/recording-hooks or +# link to this location. All hooks are called in their alphabetical +# order and should follow this naming scheme: +# +# R. +# +# Where is a two digit number, that mainly specifies the execution order +# and is a unique descriptor. +# +# Two parameters are passed: +# +# Parameter 1 can have the values "before", "after" and "edited", depending +# on whether the recording hook is called before the recording starts, +# after the recording ends or after the recording has been edited. +# +# Parameter 2 is the directory of the recording. Be aware, that this directory +# doesn't exist before the recording starts. +# + +case $1 in + before) + # do here whatever you would like to do right BEFORE + # the recording $2 STARTS + ;; + after) + # do here whatever you would like to do right AFTER + # the recording $2 ENDED + ;; + edited) + # do here whatever you would like to do right AFTER + # the recording $2 has been EDITED + ;; +esac --- vdr-1.7.14.orig/debian/debianize-vdrplugin.1 +++ vdr-1.7.14/debian/debianize-vdrplugin.1 @@ -0,0 +1,33 @@ +.\" Man page for debianize-vdrplugin + +.TH debianize-vdrplugin 1 +.SH NAME +debianize-vdrplugin \- debianize a VDR plugin source archive +.SH DESCRIPTION +.B debianize-vdrplugin +can be used to add a working debian-directory to the source-directory +of a vdr-plugin. + +.B debianize-vdrplugin +should be called directly from a plugin-source-directory. + +After +.B debianize-vdrplugin +was run, you should check the files inside the debian-directory if they +fit your needs, and modify them accordingly. + +The next step to get a debian-package for the vdr-plugin is to call +.B dpkg-buildpackage +(You need the package +.B dpkg-dev +for this tool.) + +.SH AUTHOR +This man-page has been written by Thomas Schmidt +.PP +Permission is granted to copy, distribute and/or modify this document under +the terms of the GNU General Public License, Version 2 any +later version published by the Free Software Foundation. +.PP +On Debian systems, the complete text of the GNU General Public +License can be found in /usr/share/common\-licenses/GPL. --- vdr-1.7.14.orig/debian/vdr-newplugin.1 +++ vdr-1.7.14/debian/vdr-newplugin.1 @@ -0,0 +1,26 @@ +.\" Man page for vdr-newplugin + +.TH vdr-newplugin 1 +.SH NAME +vdr-newplugin \- create a new VDR plugin source tree +.SH SYNOPSIS + +.B vdr-newplugin +.I + +.SH DESCRIPTION +.B vdr-newplugin +creates a new plugin source directory from which to start implementing +a plugin for VDR. + +The source directory will be created in the active working-directory. + +.SH AUTHOR +This man-page has been written by Thomas Schmidt +.PP +Permission is granted to copy, distribute and/or modify this document under +the terms of the GNU General Public License, Version 2 any +later version published by the Free Software Foundation. +.PP +On Debian systems, the complete text of the GNU General Public +License can be found in /usr/share/common\-licenses/GPL. --- vdr-1.7.14.orig/debian/ctvdrsysinfo +++ vdr-1.7.14/debian/ctvdrsysinfo @@ -0,0 +1,16 @@ +#!/bin/sh + +echo "CPU:" +top -bci -n 1 | awk '/Cpu\(s\):.*/ { print 100-$8 "% - User " $2 " - System " $4 ;}' +echo +echo "Memory:" +top -bci -n 1 | awk '/Mem:.*/ { print $2/1024 " MB Ram - " $4/1024 " MB Belegt" ;}' +echo +echo "Swap:" +top -bci -n 1 | awk '/Swap:.*/ { print $2/1024 " MB Swap - " $4/1024 " MB Belegt" ;}' +echo +echo "Disk Space:" +df -hl | awk '/dev/ {printf("%s : %s von %s frei\n", $1, $4, $2) }' +echo +echo "Tasks:" +top -bci -n 1 | awk '/Tasks:.*/ { print $2 " - Running " $4 " - Sleep " $6 " - Stopped " $8 ;}' --- vdr-1.7.14.orig/debian/vdr.docs +++ vdr-1.7.14/debian/vdr.docs @@ -0,0 +1,6 @@ +README* +CONTRIBUTORS +MANUAL +INSTALL +UPDATE* +debian/patchinfo --- vdr-1.7.14.orig/debian/vdr-dev.manpages +++ vdr-1.7.14/debian/vdr-dev.manpages @@ -0,0 +1,3 @@ +debian/vdr-newplugin.1 +debian/debianize-vdrplugin.1 +debian/vdrdbg-buildpackage.1 --- vdr-1.7.14.orig/debian/watch +++ vdr-1.7.14/debian/watch @@ -0,0 +1,3 @@ +version=2 +ftp://ftp.tvdr.de/vdr/vdr-([\d\.]+)\.tar\.bz2 +ftp://ftp.tvdr.de/vdr/Developer/vdr-([\d\.]+)\.tar\.bz2 --- vdr-1.7.14.orig/debian/commands.ctvdr.conf +++ vdr-1.7.14/debian/commands.ctvdr.conf @@ -0,0 +1,6 @@ +VDR-Wartung { + Informationen über das VDR-System : /usr/bin/ctvdrinfo + Systeminformationen : /usr/bin/ctvdrsysinfo + VDR neu starten? : nohup sh -c "( sleep 2 && /usr/lib/vdr/ctvdrwrapper --restart )" >/dev/null 2>&1 & + VDR stoppen (ohne auszuschalten)? : nohup sh -c "( sleep 2 && /usr/lib/vdr/ctvdrwrapper --stop )" >/dev/null 2>&1 & +} --- vdr-1.7.14.orig/debian/vdr-dev.links +++ vdr-1.7.14/debian/vdr-dev.links @@ -0,0 +1,2 @@ +usr/include/vdr/libsi usr/include/vdr/include/libsi +usr/include/vdr usr/include/vdr/include/vdr --- vdr-1.7.14.orig/debian/vdr-plugin-dvbsddevice.install +++ vdr-1.7.14/debian/vdr-plugin-dvbsddevice.install @@ -0,0 +1 @@ +PLUGINS/lib/libvdr-dvbsddevice.so.* usr/lib/vdr/plugins/ --- vdr-1.7.14.orig/debian/vdr.groups +++ vdr-1.7.14/debian/vdr.groups @@ -0,0 +1,9 @@ +# +# If you add the user vdr manually to a group, you should list this +# group here. The plugin installation / deinstallation procedures may +# automatically remove vdr from a group, that isn't listed here. +# + +# vdr should be in the groups vdr and video. You shouldn't change this! +vdr +video --- vdr-1.7.14.orig/debian/patchcheck.py +++ vdr-1.7.14/debian/patchcheck.py @@ -0,0 +1,90 @@ +#!/usr/bin/python + +import re +import md5 +import os +from optparse import OptionParser + +PATCHES_FILE = 'debian/.vdr-patches' + +def file_name_for_patch_variant(baseFileName): + if options.patchVariant: + return baseFileName + "." + options.patchVariant + else: + return baseFileName + +def get_active_patches(): + active_patches = {} + for line in open(file_name_for_patch_variant("debian/patches/00list"), "r"): + match = re.match('^(?!00_)([^#]+)', line.rstrip()) + if match: + patchFileName = "debian/patches/" + match.group(1) + if not os.path.exists(patchFileName): + patchFileName += ".dpatch" + if os.path.exists(patchFileName): + active_patches[patchFileName] = md5.new(open(patchFileName).read()).hexdigest() + return active_patches + +def get_last_patches(): + lastPatches = {} + for line in open(file_name_for_patch_variant(PATCHES_FILE), "r"): + match = re.match('(.+):(.+)', line.rstrip()) + if match: + lastPatches[match.group(1)] = match.group(2) + return lastPatches + +def update_patchlist(): + patchListFile = open(file_name_for_patch_variant(PATCHES_FILE), "w") + patches = get_active_patches() + for fileName in patches: + patchListFile.write(fileName + ":" + patches[fileName] + "\n") + +def report_patches(patches, reportText): + if len(patches) > 0: + print reportText + for p in patches: + print " " + p + print + +def check_patches(): + active_patches = get_active_patches() + last_patches = get_last_patches() + + new_patches = [p for p in active_patches if last_patches.keys().count(p) == 0] + removed_patches = [p for p in last_patches if active_patches.keys().count(p) == 0] + changed_patches = [p for p in last_patches if p in active_patches and active_patches[p] != last_patches[p]] + + report_patches(new_patches, "The following patches are new:") + report_patches(removed_patches, "The following patches have been disabled:") + report_patches(changed_patches, "The following patches have been modified:") + + if len(new_patches) + len(removed_patches) + len(changed_patches) > 0: + commandLine = "debian/rules accept-patches" + abiVersion = "abi-version" + if options.patchVariant: + commandLine = "PATCHVARIANT=" + options.patchVariant + " " + commandLine + abiVersion += "." + options.patchVariant + print "Please check, if any of the above changes affects VDR's ABI!" + print "If this is the case, then update %s and run" % abiVersion + print "'%s' to update the snapshot of" % commandLine + print "the current patch level." + exit(1) + +# +# main() +# + +parser = OptionParser() + +parser.add_option("-u", "--update", action="store_true", dest="doUpdate", help="updated the list of accepted patches") +parser.add_option("-c", "--check", action="store_true", dest="doCheck", help="check patches") +parser.add_option("-p", "--patchvariant", dest="patchVariant", help="use a patch variant") + +(options, args) = parser.parse_args() + +if options.doCheck: + check_patches() +elif options.doUpdate: + update_patchlist() +else: + parser.print_help() --- vdr-1.7.14.orig/debian/rules +++ vdr-1.7.14/debian/rules @@ -0,0 +1,195 @@ +#!/usr/bin/make -f +# Sample debian/rules that uses debhelper. +# GNU copyright 1997 to 1999 by Joey Hess. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +ifneq (,$(findstring debug,$(DEB_BUILD_OPTIONS))) + CFLAGS += -g +endif +ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) + INSTALL_PROGRAM += -s +endif + +# To use dpatch uncomment the following line and set Build-Depends to dpatch +DPATCH=yes + +ifdef DPATCH +include /usr/share/dpatch/dpatch.make +else +patch: +patch-stamp: +unpatch: +endif + +TXT2MANPAGES = debian/vdr-dbg.1 +MANPAGES = debian/vdrdbg-buildpackage.1 debian/debugvdr.1 debian/vdrleaktest.1 + +MAKE_OPTIONS = REMOTE=LIRC CONFDIR=/var/lib/vdr LOCDIR=/usr/share/locale \ + VIDEODIR=/var/lib/video.00 PLUGINLIBDIR=/usr/lib/vdr/plugins + +$(MANPAGES): %.1: % + sh $< -h | \ + eval "`cat $< | grep "^### txt2man" | sed "s/### //"`" >$@ + +$(TXT2MANPAGES): %.1: %.1.txt + cat $< | grep -v "^###" | \ + eval "`cat $< | grep "^### txt2man" | sed "s/### //"`" >$@ + +OOLIST := debian/patches/00list +ABIVERSION := debian/abi-version +ifdef PATCHVARIANT + OOLIST := $(OOLIST).$(PATCHVARIANT) + ABIVERSION := $(ABIVERSION).$(PATCHVARIANT) + PATCHCHECKOPTION := -p $(PATCHVARIANT) +endif + +prepare-00list: + python debian/patchcheck.py -c $(PATCHCHECKOPTION) + cmp -s $(OOLIST) debian/patches/00list || \ + cp -b --suffix=.save $(OOLIST) debian/patches/00list + +restore-00list: + [ ! -e debian/patches/00list.save ] || \ + mv debian/patches/00list.save debian/patches/00list + +accept-patches: + python debian/patchcheck.py -u $(PATCHCHECKOPTION) + +configure: configure-stamp +configure-stamp: prepare-00list patch-stamp + dh_testdir + touch configure-stamp + +build: build-stamp $(MANPAGES) $(TXT2MANPAGES) +build-stamp: configure-stamp + dh_testdir + + # build unoptimized vdr with debugging symbols + touch po/vdr.pot po/*.po + $(MAKE) all $(MAKE_OPTIONS) VDRDEBUG=yes DEB_BUILD_OPTIONS=nostrip,noopt + cp vdr vdr-dbg + $(MAKE) -o .dependencies clean $(MAKE_OPTIONS) + + # build "productive" vdr + touch po/vdr.pot po/*.po + $(MAKE) all $(MAKE_OPTIONS) + + # plugins + mkdir -p PLUGINS/lib + $(MAKE) plugins $(MAKE_OPTIONS) + + cp newplugin vdr-newplugin + + gcc -o debian/vdr-shutdown.wrapper debian/vdr-shutdown-wrapper.c + gcc -o debian/ctvdrwrapper debian/ctvdrwrapper.c + + touch build-stamp + +patchinfo: + sh debian/extract-patchinfo >debian/patchinfo + +clean: clean-patched unpatch restore-00list +clean-patched: + dh_testdir + dh_testroot + rm -f build-stamp configure-stamp + $(MAKE) -o .dependencies clean-plugins $(MAKE_OPTIONS) + $(MAKE) -o .dependencies clean $(MAKE_OPTIONS) + rm -f vdr-dbg + rm -rf PLUGINS/lib + rm -f vdr-newplugin + rm -f debian/vdr-shutdown.wrapper + rm -f debian/ctvdrwrapper + rm -f debian/patchinfo + rm -f $(MANPAGES) $(TXT2MANPAGES) + dh_clean + +install: patchinfo build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + dh_install + chmod +x $(CURDIR)/debian/vdr/usr/lib/vdr/vdr-* + for example in hello osddemo pictures servicedemo skincurses status svdrpdemo; do \ + install -D PLUGINS/src/$$example/README $(CURDIR)/debian/vdr-plugin-examples/usr/share/doc/vdr-plugin-examples/README.$$example; \ + done + echo -n "vdr:Provides=" >> debian/vdr.substvars + cat $(ABIVERSION) >> debian/vdr.substvars + install -m644 $(ABIVERSION) $(CURDIR)/debian/vdr-dev/usr/share/vdr-dev/abi-version +ifdef PATCHVARIANT + mkdir -p $(CURDIR)/debian/vdr/usr/share/doc/vdr + mkdir -p $(CURDIR)/debian/vdr-dev/usr/share/doc/vdr-dev + grep ^opt- $(OOLIST) >$(CURDIR)/debian/vdr/usr/share/doc/vdr/optional-patches.txt + cp $(CURDIR)/debian/vdr/usr/share/doc/vdr/optional-patches.txt \ + $(CURDIR)/debian/vdr-dev/usr/share/doc/vdr-dev/optional-patches.txt +endif + + +# Build architecture-independent files here. +binary-indep: build install + dh_testdir -i + dh_testroot -i +# dh_installdebconf -i + dh_installdocs -i + dh_installexamples -i +# dh_installmenu -i +# dh_installlogrotate -i +# dh_installemacsen -i +# dh_installpam -i +# dh_installmime -i +# dh_installinit -i +# dh_installcron -i + dh_installman -i +# dh_installinfo -i +# dh_undocumented -i + dh_installchangelogs -i HISTORY + dh_link -i + dh_strip -i + dh_compress -i + dh_fixperms -i +# dh_makeshlibs -i + dh_installdeb -i + dh_perl -i + dh_shlibdeps -i + dh_gencontrol -i + dh_md5sums -i + dh_builddeb -i + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir -a + dh_testroot -a + dh_installdebconf -a + dh_installdocs -a -Nvdr-dbg + dh_installexamples -a + dh_installmenu -a +# dh_installlogrotate -a +# dh_installemacsen -a +# dh_installpam -a +# dh_installmime -a + dh_installinit -a +# dh_installcron -a + dh_installman -a +# dh_installinfo -a +# dh_undocumented -a + dh_installchangelogs -pvdr HISTORY + dh_installchangelogs -pvdr-plugin-dvbsddevice PLUGINS/src/dvbsddevice/HISTORY + dh_installchangelogs -pvdr-plugin-examples + dh_link -a + dh_strip -a -Xvdr-dbg + dh_compress -a + dh_fixperms -a +# dh_makeshlibs -a + dh_installdeb -a + dh_perl -a + dh_shlibdeps -a + dh_gencontrol -a + dh_md5sums -a + dh_builddeb -a + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install configure \ + clean-patched patch unpatch --- vdr-1.7.14.orig/debian/vdr-dbg.1.txt +++ vdr-1.7.14/debian/vdr-dbg.1.txt @@ -0,0 +1,21 @@ +### txt2man -s 1 -t VDR-DBG -v "Debug version of VDR" + +NAME + vdr-dbg - Starts the debugging version of vdr + +SYNOPSIS + vdr-dbg [vdr-options] + +DESCRIPTION + vdr-dbg is a debugging version of vdr, containing all debugging + symbols. vdr-dbg will not unload plugins, to be able to track memory + leaks in VDR plugins with valgrind. + +OPTIONS + All vdr options are available for vdr-dbg as well. + +SEE ALSO + vdr(1), debugvdr(1), vdrleaktest(1) + +AUTHOR + This manual page was written by Tobias Grimm . --- vdr-1.7.14.orig/debian/vdr-plugin-examples.install +++ vdr-1.7.14/debian/vdr-plugin-examples.install @@ -0,0 +1,8 @@ +PLUGINS/lib/libvdr-hello.so.* usr/lib/vdr/plugins/ +PLUGINS/lib/libvdr-osddemo.so.* usr/lib/vdr/plugins/ +PLUGINS/lib/libvdr-svccli.so.* usr/lib/vdr/plugins/ +PLUGINS/lib/libvdr-svcsvr.so.* usr/lib/vdr/plugins/ +PLUGINS/lib/libvdr-skincurses.so.* usr/lib/vdr/plugins/ +PLUGINS/lib/libvdr-status.so.* usr/lib/vdr/plugins/ +PLUGINS/lib/libvdr-svdrpdemo.so.* usr/lib/vdr/plugins/ +PLUGINS/lib/libvdr-pictures.so.* usr/lib/vdr/plugins/ --- vdr-1.7.14.orig/debian/runvdr.8 +++ vdr-1.7.14/debian/runvdr.8 @@ -0,0 +1,27 @@ +.\" Man page for runvdr + +.TH runvdr 8 +.SH NAME +runvdr \- starts VDR and reloads the DVB modules in case of errors +.SH DESCRIPTION +.B runvdr +is called by the init-script of vdr. It acts as a watchdog for vdr and will +reload the dvb-modules and vdr, if vdr exits with an exitcode different from 0. + +.B runvdr +will call /usr/bin/vdr and will pass all commandline-options directly to +/usr/bin/vdr. + +.B runvdr +needs to be called by root in order to work correct, because it will try to +unload/load kernel-modules! + +.SH AUTHOR +This man-page has been written by Thomas Schmidt +.PP +Permission is granted to copy, distribute and/or modify this document under +the terms of the GNU General Public License, Version 2 any +later version published by the Free Software Foundation. +.PP +On Debian systems, the complete text of the GNU General Public +License can be found in /usr/share/common\-licenses/GPL. --- vdr-1.7.14.orig/debian/.vdr-patches.multipatch +++ vdr-1.7.14/debian/.vdr-patches.multipatch @@ -0,0 +1,29 @@ +debian/patches/opt-52_hard_link_cutter.dpatch:a5283660d5fdb97ff905f288f45b2b80 +debian/patches/opt-43-x_recordshowfree.dpatch:66152f345b03259d28e89135cda42310 +debian/patches/12_osdbase-maxitems.dpatch:e45d1b62f7d66c3e5d279e3561034107 +debian/patches/11_sortrecordings.dpatch:9ed4cd1e144ee59dab34d4df4aa9af51 +debian/patches/opt-50_graphtft.dpatch:f77f3d81b37e89c448dbb15c9e4f475d +debian/patches/16_channels.conf.terr-fix.dpatch:72595733d0b46aa4093a640708d19226 +debian/patches/06_default_svdrp_port_0.dpatch:b49237a9ee246acfa01ee7ec92ad0a52 +debian/patches/82_valgrind.dpatch:503ddba49c243fff798a36a1c12bb5ae +debian/patches/opt-42-x_MainMenuHooks.dpatch:1c4c782b5c88c4f0408890a5f50b217b +debian/patches/opt-44_rotor.dpatch:76a5f215302c5dbf8c8713c092c8c6a2 +debian/patches/99_vdr-workaround-broken-sys-capability.dpatch:19d9edf94b745d972761cbcec9f442f2 +debian/patches/opt-20_liemikuutio.dpatch:00efa7e948010110b390d577a90a2c8e +debian/patches/opt-21_internal-cam-devices.dpatch:a883c0b09e67b679436b7df1e9807fc8 +debian/patches/opt-41-x_timer-info.dpatch:04511ae02243eb1bab94f3f45b59e574 +debian/patches/opt-24_jumpplay.dpatch:cfa5a357bd499978dd87c0167a538cd0 +debian/patches/opt-50_graphtft-liemikuutio.dpatch:f82320b9c64e17d06b5d0dbbddf50e8f +debian/patches/opt-31-x_reelchannelscan.dpatch:f8c06ac51888248f68badcab8533c2be +debian/patches/81_Make_config.dpatch:81b601bc91918a3426c3b5667435ee76 +debian/patches/opt-51_cuttime.dpatch:5459582bf3c6d95895d7e0ca18b52213 +debian/patches/opt-48-x_pin.dpatch:3dd524fa2c484cd03fa2f46194ceff18 +debian/patches/opt-37-x_menuorg.dpatch:9fb02cc8bd848add50b3866b6f476644 +debian/patches/opt-45_yaepg.dpatch:fbac27f726253a228d7fe15c1cdabeb2 +debian/patches/opt-27_ttxtsubs.dpatch:288a077a9508daf568adf3d1cc09c9a7 +debian/patches/99_ncursesw-include.dpatch:90810d58108ff8d9afd768fec67be904 +debian/patches/opt-39_noepg.dpatch:8e479efb77a9a7635a78e21832a56101 +debian/patches/opt-91_ext-graphtft.dpatch:afbe9ba764e67d293de8024f8093b014 +debian/patches/04_newplugin.dpatch:e99f8d21734a19b3eb93d9e3f11b680a +debian/patches/opt-38_disableDoubleEpgEntrys.dpatch:7a09fa581f95613497b718b5c4a4a875 +debian/patches/opt-22-x_edit_marks.dpatch:d6b10d4000a85dbf0e42664c349fc5c9 --- vdr-1.7.14.orig/debian/vdr.default +++ vdr-1.7.14/debian/vdr.default @@ -0,0 +1,15 @@ +# /etc/default/vdr +# +# See also /usr/share/doc/vdr/README.Debian.gz +# + +# Change to 1 to enable vdr's init-script +ENABLED=1 + +# Change this to 1 if you want vdr to be able to shutdown the +# computer +ENABLE_SHUTDOWN=1 + +# Options that will be passed to vdr's commandline +# for example: OPTIONS="-w 15" +OPTIONS="-w 60" --- vdr-1.7.14.orig/debian/ctvdrwrapper.c +++ vdr-1.7.14/debian/ctvdrwrapper.c @@ -0,0 +1,26 @@ +// +// Small wrapper arround some administrative functions which have to be +// executed set-root-uid +// + +#include +#include +#include + +int main (int argc, char *argv[]) +{ + if (argc == 2) + { + if (strcmp(argv[1], "--stop") == 0) + { + char* parameters[] = {"vdr", "stop", (char*) 0}; + return execv("/etc/init.d/vdr", parameters); + } + else if (strcmp(argv[1], "--restart") == 0) + { + char* parameters[] = {"vdr", "restart", (char*) 0}; + return execv("/etc/init.d/vdr", parameters); + } + } + return 1; +} --- vdr-1.7.14.orig/debian/vdr.preinst +++ vdr-1.7.14/debian/vdr.preinst @@ -0,0 +1,21 @@ +#!/bin/sh + +set -e + +# Peter Siering , 10/2/2003 + +ACTION=$1 +OLDVERS=$2 + +if dpkg --compare-versions "$OLDVERS" le-nl "1.2.3-1" ; then + echo "Updating the installed VDR $OLDVERS is not possible." + exit 1 +fi + +#DEBHELPER# + +# give vdr a chance to seddle down, otherwise the updated +# version will not find any DVB-device +sleep 2 + +exit 0 --- vdr-1.7.14.orig/debian/TODO.Debian +++ vdr-1.7.14/debian/TODO.Debian @@ -0,0 +1,2 @@ +TODO: When plugin could not be loaded, log stderr output somewhere +TODO: Fixe patchtest --- vdr-1.7.14.orig/debian/.vdr-patches +++ vdr-1.7.14/debian/.vdr-patches @@ -0,0 +1,30 @@ +debian/patches/opt-52_hard_link_cutter.dpatch:a5283660d5fdb97ff905f288f45b2b80 +debian/patches/opt-43-x_recordshowfree.dpatch:66152f345b03259d28e89135cda42310 +debian/patches/12_osdbase-maxitems.dpatch:e45d1b62f7d66c3e5d279e3561034107 +debian/patches/11_sortrecordings.dpatch:9ed4cd1e144ee59dab34d4df4aa9af51 +debian/patches/opt-50_graphtft.dpatch:f77f3d81b37e89c448dbb15c9e4f475d +debian/patches/16_channels.conf.terr-fix.dpatch:72595733d0b46aa4093a640708d19226 +debian/patches/06_default_svdrp_port_0.dpatch:b49237a9ee246acfa01ee7ec92ad0a52 +debian/patches/82_valgrind.dpatch:503ddba49c243fff798a36a1c12bb5ae +debian/patches/opt-42-x_MainMenuHooks.dpatch:1c4c782b5c88c4f0408890a5f50b217b +debian/patches/opt-44_rotor.dpatch:76a5f215302c5dbf8c8713c092c8c6a2 +debian/patches/99_vdr-workaround-broken-sys-capability.dpatch:19d9edf94b745d972761cbcec9f442f2 +debian/patches/opt-20_liemikuutio.dpatch:00efa7e948010110b390d577a90a2c8e +debian/patches/opt-21_internal-cam-devices.dpatch:a883c0b09e67b679436b7df1e9807fc8 +debian/patches/opt-41-x_timer-info.dpatch:04511ae02243eb1bab94f3f45b59e574 +debian/patches/opt-24_jumpplay.dpatch:cfa5a357bd499978dd87c0167a538cd0 +debian/patches/opt-50_graphtft-liemikuutio.dpatch:f82320b9c64e17d06b5d0dbbddf50e8f +debian/patches/opt-55_wareagleicon.dpatch:4fa3ca3bf40317f914b10278646d5faa +debian/patches/opt-31-x_reelchannelscan.dpatch:f8c06ac51888248f68badcab8533c2be +debian/patches/81_Make_config.dpatch:81b601bc91918a3426c3b5667435ee76 +debian/patches/opt-51_cuttime.dpatch:5459582bf3c6d95895d7e0ca18b52213 +debian/patches/opt-48-x_pin.dpatch:3dd524fa2c484cd03fa2f46194ceff18 +debian/patches/opt-37-x_menuorg.dpatch:9fb02cc8bd848add50b3866b6f476644 +debian/patches/opt-45_yaepg.dpatch:fbac27f726253a228d7fe15c1cdabeb2 +debian/patches/opt-27_ttxtsubs.dpatch:288a077a9508daf568adf3d1cc09c9a7 +debian/patches/99_ncursesw-include.dpatch:90810d58108ff8d9afd768fec67be904 +debian/patches/opt-39_noepg.dpatch:8e479efb77a9a7635a78e21832a56101 +debian/patches/opt-91_ext-graphtft.dpatch:afbe9ba764e67d293de8024f8093b014 +debian/patches/04_newplugin.dpatch:e99f8d21734a19b3eb93d9e3f11b680a +debian/patches/opt-38_disableDoubleEpgEntrys.dpatch:7a09fa581f95613497b718b5c4a4a875 +debian/patches/opt-22-x_edit_marks.dpatch:d6b10d4000a85dbf0e42664c349fc5c9 --- vdr-1.7.14.orig/debian/vdrdbg-buildpackage +++ vdr-1.7.14/debian/vdrdbg-buildpackage @@ -0,0 +1,45 @@ +#!/bin/sh + +## NAME +## vdrdbg-buildpackage - builds a VDR plugin for debugging +## +## SYNOPSIS +## vdrdbg-buildpackage [dpkg-puildpackage-options] +## +## DESCRIPTION +## vdrdbg-buildpackage is a small wrapper for dpkg-buildpackage, which +## sets all options needed to compile a VDR plugin for debugging. +## +## OPTIONS +## -h This help +## +## All dpkg-buildpackage options are available for vdrdbg-buildpackage +## as well. +## +## SEE ALSO +## dpkg-buildpackage (1) +## +## AUTHOR +## This manual page was written by Tobias Grimm +## +### txt2man -s 1 -t VDRDBG-BUILDPACKAGE -v "Create VDR dbeug plugin package" + +usage() +{ + local HELPCOMMENTPATTERN="^## " + cat "$0" | grep "$HELPCOMMENTPATTERN" | sed "s/$HELPCOMMENTPATTERN//" +} + +while getopts h opt +do + case $opt in + h) + usage + exit + ;; + esac +done + +export DEB_BUILD_OPTIONS="$DEB_BUILD_OPTIONS noopt nostrip" +export VDRDEBUG=yes +dpkg-buildpackage $* --- vdr-1.7.14.orig/debian/debugvdr +++ vdr-1.7.14/debian/debugvdr @@ -0,0 +1,79 @@ +#!/bin/bash + +# We need bash here, because of the *-loader.sh scripts containing bashisms! + +## NAME +## debugvdr - Runs the VDR debugging binary with the GDB debugger. +## +## SYNOPSIS +## debugvdr [-r] +## +## DESCRIPTION +## debugvdr will start VDR with the GDB debugger with the same command line +## arguments as the VDR daemon. This means, all installed plugins will be +## loaded. If VDR is still running, it will be automatically stopped before +## starting the debugging version. +## +## OPTIONS +## -r Start VDR with the GDB Server on port 1000 for remote debugging. +## +## SEE ALSO +## vdr(1), gdb(1) +## +## AUTHOR +## This manual page was written by Tobias Grimm +## +### txt2man -s 1 -t DEBUGVDR -v "Start VDR with the GDB debugger" + +usage() +{ + local HELPCOMMENTPATTERN="^## " + cat "$0" | grep "$HELPCOMMENTPATTERN" | sed "s/$HELPCOMMENTPATTERN//" +} + + +while getopts hr opt +do + case $opt in + r) + GDB_SERVER="yes" + [ -x $2 ] || GDB_SERVER_PORT="$2" + ;; + *) + usage + exit + ;; + esac +done + +PLUGINS="" + +. /usr/lib/vdr/config-loader.sh +. /usr/lib/vdr/commands-loader.sh +. /usr/lib/vdr/plugin-loader.sh + +getplugins +mergecommands "commands" +mergecommands "reccmds" + +VDRCOMMANDLINE="-v $VIDEO_DIR -c $CFG_DIR -L $PLUGIN_DIR -r $REC_CMD \ + -E $EPG_FILE $PLUGINS $OPTIONS --lirc" + +/etc/init.d/vdr stop + +if [ "$GDB_SERVER" = "yes" ] ; then + gdbserver host:"$GDB_SERVER_PORT" /usr/bin/vdr-dbg \ + `echo $VDRCOMMANDLINE | sed s/\"//g` + +else + GDB_COMMANDS_FILE=`mktemp` + + echo "set args $VDRCOMMANDLINE" >>$GDB_COMMANDS_FILE + echo "echo -----------------------\n" >>$GDB_COMMANDS_FILE + echo "echo ---- VDR-Debugging ----\n" >>$GDB_COMMANDS_FILE + echo "echo -----------------------\n\n" >>$GDB_COMMANDS_FILE + echo "echo type 'run' to start vdr\n\n" >>$GDB_COMMANDS_FILE + + gdb -x $GDB_COMMANDS_FILE /usr/bin/vdr-dbg + rm $GDB_COMMANDS_FILE +fi --- vdr-1.7.14.orig/debian/config-loader.sh +++ vdr-1.7.14/debian/config-loader.sh @@ -0,0 +1,77 @@ +# +# This file is called by /etc/init.d/vdr +# + +# +# Defaults - don't touch, edit options for the VDR daemon in +# /etc/default/vdr !!! +# + +# Config-Directory +CFG_DIR="/var/lib/vdr" + +# Plugin-Directory +PLUGIN_DIR="/usr/lib/vdr/plugins" + +# Plugin Config-Directory +PLUGIN_CFG_DIR="/etc/vdr/plugins" + +# Plugin prefix +PLUGIN_PREFIX="libvdr-" + +# Command-Hooks Directory +CMDHOOKSDIR="/usr/share/vdr/command-hooks" + +# Commmand executed on start, stop and editing of a recording +REC_CMD=/usr/lib/vdr/vdr-recordingaction + +# Commmand executed by vdr to shutdown the system +SHUTDOWNCMD="/sbin/shutdown -h now" + +# EPG data file +EPG_FILE=/var/cache/vdr/epg.data + +# Username under which vdr will run (Note: the user root is not +# allowed to run vdr, vdr will abort when you try to start it as +# root or with "-u root") +USER=vdr + +# Default port for SVDRP +SVDRP_PORT=2001 + +# Enable / Disable vdr daemon +ENABLED=0 + +# Enable / Disable automatic shutdown +ENABLE_SHUTDOWN=0 + +# Video-Directory +VIDEO_DIR="/var/lib/video.00" + +# Set this to load only startable plugins (check with "vdr -V -P plugin") +PLUGIN_CHECK_STARTABLE="yes" + +# Default Console for controlling VDR by keyboard. Empty means no console +# input. +KEYB_TTY="" + +# Set this to 1 to make VDR switch to the console specified in KEYB_TTY +# on startup +KEYB_TTY_SWITCH=0 + +# get locale which is used for running vdr from /etc/default/locale or +# /etc/environment or fall back to "C" +ENV_FILE="none" +[ -r /etc/environment ] && ENV_FILE="/etc/environment" +[ -r /etc/default/locale ] && ENV_FILE="/etc/default/locale" +[ $ENV_FILE = none ] || \ + for var in LANG LC_ALL; do + eval VDR_LANG=$(egrep "^[^#]*${var}=" $ENV_FILE | tail -n1 | cut -d= -f2) + [ -z "$VDR_LANG" ] || break + done +[ -z "$VDR_LANG" ] && VDR_LANG="C" + +# Enable VFAT file system support by default +VFAT=1 + +test -f /etc/default/vdr && . /etc/default/vdr --- vdr-1.7.14.orig/debian/vdr-dev.docs +++ vdr-1.7.14/debian/vdr-dev.docs @@ -0,0 +1,4 @@ +README* +CONTRIBUTORS +PLUGINS.html +debian/patchinfo --- vdr-1.7.14.orig/debian/README.Debian +++ vdr-1.7.14/debian/README.Debian @@ -0,0 +1,298 @@ +vdr for Debian +-------------- + +Comments to the Debian version: + + - You need a DVB card and a driver using the "Linux DVB API" + (http://www.linuxtv.org/developer/dvbapi.xml). The standard VDR + (without special plugins) requires a DVB-card with an integrated + mpeg-decoder, a so called Full-Featured card. (For example the + Hauppauge Nexus, or a TechnoTrend FullFeatured 1.x) + - all the small scripts and tools distributed with the package are located in + /usr/lib/vdr/. You may use and modify them for you own purposes. + - if you want to use the vdr-initscript, edit /etc/default/vdr and change + ENABLED=0 to ENABLED=1, and the other options in this file + - video-dir is moved to /var/lib/video see #234429 + - cfg-dir was moved to /var/lib/vdr, to be FHS-compliant + - The selection of your favourite vdr-binary (vdr-daemon, vdr-kbd, vdr-lirc or + vdr-rcu) is now handled via update-alternatives, so if you have more than + one of these packages installed, and are not happy with the default + priorities, you can select the binary via "update-alternatives --config vdr" + + -- Thomas Schmidt , Tue, 28 Dec 2004 14:22:21 +0100 + + +Additional configuration options +------------------------------- + +The following options can be configured in /etc/default/vdr. + +KEYB_TTY="" + + Default: "" (No console input) + + Console for controlling VDR by keyboard (e.g. /dev/tty8). On startup VDR + will automatically switch to this console. + +KEYB_TTY_SWITCH=<0|1> + + Default: 0 + + Set this to 1, to make VDR switch to the console specified in KEYB_TTY + on startup. + +PLUGIN_CHECK_STARTABLE="" + + Default: "yes" + + Before starting VDR with the plugins, the loadability of the plugin + libraries will be checked with "vdr -V -P plugin". This will catch + some binary incompatibilities and problems with the plugins + initialization code. Set this to "no" to load the plugins without + any testing. + +SHUTDOWNCMD="" + + Default: "/sbin/shutdown -h now" + + VDR executes when the power-off-key of the remote is pressed after + processing all shutdown hook scripts. Shutdown hooks may override this + command. See section "Shutdown-Hooks" below. SHUTDOWNCMD will be executed + detached in background. + +SVDRP_PORT= + + Default: 2001 + + Default port for SVDRP (Simple Video Disk Recorder Protocol), the telnet + like interface to control VDR. + +USER= + + Default: vdr + + Username under which vdr will run. All plugins and commands invoked by VDR + will be executed with the rights of this user. + +LIRC= + + Default: /dev/lircd + + Allows to change the LIRC device or disable LIRC alltogether by + setting it to /dev/null which might be required if you use a + different frontend, like XBMC or xineliboutput. + +VDR_CHARSET_OVERRIDE= + + Default: not set + + Workaround for broadcasters not correctly implementing the standard. + According to "ETSI EN 300 468" the default character set is ISO-6937. But + unfortunately some broadcasters actually use ISO-8859-9, but fail to + correctly announce that. If you set VDR_CHARSET_OVERRIDE=ISO-8859-9, then VDR + uses ISO-8859-9 as default. + +VDR_LANG= + + Default: read from LANG or LC_ALL in /etc/default/locale or /etc/environment, + falling back to C, if no locale is specified + + Locale which is used when running vdr. + +VFAT=<0|1> + + Default: 1 + + This corresponds to VDR's --vfat option. If videos are stored on a VFAT file + system or a SAMBA share, VFAT should be set to 1. With VFAT=1, the encoding + and length of file names will be tweaked, so that it can be correctly stored + on VFAT file systems. + +VIDEO_DIR="" + + Default: "/var/lib/video.00" + + The video directory where vdr recordings will be stored. + + -- Tobias Grimm , Sat, 03 Jun 2006 19:00:00 +0100 + + +Automatic Loading of Plugins +---------------------------- + +When starting vdr with "/etc/init.d/vdr start", for each plugin found in +/usr/lib/vdr/plugins the appropriate command line argument -P +will be created automatically. + +If a file /etc/vdr/plugins/plugin..conf exists, it will be +parsed for command line arguments for the specified plugin. This file may +contain comments prefixed by a "#" and the command line arguments may also be +distributed across several lines. + + -- Tobias Grimm , Sun, 23 May 2004 18:00:00 +0100 + + +Command-Hooks +------------- + +VDR has the ability, to start external commands using the OSD menu. There are +two types of external commands - normal commands and recording commands. Normal +commands are shown under VDR's main menu entry "commands" while, recording +commands are accessible only in VDR's recordings menu. While normal commands are +executed without any parameters, recording commands will receive the directory +of the selected recording as the first command line argument. + +In order to allow other packages (Addons) to install their own commands, the +command files passed to vdr in /etc/init.d/vdr are generated out of the files +commands..conf and reccmds..conf found in +/usr/share/vdr/command-hooks/. normally should be the name of +the package, that wants to add these commands to VDR. The order of the +commands can be defined in the files order.commands.conf and order.reccmds.conf +in /etc/vdr/command-hooks/. + +If the author of a package wants the user to be able to customize the commands +added to vdr, the command file should be installed to /etc/vdr/command-hooks/ +and only symlinked to /usr/share/vdr/command-hooks/. + +For a description of the command file syntax, refer to commands.conf and +reccmds.conf in the vdr documentation. + +Commands added by the user, should go to commands.custom.conf and +reccmds.custom.conf in /etc/vdr/command-hooks/. These files contain also some +examples. + + -- Tobias Grimm , Sun, 23 May 2004 18:00:00 +0100 + + +Recording-Hooks +--------------- + +VDR can execute an external command before a recording starts, after a +recording ends and after a recording has been edited. +In order to allow other packages to specify their own recording actions, +all files in /usr/share/vdr/recording-hooks are executed one after another. +If a file is not an executable or a link to an executable, it is executed as +a shell script. + +Recording hooks are called in their alphabetical order and should follow this +naming scheme: + +R. + +Where is a two digit number, that mainly specifies the execution order +and is a unique descriptor. + +Two parameters are passed to each recording hook: + +Parameter 1 can have the values "before", "after" and "edited", depending +on whether the recording hook is called before the recording starts, +after the recording ends or after the recording has been edited. + +Parameter 2 is the directory of the recording. Be aware, that this directory +doesn't exist before the recording starts. + +If the author of a package wants the user to be able to customize a recording +hook, it should be installed to /etc/vdr/recording-hooks/ and only symlinked +to /usr/share/vdr/recording-hooks/. + +Custom user commands associated with the vdr package, can be added by the user +to /etc/vdr/recording-hooks/R90.custom. + + -- Tobias Grimm , Sun, 23 May 2004 19:00:00 +0100 + + +Shutdown-Hooks +--------------- + +If you press the power key on your remote control, VDR executes a script +provided by the command line option -s. By default, this script will +execute all files in /usr/share/vdr/shutdown-hooks/ in their alphabetical order. +If a file in there is not executable, it is treated as a shell script. These +so called "shutdown hooks" should follow this naming scheme: + +S. + +Where is a two digit number, that mainly specifies the execution order +and is a unique descriptor. + +All shutdown hooks will be passed the same parameters as the main shutdown +script. I.e. the first parameter is the start time of the next timer. Please +refer to the vdr documentation for the other parameters. + +After all shutdown hooks have been processed, VDR will be terminated and the +machine will be shut down. + +A shutdown hook may abort the shutdown process by exiting with an errorlevel +unequal to 0. To provide the user with an OSD-message about the reason for +aborting the shutdown, the shutdown hook may write an abort message to stdout +like this: + +ABORT_MESSAGE= + +If the shutdown should only be deferred (e.g. because some background process, +is still active), the shutdown hook may write to stdout: + +TRY_AGAIN= + +In this case, no further shutdown hooks will be processed and the shutdown will +be invoked in TRY_AGAIN minutes again. + +To overwrite the command defined in /etc/default/vdr that will be executed to +shutdown the machine after all shutdown hooks have been processed, a shutdown +hook may write to stdout: + +SHUTDOWNCMD= + + +Group memberships +----------------- + +A few plugins require that the user vdr is member in additional system groups +like audio or cdrom. To be a little bit more flexible, we have designed a +mechanism which can be used by plugins to specify additional group memberships. +Plugins can add a file /usr/share/vdr/groups.d/.groups and call +/usr/lib/vdr/vdr-groups.sh in postinst and prerm. vdr-groups.sh will then take +care of adding/removing vdr to/from the groups listed in the specified +.groups file. vdr will be removed from a group only, if no other +plugin requires this group membership. + +In postinst a plugin should call: + + /bin/sh /usr/lib/vdr/vdr-groups.sh --add vdr-plugin-foo + +and in prerm: + + /bin/sh /usr/lib/vdr/vdr-groups.sh --remove vdr-plugin-foo + +If you manually add vdr to a group, you must add the group to +/etc/vdr/vdr.groups. If you don't do so, vdr may be removed from this group when +uninstalling a plugin. + + -- Thomas Schmidt , Tue, 01 May 2007 14:12:15 +0200 + + +Optional Patches +---------------- + +A lot of VDR enthusiasts have improved VDR by creating patches that fix +existing problems or add new functionality. Some of these patches may not work +for everyone, so we decided to make them optional. This means, that these +patches are only included as dpatch files in the vdr source package, NOT in +the binary packages. They are named opt-_, where is a +two-digit-number and a unique identifier. To enable a patch, just +uncomment it in debian/patches/00list and recompile vdr. + +Most of these optional patches modify the interfaces used by the plugins. This +means, that the plugins become binary incompatible. If you activate/deactivate +patches in the vdr package, all plugins must be recompiled with the new vdr-dev +package! There is only one exception from this rule - patches named +opt--x_ do not affect the plugin interfaces and can therefore +be enabled or disabled without the need to recompile the plugins. + +Keep in mind, that if you enable any optional patches, you can't use apt-get +anymore on the official Debian repositories to update existing vdr or plugin +packages or install additional plugins. You always have to compile the plugins +yourself! The optional patches are mainly intended for people who would like to +create their own customized vdr distribution. + + -- Tobias Grimm , Thu, 3 Jun 2004 02:20:00 +0100 --- vdr-1.7.14.orig/debian/vdr-plugin-examples.examples +++ vdr-1.7.14/debian/vdr-plugin-examples.examples @@ -0,0 +1 @@ +PLUGINS/src/pictures/pic2mpg --- vdr-1.7.14.orig/debian/vdr-plugin-dvbsddevice.docs +++ vdr-1.7.14/debian/vdr-plugin-dvbsddevice.docs @@ -0,0 +1 @@ +PLUGINS/src/dvbsddevice/README --- vdr-1.7.14.orig/debian/runvdr +++ vdr-1.7.14/debian/runvdr @@ -0,0 +1,88 @@ +#!/bin/sh + +. /usr/lib/vdr/config-loader.sh + +VDR_ENV="LANG=$VDR_LANG LC_ALL=$VDR_LANG" +if [ -n "$VDR_CHARSET_OVERRIDE" ] ; then + VDR_ENV="$VDR_ENV VDR_CHARSET_OVERRIDE=$VDR_CHARSET_OVERRIDE" +fi + +VDRCMD="$VDR_ENV /usr/bin/vdr $*" + +get_modulenames() +{ + MODULES=`lsmod | awk '/^dvb_core/ {gsub(/,/,"\n", $4); print $4}' | tac` + [ "$MODULES" ] && MODULES="$MODULES dvb_core" +} + +# TODO: check if udev handles this on newer systems!? +set_permissions() +{ + if [ "$USER" -o "$GROUP" ]; then + for FILE in av7110_ir budget_ci_ir; do + if [ -e "/proc/$FILE" ]; then + chown $USER.$GROUP /proc/$FILE + fi + done + fi + chmod o+r /dev/input/event* +} + +load_dvb_modules() +{ + if modprobe dvb >/dev/null 2>&1 ; then + get_modulenames + else + if [ "$MODULES" ]; then + for MODULE in $MODULES; do + modprobe $MODULE >/dev/null 2>&1 + done + else + modprobe dvb_ttpci >/dev/null 2>&1 + get_modulenames + fi + wait `pidof udev` + fi + sleep 15 +} + +unload_dvb_modules() +{ + for MODULE in $MODULES; do + rmmod $MODULE >/dev/null 2>&1 + wait `pidof rmmod` + done +} + + +VDR_ERR=`mktemp -p /tmp vdr-err.XXXXXX` + +get_modulenames + +[ -z "$MODULES" ] && load_dvb_modules + +while (true) do + + set_permissions + + eval $VDRCMD >/dev/null 2>"$VDR_ERR" + + case $? in + 0) + exit + ;; + 2) + ERROR=`cat "$VDR_ERR"` + logger -t runvdr "stopping after fatal fail ($ERROR)" + exit + ;; + esac + + logger -t runvdr "restarting VDR" + killall -q -TERM /usr/bin/vdr + wait `pidof vdr` + unload_dvb_modules + sleep 2 + load_dvb_modules + +done --- vdr-1.7.14.orig/debian/dependencies.sh +++ vdr-1.7.14/debian/dependencies.sh @@ -0,0 +1,21 @@ +# dependencies.sh - vdr plugins depend on the current vdr version +# +# This script is called in debian/rules of vdr plugins: +# sh /usr/share/vdr-dev/dependencies.sh +# +# It sets a dependency to the current vdr version for all binary packages of the +# plugin package. The current vdr version is the version of the vdr-dev package +# used to compile the plugin package. +# +# This script sets the substitution variable "vdr:Depends" which is used in the +# debian/control file of vdr plugins, e.g.: +# Depends: ${vdr:Depends} + +set -e + +ABI_VERSION=`cat /usr/share/vdr-dev/abi-version` + +# A plugin requires exactly the VDR ABI version it was compiled for +for p in $(dh_listpackages); do + echo "vdr:Depends=$ABI_VERSION" >> debian/$p.substvars +done --- vdr-1.7.14.orig/debian/reccmds.custom.conf +++ vdr-1.7.14/debian/reccmds.custom.conf @@ -0,0 +1,28 @@ +# +# This is an example file for defining external commands, that will be +# accessible as commands at the recordings list. +# The commands will be executed under the same user id that vdr is running +# with, so take care if your are running vdr as root! +# +# The format of a command entry is: : <command> +# <title> is the menu text shown on the OSD and <command> is the command to +# be executed. Everything that <command> writes to stdout will be displayed +# on the OSD. Also the name of the selected recording will be passed +# in single quotes as the first parameter to the command, e.g.: +# +# Show me the recording name: echo +# +# If you uncomment the line above and restart vdr, you will have a new +# recordings command menu entry, called "Show me the recording name", that +# will simply show you the recording name :-) +# +# You can divide your commands into submenus, e.g.: +# +# main menu node { +# sub menu entry 1 : do_something.sh +# sub menu entry 2 : do_something_else.sh +# sub menu node { +# sub-sub menu entry : do_whatever_you_want.sh +# } +# } +# --- vdr-1.7.14.orig/debian/copyright +++ vdr-1.7.14/debian/copyright @@ -0,0 +1,59 @@ +Upstream Homepage: + http://www.tvdr.de/ + +Upstream Author: + Klaus Schmidinger <Klaus.Schmidinger@tvdr.de> and others + +Patch Authors: + ttxtsubs - Ragnar Sundblad <ragge@nada.kth.se> + http://www.nada.kth.se/~ragge/vdr/ttxtsubs/ + + jumpplay - Torsten Kunkel <vdr@tkunkel.de> (initial version) + Thomas Günther <tom@toms-cafe.de> (current version) + +Theme Authors: + Blue LCARS - (debian/themes/sttng-blue.theme) from Sascha Volkenandt + <sascha@akv-soft.de> was downloaded from + http://www.magoa.net/sttng-blue.theme + + Cool - (debian/themes/sttng-cool.theme) from + clocker@vdrportal.de, downloaded from + http://vdrportal.de/board/thread.php?postid=260715#post260715 + +Debian Maintainers: + Tobias Grimm <etobi@debian.org> + Thomas Günther <tom@toms-cafe.de> + Thomas Schmidt <tschmidt@debian.org> + +Copyright: + (C) 2000 - 2009 Klaus Schmidinger + (C) 2001 - 2002 Andreas Schultz (SPU decoder for DVB devices) + (C) 2003 Marcel Wiesweg, Rolf Hakenes (libsi) + +Copyright (Debian packaging): + (C) 2001 - 2002 Eduard Bloch + (C) 2003 - 2004 Andreas Müller + (C) 2002 - 2009 Tobias Grimm, Thomas Günther, Thomas Schmidt + +License: + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + 02110-1301, USA. + + The complete text of the GNU General Public License can be found + in /usr/share/common-licenses/GPL-2 on most Debian systems. + +License (Debian packaging): + The Debian packaging is licensed under the GPL, version 2 or any + later version, see /usr/share/common-licenses/GPL-2. --- vdr-1.7.14.orig/debian/vdr.postrm +++ vdr-1.7.14/debian/vdr.postrm @@ -0,0 +1,46 @@ +#! /bin/sh +# postrm script for vdr-plugin-#PACKAGE# +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * <postrm> `remove' +# * <postrm> `purge' +# * <old-postrm> `upgrade' <new-version> +# * <new-postrm> `failed-upgrade' <old-version> +# * <new-postrm> `abort-install' +# * <new-postrm> `abort-install' <old-version> +# * <new-postrm> `abort-upgrade' <old-version> +# * <disappearer's-postrm> `disappear' <r>overwrit>r> <new-version> +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + purge) + rm -f /var/cache/vdr/plugin_search_cache* > /dev/null 2>&1 || true + rm -f /var/cache/vdr/commands.conf > /dev/null 2>&1 || true + rm -f /var/cache/vdr/reccmds.conf > /dev/null 2>&1 || true + rm -f /var/cache/vdr/epg.data > /dev/null 2>&1 || true + rm -f /var/lib/vdr/channels.conf > /dev/null 2>&1 || true + rm -f /var/lib/vdr/remote.conf > /dev/null 2>&1 || true + rm -f /var/lib/vdr/remote.*.conf > /dev/null 2>&1 || true + rm -f /var/lib/vdr/setup.conf > /dev/null 2>&1 || true + rm -f /var/lib/vdr/timers.conf > /dev/null 2>&1 || true + ;; + remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) + ;; + *) + echo "postrm called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 --- vdr-1.7.14.orig/debian/valgrind.supp +++ vdr-1.7.14/debian/valgrind.supp @@ -0,0 +1,22 @@ +# +# This is a valgrind suppression file for VDR +# + +{ + cThread::Start + Memcheck:Param + write(buf) + fun:write + fun:_ZN7cThread5StartEv +} + +{ + cThread::Start/pthread_create + Memcheck:Param + write(buf) + fun:write + fun:pthread_create@@GLIBC_2.1 + fun:_ZN7cThread5StartEv + fun:_ZN11cRecordings6UpdateEb + fun:main +} --- vdr-1.7.14.orig/debian/commands.shutdownvdr.conf +++ vdr-1.7.14/debian/commands.shutdownvdr.conf @@ -0,0 +1 @@ +System herunterfahren?:/usr/bin/poweroffvdr --- vdr-1.7.14.orig/debian/vdr.NEWS +++ vdr-1.7.14/debian/vdr.NEWS @@ -0,0 +1,77 @@ +vdr (1.4.6-2) experimental; urgency=low + + The script /usr/lib/vdr/vdr-groups.sh may now be used by plugins to + manage the group memberships of the user 'vdr'. See README.Debian + for details on how to use this script. + + If you manually need to add the user 'vdr' to a group, you should + add the group name to /etc/vdr/vdr-groups. This way the vdr-groups.sh + script used by plugin installation/deinstallation procedures does + not try to remove vdr from this group. + + -- Tobias Grimm <tg@e-tobi.net> Sun, 6 May 2007 20:43:44 +0200 + +vdr (1.2.6-9) experimental; urgency=low + + This release adds a patch which allows us to have just one binary- + package for all four control-methods, so we do not need the + packages vdr-daemon, vdr-kbd, vdr-lirc and vdr-rcu anymore. + You can run vdr with the control-method you want by calling + /usr/bin/vdr-{daemon,kbd,lirc,rcu} or by using + + update-alternatives --config vdr + + and setting it to the desired control-method. (lirc is default) + After this a call of /usr/bin/vdr will always use the control- + method you selected with update-alternatives. + + -- Thomas Schmidt <tschmidt@debian.org> Sun, 27 Feb 2005 00:44:05 +0100 + +vdr (1.2.6-6) unstable; urgency=low + + The most important change in this release is that vdr from now on + will run under the username vdr, not as root. This is due to some + security problems when vdr runs as root. The video-directory and + configfiles will be changed at installation, so they are owned by + the user and group vdr. + + The second thing is that the automatic shutdown of vdr is now disabled + by default, you can enable it again by changing ENABLE_SHUTDOWN to 1 + in /etc/default/vdr. + + In this release we also changed the default VIDEO_DIR from + /var/lib/video to /var/lib/video.00, to make adding extra harddisks + for vdr very easy by just creating /var/lib/video.0{1,2,3,...} and + mounting the drive(s) there. In existing installations we will simply + create a symlink /var/lib/video.00 which points to /var/lib/video. In + new installations /var/lib/video will be a symlink which points to + /var/lib/video.00. (These changes will only be asked for when you + selected yes in the debconf-question to create the video-directory!) + + -- Thomas Schmidt <tschmidt@debian.org> Fri, 14 Jan 2005 12:17:51 +0100 + +vdr (1.2.6-4) unstable; urgency=low + + This is the first release from the VDR and DVB Packaging Team + <pkg-vdr-dvb-devel@lists.alioth.debian.org> + Many thanks to Tobias Grimm and Thomas Günther for the various improvements + of the package. + + In this Release, we changed the path of the conf-files to /var/lib/vdr, + static conf-files will still be under /etc/vdr, and symlinked to + /var/lib/vdr. + If you already have non-static files (channels.conf, remote.conf, + setup.conf and timers.conf), these files will be moved by the + postinst-script to /var/lib/vdr. + + The most important change in this release is the new init-system of vdr, + which was taken from c't-vdr, a woody-based distribution, optimized for vdr. + - Plugins are no longer loaded via /etc/default/vdr. Instead of this, + every installed plugin will be loaded automatically. The order of the + plugins can be configured via /etc/vdr/plugins/order.conf. + - The commands.conf and the reccmds.conf files will be auto-generated + by the init-script for better integration of vdr-addons. + If you already have a commands.conf or reccmds.conf, you should move it + to /etc/vdr/command-hooks/{commands|reccmds}.custom.conf . + + -- Thomas Schmidt <tschmidt@debian.org> Sat, 29 May 2004 19:43:49 +0200 --- vdr-1.7.14.orig/debian/poweroffvdr +++ vdr-1.7.14/debian/poweroffvdr @@ -0,0 +1,11 @@ +#!/bin/sh +# +# poweroffvdr - Tobias Grimm <tg@e-tobi.net> +# ----------- +# +# This hits the virtual power key of VDR +# + +at now <<EOF + /usr/lib/vdr/svdrpsend.pl HITK Power +EOF --- vdr-1.7.14.orig/debian/compat +++ vdr-1.7.14/debian/compat @@ -0,0 +1 @@ +5 --- vdr-1.7.14.orig/debian/README.source +++ vdr-1.7.14/debian/README.source @@ -0,0 +1,7 @@ +This package uses the dpatch system to save and apply patches to the +upstream source code of the software that is packaged. For details +about how to use dpatch read + + /usr/share/doc/dpatch/README.source.gz + +from the dpatch package. --- vdr-1.7.14.orig/debian/changelog +++ vdr-1.7.14/debian/changelog @@ -0,0 +1,1840 @@ +vdr (1.7.14-2yavdr1) karmic; urgency=low + + * added opt-55_wareagleicon.dpatch + * Reb. for karmic-yavdr-repo + + -- Holger Schvestka <hotzenplotz5@gmx.de> Mon, 15 Mar 2010 18:48:49 +0100 + +vdr (1.7.14-1devel1) experimental; urgency=low + + * New upstream release + * Updated opt-20_liemikuutio.dpatch + * Adapted opt-52_hard_link_cutter.dpatch + * Removed opt-30-x_analogtv.dpatch + * Removed opt-49-x_pvrinput.dpatch + * Removed opt-54_deltimeshiftrec.dpatch + + -- Thomas Günther <tom@toms-cafe.de> Sun, 14 Mar 2010 19:25:37 +0100 + +vdr (1.7.13-1devel1) experimental; urgency=low + + [ Thomas Günther ] + * New upstream release + * Added Make.global to vdr-dev.install and 81_Make_config.dpatch + * Removed BUILDVDR define + * Deactivated 09_sort_options.dpatch + * Removed 10_dd-record-option.dpatch + * Updated opt-20_liemikuutio.dpatch + * Adapted opt-27_ttxtsubs.dpatch + * Removed opt-40_pluginparam.dpatch + * Adapted opt-41-x_timer-info.dpatch + * Adapted opt-44_rotor.dpatch + * Removed opt-47_sourcecaps.dpatch + * Adapted opt-50_graphtft.dpatch + * Removed from multipatch: analogtv + * Added include links via debian/vdr-dev.links to make the include structure + compatible to vdr standards + * Added dvb-s2api-liplianin-headers | linux-libc-dev (>= 2.6.29) to Depends + of package vdr-dev (linux/dvb/*.h included in header files, e.g. device.h) + + [ Tobias Grimm ] + * Adapted opt-27_ttxtsubs.dpatch (No ABI changes) + * Standards-Version: 3.8.4 + * Made init script require $remote_fs (/usr/...) + + -- Thomas Günther <tom@toms-cafe.de> Thu, 04 Mar 2010 23:12:27 +0100 + +vdr (1.7.12-1devel3) experimental; urgency=low + + * Updated opt-27_ttxtsubs.dpatch again + + -- Tobias Grimm <etobi@debian.org> Tue, 23 Feb 2010 23:25:21 +0100 + +vdr (1.7.12-1devel2) experimental; urgency=low + + * Updated opt-27_ttxtsubs.dpatch - it now stores the manual page + selection in the channel settings + + -- Tobias Grimm <etobi@debian.org> Fri, 05 Feb 2010 23:19:21 +0100 + +vdr (1.7.12-1devel1) experimental; urgency=low + + * New upstream release + * Removed 03_cmdsubmenu.dpatch (command submenus now integrated in upstream) + * Adapted 10_dd-record-option.dpatch + * Upgraded opt-20_liemikuutio.dpatch to version 1.30 + * Adapted opt-27_ttxtsubs.dpatch + * Adapted opt-48-x_pin.dpatch + * Added opt-22-x_edit_marks.dpatch and activated in multipatch + + -- Thomas Günther <tom@toms-cafe.de> Thu, 04 Feb 2010 02:47:29 +0100 + +vdr (1.7.11-1devel1) experimental; urgency=low + + * New upstream release + * Removed 99_vdr-1.7.10-missing-reset-of-file-size.dpatch + * Removed 14_cap-memsize.dpatch + * Removed 99_dvb-header-fixes.dpatch + * Added 99_vdr-workaround-broken-sys-capability.dpatch + * Updated 82_valgrind.dpatch + * Upgraded opt-20_liemikuutio.dpatch to version 1.29 + * Adapted opt-27_ttxtsubs.dpatch + * Adapted opt-44_rotor.dpatch + * Adapted opt-45_yaepg.dpatch + * Adapted opt-48-x_pin.dpatch + * Adapted opt-52_hard_link_cutter.dpatch + * Removed installation of the sky plugin + * Added installation of the dvbsddevice plugin + * Removed from multipatch: dvbsetup + + -- Thomas Günther <tom@toms-cafe.de> Sun, 10 Jan 2010 18:55:11 +0100 + +vdr (1.7.10-1devel1) experimental; urgency=low + + [ Thomas Günther ] + * New upstream release + * Removed 99_dvb-api-v5.dpatch + * Removed 99_vdr-1.7.9-remux.dpatch + * Added 99_vdr-1.7.10-missing-reset-of-file-size.dpatch + * Updated opt-20_liemikuutio.dpatch + * Adapted opt-27_ttxtsubs.dpatch + * Upgraded opt-52_hard_link_cutter.dpatch to version 0.2.2 + + [ Tobias Grimm ] + * Added option LIRC to /etc/default/vdr, which allows to change the LIRC device + or disabling it by setting it to /dev/null + * Standards-Version: 3.8.3 + * Don't ignore errors in preinst + * New upstream homepage http://www.tvdr.de/ + * Removed make-special-vdr.sh (Closes: #552638) + * Added README.source + + -- Thomas Günther <tom@toms-cafe.de> Mon, 23 Nov 2009 22:11:47 +0100 + +vdr (1.7.9-1devel2) experimental; urgency=low + + * Added 99_dvb-api-v5.dpatch + * Added 99_vdr-1.7.9-remux.dpatch + + -- Thomas Günther <tom@toms-cafe.de> Wed, 04 Nov 2009 00:29:08 +0100 + +vdr (1.7.9-1devel1) experimental; urgency=low + + * New upstream release + * Upgraded opt-20_liemikuutio.dpatch to version 1.28 + * Adapted opt-27_ttxtsubs.dpatch + * Updated opt-48_pin.dpatch + * Upgraded make-special-vdr.sh to version 1.3 + + -- Thomas Günther <tom@toms-cafe.de> Thu, 27 Aug 2009 02:04:31 +0200 + +vdr (1.7.8-1devel2) experimental; urgency=low + + * Updated opt-50_graphtft.dpatch (from graphtft svn repository) + * Added opt-50_graphtft-liemikuutio.dpatch (from graphtft svn repository - + its now separated from the base graphtft patch) + * Added opt-91_ext-graphtft.dpatch and extension-patch-helper.sh to set the + USE_GRAPHTFT define, which is used in several plugins + * Fixed version history in make-special-vdr.sh + + -- Thomas Günther <tom@toms-cafe.de> Wed, 29 Jul 2009 23:14:33 +0200 + +vdr (1.7.8-1devel1) experimental; urgency=low + + * New upstream release + * Adapted 99_dvb-header-fixes.dpatch + * Adapted opt-27_ttxtsubs.dpatch + * Removed opt-28_audioindexer.dpatch and opt-29_syncearly-audioindexer.dpatch + * Adapted opt-39_noepg.dpatch + * Updated opt-44_rotor.dpatch and reactivated in multipatch + * Updated opt-47_sourcecaps.dpatch and reactivated in multipatch + * Updated opt-53_dvbsetup.dpatch and reactivated in multipatch + * Adapted opt-54_deltimeshiftrec.dpatch + + -- Thomas Günther <tom@toms-cafe.de> Sun, 14 Jun 2009 20:30:20 +0200 + +vdr (1.7.7-1devel2) experimental; urgency=low + + [ Thomas Günther ] + * Updated make-special-vdr.sh to version 1.2 + + [ Tobias Grimm ] + * Converted commands.ctvdr.conf to UTF-8 + * Fixed ctvdrinfo + * Dropped Kernel 2.4 support in runvdr + + -- Thomas Günther <tom@toms-cafe.de> Sun, 07 Jun 2009 23:45:48 +0200 + +vdr (1.7.7-1devel1) experimental; urgency=low + + * New upstream release + * Updated make-special-vdr.sh to version 1.1 + * Updated opt-20_liemikuutio.dpatch + * Updated opt-27_ttxtsubs.dpatch + * Updated opt-39_noepg.dpatch + * Renamed opt-40_iptv.dpatch to opt-40_pluginparam.dpatch + * Bumped standards version to 3.8.1 + * Changed section to "video" + + -- Thomas Günther <tom@toms-cafe.de> Mon, 04 May 2009 23:02:26 +0200 + +vdr (1.7.6-1devel1) experimental; urgency=low + + * New upstream release + + [ Tobias Grimm ] + * Upgraded and reactivated opt-27_ttxtsubs.dpatch + * Updated opt-48_pin.dpatch to match the new ttxtsubs patch + * New ABI version for multipatch + * Upgraded opt-20_liemikuutio.dpatch to version 1.27 + + [ Thomas Günther ] + * Adapted opt-24_jumpplay.dpatch + * Adapted opt-52_hard_link_cutter.dpatch + + -- Thomas Günther <tom@toms-cafe.de> Mon, 27 Apr 2009 18:57:18 +0200 + +vdr (1.7.5-1devel1) experimental; urgency=low + + * New upstream release + + [ Thomas Günther ] + * Added removal of vdr-dbg.1 to clean target in debian/rules + * Fixed substitution of 00list in debian/rules + * Upgraded make-special-vdr.sh to version 1.0 + * Added dvb-s2api-liplianin-headers to Build-Depends + * Modified 81_Make_config.dpatch to add dvb-s2api-liplianin-headers include + and largefile defines + * Added French language texts to 10_dd-record-option.dpatch (Thx to Michaël + Nival) + * Adapted 10_dd-record-option.dpatch + * Removed 15_dvbplayer.dpatch + * Adapted 82_valgrind.dpatch + * Removed 99_dvb-api-wrapper.dpatch + * Upgraded opt-20_liemikuutio.dpatch to version 1.26 + * Upgraded opt-24_jumpplay.dpatch to version 1.0 + * Adapted opt-30-x_analogtv.dpatch + * Added French language texts to opt-38_disableDoubleEpgEntrys.dpatch (Thx to + Michaël Nival) + * Adapted opt-40_iptv.dpatch + * Adapted opt-51_cuttime.dpatch + * Upgraded opt-52_hard_link_cutter.dpatch to version 0.2.1 + * Removed from multipatch: ttxtsubs, audioindexer, syncearly, rotor, + sourcecaps, dvbsetup + + [ Tobias Grimm ] + * Added -p to bash shebang line of init script again, because this is needed, + if VDR calls the init script itself via a suid wrapper + * Added uploades to debian/control ("dch -r" will otherwise do a NMU) + * Applied a lot of spelling fixes (Thanks to Michael Nork!) + * Using txt2man for manpages that used docbook before + * Upgraded opt-39_noepg.dpatch to the patch taken from the vdr-noepgmenu + plugin 0.0.6.beta3 + * Added opt-52_hard_link_cutter.dpatch + * Modified opt-49-x_pvrinput.dpatch: Added CA-Id's 0xA1 and 0xA2, required by + pvrusb2 as suggested by Christian Jarczyk + * Install vdr.groups to /etc/vdr/ instead of /etc/vdr/groups.d/ + * Installing the pictures plugin now with vdr-plugin-examples + * Replaced usage of 'at' with 'nohupc -c "( command )" >/dev/null 2>&1 &' + * Made valgrind a Suggests and check in vdrleaktest, if valgrind exists + (Closes: #489003) + * Using "Provides: vdr-abi-1.6.0-debian" now, which plugin packages can depend + on. This way only plugins compiled for the specified ABI version can be + installed, allowing us to remove the runtime patch level test. + (Closes: #489914) + * Removed debian/linda + * Added opt-21_internal-cam-devices.dpatch + * Added opt-53_dvbsetup.dpatch + * Added opt-54_deltimeshiftrec.dpatch + * Replaced libcap-dev build dependency by libcap2-dev | libcap-dev (Closes: #492681) + * Fixed detection of default LANG setting to be used for VDR + * Updated README.Debian (Closes: #499047) + * Changed my maintainer/uploader email address + * Fixed reference to /usr/share/doc/vdr/README.Debian.gz in /etc/default/vdr + * Added missing dpatch descriptions + * Removed Lintian ovverride "shell-script-fails-syntax-check" for + ./usr/share/vdr-dev/plugin-template/rules + * Bumped Standards-Version to 3.8.0 + * Removed stdout output from vdrleaktest to /tmp/memleaktest.log, + create tempfile in debugvdr using mktemp now, to prevent + possible symlink attacks (Closes: #496421) + * Build-Depend on dvb-s2api-liplianin-headers | linux-libc-dev (>= 2.6.29) + * Added 99_dvb-header-fixes.dpatch as a workaround for the header bugs in + Linux 2.6.29 + + [ Thomas Schmidt ] + * Fixed bashism in debian/rules (Closes: #491586) + + [ Thomas Günther ] + * Updated debian/copyright + + -- Thomas Günther <tom@toms-cafe.de> Sun, 19 Apr 2009 18:55:52 +0200 + +vdr (1.7.0-1devel1) experimental; urgency=low + + [ Thomas Günther ] + * New upstream release + * Upgraded make-special-vdr.sh to version 0.9 + * Upgraded opt-41-x_timer-info.dpatch to version 0.5 + * Removed 99_vdr-1.5.13-UpdateTransponders.dpatch (fixed upstream) + * Added 99_dvb-api-wrapper.dpatch + * Upgraded opt-20_liemikuutio.dpatch to version 1.20 + * Updated opt-27_ttxtsubs.dpatch + * Adapted opt-30-x_analogtv.dpatch + * Adapted opt-40_iptv.dpatch + * Adapted opt-48-x_pin.dpatch + * Adapted opt-49-x_pvrinput.dpatch + * Improved caching in plugin-loader.sh + + [ Tobias Grimm ] + * Synced opt-20_liemikuutio.dpatch with the latest upstream release + * Adapted opt-30-x_analogtv.dpatch for VDR 1.5.14 + * Removed opt-32_iptv.dpatch + * Removed opt-36_CutterQueue.dpatch + * Removed opt-36_CutterQueue-AutoDelete.dpatch + * Removed opt-46_dmh-dvd-archive.dpatch + * Removed opt-46_dvdarchive.dpatch + * Removed opt-46-x_dmh-dvd-archive-debian.dpatch + * Removed opt-49_sharelnb.dpatch + * Made debianize-vdrplugin create cdbs based plugin packages + * Updated 03_cmdsubmenu.dpatch + * Updated 09_sort_options.dpatch + * Upgraded opt-20_liemikuutio.dpatch to version 1.18 + * Updated opt-30-x_analogtv.dpatch + * Updated opt-43-x_recordshowfree.dpatch + * Upgraded opt-40_iptv.dpatch to version 0.0.6 of the IPTV plugin + * Updated opt-41-x_timer-info.dpatch + * Updated opt-48-x_pin.dpatch + * Updating /var/lib/vdr/channels.conf in postinst + * Added opt-49-x_pvrinput.dpatch + * Updated opt-31-x_reelchannelscan + * Updated opt-47_sourcecaps + * Updated opt-90_extensions + * Added 01_pic2mpg-debian.dpatch + * Added 99_ncursesw-include.dpatch + * Added installation of the pictures plugin + * Line-wrapped dependencies in debian/control + * COMPAT=5, debhelper (>= 5) + * Removed NONPTL settings + * Set VDR_LANG to LANG from /etc/environment by default, fall back to "C" + when LANG is not set + * Removed default VDR_LANG=de_DE.ISO-8859-15@euro setting + * Updated debian/copyright + * Added short description to the NAME section of the manpages to fix the + Lintian manpage-has-bad-whatis-entry warning + * Synced runvdr with Alioth-version of VDR: + - Removed VDSB (video data stream broken) workaround + - Removed NONPTL code + * Removed upgrade code for VDR 1.2.6 and 1.3.0 from postinst + * Upgraded opt-20_liemikuutio.dpatch to version 1.19 + * Added patch description to opt-28_audioindexer.dpatch + * Upgraded opt-40_iptv.dpatch to the version shipped with version 0.0.7 + of the IPTV plugin (only syntactic changes) + * Updated opt-31_reelchannelscan.dpatch + * Added some lines of documentation to README.Debian, explaining that + plugins manually copied to /usr/lib/vdr/plugins will only be loaded + when PLUGIN_CHECK_PATCHLEVEL=no (closes: #426921) + * Added manpages for vdr-dbg, debugvdr, vdrleaktest, vdrdbg-buildpackage + and pic2mpg + * Added support for VDR_CHARSET_OVERRIDE=<CHARSET> in /etc/default/vdr + * Made vdrleaktest and debugvdr explicitly using bash, because + commands-loader.sh and plugin-loader.sh contain bashisms + * Fixed debian/copyright + * Instead of setting VFAT=1 at compile time, introduced a new + configuration option in /etc/default/vdr (using VDR's + --vfat option), so that the VFAT support can be disabled + * Upgraded opt-37-x_menuorg.dpatch to version 0.4.2 + * Updated opt-48-x_pin.dpatch + * Bumped Standards-Version to 3.7.3 + * Added Homepage field to debian/control + * Upgraded opt-50_graphtft-0.1.dpatch to current version 0.1.7~alpha of the + GraphTFT plugin (taken from the Zulu Extensions Patch 56) and renamed it + to opt-50_graphtft.dpatch (deleted old opt-50_graphtft.dpatch) + * Added caching to plugin-loader.sh to speed up the initial startup of vdr + (Patch provided by Michael Burian <michael.burian@sbg.at>) + * Modified 81_Make_config.dpatch to set the default CXXFLAGS and CFLAGS + required for building VDR and VDR plugins. This was necessary, because newer + versions of dpkg-buildpackage export CXXFLAGS. Because the upstream's + Makefile of VDR and VDR plugins usually define the compiler arguments + as "CXXFLAGS ?=...", these settings are ignored when an environment variable + CXXFLAGS exists. On non-i386 builds this causes a FTBFS for all plugins, + because of the missing -fPIC. Plugins, that require special compiler + arguments, should from now on pass CXXFLAGS as an argument to the make call + in debian/rules. (closes: #475710) + * Made Make.config handle DEB_BUILD_OPTIONS=noopt, so all plugins including + Make.config in their Makefile will inherently support noopt as well + (see also Debian Policy 3.7.3.0 section 10.1) + + -- Thomas Günther <tom@toms-cafe.de> Mon, 14 Apr 2008 21:41:55 +0200 + +vdr (1.5.13-1devel2) unstable; urgency=low + + * Added 99_vdr-1.5.13-UpdateTransponders.dpatch + * Upgraded make-special-vdr.sh to version 0.7 + + -- Thomas Günther <tom@toms-cafe.de> Tue, 12 Feb 2008 00:44:49 +0100 + +vdr (1.5.13-1devel1) unstable; urgency=low + + [ Thomas Günther ] + * New upstream release + * Updated opt-20_liemikuutio.dpatch + * Adapted opt-40_iptv.dpatch + * Adapted opt-41-x_timer-info.dpatch + * Adapted opt-48-x_pin.dpatch + + [ Tobias Grimm ] + * Changed copyright file in the new plug-in template to match + the new debian/copyright schema for VDR packages + * Added fix to opt-38_disableDoubleEpgEntrys.dpatch, to avoid sprintf buffer + overflows + * Synched some changes from vdr 1.4.7-3 made by Thomas Schmidt: + - Removed menu file, vdr should always be used as daemon + - Removed override for lintian warning menu-command-not-in-package + - Do not include empty directory /usr/lib/vdr/plugins + - Use ${binary:Version} instead of ${Source-Version} to make package + binNMUable + - Do not ignore errors in clean-target + - Converted debian/copyright to UTF-8 + * Using empty directory /usr/lib/vdr/plugins again and adding lintian + override for "package-contains-empty-directory" warning - VDR + requires the plugin directory! + + -- Thomas Günther <tom@toms-cafe.de> Wed, 16 Jan 2008 10:08:33 +0100 + +vdr (1.5.12-1devel1) unstable; urgency=low + + * New upstream release + * Added opt-29_syncearly.dpatch and opt-29_syncearly-audioindexer.dpatch + + -- Thomas Günther <tom@toms-cafe.de> Tue, 20 Nov 2007 23:31:11 +0100 + +vdr (1.5.11-1devel1) unstable; urgency=low + + [ Thomas Günther ] + * New upstream release + * Adapted opt-20_liemikuutio.dpatch + + [ Tobias Grimm ] + * Added opt_40-iptv.dpatch + * Added opt-28_audioindexer.dpatch + + -- Thomas Günther <tom@toms-cafe.de> Tue, 6 Nov 2007 23:26:49 +0100 + +vdr (1.5.10-1devel2) unstable; urgency=low + + [ Tobias Grimm ] + * Applied modification from Michaël Nival to opt-45_yaepg.dpatch that fixes a + small bug + + [ Thomas Günther ] + * Updated opt-39_noepg.dpatch + + -- Thomas Günther <tom@toms-cafe.de> Tue, 23 Oct 2007 22:55:47 +0200 + +vdr (1.5.10-1devel1) unstable; urgency=low + + * New upstream release + * Removed 99_vdr-1.5.9-skincurses.dpatch (fixed upstream) + * Replaced opt-27_subtitles-ttxtsubs.dpatch with opt-27_ttxtsubs.dpatch + (subtitles support now integrated in upstream) + * Updated opt-39_noepg.dpatch (Thx to Torsten/WarEagle at vdrportal.de) + * Adapted opt-48-x_pin.dpatch + + -- Thomas Günther <tom@toms-cafe.de> Tue, 16 Oct 2007 23:22:39 +0200 + +vdr (1.5.9-1devel2) unstable; urgency=low + + [ Tobias Grimm ] + * Changed copyright file in the new plugin template to match + the new debian/copyright schema for VDR packages + + [ Thomas Günther ] + * Changed locale directory to /usr/share/locale + + -- Thomas Günther <tom@toms-cafe.de> Wed, 26 Sep 2007 00:58:07 +0200 + +vdr (1.5.9-1devel1) unstable; urgency=low + + [ Thomas Günther ] + * New upstream release + * Removed 02_Makefile-CFGDIR.dpatch + * Updated opt-27_subtitles-ttxtsubs.dpatch + * Adapted opt-45_yaepg.dpatch + * Added 99_vdr-1.5.9-skincurses.dpatch + + [ Tobias Grimm ] + * Dropped opt-37_submenu.dpatch + * Updated opt-48_pin.dpatch and renamed to opt-48-x_pin.dpatch (it's ABI + neutral now) + * Dropped opt-48_pin-submenu.dpatch + * Adapted opt-50_graphtft-0.1.dpatch to new pin patch + + -- Thomas Günther <tom@toms-cafe.de> Sun, 26 Aug 2007 19:15:15 +0200 + +vdr (1.5.8-1devel1) unstable; urgency=low + + [ Thomas Günther ] + * New upstream release + * Added gettext to Build-Depends + * Adapted 02_Makefile-CFGDIR.dpatch + * Adapted 04_newplugin.dpatch + * Adapted 10_dd-record-option.dpatch + * Removed 99_vdr-1.5.6-premierenvod.dpatch + * Adapted opt-20_liemikuutio.dpatch + * Adapted opt-24_jumpplay.dpatch + * Updated opt-27_subtitles-ttxtsubs.dpatch + * Adapted opt-31-x_reelchannelscan.dpatch + * Adapted opt-38_disableDoubleEpgEntrys.dpatch + * Adapted opt-48_pin-submenu.dpatch + * Adapted opt-48_pin.dpatch + * Adapted opt-51_cuttime.dpatch + + [ Tobias Grimm ] + * Updated opt-37-x_menuorg.dpatch + + -- Thomas Günther <tom@toms-cafe.de> Thu, 23 Aug 2007 00:35:30 +0200 + +vdr (1.5.6-1devel1) unstable; urgency=low + + [ Tobias Grimm ] + * New upstream release + * Removed 99_vdr-1.5.5_tools_c.dpatch (fixed upstream) + * Added opt-51_cuttime.dpatch + * Added opt-43-x_recordshowfree.dpatch + * Added opt-37-x_menuorg.dpatch + + [ Thomas Günther ] + * Added 99_vdr-1.5.6-premierenvod.dpatch + * Added opt-48_pin-submenu.dpatch + * Added opt-50_graphtft-0.1.dpatch + + -- Thomas Günther <tom@toms-cafe.de> Tue, 14 Aug 2007 01:31:06 +0200 + +vdr (1.5.5-1devel3) unstable; urgency=low + + * Fixed opt-20_liemikuutio.dpatch (Thx to zulu@vdrportal) + * Updated opt-44_rotor.dpatch + + -- Thomas Günther <tom@toms-cafe.de> Sun, 8 Jul 2007 02:10:11 +0200 + +vdr (1.5.5-1devel2) unstable; urgency=low + + * Added VDR_LANG=de_DE.ISO-8859-15@euro to vdr.default + * Updated opt-46_dmh-dvd-archive.dpatch (Thx to skiller2k1@vdrportal) + * Adapted opt-36_CutterQueue.dpatch and opt-36_CutterQueue-AutoDelete.dpatch + * Added 99_vdr-1.5.5_tools_c.dpatch + + -- Thomas Günther <tom@toms-cafe.de> Tue, 3 Jul 2007 00:19:54 +0200 + +vdr (1.5.5-1devel1) unstable; urgency=low + + [ Thomas Günther ] + * New upstream release + * Removed 17_epg-conv-iso6937.dpatch + * Added libfreetype6-dev and libfontconfig-dev to Build-Depends + * Replaced libncurses5-dev with libncursesw5-dev in Build-Depends + * Added ttf-bitstream-vera | ttf-freefont to vdr Recommends + * Adapted opt-20_liemikuutio.dpatch + * Updated opt-27_subtitles-ttxtsubs.dpatch + * Removed opt-40_wareagle-icons.dpatch + * Adapted opt-45_yaepg.dpatch + * Adapted opt-46_dmh-dvd-archive.dpatch + * Adapted opt-48_pin.dpatch + * Upgraded make-special-vdr.sh to version 0.6 (xineliboutput, + burnbackgrounds, debianize-vdrplugin, vompserver) + + [ Thomas Schmidt ] + * Added vdr-groups.sh script which can be used by plugins which require the + user vdr to be a member in additional system groups, see README.Debian + for additional information + * Removed version from build dependency to dpatch - even Sarge has the + required version + + [ Tobias Grimm ] + * Adapted 15_dvbplayer.dpatch + * vdr will no longer be added to the group cdrom by default. This has to be + done by the plugin, using the vdr-groups.sh script introduced in this + version + * Installing svdrpsend in /usr/bin for easier manual access + + -- Thomas Günther <tom@toms-cafe.de> Wed, 27 Jun 2007 03:06:06 +0200 + +vdr (1.5.2-1devel1) unstable; urgency=low + + [ Thomas Günther ] + * New upstream release + * Updated opt-20_liemikuutio.dpatch + * Updated opt-27_subtitles-ttxtsubs.dpatch + * Removed opt-27-x_subtitles-ttxtsubs-volumebar-fix.dpatch (now + integrated in opt-27_subtitles-ttxtsubs.dpatch) + * Adapted opt-45_yaepg.dpatch + * Adapted opt-48_pin.dpatch + * Removed debug logs in 17_epg-conv-iso6937.dpatch + + [ Tobias Grimm ] + * Upgraded opt-48_pin.dpatch + * Updated opt-50_graphtft.dpatch + * Added opt-42-x_MainMenuHooks.dpatch + * Removed opt-43-x_epgsearch.dpatch + * Removed opt-42-x_extrecmenu.dpatch + * opt-46_dvdarchive, opt-46_dmh-dvd-archive and opt-46-x_dmh-dvd-archive-debian + are no longer included in "multipatch" - use the extrecmenu plugin instead! + * Added opt-31-x_reelchannelscan.dpatch + + -- Thomas Günther <tom@toms-cafe.de> Fri, 27 Apr 2007 23:47:37 +0200 + +vdr (1.5.1-1devel1) unstable; urgency=low + + [ Thomas Günther ] + * New upstream release + * Updated opt-20_liemikuutio.dpatch + * Updated opt-27_subtitles-ttxtsubs.dpatch + * Adapted opt-38_disableDoubleEpgEntrys.dpatch + * Adapted opt-46_dvdarchive.dpatch + * Adapted opt-46_dmh-dvd-archive.dpatch + * Adapted opt-46-x_dmh-dvd-archive-debian.dpatch + * Adapted opt-48_pin.dpatch + * Adapted opt-50_graphtft.dpatch + * Upgraded make-special-vdr.sh to version 0.5 (fixed detection of *.vdr files + in burn plugin, updated for new vompserver release, updated for new graphtft + release) + * Added 17_epg-conv-iso6937.dpatch (convert EPG of UPC Direct / HBO + from iso6937 to iso8859-2) (closes: #384836) + * Added URL for developer version to debian/watch + + [ Tobias Grimm ] + * Set NONPTL=0 by default - since version 1.3.27 VDR should work with the + Native Posix Threading Library without problems. NONPTL can now be + enabled for AMD64 systems again, even if this should not be necessary. + * Added KEYB_TTY_SWITCH option which, when set to "1", makes VDR switch to + the console specified in KEYB_TTY on startup. Before this version, this + was the default behaviour when KEYB_TTY was specified. Now it's optional + and disabled by default. + * Added opt-50_graphtft.dpatch, required by the graphtft plugin version 0.0.15 + * Replaced "==" in shell scripts with "=" for compatibility reasons + (reported by Jörg (Kano) Schirottke) + * Updated debianize-vdrplugin for Debian Etch + * Added latest version of pin patch opt-48_pin-0.1.7.dpatch + * ctvdrinfo writes log now to /tmp/vdrinfo.log because /var/log is not + writeable for user vdr (closes ctvdr ticket:37) + + -- Thomas Günther <tom@toms-cafe.de> Tue, 27 Feb 2007 18:20:36 +0100 + +vdr (1.5.0-1devel1) unstable; urgency=low + + * New upstream release + * Adapted 10_dd-record-option.dpatch + * Updated opt-20_liemikuutio.dpatch + * Updated opt-27_subtitles-ttxtsubs.dpatch + * Adapted opt-44_rotor.dpatch + * Adapted opt-47_sourcecaps.dpatch + * Adapted opt-48_pin.dpatch + + -- Thomas Günther <tom@toms-cafe.de> Sun, 21 Jan 2007 17:37:19 +0100 + +vdr (1.4.5-1ctvdr1) unstable; urgency=low + + [ Tobias Grimm ] + * New upstream release + * Removed Conflicts line from plugin template + * Upgraded opt-48_pin.dpatch to version 0.1.5b + * Synched lintian overrides with Alioth package + * Fixed debian/copyright and added list of Debian maintainers + * Took runvdr man page from Alioth package + * Added a linda override file to source package - at the moment it will not + be installed by any binary package + + [ Thomas Günther ] + * Fixed installation of manpages for vdr-dev + * Replaced VDRdevel adaptions in debian/rules and plugin-template/rules + with make-special-vdr.sh + * Install make-special-vdr.sh into vdr-dev package - plugins can use this to + build plugin packages for special vdr packages + * Changed installation directory of patchlevel.sh and dependencies.sh from + /usr/lib/vdr-dev to /usr/share/vdr-dev + + [ Thomas Schmidt ] + * Removed linux-kernel-headers build dependency, not needed anymore + * Removed vdr-dev dependency on dvb-dev | linux-kernel-headers + (Ubuntu Bug #65340) + + -- Tobias Grimm <tg@e-tobi.net> Sun, 14 Jan 2007 22:07:15 +0100 + +vdr (1.4.4-1ctvdr1) unstable; urgency=low + + * New upstream release + + [ Tobias Grimm ] + * Removed 99_maintenance-patch-1.4.3-1.dpatch + * Removed 99_maintenance-patch-1.4.3-1-eit.dpatch + * Upgraded opt-48_pin.dpatch to version 0.1.1 + * Upgraded opt-20_liemikuutio.dpatch to version 1.13 + * Upgraded opt-49_sharelnb.dpatch + * Created symlinks of setup.conf, channels.conf, remote.conf and + /etc/default/vdr in /etc/vdr/ + + [ Thomas Günther ] + * Added german translation to opt-36_CutterQueue.dpatch and + opt-36_CutterQueue-AutoDelete.dpatch (Thx to wilderigel@vdrportal) + + -- Tobias Grimm <tg@e-tobi.net> Sun, 5 Nov 2006 22:39:25 +0100 + +vdr (1.4.3-1ctvdr3) unstable; urgency=low + + * Added 99_maintenance-patch-1.4.3-1-eit.dpatch + + -- Tobias Grimm <tg@e-tobi.net> Mon, 9 Oct 2006 20:13:52 +0200 + +vdr (1.4.3-1ctvdr2) unstable; urgency=low + + * Added 99_maintenance-patch-1.4.3-1.dpatch + + -- Tobias Grimm <tg@e-tobi.net> Sun, 8 Oct 2006 16:33:53 +0200 + +vdr (1.4.3-1ctvdr1) unstable; urgency=low + + [ Thomas Schmidt ] + * New upstream release + - Added LC_ALL=$VDR_LANG when calling vdr in debian/runvdr + + [ Tobias Grimm ] + * Removed changes to channels.conf.terr + * Upgraded opt-20_liemikuutio.dpatch to version 1.12 + * Added opt-46_dmh-dvd-archive.dpatch + * Added opt-46_dmh-dvd-archive-debian.dpatch + * Fixed shutdown script to not cause at to generate mails when a shutdown is + scheduled for later retry - fix provided by + Wolfgang Miller-Reichling <wolfgang@miller-reichling.de> + + -- Tobias Grimm <tg@e-tobi.net> Sat, 30 Sep 2006 14:40:46 +0200 + +vdr (1.4.2-1ctvdr2) unstable; urgency=low + + * Added opt-43-x_epgsearch.dpatch + + -- Tobias Grimm <tg@e-tobi.net> Wed, 30 Aug 2006 19:39:42 +0200 + +vdr (1.4.2-1ctvdr1) unstable; urgency=low + + * New upstream release + - Removed 01_IA64-FTBFS-fix.dpatch + - Removed 99_maintenance_1.4.1-1 + - Removed 99_maintenance_1.4.1-2 + * Set maintainer to Debian VDR Team + * Fixed typo in vdrleaktest (Thx to Thomas Creutz) + * Upgraded opt-20_liemikuutio.dpatch to version 1.9 + * Renamed opt-31_sharelnb.dpatch to opt-49_sharelnb.dpatch and adapted to + pin patch + * Added 16_channels.conf.terr-fix.dpatch to fix the example + channels.conf.terr + * Added opt-42-x_extrecmenu.dpatch + + -- Tobias Grimm <tg@e-tobi.net> Mon, 28 Aug 2006 23:18:25 +0200 + +vdr (1.4.1-1ctvdr4) unstable; urgency=low + + * Updated opt-20_liemkuutio.dpatch to version 1.8 + + -- Tobias Grimm <tg@e-tobi.net> Tue, 25 Jul 2006 09:22:14 +0200 + +vdr (1.4.1-1ctvdr3) unstable; urgency=low + + [ Tobias Grimm ] + * Added patch for PIN plugin to available patches + * Taken from Thomas Schmidt's changes on Alioth: + - debian/runvdr: use LANG=C when starting vdr, to + prevent vdr from exiting on system which use UTF8 as default locale, + this setting is also configurable in /etc/default/vdr + - Added LSB-Headers and status action to debian/vdr.init + + [ Thomas Günther ] + * Added 99_maintenance_1.4.1-2.dpatch + + -- Tobias Grimm <tg@e-tobi.net> Mon, 24 Jul 2006 19:42:29 +0200 + +vdr (1.4.1-1ctvdr2) unstable; urgency=low + + [ Thomas Günther ] + * Once again fixed crash text2skin + replaybar + volumebar in + opt-27_subtitles-ttxtsubs.dpatch + + [ Tobias Grimm ] + * Removed ${vdr:Conflicts} from plugin template + * Extracted bugfix for opt-27_subtitles-ttxtsubs.dpatch into + opt-27-x_subtitles-ttxtsubs-volumebar-fix + * Moved default setting for KEYB_TTY="" to config_loader.sh, because + this feature was added tp the official Debian-VDR + * Removed remotes-loader.sh + + -- Tobias Grimm <tg@e-tobi.net> Tue, 4 Jul 2006 00:16:33 +0200 + +vdr (1.4.1-1ctvdr1) unstable; urgency=low + + * New upstream release + * Tobias Grimm <tg@e-tobi.net> + - Stripped version numbers from patch names + - Removed maintenance patch 1.4.0-2 + - Removed opt-24_jumpplay-0.7.dpatch + - Upgraded opt-20_liemikuutio.dpatch from 1.6 to 1.7 + - Upgraded opt-27_subtitles-ttxtsubs.dpatch to subtitles 0.4.0 and + ttxtsubs 0.0.5 + - Upgraded opt-31_sharelnb.dpatch + - Added 99_maintenance_1.4.1-1.dpatch + + -- Debian VDR Team <pkg-vdr-dvb-devel@lists.alioth.debian.org> Fri, 23 Jun 2006 19:04:33 +0200 + +vdr (1.4.0-1ctvdr2) unstable; urgency=low + + * Thomas Günther <tom@toms-cafe.de> + - Added opt-24_jumpplay-0.9.dpatch (not activated) + - Upgraded 03_cmdsubmenu.dpatch to version 0.7 - fixes FTBFS with G++ 4.1: + extra qualification (closes: #367360) + * Tobias Grimm <tg@e-tobi.net> + - Added valgrind suppression file for vdrleaktest in vdr-dbg + - Stripped default SHUTDOWNCMD to "shutdown -h now" + - SHUTDOWNCMD in vdr-shutdown is now executed detached, so that VDR does not + block and can cleanly shutdown when receiving SIGTERM + (Thanks to Hanno Müller for pointing this out!) + - Increased timeout for stopping the VDR daemon from 5 to 30 seconds, because + VDR may take pretty long to shut down gracefully + - Moved some of the default values in vdr.default to the config loader + and added description to README.Debian + - Reverted the order of modules read from the lsmod output in runvdr for + kernel 2.6, because it was reported from several people, that the + order of DVB devices changes, when VDR restarts in runvdr. + (Thanks to Torsten Lang for pointing this out) + - Added maintenance patch 1.4.0-2 + - Updated opt-38_disableDoubleEpgEntrys.dpatch + + -- Debian VDR Team <pkg-vdr-dvb-devel@lists.alioth.debian.org> Tue, 6 Jun 2006 01:10:08 +0200 + +vdr (1.4.0-1ctvdr1) unstable; urgency=low + + * New upstream release + * Thomas Günther <tom@toms-cafe.de> + - Removed 99_vdr-1.3.49-1.4.0.dpatch + - Upgraded opt-20_liemikuutio-1.3.dpatch to opt-20_liemikuutio-1.5.dpatch + - Updated opt-27_subtitles-ttxtsubs.dpatch + - Fixed i18n texts for replay in 10_dd-record-option.dpatch + * Thomas Schmidt <tschmidt@debian.org> + - Conflict with vdradmin (<< 3.4.3) to force users to upgrade to + vdradmin-am, because the old vdradmin package which is partly + incompatible with newer vdr versions + - Fixed debian/watch + + -- Debian VDR Team <pkg-vdr-dvb-devel@lists.alioth.debian.org> Thu, 11 May 2006 22:23:12 +0200 + +vdr (1.3.49-1ctvdr2) unstable; urgency=low + + * Tobias Grimm <tg@e-tobi.net> + - Call target clean-plugins instead of plugins-clean in debian/rules + - Install vdrleaktest in vdr-dbg, which uses valgrind to test for memleaks + - Added 99_vdr-1.3.49-1.4.0.dpatch + - Modified 81_Make_config.dpatch to set the define VDRDEBUG for debug builds + - Added 82_valgrind.dpatch, which introduces a new option "-G | --valgrind". + This option disables the unloading of plugin libraries in debug builds, + to support valgrind. + + -- Debian VDR Team <pkg-vdr-dvb-devel@lists.alioth.debian.org> Sun, 30 Apr 2006 12:10:01 +0200 + +vdr (1.3.49-1ctvdr1) unstable; urgency=low + + * New upstream release + * Tobias Grimm <tg@e-tobi.net> + - Removed 99_menueditintitem.dpatch + + -- Debian VDR Team <pkg-vdr-dvb-devel@lists.alioth.debian.org> Fri, 28 Apr 2006 22:01:55 +0200 + +vdr (1.3.48-1ctvdr1) unstable; urgency=low + + * Thomas Günther <tom@toms-cafe.de> + - Updated 10_dd-record-option.dpatch + - Removed 16_vdr-1.3.46_menuitems.c-fix.dpatch + - Removed 99_geteuid.dpatch + - Renamed opt-24_jumpplay-0.6.dpatch to opt-24_jumpplay-0.7.dpatch + - Changed dependencies.sh: don't create conflicts with next vdr version + - Changed plugin-loader.sh: detect api version, too + - Upgraded 03_cmdsubmenu.dpatch to version 0.6 + - Fixed ctvdrinfo: find plugins with api version + * Tobias Grimm <tg@e-tobi.net> + - Added 99_menueditintitem.dpatch + + -- Debian VDR Team <pkg-vdr-dvb-devel@lists.alioth.debian.org> Tue, 25 Apr 2006 21:26:03 +0200 + +vdr (1.3.46-1ctvdr2) unstable; urgency=low + + * Thomas Günther <tom@toms-cafe.de> + - Upgraded opt-24_jumpplay-0.6.dpatch to version 0.7 (renaming to + opt-24_jumpplay-0.7.dpatch postponed cause it changes the patchlevel) + + -- Debian VDR Team <pkg-vdr-dvb-devel@lists.alioth.debian.org> Sat, 15 Apr 2006 11:41:52 +0200 + +vdr (1.3.46-1ctvdr1) unstable; urgency=low + + * New upstream release + * Thomas Günther <tom@toms-cafe.de> + - Removed 13_vdr_1.3.45_sources.conf-fix.dpatch + - Removed 16_vdr_1.3.45_diseqc.conf-fix.dpatch + - Removed 17_replay.dpatch + - Updated opt-20_liemikuutio-1.3.dpatch + - Added 16_vdr-1.3.46_menuitems.c-fix.dpatch + - Updated opt-31_sharelnb.dpatch + * Tobias Grimm <tg@e-tobi.net> + - Renamed opt-41_timer-info.dpatch to opt-41-x_timer-info.dpatch + (This patch does not modify any header files and therefore is + not relevant for the patch level) + - Added 99_geteuid to let vdr check for the effective instead of the + real UID before changing the UID + + -- Debian VDR Team <pkg-vdr-dvb-devel@lists.alioth.debian.org> Thu, 13 Apr 2006 01:17:01 +0200 + +vdr (1.3.45-1ctvdr1) unstable; urgency=low + + * New upstream release + * Thomas Schmidt <tschmidt@debian.org> + - Changed dependencies.sh to create Depends: like + vdr (>= current>), vdr (<< current-9999) without using Conflicts: vdr + (>= current-9999) - many thanks to Adeodato Simó for suggesting this + (this will hopefully allow vdr+plugins to enter testing without manual + hinting) + - Added 13_vdr_1.3.45_sources.conf-fix.dpatch + - Added 16_vdr_1.3.45_diseqc.conf-fix.dpatch + * Tobias Grimm <tg@e-tobi.net> + - Updated 06_default_svdrp_port_0.dpatch + - Updated 09_sort_options.dpatch + - Updated 11_sortrecordings.dpatch + - Updated 15_dvbplayer.dpatch + - Updated opt-39_noepg.dpatch + - Updated opt-37_submenu.dpatch + - Updated opt-38_disableDoubleEpgEntrys_0.7.2.dpatch to + opt-38_disableDoubleEpgEntrys.dpatch + - Updated opt-20_liemikuutio-1.2.dpatch to opt-20_liemikuutio-1.3.dpatch + - Updated opt-41_timer-info.dpatch + - Updated opt-45_yaepg.dpatch + - Added 01_IA64-FTBFS-fix.dpatch + - Added 14_cap-memsize.dpatch + - Added opt-46_dvdarchive.dpatch + - Added opt-47_sourcecaps.dpatch + - Removed 18_vdr-1.3.39-menu-on-control.dpatch + - Removed 99_epg-fix.dpatch + - Removed opt-43_LiveBuffer_multi.dpatch + + -- Debian VDR Team <pkg-vdr-dvb-devel@lists.alioth.debian.org> Tue, 28 Mar 2006 00:30:46 +0200 + +vdr (1.3.41-1ctvdr2) unstable; urgency=low + + * Tobias Grimm <tg@e-tobi.net> + - Added 99_epg-fix.dpatch + + -- Debian VDR Team <pkg-vdr-dvb-devel@lists.alioth.debian.org> Wed, 1 Feb 2006 01:45:27 +0100 + +vdr (1.3.41-1ctvdr1) unstable; urgency=low + + * New Upstream Release + * Tobias Grimm <tg@e-tobi.net> + - Updated opt-20_liemikuutio-1.1.dpatch to opt-20_liemikuutio-1.2.dpatch + - Updated opt-31_sharelnb.dpatch + * Thomas Günther <tom@toms-cafe.de> + - Updated opt-27_subtitles-ttxtsubs.dpatch + - Upgraded opt-41_timer-info.dpatch to version 0.2 + - Removed opt-42_stuttering.dpatch + - Removed 13_epgfix.dpatch + + -- Debian VDR Team <pkg-vdr-dvb-devel@lists.alioth.debian.org> Tue, 31 Jan 2006 20:20:54 +0100 + +vdr (1.3.40-1ctvdr1) unstable; urgency=low + + * New upstream release + * Thomas Schmidt <tschmidt@debian.org> + - New upstream release + + Removed 05_set_system_time_as_user.dpatch + + Updated 06_default_svdrp_port_0.dpatch + + Removed 07_not_as_root.dpatch + + Removed 08_security_CAN-2005-0071.dpatch + + Updated 09_sort_options.dpatch + + Added 18_vdr-1.3.39-menu-on-control + - Check for existence of /usr/sbin/runvdr and /usr/bin/vdr + before sourcing the config-loader.sh script in vdr.init + * Thomas Günther <tom@toms-cafe.de> + - Replaced opt-20_enAIO-2.7.dpatch with opt-20_liemikuutio-1.1.dpatch + - Updated opt-27_subtitles-ttxtsubs.dpatch + - Updated opt-37_submenu.dpatch + - Updated opt-39_noepg.dpatch + - Updated opt-42_stuttering.dpatch + - Updated opt-44_rotor.dpatch + - Added opt-45_yaepg.dpatch + - Added option "-g /tmp" to vdr call in debian/vdr.init (necessary + for image grabbing from vdradmin) + * Tobias Grimm <tg@e-tobi.net> + - Do not try to install ca.conf, because it is not needed anymore + - Removed option to set group under which vdr should run from the + init-script + - Install all README* files found + - Updated opt-31_sharelnb.dpatch + - Updated opt-41_timer-info.dpatch + - Removed opt-41_timer-info_wareagle.dpatch + + -- Debian VDR Team <pkg-vdr-dvb-devel@lists.alioth.debian.org> Wed, 25 Jan 2006 23:08:49 +0100 + +vdr (1.3.37-1ctvdr2) unstable; urgency=low + + * Thomas Günther <tom@toms-cafe.de> + - Fixed composition of remote.conf if remote plugin uses event + greater than event3 + + -- Thomas Günther <tom@toms-cafe.de> Tue, 20 Dec 2005 22:57:36 +0100 + +vdr (1.3.37-1ctvdr1) unstable; urgency=low + + * New upstream release + * Tobias Grimm <tg@e-tobi.net> + - Removed 01_Makefile-fPIC-fix.dpatch (fixed in upstream) + - Updated 03_cmdsubmenu.dpatch + - Updated 04_newplugin.dpatch + - Removed 16_avoidTrashing.dpatch + - Removed 22_vdr-playerepg.dpatch (fixed in upstream) + - Updated opt-20_enAIO-2.7.dpatch + - Updated opt-27_subtitles-ttxtsubs.dpatch + - Updated opt-31_sharelnb.dpatch + - Updated opt-43_LiveBuffer_multi.dpatch + - Updated opt-44_rotor.dpatch + * Thomas Günther <tom@toms-cafe.de> + - New upstream release + - Removed 18_vdr-1.3.33-recordingsmenu.dpatch + - Removed 19_vdr-1.3.33-recordingsupdate.dpatch + - Removed opt-28_director.dpatch + - Updated opt-31_sharelnb.dpatch + + -- Tobias Grimm <tg@e-tobi.net> Sat, 3 Dec 2005 21:09:58 +0100 + +vdr (1.3.33-1ctvdr2) unstable; urgency=low + + * Removed formatting spaces from substvars generated by dpendencies.sh, + because dh_gencontrol does not like it + + -- Tobias Grimm <tg@e-tobi.net> Sun, 2 Oct 2005 16:55:18 +0200 + +vdr (1.3.33-1ctvdr1) unstable; urgency=low + + * Thomas Günther <tom@toms-cafe.de> + - New upstream release + - Removed 14_update-resume.dpatch + - Removed 18_vdr-plugin-sky-fix.dpatch + - Removed 19_summary-fix.dpatch + - Removed 20_vdr-1.3.32-keymacros-fix.dpatch + - Updated opt-20_enAIO-2.6.dpatch + - Updated opt-31_sharelnb.dpatch + - Fixed make PLUGINS/lib in debian/rules + - Added 18_vdr-1.3.33-recordingsmenu.dpatch + - Added 19_vdr-1.3.33-recordingsupdate.dpatch + + -- Tobias Grimm <tg@e-tobi.net> Sun, 2 Oct 2005 10:18:44 +0200 + +vdr (1.3.32-1ctvdr4) unstable; urgency=low + + * Thomas Günther <tom@toms-cafe.de> + - Fixed 19_summary-fix.dpatch + - Added 20_vdr-1.3.32-keymacros-fix.dpatch + + -- Tobias Grimm <tg@e-tobi.net> Mon, 19 Sep 2005 19:20:35 +0200 + +vdr (1.3.32-1ctvdr3) unstable; urgency=low + + * Thomas Günther <tom@toms-cafe.de> + - Upgraded opt-43_LiveBuffer.dpatch and opt-43_LiveBuffer_multi.dpatch to + version 0.1.2 + + -- Tobias Grimm <tg@e-tobi.net> Fri, 16 Sep 2005 09:19:14 +0200 + +vdr (1.3.32-1ctvdr2) unstable; urgency=low + + * Added 19_summary-fix + + -- Tobias Grimm <tg@e-tobi.net> Thu, 15 Sep 2005 22:02:12 +0200 + +vdr (1.3.32-1ctvdr1) unstable; urgency=low + + * New upstream release + * Tobias Grimm <tg@e-tobi.net> + - If VDR daemon is disabled, show message where it can be enabled + * Thomas Schmidt <tschmidt@debian.org> + - Added 18_vdr-plugin-sky-fix.dpatch + - Updated 10_dd-record-option.dpatch + - Removed 18_vdr-1.3.31-remuxbraces.dpatch + - Removed 19_vdr-1.3.31-remux.dpatch + - Removed 20_vdr-1.3.31-sequence-end-code5.dpatch + - Removed 21_vdr-1.3.31-skipframes.dpatch + - Do not try to call vdr with LD_ASSUME_KERNEL=2.4.1 in plugins-loader.sh + on amd64 (many thanks to Sören Köpping for reporting the problem and + sending a patch) (closes: #326866) + - Install sky plugin into vdr-plugin-sky package and examples plugins + (hello, osddemo, svccli, svcsvr, skincurses, status and svdrpdemo) + into vdr-plugin-examples package + - Build-Depend on libncurses5-dev, so the skincurses plugin gets compiled + * Thomas Günther <tom@toms-cafe.de> + - Updated opt-20_enAIO-2.5.dpatch + - Updated opt-27_subtitles-ttxtsubs.dpatch + - Removed opt-29-x_keymacro-hidden-plugin.dpatch + - Updated opt-38_disableDoubleEpgEntrys_0.7.2.dpatch + - Upgraded opt-43_LiveBuffer_multi.dpatch to version 0.1.1 + - Updated opt-37_submenu.dpatch + - Fixed vdr call with LD_ASSUME_KERNEL=2.4.1 in plugins-loader.sh + - Adapted debian/plugin-loader.sh to example plugins + - Added opt-44_rotor.dpatch (needed for rotor plugin) + - Improved ctvdrinfo (performance, example plugin, deactivated plugins) + - Link doc directory of vdr-dbg to vdr + + -- Tobias Grimm <tg@e-tobi.net> Thu, 15 Sep 2005 00:42:37 +0200 + +vdr (1.3.31-1ctvdr1) unstable; urgency=low + + * Thomas Günther <tom@toms-cafe.de> + - New upstream release + - Updated 15_dvbplayer.dpatch + - Upgraded opt-20_enAIO-2.5.dpatch to opt-20_enAIO-2.6.dpatch + - Updated opt-27_subtitles-ttxtsubs.dpatch + - Updated opt-31_sharelnb.dpatch + - Added 11_sortrecordings.dpatch, to allow changing the sort-order + of the recordings + - Made debian/plugin-template/rules svn-buildpackage-save + - Added dependencies.sh to vdr-dev - plugins can use this to automatically + fill in the Depends and Conflicts field with ${vdr:Depends} and + ${vdr:Conflicts} + - Made debian/rules vdrdevel-compatible + - Fixed opt-27_subtitles-ttxtsubs.dpatch (Thx to Frank99@vdrportal) + - Upgraded opt-43_LiveBuffer_multi.dpatch to version 0.1.0 + - Changed debian/runvdr to allow manipulation of VDRCMD in /etc/default/vdr + - Added 22_vdr-playerepg.dpatch - Fixes mp3 plugin problems + - Adapted opt-31_sharelnb.dpatch to 22_vdr-playerepg.dpatch + - Made debian/plugin-template/control and debian/plugin-template/rules + compatible with dependencies.sh and new patchlevel.sh + * Tobias Grimm <tg@e-tobi.net> + - Made debian/patchlevel.sh accept opt-entries in 00list with leading + spaces and removed leading space from vdr-patchlevel output + - Renamed ${patchlevel} to ${vdr:Patchlevel} + - Added 16_avoidTrashing.dpatch, which prevent vdr from trashing the + file system buffers when reading/writing recordings + - Added 18_vdr-1.3.31-remuxbraces - Fixes some gcc warning messages + - Added 19_vdr-1.3.31-remux - Fixes a bug in cVideo/AudioRepacker::Repack() + - Added 20_vdr-1.3.31-sequence-end-code5 - Fixes a problem with appending + a sequence end code when moving cutting marks in radio recordings + - Added 21_vdr-1.3.31-skipframes - Fixes a problem with skipping frames + when moving cutting marks in radio recordings + + -- Thomas Günther <tom@toms-cafe.de> Mon, 29 Aug 2005 00:38:06 +0200 + +vdr (1.3.30-1ctvdr2) unstable; urgency=low + + * Fixed opt-37_submenu patch - release char buffers allocated by asprintf + + -- Tobias Grimm <tg@e-tobi.net> Wed, 24 Aug 2005 00:53:40 +0200 + +vdr (1.3.30-1ctvdr1) unstable; urgency=low + + * New upstream release + * Added 13_epgfix.dpatch to force saving of EPG data on exit + * Added opt-43_LiveBuffer_multi.dpatch from vdrdevel + * Updated opt-31_sharelnb.dpatch + * Updated opt-40_wareagle-icons.dpatch + * Updated opt-42_stuttering.dpatch + * Removed opt-33-x_epgsearch.dpatch + * Upgraded opt-20_enAIO-2.4.dpatch to opt-20_enAIO-2.5.dpatch + * Updated opt-27_subtitles-ttxtsubs.dpatch + + -- Tobias Grimm <tg@e-tobi.net> Mon, 22 Aug 2005 17:40:13 +0200 + +vdr (1.3.29-1ctvdr1) unstable; urgency=low + + * Tobias Grimm <tg@e-tobi.net> + - New upstream release + - Removed installation of hackmenu.c, calendar plugin has been + discontinued + - Renamed 01_Make_config.dpatch to 81_Make_config.dpatch + - Updated the following patches: + - opt-24_jumpplay-0.6.dpatch + - opt-27_subtitles-ttxtsubs.dpatch + - opt-31_sharelnb.dpatch + - opt-39_noepg.dpatch + - opt-42_stuttering.dpatch + - Removed opt-26-x_replay-1.3.11, is already a standard patch (17_replay) + - vdr-dev: depend on ${misc:Depends} + - vdr-dbg: depend on ${misc:Depends} + * Thomas Günther <tom@toms-cafe.de> + - Improved newplugin script + - Updated opt-24_jumpplay-0.6.dpatch + + -- Tobias Grimm <tg@e-tobi.net> Sun, 14 Aug 2005 14:45:33 +0200 + +vdr (1.3.28-1ctvdr2) unstable; urgency=low + + * Added osdbase-maxitems patch, which fixes a problem with the Enigma skin + * Upgraded sharelnb patch (version 1.3.28) + + -- Tobias Grimm <tg@e-tobi.net> Fri, 12 Aug 2005 19:01:21 +0200 + +vdr (1.3.28-1ctvdr1) unstable; urgency=low + + * New upstream release + * Modified 10_dd-record-option for new upstream version + * Removed 13_remote patch, which is now in the upstream sources + * Updated 15_dvbplayer patch + * Removed 16_dvbspu patch + * Taken from vdrdevel by Thomas Günther <tom@toms-cafe.de> + - Updated opt-20_enAIO-2.4 + - Modified opt-27_subtitles-ttxtsubs + - Modified opt-28_director + - Modified opt-41_timer-info + - Modified opt-41_timer-info_wareagle + * Bumped Standards-Version to 3.6.2 + * Renamed TODO.Debian to TODO + * Extract patch infos and install to /usr/share/doc/vdr/patchinfo + + -- Tobias Grimm <tg@e-tobi.net> Sun, 7 Aug 2005 20:39:38 +0200 + +vdr (1.3.27-1ctvdr6) unstable; urgency=low + + * Really installing commands.update-recordings.conf now + + -- Tobias Grimm <tg@e-tobi.net> Sat, 16 Jul 2005 20:35:42 +0200 + +vdr (1.3.27-1ctvdr5) unstable; urgency=low + + * Fixed parameter passing in vdr-shutdown + * Fixed package description + * Converted changelog to UTF-8 + * Replaced some tabs with spaces + * Added ${misc:Depends} + * Updated 03_cmdsubmenu.dpatch and opt-24_jumpplay-0.6.dpatch to the + versions from vdrdevel + * Now using debian/watch from vdrdevel + * vdr-dev: depend on debhelper, dvb-dev (>= 1.0.0) | + linux-kernel-headers (>=2.5.999-test7-bk-6) + * vdr-dev: suggests dh-make + * Added options --allow-root and --lirc to debugvdr + * Fixed bug in channels.conf update + * Added commands.update-recordings.conf from vdrdevel to have a + command for updating the recordings list manually + + -- Tobias Grimm <tg@e-tobi.net> Sun, 26 Jun 2005 15:27:31 +0200 + +vdr (1.3.27-1ctvdr4) unstable; urgency=low + + * Thomas Schmidt <tschmidt@debian.org> + - Fixed 10_dd-record-option.dpatch + + -- Tobias Grimm <tg@e-tobi.net> Sun, 26 Jun 2005 12:59:01 +0200 + +vdr (1.3.27-1ctvdr3) unstable; urgency=low + + * Thomas Schmidt <tschmidt@debian.org> + - Added 10_dd-record-option.dpatch - allows to choose if to record + or to replay Dolby Digital independently + + -- Tobias Grimm <tg@e-tobi.net> Sun, 26 Jun 2005 03:32:26 +0200 + +vdr (1.3.27-1ctvdr2) unstable; urgency=low + + * Thomas Günther <tom@toms-cafe.de> + - Added event3 to device list in remotes-loader.sh (Thx to gsgmx@vdrportal) + - Fixed runvdr and remotes-loader.sh (Thx to Peter Siering) + + -- Tobias Grimm <tg@e-tobi.net> Sat, 25 Jun 2005 21:28:51 +0200 + +vdr (1.3.27-1ctvdr1) unstable; urgency=low + + * New upstream release + * Merged changes from vdrdevel 1.3.26 and vdr 1.3.27 + * Added postinst code to remove Autopids magic RID values from channels.conf + (Thx to Thomas Günther for the hint) + * Adapted wareagle and jumpplay patch + * opt-34_update-resume patch replaced by 14_update-resume patch + + -- Tobias Grimm <tg@e-tobi.net> Sun, 19 Jun 2005 13:11:22 +0200 + +vdr (1.2.6-35) unstable; urgency=low + + * Added dependency to pscmisc + + -- Tobias Grimm <tg@e-tobi.net> Sat, 7 May 2005 14:46:51 +0200 + +vdr (1.2.6-34) unstable; urgency=low + + * Added ENABLE_SHUTDOWN to /etc/default/vdr + * Fixed terminal switching for keyboard control + + -- Tobias Grimm <tg@e-tobi.net> Tue, 19 Apr 2005 20:31:53 +0200 + +vdr (1.2.6-33) unstable; urgency=low + + * Fixed bug with not loading plugins in binary compatibility check + when --allow-root is used + + -- Tobias Grimm <tg@e-tobi.net> Sun, 10 Apr 2005 16:05:42 +0200 + +vdr (1.2.6-32) unstable; urgency=low + + * Modified not-as-root-patch to allow starting of VDR as root anyway, + if the argument --allow-root is given + * Removed ctvdrrestart and ctvdrstop scripts + * Renamed ctvdradmin to ctvdrwrapper and made it executable by root and + vdr only + + -- Tobias Grimm <tg@e-tobi.net> Sat, 9 Apr 2005 18:20:59 +0200 + +vdr (1.2.6-31) unstable; urgency=low + + * Thomas Schmidt <tschmidt@debian.org> + - Change owner of /proc/{av7110_ir,budget_ci_ir} to the uid and + gid under which vdr will run in /usr/sbin/runvdr + (closes: #297640) + + -- Tobias Grimm <tg@e-tobi.net> Wed, 6 Apr 2005 22:31:31 +0200 + +vdr (1.2.6-30) unstable; urgency=low + + * Changes to run vdr as non-root taken from Debian VDR + Thomas Schmidt <thomas.schmidt@in.stud.tu-ilmenau.de> + - Removed libncurses5-dev from Build-Depends + - Remove some files under /var/lib/vdr and /var/cache/vdr in postrm + on purge (closes: #287914) + - Added patch from Ludwig Nussel to be able to synchronize the system- + time via DVB, even when vdr runs as user + - The automatic shutdown is now disabled by default, to enable it + again you have to change ENABLE_SHUTDOWN=0 to 1 in /etc/default/vdr + - Set default port for SVDRP to 0, users who run vdr from the + commandline will have to enable it by using the --port option + (in the init-script SVDRP will still be enabled and on the default + port 2001) + - Added 08_security_CAN-2005-0071.dpatch - do not overwrite + existing files with the GRAB-Command anymore (CAN-2005-0071) + - Added 07_not_as_root.dpatch - vdr exists when it should run as + user or with group-id root (adapted from Darren Salt's patch + for vdr 1.3.x) + - Do not run as user root anymore, the user vdr will be created + and the video-directory and config-files will be changed, so the + owner/group is vdr:vdr (closes: #287899) + - Added patch for the EPG handling under amd64 (closes: #300702) + * Tobias Grimm <tg@e-tobi.net> + - Small bugfix for VDBS workaround: 3'rd card get's now tuned, + first available channel is used (Thx to HolgerAusB@vdrportal) + - Added 13_remote.dpatch from Darren Salt, this allows usage + of rcu with the same binary. + - Add user vdr to group cdrom in postinst, so that vdr is able to + play dvd's with the dvd-plugin again + - Introduced a small C program "ctvdradmin" which is made setuid/setgid + root and allows to restart and stop vdr by any user + + -- Tobias Grimm <tg@e-tobi.net> Tue, 8 Feb 2005 19:33:35 +0100 + +vdr (1.2.6-29) unstable; urgency=low + + * Peter Siering <ps@ctmagazin.de> + - hdtv recording from Reinhard Nissl as dpatch (also in elchiaio4d) + * Tobias Grimm <tg@e-tobi.net> + - Extracted code for handling remote.conf's from vdr.init to + remotes-loader.sh. + - Fixed plugin-loader.sh to not produce an error message when + retrieving the vdr version. + - Added new package vdr-dbg, which installs a debuggable vdr as + /usr/bin/vdr-dbg as well as some helper scripts. + - Adapted patches for new dpatch >= 2.0.9. + - vdr-dev now installs /usr/bin/vdrdbg-buildpackage, which allows to + build debuggable plugins + - now installing newplugin as /usr/bin/vdr-newplugin, which can create + a plugin-skeleton + - installing dh_make template for plugin packages and + usr/bin/debianize-vdrplugin which will create the basic debian files + for a plugin (dh-make must be installed!) + - set default location for epg.data to /var/cache/vdr (vdr -E) + - Extracted loading of VDR daemon config options to separate file for + later reuse by other start scripts + - Fixed warning message in generated commands.conf and reccmds.conf + - The default command to shutdown the system when the power-off-key of the + remote is pressed, can now be configured in /etc/default/vdr. + - Build-Depend on: dvb-dev | linux-kernel-headers and libjpeg62-dev + * Thomas Günther <tom@toms-cafe.de> + - Fixed problems with double starts (not detecting a running vdr) + - Adapted init procedure to alioth, encapsulated ctvdr specials + + -- Tobias Grimm <tg@e-tobi.net> Wed, 15 Jan 2005 22:55:00 +0100 + +vdr (1.2.6-28) unstable; urgency=low + + * Tobias Grimm <tg@e-tobi.net> + - fixed switchtimer patch to make it compile with gcc 3.3.4 (sarge) + + -- Tobias Grimm <tg@e-tobi.net> Wed, 13 Nov 2004 12:20:00 +0200 + +vdr (1.2.6-27) unstable; urgency=low + + * Tobias Grimm <tg@e-tobi.net>: + - using dh_install now + - moved usr/bin/recordingaction to /usr/lib/vdr/vdr-recordingaction + - moved usr/bin/shutdownvdr to /usr/lib/vdr/vdr-shutdown + - added watch file + - install man files using debian/vdr.manpages now + - default location for reccordings according to FHS is now /var/lib/video + - The vdr config dir is /var/lib/vdr now. Real config files are linked to + this directory, while generated or vdr-managed config files + (like timers.conf) can exist physically in this directory. + - Shutdown-Hook mechanism taken over from Alioth. Hook scripts are no + longer restricted to be shell scripts. (See README.Debian) + - moved PLUGIN_DIR, PLUGIN_PREFIX, CFG_DIR, PLUGIN_CFG_DIR, + PLUGIN_ORDER_FILE, CMDHOOKSDIR, REC_CMD and SHUTDOWNCMD from the + default file to the init script + - renamed /usr/bin/ctvdr*.sh to /usr/bin/ctvdr/ctvdr* + - using debian/compat now + - updated control fields for Sarge + - took over order.commands.conf, order.reccmds.conf and order.conf + from Alioth + - renamed vdraptrefresh.sh to vdraptrefresh + - all strings in vdr.menu are now quoted + - added manpage for runvdr + - moved poweroffvdr to /usr/bin/ + - took over pluginloader.sh from Alioth + - reduced vdr.dirs to /usr/lib/vdr/plugins/ and /var/lib/video/ + - installing epg2html.pl and svdrpsend.pl to /usr/lib/vdr/ now + - replaced update code for 1.2.2 from preinst with an error message + (updating such an old version is no longer possible) + - removed the commands.[ctvdr|shutdownvdr].conf update + (these command files are no longer installed as Debian-conf-files) + - Linking var/lib/video to var/lib/video.00. This way, adding + more partitions is simply a matter of creating video.01, video.02 and + so on. + - Added workaround for "Video data stream broken" bug, if you use more + than one DVB card. Just set VDSB_WORKAROUND=yes in /etc/default/vdr to + enable it. (szap from package dvb-utils is needed!) + - renamed patches to opt-<nn>(-x)_name.dpatch pattern like in the + official Debian version at Alioth + * Thomas Günther <tom@toms-cafe.de>: + - Extracted patchlevel code to patchlevel.sh + - Installing patchlevel.sh into vdrdevel-dev package + - Installing conf files as examples + - Installing channels.conf and examples into config dir in postinst + + -- Tobias Grimm <tg@e-tobi.net> Mon, 11 Sep 2004 13:30:00 +0200 + +vdr (1.2.6-26) unstable; urgency=low + + * Tobias Grimm <tg@e-tobi.net>: + - fixed ttxtsubs for AC3 playback (Thanks to Thomas / tbf) + * Thomas Günther <tom@toms-cafe.de>: + - new (optional) plugin check (with "vdr -V -P plugin") + - corrected sharelnb patch description + - upgraded jumpplay patch to version 0.5 + - switchtimer patch - fixed segfault if edit timer from vdradmin + + -- Tobias Grimm <tg@e-tobi.net> Mon, 09 Aug 2004 19:30:00 +0200 + +vdr (1.2.6-25) unstable; urgency=low + + * Tobias Grimm <tg@e-tobi.net>: + - some small fixes to debian/patches/patchtest + - jumpplay patch no longer depends on elchi (Thx to Thomas Günther!) + - added switchtimer patch 0.0.4 (There has also been posted a patch for the + switchtimer patch, but as this will be included in the next version, + I don't include it in the package yet.) + - extracted code in dpatch files + - took over command loader code from alioth + - took over plugin loader code from alioth + + -- Tobias Grimm <tg@e-tobi.net> Fri, 12 Jul 2004 22:10:00 +0200 + +vdr (1.2.6-24) unstable; urgency=low + + * Tobias Grimm <tg@e-tobi.net>: + - removed osdpip patch for autopid, it no longer depends on the autopid + patch + - replaced 15_reccmdssubmenu125 patch with 03_cmdsubmenu from the Alioth + vdr package + * Peter Siering <ps@ctmagazin.de>: + - modified dvb-t-channels for Hannover, Bremen etc. + + -- Tobias Grimm <tg@e-tobi.net> Fri, 09 Jul 2004 01:50:00 +0200 + +vdr (1.2.6-23) unstable; urgency=low + + * updated disableDoubleEpgEntries patch to version 0.6 + * added hoerzu2vdrDisableEpg-0.3 patch + * upgraded jumpplay patch to 0.4 + * added frames fix for elchi patch + * added black square fix for elchi patch + * added recordings patch by Hardy Flor + * added cap patch by Ludwig Nussel - Run vdr as unprivileged user while still + beeing able to set the system clock. + * fixed patch level generation to not cut patch name after second "_" + * added script to list "uncritical" patches, that don't modify header files + (or menu.c, which is used by the calendar plugin) + * Patches that have no effect on the binary compatibility of the plugins + should have a "-" after their number in the file name. + i.e.: 10-_patchname.dpatch. + These patches will not be include in the patchlevel and therefore plugins + must not be recompiled if these patches change. + * marked 12_analogtv, 10_skycrypt, 10_graphlcd, 10_threadkill, + 32_analogtvautopid, 20_imposd-frames-fix and 10_cap-1.2.6 as "uncritical" + + -- Tobias Grimm <tg@e-tobi.net> Tue, 06 Jul 2004 01:41:00 +0200 + +vdr (1.2.6-22) unstable; urgency=low + + * small bugfix in recordingaction script (thx to Thomas Günther!) + * added patch for ttxtsubs plugin (subtitles patch removed) + * Modified patchlevel detection, so that it works with a vdr-patchlevel + field too. This may become the new way for patchlevel detection with + plugins in the official Debian. + + -- Tobias Grimm <tg@e-tobi.net> Mon, 21 Jun 2004 23:57:00 +0200 + +vdr (1.2.6-21) unstable; urgency=low + + * renamed shutdown90.custom to shutdown90.custom.sh + + -- Tobias Grimm <tg@e-tobi.net> Thu, 11 May 2004 23:46:00 +0100 + +vdr (1.2.6-20) unstable; urgency=low + + * improved vdr version extraction in vdr.init + + -- Tobias Grimm <tg@e-tobi.net> Thu, 06 May 2004 22:39:00 +0100 + +vdr (1.2.6-19) unstable; urgency=low + + * added patch for ttxtsubs- and dvbsubs-plugin + * small bugfix in recordingaction script + * added R90.custom and shutdown90.custom + * added order.commands.conf and order.reccmds.conf + init script now uses these files to order the commands + * fixed small bug in ctvdrrestart.sh and ctvdrstop.sh reported by TomG + * added at dependency + + -- Tobias Grimm <tg@e-tobi.net> Sat, 17 Apr 2004 17:30:00 +0100 + +vdr (1.2.6-18) unstable; urgency=low + + * updated Elchi patch to version 4d + + -- Tobias Grimm <tg@e-tobi.net> Mon, 15 Mar 2004 23:05:00 +0100 + +vdr (1.2.6-17) unstable; urgency=low + + * improved patchtest use --quick to test applicability of patches only + + -- Tobias Grimm <tg@e-tobi.net> Sat, 13 Mar 2004 15:00:00 +0100 + +vdr (1.2.6-16) unstable; urgency=low + + * corrected bug with wareagel icons patch + * updated patchtest to reflect current vdr patch variations + * fixed credits in Elchi patch + + -- Tobias Grimm <tg@e-tobi.net> Thu, 11 Mar 2004 23:22:00 +0100 + +vdr (1.2.6-15) unstable; urgency=low + + * added HAVE_AUTOPID to Autopid patch (used by streamdev to detect autopid) + + -- Tobias Grimm <tg@e-tobi.net> Tue, 09 Mar 2004 22:20:00 +0100 + +vdr (1.2.6-14) unstable; urgency=low + + * added ctvdrsysinfo.sh from Felix H. (vdrportal.de) + * added disableEpgEntries 0.3 patch + * using improved vdr init script from Markus Braun now + * added missing dependencies for vdr-dev + * did some cleanup to the maintainer scripts to allow autogenerated + debhelper stuff + * commands.*.conf / reccmds.*.conf files are now installed to + /etc/vdr/command-hooks and symlinked to /usr/share/vdr/command-hooks. + vdr.init generates commands.conf and reccmds.conf out of the files + it finds in /usr/share/vdr/command-hooks + * added reccmds.custom.conf and commands.custom.conf, which should + be the place for user-defined commands. + * patchtest now prints failed patch + * Updated Elchi patch to version 4c + * moved shutdownvdr to /usr/bin + * added recording hooks mechanism (see debian/recordingaction) + * added WarEagle icon patch + * added patch from graphlcd plugin + + -- Tobias Grimm <tg@e-tobi.net> Tue, 05 Mar 2004 01:30:00 +0100 + +vdr (1.2.6-13) unstable; urgency=low + + * added maintenance commands + * added skycrypt patch + + -- Tobias Grimm <tg@e-tobi.net> Sun, 15 Feb 2004 04:15:00 +0100 + +vdr (1.2.6-12) unstable; urgency=low + + * updated ElchiAIO to version 4b + * updated JumpPlay to version 0.3 + * added Aston CAM patch by Antonino Sergi + * vdraptrefresh now uses --reinstall for vdr installation + + -- Tobias Grimm <tg@e-tobi.net> Fri, 06 Feb 2004 23:48:00 +0100 + +vdr (1.2.6-11) unstable; urgency=low + + * vdr.init now generates commands.conf out of commands.*.conf + * added some comments to generated commands.conf and reccmds.conf + + -- Tobias Grimm <tg@e-tobi.net> Tue, 03 Feb 2004 00:40:00 +0100 + +vdr (1.2.6-10) unstable; urgency=low + + * elchi3 and improved osd replaced by elchi4 + * added 8bitcolor patch by Andreas Regel (fixes problems with 256 colors) + * added osdpip patch to support osdpip-plugin + * added patchlevel test script (debian/patches/patchtest) + * added vdraptrefesh script for automatic plugin-reinstall <ps> + * replaced JumpPlay 0.0 with JumpPlay patch 0.2 + + -- Tobias Grimm <tg@e-tobi.net> Wed, 28 Jan 2004 02:26:00 +0100 + +vdr (1.2.6-9) unstable; urgency=low + + * added libdtv header files to vdr-dev (needed for scanner plugin) + * shutdown script now allows hooks to specify an OSD message, + when aborting shutdownvdr + * MinEventTimeout is set to 10 minutes, when user manually invokes + shutdown + + -- Tobias Grimm <tg@e-tobi.net> Sat, 24 Jan 2004 12:50:00 +0100 + +vdr (1.2.6-8) unstable; urgency=low + + * added sharelnb patch for autopid + * fixed bug in shutdownvdr + + -- Tobias Grimm <tg@e-tobi.net> Sat, 17 Jan 2004 13:50:00 +0100 + +vdr (1.2.6-7) unstable; urgency=low + + * added analogtv patches for channel editing with analog plugin + (provided by Andreas Kool) + * added plugin version checking in init + + -- Peter Siering <ps@ctmagazin.de> Thu, 15 Jan 2004 18:20:00 +0100 + +vdr (1.2.6-6) unstable; urgency=low + + * added patchlevel info to vdr-dev (/usr/include/vdr/patchlevel) + * added hack for calendar compiles (/usr/include/vdr/hackmenu.c) + * removed multipatch from package name + + -- Peter Siering <ps@ctmagazin.de> Tue, 13 Jan 2004 23:00:00 +0100 + +vdr (1.2.6-5multipatch2) unstable; urgency=low + + * add lnb share patch (dpatch) + * readd sub menu patch (dpatch) + * applied vdr.init.order.diff (thanks to Tom at vdrportal.de) + + -- Peter Siering <ps@ctmagazin.de> Mon, 12 Jan 2004 21:00:00 +0100 + +vdr (1.2.6-4multipatch2) unstable; urgency=low + + * using dpatch now for patches + * added shutdown-hook mechanism + + -- Tobias Grimm <tg@e-tobi.net> Sun, 11 Jan 2004 17:10:00 +0100 + +vdr (1.2.6-3multipatch2) unstable; urgency=low + + * included changes from 1.2.2-7: + * added vdr-dev package + + -- Tobias Grimm <tg@e-tobi.net> Sun, 28 Dec 2003 11:29:00 +0200 + +vdr (1.2.6-2multipatch2) unstable; urgency=low + + * added jumplay patch 0.0 + + -- Tobias Grimm <tg@e-tobi.net> Sun, 07 Dec 2003 02:32:00 +0200 + +vdr (1.2.6-2multipatch1) unstable; urgency=low + + * fixed small bug in postinst + + -- Tobias Grimm <tg@e-tobi.net> Sun, 16 Nov 2003 16:11:42 +0200 + +vdr (1.2.6-1multipatch1) unstable; urgency=low + + * Elchi AIO patch version 3b + * AC3overDVB 0.2.1 + * Autopid + + -- Tobias Grimm <tg@e-tobi.net> Sun, 16 Nov 2003 19:00:00 +0200 + +vdr (1.2.6-1) unstable; urgency=low + + * New upstream release + + -- Tobias Grimm <tg@e-tobi.net> Sun, 16 Nov 2003 16:11:42 +0200 + +vdr (1.2.2-6woody1) unstable; urgency=low + + * added Alexander Blums submenu patch (towards vdrconvert) + * incremented watchdog timeout in defaults from 30 to 60 + * incorporated Tobias Grimm's <tg@e-tobi.net> fixes: + * fixed /debian/rules to create /video instead of trying to copy it + * fixed some bashisms in preinst + * added lintian override for upstream install documentation + * added lintian override for top level video dir + * added PLUGINS.html + UPDATE-1.2.0 to docs + * added missing registration of /etc/init.d/vdr to postinst + * added update-menus to postinst + * newplugin will not be installed anymore + + -- Peter Siering <ps@ctmagazin.de> Sun, 14 Nov 2003 08:00:00 +0200 + +vdr (1.2.2-5woody1) unstable; urgency=low + + * integrate reccmds.<addon>.conf logic + + -- Peter Siering <ps@ctmagazin.de> Sun, 02 Nov 2003 21:20:00 +0200 + +vdr (1.2.2-5woody1) unstable; urgency=low + + * integrate reccmds.<addon>.conf logic + * finally fixed update situation, don't bail if new prerm fails + + -- Peter Siering <ps@ctmagazin.de> Tue, 17 Oct 2003 00:20:00 +0200 + +vdr (1.2.2-4woody1) unstable; urgency=low + + * handle update from -1 gracefully (don't bail if not running) + + -- Peter Siering <ps@ctmagazin.de> Sun, 14 Oct 2003 21:00:00 +0200 + +vdr (1.2.2-3woody1) unstable; urgency=low + + * Rene Bartsch's fixes in my init logic + + -- Peter Siering <ps@ctmagazin.de> Sun, 12 Oct 2003 22:00:00 +0200 + +vdr (1.2.2-2woody1) unstable; urgency=low + + * removing "conffile protection in video" did not what I'd expected + * instead move them to /etc/vdr and keep them as conffiles + * worked towards the offical vdr releases by amu with .default, .init + * new runvdr script, much more friendly for plugin specific conffiles + + -- Peter Siering <ps@ctmagazin.de> Sun, 02 Oct 2003 11:00:00 +0200 + +vdr (1.2.2-1woody1) unstable; urgency=low + + * changed runvdr to incorporate auto loading of plugins + * integrated init script into package, fixed restart + * protecting conffiles in /video + + -- Peter Siering <ps@ctmagazin.de> Mon, 15 Sep 2003 22:00:00 +0200 + +vdr (1.2.2-0woody1) unstable; urgency=low + + * new upstream build + + -- Ralf Nolden (KDE) <nolden@kde.org> Tue, 19 Aug 2003 12:23:09 +0200 + +vdr (1.0.4-3) unstable; urgency=low + + * some cosmetic things ( ex. autobuilder ) + * added autobuilder support + + -- Andreas Mueller <amu@tr.debian.net> Mon, 10 Mar 2003 11:27:00 +0100 + +vdr (1.0.4-2) unstable; urgency=low + + * took package from Eduard/QA + (closes: Bug#134645) + (closes: Bug#158158) + + -- Andreas Mueller <amu@tr.debian.net> Sat, 4 Jan 2003 16:27:00 +0100 + +vdr (1.0.4-1) unstable; urgency=low + + * New upstream release + + -- Eduard Bloch <blade@debian.org> Sat, 3 Aug 2002 12:22:20 +0200 + +vdr (1.0.0-1) unstable; urgency=medium + + * New upstream (stable) release + * removed manpages hocus-pocus and forced to use new version to avoid + trashing of vdr.1. Closes: #142809 + * removed kvdr references, it is broken anyways + + -- Eduard Bloch <blade@debian.org> Sun, 7 Apr 2002 23:43:41 +0200 + +vdr (0.98+1.0.0pre5-1) unstable; urgency=high + + * New upstream (pre)release, closes: #141035 + * Urgency high, since the Woody version is already broken since the new + drivers entered it recently + * incompatible with kvdr, set Conflicts: + * Changed the build-system to DBS like + * Added the tools pack from Upstream's web location and the FORMATS file + * Not including the DVD patch, too unstable. + + -- Eduard Bloch <blade@debian.org> Wed, 3 Apr 2002 12:10:31 +0200 + +vdr (0.98-2) unstable; urgency=medium + + * Disabled SVDRP port as-default and noted in README.Debian. + Better secure than warned and less secure. Closes: #117193 + * added more Build-Depends, closes: #123701 + * now conflicting with previous kvdr version and recommending the new since + kvdr would break starting vdr-daemon without port specification. + + -- Eduard Bloch <blade@debian.org> Thu, 13 Dec 2001 00:58:01 +0100 + +vdr (0.98-1) unstable; urgency=low + + * New upstream release + * fixed spelling errors + + -- Eduard Bloch <blade@debian.org> Wed, 14 Nov 2001 09:56:49 +0100 + +vdr (0.96-4) unstable; urgency=low + + * improved Description, thanks to Joey and Alfie + * included README and other scripts, maybe useful + + -- Eduard Bloch <blade@debian.org> Thu, 11 Oct 2001 12:56:42 +0200 + +vdr (0.96-3) unstable; urgency=high + + * all versions except of -daemon disable the control port by default + (possible security hole). Debconf warning for -daemon. + * package splitted + * building additional vdr-daemon binary, needed for kvdr + * fixed postinst files, there were too much copy&paste work :( + + -- Eduard Bloch <blade@debian.org> Mon, 8 Oct 2001 13:21:31 +0200 + +vdr (0.96-2) unstable; urgency=low + + * enabled DVD support after helping Brian to fix libdvdread packages + + -- Eduard Bloch <blade@debian.org> Sun, 7 Oct 2001 16:27:53 +0200 + +vdr (0.96-1) unstable; urgency=low + + * New upstream release + * removed upx stuff + * no DVD support until the libdvdread2 package is ready + + -- Eduard Bloch <blade@debian.org> Tue, 2 Oct 2001 02:24:51 +0200 + +vdr (0.95-1) unstable; urgency=low + + * Initial Release, closes: #113106 + * Made a little hack to create the channel.conf template from Debian examples + + -- Eduard Bloch <blade@debian.org> Sat, 22 Sep 2001 03:16:11 +0200 + +Local variables: +mode: debian-changelog +End: --- vdr-1.7.14.orig/debian/vdr.postinst +++ vdr-1.7.14/debian/vdr.postinst @@ -0,0 +1,78 @@ +#!/bin/sh + +# Peter Siering <ps@ctmagazin.de>, 10/2/2003 + +ACTION=$1 + +# Upgrade <= 1.2.6-26 to a more FHS-conform directory structure +# + +if [ "$ACTION" = "configure" ] ; then + # Fix channels.conf when updating from 1.5.14 to 1.5.15 + if dpkg --compare-versions "$2" ge "1.5.14" ; then + if dpkg --compare-versions "$2" lt "1.5.15" ; then + if [ -e /var/lib/vdr/channels.conf ]; then + cp /var/lib/vdr/channels.conf /var/lib/vdr/channels.conf.1.5.14 + sed -i 's/M2O0S0//' /var/lib/vdr/channels.conf + fi + fi + fi + + [ ! -d /var/lib/video.00 ] && mkdir /var/lib/video.00 + + # copy example channels.conf files into config dir + if [ ! -e /var/lib/vdr/channels.conf ]; then + cp /usr/share/doc/vdr/examples/channels.conf* /var/lib/vdr/ + gunzip /var/lib/vdr/channels.conf*.gz + fi + + # ensure that user and group 'vdr' exist + USER=vdr + GROUP=vdr + if ! getent group | grep -q "^$GROUP:" ; then + echo -n "Adding group $GROUP.." + addgroup --quiet --system $GROUP + echo "..done" + fi + if ! getent passwd | grep -q "^$USER:"; then + echo -n "Adding user $USER.." + adduser --system --home /var/lib/vdr --shell /bin/false \ + --gecos "VDR user" --no-create-home \ + --disabled-login --disabled-password \ + --ingroup $GROUP \ + $USER + echo "...done" + fi + + # put vdr in group video so that it can access the DVB device nodes + adduser $USER video > /dev/null || true + + # ensure that vdr's config and recording files are correctly owned + [ -e /var/lib/video ] && chown -R $USER:$GROUP /var/lib/video/ + [ -e /var/lib/video.00 ] && chown -R $USER:$GROUP /var/lib/video.00/ + [ -e /var/lib/video.01 ] && chown -R $USER:$GROUP /var/lib/video.01/ + if [ -e /var/lib/vdr ] ; then + chown -R $USER:$GROUP /var/lib/vdr + chown $USER:$GROUP /var/lib/vdr/* > /dev/null 2>&1 || true + fi + if [ -e /var/cache/vdr ] ; then + chown $USER:$GROUP /var/cache/vdr + chown $USER:$GROUP /var/cache/vdr/* > /dev/null 2>&1|| true + fi + + # make /usr/lib/vdr/vdr-shutdown.wrapper setuid/setgid (owner root:vdr, mode 6750) + if [ -e /usr/lib/vdr/vdr-shutdown.wrapper ] ; then + chown root:$GROUP /usr/lib/vdr/vdr-shutdown.wrapper && \ + chmod a=,u+srwx,g+srx /usr/lib/vdr/vdr-shutdown.wrapper + fi + + # make /usr/lib/vdr/ctvdrwrapper setuid/setgid + if [ -e /usr/lib/vdr/ctvdrwrapper ] ; then + chown root:$GROUP /usr/lib/vdr/ctvdrwrapper && \ + chmod a=,u+srwx,g+srx /usr/lib/vdr/ctvdrwrapper + fi +fi + +#DEBHELPER# + +exit 0 --- vdr-1.7.14.orig/debian/debianize-vdrplugin +++ vdr-1.7.14/debian/debianize-vdrplugin @@ -0,0 +1,82 @@ +#!/bin/sh + +detect_plugin_name() +{ + local PATTERN='.*\/\(.*\)-\([0-9][0-9a-zA-Z+.~-]*\)$' + if pwd | grep -q -E ".*\/.*-[0-9][0-9a-zA-Z+.~-]*$" ; then + PLUGIN=`pwd | sed "s/$PATTERN/\1/"` + VERSION=`pwd | sed "s/$PATTERN/\2/"` + else + echo "debianize-vdrplugin expects the upstream sources to be extracted in a" + echo "directory named: <PLUGIN-NAME>-<VERSION>" + echo + echo "e.g.: coolplugin-0.0.1" + echo + echo "The upsteam tarball should be named: vdr-<PLUGIN-NAME>-<VERSION>.tar.gz" + echo + echo "e.g.: vdr-coolplugin-0.0.1.tar.gz" + echo + exit 1 + fi +} + +create_orig_tarball() +{ + local tarball + + ORIGTARBALL="../vdr-plugin-$PLUGIN"_"$VERSION.orig.tar.gz" + + if [ -e $ORIGTARBALL ] ; then + return + fi + + for tarball in `find ../ -name "*$PLUGIN-$VERSION.t*gz"`; do + ln -sf `basename $tarball` $ORIGTARBALL + return + done + + for tarball in `find ../ -name "*$PLUGIN-$VERSION.t*bz2"`; do + /bin/bzip2 -cd $tarball | /bin/gzip --best > $ORIGTARBALL + return + done +} + +check_dh_make() +{ + if [ ! -x /usr/bin/dh_make ] ; then + echo "If you want to use this script, please install the package dh-make!" + exit 1 + fi +} + +replace_vdr_version() +{ + VDRVERSION=`dpkg -s vdr-dev | awk '/Version/ { print $2 }'` + perl -pi -e "s/#VDRVERSION#/$VDRVERSION/g" debian/control +} + +replace_plugin_name() +{ + perl -pi -e "s/#PLUGIN#/$PLUGIN/g" debian/install + perl -pi -e "s/#PLUGIN#/$PLUGIN/g" debian/links.ex +} + +# +# main() +# + +check_dh_make +detect_plugin_name +create_orig_tarball + +dh_make="/usr/bin/dh_make -t /usr/share/vdr-dev/plugin-template -b -p vdr-plugin-$PLUGIN" +if [ ! -e $ORIGTARBALL ] ; then + dh_make="$dh_make -r" +fi + +$dh_make + +if [ "$?" -eq "0" ]; then + replace_vdr_version + replace_plugin_name +fi --- vdr-1.7.14.orig/debian/vdr-dbg.install +++ vdr-1.7.14/debian/vdr-dbg.install @@ -0,0 +1,4 @@ +vdr-dbg /usr/bin/ +debian/debugvdr /usr/bin/ +debian/vdrleaktest /usr/bin/ +debian/valgrind.supp /usr/share/vdr/ --- vdr-1.7.14.orig/debian/vdr.dirs +++ vdr-1.7.14/debian/vdr.dirs @@ -0,0 +1,3 @@ +usr/lib/vdr/plugins +var/cache/vdr +var/lib/vdr/plugins --- vdr-1.7.14.orig/debian/order.reccmds.conf +++ vdr-1.7.14/debian/order.reccmds.conf @@ -0,0 +1,10 @@ +# +# If you like a fixed order in your recording commands menu, place the +# command base names (reccmds.<basename>.conf) here. +# +# If you want a certain command file not to be loaded automatically at +# vdr-startup, then you can simply write "-basename" in this file. + +firstcommand +secondcommand +-thirdcommand --- vdr-1.7.14.orig/debian/commands.update-recordings.conf +++ vdr-1.7.14/debian/commands.update-recordings.conf @@ -0,0 +1 @@ +Aufnahmen-Liste aktualisieren : /usr/bin/touch /var/lib/video/.update --- vdr-1.7.14.orig/debian/commands-loader.sh +++ vdr-1.7.14/debian/commands-loader.sh @@ -0,0 +1,61 @@ +# +# This file is called by /etc/init.d/vdr +# + +writewarning () +{ +echo -e \ +"#\n"\ +"# This file is automatically generated by the vdr init-script. You can\n"\ +"# define custom commands in /etc/vdr/command-hooks/$1.custom.conf\n"\ +"# (see /usr/share/doc/vdr/README.Debian.gz).\n"\ +"#\n\n\n" +} + +# merges single <cmdtype>.<name>.conf files into one <cmdtype>.conf using +# the order defined in order.<cmdtype>.conf +mergecommands () +{ + local cmd + local cmds + local cmdsorder + local line + local cmdtype + local cmdfile + local ordered_cmds + + cmdtype=$1 + cmdfile="/var/cache/vdr/$cmdtype.conf" + + writewarning $cmdtype > "$cmdfile" + + cmdsorder=( `cat /etc/vdr/command-hooks/order.$cmdtype.conf | sed "s/#.*$//"` ) + cmds=( `find $CMDHOOKSDIR -maxdepth 1 -name "$cmdtype.*.conf" -printf "%f \n" | sed "s/$cmdtype\.\(.\+\)\.conf/\1/g"` ) + + # first the ordered commands: + for cmd in ${cmdsorder[@]}; do + for (( line=0 ; line<${#cmds[@]} ; line++ )); do + if [ "$cmd" = "-${cmds[$line]}" ]; then + unset cmds[$line] + cmds=( "${cmds[@]}" ) + break + fi + if [ "$cmd" = "${cmds[$line]}" ]; then + ordered_cmds=( "${ordered_cmds[@]}" "${cmds[$line]}" ) + unset cmds[$line] + cmds=( "${cmds[@]}" ) + break + fi + done + done + # then the remaining unordered commands: + ordered_cmds=( "${ordered_cmds[@]}" "${cmds[@]}" ) + + # concatenate all commands + for cmd in ${ordered_cmds[@]}; do + if [ "$cmd" != "" ]; then + cat "$CMDHOOKSDIR/$cmdtype.$cmd.conf" >> "$cmdfile" || true + echo "" >> "$cmdfile" + fi + done +} --- vdr-1.7.14.orig/debian/abi-version +++ vdr-1.7.14/debian/abi-version @@ -0,0 +1 @@ +vdr-abi-1.7.14-debian --- vdr-1.7.14.orig/debian/vdr-shutdown-message +++ vdr-1.7.14/debian/vdr-shutdown-message @@ -0,0 +1,19 @@ +#!/bin/sh + +svdrpsend="/usr/lib/vdr/svdrpsend.pl" +log="logger -t vdr-shutdown" + +MESSAGE="Shutdown deactivated (see /etc/default/vdr)" + +osdmsg() +{ + # OSD message must be deferred, to let VDR display it AFTER the + # shutdown script has been executed + sleep 2 + $svdrpsend MESG "$1" +} + +osdmsg $MESSAGE & +$log $MESSAGE & + +exit 1 --- vdr-1.7.14.orig/debian/vdr-dbg.manpages +++ vdr-1.7.14/debian/vdr-dbg.manpages @@ -0,0 +1,3 @@ +debian/debugvdr.1 +debian/vdrleaktest.1 +debian/vdr-dbg.1 --- vdr-1.7.14.orig/debian/S90.custom +++ vdr-1.7.14/debian/S90.custom @@ -0,0 +1,29 @@ +# +# Custom VDR Shutdown Hook +# ------------------------- +# +# Here you can place any commands, you want to be executed when VDR wants +# to shutdown. +# +# * To abort the shutdown, exit with an errorlevel <> 0. +# +# * If you want a message to be displayed on the OSD when aborting a shutdown, +# then write to stdout: +# +# ABORT_MESSAGE=<message to display> +# +# * If you want to defer the shutdown, write to stdout: +# +# TRY_AGAIN=<minutes to wait before next shutdown request> +# +# * To overwrite the command that will be executed to shutdown the machine +# after all shutdown hooks have been processed, write to stdout: +# +# SHUTDOWNCMD=<new shutdown command> +# +# i.e.: +# +# echo "ABORT_MESSAGE=\"I do not want to shutdown now!\"" ; exit 1 +# + + --- vdr-1.7.14.orig/debian/commands.custom.conf +++ vdr-1.7.14/debian/commands.custom.conf @@ -0,0 +1,31 @@ +# +# This is an example file for defining external commands, that will be +# accessible via VDR's OSD menu. +# The commands will be executed under the same user id that vdr is running +# with, so take care if your are running vdr as root! +# +# The format of a command entry is: <title> : <command> +# <title> is the menu text shown on the OSD and <command> is the command to +# be executed. Everything that <command> writes to stdout will be displayed +# on the OSD, e.g.: +# +# Open fortune cookie: /usr/games/fortune +# +# If you uncomment the line above and restart vdr, you will have a new +# command menu entry, called "Open fortune cookie", that will show you a +# random epigram. ( you may need an "apt-get install fortune" first! ) +# +# You can divide your commands into submenus, e.g.: +# +# Fortune Cookies { +# Long Dictum : /usr/games/fortune -l +# Short Apothegms : /usr/games/fortune -s +# Special Topics { +# Literature : /usr/games/fortune literature +# Riddles : /usr/games/fortune riddles +# } +# } +# +# Again, just uncomment the above lines and restart vdr to see for your self, +# how this looks like on the OSD. +# --- vdr-1.7.14.orig/debian/abi-version.multipatch +++ vdr-1.7.14/debian/abi-version.multipatch @@ -0,0 +1 @@ +vdr-abi-1.7.14-multipatch --- vdr-1.7.14.orig/debian/vdr.examples +++ vdr-1.7.14/debian/vdr.examples @@ -0,0 +1,2 @@ +*.conf +channels.conf.* --- vdr-1.7.14.orig/debian/vdr-dbg.links +++ vdr-1.7.14/debian/vdr-dbg.links @@ -0,0 +1 @@ +usr/share/doc/vdr usr/share/doc/vdr-dbg --- vdr-1.7.14.orig/debian/extract-patchinfo +++ vdr-1.7.14/debian/extract-patchinfo @@ -0,0 +1,47 @@ +#!/bin/sh + +print_patch() +{ + author=`dpatch cat --author-only $1` + patch_name=`echo $1 | sed 's/[^_]*_\(.*\)/\1/'` + patch_description=`dpatch cat --no-meta $patch` + echo $patch_name: + if [ ! -z "$author" ] ; then + echo " $author" + echo + fi + if [ ! -z "$patch_description" ] ; then + echo $patch_description | fmt | sed 's/\(.*\)/ \1/' + fi + echo +} + +echo "Patches applied to vanilla vdr sources" +echo "--------------------------------------" +echo + +patches_applied=`dpatch list-all` +for patch in $patches_applied ; do + print_patch $patch +done + +echo +echo "Patches available in source package, but not active" +echo "---------------------------------------------------" +echo + +patches_available=`find debian/patches -name *.dpatch -printf "%f\n" | sed 's/\(.*\)\.dpatch/\1/'` +for patch in $patches_available ; do + is_applied="no" + + for applied_patch in $patches_applied ; do + if [ $applied_patch = $patch ] ; then + is_applied="yes" + break + fi + done + + if [ $is_applied = "no" ] ; then + print_patch $patch + fi +done --- vdr-1.7.14.orig/debian/vdr-shutdown +++ vdr-1.7.14/debian/vdr-shutdown @@ -0,0 +1,54 @@ +#!/bin/sh +# +# VDR Shutdown Script - Tobias Grimm <tg@e-tobi.net> +# ------------------- +# +# see README.Debian +# + +. /usr/lib/vdr/config-loader.sh + +SHUTDOWN_HOOKS_DIR=/usr/share/vdr/shutdown-hooks/ + +log="logger -t vdr-shutdown" +svdrpsend="/usr/lib/vdr/svdrpsend.pl" + +osdmsg() +{ + # OSD message must be deferred, to let VDR display it AFTER the + # shutdown script has been executed + sleep 2 + $svdrpsend MESG "$1" +} + +shutdownhooks=`find $SHUTDOWN_HOOKS_DIR -maxdepth 1 -xtype f | sort` + +for shutdownhook in $shutdownhooks; do + TRY_AGAIN=0 + + if [ -x $shutdownhook ]; then + $log "executing $shutdownhook" + result_data=`$shutdownhook "$@"` + else + $log "executing $shutdownhook as shell script" + result_data=`/bin/sh $shutdownhook "$@"` + fi + result=$? + eval $result_data + if [ $result -ne 0 ] ; then + $log "Shutdown aborted by $shutdownhook with exitcode $result" + osdmsg "Shutdown abgebrochen / Shutdown aborted!" & + [ -z "$ABORT_MESSAGE" ] || osdmsg "$ABORT_MESSAGE" & + exit $result + fi + + if [ $TRY_AGAIN -gt 0 ] + then + $log "$shutdownhook requests to try again in $TRY_AGAIN minutes" + nohup sh -c "( sleep $(( $TRY_AGAIN * 60 )) && $svdrpsend \"HITK Power\" )" >/dev/null 2>&1 & + osdmsg "Shutdown aborted. Retry in $TRY_AGAIN minutes." & + exit 0 + fi +done + +eval $SHUTDOWNCMD & --- vdr-1.7.14.orig/debian/ctvdrinfo +++ vdr-1.7.14/debian/ctvdrinfo @@ -0,0 +1,94 @@ +#!/bin/bash + +export COLUMNS=512 +LOG=/tmp/vdrinfo.log + +. /usr/lib/vdr/config-loader.sh + +vdr_package_version=`dpkg -s vdr | grep "Version:" | sed "s/.*Version: \(.*\)/\1/"` +api_version=`eval "vdr -V -L/usr/bin/vdr 2>/dev/null | sed 's/.*[(/]\(.*\)).*/\1/'"` +kernelversion=`uname -r` + +# find installed plugins +plugins=(`find ${PLUGIN_DIR} -maxdepth 1 \ + -name "${PLUGIN_PREFIX}*.so.${api_version}" | \ + xargs -r dpkg -S 2>&1 | \ + sed "s/^dpkg:/'':/" | \ + sed "s/:.*${PLUGIN_PREFIX}\([^\.]\+\)\.so\.${version}.*$/:\1/" | \ + sort`) +packages=(`echo ${plugins[@]} | sed 's/:[^ ]*//g'`) +plugins=( `echo ${plugins[@]} | sed 's/[^ ]*://g'`) + +# extract version numbers +eval "versions=($(LANG=en;dpkg -s ${packages[@]} 2>&1 | awk -F ':' '\ + /^Package: / {p=$2} \ + /^Package.*is not installed/ {print "\"\""} \ + (/Version: / || /^$/) && p!="" {print $2;p=""}'))" + +# load plugin order +if [ -r "$PLUGIN_CFG_DIR/order.conf" ]; then + plugin_order=(`cat $PLUGIN_CFG_DIR/order.conf | sed "s/#.*$//"`) +fi + +echo "**************************************" | tee $LOG +echo "* c't VDR Übersicht *" | tee -a $LOG +echo "**************************************" | tee -a $LOG +echo | tee -a $LOG +echo "VDR : $vdr_package_version" | tee -a $LOG +echo "Kernel: $kernelversion" | tee -a $LOG +echo "ABI :`dpkg -s vdr | awk -F'[:,]' '/vdr-abi/ {print $2}'`" +echo | tee -a $LOG + +if [ -e /usr/share/doc/vdr/optional-patches.txt ] ; then + echo "Patches:" | tee -a $LOG + echo "--------------------------------------" | tee -a $LOG + cat /usr/share/doc/vdr/optional-patches.txt | tee -a $LOG + echo | tee -a $LOG +fi + +echo "Plugins:" | tee -a $LOG +echo "( N = Native Plugin )" | tee -a $LOG +echo "( D = Debian Plugin )" | tee -a $LOG +echo "( - = Deaktiviert )" | tee -a $LOG +echo "--------------------------------------" | tee -a $LOG + +for (( i=0 ; i<${#plugins[@]} ; i++ )); do + mark="D" + package="${packages[$i]}" + version="${versions[$i]}" + plugin="${plugins[$i]}" + if [ ! "$version" ]; then + mark="N" + version="n/a" + else + for p in ${plugin_order[@]} ; do + if [ "${p}" = "-${plugin}" ]; then + mark="-" + break + fi + if [ "${p}" = "${plugin}" ]; then + break + fi + done + fi + if [ ! "$package" -o "$package" = "''" ]; then + package="no package" + fi + echo "${mark} ${plugin}" | tee -a $LOG + echo " Package: $package" | tee -a $LOG + echo " Version: ${version}" | tee -a $LOG +done + +echo | tee -a $LOG +echo "Addon­Packages:" | tee -a $LOG +echo "--------------------------------------" | tee -a $LOG + +dpkg -l "vdr-*" | \ + grep -v "vdr-\(plugin-\|dev\|dbg\|kbd\|lirc\|daemon\|rcu\)" | \ + awk '/ii/ {printf ("%s (%s)\n", $2, $3)}' | tee -a $LOG + +echo +echo "......................................" +echo "Eine Kopie dieser Ausgaben wurde" +echo "erzeugt in: $LOG" +echo "......................................" --- vdr-1.7.14.orig/debian/vdr-dev.install +++ vdr-1.7.14/debian/vdr-dev.install @@ -0,0 +1,16 @@ +*.h usr/include/vdr/ + +libsi/*.h usr/include/vdr/libsi/ + +debian/debianize-vdrplugin usr/bin/ +debian/plugin-template/ usr/share/vdr-dev/ + +vdr-newplugin usr/bin/ + +debian/lintian/vdr-dev usr/share/lintian/overrides/ + +debian/dependencies.sh usr/share/vdr-dev/ + +debian/vdrdbg-buildpackage usr/bin/ +Make.config usr/include/vdr/ +Make.global usr/include/vdr/ --- vdr-1.7.14.orig/debian/vdr-shutdown-wrapper.c +++ vdr-1.7.14/debian/vdr-shutdown-wrapper.c @@ -0,0 +1,3 @@ +int main (int argc, char *argv[]) { + return execv("/usr/lib/vdr/vdr-shutdown", argv); +} --- vdr-1.7.14.orig/debian/vdr-recordingaction +++ vdr-1.7.14/debian/vdr-recordingaction @@ -0,0 +1,49 @@ +#!/bin/sh +# +# VDR Recording Action Script - Tobias Grimm <tg@e-tobi.net> +# --------------------------- +# +# This script gets executed by VDR before a recording starts, after a +# recording ends and after a recording has been edited. +# In order to allow other addons to hook into this process, this script will +# search for any executables in /usr/share/vdr/recording-hooks. These +# hooks are called in their alphabetical order and should follow this +# naming scheme: +# +# R<XX>.<identifier> +# +# Where <XX> is a two digit number, that mainly specifies the execution order +# and <identifier> is a unique descriptor. +# +# Two parameters are passed to each recording hook: +# +# Parameter 1 can have the values "before", "after" and "edited", depending +# on whether the recording hook is called before the recording starts, +# after the recording ends or after the recording has been edited. +# +# Parameter 2 is the directory of the recording. Be aware, that this directory +# doesn't exist before the recording starts. +# + +REC_HOOKS_DIR=/usr/share/vdr/recording-hooks + +recordinghooks=`find $REC_HOOKS_DIR -maxdepth 1 -xtype f | sort` + +for recordinghook in $recordinghooks; do + case $1 in + before|after) + action="$1 recording $2" + ;; + edited) + action="after editing recording $2" + ;; + esac + if [ -x $recordinghook ]; then + logger -t recordingaction "executing $recordinghook $action" + $recordinghook $* + else + logger -t recordingaction "executing $recordinghook $action as shell script" + /bin/sh $recordinghook $* + fi + [ $? -ne 0 ] && logger -t recordingaction "error when executing $recordinghook" +done --- vdr-1.7.14.orig/debian/vdr.links +++ vdr-1.7.14/debian/vdr.links @@ -0,0 +1,24 @@ +etc/vdr/command-hooks/commands.custom.conf usr/share/vdr/command-hooks/commands.custom.conf +etc/vdr/command-hooks/reccmds.custom.conf usr/share/vdr/command-hooks/reccmds.custom.conf + +var/cache/vdr/commands.conf var/lib/vdr/commands.conf +var/cache/vdr/reccmds.conf var/lib/vdr/reccmds.conf + +etc/vdr/recording-hooks/R90.custom usr/share/vdr/recording-hooks/R90.custom +etc/vdr/shutdown-hooks/S90.custom usr/share/vdr/shutdown-hooks/S90.custom + +etc/vdr/diseqc.conf var/lib/vdr/diseqc.conf +etc/vdr/keymacros.conf var/lib/vdr/keymacros.conf +etc/vdr/sources.conf var/lib/vdr/sources.conf +etc/vdr/svdrphosts.conf var/lib/vdr/svdrphosts.conf + +var/lib/video.00 var/lib/video + +var/lib/vdr/setup.conf etc/vdr/setup.conf +var/lib/vdr/remote.conf etc/vdr/remote.conf +var/lib/vdr/channels.conf etc/vdr/channels.conf +etc/default/vdr etc/vdr/vdr.default + +etc/vdr/vdr.groups usr/share/vdr/groups.d/vdr.groups + +usr/lib/vdr/svdrpsend.pl usr/bin/svdrpsend --- vdr-1.7.14.orig/debian/vdr.install +++ vdr-1.7.14/debian/vdr.install @@ -0,0 +1,50 @@ +vdr usr/bin/ +debian/runvdr usr/sbin/ + +debian/config-loader.sh usr/lib/vdr +debian/commands-loader.sh usr/lib/vdr/ +debian/plugin-loader.sh usr/lib/vdr/ + +diseqc.conf etc/vdr/ +keymacros.conf etc/vdr/ +sources.conf etc/vdr/ +svdrphosts.conf etc/vdr/ + +debian/order.conf etc/vdr/plugins/ + +debian/order.commands.conf etc/vdr/command-hooks/ +debian/order.reccmds.conf etc/vdr/command-hooks/ +debian/commands.custom.conf etc/vdr/command-hooks/ +debian/reccmds.custom.conf etc/vdr/command-hooks/ + +debian/commands.update-recordings.conf usr/share/vdr/command-hooks/ +debian/commands.ctvdr.conf usr/share/vdr/command-hooks/ +debian/commands.shutdownvdr.conf usr/share/vdr/command-hooks/ + +debian/vdr-recordingaction usr/lib/vdr/ + +debian/R90.custom etc/vdr/recording-hooks/ + +debian/ctvdrwrapper usr/lib/vdr/ +debian/ctvdrinfo usr/bin/ +debian/ctvdrsysinfo usr/bin/ +debian/poweroffvdr usr/bin/ + +debian/vdraptrefresh usr/sbin/ + +epg2html.pl usr/lib/vdr/ +svdrpsend.pl usr/lib/vdr/ + +debian/lintian/vdr usr/share/lintian/overrides/ + +debian/themes/*.theme var/lib/vdr/themes/ + +debian/vdr-shutdown usr/lib/vdr/ +debian/vdr-shutdown-message usr/lib/vdr/ +debian/vdr-shutdown.wrapper usr/lib/vdr/ +debian/S90.custom etc/vdr/shutdown-hooks/ + +debian/vdr-groups.sh usr/lib/vdr/ +debian/vdr.groups etc/vdr/ + +locale usr/share/ --- vdr-1.7.14.orig/debian/order.commands.conf +++ vdr-1.7.14/debian/order.commands.conf @@ -0,0 +1,10 @@ +# +# If you like a fixed order in your commands menu, place the command base names +# (commands.<basename>.conf) here. +# +# If you want a certain command file not to be loaded automatically at +# vdr-startup, then you can simply write "-basename" in this file. + +firstcommand +secondcommand +-thirdcommand --- vdr-1.7.14.orig/debian/vdrleaktest +++ vdr-1.7.14/debian/vdrleaktest @@ -0,0 +1,75 @@ +#!/bin/bash + +# We need bash here, because of the *-loader.sh scripts containing bashisms! + +## NAME +## vdrleaktest - Runs the VDR debugging binary with Valgrind. +## +## SYNOPSIS +## vdrleaktest [-h] [vdr-options] +## +## DESCRIPTION +## vdrleaktest will stop any running VDR daemon and start the debugging +## version of VDR with Valgrind. No plugins will be loaded automatically. +## In order to test VDR plugins with vdrleaktest, you need to pass the +## appropriate VDR arguments (e.g. -P plugin-name). +## +## OPTIONS +## -h This help +## +## All other options will be passed down to VDR +## +## SEE ALSO +## vdr(1), valgrind(1) +## +## AUTHOR +## This manual page was written by Tobias Grimm <tg@e-tobi.net> +## +### txt2man -s 1 -t VDRLEAKTEST -v "Start VDR with Valgrind" + +usage() +{ + local HELPCOMMENTPATTERN="^## " + cat "$0" | grep "$HELPCOMMENTPATTERN" | sed "s/$HELPCOMMENTPATTERN//" +} + + +while getopts h opt +do + case $opt in + h) + usage + exit + ;; + esac +done + +# +# Check for Valgrind +# + +if [ ! -x /usr/bin/valgrind ] ; then + echo "ERROR: Please install valgrind first!" >&2 + exit 1 +fi + +# +# c't-VDR Memory Leak Tester +# + +. /usr/lib/vdr/config-loader.sh +. /usr/lib/vdr/commands-loader.sh + +mergecommands "commands" +mergecommands "reccmds" + +/etc/init.d/vdr stop + +LANG=C LD_LIBRARY_PATH="/usr/lib/debug;$LD_LIBRARY_PATH" \ + valgrind --tool=memcheck --leak-check=yes --num-callers=20 \ + --suppressions=/usr/share/vdr/valgrind.supp \ + /usr/bin/vdr-dbg -v $VIDEO_DIR -c $CFG_DIR -L $PLUGIN_DIR -r $REC_CMD \ + -E $EPG_FILE -g /tmp $OPTIONS --port $SVDRP_PORT --lirc \ + "$@" + +/etc/init.d/vdr restart --- vdr-1.7.14.orig/debian/svdrpsend.1 +++ vdr-1.7.14/debian/svdrpsend.1 @@ -0,0 +1,39 @@ +.TH "svdrpsend" "1" "" "Tobias Grimm" "" +.SH "NAME" +.LP +svdrpsend \- Sends commands to VDR +.SH "DESCRIPTION" +.LP +This program sends commands to VDR and displays the result. A list of available commands can be shown by sending the HELP command. +.SH "SYNTAX" +.LP +svdrpsend [\fIoptions\fP] \fIcommand\fP +.SH "OPTIONS" +.LP +.TP +\fB\-d\fR <\fIhostname\fP> +Accesses the VDR at the specified <\fIhostname\fP> (default is localhost). +.TP +\fB\-p\fR <\fIport\fP> +Uses the SVDRP port number <\fIport\fP> (default is 2001). +.SH "EXAMPLES" +.LP +To request the available commands from the VDR running on the local host: +.LP +svdrpsend HELP +.SH "FILES" +.LP +\fI/etc/vdr/svdrphosts.conf\fP +.SH "AUTHORS" +.LP +This man-page has been written by Tobias Grimm <tg@e\-tobi.net> +.PP +Permission is granted to copy, distribute and/or modify this document under +the terms of the GNU General Public License, Version 2 any +later version published by the Free Software Foundation. +.PP +On Debian systems, the complete text of the GNU General Public +License can be found in /usr/share/common\-licenses/GPL. +.SH "SEE ALSO" +.LP +vdr(1) vdr(5) --- vdr-1.7.14.orig/debian/order.conf +++ vdr-1.7.14/debian/order.conf @@ -0,0 +1,16 @@ +# +# If you like a fixed plugin order in your menu place the plugin base names +# here. Remember that the first entry a plugin may get, starts at five in +# VDR's OSD. +# +# If you want a certain Plugin not to be loaded automatically at +# vdr-startup, then you can simply write "-pluginname" in this file. +# +# If you want to add commandline-options for a certain plugin, this file is +# not the right place - you can add them in the file(s) +# /etc/vdr/plugins/plugin.<pluginname>.conf - each option in one line + +firstplugin +secondplugin +-thirdplugin +-fourthplugin --- vdr-1.7.14.orig/debian/control +++ vdr-1.7.14/debian/control @@ -0,0 +1,80 @@ +Source: vdr +Section: video +Priority: extra +Maintainer: Debian VDR Team <pkg-vdr-dvb-devel@lists.alioth.debian.org> +Uploaders: Thomas Schmidt <tschmidt@debian.org>, Tobias Grimm <etobi@debian.org>, Thomas Günther <tom@toms-cafe.de> +Origin: ctvdr +Build-Depends: debhelper (>= 5), dpatch, libjpeg62-dev, libcap2-dev | libcap-dev, + libncursesw5-dev, libfreetype6-dev, libfontconfig-dev, gettext, + txt2man, python, dvb-s2api-liplianin-headers | linux-libc-dev (>= 2.6.29) +Standards-Version: 3.8.4 +Homepage: http://www.tvdr.de/ + +Package: vdr +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, adduser, psmisc +Recommends: lirc, ttf-bitstream-vera | ttf-freefont +Provides: vdr-daemon, vdr-kbd, vdr-lirc, vdr-rcu, ${vdr:Provides} +Conflicts: vdr-daemon, vdr-kbd, vdr-lirc, vdr-rcu, vdradmin (<< 3.4.3) +Replaces: vdr-daemon, vdr-kbd, vdr-lirc, vdr-rcu +Description: Video Disk Recorder for DVB cards + Video Disk Recorder (VDR) is a digital sat-receiver program using + Linux and DVB technologies. It allows one to record MPEG2 streams, + as well as output the stream to TV. It is also possible to watch DVDs + (hardware accelerated) with some comfort and use an IR remote control. + . + This package contains the vdr main program which is controlled via the + PC keyboard or a IR remote control. + . + NOTE: You should install compatible DVB drivers before using these + programs. Also the standard VDR (without special plugins) requires + a DVB-Card with an integrated mpeg-decoder, a so called + Full-Featured Card. + +Package: vdr-dev +Architecture: all +Depends: ${misc:Depends}, debhelper, dvb-s2api-liplianin-headers | linux-libc-dev (>= 2.6.29) +Suggests: dh-make +Description: Video Disk Recorder for DVB cards + Video Disk Recorder (VDR) is a digital sat-receiver program using + Linux and DVB technologies. It allows one to record MPEG2 streams, + as well as output the stream to TV. It is also possible to watch DVDs + (hardware accelerated) with some comfort and use an IR remote control. + . + This package contains the header files of VDR. + You need this package to be able to build vdr-plugins! + +Package: vdr-dbg +Section: debug +Priority: extra +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, vdr (= ${binary:Version}), gdb +Suggests: valgrind +Description: Debuggable version of the VDR Video Disk Recorder + This package installs an unoptimized vdr binary with debugging symbols as well + as some helper scripts to debug VDR and its plugins. + +Package: vdr-plugin-dvbsddevice +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, vdr (= ${binary:Version}) +Description: Plugin for using a Sky Digibox with vdr + Video Disk Recorder (VDR) is a digital sat-receiver program using + Linux and DVB technologies. It allows one to record MPEG2 streams, + as well as output the stream to TV. + . + This package contains the dvbsddevice-plugin, which implements the + output device for the "Full Featured" DVB cards based on the + TechnoTrend/Fujitsu-Siemens design. + +Package: vdr-plugin-examples +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, vdr (= ${binary:Version}) +Description: Plugins for vdr to show some possible features + Video Disk Recorder (VDR) is a digital sat-receiver program using + Linux and DVB technologies. It allows one to record MPEG2 streams, + as well as output the stream to TV. + . + This package contains the example-plugins hello, osddemo, svccli, + svcsvr, skincurses, status and svdrpdemo from the vdr-source. + These plugins do not have useful features, they only demonstrate + how vdr-plugins work and what is possible to do with them. --- vdr-1.7.14.orig/debian/vdr.init +++ vdr-1.7.14/debian/vdr.init @@ -0,0 +1,147 @@ +#! /bin/bash -p +# +# vdr start-stop script +# +### BEGIN INIT INFO +# Provides: vdr +# Required-Start: $remote_fs $network $syslog +# Required-Stop: $remote_fs $network $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Starts the Linux Video Disk Recorder (VDR) +# Description: Starts the Linux Video Disk Recorder (VDR), +# if it is enabled in /etc/default/vdr. +### END INIT INFO + +PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin +NAME=vdr +DESC="Linux Video Disk Recorder" + +DAEMON=/usr/sbin/runvdr +PIDFILE=/var/run/runvdr.pid +VDRPRG=/usr/bin/vdr + +test -x $DAEMON || exit 0 +test -x $VDRPRG || exit 0 + +. /usr/lib/vdr/config-loader.sh + +# Set shutdown command +test "$ENABLE_SHUTDOWN" = "1" && VDRSHUTDOWN="/usr/lib/vdr/vdr-shutdown.wrapper" \ + || VDRSHUTDOWN="/usr/lib/vdr/vdr-shutdown-message" + +. /usr/lib/vdr/plugin-loader.sh +. /usr/lib/vdr/commands-loader.sh + + +clean_console() +{ + if [ "$KEYB_TTY" != "" ]; then + tput -Tlinux clear > $KEYB_TTY + fi +} + +configure_console_input() +{ + if [ "$KEYB_TTY" != "" ]; then + clean_console + echo -e "This tty is currently mapped to VDR, keypresses aren't echoed.\r" > $KEYB_TTY + echo -n "For a login prompt switch to another console." > $KEYB_TTY + REDIRECT="< $KEYB_TTY" + if [ "$KEYB_TTY_SWITCH" = "1" ]; then + chvt `echo "$KEYB_TTY" | sed "s/\/dev\/tty//"` + fi + fi +} + +get_status() +{ + if start-stop-daemon --start --startas $DAEMON --test \ + --name $(basename $DAEMON) --pidfile $PIDFILE >/dev/null + then + echo " - is not running." + exit 3 + else + echo " - is running." + exit 0 + fi +} + +startvdr() +{ + if [ "$ENABLED" != "0" ] ; then + # only start vdr if there is no other instance running + if start-stop-daemon --start --startas $DAEMON --test \ + --name $(basename $DAEMON) --pidfile $PIDFILE >/dev/null + then + getplugins + mergecommands "commands" + mergecommands "reccmds" + configure_console_input + + if [ "$VFAT" == "1" ]; then + OPTIONS="--vfat $OPTIONS" + fi + + if [ -n "$LIRC" ]; then + LIRC_OPT="--lirc=$LIRC" + else + LIRC_OPT="--lirc" + fi + + start-stop-daemon --start --quiet --startas $DAEMON --background \ + --name $(basename $DAEMON) --pidfile $PIDFILE --make-pidfile -- \ + -v $VIDEO_DIR -c $CFG_DIR -L $PLUGIN_DIR -r $REC_CMD \ + -s $VDRSHUTDOWN -E $EPG_FILE -u $USER -g /tmp \ + --port $SVDRP_PORT $LIRC_OPT $PLUGINS $OPTIONS $REDIRECT + else + echo -n " - seems to be running already" + fi + else + echo -n " - aborted (to enable the daemon, edit /etc/default/vdr)" + fi +} + +stopvdr() +{ + if start-stop-daemon --stop --retry 30 \ + --name $(basename $DAEMON) --pidfile $PIDFILE >/dev/null + then + start-stop-daemon --stop --retry 30 --oknodo --exec $VDRPRG >/dev/null + rm -f $PIDFILE + clean_console + else + echo -n " - seems not to be running" + fi +} + +case "$1" in + start) + echo -n "Starting $DESC: $NAME" + startvdr + echo "." + ;; + stop) + echo -n "Stopping $DESC: $NAME" + stopvdr + echo "." + ;; + restart|force-reload) + echo -n "Restarting $DESC: $NAME" + stopvdr + sleep 4 + startvdr + echo "." + ;; + status) + echo -n "Getting status of $DESC: $NAME" + get_status + ;; + *) + N=/etc/init.d/$NAME + echo "Usage: $N {start|stop|restart|force-reload}" >&2 + exit 1 + ;; +esac + +exit 0 --- vdr-1.7.14.orig/debian/vdr.manpages +++ vdr-1.7.14/debian/vdr.manpages @@ -0,0 +1,5 @@ +vdr.1 +vdr.5 + +debian/runvdr.8 +debian/svdrpsend.1 --- vdr-1.7.14.orig/debian/vdr-groups.sh +++ vdr-1.7.14/debian/vdr-groups.sh @@ -0,0 +1,112 @@ +#!/bin/sh +# +# This script checks which groups the vdr user should belong to and adds +# it to the necessary groups or removes it from groups which are not needed +# anymore +# +# (c) 2007, Thomas Schmidt <tschmidt@debian.org> +# (c) 2007, Tobias Grimm <tg@e-tobi.net> +# + +DIR="/usr/share/vdr/groups.d" +VDR_USER=vdr + +ACTUAL_GROUPS=`groups $VDR_USER | cut -d' ' -f3-` + +is_group_in_list() +{ + local group=$1 + shift + local group_list=$* + local current_group + + for current_group in $group_list; do + [ "$current_group" = "$group" ] && return + done + + false +} + +read_groups() +{ + cat "$1" | grep -v "^#\|^$" | sed s/"\(.*\)#.*"/"\1"/ | xargs +} + +add_to_groups() +{ + local groups_file="$1" + local groups=`read_groups "$groups_file"` + local group + + for group in $groups; do + if ! is_group_in_list $group $ACTUAL_GROUPS; then + echo "Adding '$VDR_USER' to group '$group'" + adduser $VDR_USER $group > /dev/null 2>&1 + fi + done +} + +remove_from_groups() +{ + local groups_file="$1" + local groups=`read_groups "$groups_file"` + local needed_groups + local group + + needed_groups=`read_groups $DIR/*` + + for group in $groups; do + if is_group_in_list $group $ACTUAL_GROUPS; then + if ! is_group_in_list $group $needed_groups; then + echo "Removing '$VDR_USER' from group '$group'" + deluser $VDR_USER $group > /dev/null 2>&1 + fi + fi + done +} + +show_help() +{ + echo + echo "vdr-groups.sh" + echo "-------------" + echo "Shell script to be used by vdr plugin packages to register/deregister" + echo "required vdr group memberships." + echo + echo "/bin/sh /usr/lib/vdr/vdr-groups.sh --add <GROUP-FILE>" + echo "/bin/sh /usr/lib/vdr/vdr-groups.sh --remove <GROUP-FILE>" + echo + echo "The <GROUP-FILE> is the file in $DIR containing the list of groups" + echo "vdr should be added to or removed from." + echo + exit 127 +} + +# +# main() +# + + +if [ $# -ne 2 ]; then + show_help +fi + +action="$1" +groups_file="$DIR/$2.groups" + +if [ ! -e $groups_file ]; then + echo "WARNING: $groups_file does not exist. Can't adjust vdr group membership" + exit 0 +fi + +case "$action" in + --add) + add_to_groups "$groups_file" + ;; + --remove) + remove_from_groups "$groups_file" + ;; + *) + show_help + ;; +esac --- vdr-1.7.14.orig/debian/vdraptrefresh +++ vdr-1.7.14/debian/vdraptrefresh @@ -0,0 +1,14 @@ +#!/bin/bash +# +# This script helps to automate a repository change. +# It just reinstalls all plugins that have been installed +# after changing sources.list to point to a new repository. +# After calling apt-get update, you can call this script +# to refresh vdr and any plugins +# +if [ "$#" != "0" ] && [ "$1" != "--dry-run" ]; then + echo "just knows --dry-run or nothing" + exit 1 +fi +(apt-get clean; apt-get $1 install --reinstall vdr ; apt-get $1 install --reinstall `(export COLUMNS=512; dpkg -l | tee /tmp/test.lst | grep "ii vdr-plugin" | cut -d" " -f3)`) +/etc/init.d/vdr restart --- vdr-1.7.14.orig/debian/plugin-loader.sh +++ vdr-1.7.14/debian/plugin-loader.sh @@ -0,0 +1,122 @@ +# +# This file is called by /etc/init.d/vdr +# + +getplugins () +{ + local plugin_order + local installed_plugins + local ordered_plugins + local plugin + local i + local arguments + local plugins + local packages + local leftout + local leftout2 + local vdrcmd + local version + + vdrcmd="/usr/bin/vdr -u $USER $OPTIONS" + + CACHE_DIR="/var/cache/vdr" + CACHE_FILE="${CACHE_DIR}/plugin_search_cache" + CACHE_MD5="${CACHE_FILE}.md5" + + version=`eval "$vdrcmd -V -L/usr/bin/vdr 2>/dev/null | sed 's/.*(\(.*\)).*/\1/'"` + test "$version" || version="unknown version" + + PLUGINS="" + + echo -ne "\nSearching for plugins (VDR $version) " + + # find installed plugins + version=`echo "$version" | sed 's:.*/::'` + # cached plugin index up to date ? + if [ -e ${CACHE_MD5} ] && \ + [ -e ${CACHE_FILE} ] && \ + md5sum ${PLUGIN_DIR}/${PLUGIN_PREFIX}*.so.${version} ${CACHE_FILE} 2>&1 | cmp -s - ${CACHE_MD5} + then + plugins=`cat ${CACHE_FILE}` + echo -ne "(cache hit):" + else + echo -ne "(cache miss):" + # clear stale cache files + rm -f ${CACHE_FILE} ${CACHE_MD5} + plugins=(`find ${PLUGIN_DIR} -maxdepth 1 \ + -name "${PLUGIN_PREFIX}*.so.${version}" | \ + xargs -r dpkg -S 2>&1 | \ + sed "s/^dpkg:/'':/" | \ + sed "s/:.*${PLUGIN_PREFIX}\([^\.]\+\)\.so\.${version}.*$/:\1/"`) + # write results into cache + echo ${plugins[@]} > ${CACHE_FILE} + md5sum ${PLUGIN_DIR}/${PLUGIN_PREFIX}*.so.${version} ${CACHE_FILE} > ${CACHE_MD5} 2>&1 + fi + installed_plugins=(`echo ${plugins[@]} | sed 's/[^ ]*://g'`) + packages=( vdr `echo ${plugins[@]} | sed 's/:[^ ]*//g'`) + + if [ "$PLUGIN_CHECK_STARTABLE" = "yes" ]; then + + # move not startable plugins to $leftout2 + for (( i=${#installed_plugins[@]}, i-- ; i >= 0 ; i-- )); do + if ! eval "$vdrcmd -V -L $PLUGIN_DIR -P ${installed_plugins[$i]}" \ + 2>/dev/null | grep -q "^${installed_plugins[$i]} "; then + leftout2="${leftout2} ${installed_plugins[$i]}" + unset installed_plugins[$i] + fi + done + + # cleanup the installed_plugins array + installed_plugins=( "${installed_plugins[@]}" ) + fi + + if [ -r "$PLUGIN_CFG_DIR/order.conf" ]; then + # load plugin order + plugin_order=( `cat $PLUGIN_CFG_DIR/order.conf | sed "s/#.*$//"` ) + + # move ordered plugins to list of ordered plugins + for plugin in ${plugin_order[@]}; do + for (( i=0 ; i<${#installed_plugins[@]} ; i++ )); do + if [ "$plugin" = "-${installed_plugins[$i]}" ]; then + unset installed_plugins[$i] + installed_plugins=( "${installed_plugins[@]}" ) + break + fi + if [ "$plugin" = "${installed_plugins[$i]}" ]; then + ordered_plugins=( "${ordered_plugins[@]}" "$plugin" ) + unset installed_plugins[$i] + installed_plugins=( "${installed_plugins[@]}" ) + break + fi + done + done + fi + + # append unordered to ordered plugins + ordered_plugins=( "${ordered_plugins[@]}" "${installed_plugins[@]}" ) + + # add the command line arguments for each plugin + for plugin in ${ordered_plugins[@]}; do + echo -n " $plugin" + if [ -r "$PLUGIN_CFG_DIR/plugin.$plugin.conf" ] ; then + arguments=( `cat $PLUGIN_CFG_DIR/plugin.$plugin.conf | sed "s/#.*$//"` ) + PLUGINS="$PLUGINS -P \"$plugin ${arguments[*]}\"" + else + PLUGINS="$PLUGINS -P $plugin" + fi + done + + # warn about incompatible plugins + if [ ! -z "$leftout" ]; then + echo -ne "\nWARNING: The following plugins have been left out due to"\ + "possible binary incompatibility: " + echo -n $leftout + fi + + # warn about not startable plugins + if [ ! -z "$leftout2" ]; then + echo -ne "\nWARNING: The following plugins have been left out due to"\ + "really binary incompatibility: " + echo -n $leftout2 + fi +} --- vdr-1.7.14.orig/debian/lintian/vdr-dev +++ vdr-1.7.14/debian/lintian/vdr-dev @@ -0,0 +1,5 @@ +vdr-dev: script-not-executable ./usr/share/vdr-dev/plugin-template/postinst.ex +vdr-dev: script-not-executable ./usr/share/vdr-dev/plugin-template/postrm.ex +vdr-dev: script-not-executable ./usr/share/vdr-dev/plugin-template/preinst.ex +vdr-dev: script-not-executable ./usr/share/vdr-dev/plugin-template/prerm.ex +vdr-dev: script-not-executable ./usr/share/vdr-dev/plugin-template/rules --- vdr-1.7.14.orig/debian/lintian/vdr +++ vdr-1.7.14/debian/lintian/vdr @@ -0,0 +1,2 @@ +vdr: package-contains-upstream-install-documentation usr/share/doc/vdr/INSTALL.gz +vdr: package-contains-empty-directory usr/lib/vdr/plugins/ --- vdr-1.7.14.orig/debian/plugin-template/rules +++ vdr-1.7.14/debian/plugin-template/rules @@ -0,0 +1,19 @@ +#!/usr/bin/make -f + +include /usr/share/cdbs/1/rules/debhelper.mk +# include /usr/share/cdbs/1/rules/dpatch.mk + +DEB_INSTALL_CHANGELOGS_ALL = HISTORY + +MAKE_OPTIONS = DVBDIR=/usr VDRDIR=/usr/include/vdr LIBDIR=. \ + LOCALEDIR=debian/tmp/usr/share/locale + +common-build-arch:: + $(MAKE) all $(MAKE_OPTIONS) + +cleanbuilddir:: + $(MAKE) -o .dependencies clean $(MAKE_OPTIONS) + rm -f libvdr-*.so.* + +common-binary-predeb-arch:: + sh /usr/share/vdr-dev/dependencies.sh --- vdr-1.7.14.orig/debian/plugin-template/copyright +++ vdr-1.7.14/debian/plugin-template/copyright @@ -0,0 +1,46 @@ +Upstream Homepage: + <fill in http/ftp site> + +Upstream Author(s): + <put author(s) name and email here> + +Debian Maintainer(s): + #USERNAME# <#EMAIL#> + +Copyright: + <put the year(s) of the copyright, and the names of the copyright + holder(s) here> + +Copyright (Debian packaging): + (C) #YEAR# #USERNAME# + +License: + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + The complete text of the GNU General Public License can be found + in /usr/share/common-licenses/GPL-2 on most Debian systems. + +License (Debian packaging): + The Debian packaging is licensed under the GPL, version 2 or any + later version, see /usr/share/common-licenses/GPL-2. + +# Please also look if there are files or directories which have a +# different copyright/license attached and list them in this file. +# +# Check if the upstream sources explicitly state which licenses apply to +# which action. If this is not the case, ask the upstream author to add such a +# license disclaimer to all source files or at least to the README. For the +# GPL2 or GPL3 the small license disclaimer mentioned at the end of the full license +# text in "How to Apply These Terms to Your New Programs" should be sufficient. --- vdr-1.7.14.orig/debian/plugin-template/changelog +++ vdr-1.7.14/debian/plugin-template/changelog @@ -0,0 +1,12 @@ +#PACKAGE# (#VERSION#-1) unstable; urgency=low + + * Initial release (Closes: #nnnn) <nnnn is the bug number of your ITP> + + Important: + + If you intend to make this plugin available to others, please create an + ITP-bug (see http://www.debian.org/devel/wnpp ) and contact the + Debian VDR packaging team: pkg-vdr-dvb-devel@lists.alioth.debian.org + + -- #USERNAME# <#EMAIL#> #DATE# + --- vdr-1.7.14.orig/debian/plugin-template/install +++ vdr-1.7.14/debian/plugin-template/install @@ -0,0 +1,2 @@ +libvdr-#PLUGIN#.so.* usr/lib/vdr/plugins/ +debian/tmp/usr/share/locale --- vdr-1.7.14.orig/debian/plugin-template/links.ex +++ vdr-1.7.14/debian/plugin-template/links.ex @@ -0,0 +1 @@ +usr/share/#PACKAGE#/#PLUGIN# var/lib/vdr/plugins/#PLUGIN# --- vdr-1.7.14.orig/debian/plugin-template/control +++ vdr-1.7.14/debian/plugin-template/control @@ -0,0 +1,15 @@ +Source: #PACKAGE# +Section: video +Priority: extra +Maintainer: #USERNAME# <#EMAIL#> +Build-Depends: #BUILD_DEPS#, vdr-dev (>= #VDRVERSION#), gettext +Standards-Version: #POLICY# +Vcs-Svn: svn://svn.debian.org/pkg-vdr-dvb/vdr/#PACKAGE#/trunk/ +Vcs-Browser: http://svn.debian.org/wsvn/pkg-vdr-dvb/vdr/#PACKAGE#/trunk/ +Homepage: <url://example.com> + +Package: #PACKAGE# +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, ${vdr:Depends} +Description: <insert up to 60 chars description> + <insert long description, indented with spaces> --- vdr-1.7.14.orig/debian/patches/XX_patchtest-patch-error.dpatch +++ vdr-1.7.14/debian/patches/XX_patchtest-patch-error.dpatch @@ -0,0 +1,20 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run + +## XX_patchtest-patch-error +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Patch to check patchtest against patch error + +@DPATCH@ +diff -Nur vdr.orig/vdr.c vdr/vdr.c +--- vdr.orig/vdr.c 2004-03-12 21:37:17.000000000 +0100 ++++ vdr/vdr.c 2004-03-13 14:22:01.000000000 +0100 +@@ -79,6 +79,8 @@ + + int main(int argc, char *argv[]) + ***PATCH-BUG*** ++ RaiseCompilerError(); ++ + // Save terminal settings: + + struct termios savedTm; --- vdr-1.7.14.orig/debian/patches/82_valgrind.dpatch +++ vdr-1.7.14/debian/patches/82_valgrind.dpatch @@ -0,0 +1,98 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 82_valgrind.dpatch by Tobias Grimm <tg@e-tobi.net> +## +## Thomas Gnther <tom@toms-cafe.de>: +## - adapted to VDR-1.7.4 +## - adapted to VDR-1.7.11 +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: In order to allow valgrind to find memory leaks in VDR plugins, VDR +## DP: must not unload the plugin libraries when shutting down. This +## DP: patch adds a new option -k / --keep-plugins (which is only available +## DP: in the debug build) to disable plugin unloading. + +@DPATCH@ +--- vdr-1.7.11/plugin.c ++++ vdr-1.7.11/plugin.c +@@ -152,6 +152,10 @@ const char *cPlugin::ConfigDirectory(con + + // --- cDll ------------------------------------------------------------------ + ++#ifdef VDRDEBUG ++bool cDll::keepPlugins = false; ++#endif ++ + cDll::cDll(const char *FileName, const char *Args) + { + fileName = strdup(FileName); +@@ -163,8 +167,16 @@ cDll::cDll(const char *FileName, const c + cDll::~cDll() + { + delete plugin; ++#ifdef VDRDEBUG ++ if (!keepPlugins) ++ { ++ if (handle) ++ dlclose(handle); ++ } ++#else + if (handle) + dlclose(handle); ++#endif + free(args); + free(fileName); + } +--- vdr-1.7.11/plugin.h ++++ vdr-1.7.11/plugin.h +@@ -68,6 +68,9 @@ private: + void *handle; + cPlugin *plugin; + public: ++ #ifdef VDRDEBUG ++ static bool keepPlugins; ++ #endif + cDll(const char *FileName, const char *Args); + virtual ~cDll(); + bool Load(bool Log = false); +--- vdr-1.7.11/vdr.c ++++ vdr-1.7.11/vdr.c +@@ -226,6 +226,9 @@ int main(int argc, char *argv[]) + { "grab", required_argument, NULL, 'g' }, + { "help", no_argument, NULL, 'h' }, + { "instance", required_argument, NULL, 'i' }, ++#ifdef VDRDEBUG ++ { "keep-plugins", no_argument, NULL, 'k' }, ++#endif + { "lib", required_argument, NULL, 'L' }, + { "lirc", optional_argument, NULL, 'l' | 0x100 }, + { "localedir",required_argument, NULL, 'l' | 0x200 }, +@@ -248,7 +251,7 @@ int main(int argc, char *argv[]) + }; + + int c; +- while ((c = getopt_long(argc, argv, "a:c:dD:e:E:g:hi:l:L:mp:P:r:s:t:u:v:Vw:", long_options, NULL)) != -1) { ++ while ((c = getopt_long(argc, argv, "a:c:dD:e:E:g:hi:kl:L:mp:P:r:s:t:u:v:Vw:", long_options, NULL)) != -1) { + switch (c) { + case 'a': AudioCommand = optarg; + break; +@@ -282,6 +285,10 @@ int main(int argc, char *argv[]) + } + fprintf(stderr, "vdr: invalid instance id: %s\n", optarg); + return 2; ++#ifdef VDRDEBUG ++ case 'k': cDll::keepPlugins = true; ++ break; ++#endif + case 'l': { + char *p = strchr(optarg, '.'); + if (p) +@@ -425,6 +432,9 @@ int main(int argc, char *argv[]) + " or symlinks (default: none, same as -g-)\n" + " -h, --help print this help and exit\n" + " -i ID, --instance=ID use ID as the id of this VDR instance (default: 0)\n" ++#ifdef VDRDEBUG ++ " -k --keep-plugins Support valgrind by not unloading plugins\n" ++#endif + " -l LEVEL, --log=LEVEL set log level (default: 3)\n" + " 0 = no logging, 1 = errors only,\n" + " 2 = errors and info, 3 = errors, info and debug\n" --- vdr-1.7.14.orig/debian/patches/04_newplugin.dpatch +++ vdr-1.7.14/debian/patches/04_newplugin.dpatch @@ -0,0 +1,49 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 04_newplugin.dpatch by Thomas Schmidt <tschmidt@debian.org> +## +## Thomas Gnther <tom@toms-cafe.de>: +## - adapted to VDR-1.5.7 +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Patch for the newplugin-script, to not require a normal vdr-source-dir + +@DPATCH@ +--- vdr-1.5.7/newplugin ++++ vdr-1.5.7/newplugin +@@ -24,7 +24,7 @@ + $PLUGIN_DESCRIPTION = "Enter description for '$PLUGIN_NAME' plugin"; + $PLUGIN_MAINENTRY = $PLUGIN_CLASS; + +-$PLUGINS_SRC = "PLUGINS/src"; ++$PLUGINS_SRC = "./"; + + $README = qq + {This is a "plugin" for the Video Disk Recorder (VDR). +@@ -159,7 +159,7 @@ + \@-rm -rf \$(TMPDIR)/\$(ARCHIVE) + \@mkdir \$(TMPDIR)/\$(ARCHIVE) + \@cp -a * \$(TMPDIR)/\$(ARCHIVE) +- \@tar czf \$(PACKAGE).tgz -C \$(TMPDIR) \$(ARCHIVE) ++ \@tar czf \$(PACKAGE).tgz -C \$(TMPDIR) --exclude debian --exclude CVS --exclude .svn \$(ARCHIVE) + \@-rm -rf \$(TMPDIR)/\$(ARCHIVE) + \@echo Distribution package created as \$(PACKAGE).tgz + +@@ -311,7 +311,7 @@ + VDRPLUGINCREATOR(cPlugin$PLUGIN_CLASS); // Don't touch this! + }; + +-$PLUGINDIR = "$PLUGINS_SRC/$PLUGIN_NAME"; ++$PLUGINDIR = "$PLUGINS_SRC/$PLUGIN_NAME-$PLUGIN_VERSION"; + + die "The directory $PLUGINS_SRC doesn't exist!\n" unless (-d "$PLUGINS_SRC"); + die "A plugin named '$PLUGIN_NAME' already exists in $PLUGINS_SRC!\n" if (-e "$PLUGINDIR"); +@@ -332,7 +332,8 @@ + * fill in the code skeleton in "$PLUGIN_NAME.c" to implement your plugin function + * add further source files if necessary + * adapt the "Makefile" if necessary +-* do "make plugins" from the VDR source directory to build your plugin ++* do "make all DVBDIR=/usr VDRDIR=/usr/include/vdr LIBDIR=." from the source ++ directory to build your plugin + + }; + --- vdr-1.7.14.orig/debian/patches/81_Make_config.dpatch +++ vdr-1.7.14/debian/patches/81_Make_config.dpatch @@ -0,0 +1,38 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 81_Make_config.dpatch +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Add Make.config to compile debug versions. + +@DPATCH@ +--- vdr-1.7.13/Make.config 1970-01-01 00:00:00.000000000 +0000 ++++ vdr-1.7.13/Make.config +@@ -0,0 +1,28 @@ ++# ++# The following compiler settings are required for Debian builds and will be ++# included by the Makefile of VDR and most plugins. ++# ++ ++CFLAGS = -g -Wall ++CXXFLAGS = -g -Wall -Woverloaded-virtual -Wno-parentheses ++ ++ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) ++ CXXFLAGS += -O0 ++ CFLAGS += -O0 ++else ++ CXXFLAGS += -O2 ++ CFLAGS += -O2 ++endif ++ ++ifdef VDRDEBUG ++ # Required for special debug build of VDR, where plugins are ++ # not unloaded at runtime to give valgrind a chance to detect ++ # memory leaks in the plugin libs ++ DEFINES += -DVDRDEBUG ++endif ++ ++INCLUDES += -I/usr/include/dvb-s2api-liplianin ++ ++ifdef VDRDIR ++ include $(VDRDIR)/Make.global ++endif --- vdr-1.7.14.orig/debian/patches/extension-patch-helper.sh +++ vdr-1.7.14/debian/patches/extension-patch-helper.sh @@ -0,0 +1,24 @@ +MAKE_CONFIG="Make.config" + +toggle_extension_patch() +{ + local patchname="$1" + local patchaction="$2" + local tmp + + case "$patchaction" in + -patch) + echo "$patchname = 1" >>$MAKE_CONFIG + echo "DEFINES += -DUSE_$patchname" >>$MAKE_CONFIG + ;; + -unpatch) + tmp=$MAKE_CONFIG.$$ + sed "/$patchname/d" $MAKE_CONFIG >$tmp + mv $tmp $MAKE_CONFIG + ;; + *) + echo >&2 "script expects -patch or -unpatch as argument" + exit 1 + ;; + esac +} --- vdr-1.7.14.orig/debian/patches/XX_patchtest-compile-error.dpatch +++ vdr-1.7.14/debian/patches/XX_patchtest-compile-error.dpatch @@ -0,0 +1,20 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run + +## XX_patchtest-compile-error +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Patch to check patchtest against compile error + +@DPATCH@ +diff -Nur vdr.orig/vdr.c vdr/vdr.c +--- vdr.orig/vdr.c 2004-03-12 21:37:17.000000000 +0100 ++++ vdr/vdr.c 2004-03-13 14:22:01.000000000 +0100 +@@ -79,6 +79,8 @@ + + int main(int argc, char *argv[]) + { ++ RaiseCompilerError(); ++ + // Save terminal settings: + + struct termios savedTm; --- vdr-1.7.14.orig/debian/patches/06_default_svdrp_port_0.dpatch +++ vdr-1.7.14/debian/patches/06_default_svdrp_port_0.dpatch @@ -0,0 +1,22 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run + +## 06_default_svdrp_port_0.dpatch by Thomas Schmidt <tschmidt@debian.org> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: This sets the default svdrp-port to 0, which means that +## DP: SVDRP is disabled by default unless someone specifies +## DP: another port with the --port option when starting vdr + +@DPATCH@ +diff -urNad vdr-1.3.39/vdr.c /tmp/dpep.zhqxZj/vdr-1.3.39/vdr.c +--- vdr-1.3.39/vdr.c 2006-01-17 21:24:47.597411250 +0100 ++++ /tmp/dpep.zhqxZj/vdr-1.3.39/vdr.c 2006-01-17 21:25:18.987672000 +0100 +@@ -157,7 +157,7 @@ + + // Command line options: + +-#define DEFAULTSVDRPPORT 2001 ++#define DEFAULTSVDRPPORT 0 + #define DEFAULTWATCHDOG 0 // seconds + #define DEFAULTPLUGINDIR PLUGINDIR + #define DEFAULTEPGDATAFILENAME "epg.data" --- vdr-1.7.14.orig/debian/patches/opt-37-x_menuorg.dpatch +++ vdr-1.7.14/debian/patches/opt-37-x_menuorg.dpatch @@ -0,0 +1,281 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-37-x_menuorg.dpatch by Tobias Grimm <tg@e-tobi.net> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: This patch is required by the MenuOrg plugin. It adds a service +## DP: interface, that can be implemented by plugins to reorganize +## DP: VDR's main menu entries with the ability to create custom sub +## DP: menus. +## DP: This is version 0.4.s of the patch + +@DPATCH@ +diff -Nur vdr-1.5.18.orig/mainmenuitemsprovider.h vdr-1.5.18/mainmenuitemsprovider.h +--- vdr-1.5.18.orig/mainmenuitemsprovider.h 1970-01-01 01:00:00.000000000 +0100 ++++ vdr-1.5.18/mainmenuitemsprovider.h 2008-03-25 21:17:28.000000000 +0100 +@@ -0,0 +1,60 @@ ++/* ++ * vdr-menuorg - A plugin for the Linux Video Disk Recorder ++ * Copyright (c) 2007 - 2008 Tobias Grimm <vdr@e-tobi.net> ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more ++ * details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ * ++ * $Id$ ++ * ++ */ ++ ++#ifndef __MAINMENUITEMSPROVIDER_H ++#define __MAINMENUITEMSPROVIDER_H ++ ++#include <vector> ++ ++class cOsdItem; ++class cOsdMenu; ++ ++class IMenuItemDefinition ++{ ++ public: ++ virtual ~IMenuItemDefinition() {}; ++ virtual bool IsCustomOsdItem() = 0; ++ virtual bool IsPluginItem() = 0; ++ virtual bool IsSeparatorItem() = 0; ++ virtual cOsdItem* CustomOsdItem() = 0; ++ virtual const char* PluginMenuEntry() = 0; ++ virtual bool IsSelected() = 0; ++ virtual int PluginIndex() = 0; ++}; ++ ++typedef std::vector<IMenuItemDefinition*> MenuItemDefinitions; ++ ++#define MENU_ITEMS_PROVIDER_SERVICE_ID "MenuOrgPatch-v0.4.2::MainMenuItemsProvider" ++ ++class IMainMenuItemsProvider ++{ ++ public: ++ virtual ~IMainMenuItemsProvider() {}; ++ virtual bool IsCustomMenuAvailable() = 0; ++ virtual MenuItemDefinitions* MainMenuItems() = 0; ++ virtual void EnterRootMenu() = 0; ++ virtual void EnterSubMenu(cOsdItem* item) = 0; ++ virtual bool LeaveSubMenu() = 0; ++ virtual cOsdMenu* Execute(cOsdItem* item) = 0; ++}; ++ ++#endif //__MAINMENUITEMSPROVIDER_H +diff -Nur vdr-1.5.18.orig/menu.c vdr-1.5.18/menu.c +--- vdr-1.5.18.orig/menu.c 2008-03-16 12:15:28.000000000 +0100 ++++ vdr-1.5.18/menu.c 2008-03-25 21:17:28.000000000 +0100 +@@ -29,6 +29,7 @@ + #include "timers.h" + #include "transfer.h" + #include "videodir.h" ++#include "menuorgpatch.h" + + #define MAXWAIT4EPGINFO 3 // seconds + #define MODETIMEOUT 3 // seconds +@@ -2969,6 +2970,9 @@ + cancelEditingItem = NULL; + stopRecordingItem = NULL; + recordControlsState = 0; ++ ++ MenuOrgPatch::EnterRootMenu(); ++ + Set(); + + // Initial submenus: +@@ -2997,6 +3001,29 @@ + SetTitle("VDR"); + SetHasHotkeys(); + ++ if (MenuOrgPatch::IsCustomMenuAvailable()) { ++ MenuItemDefinitions* menuItems = MenuOrgPatch::MainMenuItems(); ++ for (MenuItemDefinitions::iterator i = menuItems->begin(); i != menuItems->end(); i++) { ++ cOsdItem* osdItem = NULL; ++ if ((*i)->IsCustomOsdItem()) { ++ osdItem = (*i)->CustomOsdItem(); ++ if (osdItem && !(*i)->IsSeparatorItem()) ++ osdItem->SetText(hk(osdItem->Text())); ++ } ++ else if ((*i)->IsPluginItem()) { ++ const char *item = (*i)->PluginMenuEntry(); ++ if (item) ++ osdItem = new cMenuPluginItem(hk(item), (*i)->PluginIndex()); ++ } ++ if (osdItem) { ++ Add(osdItem); ++ if ((*i)->IsSelected()) ++ SetCurrent(osdItem); ++ } ++ } ++ } ++ else { ++ + // Basic menu items: + + Add(new cOsdItem(hk(tr("Schedule")), osSchedule)); +@@ -3023,6 +3050,8 @@ + if (Commands.Count()) + Add(new cOsdItem(hk(tr("Commands")), osCommands)); + ++ } ++ + Update(true); + + Display(); +@@ -3135,6 +3164,41 @@ + state = osEnd; + } + break; ++ case osBack: { ++ if (MenuOrgPatch::IsCustomMenuAvailable()) ++ { ++ bool leavingMenuSucceeded = MenuOrgPatch::LeaveSubMenu(); ++ Set(); ++ stopReplayItem = NULL; ++ cancelEditingItem = NULL; ++ stopRecordingItem = NULL; ++ recordControlsState = 0; ++ Update(true); ++ Display(); ++ if (leavingMenuSucceeded) ++ return osContinue; ++ else ++ return osEnd; ++ } ++ } ++ break; ++ case osUser1: { ++ if (MenuOrgPatch::IsCustomMenuAvailable()) { ++ MenuOrgPatch::EnterSubMenu(Get(Current())); ++ Set(); ++ return osContinue; ++ } ++ } ++ break; ++ case osUser2: { ++ if (MenuOrgPatch::IsCustomMenuAvailable()) { ++ cOsdMenu* osdMenu = MenuOrgPatch::Execute(Get(Current())); ++ if (osdMenu) ++ return AddSubMenu(osdMenu); ++ return osEnd; ++ } ++ } ++ break; + default: switch (Key) { + case kRecord: + case kRed: if (!HadSubMenu) +diff -Nur vdr-1.5.18.orig/menuorgpatch.h vdr-1.5.18/menuorgpatch.h +--- vdr-1.5.18.orig/menuorgpatch.h 1970-01-01 01:00:00.000000000 +0100 ++++ vdr-1.5.18/menuorgpatch.h 2008-03-25 21:17:28.000000000 +0100 +@@ -0,0 +1,100 @@ ++/* ++ * vdr-menuorg - A plugin for the Linux Video Disk Recorder ++ * Copyright (c) 2007 - 2008 Tobias Grimm <vdr@e-tobi.net> ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more ++ * details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ * ++ * $Id$ ++ * ++ */ ++ ++#ifndef __MENUORGPATCH_H ++#define __MENUORGPATCH_H ++ ++#include "mainmenuitemsprovider.h" ++ ++class MenuOrgPatch ++{ ++ private: ++ static IMainMenuItemsProvider* _mainMenuItemsProvider; ++ ++ private: ++ static IMainMenuItemsProvider* MainMenuItemsProvider() ++ { ++ if (!_mainMenuItemsProvider) ++ { ++ IMainMenuItemsProvider* mainMenuItemsProvider; ++ ++ if (cPluginManager::CallFirstService(MENU_ITEMS_PROVIDER_SERVICE_ID, &mainMenuItemsProvider)) ++ { ++ _mainMenuItemsProvider = mainMenuItemsProvider; ++ } ++ } ++ return _mainMenuItemsProvider; ++ } ++ ++ public: ++ static bool IsCustomMenuAvailable() ++ { ++ return (MainMenuItemsProvider() != NULL) && (MainMenuItemsProvider()->IsCustomMenuAvailable()); ++ } ++ ++ static void EnterRootMenu() ++ { ++ if (MainMenuItemsProvider()) ++ { ++ MainMenuItemsProvider()->EnterRootMenu(); ++ } ++ } ++ ++ static bool LeaveSubMenu() ++ { ++ if (MainMenuItemsProvider()) ++ { ++ return MainMenuItemsProvider()->LeaveSubMenu(); ++ } ++ return false; ++ } ++ ++ static void EnterSubMenu(cOsdItem* item) ++ { ++ if (MainMenuItemsProvider()) ++ { ++ MainMenuItemsProvider()->EnterSubMenu(item); ++ } ++ } ++ ++ static MenuItemDefinitions* MainMenuItems() ++ { ++ if (MainMenuItemsProvider()) ++ { ++ return MainMenuItemsProvider()->MainMenuItems(); ++ } ++ return NULL; ++ } ++ ++ static cOsdMenu* Execute(cOsdItem* item) ++ { ++ if (MainMenuItemsProvider()) ++ { ++ return MainMenuItemsProvider()->Execute(item); ++ } ++ return NULL; ++ } ++}; ++ ++IMainMenuItemsProvider* MenuOrgPatch::_mainMenuItemsProvider = NULL; ++ ++#endif //__MENUORGPATCH_H --- vdr-1.7.14.orig/debian/patches/opt-91_ext-graphtft.dpatch +++ vdr-1.7.14/debian/patches/opt-91_ext-graphtft.dpatch @@ -0,0 +1,11 @@ +#!/bin/sh +# +# Enables the `graphtft` patch within the VDR Extension patch +# +# Graphtft-Plugin +# +. debian/patches/extension-patch-helper.sh + +toggle_extension_patch GRAPHTFT $1 + +exit 0 --- vdr-1.7.14.orig/debian/patches/opt-52_hard_link_cutter.dpatch +++ vdr-1.7.14/debian/patches/opt-52_hard_link_cutter.dpatch @@ -0,0 +1,561 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-52_hard_link_cutter.dpatch by Udo Richter <udo_richter@gmx.de> +## http://www.udo-richter.de/vdr/patches.en.html#hlcutter +## +## This is version 0.2.2 of the patch +## +## Thomas Günther <tom@toms-cafe.de>: +## - adapted to VDR-1.7.10 +## - adapted to VDR-1.7.11 +## - made independend from liemikuutio patch +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: The hard link cutter patch changes the recording editing algorithms +## DP: of VDR to use filesystem hard links to 'copy' recording files whenever +## DP: possible to speed up editing recordings noticeably. + +@DPATCH@ +diff -Naurp vdr-1.7.14/README-HLCUTTER vdr-1.7.14-cutter/README-HLCUTTER +--- vdr-1.7.14/README-HLCUTTER 1970-01-01 00:00:00.000000000 +0000 ++++ vdr-1.7.14-cutter/README-HLCUTTER 2010-03-14 17:35:55.000000000 +0000 +@@ -0,0 +1,117 @@ ++ ++ VDR-HLCUTTER README ++ ++ ++Written by: Udo Richter ++Available at: http://www.udo-richter.de/vdr/patches.html#hlcutter ++ http://www.udo-richter.de/vdr/patches.en.html#hlcutter ++Contact: udo_richter@gmx.de ++ ++ ++ ++About ++----- ++ ++The hard link cutter patch changes the recording editing algorithms of VDR to ++use filesystem hard links to 'copy' recording files whenever possible to speed ++up editing recordings noticeably. ++ ++The patch has matured to be quite stable, at least I'm using it without issues. ++Nevertheless the patch is still in development and should be used with caution. ++The patch is EXPERIMENTAL for multiple /videoxx folders. The safety checks ++should prevent data loss, but you should always carefully check the results. ++ ++While editing a recording, the patch searches for any 00x.vdr files that dont ++contain editing marks and would normally be copied 1:1 unmodified to the edited ++recording. In this case the current target 00x.vdr file will be aborted, and ++the cutter process attempts to duplicate the source file as a hard link, so ++that both files share the same disk space. If this succeeds, the editing ++process fast-forwards through the duplicated file and continues normally ++beginning with the next source file. If hard linking fails, the cutter process ++continues with plain old copying. (but does not take up the aborted last file.) ++ ++After editing, the un-edited recording can be deleted as usual, the hard linked ++copies will continue to exist as the only remaining copy. ++ ++To be effective, the default 'Max. video file size (MB)' should be lowered. ++The patch lowers the smallest possible file size to 1mb. Since VDR only ++supports up to 255 files, this would limit the recording size to 255Mb or ++10 minutes, in other words: This setting is insane! ++ ++To make sure that the 255 file limit will not be reached, the patch also ++introduces "Max. recording size (GB)" with a default of 100Gb (66 hours), and ++increases the file size to 2000Mb early enough, so that 100Gb-recordings will ++fit into the 255 files. ++ ++Picking the right parameters can be tricky. The smaller the file size, the ++faster the editing process works. However, with a small file size, long ++recordings will fall back to 2000Mb files soon, that are slow on editing again. ++ ++Here are some examples: ++ ++Max file size: 100Gb 100Gb 100Gb 100Gb 100Gb 100Gb 100Gb ++Max recording size: 1Mb 10Mb 20Mb 30Mb 40Mb 50Mb 100Mb ++ ++Small files: 1-203 1-204 1-205 1-206 1-207 1-209 1-214 ++ GBytes: 0.2 2.0 4.0 6.0 8.1 10.2 20.9 ++ Hours: 0.13 1.3 2.65 4 5.4 6.8 13.9 ++ ++Big (2000mb) files: 204-255 204-255 206-255 207-255 208-255 210-255 215-255 ++ GBytes: 101.5 99.6 97.7 95.7 93.8 89.8 80.1 ++ Hours: 67 66 65 63 62 60 53 ++ ++A recording limit of 100Gb keeps plenty of reserve without blocking too much ++file numbers. And with a file size of 30-40Mb, recordings of 4-5 hours fit into ++small files completely. (depends on bit rate of course) ++ ++ ++ ++The patch must be enabled in Setup-> Recordings-> Hard Link Cutter. When ++disabled, the cutter process behaves identical to VDR's default cutter. ++ ++There's a //#define HARDLINK_TEST_ONLY in the videodir.c file that enables a ++test-mode that hard-links 00x.vdr_ files only, and continues the classic ++editing. The resulting 00x.vdr and 00x.vdr_ files should be identical. If you ++delete the un-edited recording, dont forget to delete the *.vdr_ files too, ++they will now eat real disk space. ++ ++Note: 'du' displays the disk space of hard links only on first appearance, and ++usually you will see a noticeably smaller size on the edited recording. ++ ++ ++History ++------- ++ ++Version 0.2.0 ++ New: Support for multiple /videoXX recording folders, using advanced searching ++ for matching file systems where a hard link can be created. ++ Also supports deep mounted file systems. ++ Fix: Do not fail if last mark is a cut-in. (Again.) ++ ++Version 0.1.4 ++ New: Dynamic increase of file size before running out of xxx.vdr files ++ Fix: Last edit mark is not a cut-out ++ Fix: Write error if link-copied file is smaller than allowed file size ++ Fix: Broken index/marks if cut-in is at the start of a new file ++ Fix: Clear dangeling pointer to free'd cUnbufferedFile, ++ thx to Matthias Schwarzott ++ ++Version 0.1.0 ++ Initial release ++ ++ ++ ++ ++Future plans ++------------ ++ ++Since original and edited copy share disk space, free space is wrong if one of ++them is moved to *.del. Free space should only count files with hard link ++count = 1. This still goes wrong if all copies get deleted. ++ ++ ++For more safety, the hard-linked files may be made read-only, as modifications ++to one copy will affect the other copy too. (except deleting, of course) ++ ++ ++SetBrokenLink may get lost on rare cases, this needs some more thoughts. +diff -Naurp vdr-1.7.14/config.c vdr-1.7.14-cutter/config.c +--- vdr-1.7.14/config.c 2010-03-12 16:41:37.000000000 +0000 ++++ vdr-1.7.14-cutter/config.c 2010-03-14 17:43:56.000000000 +0000 +@@ -383,7 +383,9 @@ cSetup::cSetup(void) + FontSmlSize = 18; + FontFixSize = 20; + MaxVideoFileSize = MAXVIDEOFILESIZEDEFAULT; ++ MaxRecordingSize = DEFAULTRECORDINGSIZE; + SplitEditedFiles = 0; ++ HardLinkCutter = 0; + DelTimeshiftRec = 0; + MinEventTimeout = 30; + MinUserInactivity = 300; +@@ -573,7 +575,9 @@ bool cSetup::Parse(const char *Name, con + else if (!strcasecmp(Name, "FontSmlSize")) FontSmlSize = atoi(Value); + else if (!strcasecmp(Name, "FontFixSize")) FontFixSize = atoi(Value); + else if (!strcasecmp(Name, "MaxVideoFileSize")) MaxVideoFileSize = atoi(Value); ++ else if (!strcasecmp(Name, "MaxRecordingSize")) MaxRecordingSize = atoi(Value); + else if (!strcasecmp(Name, "SplitEditedFiles")) SplitEditedFiles = atoi(Value); ++ else if (!strcasecmp(Name, "HardLinkCutter")) HardLinkCutter = atoi(Value); + else if (!strcasecmp(Name, "DelTimeshiftRec")) DelTimeshiftRec = atoi(Value); + else if (!strcasecmp(Name, "MinEventTimeout")) MinEventTimeout = atoi(Value); + else if (!strcasecmp(Name, "MinUserInactivity")) MinUserInactivity = atoi(Value); +@@ -668,7 +672,9 @@ bool cSetup::Save(void) + Store("FontSmlSize", FontSmlSize); + Store("FontFixSize", FontFixSize); + Store("MaxVideoFileSize", MaxVideoFileSize); ++ Store("MaxRecordingSize", MaxRecordingSize); + Store("SplitEditedFiles", SplitEditedFiles); ++ Store("HardLinkCutter", HardLinkCutter); + Store("DelTimeshiftRec", DelTimeshiftRec); + Store("MinEventTimeout", MinEventTimeout); + Store("MinUserInactivity", MinUserInactivity); +diff -Naurp vdr-1.7.14/config.h vdr-1.7.14-cutter/config.h +--- vdr-1.7.14/config.h 2010-03-12 16:02:53.000000000 +0000 ++++ vdr-1.7.14-cutter/config.h 2010-03-14 17:38:29.000000000 +0000 +@@ -276,7 +276,9 @@ public: + int FontSmlSize; + int FontFixSize; + int MaxVideoFileSize; ++ int MaxRecordingSize; + int SplitEditedFiles; ++ int HardLinkCutter; + int DelTimeshiftRec; + int MinEventTimeout, MinUserInactivity; + time_t NextWakeupTime; +diff -Naurp vdr-1.7.14/cutter.c vdr-1.7.14-cutter/cutter.c +--- vdr-1.7.14/cutter.c 2010-01-02 13:08:08.000000000 +0000 ++++ vdr-1.7.14-cutter/cutter.c 2010-03-14 17:35:55.000000000 +0000 +@@ -78,6 +78,7 @@ void cCuttingThread::Action(void) + Mark = fromMarks.Next(Mark); + off_t FileSize = 0; + int CurrentFileNumber = 0; ++ bool SkipThisSourceFile = false; + int LastIFrame = 0; + toMarks.Add(0); + toMarks.Save(); +@@ -96,12 +97,92 @@ void cCuttingThread::Action(void) + + // Read one frame: + +- if (fromIndex->Get(Index++, &FileNumber, &FileOffset, &Independent, &Length)) { +- if (FileNumber != CurrentFileNumber) { +- fromFile = fromFileName->SetOffset(FileNumber, FileOffset); +- fromFile->SetReadAhead(MEGABYTE(20)); +- CurrentFileNumber = FileNumber; +- } ++ if (!fromIndex->Get(Index++, &FileNumber, &FileOffset, &Independent, &Length)) { ++ // Error, unless we're past last cut-in and there's no cut-out ++ if (Mark || LastMark) ++ error = "index"; ++ break; ++ } ++ ++ if (FileNumber != CurrentFileNumber) { ++ fromFile = fromFileName->SetOffset(FileNumber, FileOffset); ++ fromFile->SetReadAhead(MEGABYTE(20)); ++ CurrentFileNumber = FileNumber; ++ if (SkipThisSourceFile) { ++ // At end of fast forward: Always skip to next file ++ toFile = toFileName->NextFile(); ++ if (!toFile) { ++ error = "toFile 4"; ++ break; ++ } ++ FileSize = 0; ++ SkipThisSourceFile = false; ++ } ++ ++ ++ if (Setup.HardLinkCutter && FileOffset == 0) { ++ // We are at the beginning of a new source file. ++ // Do we need to copy the whole file? ++ ++ // if !Mark && LastMark, then we're past the last cut-out and continue to next I-frame ++ // if !Mark && !LastMark, then there's just a cut-in, but no cut-out ++ // if Mark, then we're between a cut-in and a cut-out ++ ++ uint16_t MarkFileNumber; ++ off_t MarkFileOffset; ++ // Get file number of next cut mark ++ if (!Mark && !LastMark ++ || Mark ++ && fromIndex->Get(Mark->position, &MarkFileNumber, &MarkFileOffset) ++ && (MarkFileNumber != CurrentFileNumber)) { ++ // The current source file will be copied completely. ++ // Start new output file unless we did that already ++ if (FileSize != 0) { ++ toFile = toFileName->NextFile(); ++ if (!toFile) { ++ error = "toFile 3"; ++ break; ++ } ++ FileSize = 0; ++ } ++ ++ // Safety check that file has zero size ++ struct stat buf; ++ if (stat(toFileName->Name(), &buf) == 0) { ++ if (buf.st_size != 0) { ++ esyslog("cCuttingThread: File %s exists and has nonzero size", toFileName->Name()); ++ error = "nonzero file exist"; ++ break; ++ } ++ } ++ else if (errno != ENOENT) { ++ esyslog("cCuttingThread: stat failed on %s", toFileName->Name()); ++ error = "stat"; ++ break; ++ } ++ ++ // Clean the existing 0-byte file ++ toFileName->Close(); ++ cString ActualToFileName(ReadLink(toFileName->Name()), true); ++ unlink(ActualToFileName); ++ unlink(toFileName->Name()); ++ ++ // Try to create a hard link ++ if (HardLinkVideoFile(fromFileName->Name(), toFileName->Name())) { ++ // Success. Skip all data transfer for this file ++ SkipThisSourceFile = true; ++ cutIn = false; ++ toFile = NULL; // was deleted by toFileName->Close() ++ } ++ else { ++ // Fallback: Re-open the file if necessary ++ toFile = toFileName->Open(); ++ } ++ } ++ } ++ } ++ ++ if (!SkipThisSourceFile) { + if (fromFile) { + int len = ReadFrame(fromFile, buffer, Length, sizeof(buffer)); + if (len < 0) { +@@ -118,19 +199,12 @@ void cCuttingThread::Action(void) + break; + } + } +- else { +- // Error, unless we're past the last cut-in and there's no cut-out +- if (Mark || LastMark) +- error = "index"; +- break; +- } +- + // Write one frame: + + if (Independent) { // every file shall start with an independent frame + if (LastMark) // edited version shall end before next I-frame + break; +- if (FileSize > maxVideoFileSize) { ++ if (!SkipThisSourceFile && FileSize > toFileName->MaxFileSize()) { + toFile = toFileName->NextFile(); + if (!toFile) { + error = "toFile 1"; +@@ -140,7 +214,7 @@ void cCuttingThread::Action(void) + } + LastIFrame = 0; + +- if (cutIn) { ++ if (!SkipThisSourceFile && cutIn) { + if (isPesRecording) + cRemux::SetBrokenLink(buffer, Length); + else +@@ -148,7 +222,7 @@ void cCuttingThread::Action(void) + cutIn = false; + } + } +- if (toFile->Write(buffer, Length) < 0) { ++ if (!SkipThisSourceFile && toFile->Write(buffer, Length) < 0) { + error = "safe_write"; + break; + } +@@ -183,7 +257,7 @@ void cCuttingThread::Action(void) + } + } + else +- LastMark = true; ++ LastMark = true; // After last cut-out: Write on until next I-frame, then exit + } + } + Recordings.TouchUpdate(); +diff -Naurp vdr-1.7.14/menu.c vdr-1.7.14-cutter/menu.c +--- vdr-1.7.14/menu.c 2010-03-12 16:03:07.000000000 +0000 ++++ vdr-1.7.14-cutter/menu.c 2010-03-14 17:35:55.000000000 +0000 +@@ -3056,1 +3056,3 @@ cMenuSetupRecord::cMenuSetupRecord(void) ++ Add(new cMenuEditIntItem( tr("Setup.Recording$Max. recording size (GB)"), &data.MaxRecordingSize, MINRECORDINGSIZE, MAXRECORDINGSIZE)); + Add(new cMenuEditBoolItem(tr("Setup.Recording$Split edited files"), &data.SplitEditedFiles)); ++ Add(new cMenuEditBoolItem(tr("Setup.Recording$Hard Link Cutter"), &data.HardLinkCutter)); +diff -Naurp vdr-1.7.14/recorder.c vdr-1.7.14-cutter/recorder.c +--- vdr-1.7.14/recorder.c 2010-01-29 16:37:22.000000000 +0000 ++++ vdr-1.7.14-cutter/recorder.c 2010-03-14 17:35:55.000000000 +0000 +@@ -87,7 +87,7 @@ bool cRecorder::RunningLowOnDiskSpace(vo + bool cRecorder::NextFile(void) + { + if (recordFile && frameDetector->IndependentFrame()) { // every file shall start with an independent frame +- if (fileSize > MEGABYTE(off_t(Setup.MaxVideoFileSize)) || RunningLowOnDiskSpace()) { ++ if (fileSize > fileName->MaxFileSize() || RunningLowOnDiskSpace()) { + recordFile = fileName->NextFile(); + fileSize = 0; + } +diff -Naurp vdr-1.7.14/recording.c vdr-1.7.14-cutter/recording.c +--- vdr-1.7.14/recording.c 2010-03-07 14:06:04.000000000 +0000 ++++ vdr-1.7.14-cutter/recording.c 2010-03-14 17:35:55.000000000 +0000 +@@ -1935,6 +1935,20 @@ cUnbufferedFile *cFileName::SetOffset(in + return NULL; + } + ++off_t cFileName::MaxFileSize() { ++ const int maxVideoFileSize = isPesRecording ? MAXVIDEOFILESIZEPES : MAXVIDEOFILESIZETS; ++ const int setupMaxVideoFileSize = min(maxVideoFileSize, Setup.MaxVideoFileSize); ++ const int maxFileNumber = isPesRecording ? 255 : 65535; ++ ++ const off_t smallFiles = (maxFileNumber * off_t(maxVideoFileSize) - 1024 * Setup.MaxRecordingSize) ++ / max(maxVideoFileSize - setupMaxVideoFileSize, 1); ++ ++ if (fileNumber <= smallFiles) ++ return MEGABYTE(off_t(setupMaxVideoFileSize)); ++ ++ return MEGABYTE(off_t(maxVideoFileSize)); ++} ++ + cUnbufferedFile *cFileName::NextFile(void) + { + return SetOffset(fileNumber + 1); +diff -Naurp vdr-1.7.14/recording.h vdr-1.7.14-cutter/recording.h +--- vdr-1.7.14/recording.h 2010-03-07 14:06:15.000000000 +0000 ++++ vdr-1.7.14-cutter/recording.h 2010-03-14 17:35:55.000000000 +0000 +@@ -220,9 +220,17 @@ public: + // before the next independent frame, to have a complete Group Of Pictures): + #define MAXVIDEOFILESIZETS 1048570 // MB + #define MAXVIDEOFILESIZEPES 2000 // MB +-#define MINVIDEOFILESIZE 100 // MB ++#define MINVIDEOFILESIZE 1 // MB + #define MAXVIDEOFILESIZEDEFAULT MAXVIDEOFILESIZEPES + ++#define MINRECORDINGSIZE 25 // GB ++#define MAXRECORDINGSIZE 500 // GB ++#define DEFAULTRECORDINGSIZE 100 // GB ++// Dynamic recording size: ++// Keep recording file size at Setup.MaxVideoFileSize for as long as possible, ++// but switch to MAXVIDEOFILESIZE early enough, so that Setup.MaxRecordingSize ++// will be reached, before recording to file 65535.vdr ++ + struct tIndexTs; + class cIndexFileGenerator; + +@@ -271,6 +279,8 @@ public: + cUnbufferedFile *Open(void); + void Close(void); + cUnbufferedFile *SetOffset(int Number, off_t Offset = 0); // yes, Number is int for easier internal calculating ++ off_t MaxFileSize(); ++ // Dynamic file size for this file + cUnbufferedFile *NextFile(void); + }; + +diff -Naurp vdr-1.7.14/videodir.c vdr-1.7.14-cutter/videodir.c +--- vdr-1.7.14/videodir.c 2008-02-16 13:00:03.000000000 +0000 ++++ vdr-1.7.14-cutter/videodir.c 2010-03-14 17:35:55.000000000 +0000 +@@ -19,6 +19,9 @@ + #include "recording.h" + #include "tools.h" + ++ ++//#define HARDLINK_TEST_ONLY ++ + const char *VideoDirectory = VIDEODIR; + + class cVideoDirectory { +@@ -168,6 +171,120 @@ bool RemoveVideoFile(const char *FileNam + return RemoveFileOrDir(FileName, true); + } + ++static bool StatNearestDir(const char *FileName, struct stat *Stat) ++{ ++ cString Name(FileName); ++ char *p; ++ while ((p = strrchr((char*)(const char*)Name + 1, '/')) != NULL) { ++ *p = 0; // truncate at last '/' ++ if (stat(Name, Stat) == 0) { ++ isyslog("StatNearestDir: Stating %s", (const char*)Name); ++ return true; ++ } ++ } ++ return false; ++} ++ ++bool HardLinkVideoFile(const char *OldName, const char *NewName) ++{ ++ // Incoming name must be in base video directory: ++ if (strstr(OldName, VideoDirectory) != OldName) { ++ esyslog("ERROR: %s not in %s", OldName, VideoDirectory); ++ return false; ++ } ++ if (strstr(NewName, VideoDirectory) != NewName) { ++ esyslog("ERROR: %s not in %s", NewName, VideoDirectory); ++ return false; ++ } ++ ++ const char *ActualNewName = NewName; ++ cString ActualOldName(ReadLink(OldName), true); ++ ++ // Some safety checks: ++ struct stat StatOldName; ++ if (lstat(ActualOldName, &StatOldName) == 0) { ++ if (S_ISLNK(StatOldName.st_mode)) { ++ esyslog("HardLinkVideoFile: Failed to resolve symbolic link %s", (const char*)ActualOldName); ++ return false; ++ } ++ } ++ else { ++ esyslog("HardLinkVideoFile: lstat failed on %s", (const char*)ActualOldName); ++ return false; ++ } ++ isyslog("HardLinkVideoFile: %s is on %i", (const char*)ActualOldName, (int)StatOldName.st_dev); ++ ++ // Find the video directory where ActualOldName is located ++ ++ cVideoDirectory Dir; ++ struct stat StatDir; ++ if (!StatNearestDir(NewName, &StatDir)) { ++ esyslog("HardLinkVideoFile: stat failed on %s", NewName); ++ return false; ++ } ++ ++ isyslog("HardLinkVideoFile: %s is on %i", NewName, (int)StatDir.st_dev); ++ if (StatDir.st_dev != StatOldName.st_dev) { ++ // Not yet found. ++ ++ if (!Dir.IsDistributed()) { ++ esyslog("HardLinkVideoFile: No matching video folder to hard link %s", (const char*)ActualOldName); ++ return false; ++ } ++ ++ // Search in video01 and upwards ++ bool found = false; ++ while (Dir.Next()) { ++ Dir.Store(); ++ const char *TmpNewName = Dir.Adjust(NewName); ++ if (StatNearestDir(TmpNewName, &StatDir) && StatDir.st_dev == StatOldName.st_dev) { ++ isyslog("HardLinkVideoFile: %s is on %i (match)", TmpNewName, (int)StatDir.st_dev); ++ ActualNewName = TmpNewName; ++ found = true; ++ break; ++ } ++ isyslog("HardLinkVideoFile: %s is on %i", TmpNewName, (int)StatDir.st_dev); ++ } ++ if (ActualNewName == NewName) { ++ esyslog("HardLinkVideoFile: No matching video folder to hard link %s", (const char*)ActualOldName); ++ return false; ++ } ++ ++ // Looking good, we have a match. Create necessary folders. ++ if (!MakeDirs(ActualNewName, false)) ++ return false; ++ // There's no guarantee that the directory of ActualNewName ++ // is on the same device as the dir that StatNearestDir found. ++ // But worst case is that the link fails. ++ } ++ ++#ifdef HARDLINK_TEST_ONLY ++ // Do the hard link to *.vdr_ for testing only ++ char *name = NULL; ++ asprintf(&name, "%s_",ActualNewName); ++ link(ActualOldName, name); ++ free(name); ++ return false; ++#endif // HARDLINK_TEST_ONLY ++ ++ // Try creating the hard link ++ if (link(ActualOldName, ActualNewName) != 0) { ++ // Failed to hard link. Maybe not allowed on file system. ++ LOG_ERROR_STR(ActualNewName); ++ isyslog("HardLinkVideoFile: failed to hard link from %s to %s", (const char*)ActualOldName, ActualNewName); ++ return false; ++ } ++ ++ if (ActualNewName != NewName) { ++ // video01 and up. Do the remaining symlink ++ if (symlink(ActualNewName, NewName) < 0) { ++ LOG_ERROR_STR(NewName); ++ return false; ++ } ++ } ++ return true; ++} ++ + bool VideoFileSpaceAvailable(int SizeMB) + { + cVideoDirectory Dir; +diff -Naurp vdr-1.7.14/videodir.h vdr-1.7.14-cutter/videodir.h +--- vdr-1.7.14/videodir.h 2008-02-16 12:53:11.000000000 +0000 ++++ vdr-1.7.14-cutter/videodir.h 2010-03-14 17:35:55.000000000 +0000 +@@ -19,6 +19,7 @@ cUnbufferedFile *OpenVideoFile(const cha + int CloseVideoFile(cUnbufferedFile *File); + bool RenameVideoFile(const char *OldName, const char *NewName); + bool RemoveVideoFile(const char *FileName); ++bool HardLinkVideoFile(const char *OldName, const char *NewName); + bool VideoFileSpaceAvailable(int SizeMB); + int VideoDiskSpace(int *FreeMB = NULL, int *UsedMB = NULL); // returns the used disk space in percent + cString PrefixVideoFileName(const char *FileName, char Prefix); --- vdr-1.7.14.orig/debian/patches/opt-20_liemikuutio.dpatch +++ vdr-1.7.14/debian/patches/opt-20_liemikuutio.dpatch @@ -0,0 +1,1261 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-20_liemikuutio.dpatch by Rolf Ahrenberg <Rolf.Ahrenberg AT sci.fi> +## http://www.saunalahti.fi/~rahrenbe/vdr/patches/vdr-1.7.14-liemikuutio-1.30.patch.gz +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Patch collection - see HISTORY-liemikuutio for details. + +@DPATCH@ +diff -Nru vdr-1.7.14-vanilla/config.c vdr-1.7.14-liemikuutio/config.c +--- vdr-1.7.14-vanilla/config.c 2010-03-14 16:57:06.000000000 +0200 ++++ vdr-1.7.14-liemikuutio/config.c 2010-03-14 16:58:41.000000000 +0200 +@@ -398,6 +398,11 @@ + InitialVolume = -1; + ChannelsWrap = 0; + EmergencyExit = 1; ++ ShowRecDate = 1; ++ ShowRecTime = 1; ++ ShowRecLength = 0; ++ ShowProgressBar = 0; ++ MenuCmdPosition = 0; + } + + cSetup& cSetup::operator= (const cSetup &s) +@@ -588,6 +593,11 @@ + else if (!strcasecmp(Name, "InitialVolume")) InitialVolume = atoi(Value); + else if (!strcasecmp(Name, "ChannelsWrap")) ChannelsWrap = atoi(Value); + else if (!strcasecmp(Name, "EmergencyExit")) EmergencyExit = atoi(Value); ++ else if (!strcasecmp(Name, "ShowRecDate")) ShowRecDate = atoi(Value); ++ else if (!strcasecmp(Name, "ShowRecTime")) ShowRecTime = atoi(Value); ++ else if (!strcasecmp(Name, "ShowRecLength")) ShowRecLength = atoi(Value); ++ else if (!strcasecmp(Name, "ShowProgressBar")) ShowProgressBar = atoi(Value); ++ else if (!strcasecmp(Name, "MenuCmdPosition")) MenuCmdPosition = atoi(Value); + else + return false; + return true; +@@ -683,6 +693,11 @@ + Store("InitialVolume", InitialVolume); + Store("ChannelsWrap", ChannelsWrap); + Store("EmergencyExit", EmergencyExit); ++ Store("ShowRecDate", ShowRecDate); ++ Store("ShowRecTime", ShowRecTime); ++ Store("ShowRecLength", ShowRecLength); ++ Store("ShowProgressBar", ShowProgressBar); ++ Store("MenuCmdPosition", MenuCmdPosition); + + Sort(); + +diff -Nru vdr-1.7.14-vanilla/config.h vdr-1.7.14-liemikuutio/config.h +--- vdr-1.7.14-vanilla/config.h 2010-03-14 16:57:06.000000000 +0200 ++++ vdr-1.7.14-liemikuutio/config.h 2010-03-14 16:58:41.000000000 +0200 +@@ -36,6 +36,8 @@ + // plugins to work with newer versions of the core VDR as long as no + // VDR header files have changed. + ++#define LIEMIKUUTIO 130 ++ + #define MAXPRIORITY 99 + #define MAXLIFETIME 99 + +@@ -290,6 +292,7 @@ + int InitialVolume; + int ChannelsWrap; + int EmergencyExit; ++ int ShowRecDate, ShowRecTime, ShowRecLength, ShowProgressBar, MenuCmdPosition; + int __EndData__; + cSetup(void); + cSetup& operator= (const cSetup &s); +diff -Nru vdr-1.7.14-vanilla/device.c vdr-1.7.14-liemikuutio/device.c +--- vdr-1.7.14-vanilla/device.c 2010-03-14 16:57:06.000000000 +0200 ++++ vdr-1.7.14-liemikuutio/device.c 2010-03-14 16:58:41.000000000 +0200 +@@ -1012,7 +1012,8 @@ + int LanguagePreference = INT_MAX; // higher than the maximum possible value + for (int i = ttSubtitleFirst; i <= ttSubtitleLast; i++) { + const tTrackId *TrackId = GetTrack(eTrackType(i)); +- if (TrackId && TrackId->id && I18nIsPreferredLanguage(Setup.SubtitleLanguages, TrackId->language, LanguagePreference)) ++ if (TrackId && TrackId->id && (I18nIsPreferredLanguage(Setup.SubtitleLanguages, TrackId->language, LanguagePreference) || ++ ((i == ttSubtitleFirst + 8) && !(*TrackId->language) && (LanguagePreference == INT_MAX)))) + PreferredTrack = eTrackType(i); + } + // Make sure we're set to an available subtitle track: +diff -Nru vdr-1.7.14-vanilla/HISTORY-liemikuutio vdr-1.7.14-liemikuutio/HISTORY-liemikuutio +--- vdr-1.7.14-vanilla/HISTORY-liemikuutio 1970-01-01 02:00:00.000000000 +0200 ++++ vdr-1.7.14-liemikuutio/HISTORY-liemikuutio 2010-03-14 16:58:41.000000000 +0200 +@@ -0,0 +1,144 @@ ++----------------------------------- ++Liemikuutio for Video Disc Recorder ++ ++Maintainer: Rolf Ahrenberg ++----------------------------------- ++ ++2006-01-08: Version 1.0 ++ ++- Based on enAIO with these original patches: ++ Simple recordings sorting by Walter@VDRPortal ++ Alternate rename recordings by Ralf Müller ++ Menu selection by Peter Dittmann ++ Recording length by Tobias Faust ++ ++2006-01-15: Version 1.1 ++ ++- Removed patches already found in vdr-1.3.39. ++ ++2006-01-25: Version 1.2 ++ ++- Added "Main menu command position" feature. ++ ++2006-02-05: Version 1.3 ++ ++- Improved menu selection response. ++ ++2006-04-18: Version 1.4 ++ ++- Added Estonian translation (Thanks to Arthur Konovalov). ++ ++2006-04-30: Version 1.5 ++ ++- Added progress bar view into "What's on now?" menu. ++ ++2006-06-06: Version 1.6 ++ ++- Added French translation (Thanks to ECLiPSE). ++ ++2006-06-14: Version 1.7 ++ ++- Fixed RENR crash. ++ ++2006-07-14: Version 1.8 ++ ++- Fixed RENR/OSD bug. ++ ++2006-08-27: Version 1.9 ++ ++- Some modifications to the recording length and rename recordings ++ patches (Thanks to Firefly). ++- Added k1_k3_jumps_20s patch by Petri Hintukainen. ++ ++2006-08-29: Version 1.10 ++ ++- The cRecording:Title() method now defaults to original formatting. ++ ++2006-09-04: Version 1.11 ++ ++- Removed unused variable from cRecording::Title() method (Thanks to ++ C.Y.M.). ++- Some modifications to the rename recordings patch (Thanks to Firefly). ++ ++2006-09-13: Version 1.12 ++ ++- More modifications to the rename recordings patch (Thanks to Firefly). ++ ++2006-10-01: Version 1.13 ++ ++- Removed unnecessary syslog printing (Thanks to Firefly). ++ ++2007-08-14: Version 1.14 ++ ++- Updated for vdr-1.5.7. ++ ++2007-10-16: Version 1.15 ++ ++- Added recmenu play patch (Thanks to Ville Skyttä). ++- Updated French translation (Thanks to ECLiPSE). ++ ++2007-11-04: Version 1.16 ++ ++- Updated for vdr-1.5.11. ++ ++2007-12-08: Version 1.17 ++ ++- Added binary skip patch. ++- Removed k1_k3_jumps_20s patch. ++ ++2008-02-17: Version 1.18 ++ ++- Updated for vdr-1.5.15. ++ ++2008-03-02: Version 1.19 ++ ++- Modified binary skip to use kPrev and kNext keys and the skip is now ++ always shortened after a direction change (Thanks to Timo Eskola). ++- Readded k1_k3_jumps_20s patch. ++ ++2008-04-04: Version 1.20 ++ ++- Added bitrate information into rename menu. ++- Readded the path editing support of rename recordings patch (Thanks ++ to Firefly). ++ ++2008-05-08: Version 1.21 ++ ++- Fixed rename recordings (Thanks to Firefly). ++- Added a DVB subtitles hack for old recordings (Thanks to Anssi Hannula). ++ ++2009-01-08: Version 1.22 ++ ++- Updated for vdr-1.7.3. ++ ++2009-01-25: Version 1.23 ++ ++- Updated for vdr-1.7.4. ++ ++2009-02-27: Version 1.24 ++ ++- Fixed compilation under gcc-4.4. ++ ++2009-04-05: Version 1.25 ++ ++- Fixed the length detection of recordings (Thanks to Thomas Günther). ++ ++2009-04-17: Version 1.26 ++ ++- Fixed the length detection of audio recordings (Thanks to Thomas Günther). ++ ++2009-04-26: Version 1.27 ++ ++- Fixed the length detection of empty recordings (Thanks to Thomas Günther). ++ ++2009-07-12: Version 1.28 ++ ++- Fixed the TS/PES detection of recording marks. ++ ++2009-11-23: Version 1.29 ++ ++- Updated Estonian translation (Thanks to Arthur Konovalov). ++ ++2010-02-01: Version 1.30 ++ ++- Updated for vdr-1.7.12. +diff -Nru vdr-1.7.14-vanilla/menu.c vdr-1.7.14-liemikuutio/menu.c +--- vdr-1.7.14-vanilla/menu.c 2010-03-14 16:57:06.000000000 +0200 ++++ vdr-1.7.14-liemikuutio/menu.c 2010-03-14 16:59:45.000000000 +0200 +@@ -14,6 +14,7 @@ + #include <stdio.h> + #include <stdlib.h> + #include <string.h> ++#include <math.h> + #include "channels.h" + #include "config.h" + #include "cutter.h" +@@ -1293,7 +1294,8 @@ + const cChannel *channel; + bool withDate; + int timerMatch; +- cMenuScheduleItem(const cEvent *Event, cChannel *Channel = NULL, bool WithDate = false); ++ bool withBar; ++ cMenuScheduleItem(const cEvent *Event, cChannel *Channel = NULL, bool WithDate = false, bool WithBar = false); + static void SetSortMode(eScheduleSortMode SortMode) { sortMode = SortMode; } + static void IncSortMode(void) { sortMode = eScheduleSortMode((sortMode == ssmAllAll) ? ssmAllThis : sortMode + 1); } + static eScheduleSortMode SortMode(void) { return sortMode; } +@@ -1303,12 +1305,13 @@ + + cMenuScheduleItem::eScheduleSortMode cMenuScheduleItem::sortMode = ssmAllThis; + +-cMenuScheduleItem::cMenuScheduleItem(const cEvent *Event, cChannel *Channel, bool WithDate) ++cMenuScheduleItem::cMenuScheduleItem(const cEvent *Event, cChannel *Channel, bool WithDate, bool WithBar) + { + event = Event; + channel = Channel; + withDate = WithDate; + timerMatch = tmNone; ++ withBar = WithBar; + Update(true); + } + +@@ -1325,6 +1328,17 @@ + + static const char *TimerMatchChars = " tT"; + ++static const char * const ProgressBar[7] = ++{ ++ "[ ]", ++ "[| ]", ++ "[|| ]", ++ "[||| ]", ++ "[|||| ]", ++ "[||||| ]", ++ "[||||||]" ++}; ++ + bool cMenuScheduleItem::Update(bool Force) + { + bool result = false; +@@ -1340,7 +1354,14 @@ + if (channel && withDate) + buffer = cString::sprintf("%d\t%.*s\t%.*s\t%s\t%c%c%c\t%s", channel->Number(), Utf8SymChars(csn, 6), csn, Utf8SymChars(eds, 6), *eds, *event->GetTimeString(), t, v, r, event->Title()); + else if (channel) +- buffer = cString::sprintf("%d\t%.*s\t%s\t%c%c%c\t%s", channel->Number(), Utf8SymChars(csn, 6), csn, *event->GetTimeString(), t, v, r, event->Title()); ++ if (Setup.ShowProgressBar && withBar) { ++ int progress = (int)roundf( (float)(time(NULL) - event->StartTime()) / (float)(event->Duration()) * 6.0 ); ++ if (progress < 0) progress = 0; ++ else if (progress > 6) progress = 6; ++ buffer = cString::sprintf("%d\t%.*s\t%s\t%s\t%c%c%c\t%s", channel->Number(), Utf8SymChars(csn, 6), csn, *event->GetTimeString(), ProgressBar[progress], t, v, r, event->Title()); ++ } ++ else ++ buffer = cString::sprintf("%d\t%.*s\t%s\t%c%c%c\t%s", channel->Number(), Utf8SymChars(csn, 6), csn, *event->GetTimeString(), t, v, r, event->Title()); + else + buffer = cString::sprintf("%.*s\t%s\t%c%c%c\t%s", Utf8SymChars(eds, 6), *eds, *event->GetTimeString(), t, v, r, event->Title()); + SetText(buffer); +@@ -1374,7 +1395,7 @@ + const cEvent *cMenuWhatsOn::scheduleEvent = NULL; + + cMenuWhatsOn::cMenuWhatsOn(const cSchedules *Schedules, bool Now, int CurrentChannelNr) +-:cOsdMenu(Now ? tr("What's on now?") : tr("What's on next?"), CHNUMWIDTH, 7, 6, 4) ++:cOsdMenu(Now ? tr("What's on now?") : tr("What's on next?"), CHNUMWIDTH, 7, 6, 4, 4) + { + now = Now; + helpKeys = -1; +@@ -1386,7 +1407,7 @@ + if (Schedule) { + const cEvent *Event = Now ? Schedule->GetPresentEvent() : Schedule->GetFollowingEvent(); + if (Event) +- Add(new cMenuScheduleItem(Event, Channel), Channel->Number() == CurrentChannelNr); ++ Add(new cMenuScheduleItem(Event, Channel, false, Now), Channel->Number() == CurrentChannelNr); + } + } + } +@@ -2169,7 +2190,7 @@ + fileName = strdup(Recording->FileName()); + name = NULL; + totalEntries = newEntries = 0; +- SetText(Recording->Title('\t', true, Level)); ++ SetText(Recording->Title('\t', true, Level, false)); + if (*Text() == '\t') + name = strdup(Text() + 2); // 'Text() + 2' to skip the two '\t' + } +@@ -2185,13 +2206,175 @@ + totalEntries++; + if (New) + newEntries++; +- SetText(cString::sprintf("%d\t%d\t%s", totalEntries, newEntries, name)); ++ switch (Setup.ShowRecTime + Setup.ShowRecDate + Setup.ShowRecLength) { ++ case 0: ++ SetText(cString::sprintf("%s", name)); ++ break; ++ case 1: ++ SetText(cString::sprintf("%d\t%s", totalEntries, name)); ++ break; ++ case 2: ++ default: ++ SetText(cString::sprintf("%d\t%d\t%s", totalEntries, newEntries, name)); ++ break; ++ case 3: ++ SetText(cString::sprintf("%d\t%d\t\t%s", totalEntries, newEntries, name)); ++ break; ++ } ++} ++ ++// --- cMenuRenameRecording -------------------------------------------------- ++ ++class cMenuRenameRecording : public cOsdMenu { ++private: ++ char name[MaxFileName]; ++ cMenuEditStrItem *file; ++ cOsdItem *marksItem, *resumeItem; ++ bool isResume, isMarks; ++ cRecording *recording; ++ void SetHelpKeys(void); ++ eOSState SetFolder(void); ++public: ++ cMenuRenameRecording(cRecording *Recording); ++ virtual eOSState ProcessKey(eKeys Key); ++}; ++ ++cMenuRenameRecording::cMenuRenameRecording(cRecording *Recording) ++:cOsdMenu(tr("Rename recording"), 12) ++{ ++ cMarks marks; ++ ++ file = NULL; ++ recording = Recording; ++ ++ if (recording) { ++ Utf8Strn0Cpy(name, recording->Name(), sizeof(name)); ++ Add(file = new cMenuEditStrItem(tr("File"), name, sizeof(name))); ++ ++ Add(new cOsdItem("", osUnknown, false)); ++ ++ Add(new cOsdItem(cString::sprintf("%s:\t%s", tr("Date"), *DayDateTime(recording->start)), osUnknown, false)); ++ ++ cChannel *channel = Channels.GetByChannelID(((cRecordingInfo *)recording->Info())->ChannelID()); ++ if (channel) ++ Add(new cOsdItem(cString::sprintf("%s:\t%s", tr("Channel"), *ChannelString(channel, 0)), osUnknown, false)); ++ ++ int recLen = cIndexFile::Length(recording->FileName(), recording->IsPesRecording()); ++ if (recLen >= 0) ++ Add(new cOsdItem(cString::sprintf("%s:\t%s", tr("Length"), *IndexToHMSF(recLen, false, recording->FramesPerSecond())), osUnknown, false)); ++ else ++ recLen = 0; ++ ++ int dirSize = DirSizeMB(recording->FileName()); ++ double seconds = recLen / recording->FramesPerSecond(); ++ cString bitRate = seconds ? cString::sprintf(" (%.2f MBit/s)", 8.0 * dirSize / seconds) : cString(""); ++ Add(new cOsdItem(cString::sprintf("%s:\t%s", tr("Format"), recording->IsPesRecording() ? tr("PES") : tr("TS")), osUnknown, false)); ++ Add(new cOsdItem((dirSize > 9999) ? cString::sprintf("%s:\t%.2f GB%s", tr("Size"), dirSize / 1024.0, *bitRate) : cString::sprintf("%s:\t%d MB%s", tr("Size"), dirSize, *bitRate), osUnknown, false)); ++ ++ Add(new cOsdItem("", osUnknown, false)); ++ ++ isMarks = marks.Load(recording->FileName(), recording->FramesPerSecond(), recording->IsPesRecording()) && marks.Count(); ++ marksItem = new cOsdItem(tr("Delete marks information?"), osUser1, isMarks); ++ Add(marksItem); ++ ++ cResumeFile ResumeFile(recording->FileName(), recording->IsPesRecording()); ++ isResume = (ResumeFile.Read() != -1); ++ resumeItem = new cOsdItem(tr("Delete resume information?"), osUser2, isResume); ++ Add(resumeItem); ++ } ++ ++ SetHelpKeys(); ++} ++ ++void cMenuRenameRecording::SetHelpKeys(void) ++{ ++ SetHelp(tr("Button$Folder")); ++} ++ ++eOSState cMenuRenameRecording::SetFolder(void) ++{ ++ cMenuFolder *mf = (cMenuFolder *)SubMenu(); ++ if (mf) { ++ cString Folder = mf->GetFolder(); ++ char *p = strrchr(name, FOLDERDELIMCHAR); ++ if (p) ++ p++; ++ else ++ p = name; ++ if (!isempty(*Folder)) ++ strn0cpy(name, cString::sprintf("%s%c%s", *Folder, FOLDERDELIMCHAR, p), sizeof(name)); ++ else if (p != name) ++ memmove(name, p, strlen(p) + 1); ++ SetCurrent(file); ++ Display(); ++ } ++ return CloseSubMenu(); ++} ++ ++eOSState cMenuRenameRecording::ProcessKey(eKeys Key) ++{ ++ eOSState state = cOsdMenu::ProcessKey(Key); ++ ++ if (state == osUnknown) { ++ switch (Key) { ++ case kOk: ++ if (recording->Rename(name)) { ++ Recordings.ChangeState(); ++ Recordings.TouchUpdate(); ++ return osRecordings; ++ } ++ else ++ Skins.Message(mtError, tr("Error while accessing recording!")); ++ break; ++ case kRed: ++ return AddSubMenu(new cMenuFolder(tr("Select folder"), &Folders, name)); ++ break; ++ default: ++ break; ++ } ++ if (Key != kNone) ++ SetHelpKeys(); ++ return osContinue; ++ } ++ else if (state == osEnd && HasSubMenu()) ++ state = SetFolder(); ++ else if (state == osUser1) { ++ if (isMarks && Interface->Confirm(tr("Delete marks information?"))) { ++ cMarks marks; ++ marks.Load(recording->FileName(), recording->FramesPerSecond(), recording->IsPesRecording()); ++ cMark *mark = marks.First(); ++ while (mark) { ++ cMark *nextmark = marks.Next(mark); ++ marks.Del(mark); ++ mark = nextmark; ++ } ++ marks.Save(); ++ isMarks = false; ++ marksItem->SetSelectable(isMarks); ++ SetCurrent(First()); ++ Display(); ++ } ++ return osContinue; ++ } ++ else if (state == osUser2) { ++ if (isResume && Interface->Confirm(tr("Delete resume information?"))) { ++ cResumeFile ResumeFile(recording->FileName(), recording->IsPesRecording()); ++ ResumeFile.Delete(); ++ isResume = false; ++ resumeItem->SetSelectable(isResume); ++ SetCurrent(First()); ++ Display(); ++ } ++ return osContinue; ++ } ++ ++ return state; + } + + // --- cMenuRecordings ------------------------------------------------------- + + cMenuRecordings::cMenuRecordings(const char *Base, int Level, bool OpenSubMenus) +-:cOsdMenu(Base ? Base : tr("Recordings"), 9, 7) ++:cOsdMenu(Base ? Base : tr("Recordings"), 9, 7, 7) + { + base = Base ? strdup(Base) : NULL; + level = Setup.RecordingDirs ? Level : -1; +@@ -2426,6 +2609,19 @@ + return osContinue; + } + ++eOSState cMenuRecordings::Rename(void) ++{ ++ if (HasSubMenu() || Count() == 0) ++ return osContinue; ++ cMenuRecordingItem *ri = (cMenuRecordingItem *)Get(Current()); ++ if (ri && !ri->IsDirectory()) { ++ cRecording *recording = GetRecording(ri); ++ if (recording) ++ return AddSubMenu(new cMenuRenameRecording(recording)); ++ } ++ return osContinue; ++} ++ + eOSState cMenuRecordings::ProcessKey(eKeys Key) + { + bool HadSubMenu = HasSubMenu(); +@@ -2440,7 +2636,12 @@ + case kYellow: return Delete(); + case kInfo: + case kBlue: return Info(); +- case k1...k9: return Commands(Key); ++ case k0: DirOrderState = !DirOrderState; ++ Set(true); ++ return osContinue; ++ case k8: return Rename(); ++ case k9: ++ case k1...k7: return Commands(Key); + case kNone: if (Recordings.StateChanged(recordingsState)) + Set(true); + break; +@@ -2568,6 +2769,7 @@ + Add(new cMenuEditBoolItem(tr("Setup.OSD$Menu key closes"), &data.MenuKeyCloses)); + Add(new cMenuEditBoolItem(tr("Setup.OSD$Recording directories"), &data.RecordingDirs)); + Add(new cMenuEditBoolItem(tr("Setup.OSD$Folders in timer menu"), &data.FoldersInTimerMenu)); ++ Add(new cMenuEditBoolItem(tr("Setup.OSD$Main menu command position"), &data.MenuCmdPosition, tr("bottom"), tr("top"))); + SetCurrent(Get(current)); + Display(); + } +@@ -2666,6 +2868,7 @@ + Add(new cMenuEditIntItem( tr("Setup.EPG$EPG scan timeout (h)"), &data.EPGScanTimeout)); + Add(new cMenuEditIntItem( tr("Setup.EPG$EPG bugfix level"), &data.EPGBugfixLevel, 0, MAXEPGBUGFIXLEVEL)); + Add(new cMenuEditIntItem( tr("Setup.EPG$EPG linger time (min)"), &data.EPGLinger, 0)); ++ Add(new cMenuEditBoolItem(tr("Setup.EPG$Show progress bar"), &data.ShowProgressBar)); + Add(new cMenuEditBoolItem(tr("Setup.EPG$Set system time"), &data.SetSystemTime)); + if (data.SetSystemTime) + Add(new cMenuEditTranItem(tr("Setup.EPG$Use time from transponder"), &data.TimeTransponder, &data.TimeSource)); +@@ -3055,6 +3258,9 @@ + Add(new cMenuEditIntItem( tr("Setup.Recording$Max. video file size (MB)"), &data.MaxVideoFileSize, MINVIDEOFILESIZE, MAXVIDEOFILESIZETS)); + Add(new cMenuEditBoolItem(tr("Setup.Recording$Split edited files"), &data.SplitEditedFiles)); + Add(new cMenuEditStraItem(tr("Setup.Recording$Delete timeshift recording"),&data.DelTimeshiftRec, 3, delTimeshiftRecTexts)); ++ Add(new cMenuEditBoolItem(tr("Setup.Recording$Show date"), &data.ShowRecDate)); ++ Add(new cMenuEditBoolItem(tr("Setup.Recording$Show time"), &data.ShowRecTime)); ++ Add(new cMenuEditBoolItem(tr("Setup.Recording$Show length"), &data.ShowRecLength)); + } + + // --- cMenuSetupReplay ------------------------------------------------------ +@@ -3343,6 +3549,7 @@ + // Replay control: + if (replaying && !stopReplayItem) + // TRANSLATORS: note the leading blank! ++ if (Setup.MenuCmdPosition) Ins(stopReplayItem = new cOsdItem(tr(" Stop replaying"), osStopReplay)); else + Add(stopReplayItem = new cOsdItem(tr(" Stop replaying"), osStopReplay)); + else if (stopReplayItem && !replaying) { + Del(stopReplayItem->Index()); +@@ -3357,6 +3564,7 @@ + bool CutterActive = cCutter::Active(); + if (CutterActive && !cancelEditingItem) { + // TRANSLATORS: note the leading blank! ++ if (Setup.MenuCmdPosition) Ins(cancelEditingItem = new cOsdItem(tr(" Cancel editing"), osCancelEdit)); else + Add(cancelEditingItem = new cOsdItem(tr(" Cancel editing"), osCancelEdit)); + result = true; + } +@@ -3377,6 +3585,7 @@ + while ((s = cRecordControls::GetInstantId(s)) != NULL) { + cOsdItem *item = new cOsdItem(osStopRecord); + item->SetText(cString::sprintf("%s%s", tr(STOP_RECORDING), s)); ++ if (Setup.MenuCmdPosition) Ins(item); else + Add(item); + if (!stopRecordingItem) + stopRecordingItem = item; +@@ -4365,6 +4574,10 @@ + + // --- cReplayControl -------------------------------------------------------- + ++#define REPLAYCONTROLSKIPLIMIT 9 // s ++#define REPLAYCONTROLSKIPSECONDS 90 // s ++#define REPLAYCONTROLSKIPTIMEOUT 5000 // ms ++ + cReplayControl *cReplayControl::currentReplayControl = NULL; + char *cReplayControl::fileName = NULL; + char *cReplayControl::title = NULL; +@@ -4378,6 +4591,9 @@ + lastCurrent = lastTotal = -1; + lastPlay = lastForward = false; + lastSpeed = -2; // an invalid value ++ lastSkipKey = kNone; ++ lastSkipSeconds = REPLAYCONTROLSKIPSECONDS; ++ lastSkipTimeout.Set(0); + timeoutShow = 0; + timeSearchActive = false; + cRecording Recording(fileName); +@@ -4773,6 +4989,32 @@ + case kGreen: SkipSeconds(-60); break; + case kYellow|k_Repeat: + case kYellow: SkipSeconds( 60); break; ++ case k1|k_Repeat: ++ case k1: SkipSeconds(-20); break; ++ case k3|k_Repeat: ++ case k3: SkipSeconds( 20); break; ++ case kPrev|k_Repeat: ++ case kPrev: if (lastSkipTimeout.TimedOut()) { ++ lastSkipSeconds = REPLAYCONTROLSKIPSECONDS; ++ lastSkipKey = kPrev; ++ } ++ else if (RAWKEY(lastSkipKey) != kPrev && lastSkipSeconds > (2 * REPLAYCONTROLSKIPLIMIT)) { ++ lastSkipSeconds /= 2; ++ lastSkipKey = kNone; ++ } ++ lastSkipTimeout.Set(REPLAYCONTROLSKIPTIMEOUT); ++ SkipSeconds(-lastSkipSeconds); break; ++ case kNext|k_Repeat: ++ case kNext: if (lastSkipTimeout.TimedOut()) { ++ lastSkipSeconds = REPLAYCONTROLSKIPSECONDS; ++ lastSkipKey = kNext; ++ } ++ else if (RAWKEY(lastSkipKey) != kNext && lastSkipSeconds > (2 * REPLAYCONTROLSKIPLIMIT)) { ++ lastSkipSeconds /= 2; ++ lastSkipKey = kNone; ++ } ++ lastSkipTimeout.Set(REPLAYCONTROLSKIPTIMEOUT); ++ SkipSeconds(lastSkipSeconds); break; + case kStop: + case kBlue: Hide(); + Stop(); +@@ -4782,12 +5024,8 @@ + switch (Key) { + // Editing: + case kMarkToggle: MarkToggle(); break; +- case kPrev|k_Repeat: +- case kPrev: + case kMarkJumpBack|k_Repeat: + case kMarkJumpBack: MarkJump(false); break; +- case kNext|k_Repeat: +- case kNext: + case kMarkJumpForward|k_Repeat: + case kMarkJumpForward: MarkJump(true); break; + case kMarkMoveBack|k_Repeat: +diff -Nru vdr-1.7.14-vanilla/menu.h vdr-1.7.14-liemikuutio/menu.h +--- vdr-1.7.14-vanilla/menu.h 2010-03-14 16:57:06.000000000 +0200 ++++ vdr-1.7.14-liemikuutio/menu.h 2010-03-14 16:58:41.000000000 +0200 +@@ -204,6 +204,7 @@ + eOSState Delete(void); + eOSState Info(void); + eOSState Commands(eKeys Key = kNone); ++ eOSState Rename(void); + protected: + cRecording *GetRecording(cMenuRecordingItem *Item); + public: +@@ -258,6 +259,9 @@ + int lastCurrent, lastTotal; + bool lastPlay, lastForward; + int lastSpeed; ++ int lastSkipSeconds; ++ eKeys lastSkipKey; ++ cTimeMs lastSkipTimeout; + time_t timeoutShow; + bool timeSearchActive, timeSearchHide; + int timeSearchTime, timeSearchPos; +diff -Nru vdr-1.7.14-vanilla/osdbase.c vdr-1.7.14-liemikuutio/osdbase.c +--- vdr-1.7.14-vanilla/osdbase.c 2010-03-14 16:57:06.000000000 +0200 ++++ vdr-1.7.14-liemikuutio/osdbase.c 2010-03-14 16:58:41.000000000 +0200 +@@ -77,6 +77,7 @@ + { + isMenu = true; + digit = 0; ++ key_nr = -1; + hasHotkeys = false; + title = NULL; + SetTitle(Title); +@@ -119,7 +120,7 @@ + digit = -1; // prevents automatic hotkeys - input already has them + if (digit >= 0) { + digit++; +- buffer = cString::sprintf(" %c %s", (digit < 10) ? '0' + digit : ' ' , s); ++ buffer = cString::sprintf(" %2d%s %s", digit, (digit > 9) ? "" : " ", s); + s = buffer; + } + } +@@ -449,20 +450,62 @@ + } + } + ++#define MENUKEY_TIMEOUT 1500 ++ + eOSState cOsdMenu::HotKey(eKeys Key) + { +- for (cOsdItem *item = First(); item; item = Next(item)) { ++ bool match = false; ++ bool highlight = false; ++ int item_nr; ++ int i; ++ ++ if (Key == kNone) { ++ if (lastActivity.TimedOut()) ++ Key = kOk; ++ else ++ return osContinue; ++ } ++ else { ++ lastActivity.Set(MENUKEY_TIMEOUT); ++ } ++ for (cOsdItem *item = Last(); item; item = Prev(item)) { + const char *s = item->Text(); +- if (s && (s = skipspace(s)) != NULL) { +- if (*s == Key - k1 + '1') { ++ i = 0; ++ item_nr = 0; ++ if (s && (s = skipspace(s)) != '\0' && '0' <= s[i] && s[i] <= '9') { ++ do { ++ item_nr = item_nr * 10 + (s[i] - '0'); ++ } ++ while ( !((s[++i] == '\t')||(s[i] == ' ')) && (s[i] != '\0') && ('0' <= s[i]) && (s[i] <= '9')); ++ if ((Key == kOk) && (item_nr == key_nr)) { + current = item->Index(); + RefreshCurrent(); + Display(); + cRemote::Put(kOk, true); ++ key_nr = -1; + break; + } ++ else if (Key != kOk) { ++ if (!highlight && (item_nr == (Key - k0))) { ++ highlight = true; ++ current = item->Index(); ++ } ++ if (!match && (key_nr == -1) && ((item_nr / 10) == (Key - k0))) { ++ match = true; ++ key_nr = (Key - k0); ++ } ++ else if (((key_nr == -1) && (item_nr == (Key - k0))) || (!match && (key_nr >= 0) && (item_nr == (10 * key_nr + Key - k0)))) { ++ current = item->Index(); ++ cRemote::Put(kOk, true); ++ key_nr = -1; ++ break; ++ } ++ } + } + } ++ if ((!match) && (Key != kNone)) { ++ key_nr = -1; ++ } + return osContinue; + } + +@@ -501,8 +544,8 @@ + } + } + switch (Key) { +- case k0: return osUnknown; +- case k1...k9: return hasHotkeys ? HotKey(Key) : osUnknown; ++ case kNone: ++ case k0...k9: return hasHotkeys ? HotKey(Key) : osUnknown; + case kUp|k_Repeat: + case kUp: CursorUp(); break; + case kDown|k_Repeat: +diff -Nru vdr-1.7.14-vanilla/osdbase.h vdr-1.7.14-liemikuutio/osdbase.h +--- vdr-1.7.14-vanilla/osdbase.h 2010-03-14 16:57:06.000000000 +0200 ++++ vdr-1.7.14-liemikuutio/osdbase.h 2010-03-14 16:58:41.000000000 +0200 +@@ -95,6 +95,8 @@ + char *status; + int digit; + bool hasHotkeys; ++ int key_nr; ++ cTimeMs lastActivity; + protected: + void SetDisplayMenu(void); + cSkinDisplayMenu *DisplayMenu(void) { return displayMenu; } +diff -Nru vdr-1.7.14-vanilla/po/de_DE.po vdr-1.7.14-liemikuutio/po/de_DE.po +--- vdr-1.7.14-vanilla/po/de_DE.po 2010-03-14 16:57:06.000000000 +0200 ++++ vdr-1.7.14-liemikuutio/po/de_DE.po 2010-03-14 17:05:28.000000000 +0200 +@@ -1315,3 +1315,45 @@ + #, c-format + msgid "VDR will shut down in %s minutes" + msgstr "VDR wird in %s Minuten ausschalten" ++ ++msgid "Rename recording" ++msgstr "Aufzeichnung umbenennen" ++ ++msgid "Date" ++msgstr "Datum" ++ ++msgid "Length" ++msgstr "Lnge" ++ ++msgid "Size" ++msgstr "Gre" ++ ++msgid "Format" ++msgstr "Format" ++ ++msgid "PES" ++msgstr "PES" ++ ++msgid "TS" ++msgstr "TS" ++ ++msgid "Delete marks information?" ++msgstr "Marks lschen?" ++ ++msgid "Delete resume information?" ++msgstr "Resume lschen?" ++ ++msgid "Setup.OSD$Main menu command position" ++msgstr "Befehle Position im Hauptmen" ++ ++msgid "Setup.EPG$Show progress bar" ++msgstr "Zeitbalken anzeigen" ++ ++msgid "Setup.Recording$Show date" ++msgstr "Aufnahmedatum anzeigen" ++ ++msgid "Setup.Recording$Show time" ++msgstr "AufnahmeZeit anzeigen" ++ ++msgid "Setup.Recording$Show length" ++msgstr "Lnge der Aufnahme anzeigen" +diff -Nru vdr-1.7.14-vanilla/po/et_EE.po vdr-1.7.14-liemikuutio/po/et_EE.po +--- vdr-1.7.14-vanilla/po/et_EE.po 2010-03-14 16:57:06.000000000 +0200 ++++ vdr-1.7.14-liemikuutio/po/et_EE.po 2010-03-14 17:05:28.000000000 +0200 +@@ -1315,3 +1315,45 @@ + #, c-format + msgid "VDR will shut down in %s minutes" + msgstr "VDR llitub vlja %s minuti prast" ++ ++msgid "Rename recording" ++msgstr "mbernimetamine" ++ ++msgid "Date" ++msgstr "Kuupev" ++ ++msgid "Length" ++msgstr "Kestus" ++ ++msgid "Size" ++msgstr "Suurus" ++ ++msgid "Format" ++msgstr "Formaat" ++ ++msgid "PES" ++msgstr "PES" ++ ++msgid "TS" ++msgstr "TS" ++ ++msgid "Delete marks information?" ++msgstr "Kustutada mrkide info?" ++ ++msgid "Delete resume information?" ++msgstr "Kustutada jtkamise info?" ++ ++msgid "Setup.OSD$Main menu command position" ++msgstr "Ksu asukoht peamens" ++ ++msgid "Setup.EPG$Show progress bar" ++msgstr "Edenemisriba" ++ ++msgid "Setup.Recording$Show date" ++msgstr "Salvestuse kuupev" ++ ++msgid "Setup.Recording$Show time" ++msgstr "Salvestuse kellaaeg" ++ ++msgid "Setup.Recording$Show length" ++msgstr "Salvestuse kestus" +diff -Nru vdr-1.7.14-vanilla/po/fi_FI.po vdr-1.7.14-liemikuutio/po/fi_FI.po +--- vdr-1.7.14-vanilla/po/fi_FI.po 2010-03-14 16:57:06.000000000 +0200 ++++ vdr-1.7.14-liemikuutio/po/fi_FI.po 2010-03-14 17:05:28.000000000 +0200 +@@ -1318,3 +1318,46 @@ + #, c-format + msgid "VDR will shut down in %s minutes" + msgstr "VDR sammuu %s minuutin kuluttua" ++ ++msgid "Rename recording" ++msgstr "Nime tallenne" ++ ++msgid "Date" ++msgstr "Pivys" ++ ++msgid "Length" ++msgstr "Pituus" ++ ++msgid "Size" ++msgstr "Koko" ++ ++msgid "Format" ++msgstr "Tiedostomuoto" ++ ++msgid "PES" ++msgstr "PES" ++ ++msgid "TS" ++msgstr "TS" ++ ++msgid "Delete marks information?" ++msgstr "Poista tallenteen merkinnt?" ++ ++msgid "Delete resume information?" ++msgstr "Poista tallenteen paluutiedot?" ++ ++msgid "Setup.OSD$Main menu command position" ++msgstr "Komentojen sijainti pvalikossa" ++ ++msgid "Setup.EPG$Show progress bar" ++msgstr "Nyt aikajana" ++ ++msgid "Setup.Recording$Show date" ++msgstr "Nyt tallenteen pivys" ++ ++msgid "Setup.Recording$Show time" ++msgstr "Nyt tallenteen ajankohta" ++ ++msgid "Setup.Recording$Show length" ++msgstr "Nyt tallenteen kesto" ++ +diff -Nru vdr-1.7.14-vanilla/po/fr_FR.po vdr-1.7.14-liemikuutio/po/fr_FR.po +--- vdr-1.7.14-vanilla/po/fr_FR.po 2010-03-14 16:57:06.000000000 +0200 ++++ vdr-1.7.14-liemikuutio/po/fr_FR.po 2010-03-14 17:05:28.000000000 +0200 +@@ -1321,3 +1321,45 @@ + #, c-format + msgid "VDR will shut down in %s minutes" + msgstr "VDR s'arrtera dans %s minutes" ++ ++msgid "Rename recording" ++msgstr "Renommer l'enregistrement" ++ ++msgid "Date" ++msgstr "Date" ++ ++msgid "Length" ++msgstr "Longueur" ++ ++msgid "Size" ++msgstr "Taille" ++ ++msgid "Format" ++msgstr "Format" ++ ++msgid "PES" ++msgstr "PES" ++ ++msgid "TS" ++msgstr "TS" ++ ++msgid "Delete marks information?" ++msgstr "Effacer les informations de marquage" ++ ++msgid "Delete resume information?" ++msgstr "Effacer les informations de reprise" ++ ++msgid "Setup.OSD$Main menu command position" ++msgstr "Position des commandes dans le menu" ++ ++msgid "Setup.EPG$Show progress bar" ++msgstr "Montrer la barre de progression" ++ ++msgid "Setup.Recording$Show date" ++msgstr "Montrer la date d'enregistrement" ++ ++msgid "Setup.Recording$Show time" ++msgstr "Montrer l'heure d'enregistrement" ++ ++msgid "Setup.Recording$Show length" ++msgstr "Montrer la longueur de l'enregistrement" +diff -Nru vdr-1.7.14-vanilla/po/ru_RU.po vdr-1.7.14-liemikuutio/po/ru_RU.po +--- vdr-1.7.14-vanilla/po/ru_RU.po 2010-03-14 16:57:06.000000000 +0200 ++++ vdr-1.7.14-liemikuutio/po/ru_RU.po 2010-03-14 17:05:28.000000000 +0200 +@@ -1316,3 +1316,45 @@ + #, c-format + msgid "VDR will shut down in %s minutes" + msgstr "VDR %s " ++ ++msgid "Rename recording" ++msgstr " " ++ ++msgid "Date" ++msgstr "" ++ ++msgid "Length" ++msgstr "" ++ ++msgid "Size" ++msgstr "" ++ ++msgid "Format" ++msgstr "" ++ ++msgid "PES" ++msgstr "" ++ ++msgid "TS" ++msgstr "" ++ ++msgid "Delete marks information?" ++msgstr "" ++ ++msgid "Delete resume information?" ++msgstr "" ++ ++msgid "Setup.OSD$Main menu command position" ++msgstr " " ++ ++msgid "Setup.EPG$Show progress bar" ++msgstr "" ++ ++msgid "Setup.Recording$Show date" ++msgstr " " ++ ++msgid "Setup.Recording$Show time" ++msgstr " " ++ ++msgid "Setup.Recording$Show length" ++msgstr " " +diff -Nru vdr-1.7.14-vanilla/recording.c vdr-1.7.14-liemikuutio/recording.c +--- vdr-1.7.14-vanilla/recording.c 2010-03-14 16:57:06.000000000 +0200 ++++ vdr-1.7.14-liemikuutio/recording.c 2010-03-14 16:58:41.000000000 +0200 +@@ -63,6 +63,7 @@ + #define MAX_LINK_LEVEL 6 + + bool VfatFileSystem = false; ++bool DirOrderState = false; + int InstanceId = 0; + + cRecordings DeletedRecordings(true); +@@ -823,6 +824,8 @@ + int cRecording::Compare(const cListObject &ListObject) const + { + cRecording *r = (cRecording *)&ListObject; ++ if (DirOrderState) ++ return strcasecmp(FileName(), r->FileName()); + return strcasecmp(SortName(), r->SortName()); + } + +@@ -841,7 +844,7 @@ + return fileName; + } + +-const char *cRecording::Title(char Delimiter, bool NewIndicator, int Level) const ++const char *cRecording::Title(char Delimiter, bool NewIndicator, int Level, bool Original) const + { + char New = NewIndicator && IsNew() ? '*' : ' '; + free(titleBuffer); +@@ -854,6 +857,7 @@ + s++; + else + s = name; ++ if (Original) { + titleBuffer = strdup(cString::sprintf("%02d.%02d.%02d%c%02d:%02d%c%c%s", + t->tm_mday, + t->tm_mon + 1, +@@ -864,6 +868,27 @@ + New, + Delimiter, + s)); ++ } ++ else { ++ cString RecLength("---"); ++ if (Setup.ShowRecLength && FileName()) { ++ int length = cIndexFile::Length(FileName(), IsPesRecording()); ++ if (length >= 0) ++ RecLength = cString::sprintf("%d'", length / SecondsToFrames(60, framesPerSecond)); ++ } ++ cString RecDate = cString::sprintf("%02d.%02d.%02d", t->tm_mday, t->tm_mon + 1, t->tm_year % 100); ++ cString RecTime = cString::sprintf("%02d:%02d", t->tm_hour, t->tm_min); ++ cString RecDelimiter = cString::sprintf("%c", Delimiter); ++ titleBuffer = strdup(cString::sprintf("%s%s%s%c%s%s%s%s", ++ (Setup.ShowRecDate ? *RecDate : ""), ++ (Setup.ShowRecDate && Setup.ShowRecTime ? *RecDelimiter : ""), ++ (Setup.ShowRecTime ? *RecTime : ""), ++ New, ++ (Setup.ShowRecTime || Setup.ShowRecDate ? *RecDelimiter : ""), ++ (Setup.ShowRecLength ? *RecLength : ""), ++ (Setup.ShowRecLength ? *RecDelimiter : ""), ++ s)); ++ } + // let's not display a trailing FOLDERDELIMCHAR: + if (!NewIndicator) + stripspace(titleBuffer); +@@ -1000,6 +1025,42 @@ + resume = RESUME_NOT_INITIALIZED; + } + ++bool cRecording::Rename(const char *newName) ++{ ++ bool result = false; ++ struct tm tm_r; ++ struct tm *t = localtime_r(&start, &tm_r); ++ char *localNewName = ExchangeChars(strdup(newName), true); ++ const char *fmt = isPesRecording ? NAMEFORMATPES : NAMEFORMATTS; ++ int ch = isPesRecording ? priority : channel; ++ int ri = isPesRecording ? lifetime : instanceId; ++ char *newFileName = strdup(cString::sprintf(fmt, VideoDirectory, localNewName, t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, ch, ri)); ++ free(localNewName); ++ if (strcmp(FileName(), newFileName)) { ++ if (access(newFileName, F_OK) == 0) { ++ isyslog("recording %s already exists", newFileName); ++ } ++ else { ++ isyslog("renaming recording %s to %s", FileName(), newFileName); ++ result = MakeDirs(newFileName, true); ++ if (result) ++ result = RenameVideoFile(FileName(), newFileName); ++ if (result) { ++ free(fileName); ++ fileName = strdup(newFileName); ++ free(name); ++ name = strdup(newName); ++ free(sortBuffer); ++ sortBuffer = NULL; ++ free(titleBuffer); ++ titleBuffer = NULL; ++ } ++ } ++ } ++ free(newFileName); ++ return result; ++} ++ + // --- cRecordings ----------------------------------------------------------- + + cRecordings Recordings; +@@ -1777,6 +1838,15 @@ + return false; + } + ++int cIndexFile::Length(const char *FileName, bool IsPesRecording) ++{ ++ struct stat buf; ++ cString fullname = cString::sprintf("%s%s", FileName, IsPesRecording ? INDEXFILESUFFIX ".vdr" : INDEXFILESUFFIX); ++ if (FileName && *fullname && access(fullname, R_OK) == 0 && stat(fullname, &buf) == 0) ++ return buf.st_size ? (buf.st_size - 1) / sizeof(tIndexTs) + 1 : 0; ++ return -1; ++} ++ + // --- cFileName ------------------------------------------------------------- + + #define MAXFILESPERRECORDINGPES 255 +diff -Nru vdr-1.7.14-vanilla/recording.h vdr-1.7.14-liemikuutio/recording.h +--- vdr-1.7.14-vanilla/recording.h 2010-03-14 16:57:06.000000000 +0200 ++++ vdr-1.7.14-liemikuutio/recording.h 2010-03-14 16:58:41.000000000 +0200 +@@ -23,6 +23,7 @@ + #define TIMERMACRO_EPISODE "EPISODE" + + extern bool VfatFileSystem; ++extern bool DirOrderState; + extern int InstanceId; + + void RemoveDeletedRecordings(void); +@@ -108,7 +109,7 @@ + virtual int Compare(const cListObject &ListObject) const; + const char *Name(void) const { return name; } + const char *FileName(void) const; +- const char *Title(char Delimiter = ' ', bool NewIndicator = false, int Level = -1) const; ++ const char *Title(char Delimiter = ' ', bool NewIndicator = false, int Level = -1, bool Original = true) const; + const cRecordingInfo *Info(void) const { return info; } + const char *PrefixFileName(char Prefix); + int HierarchyLevels(void) const; +@@ -128,6 +129,9 @@ + // Changes the file name so that it will be visible in the "Recordings" menu again and + // not processed by cRemoveDeletedRecordingsThread. + // Returns false in case of error ++ bool Rename(const char *newName); ++ // Changes the file name ++ // Returns false in case of error + }; + + class cRecordings : public cList<cRecording>, public cThread { +@@ -252,6 +256,8 @@ + bool StoreResume(int Index) { return resumeFile.Save(Index); } + bool IsStillRecording(void); + void Delete(void); ++ static int Length(const char *FileName, bool IsPesRecording = false); ++ ///< Calculates the recording length without reading the index. + }; + + class cFileName { +diff -Nru vdr-1.7.14-vanilla/svdrp.c vdr-1.7.14-liemikuutio/svdrp.c +--- vdr-1.7.14-vanilla/svdrp.c 2010-03-14 16:57:06.000000000 +0200 ++++ vdr-1.7.14-liemikuutio/svdrp.c 2010-03-14 16:58:41.000000000 +0200 +@@ -304,6 +304,8 @@ + "REMO [ on | off ]\n" + " Turns the remote control on or off. Without a parameter, the current\n" + " status of the remote control is reported.", ++ "RENR <number> <new name>\n" ++ " Rename recording. Number must be the Number as returned by LSTR command.", + "SCAN\n" + " Forces an EPG scan. If this is a single DVB device system, the scan\n" + " will be done on the primary device unless it is currently recording.", +@@ -1493,6 +1495,36 @@ + Reply(250, "EPG scan triggered"); + } + ++void cSVDRP::CmdRENR(const char *Option) ++{ ++ bool recordings = Recordings.Update(true); ++ if (recordings) { ++ if (*Option) { ++ char *tail; ++ int n = strtol(Option, &tail, 10); ++ cRecording *recording = Recordings.Get(n - 1); ++ if (recording && tail && tail != Option) { ++ char *oldName = strdup(recording->Name()); ++ tail = skipspace(tail); ++ if (recording->Rename(tail)) { ++ Reply(250, "Renamed \"%s\" to \"%s\"", oldName, recording->Name()); ++ Recordings.ChangeState(); ++ Recordings.TouchUpdate(); ++ } ++ else ++ Reply(501, "Renaming \"%s\" to \"%s\" failed", oldName, tail); ++ free(oldName); ++ } ++ else ++ Reply(501, "Recording not found or wrong syntax"); ++ } ++ else ++ Reply(501, "Missing Input settings"); ++ } ++ else ++ Reply(550, "No recordings available"); ++} ++ + void cSVDRP::CmdSTAT(const char *Option) + { + if (*Option) { +@@ -1608,6 +1640,7 @@ + else if (CMD("PLUG")) CmdPLUG(s); + else if (CMD("PUTE")) CmdPUTE(s); + else if (CMD("REMO")) CmdREMO(s); ++ else if (CMD("RENR")) CmdRENR(s); + else if (CMD("SCAN")) CmdSCAN(s); + else if (CMD("STAT")) CmdSTAT(s); + else if (CMD("UPDT")) CmdUPDT(s); +diff -Nru vdr-1.7.14-vanilla/svdrp.h vdr-1.7.14-liemikuutio/svdrp.h +--- vdr-1.7.14-vanilla/svdrp.h 2010-03-14 16:57:06.000000000 +0200 ++++ vdr-1.7.14-liemikuutio/svdrp.h 2010-03-14 16:58:41.000000000 +0200 +@@ -79,6 +79,7 @@ + void CmdPLUG(const char *Option); + void CmdPUTE(const char *Option); + void CmdREMO(const char *Option); ++ void CmdRENR(const char *Option); + void CmdSCAN(const char *Option); + void CmdSTAT(const char *Option); + void CmdUPDT(const char *Option); --- vdr-1.7.14.orig/debian/patches/opt-44_rotor.dpatch +++ vdr-1.7.14/debian/patches/opt-44_rotor.dpatch @@ -0,0 +1,120 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-44_rotor.dpatch by Thomas Bergwinkl <Bergwinkl.Thomas@vr-web.de> +## extracted from the rotor plugin 0.1.4-vdr1.5 +## original filename: vdr-1.5.5-rotor.diff +## +## Thomas Günther <tom@toms-cafe.de>: +## - made compatible to VDR-1.4.7 +## - adapted to VDR-1.7.8 +## - adapted to VDR-1.7.11 +## - adapted to VDR-1.7.13 +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: This patch is needed for the rotor plugin. + +@DPATCH@ +diff -Naurp vdr-1.7.13/device.h vdr-1.7.13-rotor/device.h +--- vdr-1.7.13/device.h 2010-02-06 14:34:41.000000000 +0000 ++++ vdr-1.7.13-rotor/device.h 2010-02-28 18:40:19.000000000 +0000 +@@ -24,6 +24,8 @@ + #include "spu.h" + #include "thread.h" + #include "tools.h" ++#include <asm/types.h> ++#include <linux/dvb/frontend.h> + + #define MAXDEVICES 16 // the maximum number of devices in the system + #define MAXPIDHANDLES 64 // the maximum number of different PIDs per device +@@ -289,6 +291,7 @@ public: + virtual bool HasProgramme(void); + ///< Returns true if the device is currently showing any programme to + ///< the user, either through replaying or live. ++ virtual bool SendDiseqcCmd(dvb_diseqc_master_cmd cmd) {return false;} + + // PID handle facilities + +diff -Naurp vdr-1.7.13/dvbdevice.c vdr-1.7.13-rotor/dvbdevice.c +--- vdr-1.7.13/dvbdevice.c 2010-02-21 17:10:35.000000000 +0000 ++++ vdr-1.7.13-rotor/dvbdevice.c 2010-02-28 18:43:41.000000000 +0000 +@@ -244,6 +244,7 @@ bool cDvbTransponderParameters::Parse(co + class cDvbTuner : public cThread { + private: + enum eTunerStatus { tsIdle, tsSet, tsTuned, tsLocked }; ++ bool SendDiseqc; + int device; + int fd_frontend; + int adapter, frontend; +@@ -257,6 +258,7 @@ private: + cMutex mutex; + cCondVar locked; + cCondVar newSet; ++ dvb_diseqc_master_cmd diseqc_cmd; + bool GetFrontendStatus(fe_status_t &Status, int TimeoutMs = 0); + bool SetFrontend(void); + virtual void Action(void); +@@ -266,11 +268,13 @@ public: + const cChannel *GetTransponder(void) const { return &channel; } + bool IsTunedTo(const cChannel *Channel) const; + void Set(const cChannel *Channel); ++ bool SendDiseqcCmd(dvb_diseqc_master_cmd cmd); + bool Locked(int TimeoutMs = 0); + }; + + cDvbTuner::cDvbTuner(int Device, int Fd_Frontend, int Adapter, int Frontend, fe_delivery_system FrontendType) + { ++ SendDiseqc=false; + device = Device; + fd_frontend = Fd_Frontend; + adapter = Adapter; +@@ -327,6 +331,17 @@ bool cDvbTuner::Locked(int TimeoutMs) + return tunerStatus >= tsLocked; + } + ++bool cDvbTuner::SendDiseqcCmd(dvb_diseqc_master_cmd cmd) ++{ ++ cMutexLock MutexLock(&mutex); ++ if ((frontendType != SYS_DVBS && frontendType != SYS_DVBS2) || SendDiseqc) ++ return false; ++ diseqc_cmd=cmd; ++ SendDiseqc=true; ++ newSet.Broadcast(); ++ return true; ++} ++ + bool cDvbTuner::GetFrontendStatus(fe_status_t &Status, int TimeoutMs) + { + if (TimeoutMs) { +@@ -508,6 +523,10 @@ void cDvbTuner::Action(void) + if (GetFrontendStatus(NewStatus, 10)) + Status = NewStatus; + cMutexLock MutexLock(&mutex); ++ if (SendDiseqc) { ++ CHECK(ioctl(fd_frontend, FE_DISEQC_SEND_MASTER_CMD, &diseqc_cmd)); ++ SendDiseqc=false; ++ } + switch (tunerStatus) { + case tsIdle: + break; +@@ -942,6 +961,11 @@ bool cDvbDevice::HasLock(int TimeoutMs) + return dvbTuner ? dvbTuner->Locked(TimeoutMs) : false; + } + ++bool cDvbDevice::SendDiseqcCmd(dvb_diseqc_master_cmd cmd) ++{ ++ return dvbTuner->SendDiseqcCmd(cmd); ++} ++ + void cDvbDevice::SetTransferModeForDolbyDigital(int Mode) + { + setTransferModeForDolbyDigital = Mode; +diff -Naurp vdr-1.7.13/dvbdevice.h vdr-1.7.13-rotor/dvbdevice.h +--- vdr-1.7.13/dvbdevice.h 2010-02-21 14:06:08.000000000 +0000 ++++ vdr-1.7.13-rotor/dvbdevice.h 2010-02-28 18:40:19.000000000 +0000 +@@ -146,6 +146,7 @@ protected: + virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView); + public: + virtual bool HasLock(int TimeoutMs = 0); ++ virtual bool SendDiseqcCmd(dvb_diseqc_master_cmd cmd); + + // PID handle facilities + --- vdr-1.7.14.orig/debian/patches/opt-43-x_recordshowfree.dpatch +++ vdr-1.7.14/debian/patches/opt-43-x_recordshowfree.dpatch @@ -0,0 +1,31 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-32-x_recordshowfree.dpatch by Walter Koch <koch@u32.de> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Shows remaining recording capacity in recordings menu. +## DP: (Requires timer-info patch) + +@DPATCH@ +diff -urNad vdr-1.5.15~/menu.c vdr-1.5.15/menu.c +--- vdr-1.5.15~/menu.c 2008-02-17 22:09:26.000000000 +0100 ++++ vdr-1.5.15/menu.c 2008-02-17 22:10:29.000000000 +0100 +@@ -2317,6 +2317,19 @@ + } + } + free(LastItemText); ++ ++//kw ++ char *buffer = NULL; ++ int FreeMB; ++ int Percent = VideoDiskSpace(&FreeMB); ++ int Minutes = int(double(FreeMB) / MB_PER_MINUTE); ++ int Hours = Minutes / 60; ++ Minutes %= 60; ++ asprintf(&buffer, "%s %d%% %2d:%02d %s (%.1f GB)", tr("Disk"), Percent, Hours, Minutes, tr("free"), FreeMB / 1024.0 ); ++ SetTitle(buffer); ++ free(buffer); ++//kw ++ + Refresh |= SetFreeDiskDisplay(Refresh); + if (Refresh) + Display(); --- vdr-1.7.14.orig/debian/patches/opt-42-x_MainMenuHooks.dpatch +++ vdr-1.7.14/debian/patches/opt-42-x_MainMenuHooks.dpatch @@ -0,0 +1,163 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-42-x_MainMenuHooks.dpatch by Frank Schmirler <vdrdev@schmirler.de> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: This patch allows plugins to replace the VDR mainmenus "Schedule", +## DP: "Channels", "Timers" and "Recordings" by a different implementation. + +@DPATCH@ +This is a "patch" for the Video Disk Recorder (VDR). + +* Authors: +Tobias Grimm <vdr@e-tobi.net> +Martin Prochnow <nordlicht@martins-kabuff.de> +Frank Schmirler <vdrdev@schmirler.de> +Christian Wieninger <cwieninger@gmx.de> + +* Description: +This patch allows plugins to replace the VDR mainmenus "Schedule", +"Channels", "Timers" and "Recordings" by a different implementation. + +The patch is based on a suggestion of Christian Wieninger back in 2006 +(http://www.linuxtv.org/pipermail/vdr/2006-March/008234.html). It is +meant to be an interim solution for VDR 1.4 until (maybe) VDR 1.5 +introduces an official API for this purpose. + +* Installation +Change into the VDR source directory, then issue + patch -p1 < path/to/MainMenuHooks-v1_0.patch +and recompile. + +* Notes for plugin authors +The following code sample shows the required plugin code for replacing +the original Schedule menu: + +bool cMyPlugin::Service(const char *Id, void *Data) +{ + cOsdMenu **menu = (cOsdMenu**) Data; + if (MySetup.replaceSchedule && + strcmp(Id, "MainMenuHooksPatch-v1.0::osSchedule") == 0) { + if (menu) + *menu = (cOsdMenu*) MainMenuAction(); + return true; + } + return false; +} + +A plugin can replace more than one menu at a time. Simply replace the +call to MainMenuAction() in the sample above by appropriate code. + +Note that a plugin *should* offer a setup option which allows the user +to enable or disable the replacement. "Disabled" would be a reasonable +default setting. By testing for define MAINMENUHOOKSVERSNUM, a plugin +can leave the setup option out at compiletime. + +In case there is an internal problem when trying to open the replacement +menu, it is safe to return true even though Data is NULL. However an +OSD message should indicate the problem to the user. + +Feel free to ship this patch along with your plugin. However if you +think you need to modify the patch, we'd encourage you to contact the +authors first or at least use a service id which differs in more than +just the version number. + +--- vdr-1.4.5/menu.c.orig 2007-02-07 08:23:49.000000000 +0100 ++++ vdr-1.4.5/menu.c 2007-02-20 11:05:34.000000000 +0100 +@@ -2792,15 +2792,30 @@ + + // Initial submenus: + ++ cOsdMenu *menu = NULL; + switch (State) { +- case osSchedule: AddSubMenu(new cMenuSchedule); break; +- case osChannels: AddSubMenu(new cMenuChannels); break; +- case osTimers: AddSubMenu(new cMenuTimers); break; +- case osRecordings: AddSubMenu(new cMenuRecordings(NULL, 0, true)); break; +- case osSetup: AddSubMenu(new cMenuSetup); break; +- case osCommands: AddSubMenu(new cMenuCommands(tr("Commands"), &Commands)); break; ++ case osSchedule: ++ if (!cPluginManager::CallFirstService("MainMenuHooksPatch-v1.0::osSchedule", &menu)) ++ menu = new cMenuSchedule; ++ break; ++ case osChannels: ++ if (!cPluginManager::CallFirstService("MainMenuHooksPatch-v1.0::osChannels", &menu)) ++ menu = new cMenuChannels; ++ break; ++ case osTimers: ++ if (!cPluginManager::CallFirstService("MainMenuHooksPatch-v1.0::osTimers", &menu)) ++ menu = new cMenuTimers; ++ break; ++ case osRecordings: ++ if (!cPluginManager::CallFirstService("MainMenuHooksPatch-v1.0::osRecordings", &menu)) ++ menu = new cMenuRecordings(NULL, 0, true); ++ break; ++ case osSetup: menu = new cMenuSetup; break; ++ case osCommands: menu = new cMenuCommands(tr("Commands"), &Commands); break; + default: break; + } ++ if (menu) ++ AddSubMenu(menu); + } + + cOsdObject *cMenuMain::PluginOsdObject(void) +@@ -2927,13 +2942,34 @@ + eOSState state = cOsdMenu::ProcessKey(Key); + HadSubMenu |= HasSubMenu(); + ++ cOsdMenu *menu = NULL; + switch (state) { +- case osSchedule: return AddSubMenu(new cMenuSchedule); +- case osChannels: return AddSubMenu(new cMenuChannels); +- case osTimers: return AddSubMenu(new cMenuTimers); +- case osRecordings: return AddSubMenu(new cMenuRecordings); +- case osSetup: return AddSubMenu(new cMenuSetup); +- case osCommands: return AddSubMenu(new cMenuCommands(tr("Commands"), &Commands)); ++ case osSchedule: ++ if (!cPluginManager::CallFirstService("MainMenuHooksPatch-v1.0::osSchedule", &menu)) ++ menu = new cMenuSchedule; ++ else ++ state = osContinue; ++ break; ++ case osChannels: ++ if (!cPluginManager::CallFirstService("MainMenuHooksPatch-v1.0::osChannels", &menu)) ++ menu = new cMenuChannels; ++ else ++ state = osContinue; ++ break; ++ case osTimers: ++ if (!cPluginManager::CallFirstService("MainMenuHooksPatch-v1.0::osTimers", &menu)) ++ menu = new cMenuTimers; ++ else ++ state = osContinue; ++ break; ++ case osRecordings: ++ if (!cPluginManager::CallFirstService("MainMenuHooksPatch-v1.0::osRecordings", &menu)) ++ menu = new cMenuRecordings; ++ else ++ state = osContinue; ++ break; ++ case osSetup: menu = new cMenuSetup; break; ++ case osCommands: menu = new cMenuCommands(tr("Commands"), &Commands); break; + case osStopRecord: if (Interface->Confirm(tr("Stop recording?"))) { + cOsdItem *item = Get(Current()); + if (item) { +@@ -2985,6 +3021,8 @@ + default: break; + } + } ++ if (menu) ++ return AddSubMenu(menu); + if (!HasSubMenu() && Update(HadSubMenu)) + Display(); + if (Key != kNone) { +--- vdr-1.4.5/config.h.orig 2007-02-20 11:55:40.000000000 +0100 ++++ vdr-1.4.5/config.h 2007-02-20 11:56:43.000000000 +0100 +@@ -35,6 +35,8 @@ + // plugins to work with newer versions of the core VDR as long as no + // VDR header files have changed. + ++#define MAINMENUHOOKSVERSNUM 1.0 ++ + #define MAXPRIORITY 99 + #define MAXLIFETIME 99 + --- vdr-1.7.14.orig/debian/patches/opt-48-x_pin.dpatch +++ vdr-1.7.14/debian/patches/opt-48-x_pin.dpatch @@ -0,0 +1,635 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-48_pin.dpatch by Jrg Wendel (Horchi) +## +## Thomas Gnther <tom@toms-cafe.de>: +## - adapted to VDR-1.5.8 with liemikuutio, menuorg and MainMenuHooks patches +## - adapted to VDR-1.5.10 with liemikuutio, menuorg and MainMenuHooks patches +## - adapted to vdr-1.5.13-liemikuutio-1.17.diff.gz +## - adapted to vdr-1.7.0-liemikuutio-1.20.diff.gz +## - adapted to VDR-1.7.9 with liemikuutio, ttxtsubs, menuorg and MainMenuHooks patches +## - adapted to vdr-workaround-broken-sys-capability patch +## - adapted to VDR-1.7.12 with liemikuutio, ttxtsubs, menuorg and MainMenuHooks patches +## Tobias Grimm <tg@e-tobi.net>: +## - adapted to VDR 1.5.15 +## - adapted to new ttxtsubs patch +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Patch for the PIN plugin from version 0.1.7 of the Plugin +## DP: (vdr-1.4.5.diff) + +@DPATCH@ +diff -Naurp vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks/Makefile vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks-pin/Makefile +--- vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks/Makefile 2010-02-01 14:54:18.000000000 +0000 ++++ vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks-pin/Makefile 2010-02-01 14:56:26.000000000 +0000 +@@ -45,6 +45,8 @@ OBJS = audio.o channels.o ci.o config.o + + OBJS += vdrttxtsubshooks.o + ++OBJS += childlock.o ++ + ifndef NO_KBD + DEFINES += -DREMOTE_KBD + endif +diff -Naurp vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks/childlock.c vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks-pin/childlock.c +--- vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks/childlock.c 1970-01-01 00:00:00.000000000 +0000 ++++ vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks-pin/childlock.c 2010-02-01 14:56:26.000000000 +0000 +@@ -0,0 +1,166 @@ ++#include "childlock.h" ++#include "childlockservice.h" ++#include "plugin.h" ++ ++using namespace PinPatch; ++ ++IChildLockService* ChildLock::_cachedChildLockService = NULL; ++INotificationService* ChildLock::_cachedNotificationService = NULL; ++ ++IChildLockService* ChildLock::ChildLockService() ++{ ++ if (!_cachedChildLockService) ++ { ++ IChildLockService* childLockService; ++ ++ if (cPluginManager::CallFirstService(CHILDLOCK_SERVICE_ID, &childLockService)) ++ { ++ _cachedChildLockService = childLockService; ++ } ++ else ++ { ++ _cachedChildLockService = NULL; ++ } ++ } ++ ++ return _cachedChildLockService; ++} ++ ++bool ChildLock::IsUnlocked() ++{ ++ if (IChildLockService* childLockService = ChildLockService()) ++ { ++ return childLockService->IsUnlocked(); ++ } ++ else ++ { ++ return false; ++ } ++} ++ ++bool ChildLock::IsMenuProtected(const char* MenuName) ++{ ++ if (IChildLockService* childLockService = ChildLockService()) ++ { ++ return childLockService->IsMenuProtected(MenuName); ++ } ++ else ++ { ++ return false; ++ } ++} ++ ++bool ChildLock::IsChannelProtected(const cChannel* Channel) ++{ ++ if (IChildLockService* childLockService = ChildLockService()) ++ { ++ return childLockService->IsChannelProtected(Channel); ++ } ++ else ++ { ++ return false; ++ } ++} ++ ++bool ChildLock::IsRecordingProtected(const cRecording* Recording, const char* Name, const char* Base, bool isDirectory) ++{ ++ if (IChildLockService* childLockService = ChildLockService()) ++ { ++ return childLockService->IsRecordingProtected(Recording, Name, Base, isDirectory); ++ } ++ else ++ { ++ return false; ++ } ++} ++ ++bool ChildLock::IsPluginProtected(cPlugin* Plugin) ++{ ++ if (IChildLockService* childLockService = ChildLockService()) ++ { ++ return childLockService->IsPluginProtected(Plugin); ++ } ++ else ++ { ++ return false; ++ } ++} ++ ++bool ChildLock::IsMenuHidden(const char* MenuName) ++{ ++ if (IChildLockService* childLockService = ChildLockService()) ++ { ++ return childLockService->IsMenuHidden(MenuName); ++ } ++ else ++ { ++ return false; ++ } ++} ++ ++bool ChildLock::IsPluginHidden(cPlugin* Plugin) ++{ ++ if (IChildLockService* childLockService = ChildLockService()) ++ { ++ return childLockService->IsPluginHidden(Plugin); ++ } ++ else ++ { ++ return false; ++ } ++} ++ ++bool ChildLock::IsRecordingHidden(const cRecording* Recording, const char* Name, const char* Base, bool isDirectory) ++{ ++ if (IChildLockService* childLockService = ChildLockService()) ++ { ++ return childLockService->IsRecordingHidden(Recording, Name, Base, isDirectory); ++ } ++ else ++ { ++ return false; ++ } ++} ++ ++INotificationService* ChildLock::NotificationService() ++{ ++ if (!_cachedNotificationService) ++ { ++ INotificationService* notificationService; ++ ++ if (cPluginManager::CallFirstService(NOTIFICATION_SERVICE_ID, ¬ificationService)) ++ { ++ _cachedNotificationService = notificationService; ++ } ++ else ++ { ++ _cachedNotificationService = NULL; ++ } ++ } ++ ++ return _cachedNotificationService; ++} ++ ++void ChildLock::NotifyTimerCreation(cTimer* Timer, const cEvent *Event) ++{ ++ if (INotificationService* notificationService = NotificationService()) ++ { ++ notificationService->NotifyTimerCreation(Timer, Event); ++ } ++} ++ ++void ChildLock::NotifyRecordingStart(const char* FileName) ++{ ++ if (INotificationService* notificationService = NotificationService()) ++ { ++ notificationService->NotifyRecordingStart(FileName); ++ } ++} ++ ++void ChildLock::NotifyUserAction(const eKeys key, const cOsdObject* Interact) ++{ ++ if (INotificationService* notificationService = NotificationService()) ++ { ++ notificationService->NotifyUserAction(key, Interact); ++ } ++} +diff -Naurp vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks/childlock.h vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks-pin/childlock.h +--- vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks/childlock.h 1970-01-01 00:00:00.000000000 +0000 ++++ vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks-pin/childlock.h 2010-02-01 14:56:26.000000000 +0000 +@@ -0,0 +1,47 @@ ++#ifndef __CHILDLOCK_H ++#define __CHILDLOCK_H ++ ++#include "keys.h" ++ ++class cChannel; ++class cRecording; ++class cPlugin; ++class cTimer; ++class cEvent; ++class cOsdObject; ++ ++namespace PinPatch ++{ ++ ++class IChildLockService; ++class INotificationService; ++ ++class ChildLock ++{ ++ private: ++ static IChildLockService* _cachedChildLockService; ++ static INotificationService* _cachedNotificationService; ++ ++ private: ++ static IChildLockService* ChildLockService(); ++ static INotificationService* NotificationService(); ++ ++ public: ++ static bool IsUnlocked(); ++ ++ static bool IsMenuProtected(const char* MenuName); ++ static bool IsChannelProtected(const cChannel* Channel); ++ static bool IsRecordingProtected(const cRecording* Recording, const char* Name, const char* Base, bool isDirectory); ++ static bool IsPluginProtected(cPlugin* Plugin); ++ ++ static bool IsMenuHidden(const char* MenuName); ++ static bool IsPluginHidden(cPlugin* Plugin); ++ static bool IsRecordingHidden(const cRecording* Recording, const char* Name, const char* Base, bool isDirectory); ++ ++ static void NotifyTimerCreation(cTimer* Timer, const cEvent *Event); ++ static void NotifyRecordingStart(const char* FileName); ++ static void NotifyUserAction(const eKeys key, const cOsdObject* Interact); ++}; ++ ++}; ++#endif +diff -Naurp vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks/childlockservice.h vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks-pin/childlockservice.h +--- vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks/childlockservice.h 1970-01-01 00:00:00.000000000 +0000 ++++ vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks-pin/childlockservice.h 2010-02-01 14:56:26.000000000 +0000 +@@ -0,0 +1,46 @@ ++#ifndef __CHILDLOCKSERVICE_H ++#define __CHILDLOCKSERVICE_H ++ ++#include "keys.h" ++ ++class cChannel; ++class cRecording; ++class cPlugin; ++class cTimer; ++class cEvent; ++class cOsdObject; ++ ++namespace PinPatch ++{ ++ ++#define CHILDLOCK_SERVICE_ID "ChildLockService-v0.1::ChildLockService" ++ ++class IChildLockService ++{ ++ public: ++ virtual ~IChildLockService() {}; ++ virtual bool IsUnlocked() = 0; ++ ++ virtual bool IsMenuProtected(const char* MenuName) = 0; ++ virtual bool IsChannelProtected(const cChannel* Channel) = 0; ++ virtual bool IsRecordingProtected(const cRecording* Recording, const char* Name, const char* Base, bool isDirectory) = 0; ++ virtual bool IsPluginProtected(cPlugin* Plugin) = 0; ++ ++ virtual bool IsMenuHidden(const char* MenuName) = 0; ++ virtual bool IsPluginHidden(cPlugin* Plugin) = 0; ++ virtual bool IsRecordingHidden(const cRecording* Recording, const char* Name, const char* Base, bool isDirectory) = 0; ++}; ++ ++#define NOTIFICATION_SERVICE_ID "PinPlugin-v0.1::NotificationService" ++ ++class INotificationService ++{ ++ public: ++ virtual ~INotificationService() {}; ++ virtual void NotifyTimerCreation(cTimer* Timer, const cEvent *Event) = 0; ++ virtual void NotifyRecordingStart(const char* FileName) = 0; ++ virtual void NotifyUserAction(const eKeys key, const cOsdObject* Interact) = 0; ++}; ++ ++}; ++#endif +diff -Naurp vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks/device.c vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks-pin/device.c +--- vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks/device.c 2010-02-01 14:54:18.000000000 +0000 ++++ vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks-pin/device.c 2010-02-01 14:56:26.000000000 +0000 +@@ -19,6 +19,7 @@ + #include "status.h" + #include "transfer.h" + #include "vdrttxtsubshooks.h" ++#include "childlock.h" + + // --- cLiveSubtitle --------------------------------------------------------- + +@@ -637,6 +638,7 @@ bool cDevice::SwitchChannel(int Directio + cChannel *channel; + while ((channel = Channels.GetByNumber(n, Direction)) != NULL) { + // try only channels which are currently available ++ if (!PinPatch::ChildLock::IsChannelProtected(channel)) + if (GetDevice(channel, 0, true)) + break; + n = channel->Number() + Direction; +@@ -658,6 +660,9 @@ bool cDevice::SwitchChannel(int Directio + + eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView) + { ++ if (LiveView && PinPatch::ChildLock::IsChannelProtected(Channel)) ++ return scrNotAvailable; ++ + if (LiveView) { + StopReplay(); + DELETENULL(liveSubtitle); +diff -Naurp vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks/menu.c vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks-pin/menu.c +--- vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks/menu.c 2010-02-01 14:54:39.000000000 +0000 ++++ vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks-pin/menu.c 2010-02-01 15:00:48.000000000 +0000 +@@ -32,6 +32,7 @@ + #include "transfer.h" + #include "videodir.h" + #include "menuorgpatch.h" ++#include "childlock.h" + + #define MAXWAIT4EPGINFO 3 // seconds + #define MODETIMEOUT 3 // seconds +@@ -911,6 +912,10 @@ cMenuEditTimer::cMenuEditTimer(cTimer *T + Add(new cMenuEditBitItem( tr("VPS"), &data.flags, tfVps)); + Add(new cMenuEditIntItem( tr("Priority"), &data.priority, 0, MAXPRIORITY)); + Add(new cMenuEditIntItem( tr("Lifetime"), &data.lifetime, 0, MAXLIFETIME)); ++ ++ if (PinPatch::ChildLock::IsUnlocked()) ++ Add(new cMenuEditBitItem(tr("Timer$Childlock"), &data.flags, tfProtected)); ++ + Add(file = new cMenuEditStrItem( tr("File"), data.file, sizeof(data.file))); + SetFirstDayItem(); + } +@@ -2429,7 +2434,8 @@ void cMenuRecordings::Set(bool Refresh) + for (cRecording *recording = Recordings.First(); recording; recording = Recordings.Next(recording)) { + if (!base || (strstr(recording->Name(), base) == recording->Name() && recording->Name()[strlen(base)] == FOLDERDELIMCHAR)) { + cMenuRecordingItem *Item = new cMenuRecordingItem(recording, level); +- if (*Item->Text() && (!LastItem || strcmp(Item->Text(), LastItemText) != 0)) { ++ if ((*Item->Text() && (!LastItem || strcmp(Item->Text(), LastItemText) != 0)) ++ && (!PinPatch::ChildLock::IsRecordingHidden(GetRecording(Item), Item->Name(), base, Item->IsDirectory()))) { + Add(Item); + LastItem = Item; + free(LastItemText); +@@ -2479,6 +2485,9 @@ eOSState cMenuRecordings::Play(void) + { + cMenuRecordingItem *ri = (cMenuRecordingItem *)Get(Current()); + if (ri) { ++ if (PinPatch::ChildLock::IsRecordingProtected(GetRecording(ri), ri->Name(), base, ri->IsDirectory())) ++ return osContinue; ++ + if (ri->IsDirectory()) + Open(); + else { +@@ -3501,6 +3510,8 @@ void cMenuMain::Set(void) + } + else if ((*i)->IsPluginItem()) { + const char *item = (*i)->PluginMenuEntry(); ++ cPlugin *plugin = cPluginManager::GetPlugin((*i)->PluginIndex()); ++ if (!PinPatch::ChildLock::IsPluginHidden(plugin)) + if (item) + osdItem = new cMenuPluginItem(hk(item), (*i)->PluginIndex()); + } +@@ -3515,9 +3526,13 @@ void cMenuMain::Set(void) + + // Basic menu items: + ++ if (!PinPatch::ChildLock::IsMenuHidden("Schedule")) + Add(new cOsdItem(hk(tr("Schedule")), osSchedule)); ++ if (!PinPatch::ChildLock::IsMenuHidden("Channels")) + Add(new cOsdItem(hk(tr("Channels")), osChannels)); ++ if (!PinPatch::ChildLock::IsMenuHidden("Timers")) + Add(new cOsdItem(hk(tr("Timers")), osTimers)); ++ if (!PinPatch::ChildLock::IsMenuHidden("Recordings")) + Add(new cOsdItem(hk(tr("Recordings")), osRecordings)); + + // Plugins: +@@ -3525,18 +3540,22 @@ void cMenuMain::Set(void) + for (int i = 0; ; i++) { + cPlugin *p = cPluginManager::GetPlugin(i); + if (p) { ++ if (!PinPatch::ChildLock::IsPluginHidden(p)) { + const char *item = p->MainMenuEntry(); + if (item) + Add(new cMenuPluginItem(hk(item), i)); + } ++ } + else + break; + } + + // More basic menu items: + ++ if (!PinPatch::ChildLock::IsMenuHidden("Setup")) + Add(new cOsdItem(hk(tr("Setup")), osSetup)); + if (Commands.Count()) ++ if (!PinPatch::ChildLock::IsMenuHidden("Commands")) + Add(new cOsdItem(hk(tr("Commands")), osCommands)); + + } +@@ -3617,6 +3636,11 @@ eOSState cMenuMain::ProcessKey(eKeys Key + eOSState state = cOsdMenu::ProcessKey(Key); + HadSubMenu |= HasSubMenu(); + ++ cOsdItem* item = Get(Current()); ++ if (item && item->Text() && state != osContinue && state != osUnknown && state != osBack) ++ if (PinPatch::ChildLock::IsMenuProtected(item->Text())) ++ return osContinue; ++ + cOsdMenu *menu = NULL; + switch (state) { + case osSchedule: +@@ -3663,6 +3687,7 @@ eOSState cMenuMain::ProcessKey(eKeys Key + if (item) { + cPlugin *p = cPluginManager::GetPlugin(item->PluginIndex()); + if (p) { ++ if (!PinPatch::ChildLock::IsPluginProtected(p)) { + cOsdObject *menu = p->MainMenuAction(); + if (menu) { + if (menu->IsMenu()) +@@ -3673,6 +3698,7 @@ eOSState cMenuMain::ProcessKey(eKeys Key + } + } + } ++ } + } + state = osEnd; + } +@@ -3881,6 +3907,7 @@ cChannel *cDisplayChannel::NextAvailable + Channel = Direction > 0 ? Channels.Next(Channel) : Channels.Prev(Channel); + if (!Channel && Setup.ChannelsWrap) + Channel = Direction > 0 ? Channels.First() : Channels.Last(); ++ if (!PinPatch::ChildLock::IsChannelProtected(Channel)) + if (Channel && !Channel->GroupSep() && cDevice::GetDevice(Channel, 0, true)) + return Channel; + } +@@ -4513,6 +4540,7 @@ bool cRecordControls::Start(cTimer *Time + for (int i = 0; i < MAXRECORDCONTROLS; i++) { + if (!RecordControls[i]) { + RecordControls[i] = new cRecordControl(device, Timer, Pause); ++ PinPatch::ChildLock::NotifyRecordingStart(RecordControls[i]->FileName()); + return RecordControls[i]->Process(time(NULL)); + } + } +diff -Naurp vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks/po/de_DE.po vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks-pin/po/de_DE.po +--- vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks/po/de_DE.po 2010-02-01 13:57:45.000000000 +0000 ++++ vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks-pin/po/de_DE.po 2010-02-01 14:56:26.000000000 +0000 +@@ -635,6 +635,9 @@ msgstr "Prioritt" + msgid "Lifetime" + msgstr "Lebensdauer" + ++msgid "Timer$Childlock" ++msgstr "Gesichert" ++ + msgid "File" + msgstr "Datei" + +diff -Naurp vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks/po/fr_FR.po vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks-pin/po/fr_FR.po +--- vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks/po/fr_FR.po 2010-02-01 13:57:45.000000000 +0000 ++++ vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks-pin/po/fr_FR.po 2010-02-01 14:56:26.000000000 +0000 +@@ -641,6 +641,9 @@ msgstr "Priorit" + msgid "Lifetime" + msgstr "Dure de vie" + ++msgid "Timer$Childlock" ++msgstr "Adulte" ++ + msgid "File" + msgstr "Fichier" + +diff -Naurp vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks/timers.c vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks-pin/timers.c +--- vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks/timers.c 2010-01-16 11:18:53.000000000 +0000 ++++ vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks-pin/timers.c 2010-02-01 14:56:26.000000000 +0000 +@@ -16,6 +16,7 @@ + #include "recording.h" + #include "remote.h" + #include "status.h" ++#include "childlock.h" + + #define VFAT_MAX_FILENAME 40 // same as MAX_SUBTITLE_LENGTH in recording.c + +@@ -27,6 +28,7 @@ + + cTimer::cTimer(bool Instant, bool Pause, cChannel *Channel) + { ++ aux = NULL; + startTime = stopTime = 0; + lastSetEvent = 0; + recording = pending = inVpsMargin = false; +@@ -47,7 +49,6 @@ cTimer::cTimer(bool Instant, bool Pause, + priority = Pause ? Setup.PausePriority : Setup.DefaultPriority; + lifetime = Pause ? Setup.PauseLifetime : Setup.DefaultLifetime; + *file = 0; +- aux = NULL; + event = NULL; + if (Instant && channel) + snprintf(file, sizeof(file), "%s%s", Setup.MarkInstantRecord ? "@" : "", *Setup.NameInstantRecord ? Setup.NameInstantRecord : channel->Name()); +@@ -60,6 +61,7 @@ cTimer::cTimer(bool Instant, bool Pause, + + cTimer::cTimer(const cEvent *Event) + { ++ aux = NULL; + startTime = stopTime = 0; + lastSetEvent = 0; + recording = pending = inVpsMargin = false; +@@ -93,8 +95,8 @@ cTimer::cTimer(const cEvent *Event) + file[Utf8SymChars(file, VFAT_MAX_FILENAME)] = 0; + dsyslog("timer file name truncated to '%s'", file); + } +- aux = NULL; + event = NULL; // let SetEvent() be called to get a log message ++ PinPatch::ChildLock::NotifyTimerCreation(this, Event); + } + + cTimer::cTimer(const cTimer &Timer) +@@ -269,6 +271,8 @@ cString cTimer::PrintFirstDay(void) cons + return ""; // not NULL, so the caller can always use the result + } + ++#define AUX_STR_PROTECTED "<pin-plugin><protected>yes</protected></pin-plugin>" ++ + bool cTimer::Parse(const char *s) + { + char *channelbuffer = NULL; +@@ -323,6 +327,8 @@ bool cTimer::Parse(const char *s) + result = false; + } + } ++ if (aux && strstr(aux, AUX_STR_PROTECTED)) ++ SetFlags(tfProtected); + free(channelbuffer); + free(daybuffer); + free(filebuffer); +@@ -592,6 +598,26 @@ void cTimer::SetPriority(int Priority) + void cTimer::SetFlags(uint Flags) + { + flags |= Flags; ++ ++ char* tmp = NULL; ++ char* position; ++ ++ if (HasFlags(tfProtected)) { ++ if (!aux || !strstr(aux, AUX_STR_PROTECTED)) { ++ if (aux) { ++ tmp = strdup(aux); ++ free(aux); ++ } ++ asprintf(&aux,"%s%s", tmp ? tmp : "", AUX_STR_PROTECTED); ++ } ++ } ++ else if (aux && (position = strstr(aux, AUX_STR_PROTECTED))) { ++ asprintf(&tmp, "%.*s%s", position-aux, aux, position+strlen(AUX_STR_PROTECTED)); ++ free(aux); ++ aux = strdup(tmp); ++ } ++ ++ free(tmp); + } + + void cTimer::ClrFlags(uint Flags) +diff -Naurp vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks/timers.h vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks-pin/timers.h +--- vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks/timers.h 2008-02-16 14:33:23.000000000 +0000 ++++ vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks-pin/timers.h 2010-02-01 14:56:26.000000000 +0000 +@@ -20,6 +20,7 @@ enum eTimerFlags { tfNone = 0x0000, + tfInstant = 0x0002, + tfVps = 0x0004, + tfRecording = 0x0008, ++ tfProtected = 0x8000, + tfAll = 0xFFFF, + }; + enum eTimerMatch { tmNone, tmPartial, tmFull }; +diff -Naurp vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks/vdr.c vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks-pin/vdr.c +--- vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks/vdr.c 2010-01-31 11:14:40.000000000 +0000 ++++ vdr-1.7.12-liemikuutio-ttxtsubs-menuorg-MainMenuHooks-pin/vdr.c 2010-02-01 14:56:26.000000000 +0000 +@@ -63,6 +63,7 @@ + #include "timers.h" + #include "tools.h" + #include "transfer.h" ++#include "childlock.h" + #include "videodir.h" + + #define MINCHANNELWAIT 10 // seconds to wait between failed channel switchings +@@ -928,6 +929,7 @@ int main(int argc, char *argv[]) + cOsdObject *Interact = Menu ? Menu : cControl::Control(); + eKeys key = Interface->GetKey(!Interact || !Interact->NeedsFastResponse()); + if (ISREALKEY(key)) { ++ PinPatch::ChildLock::NotifyUserAction(key, Interact); + EITScanner.Activity(); + // Cancel shutdown countdown: + if (ShutdownHandler.countdown) +@@ -1000,10 +1002,12 @@ int main(int argc, char *argv[]) + cControl::Control()->Hide(); + cPlugin *plugin = cPluginManager::GetPlugin(PluginName); + if (plugin) { ++ if (!PinPatch::ChildLock::IsPluginProtected(plugin)) { + Menu = plugin->MainMenuAction(); + if (Menu) + Menu->Show(); + } ++ } + else + esyslog("ERROR: unknown plugin '%s'", PluginName); + } +@@ -1217,9 +1221,11 @@ int main(int argc, char *argv[]) + // Instant resume of the last viewed recording: + case kPlay: + if (cReplayControl::LastReplayed()) { ++ if (!PinPatch::ChildLock::IsRecordingProtected(0, cReplayControl::LastReplayed(), 0, false)) { + cControl::Shutdown(); + cControl::Launch(new cReplayControl); + } ++ } + break; + default: break; + } --- vdr-1.7.14.orig/debian/patches/opt-45_yaepg.dpatch +++ vdr-1.7.14/debian/patches/opt-45_yaepg.dpatch @@ -0,0 +1,95 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-45_yaepg.dpatch by bball950@yahoo.com +## http://www.hoochvdr.info/yaepg/vdr-1.3.19-core-yaepg.diff +## +## Thomas Gnther <tom@toms-cafe.de>: +## - adapted to VDR-1.3.25 +## - adapted to VDR-1.3.42 +## - adapted to VDR-1.5.2 +## - adapted to VDR-1.5.3 (removed special yaepg font) +## - adapted to VDR-1.5.9 +## - adapted to VDR-1.7.11 +## Tobias Grimm <tg@e-tobi.net>: +## - applied modification from Michal Nival that fixes a small bug +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: This patch is needed for the yaepg plugin. + +@DPATCH@ +diff -Naurp vdr-1.7.11/PLUGINS/src/dvbsddevice/dvbsdffosd.c vdr-1.7.11-yaepg/PLUGINS/src/dvbsddevice/dvbsdffosd.c +--- vdr-1.7.11/PLUGINS/src/dvbsddevice/dvbsdffosd.c 2009-12-29 11:52:48.000000000 +0000 ++++ vdr-1.7.11-yaepg/PLUGINS/src/dvbsddevice/dvbsdffosd.c 2010-01-08 00:03:36.000000000 +0000 +@@ -78,6 +78,10 @@ void cDvbSdFfOsd::SetActive(bool On) + Cmd(OSD_SetWindow, 0, i + 1); + Cmd(OSD_Close); + } ++ if (vidWin.bpp != 0) { ++ Cmd(OSD_SetWindow, 0, MAXNUMWINDOWS); ++ Cmd(OSD_Close); ++ } + shown = false; + } + } +@@ -113,6 +117,10 @@ eOsdError cDvbSdFfOsd::SetAreas(const tA + Cmd(OSD_SetWindow, 0, i + 1); + Cmd(OSD_Close); + } ++ if (vidWin.bpp != 0) { ++ Cmd(OSD_SetWindow, 0, MAXNUMWINDOWS); ++ Cmd(OSD_Close); ++ } + shown = false; + } + return cOsd::SetAreas(Areas, NumAreas); +@@ -196,6 +204,11 @@ void cDvbSdFfOsd::Flush(void) + Cmd(OSD_SetWindow, 0, i + 1); + Cmd(OSD_MoveWindow, 0, Left() + Bitmap->X0(), Top() + Bitmap->Y0()); + } ++ if (vidWin.bpp != 0) { ++ Cmd(OSD_SetWindow, 0, MAXNUMWINDOWS); ++ Cmd(OSD_OpenRaw, vidWin.bpp, vidWin.x1, vidWin.y1, ++ vidWin.x2, vidWin.y2, (void *)0); ++ } + shown = true; + } + } +diff -Naurp vdr-1.7.11/device.h vdr-1.7.11-yaepg/device.h +--- vdr-1.7.11/device.h 2010-01-01 15:04:27.000000000 +0000 ++++ vdr-1.7.11-yaepg/device.h 2010-01-08 00:03:36.000000000 +0000 +@@ -246,12 +246,12 @@ public: + ///< Direction (only the sign of Direction is evaluated, positive values + ///< switch to higher channel numbers). + private: +- eSetChannelResult SetChannel(const cChannel *Channel, bool LiveView); +- ///< Sets the device to the given channel (general setup). + protected: + virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView); + ///< Sets the device to the given channel (actual physical setup). + public: ++ eSetChannelResult SetChannel(const cChannel *Channel, bool LiveView); ++ ///< Sets the device to the given channel (general setup). + static int CurrentChannel(void) { return primaryDevice ? currentChannel : 0; } + ///< Returns the number of the current channel on the primary device. + static void SetCurrentChannel(const cChannel *Channel) { currentChannel = Channel ? Channel->Number() : 0; } +diff -Naurp vdr-1.7.11/osd.c vdr-1.7.11-yaepg/osd.c +--- vdr-1.7.11/osd.c 2009-12-06 11:33:47.000000000 +0000 ++++ vdr-1.7.11-yaepg/osd.c 2010-01-08 00:03:36.000000000 +0000 +@@ -746,6 +746,7 @@ cOsd::cOsd(int Left, int Top, uint Level + } + } + Osds.Append(this); ++ vidWin.bpp = 0; + } + + cOsd::~cOsd() +diff -Naurp vdr-1.7.11/osd.h vdr-1.7.11-yaepg/osd.h +--- vdr-1.7.11/osd.h 2009-05-08 13:41:03.000000000 +0000 ++++ vdr-1.7.11-yaepg/osd.h 2010-01-08 00:03:36.000000000 +0000 +@@ -401,6 +401,7 @@ public: + ///< 7: vertical, falling, upper + virtual void Flush(void); + ///< Actually commits all data to the OSD hardware. ++ tArea vidWin; + }; + + class cOsdProvider { --- vdr-1.7.14.orig/debian/patches/opt-41-x_timer-info.dpatch +++ vdr-1.7.14/debian/patches/opt-41-x_timer-info.dpatch @@ -0,0 +1,306 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-41-x_timer-info.dpatch by Andreas Brugger <brougs78@gmx.net>, Thomas Gnther <tom@toms-cafe.de> +## http://toms-cafe.de/vdr/download/vdr-timer-info-0.5-1.7.13.diff +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Shows info, if it is possible to record an event in the timer-info of +## DP: vdr - see README.timer-info for details. + +@DPATCH@ +diff -Naurp vdr-1.7.13/README.timer-info vdr-1.7.13-timer-info-0.5/README.timer-info +--- vdr-1.7.13/README.timer-info 1970-01-01 00:00:00.000000000 +0000 ++++ vdr-1.7.13-timer-info-0.5/README.timer-info 2010-02-28 18:26:31.000000000 +0000 +@@ -0,0 +1,69 @@ +++------------------------------------------------------------------------------+ ++| Info about the timer-info-patch by Brougs78 | ++| brougs78@gmx.net / home.pages.at/brougs78 | +++------------------------------------------------------------------------------+ ++ ++ ++README timer-info: ++------------------ ++ ++Features: ++ - Shows info, if it is possible to record an event in the timer menu of vdr. ++ For calculations the free space incl. the deleted recordings is used, ++ considering an average consumtion of 25.75 MB/min (also used by vdr itself). ++ The first column in the timer-list shows: ++ ( + ) recording will be most probably possible (enough space) ++ (+/-) recording may be possible ++ ( - ) recording will most probably fail (to less space) ++ The calculations also consider repeating timers. ++ - It is possible to deactivate the patch in the OSD-menu of VDR. ++ ++ ++HISTORY timer-info: ++------------------- ++ ++25.11.2004: v0.1 ++ - Initial release ++ ++11.01.2005: v0.1b ++ - Bugfixes for vdr-1.3.18 ++ - In the menu the free recording-time no longer includes the space of the ++ deleted recordings, because this slowed the vdr down to much. ++ ++08.07.2005: v0.1c ++ - Made the patch configurable ++ ++29.01.2006: v0.2 - Thomas Gnther <tom@toms-cafe.de> ++ - Rewritten great parts for vdr-1.3.38+ ++ http://toms-cafe.de/vdr/download/vdr-timer-info-0.2-1.3.38+.diff ++ ++05.02.2006: v0.3 - Thomas Gnther <tom@toms-cafe.de> ++ - Fixed refresh of timer menu in cMenuTimers::OnOff ++ - Fixed check of repeating timers ++ - Syslog debug messages can be enabled with Define DEBUG_TIMER_INFO ++ http://toms-cafe.de/vdr/download/vdr-timer-info-0.3-1.3.38+.diff ++ ++03.03.2006: v0.4 - Thomas Gnther <tom@toms-cafe.de> ++ - Adapted to vdr-1.3.44 ++ - Removed setup parameter "Show timer-info" ++ http://toms-cafe.de/vdr/download/vdr-timer-info-0.4-1.3.44.diff ++ ++26.03.2006: - Tobias Grimm <tg@e-tobi.net> ++ - Adapted to vdr-1.3.45 ++ http://toms-cafe.de/vdr/download/vdr-timer-info-0.4-1.3.45.diff ++ ++14.01.2008: - Thomas Gnther <tom@toms-cafe.de> ++ - Adapted to vdr-1.5.13 ++ http://toms-cafe.de/vdr/download/vdr-timer-info-0.4-1.5.13.diff ++ ++17.02.2008: - Tobias Grimm <tg@e-tobi.net> ++ - Adapted to vdr-1.5.15 ++ http://toms-cafe.de/vdr/download/vdr-timer-info-0.4-1.5.15.diff ++ ++12.04.2008: v0.5 - Thomas Gnther <tom@toms-cafe.de> ++ - Fixed display of +/- sign with UTF-8 ++ http://toms-cafe.de/vdr/download/vdr-timer-info-0.5-1.5.15.diff ++ ++28.02.2010: - Thomas Gnther <tom@toms-cafe.de> ++ - Adapted to vdr-1.7.13 ++ http://toms-cafe.de/vdr/download/vdr-timer-info-0.5-1.7.13.diff +diff -Naurp vdr-1.7.13/menu.c vdr-1.7.13-timer-info-0.5/menu.c +--- vdr-1.7.13/menu.c 2010-02-21 14:09:19.000000000 +0000 ++++ vdr-1.7.13-timer-info-0.5/menu.c 2010-02-28 18:24:26.000000000 +0000 +@@ -1010,8 +1010,10 @@ eOSState cMenuEditTimer::ProcessKey(eKey + class cMenuTimerItem : public cOsdItem { + private: + cTimer *timer; ++ char diskStatus; + public: + cMenuTimerItem(cTimer *Timer); ++ void SetDiskStatus(char DiskStatus); + virtual int Compare(const cListObject &ListObject) const; + virtual void Set(void); + cTimer *Timer(void) { return timer; } +@@ -1020,6 +1022,7 @@ public: + cMenuTimerItem::cMenuTimerItem(cTimer *Timer) + { + timer = Timer; ++ diskStatus = ' '; + Set(); + } + +@@ -1050,7 +1053,10 @@ void cMenuTimerItem::Set(void) + File++; + else + File = timer->File(); +- SetText(cString::sprintf("%c\t%d\t%s%s%s\t%02d:%02d\t%02d:%02d\t%s", ++ cCharSetConv csc("ISO-8859-1", cCharSetConv::SystemCharacterTable()); ++ char diskStatusString[2] = { diskStatus, 0 }; ++ SetText(cString::sprintf("%s%c\t%d\t%s%s%s\t%02d:%02d\t%02d:%02d\t%s", ++ csc.Convert(diskStatusString), + !(timer->HasFlags(tfActive)) ? ' ' : timer->FirstDay() ? '!' : timer->Recording() ? '#' : '>', + timer->Channel()->Number(), + *name, +@@ -1063,6 +1069,57 @@ void cMenuTimerItem::Set(void) + File)); + } + ++void cMenuTimerItem::SetDiskStatus(char DiskStatus) ++{ ++ diskStatus = DiskStatus; ++ Set(); ++} ++ ++// --- cTimerEntry ----------------------------------------------------------- ++ ++class cTimerEntry : public cListObject { ++private: ++ cMenuTimerItem *item; ++ const cTimer *timer; ++ time_t start; ++public: ++ cTimerEntry(cMenuTimerItem *item) : item(item), timer(item->Timer()), start(timer->StartTime()) {} ++ cTimerEntry(const cTimer *timer, time_t start) : item(NULL), timer(timer), start(start) {} ++ virtual int Compare(const cListObject &ListObject) const; ++ bool active(void) const { return timer->HasFlags(tfActive); } ++ time_t startTime(void) const { return start; } ++ int priority(void) const { return timer->Priority(); } ++ int duration(void) const; ++ bool repTimer(void) const { return !timer->IsSingleEvent(); } ++ bool isDummy(void) const { return item == NULL; } ++ const cTimer *Timer(void) const { return timer; } ++ void SetDiskStatus(char DiskStatus); ++ }; ++ ++int cTimerEntry::Compare(const cListObject &ListObject) const ++{ ++ cTimerEntry *entry = (cTimerEntry *)&ListObject; ++ int r = startTime() - entry->startTime(); ++ if (r == 0) ++ r = entry->priority() - priority(); ++ return r; ++} ++ ++int cTimerEntry::duration(void) const ++{ ++ int dur = (timer->Stop() / 100 * 60 + timer->Stop() % 100) - ++ (timer->Start() / 100 * 60 + timer->Start() % 100); ++ if (dur < 0) ++ dur += 24 * 60; ++ return dur; ++} ++ ++void cTimerEntry::SetDiskStatus(char DiskStatus) ++{ ++ if (item) ++ item->SetDiskStatus(DiskStatus); ++} ++ + // --- cMenuTimers ----------------------------------------------------------- + + class cMenuTimers : public cOsdMenu { +@@ -1075,14 +1132,17 @@ private: + eOSState Info(void); + cTimer *CurrentTimer(void); + void SetHelpKeys(void); ++ void ActualiseDiskStatus(void); ++ bool actualiseDiskStatus; + public: + cMenuTimers(void); + virtual ~cMenuTimers(); ++ virtual void Display(void); + virtual eOSState ProcessKey(eKeys Key); + }; + + cMenuTimers::cMenuTimers(void) +-:cOsdMenu(tr("Timers"), 2, CHNUMWIDTH, 10, 6, 6) ++:cOsdMenu(tr("Timers"), 3, CHNUMWIDTH, 10, 6, 6) + { + helpKeys = -1; + for (cTimer *timer = Timers.First(); timer; timer = Timers.Next(timer)) { +@@ -1093,6 +1153,7 @@ cMenuTimers::cMenuTimers(void) + SetCurrent(First()); + SetHelpKeys(); + Timers.IncBeingEdited(); ++ actualiseDiskStatus = true; + } + + cMenuTimers::~cMenuTimers() +@@ -1131,7 +1192,7 @@ eOSState cMenuTimers::OnOff(void) + timer->OnOff(); + timer->SetEventFromSchedule(); + RefreshCurrent(); +- DisplayCurrent(true); ++ Display(); + if (timer->FirstDay()) + isyslog("timer %s first day set to %s", *timer->ToDescr(), *timer->PrintFirstDay()); + else +@@ -1190,6 +1251,67 @@ eOSState cMenuTimers::Info(void) + return osContinue; + } + ++void cMenuTimers::ActualiseDiskStatus(void) ++{ ++ if (!actualiseDiskStatus || !Count()) ++ return; ++ ++ // compute free disk space ++ int freeMB, freeMinutes, runshortMinutes; ++ VideoDiskSpace(&freeMB); ++ freeMinutes = int(double(freeMB) * 1.1 / MB_PER_MINUTE); // overestimate by 10 percent ++ runshortMinutes = freeMinutes / 5; // 20 Percent ++ ++ // fill entries list ++ cTimerEntry *entry; ++ cList<cTimerEntry> entries; ++ for (cOsdItem *item = First(); item; item = Next(item)) ++ entries.Add(new cTimerEntry((cMenuTimerItem *)item)); ++ ++ // search last start time ++ time_t last = 0; ++ for (entry = entries.First(); entry; entry = entries.Next(entry)) ++ last = max(entry->startTime(), last); ++ ++ // add entries for repeating timers ++ for (entry = entries.First(); entry; entry = entries.Next(entry)) ++ if (entry->repTimer() && !entry->isDummy()) ++ for (time_t start = cTimer::IncDay(entry->startTime(), 1); ++ start <= last; ++ start = cTimer::IncDay(start, 1)) ++ if (entry->Timer()->DayMatches(start)) ++ entries.Add(new cTimerEntry(entry->Timer(), start)); ++ ++ // set the disk-status ++ entries.Sort(); ++ for (entry = entries.First(); entry; entry = entries.Next(entry)) { ++ char status = ' '; ++ if (entry->active()) { ++ freeMinutes -= entry->duration(); ++ status = freeMinutes > runshortMinutes ? '+' : freeMinutes > 0 ? 177 /* +/- */ : '-'; ++ } ++ entry->SetDiskStatus(status); ++#ifdef DEBUG_TIMER_INFO ++ dsyslog("timer-info: %c | %d | %s | %s | %3d | %+5d -> %+5d", ++ status, ++ entry->startTime(), ++ entry->active() ? "aktiv " : "n.akt.", ++ entry->repTimer() ? entry->isDummy() ? " dummy " : "mehrmalig" : "einmalig ", ++ entry->duration(), ++ entry->active() ? freeMinutes + entry->duration() : freeMinutes, ++ freeMinutes); ++#endif ++ } ++ ++ actualiseDiskStatus = false; ++} ++ ++void cMenuTimers::Display(void) ++{ ++ ActualiseDiskStatus(); ++ cOsdMenu::Display(); ++} ++ + eOSState cMenuTimers::ProcessKey(eKeys Key) + { + int TimerNumber = HasSubMenu() ? Count() : -1; +@@ -1198,18 +1320,22 @@ eOSState cMenuTimers::ProcessKey(eKeys K + if (state == osUnknown) { + switch (Key) { + case kOk: return Edit(); +- case kRed: state = OnOff(); break; // must go through SetHelpKeys()! ++ case kRed: actualiseDiskStatus = true; ++ state = OnOff(); break; // must go through SetHelpKeys()! + case kGreen: return New(); +- case kYellow: state = Delete(); break; ++ case kYellow: actualiseDiskStatus = true; ++ state = Delete(); break; + case kInfo: + case kBlue: return Info(); + break; + default: break; + } + } +- if (TimerNumber >= 0 && !HasSubMenu() && Timers.Get(TimerNumber)) { +- // a newly created timer was confirmed with Ok +- Add(new cMenuTimerItem(Timers.Get(TimerNumber)), true); ++ if (TimerNumber >= 0 && !HasSubMenu()) { ++ if (Timers.Get(TimerNumber)) // a newly created timer was confirmed with Ok ++ Add(new cMenuTimerItem(Timers.Get(TimerNumber)), true); ++ Sort(); ++ actualiseDiskStatus = true; + Display(); + } + if (Key != kNone) --- vdr-1.7.14.orig/debian/patches/12_osdbase-maxitems.dpatch +++ vdr-1.7.14/debian/patches/12_osdbase-maxitems.dpatch @@ -0,0 +1,46 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run + +## 12_osdbase-maxitems.dpatch by Andreas Brugger <brougs78@gmx.net> +## +## downloaded from http://vdrportal.de/board/thread.php?postid=343665#post343665 +## original filename: vdr-1.3.28-osdbase-maxitems.diff +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Fixes problems with text2skin skin enigma. + +@DPATCH@ +diff -Nru vdr_plain/osdbase.c vdr_patched/osdbase.c +--- vdr_plain/osdbase.c 2005-06-18 12:30:51.000000000 +0200 ++++ vdr_patched/osdbase.c 2005-08-07 20:26:55.000000000 +0200 +@@ -261,6 +261,7 @@ + + void cOsdMenu::CursorUp(void) + { ++ displayMenuItems = displayMenu->MaxItems(); + int tmpCurrent = current; + int lastOnScreen = first + displayMenuItems - 1; + int last = Count() - 1; +@@ -291,6 +292,7 @@ + + void cOsdMenu::CursorDown(void) + { ++ displayMenuItems = displayMenu->MaxItems(); + int tmpCurrent = current; + int lastOnScreen = first + displayMenuItems - 1; + int last = Count() - 1; +@@ -323,6 +325,7 @@ + + void cOsdMenu::PageUp(void) + { ++ displayMenuItems = displayMenu->MaxItems(); + int oldCurrent = current; + int oldFirst = first; + current -= displayMenuItems; +@@ -357,6 +360,7 @@ + + void cOsdMenu::PageDown(void) + { ++ displayMenuItems = displayMenu->MaxItems(); + int oldCurrent = current; + int oldFirst = first; + current += displayMenuItems; --- vdr-1.7.14.orig/debian/patches/opt-35_setup-show-valid.dpatch +++ vdr-1.7.14/debian/patches/opt-35_setup-show-valid.dpatch @@ -0,0 +1,83 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run + +## opt-35_setup-show-valid.dpatch by ravemax at vdrportal.de +## +## downloaded from http://vdrportal.de/board/thread.php?threadid=25984 +## original file: setup_option-show_valid_input.patch.bz2 +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Show if there is a valid setup value left or right with < and >. + +@DPATCH@ +diff -ur vdr_orig/menuitems.c vdr_patched/menuitems.c +--- vdr_orig/menuitems.c 2004-12-05 17:59:12.452421104 +0100 ++++ vdr_patched/menuitems.c 2004-12-05 18:01:54.726751656 +0100 +@@ -31,12 +31,18 @@ + free(value); + } + +-void cMenuEditItem::SetValue(const char *Value) ++void cMenuEditItem::SetValue(const char *Value, bool HasPre, bool HasSucc) + { + free(value); + value = strdup(Value); + char *buffer = NULL; +- asprintf(&buffer, "%s:\t%s", name, value); ++ const char* fmt; ++ if (HasPre) ++ fmt = HasSucc ? "%s:\t<%s>" : "%s\t<%s"; ++ else ++ fmt = HasSucc ? "%s\t%s>" : "%s\t%s"; ++ ++ asprintf(&buffer, fmt, name, value); + SetText(buffer, false); + cStatus::MsgOsdCurrentItem(buffer); + } +@@ -56,7 +62,7 @@ + { + char buf[16]; + snprintf(buf, sizeof(buf), "%d", *value); +- SetValue(buf); ++ SetValue(buf, (*value > min), (*value < max)); + } + + eOSState cMenuEditIntItem::ProcessKey(eKeys Key) +@@ -111,7 +117,7 @@ + { + char buf[16]; + snprintf(buf, sizeof(buf), "%s", *value ? trueString : falseString); +- SetValue(buf); ++ SetValue(buf, *value, !*value); + } + + // --- cMenuEditBitItem ------------------------------------------------------ +@@ -459,7 +465,7 @@ + + void cMenuEditStraItem::Set(void) + { +- SetValue(strings[*value]); ++ SetValue(strings[*value], (*value > min), (*value < max)); + } + + // --- cMenuEditChanItem ----------------------------------------------------- +@@ -475,7 +481,7 @@ + char buf[255]; + cChannel *channel = Channels.GetByNumber(*value); + snprintf(buf, sizeof(buf), "%d %s", *value, channel ? channel->Name() : ""); +- SetValue(buf); ++ SetValue(buf, (*value > 1), (*value < Channels.MaxNumber())); + } + + eOSState cMenuEditChanItem::ProcessKey(eKeys Key) +diff -ur vdr_orig/menuitems.h vdr_patched/menuitems.h +--- vdr_orig/menuitems.h 2004-12-05 17:59:24.719556216 +0100 ++++ vdr_patched/menuitems.h 2004-12-05 18:04:29.681195000 +0100 +@@ -21,7 +21,7 @@ + public: + cMenuEditItem(const char *Name); + ~cMenuEditItem(); +- void SetValue(const char *Value); ++ void cMenuEditItem::SetValue(const char *Value, bool HasPre=false, bool HasSucc=false); + }; + + class cMenuEditIntItem : public cMenuEditItem { --- vdr-1.7.14.orig/debian/patches/opt-55_wareagleicon.dpatch +++ vdr-1.7.14/debian/patches/opt-55_wareagleicon.dpatch @@ -0,0 +1,297 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-55_wareagleicon.dpatch by <Gerald Dachs <gda@dachsweb.de>> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: No description. + +@DPATCH@ +diff -urNad vdr-1.7.13/config.c vdr-1.7.13-wareagle/config.c +--- vdr-1.7.13/config.c 2010-03-11 12:11:55.539648219 +0100 ++++ vdr-1.7.13-wareagle/config.c 2010-03-11 12:18:02.651481012 +0100 +@@ -314,6 +314,7 @@ + strcpy(OSDLanguage, ""); // default is taken from environment + strcpy(OSDSkin, "sttng"); + strcpy(OSDTheme, "default"); ++ WarEagleIcons = 1; + PrimaryDVB = 1; + ShowInfoOnChSwitch = 1; + TimeoutRequChInfo = 1; +@@ -528,6 +529,7 @@ + if (!strcasecmp(Name, "OSDLanguage")) { strn0cpy(OSDLanguage, Value, sizeof(OSDLanguage)); I18nSetLocale(OSDLanguage); } + else if (!strcasecmp(Name, "OSDSkin")) Utf8Strn0Cpy(OSDSkin, Value, MaxSkinName); + else if (!strcasecmp(Name, "OSDTheme")) Utf8Strn0Cpy(OSDTheme, Value, MaxThemeName); ++ else if (!strcasecmp(Name, "WarEagleIcons")) WarEagleIcons = atoi(Value); + else if (!strcasecmp(Name, "PrimaryDVB")) PrimaryDVB = atoi(Value); + else if (!strcasecmp(Name, "ShowInfoOnChSwitch")) ShowInfoOnChSwitch = atoi(Value); + else if (!strcasecmp(Name, "TimeoutRequChInfo")) TimeoutRequChInfo = atoi(Value); +@@ -644,6 +646,7 @@ + Store("OSDLanguage", OSDLanguage); + Store("OSDSkin", OSDSkin); + Store("OSDTheme", OSDTheme); ++ Store("WarEagleIcons", WarEagleIcons); + Store("PrimaryDVB", PrimaryDVB); + Store("ShowInfoOnChSwitch", ShowInfoOnChSwitch); + Store("TimeoutRequChInfo", TimeoutRequChInfo); +diff -urNad vdr-1.7.13/config.h vdr-1.7.13-wareagle/config.h +--- vdr-1.7.13/config.h 2010-03-11 12:11:55.539648219 +0100 ++++ vdr-1.7.13-wareagle/config.h 2010-03-11 12:18:29.222979346 +0100 +@@ -222,6 +222,7 @@ + char OSDLanguage[I18N_MAX_LOCALE_LEN]; + char OSDSkin[MaxSkinName]; + char OSDTheme[MaxThemeName]; ++ int WarEagleIcons; + int PrimaryDVB; + int ShowInfoOnChSwitch; + int TimeoutRequChInfo; +diff -urNad vdr-1.7.13/iconpatch.c vdr-1.7.13-wareagle/iconpatch.c +--- vdr-1.7.13/iconpatch.c 1970-01-01 01:00:00.000000000 +0100 ++++ vdr-1.7.13-wareagle/iconpatch.c 2010-03-11 12:19:21.407057356 +0100 +@@ -0,0 +1,28 @@ ++ ++#include "iconpatch.h" ++ ++#include <langinfo.h> ++#include <locale.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++ ++bool IsLangUtf8(void) ++{ ++ char *CodeSet = NULL; ++ if (setlocale(LC_CTYPE, "")) ++ CodeSet = nl_langinfo(CODESET); ++ else { ++ char *LangEnv = getenv("LANG"); // last resort in case locale stuff isn't installed ++ if (LangEnv) { ++ CodeSet = strchr(LangEnv, '.'); ++ if (CodeSet) ++ CodeSet++; // skip the dot ++ } ++ } ++ ++ if (CodeSet && strcasestr(CodeSet, "UTF-8") != 0) ++ return true; ++ ++ return false; ++} +diff -urNad vdr-1.7.13/iconpatch.h vdr-1.7.13-wareagle/iconpatch.h +--- vdr-1.7.13/iconpatch.h 1970-01-01 01:00:00.000000000 +0100 ++++ vdr-1.7.13-wareagle/iconpatch.h 2010-03-11 12:20:38.478643964 +0100 +@@ -0,0 +1,72 @@ ++/* ++ * iconpatch.h: Information of iconpatch ++ * ++ * Diese Datei ist die Übersichtsdatei für den Iconpatch. ++ * Hier werden kleine Infos abgelegt. ++ * Der Iconpatch ändert die Dateien: ++ * iconpatch.h ++ * menu.c ++ * recording.c ++ * fontosd.c ++ * ++ */ ++ ++// Iconpatch-Variablen - Anfang ++#define ICON_NUMBERSIGN "\x23" ++#define ICON_ASTERISK "\x2A" ++#define ICON_GREATER "\x3E" ++#define ICON_EXCLAM "\x21" ++#define ICON_PLUSMINUS "\xB1" ++ ++#define ICON_RESUME "\x80" ++#define ICON_DVD "\x81" ++#define ICON_FOLDER "\x82" ++#define ICON_BLANK "\x83" ++#define ICON_CUTTING "\x84" ++#define ICON_MOVE_FILE "\x85" ++#define ICON_MOVE_FOLDER "\x86" ++#define ICON_BAR_START "\x87" ++#define ICON_BAR_FILLED "\x88" ++#define ICON_BAR_CLEAR "\x89" ++#define ICON_BAR_END "\x8A" ++#define ICON_REC "\x8B" ++#define ICON_CLOCK "\x8C" ++#define ICON_TV_CRYPTED "\x8D" ++#define ICON_RADIO "\x8E" ++#define ICON_TV "\x8F" ++#define ICON_NEW "\x90" ++#define ICON_ARROW "\x91" ++#define ICON_RUNNING "\x92" ++#define ICON_VPS "\x93" ++#define ICON_CLOCK_UH "\x94" ++#define ICON_CLOCK_LH "\x95" ++ ++// UTF-8 Icons ++#define ICON_RESUME_UTF8 "\uE000" ++#define ICON_DVD_UTF8 "\uE001" ++#define ICON_FOLDER_UTF8 "\uE002" ++#define ICON_BLANK_UTF8 "\uE003" ++#define ICON_CUTTING_UTF8 "\uE004" ++#define ICON_MOVE_FILE_UTF8 "\uE005" ++#define ICON_MOVE_FOLDER_UTF8 "\uE006" ++#define ICON_BAR_START_UTF8 "\uE007" ++#define ICON_BAR_FILLED_UTF8 "\uE008" ++#define ICON_BAR_EMPTY_UTF8 "\uE009" ++#define ICON_BAR_CLOSE_UTF8 "\uE00A" ++#define ICON_REC_UTF8 "\uE00B" ++#define ICON_CLOCK_UTF8 "\uE00C" ++#define ICON_TV_CRYPTED_UTF8 "\uE00D" ++#define ICON_RADIO_UTF8 "\uE00E" ++#define ICON_TV_UTF8 "\uE00F" ++#define ICON_NEW_UTF8 "\uE010" ++#define ICON_ARROW_UTF8 "\uE011" ++#define ICON_RUNNING_UTF8 "\uE012" ++#define ICON_VPS_UTF8 "\uE013" ++#define ICON_CLOCK_UH_UTF8 "\uE014" ++#define ICON_CLOCK_LH_UTF8 "\uE015" ++ ++// Iconpatch-Variablen - Ende ++ ++bool IsLangUtf8(void); ++ ++ +diff -urNad vdr-1.7.13/Makefile vdr-1.7.13-wareagle/Makefile +--- vdr-1.7.13/Makefile 2010-03-11 12:11:55.375145341 +0100 ++++ vdr-1.7.13-wareagle/Makefile 2010-03-11 12:16:42.930696547 +0100 +@@ -48,6 +48,8 @@ + + OBJS += childlock.o + ++OBJS += iconpatch.o ++ + ifndef NO_KBD + DEFINES += -DREMOTE_KBD + endif +diff -urNad vdr-1.7.13/menu.c vdr-1.7.13-wareagle/menu.c +--- vdr-1.7.13/menu.c 2010-03-11 12:11:55.543637134 +0100 ++++ vdr-1.7.13-wareagle/menu.c 2010-03-11 12:32:08.178636211 +0100 +@@ -8,6 +8,7 @@ + */ + + #include "menu.h" ++#include "iconpatch.h" + #include <ctype.h> + #include <limits.h> + #include <math.h> +@@ -346,6 +347,15 @@ + if (!channel->GroupSep()) { + if (sortMode == csmProvider) + buffer = cString::sprintf("%d\t%s - %s", channel->Number(), channel->Provider(), channel->Name()); ++ else if (Setup.WarEagleIcons) { ++ if (channel->Vpid() == 1 || channel->Vpid() == 0) ++ buffer = cString::sprintf("%d\t%s %-30s", channel->Number(), IsLangUtf8() ? ICON_RADIO_UTF8 : ICON_RADIO, channel->Name()); ++ else if (channel->Ca() == 0) ++ buffer = cString::sprintf("%d\t%s %-30s", channel->Number(), IsLangUtf8() ? ICON_TV_UTF8 : ICON_TV, channel->Name()); ++ else ++ buffer = cString::sprintf("%d\t%s %-30s", channel->Number(), IsLangUtf8() ? ICON_TV_CRYPTED_UTF8 : ICON_TV_CRYPTED, channel->Name()); ++ } ++ + else + buffer = cString::sprintf("%d\t%s", channel->Number(), channel->Name()); + } +@@ -1064,9 +1074,9 @@ + File = timer->File(); + cCharSetConv csc("ISO-8859-1", cCharSetConv::SystemCharacterTable()); + char diskStatusString[2] = { diskStatus, 0 }; +- SetText(cString::sprintf("%s%c\t%d\t%s%s%s\t%02d:%02d\t%02d:%02d\t%s", +- csc.Convert(diskStatusString), +- !(timer->HasFlags(tfActive)) ? ' ' : timer->FirstDay() ? '!' : timer->Recording() ? '#' : '>', ++ ++ SetText(cString::sprintf("%s\t%d\t%s%s%s\t%02d:%02d\t%02d:%02d\t%s", ++ !(timer->HasFlags(tfActive)) ? " " : timer->FirstDay() ? Setup.WarEagleIcons ? IsLangUtf8() ? ICON_ARROW_UTF8 : ICON_ARROW : "!" : timer->Recording() ? Setup.WarEagleIcons ? IsLangUtf8() ? ICON_REC_UTF8 : ICON_REC : "#" : Setup.WarEagleIcons ? IsLangUtf8() ? ICON_CLOCK_UTF8 : ICON_CLOCK : ">", + timer->Channel()->Number(), + *name, + *name && **name ? " " : "", +@@ -1455,7 +1465,12 @@ + return r; + } + +-static const char *TimerMatchChars = " tT"; ++static const char *TimerMatchChars[9] = ++{ ++ " ", "t", "T", ++ ICON_BLANK, ICON_CLOCK_UH, ICON_CLOCK, ++ ICON_BLANK_UTF8, ICON_CLOCK_UH_UTF8, ICON_CLOCK_UTF8 ++}; + + static const char * const ProgressBar[7] = + { +@@ -1475,24 +1490,24 @@ + Timers.GetMatch(event, &timerMatch); + if (Force || timerMatch != OldTimerMatch) { + cString buffer; +- char t = TimerMatchChars[timerMatch]; +- char v = event->Vps() && (event->Vps() - event->StartTime()) ? 'V' : ' '; +- char r = event->SeenWithin(30) && event->IsRunning() ? '*' : ' '; ++ const char *t = Setup.WarEagleIcons ? IsLangUtf8() ? TimerMatchChars[timerMatch+6] : TimerMatchChars[timerMatch+3] : TimerMatchChars[timerMatch]; ++ const char *v = event->Vps() && (event->Vps() - event->StartTime()) ? Setup.WarEagleIcons ? IsLangUtf8() ? ICON_VPS_UTF8 : ICON_VPS : "V" : " "; ++ const char *r = event->SeenWithin(30) && event->IsRunning() ? Setup.WarEagleIcons ? IsLangUtf8() ? ICON_RUNNING_UTF8 : ICON_RUNNING : "*" : " "; + const char *csn = channel ? channel->ShortName(true) : NULL; + cString eds = event->GetDateString(); + if (channel && withDate) +- buffer = cString::sprintf("%d\t%.*s\t%.*s\t%s\t%c%c%c\t%s", channel->Number(), Utf8SymChars(csn, 6), csn, Utf8SymChars(eds, 6), *eds, *event->GetTimeString(), t, v, r, event->Title()); ++ buffer = cString::sprintf("%d\t%.*s\t%.*s\t%s\t%s%s%s\t%s", channel->Number(), Utf8SymChars(csn, 6), csn, Utf8SymChars(eds, 6), *eds, *event->GetTimeString(), t, v, r, event->Title()); + else if (channel) + if (Setup.ShowProgressBar && withBar) { + int progress = (int)roundf( (float)(time(NULL) - event->StartTime()) / (float)(event->Duration()) * 6.0 ); + if (progress < 0) progress = 0; + else if (progress > 6) progress = 6; +- buffer = cString::sprintf("%d\t%.*s\t%s\t%s\t%c%c%c\t%s", channel->Number(), Utf8SymChars(csn, 6), csn, *event->GetTimeString(), ProgressBar[progress], t, v, r, event->Title()); ++ buffer = cString::sprintf("%d\t%.*s\t%s\t%s\t%s%s%s\t%s", channel->Number(), Utf8SymChars(csn, 6), csn, *event->GetTimeString(), ProgressBar[progress], t, v, r, event->Title()); + } + else +- buffer = cString::sprintf("%d\t%.*s\t%s\t%c%c%c\t%s", channel->Number(), Utf8SymChars(csn, 6), csn, *event->GetTimeString(), t, v, r, event->Title()); ++ buffer = cString::sprintf("%d\t%.*s\t%s\t%s%s%s\t%s", channel->Number(), Utf8SymChars(csn, 6), csn, *event->GetTimeString(), t, v, r, event->Title()); + else +- buffer = cString::sprintf("%.*s\t%s\t%c%c%c\t%s", Utf8SymChars(eds, 6), *eds, *event->GetTimeString(), t, v, r, event->Title()); ++ buffer = cString::sprintf("%.*s\t%s\t%s%s%s\t%s", Utf8SymChars(eds, 6), *eds, *event->GetTimeString(), t, v, r, event->Title()); + SetText(buffer); + result = true; + } +@@ -2926,6 +2941,7 @@ + Add(new cMenuEditStraItem(tr("Setup.OSD$Skin"), &skinIndex, numSkins, skinDescriptions)); + if (themes.NumThemes()) + Add(new cMenuEditStraItem(tr("Setup.OSD$Theme"), &themeIndex, themes.NumThemes(), themes.Descriptions())); ++ Add(new cMenuEditBoolItem(tr("Setup.OSD$WarEagle icons"), &data.WarEagleIcons)); + Add(new cMenuEditPrcItem( tr("Setup.OSD$Left (%)"), &data.OSDLeftP, 0.0, 0.5)); + Add(new cMenuEditPrcItem( tr("Setup.OSD$Top (%)"), &data.OSDTopP, 0.0, 0.5)); + Add(new cMenuEditPrcItem( tr("Setup.OSD$Width (%)"), &data.OSDWidthP, 0.5, 1.0)); +diff -urNad vdr-1.7.13/recording.c vdr-1.7.13-wareagle/recording.c +--- vdr-1.7.13/recording.c 2010-03-11 12:11:55.519659746 +0100 ++++ vdr-1.7.13-wareagle/recording.c 2010-03-11 12:34:25.863488445 +0100 +@@ -8,6 +8,7 @@ + */ + + #include "recording.h" ++#include "iconpatch.h" + #include <ctype.h> + #include <dirent.h> + #include <errno.h> +@@ -849,7 +850,7 @@ + + const char *cRecording::Title(char Delimiter, bool NewIndicator, int Level, bool Original) const + { +- char New = NewIndicator && IsNew() ? '*' : ' '; ++ const char *New = NewIndicator && IsNew() ? Setup.WarEagleIcons ? IsLangUtf8() ? ICON_NEW_UTF8 : ICON_NEW : "*" : " "; + free(titleBuffer); + titleBuffer = NULL; + if (Level < 0 || Level == HierarchyLevels()) { +@@ -861,7 +862,7 @@ + else + s = name; + if (Original) { +- titleBuffer = strdup(cString::sprintf("%02d.%02d.%02d%c%02d:%02d%c%c%s", ++ titleBuffer = strdup(cString::sprintf("%02d.%02d.%02d%c%02d:%02d%s%c%s", + t->tm_mday, + t->tm_mon + 1, + t->tm_year % 100, +@@ -882,7 +883,7 @@ + cString RecDate = cString::sprintf("%02d.%02d.%02d", t->tm_mday, t->tm_mon + 1, t->tm_year % 100); + cString RecTime = cString::sprintf("%02d:%02d", t->tm_hour, t->tm_min); + cString RecDelimiter = cString::sprintf("%c", Delimiter); +- titleBuffer = strdup(cString::sprintf("%s%s%s%c%s%s%s%s", ++ titleBuffer = strdup(cString::sprintf("%s%s%s%s%s%s%s%s", + (Setup.ShowRecDate ? *RecDate : ""), + (Setup.ShowRecDate && Setup.ShowRecTime ? *RecDelimiter : ""), + (Setup.ShowRecTime ? *RecTime : ""), --- vdr-1.7.14.orig/debian/patches/patchtest +++ vdr-1.7.14/debian/patches/patchtest @@ -0,0 +1,187 @@ +#!/bin/bash + +# Define some patch levels here: foo="patch1 patch2 ..." +# +standard="\ + 04_newplugin \ + 06_default_svdrp_port_0 \ + 11_sortrecordings \ + 12_osdbase-maxitems \ + 16_channels.conf.terr-fix \ + 81_Make_config \ + 82_valgrind \ + 99_ncursesw-include \ + 99_vdr-workaround-broken-sys-capability" +multipatch="$standard \ + opt-20_liemikuutio \ + opt-21_internal-cam-devices \ + opt-22-x_edit_marks \ + opt-24_jumpplay \ + opt-27_ttxtsubs \ + opt-31-x_reelchannelscan \ + opt-37-x_menuorg \ + opt-38_disableDoubleEpgEntrys \ + opt-39_noepg \ + opt-41-x_timer-info \ + opt-42-x_MainMenuHooks \ + opt-43-x_recordshowfree \ + opt-44_rotor \ + opt-45_yaepg \ + opt-48-x_pin \ + opt-50_graphtft \ + opt-50_graphtft-liemikuutio \ + opt-91_ext-graphtft \ + opt-51_cuttime \ + opt-52_hard_link_cutter" +testpatch="$standard \ + opt-20_liemikuutio \ + opt-21_internal-cam-devices \ + opt-24_jumpplay \ + opt-27_ttxtsubs \ + opt-29_syncearly \ + opt-31-x_reelchannelscan \ + opt-37-x_menuorg \ + opt-38_disableDoubleEpgEntrys \ + opt-39_noepg \ + opt-41-x_timer-info \ + opt-42-x_MainMenuHooks \ + opt-44_rotor \ + opt-45_yaepg \ + opt-48-x_pin \ + opt-50_graphtft \ + opt-51_cuttime \ + opt-52_hard_link_cutter" +mustfail_patch="XX_patchtest-patch-error" +mustfail_compile="XX_patchtest-compile-error" + +# List the patch levels to be tested: +# +patchLevels=(\ + "standard $standard"\ + "multipatch $multipatch"\ + "testpatch $testpatch"\ + "mustfail_patch $mustfail_patch"\ + "mustfail_compile $mustfail_compile") + +currentDir=`pwd` + +testPatchLevel () +{ + patchLevelName=$1 + tempDir=/tmp/vdr.$$.tmp + mkdir -p $tempDir + cp -r . $tempDir/vdr + cd $tempDir/vdr + # don't use dpatch: + touch patch-stamp + Failed="false" + shift + while [ "$1" ] + do + if [ $SOLVE = "true" ] ; then + rm -rf ../vdr.orig + cp -r . ../vdr.orig + fi + chmod a+x debian/patches/$1.dpatch + debian/patches/$1.dpatch -patch >/tmp/patchtest_patch.log 2>&1 + if [ $? -ne 0 ] ; then + echo "FAILED $patchLevelName at $1" + Failed="true" + break + fi + shift + done + + if [ $Failed = "false" ] ; then + if [ $QUICK = "true" ] ; then + echo " OK $patchLevelName" + else + fakeroot debian/rules binary >/tmp/patchtest_build.log 2>&1 + if [ $? -ne 0 ] ; then + Failed="true" + echo "FAILED $patchLevelName - Build Error" + else + echo " OK $patchLevelName" + fi + fi + fi + if [ $Failed = "true" -a $SOLVE = "true" ] ; then + cd .. + exit 1 + fi + cd $currentDir + rm -rf $tempDir +} + +listPatchLevels () +{ + len=${#patchLevels[*]} + i=0 + while [ $i -lt $len ] + do + patchset=${patchLevels[$i]} + isPatchLevelName="true" + for patch in $patchset + do + if [ "$isPatchLevelName" = "true" ] ; then + echo "[$patch] contains these patches:" + else + echo -n "$patch, " + fi + isPatchLevelName="false" + done + let i++ + echo + echo + done +} + + +testPatchLevels () +{ + len=${#patchLevels[*]} + i=0 + while [ $i -lt $len ] + do + patchset=${patchLevels[$i]} + testPatchLevel $patchset + let i++ + done +} + +echo +echo "Patch-Level-Test" +echo "----------------" +echo + +QUICK='false' +SOLVE='false' + +case $1 in + --help) + echo "Usage: debian/patches/patchtest [ --help | --quick | --solve ]" + echo + echo "With the --quick option no compilation will be performed." + echo "Using the --solve option will stop the test on failure and open" + echo "a new shell where you can solve any problems." + echo + exit 0 + ;; + --quick) + QUICK="true" + ;; + --solve) + QUICK="true" + SOLVE="true" + ;; +esac + +if [ -d debian/patches ] ; then + listPatchLevels + echo + testPatchLevels +else + echo "Could not find debian/patches" +fi + +echo --- vdr-1.7.14.orig/debian/patches/opt-53_dvbsetup.dpatch +++ vdr-1.7.14/debian/patches/opt-53_dvbsetup.dpatch @@ -0,0 +1,207 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-53_dvbsetup.dpatch by Tobias Grimm <tg@e-tobi.net> +## +## Thomas Gnther <tom@toms-cafe.de>: +## - updated to version of extensions patch 72 +## - adapted to VDR-1.7.8 with noepg patch +## - solved conflicts with other patches +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Setup for AC3 transfer and Channel Blocker +## DP: Taken from the Zulu extensions patch 72 +## DP: See http://www.zulu-entertainment.de/download.php?group=VDR + +@DPATCH@ +diff -Naurp vdr-1.7.8-noepg/config.c vdr-1.7.8-noepg-dvbsetup/config.c +--- vdr-1.7.8-noepg/config.c 2009-06-15 21:04:42.000000000 +0000 ++++ vdr-1.7.8-noepg-dvbsetup/config.c 2009-06-15 21:52:59.000000000 +0000 +@@ -234,6 +234,10 @@ cSetup::cSetup(void) + SetSystemTime = 0; + TimeSource = 0; + TimeTransponder = 0; ++ DolbyTransferFix = 1; ++ ChannelBlocker = 0; ++ ChannelBlockerMode = 0; ++ ChannelBlockerList = strdup(""); + noEPGMode=0; + noEPGList=strdup(""); + MarginStart = 2; +@@ -306,12 +310,15 @@ cSetup::cSetup(void) + + cSetup::~cSetup() + { ++ free(ChannelBlockerList); + free(noEPGList); + } + + cSetup& cSetup::operator= (const cSetup &s) + { + memcpy(&__BeginData__, &s.__BeginData__, (char *)&s.__EndData__ - (char *)&s.__BeginData__); ++ free(ChannelBlockerList); ++ ChannelBlockerList = strdup(s.ChannelBlockerList); + free(noEPGList); + noEPGList = strdup(s.noEPGList); + return *this; +@@ -430,6 +437,13 @@ bool cSetup::Parse(const char *Name, con + else if (!strcasecmp(Name, "SetSystemTime")) SetSystemTime = atoi(Value); + else if (!strcasecmp(Name, "TimeSource")) TimeSource = cSource::FromString(Value); + else if (!strcasecmp(Name, "TimeTransponder")) TimeTransponder = atoi(Value); ++ else if (!strcasecmp(Name, "DolbyTransferFix")) DolbyTransferFix = atoi(Value); ++ else if (!strcasecmp(Name, "ChannelBlocker")) ChannelBlocker = atoi(Value); ++ else if (!strcasecmp(Name, "ChannelBlockerMode")) ChannelBlockerMode = atoi(Value); ++ else if (!strcasecmp(Name, "ChannelBlockerList")) { ++ free(ChannelBlockerList); ++ ChannelBlockerList = strdup(Value ? Value : ""); ++ } + else if (!strcasecmp(Name, "noEPGMode")) noEPGMode = atoi(Value); + else if (!strcasecmp(Name, "noEPGList")) { + free(noEPGList); +@@ -527,6 +541,10 @@ bool cSetup::Save(void) + Store("SetSystemTime", SetSystemTime); + Store("TimeSource", cSource::ToString(TimeSource)); + Store("TimeTransponder", TimeTransponder); ++ Store("DolbyTransferFix", DolbyTransferFix); ++ Store("ChannelBlocker", ChannelBlocker); ++ Store("ChannelBlockerMode", ChannelBlockerMode); ++ Store("ChannelBlockerList", ChannelBlockerList); + Store("noEPGMode", noEPGMode); + Store("noEPGList", noEPGList); + Store("MarginStart", MarginStart); +diff -Naurp vdr-1.7.8-noepg/config.h vdr-1.7.8-noepg-dvbsetup/config.h +--- vdr-1.7.8-noepg/config.h 2009-06-15 21:02:48.000000000 +0000 ++++ vdr-1.7.8-noepg-dvbsetup/config.h 2009-06-15 21:28:57.000000000 +0000 +@@ -218,6 +218,9 @@ public: + int SetSystemTime; + int TimeSource; + int TimeTransponder; ++ int DolbyTransferFix; ++ int ChannelBlocker; ++ int ChannelBlockerMode; + int noEPGMode; + int MarginStart, MarginStop; + int AudioLanguages[I18N_MAX_LANGUAGES + 1]; +@@ -275,6 +278,7 @@ public: + int InitialVolume; + int EmergencyExit; + int __EndData__; ++ char *ChannelBlockerList; // pointer not to be flat-copied + char *noEPGList; // pointer not to be flat-copied + cSetup(void); + ~cSetup(); +diff -Naurp vdr-1.7.8-noepg/dvbdevice.c vdr-1.7.8-noepg-dvbsetup/dvbdevice.c +--- vdr-1.7.8-noepg/dvbdevice.c 2009-06-06 11:17:20.000000000 +0000 ++++ vdr-1.7.8-noepg-dvbsetup/dvbdevice.c 2009-06-15 21:54:49.000000000 +0000 +@@ -241,6 +241,7 @@ bool cDvbTuner::SetFrontend(void) + } + } + diseqcCommands = diseqc->Commands(); ++ isyslog("Sent DISEQC command: %s", diseqcCommands); + } + frequency -= diseqc->Lof(); + } +@@ -483,6 +484,9 @@ cDvbDevice::cDvbDevice(int n) + + if (fd_frontend >= 0) { + if (ioctl(fd_frontend, FE_GET_INFO, &frontendInfo) >= 0) { ++ if (Setup.ChannelBlockerMode == 4) ++ frontendType = (n == Setup.PrimaryDVB - 1) ? SYS_UNDEFINED : frontendType; ++ else + switch (frontendInfo.type) { + case FE_QPSK: frontendType = (frontendInfo.caps & FE_CAN_2G_MODULATION) ? SYS_DVBS2 : SYS_DVBS; break; + case FE_OFDM: frontendType = SYS_DVBT; break; +@@ -796,6 +800,11 @@ void cDvbDevice::GetOsdSize(int &Width, + + bool cDvbDevice::SetAudioBypass(bool On) + { ++ if (Setup.DolbyTransferFix && On) { ++ cChannel *c=Channels.GetByNumber(cDevice::CurrentChannel()); ++ if (c->Ca(0) != 0) ++ return false; ++ } + if (setTransferModeForDolbyDigital != 1) + return false; + return ioctl(fd_audio, AUDIO_SET_BYPASS_MODE, On) == 0; +@@ -909,6 +918,20 @@ bool cDvbDevice::ProvidesSource(int Sour + + bool cDvbDevice::ProvidesTransponder(const cChannel *Channel) const + { ++ if (Setup.ChannelBlocker != 0) { ++ if ((Setup.ChannelBlockerMode == 0) || ++ (Setup.ChannelBlockerMode == 1 && HasDecoder()) || ++ (Setup.ChannelBlockerMode == 2 && IsPrimaryDevice()) || ++ (Setup.ChannelBlockerMode == 3 && IsPrimaryDevice() && HasDecoder())) { ++ if ((Setup.ChannelBlocker == 1 && cSource::IsCable(Channel->Source()) && Channel->Modulation() == QAM_256) || ++ (Setup.ChannelBlocker == 2 && cSource::IsCable(Channel->Source())) || ++ (Setup.ChannelBlocker == 3 && cSource::IsSat(Channel->Source())) || ++ (Setup.ChannelBlocker == 4 && strstr(::Setup.ChannelBlockerList, Channel->GetChannelID().ToString()) != NULL) || // blacklist ++ (Setup.ChannelBlocker == 5 && strstr(::Setup.ChannelBlockerList, Channel->GetChannelID().ToString()) == NULL) || // whitelist ++ (Setup.ChannelBlocker == 6)) ++ return false; ++ } ++ } + if (!ProvidesSource(Channel->Source())) + return false; // doesn't provide source + if (!cSource::IsSat(Channel->Source())) +@@ -920,6 +943,20 @@ bool cDvbDevice::ProvidesTransponder(con + + bool cDvbDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers) const + { ++ if (Setup.ChannelBlocker != 0) { ++ if ((Setup.ChannelBlockerMode == 0) || ++ (Setup.ChannelBlockerMode == 1 && HasDecoder()) || ++ (Setup.ChannelBlockerMode == 2 && IsPrimaryDevice()) || ++ (Setup.ChannelBlockerMode == 3 && IsPrimaryDevice() && HasDecoder())) { ++ if ((Setup.ChannelBlocker == 1 && cSource::IsCable(Channel->Source()) && Channel->Modulation() == QAM_256) || ++ (Setup.ChannelBlocker == 2 && cSource::IsCable(Channel->Source())) || ++ (Setup.ChannelBlocker == 3 && cSource::IsSat(Channel->Source())) || ++ (Setup.ChannelBlocker == 4 && strstr(::Setup.ChannelBlockerList, Channel->GetChannelID().ToString()) != NULL) || // blacklist ++ (Setup.ChannelBlocker == 5 && strstr(::Setup.ChannelBlockerList, Channel->GetChannelID().ToString()) == NULL) || // whitelist ++ (Setup.ChannelBlocker == 6)) ++ return false; ++ } ++ } + bool result = false; + bool hasPriority = Priority < 0 || Priority > this->Priority(); + bool needsDetachReceivers = false; +diff -Naurp vdr-1.7.8-noepg/menu.c vdr-1.7.8-noepg-dvbsetup/menu.c +--- vdr-1.7.8-noepg/menu.c 2009-06-15 21:06:02.000000000 +0000 ++++ vdr-1.7.8-noepg-dvbsetup/menu.c 2009-06-15 21:58:36.000000000 +0000 +@@ -2385,6 +2385,8 @@ eOSState cMenuSetupEPG::ProcessKey(eKeys + + class cMenuSetupDVB : public cMenuSetupBase { + private: ++ const char *ChannelBlockers[7]; ++ const char *ChannelBlockerModes[4]; + int originalNumAudioLanguages; + int numAudioLanguages; + int originalNumSubtitleLanguages; +@@ -2423,6 +2425,19 @@ void cMenuSetupDVB::Setup(void) + { + int current = Current(); + ++ ChannelBlockers[0] = tr("none"); ++ ChannelBlockers[1] = tr("qam256"); ++ ChannelBlockers[2] = tr("dvb-c"); ++ ChannelBlockers[3] = tr("dvb-s"); ++ ChannelBlockers[4] = tr("blacklist"); ++ ChannelBlockers[5] = tr("whitelist"); ++ ChannelBlockers[6] = tr("all"); ++ ++ ChannelBlockerModes[0] = tr("none"); ++ ChannelBlockerModes[1] = tr("has decoder"); ++ ChannelBlockerModes[2] = tr("is primary"); ++ ChannelBlockerModes[3] = tr("has decoder + is primary"); ++ + Clear(); + + Add(new cMenuEditIntItem( tr("Setup.DVB$Primary DVB interface"), &data.PrimaryDVB, 1, cDevice::NumDevices())); +@@ -2443,6 +2458,9 @@ void cMenuSetupDVB::Setup(void) + Add(new cMenuEditIntItem( tr("Setup.DVB$Subtitle foreground transparency"), &data.SubtitleFgTransparency, 0, 9)); + Add(new cMenuEditIntItem( tr("Setup.DVB$Subtitle background transparency"), &data.SubtitleBgTransparency, 0, 10)); + } ++ Add(new cMenuEditBoolItem(tr("Setup.DVB$Use AC3-Transfer Fix"), &data.DolbyTransferFix)); ++ Add(new cMenuEditStraItem(tr("Setup.DVB$Channel Blocker"), &data.ChannelBlocker, 7, ChannelBlockers)); ++ Add(new cMenuEditStraItem(tr("Setup.DVB$Channel Blocker Filter Mode"), &data.ChannelBlockerMode, 4, ChannelBlockerModes)); + + SetCurrent(Get(current)); + Display(); --- vdr-1.7.14.orig/debian/patches/16_channels.conf.terr-fix.dpatch +++ vdr-1.7.14/debian/patches/16_channels.conf.terr-fix.dpatch @@ -0,0 +1,20 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run + +## 16_channels.conf.terr-fix.dpatch by Thomas Schmidt <tschmidt@debian.org> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Removes Ch 14 fom example channels.conf.terr, because the entry is +## DP: invalid (reported as Ubuntu Bug #45721) + +@DPATCH@ +diff -urNad vdr-1.4.1~/channels.conf.terr vdr-1.4.1/channels.conf.terr +--- vdr-1.4.1~/channels.conf.terr 2005-01-16 16:54:57.000000000 +0100 ++++ vdr-1.4.1/channels.conf.terr 2006-08-13 15:19:13.000000000 +0200 +@@ -9,7 +9,6 @@ + bid-up.tv (TV):561833:I0C23D0M64B8T2G32Y0:T:27500:6273:6274:0:0:14272:0:0:0 + CBBC (TV):505833:I0C34D0M16B8T2G32Y0:T:27500:620:621,622:0:0:4671:0:0:0 + Cbeebies (TV):529833:I0C34D0M16B8T2G32Y0:T:27500:201:401,402:0:0:16960:0:0:0 +-Ch 14 (TV):481833:I0C23D0M64B8T2G32Y0:T:27500:2840:2841:2843:0:0:8800:0:0 + Ch 32 (TV):537833:I0C34D0M16B8T2G32Y0:T:27500:501:502,504:0:0:25984:0:0:0 + Ch 44 (TV):537833:I0C34D0M16B8T2G32Y0:T:27500:501:502,504:0:0:26048:0:0:0 + Channel 4 (TV):481833:I0C23D0M64B8T2G32Y0:T:27500:2827:2828,2830:0:0:8384:0:0:0 --- vdr-1.7.14.orig/debian/patches/09_sort_options.dpatch +++ vdr-1.7.14/debian/patches/09_sort_options.dpatch @@ -0,0 +1,104 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run + +## 11_sort_options.dpatch by Darren Salt and Luca Olivetti <luca@ventoso.org> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: [LO] Add sort-by-source options. +## DP: [DS] Add sort-by-provider-then-channel-number options. + +@DPATCH@ +diff -urNad vdr-1.5.15~/menu.c vdr-1.5.15/menu.c +--- vdr-1.5.15~/menu.c 2008-02-17 21:05:46.000000000 +0100 ++++ vdr-1.5.15/menu.c 2008-02-17 21:09:06.000000000 +0100 +@@ -359,14 +359,18 @@ + + class cMenuChannelItem : public cOsdItem { + public: +- enum eChannelSortMode { csmNumber, csmName, csmProvider }; ++ enum eChannelSortMode { ++ csmNumber, csmName, csmProvider, csmProviderNumber, ++ csmSourceNumber, csmSourceName, csmSourceProvider, csmSourceProviderNumber, ++ csmLAST ++ }; + private: + static eChannelSortMode sortMode; + cChannel *channel; + public: + cMenuChannelItem(cChannel *Channel); + static void SetSortMode(eChannelSortMode SortMode) { sortMode = SortMode; } +- static void IncSortMode(void) { sortMode = eChannelSortMode((sortMode == csmProvider) ? csmNumber : sortMode + 1); } ++ static void IncSortMode(void) { sortMode = eChannelSortMode(sortMode + 1); if (sortMode == csmLAST) sortMode = csmNumber; } + static eChannelSortMode SortMode(void) { return sortMode; } + virtual int Compare(const cListObject &ListObject) const; + virtual void Set(void); +@@ -383,13 +387,46 @@ + Set(); + } + ++static int snum(int source) ++{ ++ int stype = (source & cSource::st_Mask); ++ // arbitrary order: sat, cable, terrestrial, none ++ int r; ++ switch(stype) { ++ case cSource::stCable: ++ r=0x7FF0; ++ break; ++ case cSource::stTerr: ++ r=0x7FF2; ++ break; ++ case cSource::stSat: ++ r=source & cSource::st_Pos; ++ if (source & cSource::st_Neg) r*=-1; ++ break; ++ default: //stNone or unknown ++ r=0x7FFF; ++ } ++ return r; ++} ++ + int cMenuChannelItem::Compare(const cListObject &ListObject) const + { + cMenuChannelItem *p = (cMenuChannelItem *)&ListObject; + int r = -1; +- if (sortMode == csmProvider) ++ if (sortMode >= csmSourceNumber) { ++ int rsource = snum(channel->Source()) - snum(p->channel->Source()); ++ if (sortMode == csmSourceProvider && rsource == 0) ++ r = strcoll(channel->Provider(), p->channel->Provider()); ++ if ((sortMode == csmSourceName || ++ (r == 0 && sortMode != csmSourceProviderNumber)) && rsource == 0) ++ r = strcoll(channel->Name(), p->channel->Name()); ++ if ((sortMode == csmSourceNumber || r == 0) && rsource == 0) ++ r = channel->Number() - p->channel->Number(); ++ return ((rsource == 0) ? r : rsource); ++ } ++ if (sortMode == csmProvider || sortMode == csmProviderNumber) + r = strcoll(channel->Provider(), p->channel->Provider()); +- if (sortMode == csmName || r == 0) ++ if (sortMode == csmName || (r == 0 && sortMode != csmProviderNumber)) + r = strcoll(channel->Name(), p->channel->Name()); + if (sortMode == csmNumber || r == 0) + r = channel->Number() - p->channel->Number(); +@@ -400,10 +437,17 @@ + { + cString buffer; + if (!channel->GroupSep()) { +- if (sortMode == csmProvider) +- buffer = cString::sprintf("%d\t%s - %s", channel->Number(), channel->Provider(), channel->Name()); +- else +- buffer = cString::sprintf("%d\t%s", channel->Number(), channel->Name()); ++ if (sortMode >= csmSourceNumber) { ++ if (sortMode == csmSourceProvider || sortMode == csmSourceProviderNumber) ++ buffer = cString::sprintf("%d\t%s - %s - %s", channel->Number(), *cSource::ToString(channel->Source()), channel->Provider(), channel->Name()); ++ else ++ buffer = cString::sprintf("%d\t%s - %s", channel->Number(), *cSource::ToString(channel->Source()), channel->Name()); ++ } else { ++ if (sortMode == csmProvider || sortMode == csmProviderNumber) ++ buffer = cString::sprintf("%d\t%s - %s", channel->Number(), channel->Provider(), channel->Name()); ++ else ++ buffer = cString::sprintf("%d\t%s", channel->Number(), channel->Name()); ++ } + } + else + buffer = cString::sprintf("---\t%s ----------------------------------------------------------------", channel->Name()); --- vdr-1.7.14.orig/debian/patches/opt-31-x_reelchannelscan.dpatch +++ vdr-1.7.14/debian/patches/opt-31-x_reelchannelscan.dpatch @@ -0,0 +1,32 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-31_reelchannelscan.dpatch by Tobias Grimm <tg@e-tobi.net> +## +## Thomas Gnther <tom@toms-cafe.de>: +## - adapted to VDR-1.5.8 +## Tobias Grimm <tg@e-tobi.net>: +## - adapted to VDR-1.5.16 +## - adapted to VDR-1.5.18 +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Makes VDR aware of the reelchannelscan plugin. + +@DPATCH@ +diff -urNad vdr-1.5.18~/vdr.c vdr-1.5.18/vdr.c +--- vdr-1.5.18~/vdr.c 2008-03-14 14:22:39.000000000 +0100 ++++ vdr-1.5.18/vdr.c 2008-03-16 15:59:55.000000000 +0100 +@@ -731,7 +731,14 @@ + // Make sure we have a visible programme in case device usage has changed: + if (!EITScanner.Active() && cDevice::PrimaryDevice()->HasDecoder() && !cDevice::PrimaryDevice()->HasProgramme()) { + static time_t lastTime = 0; +- if ((!Menu || CheckHasProgramme) && Now - lastTime > MINCHANNELWAIT) { // !Menu to avoid interfering with the CAM if a CAM menu is open ++ ++ bool reelChannelscanIsScanningOnReceivingDevice; ++ if (!cPluginManager::CallFirstService("ReelChannelscan::IsScanningOnReceivingDevice", &reelChannelscanIsScanningOnReceivingDevice)) ++ { ++ reelChannelscanIsScanningOnReceivingDevice = false; ++ } ++ ++ if (!reelChannelscanIsScanningOnReceivingDevice && (!Menu || CheckHasProgramme) && Now - lastTime > MINCHANNELWAIT) { // !Menu to avoid interfering with the CAM if a CAM menu is open + cChannel *Channel = Channels.GetByNumber(cDevice::CurrentChannel()); + if (Channel && (Channel->Vpid() || Channel->Apid(0))) { + if (!Channels.SwitchTo(cDevice::CurrentChannel()) // try to switch to the original channel... --- vdr-1.7.14.orig/debian/patches/opt-21_internal-cam-devices.dpatch +++ vdr-1.7.14/debian/patches/opt-21_internal-cam-devices.dpatch @@ -0,0 +1,86 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-21_internal-cam-devices.dpatch by Tobias Grimm <tg@e-tobi.net> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: This patch allows tuning to encrypted channels which are +## DP: provided by a stremdev client device and therefore already are +## DP: decrypted on the streamdev server side. +## DP: See also: http://www.vdr-developer.org/mantisbt/view.php?id=429 + +@DPATCH@ +diff -urNad vdr-1.6.0~/device.c vdr-1.6.0/device.c +--- vdr-1.6.0~/device.c 2008-03-09 11:03:34.000000000 +0100 ++++ vdr-1.6.0/device.c 2008-07-24 16:34:52.000000000 +0200 +@@ -363,6 +363,7 @@ + int NumCamSlots = CamSlots.Count(); + int SlotPriority[NumCamSlots]; + int NumUsableSlots = 0; ++ bool InternalCamNeeded = false; + if (Channel->Ca() >= CA_ENCRYPTED_MIN) { + for (cCamSlot *CamSlot = CamSlots.First(); CamSlot; CamSlot = CamSlots.Next(CamSlot)) { + SlotPriority[CamSlot->Index()] = MAXPRIORITY + 1; // assumes it can't be used +@@ -376,7 +377,7 @@ + } + } + if (!NumUsableSlots) +- return NULL; // no CAM is able to decrypt this channel ++ InternalCamNeeded = true; // no CAM is able to decrypt this channel + } + + bool NeedsDetachReceivers = false; +@@ -392,11 +393,13 @@ + continue; // this device shall be temporarily avoided + if (Channel->Ca() && Channel->Ca() <= CA_DVB_MAX && Channel->Ca() != device[i]->CardIndex() + 1) + continue; // a specific card was requested, but not this one +- if (NumUsableSlots && !CamSlots.Get(j)->Assign(device[i], true)) ++ if (InternalCamNeeded && !device[i]->HasInternalCam()) ++ continue; // no CAM is able to decrypt this channel and the device uses vdr handled CAMs ++ if (NumUsableSlots && !device[i]->HasInternalCam() && !CamSlots.Get(j)->Assign(device[i], true)) + continue; // CAM slot can't be used with this device + bool ndr; + if (device[i]->ProvidesChannel(Channel, Priority, &ndr)) { // this device is basicly able to do the job +- if (NumUsableSlots && device[i]->CamSlot() && device[i]->CamSlot() != CamSlots.Get(j)) ++ if (NumUsableSlots && !device[i]->HasInternalCam() && device[i]->CamSlot() && device[i]->CamSlot() != CamSlots.Get(j)) + ndr = true; // using a different CAM slot requires detaching receivers + // Put together an integer number that reflects the "impact" using + // this device would have on the overall system. Each condition is represented +@@ -410,18 +413,18 @@ + imp <<= 1; imp |= device[i]->Receiving(); // avoid devices that are receiving + imp <<= 1; imp |= device[i] == cTransferControl::ReceiverDevice(); // avoid the Transfer Mode receiver device + imp <<= 8; imp |= min(max(device[i]->Priority() + MAXPRIORITY, 0), 0xFF); // use the device with the lowest priority (+MAXPRIORITY to assure that values -99..99 can be used) +- imp <<= 8; imp |= min(max((NumUsableSlots ? SlotPriority[j] : 0) + MAXPRIORITY, 0), 0xFF); // use the CAM slot with the lowest priority (+MAXPRIORITY to assure that values -99..99 can be used) ++ imp <<= 8; imp |= min(max(((NumUsableSlots && !device[i]->HasInternalCam()) ? SlotPriority[j] : 0) + MAXPRIORITY, 0), 0xFF); // use the CAM slot with the lowest priority (+MAXPRIORITY to assure that values -99..99 can be used) + imp <<= 1; imp |= ndr; // avoid devices if we need to detach existing receivers + imp <<= 1; imp |= device[i]->IsPrimaryDevice(); // avoid the primary device +- imp <<= 1; imp |= NumUsableSlots ? 0 : device[i]->HasCi(); // avoid cards with Common Interface for FTA channels ++ imp <<= 1; imp |= (NumUsableSlots || InternalCamNeeded) ? 0 : device[i]->HasCi(); // avoid cards with Common Interface for FTA channels + imp <<= 1; imp |= device[i]->HasDecoder(); // avoid full featured cards +- imp <<= 1; imp |= NumUsableSlots ? !ChannelCamRelations.CamDecrypt(Channel->GetChannelID(), j + 1) : 0; // prefer CAMs that are known to decrypt this channel ++ imp <<= 1; imp |= (NumUsableSlots && !device[i]->HasInternalCam()) ? !ChannelCamRelations.CamDecrypt(Channel->GetChannelID(), j + 1) : 0; // prefer CAMs that are known to decrypt this channel + if (imp < Impact) { + // This device has less impact than any previous one, so we take it. + Impact = imp; + d = device[i]; + NeedsDetachReceivers = ndr; +- if (NumUsableSlots) ++ if (NumUsableSlots && !device[i]->HasInternalCam()) + s = CamSlots.Get(j); + } + } +diff -urNad vdr-1.6.0~/device.h vdr-1.6.0/device.h +--- vdr-1.6.0~/device.h 2008-02-23 14:13:04.000000000 +0100 ++++ vdr-1.6.0/device.h 2008-07-24 16:36:12.000000000 +0200 +@@ -335,6 +335,13 @@ + public: + virtual bool HasCi(void); + ///< Returns true if this device has a Common Interface. ++#define INTERNAL_CAM_DEVICES_PATCH 1 ++ virtual bool HasInternalCam(void) { return false; } ++ ///< Returns true if this device handles encrypted channels itself ++ ///< without VDR assistance. This can be e.g. when the device is a ++ ///< client that gets the stream from another VDR instance that has ++ ///< already decrypted the stream. In this case ProvidesChannel() ++ ///< shall check whether the channel can be decrypted. + void SetCamSlot(cCamSlot *CamSlot); + ///< Sets the given CamSlot to be used with this device. + cCamSlot *CamSlot(void) const { return camSlot; } --- vdr-1.7.14.orig/debian/patches/99_ncursesw-include.dpatch +++ vdr-1.7.14/debian/patches/99_ncursesw-include.dpatch @@ -0,0 +1,19 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 99_ncursesw-include.dpatch by Tobias Grimm <tg@e-tobi.net> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Use ncursesw header file + +@DPATCH@ +diff -urNad vdr-1.5.16~/PLUGINS/src/skincurses/skincurses.c vdr-1.5.16/PLUGINS/src/skincurses/skincurses.c +--- vdr-1.5.16~/PLUGINS/src/skincurses/skincurses.c 2008-02-23 11:38:04.000000000 +0100 ++++ vdr-1.5.16/PLUGINS/src/skincurses/skincurses.c 2008-02-28 00:52:23.000000000 +0100 +@@ -6,7 +6,7 @@ + * $Id: skincurses.c 1.22 2008/02/23 10:38:04 kls Exp $ + */ + +-#include <ncurses.h> ++#include <ncursesw/ncurses.h> + #include <vdr/osd.h> + #include <vdr/plugin.h> + #include <vdr/skins.h> --- vdr-1.7.14.orig/debian/patches/opt-50_graphtft-liemikuutio.dpatch +++ vdr-1.7.14/debian/patches/opt-50_graphtft-liemikuutio.dpatch @@ -0,0 +1,20 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-50_graphtft-liemikuutio.dpatch by Jrg Wendel (Horchi) +## from vdr-graphtft svn repository (20090728.2153): +## https://vdr-graphtft.svn.sourceforge.net/svnroot/vdr-graphtft +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Patch required for the GraphTFT plugin with liemikuutio patch. + +@DPATCH@ +diff -ruN vdr-1.5.18-liemikuutio-1.19-plain/menu.c vdr-1.5.18-liemikuutio-1.19-graphtft/menu.c +--- vdr-1.5.18-liemikuutio-1.19-plain/menu.c 2008-03-17 18:29:09.000000000 +0100 ++++ vdr-1.5.18-liemikuutio-1.19-graphtft/menu.c 2008-03-17 18:27:23.000000000 +0100 +@@ -1960,6 +1960,7 @@ + public: + cMenuRenameRecording(cRecording *Recording); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuRenameRecording"; } + }; + + cMenuRenameRecording::cMenuRenameRecording(cRecording *Recording) --- vdr-1.7.14.orig/debian/patches/opt-39_noepg.dpatch +++ vdr-1.7.14/debian/patches/opt-39_noepg.dpatch @@ -0,0 +1,158 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-39_noepg.dpatch from version the vdr-noepgmenu plugin 0.0.6.beta3 +## http://winni.vdr-developer.org/noepgmenu/downloads/beta +## +## Thomas Gnther <tom@toms-cafe.de>: +## - adapted to VDR-1.7.8 +## - solved conflicts with other patches +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: The patch allows to disable normal epg update for specified channels. +## DP: This is useful if you get epg data of the channels from external sources. + +@DPATCH@ +diff -Naurp vdr-1.7.8/config.c vdr-1.7.8-noepg/config.c +--- vdr-1.7.8/config.c 2009-06-13 10:25:05.000000000 +0000 ++++ vdr-1.7.8-noepg/config.c 2009-06-15 21:04:42.000000000 +0000 +@@ -234,6 +234,8 @@ cSetup::cSetup(void) + SetSystemTime = 0; + TimeSource = 0; + TimeTransponder = 0; ++ noEPGMode=0; ++ noEPGList=strdup(""); + MarginStart = 2; + MarginStop = 10; + AudioLanguages[0] = -1; +@@ -302,9 +304,16 @@ cSetup::cSetup(void) + EmergencyExit = 1; + } + ++cSetup::~cSetup() ++{ ++ free(noEPGList); ++} ++ + cSetup& cSetup::operator= (const cSetup &s) + { + memcpy(&__BeginData__, &s.__BeginData__, (char *)&s.__EndData__ - (char *)&s.__BeginData__); ++ free(noEPGList); ++ noEPGList = strdup(s.noEPGList); + return *this; + } + +@@ -421,6 +430,11 @@ bool cSetup::Parse(const char *Name, con + else if (!strcasecmp(Name, "SetSystemTime")) SetSystemTime = atoi(Value); + else if (!strcasecmp(Name, "TimeSource")) TimeSource = cSource::FromString(Value); + else if (!strcasecmp(Name, "TimeTransponder")) TimeTransponder = atoi(Value); ++ else if (!strcasecmp(Name, "noEPGMode")) noEPGMode = atoi(Value); ++ else if (!strcasecmp(Name, "noEPGList")) { ++ free(noEPGList); ++ noEPGList=strdup(Value ? Value : ""); ++ } + else if (!strcasecmp(Name, "MarginStart")) MarginStart = atoi(Value); + else if (!strcasecmp(Name, "MarginStop")) MarginStop = atoi(Value); + else if (!strcasecmp(Name, "AudioLanguages")) return ParseLanguages(Value, AudioLanguages); +@@ -513,6 +527,8 @@ bool cSetup::Save(void) + Store("SetSystemTime", SetSystemTime); + Store("TimeSource", cSource::ToString(TimeSource)); + Store("TimeTransponder", TimeTransponder); ++ Store("noEPGMode", noEPGMode); ++ Store("noEPGList", noEPGList); + Store("MarginStart", MarginStart); + Store("MarginStop", MarginStop); + StoreLanguages("AudioLanguages", AudioLanguages); +diff -Naurp vdr-1.7.8/config.h vdr-1.7.8-noepg/config.h +--- vdr-1.7.8/config.h 2009-05-21 11:11:32.000000000 +0000 ++++ vdr-1.7.8-noepg/config.h 2009-06-15 21:02:48.000000000 +0000 +@@ -218,6 +218,7 @@ public: + int SetSystemTime; + int TimeSource; + int TimeTransponder; ++ int noEPGMode; + int MarginStart, MarginStop; + int AudioLanguages[I18N_MAX_LANGUAGES + 1]; + int DisplaySubtitles; +@@ -274,7 +275,9 @@ public: + int InitialVolume; + int EmergencyExit; + int __EndData__; ++ char *noEPGList; // pointer not to be flat-copied + cSetup(void); ++ ~cSetup(); + cSetup& operator= (const cSetup &s); + bool Load(const char *FileName); + bool Save(void); +diff -Naurp vdr-1.7.8/eit.c vdr-1.7.8-noepg/eit.c +--- vdr-1.7.8/eit.c 2009-05-15 12:34:43.000000000 +0000 ++++ vdr-1.7.8-noepg/eit.c 2009-06-15 20:43:10.000000000 +0000 +@@ -24,8 +24,28 @@ + class cEIT : public SI::EIT { + public: + cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data, bool OnlyRunningStatus = false); ++ ++private: ++ bool allowedEPG(tChannelID kanalID); + }; + ++bool cEIT::allowedEPG(tChannelID kanalID) { ++ bool rc; ++ ++ if (Setup.noEPGMode == 1) { ++ rc=false; ++ if (strstr(::Setup.noEPGList,kanalID.ToString())!=NULL) ++ rc=true; ++ } ++ else { ++ rc=true; ++ if (strstr(::Setup.noEPGList,kanalID.ToString())!=NULL) ++ rc=false; ++ } ++ ++ return rc; ++} ++ + cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data, bool OnlyRunningStatus) + :SI::EIT(Data, false) + { +@@ -37,6 +57,12 @@ cEIT::cEIT(cSchedules *Schedules, int So + if (!channel) + return; // only collect data for known channels + ++ // only use epg from channels not blocked by noEPG-patch ++ tChannelID kanalID; ++ kanalID=channel->GetChannelID(); ++ if (!allowedEPG(kanalID)) ++ return; ++ + cSchedule *pSchedule = (cSchedule *)Schedules->GetSchedule(channel, true); + + bool Empty = true; +diff -Naurp vdr-1.7.8/menu.c vdr-1.7.8-noepg/menu.c +--- vdr-1.7.8/menu.c 2009-05-21 11:10:38.000000000 +0000 ++++ vdr-1.7.8-noepg/menu.c 2009-06-15 21:06:02.000000000 +0000 +@@ -2289,6 +2289,7 @@ eOSState cMenuSetupOSD::ProcessKey(eKeys + + class cMenuSetupEPG : public cMenuSetupBase { + private: ++ const char *noEPGModes[2]; + int originalNumLanguages; + int numLanguages; + void Setup(void); +@@ -2311,6 +2312,9 @@ void cMenuSetupEPG::Setup(void) + { + int current = Current(); + ++ noEPGModes[0]=tr("Blacklist"); ++ noEPGModes[1]=tr("Whitelist"); ++ + Clear(); + + Add(new cMenuEditIntItem( tr("Setup.EPG$EPG scan timeout (h)"), &data.EPGScanTimeout)); +@@ -2319,6 +2323,7 @@ void cMenuSetupEPG::Setup(void) + Add(new cMenuEditBoolItem(tr("Setup.EPG$Set system time"), &data.SetSystemTime)); + if (data.SetSystemTime) + Add(new cMenuEditTranItem(tr("Setup.EPG$Use time from transponder"), &data.TimeTransponder, &data.TimeSource)); ++ Add(new cMenuEditStraItem(tr("Setup.EPG$Mode noEPG-Patch"), &data.noEPGMode, 2, noEPGModes)); + // TRANSLATORS: note the plural! + Add(new cMenuEditIntItem( tr("Setup.EPG$Preferred languages"), &numLanguages, 0, I18nLanguages()->Size())); + for (int i = 0; i < numLanguages; i++) --- vdr-1.7.14.orig/debian/patches/11_sortrecordings.dpatch +++ vdr-1.7.14/debian/patches/11_sortrecordings.dpatch @@ -0,0 +1,34 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 11_sortrecordings.dpatch by FrankJepsen at vdrportal.de +## http://www.jepsennet.de/vdr/download/11_sortrecordings.dpatch +## +## Thomas Gnther <tom@toms-cafe.de>: +## - adapted to VDR-1.3.42 +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Sort recordings dirs first and by name, recs by date or name (if last +## DP: char in dir is one of '.-$'). + +@DPATCH@ +--- vdrdevel-1.3.24.org/recording.c 2005-05-07 17:25:15.000000000 +0200 ++++ vdrdevel-1.3.24/recording.c 2005-06-17 00:24:44.000000000 +0200 +@@ -445,8 +445,8 @@ + s1 = t; + } + t++; +- } +- if (s1 && s2) ++ } *s1 = 255; ++ if (s1 && s2 && s1 != s && !strchr(".-$", *(s1 - 1))) + memmove(s1 + 1, s2, t - s2 + 1); + return s; + } +@@ -454,7 +454,7 @@ + char *cRecording::SortName(void) const + { + if (!sortBuffer) { +- char *s = StripEpisodeName(strdup(FileName() + strlen(VideoDirectory) + 1)); ++ char *s = StripEpisodeName(strdup(FileName() + strlen(VideoDirectory) )); + strreplace(s, '/', 'a'); // some locales ignore '/' when sorting + int l = strxfrm(NULL, s, 0) + 1; + sortBuffer = MALLOC(char, l); --- vdr-1.7.14.orig/debian/patches/opt-50_graphtft.dpatch +++ vdr-1.7.14/debian/patches/opt-50_graphtft.dpatch @@ -0,0 +1,355 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-50_graphtft.dpatch by Jörg Wendel (Horchi) +## from vdr-graphtft svn repository (20090728.2153): +## https://vdr-graphtft.svn.sourceforge.net/svnroot/vdr-graphtft +## +## Thomas Günther <tom@toms-cafe.de>: +## - adapted to VDR-1.7.13 +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Patch required for the GraphTFT plugin. + +@DPATCH@ +diff -Naurp vdr-1.7.13/menu.c vdr-1.7.13-graphtft/menu.c +--- vdr-1.7.13/menu.c 2010-02-21 14:09:19.000000000 +0000 ++++ vdr-1.7.13-graphtft/menu.c 2010-02-28 20:28:03.000000000 +0000 +@@ -196,6 +196,7 @@ private: + public: + cMenuEditChannel(cChannel *Channel, bool New = false); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuEditChannel"; } + }; + + cMenuEditChannel::cMenuEditChannel(cChannel *Channel, bool New) +@@ -372,6 +373,7 @@ public: + cMenuChannels(void); + ~cMenuChannels(); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuChannels"; } + }; + + cMenuChannels::cMenuChannels(void) +@@ -1079,6 +1081,7 @@ public: + cMenuTimers(void); + virtual ~cMenuTimers(); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuTimers"; } + }; + + cMenuTimers::cMenuTimers(void) +@@ -1239,6 +1242,7 @@ void cMenuEvent::Display(void) + { + cOsdMenu::Display(); + DisplayMenu()->SetEvent(event); ++ cStatus::MsgOsdSetEvent(event); + if (event->Description()) + cStatus::MsgOsdTextItem(event->Description()); + } +@@ -1361,6 +1365,8 @@ public: + static void SetCurrentChannel(int ChannelNr) { currentChannel = ChannelNr; } + static const cEvent *ScheduleEvent(void); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return now ? "MenuWhatsOnNow" : "MenuWhatsOnNext"; } ++ virtual void Display(void); + }; + + int cMenuWhatsOn::currentChannel = 0; +@@ -1388,6 +1394,18 @@ cMenuWhatsOn::cMenuWhatsOn(const cSchedu + SetHelpKeys(); + } + ++void cMenuWhatsOn::Display(void) ++{ ++ cOsdMenu::Display(); ++ ++ if (Count() > 0) { ++ int ni = 0; ++ for (cOsdItem *item = First(); item; item = Next(item)) { ++ cStatus::MsgOsdEventItem(((cMenuScheduleItem*)item)->event, item->Text(), ni++, Count()); ++ } ++ } ++} ++ + bool cMenuWhatsOn::Update(void) + { + bool result = false; +@@ -1528,6 +1546,8 @@ public: + cMenuSchedule(void); + virtual ~cMenuSchedule(); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuSchedule"; } ++ virtual void Display(void); + }; + + cMenuSchedule::cMenuSchedule(void) +@@ -1553,6 +1573,18 @@ cMenuSchedule::~cMenuSchedule() + cMenuWhatsOn::ScheduleEvent(); // makes sure any posted data is cleared + } + ++void cMenuSchedule::Display(void) ++{ ++ cOsdMenu::Display(); ++ ++ if (Count() > 0) { ++ int ni = 0; ++ for (cOsdItem *item = First(); item; item = Next(item)) { ++ cStatus::MsgOsdEventItem(((cMenuScheduleItem*)item)->event, item->Text(), ni++, Count()); ++ } ++ } ++} ++ + void cMenuSchedule::PrepareScheduleAllThis(const cEvent *Event, const cChannel *Channel) + { + Clear(); +@@ -1908,6 +1940,7 @@ public: + cMenuCam(cCamSlot *CamSlot); + virtual ~cMenuCam(); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuCam"; } + }; + + cMenuCam::cMenuCam(cCamSlot *CamSlot) +@@ -2087,6 +2120,7 @@ public: + cMenuRecording(const cRecording *Recording, bool WithButtons = false); + virtual void Display(void); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuRecording"; } + }; + + cMenuRecording::cMenuRecording(const cRecording *Recording, bool WithButtons) +@@ -2102,6 +2136,7 @@ void cMenuRecording::Display(void) + { + cOsdMenu::Display(); + DisplayMenu()->SetRecording(recording); ++ cStatus::MsgOsdSetRecording(recording); + if (recording->Info()->Description()) + cStatus::MsgOsdTextItem(recording->Info()->Description()); + } +@@ -2498,6 +2533,7 @@ public: + cMenuSetupOSD(void); + virtual ~cMenuSetupOSD(); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuSetupOsd"; } + }; + + cMenuSetupOSD::cMenuSetupOSD(void) +@@ -2637,6 +2673,7 @@ private: + public: + cMenuSetupEPG(void); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuSetupEpg"; } + }; + + cMenuSetupEPG::cMenuSetupEPG(void) +@@ -2732,6 +2769,7 @@ private: + public: + cMenuSetupDVB(void); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuSetupDvb"; } + }; + + cMenuSetupDVB::cMenuSetupDVB(void) +@@ -2861,6 +2899,7 @@ private: + public: + cMenuSetupLNB(void); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuSetupLnb"; } + }; + + cMenuSetupLNB::cMenuSetupLNB(void) +@@ -2941,6 +2980,7 @@ private: + public: + cMenuSetupCAM(void); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuSetupCam"; } + }; + + cMenuSetupCAM::cMenuSetupCAM(void) +@@ -3111,6 +3151,7 @@ class cMenuSetupPlugins : public cMenuSe + public: + cMenuSetupPlugins(void); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuSetupPlugins"; } + }; + + cMenuSetupPlugins::cMenuSetupPlugins(void) +@@ -3160,6 +3201,7 @@ private: + public: + cMenuSetup(void); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuSetup"; } + }; + + cMenuSetup::cMenuSetup(void) +diff -Naurp vdr-1.7.13/menu.h vdr-1.7.13-graphtft/menu.h +--- vdr-1.7.13/menu.h 2010-02-06 10:17:24.000000000 +0000 ++++ vdr-1.7.13-graphtft/menu.h 2010-02-28 20:27:52.000000000 +0000 +@@ -29,6 +29,7 @@ public: + void SetText(const char *Text); + virtual void Display(void); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuText"; } + }; + + class cMenuFolder : public cOsdMenu { +@@ -67,6 +68,7 @@ public: + cMenuCommands(const char *Title, cList<cNestedItem> *Commands, const char *Parameters = NULL); + virtual ~cMenuCommands(); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuCommands"; } + }; + + class cMenuEditTimer : public cOsdMenu { +@@ -84,6 +86,7 @@ public: + cMenuEditTimer(cTimer *Timer, bool New = false); + virtual ~cMenuEditTimer(); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuTimerEdit"; } + }; + + class cMenuEvent : public cOsdMenu { +@@ -93,6 +96,7 @@ public: + cMenuEvent(const cEvent *Event, bool CanSwitch = false, bool Buttons = false); + virtual void Display(void); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuEvent"; } + }; + + class cMenuMain : public cOsdMenu { +@@ -109,6 +113,7 @@ public: + cMenuMain(eOSState State = osUnknown); + virtual eOSState ProcessKey(eKeys Key); + static cOsdObject *PluginOsdObject(void); ++ virtual const char* MenuKind() { return "MenuMain"; } + }; + + class cDisplayChannel : public cOsdObject { +@@ -210,6 +215,7 @@ public: + cMenuRecordings(const char *Base = NULL, int Level = 0, bool OpenSubMenus = false); + ~cMenuRecordings(); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuRecordings"; } + }; + + class cRecordControl { +diff -Naurp vdr-1.7.13/menuitems.h vdr-1.7.13-graphtft/menuitems.h +--- vdr-1.7.13/menuitems.h 2010-02-21 13:58:21.000000000 +0000 ++++ vdr-1.7.13-graphtft/menuitems.h 2010-02-28 20:20:08.000000000 +0000 +@@ -198,6 +198,7 @@ public: + cMenuSetupPage(void); + virtual eOSState ProcessKey(eKeys Key); + void SetPlugin(cPlugin *Plugin); ++ const char* MenuKind() { return "MenuSetupPage"; } + }; + + #endif //__MENUITEMS_H +diff -Naurp vdr-1.7.13/osdbase.c vdr-1.7.13-graphtft/osdbase.c +--- vdr-1.7.13/osdbase.c 2010-01-17 11:36:12.000000000 +0000 ++++ vdr-1.7.13-graphtft/osdbase.c 2010-02-28 20:20:07.000000000 +0000 +@@ -97,6 +97,7 @@ cOsdMenu::~cOsdMenu() + free(status); + displayMenu->Clear(); + cStatus::MsgOsdClear(); ++ cStatus::MsgOsdMenuDestroy(); + if (!--displayMenuCount) + DELETENULL(displayMenu); + } +@@ -202,6 +203,7 @@ void cOsdMenu::Display(void) + displayMenu->SetMessage(mtStatus, NULL); + displayMenu->Clear(); + cStatus::MsgOsdClear(); ++ cStatus::MsgOsdMenuDisplay(MenuKind()); + displayMenu->SetTabs(cols[0], cols[1], cols[2], cols[3], cols[4]);//XXX + displayMenu->SetTitle(title); + cStatus::MsgOsdTitle(title); +diff -Naurp vdr-1.7.13/osdbase.h vdr-1.7.13-graphtft/osdbase.h +--- vdr-1.7.13/osdbase.h 2010-01-16 14:25:31.000000000 +0000 ++++ vdr-1.7.13-graphtft/osdbase.h 2010-02-28 20:20:08.000000000 +0000 +@@ -131,6 +131,7 @@ public: + void Ins(cOsdItem *Item, bool Current = false, cOsdItem *Before = NULL); + virtual void Display(void); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuUnknown"; } + }; + + #endif //__OSDBASE_H +diff -Naurp vdr-1.7.13/recording.h vdr-1.7.13-graphtft/recording.h +--- vdr-1.7.13/recording.h 2010-01-16 11:16:20.000000000 +0000 ++++ vdr-1.7.13-graphtft/recording.h 2010-02-28 20:20:08.000000000 +0000 +@@ -65,6 +65,7 @@ public: + const cEvent *GetEvent(void) const { return event; } + const char *Title(void) const { return event->Title(); } + const char *ShortText(void) const { return event->ShortText(); } ++ tEventID EventID(void) const { return event->EventID(); } + const char *Description(void) const { return event->Description(); } + const cComponents *Components(void) const { return event->Components(); } + const char *Aux(void) const { return aux; } +diff -Naurp vdr-1.7.13/status.c vdr-1.7.13-graphtft/status.c +--- vdr-1.7.13/status.c 2008-02-16 14:46:31.000000000 +0000 ++++ vdr-1.7.13-graphtft/status.c 2010-02-28 20:20:08.000000000 +0000 +@@ -124,3 +124,32 @@ void cStatus::MsgOsdProgramme(time_t Pre + for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) + sm->OsdProgramme(PresentTime, PresentTitle, PresentSubtitle, FollowingTime, FollowingTitle, FollowingSubtitle); + } ++ ++void cStatus::MsgOsdSetEvent(const cEvent* event) ++{ ++ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) ++ sm->OsdSetEvent(event); ++} ++ ++void cStatus::MsgOsdSetRecording(const cRecording* recording) ++{ ++ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) ++ sm->OsdSetRecording(recording); ++} ++ ++void cStatus::MsgOsdMenuDisplay(const char* kind) ++{ ++ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) ++ sm->OsdMenuDisplay(kind); ++} ++ ++void cStatus::MsgOsdMenuDestroy() ++{ ++ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) ++ sm->OsdMenuDestroy(); ++} ++void cStatus::MsgOsdEventItem(const cEvent* Event, const char *Text, int Index, int Count) ++{ ++ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) ++ sm->OsdEventItem(Event, Text, Index, Count); ++} +diff -Naurp vdr-1.7.13/status.h vdr-1.7.13-graphtft/status.h +--- vdr-1.7.13/status.h 2008-02-16 15:00:33.000000000 +0000 ++++ vdr-1.7.13-graphtft/status.h 2010-02-28 20:20:08.000000000 +0000 +@@ -80,6 +80,17 @@ protected: + // The OSD displays the single line Text with the current channel information. + virtual void OsdProgramme(time_t PresentTime, const char *PresentTitle, const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, const char *FollowingSubtitle) {} + // The OSD displays the given programme information. ++ virtual void OsdSetRecording(const cRecording* recording) {} ++ // The OSD displays the recording information. ++ virtual void OsdSetEvent(const cEvent* event) {} ++ // The OSD displays the event information. ++ virtual void OsdMenuDisplay(const char* kind) {} ++ // report menu creation ++ virtual void OsdMenuDestroy() {} ++ // report menu destruvtion ++ virtual void OsdEventItem(const cEvent* Event, const char *Text, int Index, int Count) {} ++ // The OSD displays the given single line Event as menu item at Index. ++ + public: + cStatus(void); + virtual ~cStatus(); +@@ -101,6 +112,11 @@ public: + static void MsgOsdTextItem(const char *Text, bool Scroll = false); + static void MsgOsdChannel(const char *Text); + static void MsgOsdProgramme(time_t PresentTime, const char *PresentTitle, const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, const char *FollowingSubtitle); ++ static void MsgOsdSetEvent(const cEvent* event); ++ static void MsgOsdSetRecording(const cRecording* recording); ++ static void MsgOsdMenuDisplay(const char* kind); ++ static void MsgOsdMenuDestroy(); ++ static void MsgOsdEventItem(const cEvent* Event, const char *Text, int Index, int Count); + }; + + #endif //__STATUS_H --- vdr-1.7.14.orig/debian/patches/00list +++ vdr-1.7.14/debian/patches/00list @@ -0,0 +1,82 @@ +04_newplugin +06_default_svdrp_port_0 +11_sortrecordings +12_osdbase-maxitems +16_channels.conf.terr-fix + +81_Make_config +82_valgrind + +99_ncursesw-include +99_vdr-workaround-broken-sys-capability + +# Patch collection (replaces enAIO). +opt-20_liemikuutio + +# Allows to tune to non-FTA channels provided by internal devices, +# like streamdev +opt-21_internal-cam-devices + +# Easy editing of cutting marks +# (Requires opt-20_liemikuutio!) +opt-22-x_edit_marks + +# The Jump patch allows automatic jumping over cutting marks. +opt-24_jumpplay + +# Patch needed for the ttxtsubs plugin. +opt-27_ttxtsubs + +# Speed up zapping channels. +# opt-29_syncearly + +# Makes VDR aware of the reelchannelscan plugin +opt-31-x_reelchannelscan + +# Patch that shows if there is a valid setup value left or right with < and >. +# opt-35_setup-show-valid + +# Patch needed for the menuorg plugin. +opt-37-x_menuorg + +# Patch that suppresses double EPG entries. +opt-38_disableDoubleEpgEntrys + +# Patch to disable normal epg update for specified channels. +opt-39_noepg + +# Patch to show an info, if it is possible to record an event in the timer-info. +opt-41-x_timer-info + +# Patch to allow plugins to replace the VDR mainmenus +opt-42-x_MainMenuHooks + +# Shows remaining recording capacity in recordings menu. +# (Requires opt-41-x_timer-info !) +opt-43-x_recordshowfree + +# Patch needed for the rotor plugin. +opt-44_rotor + +# Patch needed for the yaepg plugin. +opt-45_yaepg + +# Patch for the PIN plugin +opt-48-x_pin + +# Patch required for the GraphTFT plugin +opt-50_graphtft +opt-50_graphtft-liemikuutio +opt-91_ext-graphtft + +# Modifies the start time of recordings to the first cutting mark +# (disabled by default - enable in VDR's recording setup) +opt-51_cuttime + +# Records into smaller files and uses hardlinks to speed up cutting +opt-52_hard_link_cutter + +# Setup for AC3 transfer, QAM_256, disable primary tuner +# opt-53_dvbsetup + +opt-55_wareagleicon --- vdr-1.7.14.orig/debian/patches/opt-51_cuttime.dpatch +++ vdr-1.7.14/debian/patches/opt-51_cuttime.dpatch @@ -0,0 +1,122 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-51_cuttime.dpatch by Udo Richter <udo_richter@gmx.de> +## http://www.udo-richter.de/vdr/patches.en.html#cuttime +## +## Thomas Gnther <tom@toms-cafe.de>: +## - adapted to VDR-1.5.7 with liemikuutio patch +## - adapted to VDR-1.7.4 with liemikuutio patch +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Modifies the start time of recordings to the first cutting mark. +## DP: +## DP: 2007-07-01 Tobias Grimm <tg@e-tobi.net> +## DP: - Added setup option to enable/disable CutTime + +@DPATCH@ +diff -Naurp vdr-1.7.4-liemikuutio/config.c vdr-1.7.4-liemikuutio-cuttime/config.c +--- vdr-1.7.4-liemikuutio/config.c 2009-04-01 01:11:59.000000000 +0000 ++++ vdr-1.7.4-liemikuutio-cuttime/config.c 2009-04-01 19:23:37.000000000 +0000 +@@ -213,6 +213,7 @@ cSetup Setup; + + cSetup::cSetup(void) + { ++ CutTimePatchEnabled = 0; + strcpy(OSDLanguage, ""); // default is taken from environment + strcpy(OSDSkin, "sttng"); + strcpy(OSDTheme, "default"); +@@ -472,6 +473,7 @@ bool cSetup::Parse(const char *Name, con + else if (!strcasecmp(Name, "ShowRecLength")) ShowRecLength = atoi(Value); + else if (!strcasecmp(Name, "ShowProgressBar")) ShowProgressBar = atoi(Value); + else if (!strcasecmp(Name, "MenuCmdPosition")) MenuCmdPosition = atoi(Value); ++ else if (!strcasecmp(Name, "CutTimePatchEnabled")) CutTimePatchEnabled= atoi(Value); + else + return false; + return true; +@@ -560,6 +562,7 @@ bool cSetup::Save(void) + Store("ShowRecLength", ShowRecLength); + Store("ShowProgressBar", ShowProgressBar); + Store("MenuCmdPosition", MenuCmdPosition); ++ Store("CutTimePatchEnabled",CutTimePatchEnabled); + + Sort(); + +diff -Naurp vdr-1.7.4-liemikuutio/config.h vdr-1.7.4-liemikuutio-cuttime/config.h +--- vdr-1.7.4-liemikuutio/config.h 2009-04-01 01:11:59.000000000 +0000 ++++ vdr-1.7.4-liemikuutio-cuttime/config.h 2009-04-01 19:23:37.000000000 +0000 +@@ -269,6 +269,7 @@ public: + int InitialVolume; + int EmergencyExit; + int ShowRecDate, ShowRecTime, ShowRecLength, ShowProgressBar, MenuCmdPosition; ++ int CutTimePatchEnabled; + int __EndData__; + cSetup(void); + cSetup& operator= (const cSetup &s); +diff -Naurp vdr-1.7.4-liemikuutio/cutter.c vdr-1.7.4-liemikuutio-cuttime/cutter.c +--- vdr-1.7.4-liemikuutio/cutter.c 2009-01-24 15:19:26.000000000 +0000 ++++ vdr-1.7.4-liemikuutio-cuttime/cutter.c 2009-04-01 19:23:37.000000000 +0000 +@@ -201,6 +201,14 @@ bool cCutter::Start(const char *FileName + error = false; + ended = false; + cRecording Recording(FileName); ++ ++ if (Setup.CutTimePatchEnabled) { ++ cMarks FromMarks; ++ FromMarks.Load(FileName, Recording.FramesPerSecond(), Recording.IsPesRecording()); ++ cMark *First=FromMarks.First(); ++ if (First) Recording.SetStartTime(Recording.start+((First->position/Recording.FramesPerSecond()+30)/60)*60); ++ } ++ + const char *evn = Recording.PrefixFileName('%'); + if (evn && RemoveVideoFile(evn) && MakeDirs(evn, true)) { + // XXX this can be removed once RenameVideoFile() follows symlinks (see videodir.c) +diff -Naurp vdr-1.7.4-liemikuutio/menu.c vdr-1.7.4-liemikuutio-cuttime/menu.c +--- vdr-1.7.4-liemikuutio/menu.c 2009-04-01 01:11:59.000000000 +0000 ++++ vdr-1.7.4-liemikuutio-cuttime/menu.c 2009-04-01 19:23:37.000000000 +0000 +@@ -2899,6 +2899,7 @@ cMenuSetupRecord::cMenuSetupRecord(void) + Add(new cMenuEditBoolItem(tr("Setup.Recording$Show date"), &data.ShowRecDate)); + Add(new cMenuEditBoolItem(tr("Setup.Recording$Show time"), &data.ShowRecTime)); + Add(new cMenuEditBoolItem(tr("Setup.Recording$Show length"), &data.ShowRecLength)); ++ Add(new cMenuEditBoolItem(tr("Setup.CutTimePatch$Adapt start time to cutting marks"), &data.CutTimePatchEnabled)); + } + + // --- cMenuSetupReplay ------------------------------------------------------ +diff -Naurp vdr-1.7.4-liemikuutio/po/de_DE.po vdr-1.7.4-liemikuutio-cuttime/po/de_DE.po +--- vdr-1.7.4-liemikuutio/po/de_DE.po 2009-04-01 01:12:00.000000000 +0000 ++++ vdr-1.7.4-liemikuutio-cuttime/po/de_DE.po 2009-04-01 19:23:37.000000000 +0000 +@@ -1064,3 +1064,6 @@ msgstr "AufnahmeZeit anzeigen" + + msgid "Setup.Recording$Show length" + msgstr "Lnge der Aufnahme anzeigen" ++ ++msgid "Setup.CutTimePatch$Adapt start time to cutting marks" ++msgstr "Startzeit an Schnittmarken anpassen" +diff -Naurp vdr-1.7.4-liemikuutio/recording.c vdr-1.7.4-liemikuutio-cuttime/recording.c +--- vdr-1.7.4-liemikuutio/recording.c 2009-04-01 01:12:00.000000000 +0000 ++++ vdr-1.7.4-liemikuutio-cuttime/recording.c 2009-04-01 19:23:37.000000000 +0000 +@@ -912,6 +912,15 @@ const char *cRecording::Title(char Delim + return titleBuffer; + } + ++void cRecording::SetStartTime(time_t Start) ++{ ++ start=Start; ++ if (fileName) { ++ free(fileName); ++ fileName = NULL; ++ } ++} ++ + const char *cRecording::PrefixFileName(char Prefix) + { + cString p = PrefixVideoFileName(FileName(), Prefix); +diff -Naurp vdr-1.7.4-liemikuutio/recording.h vdr-1.7.4-liemikuutio-cuttime/recording.h +--- vdr-1.7.4-liemikuutio/recording.h 2009-04-01 01:12:00.000000000 +0000 ++++ vdr-1.7.4-liemikuutio-cuttime/recording.h 2009-04-01 19:23:37.000000000 +0000 +@@ -106,6 +106,7 @@ public: + const char *FileName(void) const; + const char *Title(char Delimiter = ' ', bool NewIndicator = false, int Level = -1, bool Original = true) const; + const cRecordingInfo *Info(void) const { return info; } ++ void SetStartTime(time_t Start); + const char *PrefixFileName(char Prefix); + int HierarchyLevels(void) const; + void ResetResume(void) const; --- vdr-1.7.14.orig/debian/patches/opt-24_jumpplay.dpatch +++ vdr-1.7.14/debian/patches/opt-24_jumpplay.dpatch @@ -0,0 +1,553 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-24_jumpplay.dpatch by Torsten Kunkel <vdr@tkunkel.de>, Thomas Gnther <tom@toms-cafe.de> +## http://toms-cafe.de/vdr/download/vdr-jumpplay-1.0-1.7.6.diff +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Play after jump to next mark. Automatically jump over commercial breaks. +## DP: See README.jumpplay and MANUAL for details. + +@DPATCH@ +diff -Naurp vdr-1.7.6/MANUAL vdr-1.7.6-jumpplay/MANUAL +--- vdr-1.7.6/MANUAL 2008-02-24 10:09:17.000000000 +0000 ++++ vdr-1.7.6-jumpplay/MANUAL 2009-04-27 15:49:00.000000000 +0000 +@@ -813,6 +813,30 @@ Version 1.6 + 0 resulting in a file named 'resume.vdr', and any other + value resulting in 'resume.n.vdr'. + ++ Jump&Play = no Turns playing on or off after jumping forward to the ++ next editing mark with the '9' key. ++ ++ Play&Jump = no Turns automatic jumping over commercial breaks on or ++ off. This includes jumping to the first mark, if the ++ replay starts at the beginning of a recording - and ++ stopping the replay at the last mark. ++ With this setting enabled, the behaviour of the '8' ++ key during replay is changed too. It moves the actual ++ replay position not only three seconds before the ++ next "start" mark, but also before the next "end" ++ mark. This can be used to test, if the editing marks ++ are correctly positioned for a "smooth" jump over a ++ commercial break. ++ ++ Pause at last mark = no ++ Turns pausing of replay at the last editing mark on or ++ off. ++ ++ Reload marks = no Turns reloading of editing marks on or off. This can ++ be used if an external programme adjusts the editing ++ marks, e.g. noad in online mode. The marks are reloaded ++ in 10 seconds intervals. ++ + Miscellaneous: + + Min. event timeout = 30 +diff -Naurp vdr-1.7.6/README.jumpplay vdr-1.7.6-jumpplay/README.jumpplay +--- vdr-1.7.6/README.jumpplay 1970-01-01 00:00:00.000000000 +0000 ++++ vdr-1.7.6-jumpplay/README.jumpplay 2009-04-27 15:49:00.000000000 +0000 +@@ -0,0 +1,92 @@ ++JumpPlay patch for VDR ++---------------------- ++ ++This patch changes the replay behaviour for recordings that contain editing ++marks. It allows to immediately continue the replay after jumping forward to ++the next mark, and to automatically jump over the commercial break to the next ++"start" mark, if an "end" mark is reached. ++ ++The features of this patch can be turned on or off with parameters in the replay ++setup. See MANUAL for description of this parameters: "Jump&Play", "Play&Jump", ++"Pause at last mark" and "Reload marks". ++ ++ ++* History ++ ++ 2003-07-04: jumpandrun.diff - the Noad <theNoad@SoftHome.net> ++ Jump&Play ++ ++ 2003-12-06: Version 0.0 - Torsten Kunkel <vdr@tkunkel.de> ++ Play&Jump (only if progressbar is visible) ++ Setup parameters Jump&Play and Play&Jump in the replay setup ++ ++ 2004-01-20: Version 0.1 - Thomas Gnther <tom@toms-cafe.de> ++ Jump&Play: ++ - fixed speed after jump ++ - fixed removing of marks ++ Play&Jump: ++ - jump only on "end" marks ++ ++ 2004-01-27: Version 0.2 - Thomas Gnther <tom@toms-cafe.de> ++ Jump&Play: ++ - fixed double jump ++ Play&Jump: ++ - fixed mark detection: fuzzy detection (until 3 seconds after mark) ++ - jump without progressbar ++ - mode "progressbar only" for old behaviour ++ ++ 2004-01-31: Version 0.3 - Thomas Gnther <tom@toms-cafe.de> ++ Jump&Play: ++ - fixed display frames ++ Play&Jump: ++ - fixed end of playing at last mark ++ ++ 2004-07-11: Version 0.4 - Thomas Gnther <tom@toms-cafe.de> ++ Jump&Play: ++ - don't play after jump to end ++ Play&Jump: ++ - don't prevent jumping after hide or show ++ Less conflicts with other patches (Elchi/AutoPID) ++ ++ 2004-08-21: Version 0.5 - Thomas Gnther <tom@toms-cafe.de> ++ Play&Jump: ++ - exact jumps, replay like edited recording (no fuzzy mark detection) ++ - jump to first mark if replay starts at the beginning ++ - check jump marks with '8' key ++ - mode "progressbar only" removed ++ Description in README.jumpplay ++ ++ 2004-12-28: Version 0.6 - Thomas Gnther <tom@toms-cafe.de> ++ Adapted noad extensions (from the Noad <theNoad@SoftHome.net>) to ++ jumpplay-0.5: ++ - cyclic reloading of marks found by noad online-scan ++ - don't stop after the last mark in case of live-recordings ++ New setup parameter "Load marks interval (s)" ++ Updated description in README.jumpplay ++ ++ 2006-04-14: Version 0.7 - Thomas Gnther <tom@toms-cafe.de> ++ Fixed jump to first mark (crashed with plugin extrecmenu-0.9) ++ Added version define JUMPPLAYVERSNUM ++ Added placeholders for Czech language texts ++ Cleaned up i18n entries (support only VDR >= 1.3.29) ++ Improved description of i18n placeholders - hoping for real language texts ++ ++ 2006-05-12: Version 0.8 - Thomas Gnther <tom@toms-cafe.de> ++ Fixed segfault in dvbplayer thread while the replaycontrol thread is ++ reloading the marks (thanks to horchi at vdrportal.de for reporting this - ++ see http://vdrportal.de/board/thread.php?postid=450463#post450463): ++ New class cMarksReload checks the timestamp of marks.vdr in 10 seconds ++ intervals, so the marks in the threads dvbplayer and replaycontrol can be ++ reloaded independently ++ Changed setup parameter "Load marks interval (s)" to "Reload marks" ++ Updated description in README.jumpplay ++ ++ 2006-05-28: Version 0.9 - Thomas Gnther <tom@toms-cafe.de> ++ New setup parameter "Pause at last mark" ++ Updated description in README.jumpplay ++ Moved parameters description to MANUAL ++ ++ 2009-03-31: Version 1.0 - Thomas Gnther <tom@toms-cafe.de> ++ Play&Jump: ++ - set resume position to 0 if replay stops at the first mark ++ Added French language texts (thanks to Michal Nival) +diff -Naurp vdr-1.7.6/config.c vdr-1.7.6-jumpplay/config.c +--- vdr-1.7.6/config.c 2009-01-24 15:05:32.000000000 +0000 ++++ vdr-1.7.6-jumpplay/config.c 2009-04-27 15:49:00.000000000 +0000 +@@ -283,6 +283,10 @@ cSetup::cSetup(void) + MultiSpeedMode = 0; + ShowReplayMode = 0; + ResumeID = 0; ++ JumpPlay = 0; ++ PlayJump = 0; ++ PauseLastMark = 0; ++ ReloadMarks = 0; + CurrentChannel = -1; + CurrentVolume = MAXVOLUME; + CurrentDolby = 0; +@@ -456,6 +460,10 @@ bool cSetup::Parse(const char *Name, con + else if (!strcasecmp(Name, "MultiSpeedMode")) MultiSpeedMode = atoi(Value); + else if (!strcasecmp(Name, "ShowReplayMode")) ShowReplayMode = atoi(Value); + else if (!strcasecmp(Name, "ResumeID")) ResumeID = atoi(Value); ++ else if (!strcasecmp(Name, "JumpPlay")) JumpPlay = atoi(Value); ++ else if (!strcasecmp(Name, "PlayJump")) PlayJump = atoi(Value); ++ else if (!strcasecmp(Name, "PauseLastMark")) PauseLastMark = atoi(Value); ++ else if (!strcasecmp(Name, "ReloadMarks")) ReloadMarks = atoi(Value); + else if (!strcasecmp(Name, "CurrentChannel")) CurrentChannel = atoi(Value); + else if (!strcasecmp(Name, "CurrentVolume")) CurrentVolume = atoi(Value); + else if (!strcasecmp(Name, "CurrentDolby")) CurrentDolby = atoi(Value); +@@ -539,6 +547,10 @@ bool cSetup::Save(void) + Store("MultiSpeedMode", MultiSpeedMode); + Store("ShowReplayMode", ShowReplayMode); + Store("ResumeID", ResumeID); ++ Store("JumpPlay", JumpPlay); ++ Store("PlayJump", PlayJump); ++ Store("PauseLastMark", PauseLastMark); ++ Store("ReloadMarks", ReloadMarks); + Store("CurrentChannel", CurrentChannel); + Store("CurrentVolume", CurrentVolume); + Store("CurrentDolby", CurrentDolby); +diff -Naurp vdr-1.7.6/config.h vdr-1.7.6-jumpplay/config.h +--- vdr-1.7.6/config.h 2009-04-12 14:20:52.000000000 +0000 ++++ vdr-1.7.6-jumpplay/config.h 2009-04-27 15:49:00.000000000 +0000 +@@ -36,6 +36,8 @@ + // plugins to work with newer versions of the core VDR as long as no + // VDR header files have changed. + ++#define JUMPPLAYVERSNUM 100 ++ + #define MAXPRIORITY 99 + #define MAXLIFETIME 99 + +@@ -260,6 +262,10 @@ public: + int MultiSpeedMode; + int ShowReplayMode; + int ResumeID; ++ int JumpPlay; ++ int PlayJump; ++ int PauseLastMark; ++ int ReloadMarks; + int CurrentChannel; + int CurrentVolume; + int CurrentDolby; +diff -Naurp vdr-1.7.6/dvbplayer.c vdr-1.7.6-jumpplay/dvbplayer.c +--- vdr-1.7.6/dvbplayer.c 2009-04-19 15:19:10.000000000 +0000 ++++ vdr-1.7.6-jumpplay/dvbplayer.c 2009-04-27 17:33:20.000000000 +0000 +@@ -204,6 +204,7 @@ private: + cNonBlockingFileReader *nonBlockingFileReader; + cRingBufferFrame *ringBuffer; + cPtsIndex ptsIndex; ++ cMarksReload marks; + cFileName *fileName; + cIndexFile *index; + cUnbufferedFile *replayFile; +@@ -249,7 +250,7 @@ public: + int cDvbPlayer::Speeds[] = { 0, -2, -4, -8, 1, 2, 4, 12, 0 }; + + cDvbPlayer::cDvbPlayer(const char *FileName) +-:cThread("dvbplayer") ++:cThread("dvbplayer"), marks(FileName) + { + nonBlockingFileReader = NULL; + ringBuffer = NULL; +@@ -357,6 +358,10 @@ bool cDvbPlayer::Save(void) + if (index) { + int Index = ptsIndex.FindIndex(DeviceGetSTC()); + if (Index >= 0) { ++ // set resume position to 0 if replay stops at the first mark ++ if (Setup.PlayJump && marks.First() && ++ abs(Index - marks.First()->position) <= int(round(RESUMEBACKUP * framesPerSecond))) ++ Index = 0; + Index -= int(round(RESUMEBACKUP * framesPerSecond)); + if (Index > 0) + Index = index->GetNextIFrame(Index, false); +@@ -384,11 +389,26 @@ void cDvbPlayer::Action(void) + uchar *b = NULL; + uchar *p = NULL; + int pc = 0; ++ bool cutIn = false; ++ int total = -1; + + readIndex = Resume(); + if (readIndex >= 0) + isyslog("resuming replay at index %d (%s)", readIndex, *IndexToHMSF(readIndex, true, framesPerSecond)); + ++ if (Setup.PlayJump && readIndex <= 0 && marks.First() && index) { ++ int Index = marks.First()->position; ++ uint16_t FileNumber; ++ off_t FileOffset; ++ if (index->Get(Index, &FileNumber, &FileOffset) && ++ NextFile(FileNumber, FileOffset)) { ++ isyslog("PlayJump: start replay at first mark %d (%s)", ++ Index, *IndexToHMSF(Index, true, framesPerSecond)); ++ readIndex = Index; ++ } ++ } ++ ++ bool LastMarkPause = false; + nonBlockingFileReader = new cNonBlockingFileReader; + int Length = 0; + bool Sleep = false; +@@ -411,7 +431,7 @@ void cDvbPlayer::Action(void) + + // Read the next frame from the file: + +- if (playMode != pmStill && playMode != pmPause) { ++ if (playMode != pmStill && playMode != pmPause && !LastMarkPause) { + if (!readFrame && (replayFile || readIndex >= 0)) { + if (!nonBlockingFileReader->Reading()) { + if (!SwitchToPlayFrame && (playMode == pmFast || (playMode == pmSlow && playDir == pdBackward))) { +@@ -448,6 +468,44 @@ void cDvbPlayer::Action(void) + else if (index) { + uint16_t FileNumber; + off_t FileOffset; ++ if (Setup.PlayJump || Setup.PauseLastMark) { ++ // check for end mark - jump to next mark or pause ++ readIndex++; ++ marks.Reload(); ++ cMark *m = marks.Get(readIndex); ++ if (m && (m->Index() & 0x01) != 0) { ++ m = marks.Next(m); ++ int Index; ++ if (m) ++ Index = m->position; ++ else if (Setup.PauseLastMark) { ++ // pause at last mark ++ isyslog("PauseLastMark: pause at position %d (%s)", ++ readIndex, *IndexToHMSF(readIndex, true, framesPerSecond)); ++ LastMarkPause = true; ++ Index = -1; ++ } ++ else if (total == index->Last()) ++ // at last mark jump to end of recording ++ Index = index->Last() - 1; ++ else ++ // jump but stay off end of live-recordings ++ Index = index->GetNextIFrame(index->Last() - int(round(MAXSTUCKATEOF * framesPerSecond)), true); ++ // don't jump in edited recordings ++ if (Setup.PlayJump && Index > readIndex && ++ Index > index->GetNextIFrame(readIndex, true)) { ++ isyslog("PlayJump: %d frames to %d (%s)", ++ Index - readIndex, Index, ++ *IndexToHMSF(Index, true, framesPerSecond)); ++ readIndex = Index; ++ cutIn = true; ++ } ++ } ++ readIndex--; ++ } ++ // for detecting growing length of live-recordings ++ if (index->Get(readIndex + 1, &FileNumber, &FileOffset, &readIndependent) && readIndependent) ++ total = index->Last(); + if (index->Get(readIndex + 1, &FileNumber, &FileOffset, &readIndependent, &Length) && NextFile(FileNumber, FileOffset)) + readIndex++; + else +@@ -489,6 +547,13 @@ void cDvbPlayer::Action(void) + // Store the frame in the buffer: + + if (readFrame) { ++ if (cutIn) { ++ if (isPesRecording) ++ cRemux::SetBrokenLink(readFrame->Data(), readFrame->Count()); ++ else ++ TsSetTeiOnBrokenPackets(readFrame->Data(), readFrame->Count()); ++ cutIn = false; ++ } + if (ringBuffer->Put(readFrame)) + readFrame = NULL; + else +@@ -548,8 +613,13 @@ void cDvbPlayer::Action(void) + p = NULL; + } + } +- else ++ else { ++ if (LastMarkPause) { ++ LastMarkPause = false; ++ playMode = pmPause; ++ } + Sleep = true; ++ } + + // Handle hitting begin/end of recording: + +diff -Naurp vdr-1.7.6/menu.c vdr-1.7.6-jumpplay/menu.c +--- vdr-1.7.6/menu.c 2009-01-24 15:05:43.000000000 +0000 ++++ vdr-1.7.6-jumpplay/menu.c 2009-04-27 15:49:00.000000000 +0000 +@@ -2717,6 +2717,10 @@ cMenuSetupReplay::cMenuSetupReplay(void) + Add(new cMenuEditBoolItem(tr("Setup.Replay$Multi speed mode"), &data.MultiSpeedMode)); + Add(new cMenuEditBoolItem(tr("Setup.Replay$Show replay mode"), &data.ShowReplayMode)); + Add(new cMenuEditIntItem(tr("Setup.Replay$Resume ID"), &data.ResumeID, 0, 99)); ++ Add(new cMenuEditBoolItem(tr("Setup.Replay$Jump&Play"), &data.JumpPlay)); ++ Add(new cMenuEditBoolItem(tr("Setup.Replay$Play&Jump"), &data.PlayJump)); ++ Add(new cMenuEditBoolItem(tr("Setup.Replay$Pause at last mark"), &data.PauseLastMark)); ++ Add(new cMenuEditBoolItem(tr("Setup.Replay$Reload marks"), &data.ReloadMarks)); + } + + void cMenuSetupReplay::Store(void) +@@ -4008,7 +4012,7 @@ char *cReplayControl::fileName = NULL; + char *cReplayControl::title = NULL; + + cReplayControl::cReplayControl(void) +-:cDvbPlayerControl(fileName) ++:cDvbPlayerControl(fileName), marks(fileName) + { + currentReplayControl = this; + displayReplay = NULL; +@@ -4020,7 +4024,6 @@ cReplayControl::cReplayControl(void) + timeSearchActive = false; + cRecording Recording(fileName); + cStatus::MsgReplaying(this, Recording.Name(), Recording.FileName(), true); +- marks.Load(fileName, Recording.FramesPerSecond(), Recording.IsPesRecording()); + SetTrackDescriptions(false); + } + +@@ -4248,8 +4251,10 @@ void cReplayControl::MarkToggle(void) + ShowTimed(2); + bool Play, Forward; + int Speed; +- if (GetReplayMode(Play, Forward, Speed) && !Play) ++ if (GetReplayMode(Play, Forward, Speed) && !Play) { + Goto(Current, true); ++ displayFrames = true; ++ } + } + marks.Save(); + } +@@ -4262,8 +4267,17 @@ void cReplayControl::MarkJump(bool Forwa + if (GetIndex(Current, Total)) { + cMark *m = Forward ? marks.GetNext(Current) : marks.GetPrev(Current); + if (m) { +- Goto(m->position, true); +- displayFrames = true; ++ bool Play2, Forward2; ++ int Speed; ++ if (Setup.JumpPlay && GetReplayMode(Play2, Forward2, Speed) && ++ Play2 && Forward && m->position < Total - SecondsToFrames(3, FramesPerSecond())) { ++ Goto(m->position); ++ Play(); ++ } ++ else { ++ Goto(m->position, true); ++ displayFrames = true; ++ } + } + } + } +@@ -4318,7 +4332,7 @@ void cReplayControl::EditTest(void) + if (!m) + m = marks.GetNext(Current); + if (m) { +- if ((m->Index() & 0x01) != 0) ++ if ((m->Index() & 0x01) != 0 && !Setup.PlayJump) + m = marks.Next(m); + if (m) { + Goto(m->position - SecondsToFrames(3, FramesPerSecond())); +@@ -4340,6 +4354,7 @@ eOSState cReplayControl::ProcessKey(eKey + { + if (!Active()) + return osEnd; ++ marks.Reload(); + if (visible) { + if (timeoutShow && time(NULL) > timeoutShow) { + Hide(); +diff -Naurp vdr-1.7.6/menu.h vdr-1.7.6-jumpplay/menu.h +--- vdr-1.7.6/menu.h 2008-02-10 16:01:53.000000000 +0000 ++++ vdr-1.7.6-jumpplay/menu.h 2009-04-27 15:49:00.000000000 +0000 +@@ -212,7 +212,7 @@ public: + class cReplayControl : public cDvbPlayerControl { + private: + cSkinDisplayReplay *displayReplay; +- cMarks marks; ++ cMarksReload marks; + bool visible, modeOnly, shown, displayFrames; + int lastCurrent, lastTotal; + bool lastPlay, lastForward; +diff -Naurp vdr-1.7.6/po/de_DE.po vdr-1.7.6-jumpplay/po/de_DE.po +--- vdr-1.7.6/po/de_DE.po 2009-04-18 15:24:48.000000000 +0000 ++++ vdr-1.7.6-jumpplay/po/de_DE.po 2009-04-27 15:49:00.000000000 +0000 +@@ -755,6 +755,18 @@ msgstr "Editierte Dateien aufteilen" + msgid "Replay" + msgstr "Wiedergabe" + ++msgid "Setup.Replay$Jump&Play" ++msgstr "Wiedergabe nach Sprung" ++ ++msgid "Setup.Replay$Play&Jump" ++msgstr "Sprung bei Schnittmarke" ++ ++msgid "Setup.Replay$Pause at last mark" ++msgstr "Pause bei letzter Marke" ++ ++msgid "Setup.Replay$Reload marks" ++msgstr "Marken aktualisieren" ++ + msgid "Setup.Replay$Multi speed mode" + msgstr "Mehrstufiger Vor-/Rcklauf" + +diff -Naurp vdr-1.7.6/po/fr_FR.po vdr-1.7.6-jumpplay/po/fr_FR.po +--- vdr-1.7.6/po/fr_FR.po 2009-04-18 15:24:48.000000000 +0000 ++++ vdr-1.7.6-jumpplay/po/fr_FR.po 2009-04-27 15:49:00.000000000 +0000 +@@ -761,6 +761,18 @@ msgstr "Sparer les squences dites" + msgid "Replay" + msgstr "Lecture" + ++msgid "Setup.Replay$Jump&Play" ++msgstr "Lecture aprs saut" ++ ++msgid "Setup.Replay$Play&Jump" ++msgstr "Saut sur les marques de dcoupes" ++ ++msgid "Setup.Replay$Pause at last mark" ++msgstr "Pause aprs la dernire marque" ++ ++msgid "Setup.Replay$Reload marks" ++msgstr "Actualiser les marques" ++ + msgid "Setup.Replay$Multi speed mode" + msgstr "Mode multi-vitesses" + +diff -Naurp vdr-1.7.6/recording.c vdr-1.7.6-jumpplay/recording.c +--- vdr-1.7.6/recording.c 2009-04-13 13:50:39.000000000 +0000 ++++ vdr-1.7.6-jumpplay/recording.c 2009-04-27 15:49:00.000000000 +0000 +@@ -1295,6 +1295,52 @@ cMark *cMarks::GetNext(int Position) + return NULL; + } + ++// --- cMarksReload ---------------------------------------------------------- ++ ++#define MARKS_RELOAD_MS 10000 ++ ++time_t cMarksReload::lastsavetime = 0; ++ ++cMarksReload::cMarksReload(const char *RecordingFileName) ++:recDir(RecordingFileName) ++{ ++ struct stat sbuf; ++ cRecording rec(recDir); ++ if (Load(recDir, rec.FramesPerSecond(), rec.IsPesRecording()) && ++ stat(FileName(), &sbuf) == 0) ++ lastmodtime = sbuf.st_mtime; ++ else ++ lastmodtime = 0; ++ nextreload.Set(MARKS_RELOAD_MS - cTimeMs::Now() % MARKS_RELOAD_MS); ++} ++ ++bool cMarksReload::Reload(void) ++{ ++ // Check the timestamp of marks.vdr in 10 seconds intervals ++ // Independent but synchronized reloading of marks in two threads ++ if ((Setup.ReloadMarks && nextreload.TimedOut()) || ++ lastsavetime > lastmodtime) { ++ nextreload.Set(MARKS_RELOAD_MS - cTimeMs::Now() % MARKS_RELOAD_MS); ++ struct stat sbuf; ++ if (stat(FileName(), &sbuf) == 0 && sbuf.st_mtime != lastmodtime) { ++ lastmodtime = sbuf.st_mtime; ++ cRecording rec(recDir); ++ if (Load(recDir, rec.FramesPerSecond(), rec.IsPesRecording())) ++ return true; ++ } ++ } ++ return false; ++} ++ ++bool cMarksReload::Save(void) ++{ ++ bool ok = cMarks::Save(); ++ struct stat sbuf; ++ if (ok && stat(FileName(), &sbuf) == 0) ++ lastsavetime = lastmodtime = sbuf.st_mtime; ++ return ok; ++} ++ + // --- cRecordingUserCommand ------------------------------------------------- + + const char *cRecordingUserCommand::command = NULL; +diff -Naurp vdr-1.7.6/recording.h vdr-1.7.6-jumpplay/recording.h +--- vdr-1.7.6/recording.h 2009-04-19 09:00:45.000000000 +0000 ++++ vdr-1.7.6-jumpplay/recording.h 2009-04-27 15:49:00.000000000 +0000 +@@ -194,6 +194,18 @@ public: + cMark *GetNext(int Position); + }; + ++class cMarksReload : public cMarks { ++private: ++ cString recDir; ++ cTimeMs nextreload; ++ time_t lastmodtime; ++ static time_t lastsavetime; ++public: ++ cMarksReload(const char *RecordingFileName); ++ bool Reload(void); ++ bool Save(void); ++ }; ++ + #define RUC_BEFORERECORDING "before" + #define RUC_AFTERRECORDING "after" + #define RUC_EDITEDRECORDING "edited" --- vdr-1.7.14.orig/debian/patches/99_vdr-workaround-broken-sys-capability.dpatch +++ vdr-1.7.14/debian/patches/99_vdr-workaround-broken-sys-capability.dpatch @@ -0,0 +1,32 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 99_vdr-workaround-broken-sys-capability.dpatch by Anssi Hannula <anssi.hannula@gmail.com> +## http://www.linuxtv.org/pipermail/vdr/2009-August/021196.html +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: This is a workaround for some trouble with the kernel headers +## DP: in Linux 2.6.29. +## DP: See: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=523424 + +@DPATCH@ +Index: vdr-1.7.9/vdr.c +=================================================================== +--- vdr-1.7.9/vdr.c ++++ vdr-1.7.9/vdr.c 2009-08-23 23:26:15.935332431 +0300 +@@ -32,7 +32,6 @@ + #include <pwd.h> + #include <signal.h> + #include <stdlib.h> +-#include <sys/capability.h> + #include <sys/prctl.h> + #include <termios.h> + #include <unistd.h> +@@ -64,6 +63,9 @@ + #include "tools.h" + #include "transfer.h" + #include "videodir.h" ++// include this one last due to some versions of it being buggy: ++// http://www.linuxtv.org/pipermail/vdr/2009-August/021194.html ++#include <sys/capability.h> + + #define MINCHANNELWAIT 10 // seconds to wait between failed channel switchings + #define ACTIVITYTIMEOUT 60 // seconds before starting housekeeping --- vdr-1.7.14.orig/debian/patches/opt-29_syncearly.dpatch +++ vdr-1.7.14/debian/patches/opt-29_syncearly.dpatch @@ -0,0 +1,165 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-29_syncearly.dpatch by Reinhard Nissl <rnissl@gmx.de> +## +## vdr-freak at vdrportal.de: +## - extracted from extensions patch +## http://vdrportal.de/board/thread.php?postid=668434#post668434 +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Speed up zapping channels. + +@DPATCH@ +diff -ruN vdr-1.5.11/config.c vdr-1.5.11-syncearly/config.c +--- vdr-1.5.11/config.c 2007-10-06 16:28:58.000000000 +0200 ++++ vdr-1.5.11-syncearly/config.c 2007-11-11 19:44:35.000000000 +0100 +@@ -261,6 +261,7 @@ + VideoFormat = 0; + UpdateChannels = 5; + UseDolbyDigital = 1; ++ UseSyncEarlyPatch = 0; + ChannelInfoPos = 0; + ChannelInfoTime = 5; + OSDLeft = 54; +@@ -436,6 +437,7 @@ + else if (!strcasecmp(Name, "VideoFormat")) VideoFormat = atoi(Value); + else if (!strcasecmp(Name, "UpdateChannels")) UpdateChannels = atoi(Value); + else if (!strcasecmp(Name, "UseDolbyDigital")) UseDolbyDigital = atoi(Value); ++ else if (!strcasecmp(Name, "UseSyncEarlyPatch")) UseSyncEarlyPatch = atoi(Value); + else if (!strcasecmp(Name, "ChannelInfoPos")) ChannelInfoPos = atoi(Value); + else if (!strcasecmp(Name, "ChannelInfoTime")) ChannelInfoTime = atoi(Value); + else if (!strcasecmp(Name, "OSDLeft")) OSDLeft = atoi(Value); +@@ -518,6 +520,7 @@ + Store("VideoFormat", VideoFormat); + Store("UpdateChannels", UpdateChannels); + Store("UseDolbyDigital", UseDolbyDigital); ++ Store("UseSyncEarlyPatch", UseSyncEarlyPatch); + Store("ChannelInfoPos", ChannelInfoPos); + Store("ChannelInfoTime", ChannelInfoTime); + Store("OSDLeft", OSDLeft); +diff -ruN vdr-1.5.11/config.h vdr-1.5.11-syncearly/config.h +--- vdr-1.5.11/config.h 2007-10-17 20:34:17.000000000 +0200 ++++ vdr-1.5.11-syncearly/config.h 2007-11-11 19:44:21.000000000 +0100 +@@ -242,6 +242,7 @@ + int VideoFormat; + int UpdateChannels; + int UseDolbyDigital; ++ int UseSyncEarlyPatch; + int ChannelInfoPos; + int ChannelInfoTime; + int OSDLeft, OSDTop, OSDWidth, OSDHeight; +diff -ruN vdr-1.5.11/device.c vdr-1.5.11-syncearly/device.c +--- vdr-1.5.11/device.c 2007-11-03 14:30:09.000000000 +0100 ++++ vdr-1.5.11-syncearly/device.c 2007-11-11 19:44:55.000000000 +0100 +@@ -824,7 +824,7 @@ + } + for (int i = 0; i < MAXSPIDS; i++) + SetAvailableTrack(ttSubtitle, i, Channel->Spid(i), Channel->Slang(i)); +- if (!NeedsTransferMode) ++ if ((Setup.UseSyncEarlyPatch && (!NeedsTransferMode || GetCurrentAudioTrack() == ttNone)) || (!Setup.UseSyncEarlyPatch && !NeedsTransferMode)) + EnsureAudioTrack(true); + EnsureSubtitleTrack(); + } +diff -ruN vdr-1.5.11/menu.c vdr-1.5.11-syncearly/menu.c +--- vdr-1.5.11/menu.c 2007-11-03 16:02:00.000000000 +0100 ++++ vdr-1.5.11-syncearly/menu.c 2007-11-11 19:46:07.000000000 +0100 +@@ -2461,6 +2461,7 @@ + Add(new cMenuEditIntItem( tr("Setup.DVB$Subtitle foreground transparency"), &data.SubtitleFgTransparency, 0, 9)); + Add(new cMenuEditIntItem( tr("Setup.DVB$Subtitle background transparency"), &data.SubtitleBgTransparency, 0, 10)); + } ++ Add(new cMenuEditBoolItem(tr("Setup.DVB$Use Sync Early Patch"), &data.UseSyncEarlyPatch)); + + SetCurrent(Get(current)); + Display(); +diff -ruN vdr-1.5.11/remux.c vdr-1.5.11-syncearly/remux.c +--- vdr-1.5.11/remux.c 2007-11-03 15:18:07.000000000 +0100 ++++ vdr-1.5.11-syncearly/remux.c 2007-11-11 19:45:54.000000000 +0100 +@@ -1874,12 +1874,13 @@ + + #define RESULTBUFFERSIZE KILOBYTE(256) + +-cRemux::cRemux(int VPid, const int *APids, const int *DPids, const int *SPids, bool ExitOnFailure) ++cRemux::cRemux(int VPid, const int *APids, const int *DPids, const int *SPids, bool ExitOnFailure, bool SyncEarly) + { + exitOnFailure = ExitOnFailure; + noVideo = VPid == 0 || VPid == 1 || VPid == 0x1FFF; + numUPTerrors = 0; + synced = false; ++ syncEarly = SyncEarly; + skipped = 0; + numTracks = 0; + resultSkipped = 0; +@@ -2081,12 +2082,18 @@ + ShutdownHandler.RequestEmergencyExit(); + } + else if (!synced) { +- if (pt == I_FRAME) { ++ if (pt == I_FRAME || syncEarly) { + if (PictureType) + *PictureType = pt; + resultSkipped = i; // will drop everything before this position ++ if (!syncEarly) + SetBrokenLink(data + i, l); + synced = true; ++ if (syncEarly) { ++ if (pt == I_FRAME) // syncEarly: it's ok but there is no need to call SetBrokenLink() ++ SetBrokenLink(data + i, l); ++ else fprintf(stderr, "video: synced early\n"); ++ } + } + } + else if (Count) +@@ -2099,12 +2106,13 @@ + l = GetPacketLength(data, resultCount, i); + if (l < 0) + return resultData; +- if (noVideo) { ++ if (noVideo || !synced && syncEarly) { + if (!synced) { +- if (PictureType) ++ if (PictureType && noVideo) + *PictureType = I_FRAME; + resultSkipped = i; // will drop everything before this position + synced = true; ++ if (!noVideo && syncEarly) fprintf(stderr, "audio: synced early\n"); + } + else if (Count) + return resultData; +diff -ruN vdr-1.5.11/remux.h vdr-1.5.11-syncearly/remux.h +--- vdr-1.5.11/remux.h 2007-09-02 12:19:06.000000000 +0200 ++++ vdr-1.5.11-syncearly/remux.h 2007-11-11 19:47:24.000000000 +0100 +@@ -40,6 +40,7 @@ + bool noVideo; + int numUPTerrors; + bool synced; ++ bool syncEarly; + int skipped; + cTS2PES *ts2pes[MAXTRACKS]; + int numTracks; +@@ -47,12 +48,14 @@ + int resultSkipped; + int GetPid(const uchar *Data); + public: +- cRemux(int VPid, const int *APids, const int *DPids, const int *SPids, bool ExitOnFailure = false); ++ cRemux(int VPid, const int *APids, const int *DPids, const int *SPids, bool ExitOnFailure = false, bool SyncEarly = false); + ///< Creates a new remuxer for the given PIDs. VPid is the video PID, while + ///< APids, DPids and SPids are pointers to zero terminated lists of audio, + ///< dolby and subtitle PIDs (the pointers may be NULL if there is no such + ///< PID). If ExitOnFailure is true, the remuxer will initiate an "emergency + ///< exit" in case of problems with the data stream. ++ ///< SyncEarly causes cRemux to sync as soon as a video or audio frame is seen. ++ + ~cRemux(); + void SetTimeouts(int PutTimeout, int GetTimeout) { resultBuffer->SetTimeouts(PutTimeout, GetTimeout); } + ///< By default cRemux assumes that Put() and Get() are called from different +diff -ruN vdr-1.5.11/transfer.c vdr-1.5.11-syncearly/transfer.c +--- vdr-1.5.11/transfer.c 2007-01-05 11:45:28.000000000 +0100 ++++ vdr-1.5.11-syncearly/transfer.c 2007-11-11 19:45:08.000000000 +0100 +@@ -19,7 +19,7 @@ + ,cThread("transfer") + { + ringBuffer = new cRingBufferLinear(TRANSFERBUFSIZE, TS_SIZE * 2, true, "Transfer"); +- remux = new cRemux(VPid, APids, Setup.UseDolbyDigital ? DPids : NULL, SPids); ++ remux = new cRemux(VPid, APids, Setup.UseDolbyDigital ? DPids : NULL, SPids, false, Setup.UseSyncEarlyPatch); + } + + cTransfer::~cTransfer() --- vdr-1.7.14.orig/debian/patches/opt-22-x_edit_marks.dpatch +++ vdr-1.7.14/debian/patches/opt-22-x_edit_marks.dpatch @@ -0,0 +1,75 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-22-x_edit_marks.dpatch by FrankJepsen at vdrportal.de +## http://vdrportal.de/board/thread.php?postid=718583#post718583 +## +## Thomas Gnther <tom@toms-cafe.de>: +## - adapted to VDR-1.7.12 +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Patch adds keys '1', '3' in replay mode to move marks by +/-5secs. +## DP: When in replay mode key '0' sets a mark and stops there. +## DP: 'Green' and 'Yellow' act as 'Prev' and 'Next'. + +@DPATCH@ +diff -Naurp vdr-1.7.12-liemikuutio/menu.c vdr-1.7.12-liemikuutio-editmarks/menu.c +--- vdr-1.7.12-liemikuutio/menu.c 2010-02-01 14:42:47.000000000 +0000 ++++ vdr-1.7.12-liemikuutio-editmarks/menu.c 2010-02-01 21:18:07.000000000 +0000 +@@ -4924,10 +4924,6 @@ eOSState cReplayControl::ProcessKey(eKey + case kGreen: SkipSeconds(-60); break; + case kYellow|k_Repeat: + case kYellow: SkipSeconds( 60); break; +- case k1|k_Repeat: +- case k1: SkipSeconds(-20); break; +- case k3|k_Repeat: +- case k3: SkipSeconds( 20); break; + case kPrev|k_Repeat: + case kPrev: if (lastSkipTimeout.TimedOut()) { + lastSkipSeconds = REPLAYCONTROLSKIPSECONDS; +@@ -4955,10 +4951,46 @@ eOSState cReplayControl::ProcessKey(eKey + Stop(); + return osEnd; + default: { ++ bool play, forward; ++ int speed; ++ int Current, Total; ++ cMark *m; ++ + DoShowMode = false; + switch (Key) { + // Editing: +- case kMarkToggle: MarkToggle(); break; ++ case k1|k_Repeat: ++ case k1: if (GetReplayMode(play, forward, speed) && !play && GetIndex(Current, Total) && (m = marks.Get(Current)) != NULL) { ++ displayFrames = true; ++ int p = SkipFrames(-SecondsToFrames(5, FramesPerSecond())); ++ cMark *m2; ++ if ((m2 = marks.Prev(m)) != NULL && m2->position >= p) ++ break; ++ Goto(m->position = p, true); ++ marks.Save(); ++ } ++ else ++ SkipSeconds(-20); ++ break; ++ case k3|k_Repeat: ++ case k3: if (GetReplayMode(play, forward, speed) && !play && GetIndex(Current, Total) && (m = marks.Get(Current)) != NULL) { ++ displayFrames = true; ++ int p = SkipFrames(SecondsToFrames(5, FramesPerSecond())); ++ cMark *m2; ++ if ((m2 = marks.Next(m)) != NULL && m2->position <= p) ++ break; ++ Goto(m->position = p, true); ++ marks.Save(); ++ } ++ else ++ SkipSeconds(20); ++ break; ++ case kMarkToggle: if (GetReplayMode(play, forward, speed) && play) { ++ displayFrames = true; ++ Pause(); ++ } ++ MarkToggle(); ++ break; + case kMarkJumpBack|k_Repeat: + case kMarkJumpBack: MarkJump(false); break; + case kMarkJumpForward|k_Repeat: --- vdr-1.7.14.orig/debian/patches/opt-38_disableDoubleEpgEntrys.dpatch +++ vdr-1.7.14/debian/patches/opt-38_disableDoubleEpgEntrys.dpatch @@ -0,0 +1,349 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-38_disableDoubleEpgEntrys.dpatch by Emanuel Wontorra <hoerzu2vdr@wontorra.net> +## http://vdrportal.de/board/thread.php?postid=317214#post317214 +## +## Thomas Gnther <tom@toms-cafe.de>: +## - adapted to VDR-1.5.1 +## - adapted to VDR-1.5.7 +## http://toms-cafe.de/vdr/download/vdr-disableDoubleEpgEntrys_0.7.3b-1.5.7.diff +## Tobias Grimm <tg@e-tobi.net>: +## - added buffer overflow fix from: +## http://vdrportal.de/board/thread.php?postid=683477#post683477 +## Thomas Gnther <tom@toms-cafe.de>: +## - added French language texts (thanks to Michal Nival) +## http://toms-cafe.de/vdr/download/vdr-disableDoubleEpgEntrys_0.7.3b-1.6.0.diff +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: This patch suppresses double EPG entries. + +@DPATCH@ +diff -Naurp vdr-1.6.0/config.c vdr-1.6.0-disableDoubleEpgEntrys/config.c +--- vdr-1.6.0/config.c 2008-02-17 13:39:00.000000000 +0000 ++++ vdr-1.6.0-disableDoubleEpgEntrys/config.c 2009-03-29 23:25:00.000000000 +0000 +@@ -241,6 +241,10 @@ cSetup::cSetup(void) + SubtitleFgTransparency = 0; + SubtitleBgTransparency = 0; + EPGLanguages[0] = -1; ++ DoubleEpgTimeDelta = 15; ++ DoubleEpgAction = 0; ++ MixEpgAction = 0; ++ DisableVPS = 0; + EPGScanTimeout = 5; + EPGBugfixLevel = 3; + EPGLinger = 0; +@@ -414,6 +418,10 @@ bool cSetup::Parse(const char *Name, con + else if (!strcasecmp(Name, "SubtitleFgTransparency")) SubtitleFgTransparency = atoi(Value); + else if (!strcasecmp(Name, "SubtitleBgTransparency")) SubtitleBgTransparency = atoi(Value); + else if (!strcasecmp(Name, "EPGLanguages")) return ParseLanguages(Value, EPGLanguages); ++ else if (!strcasecmp(Name, "DoubleEpgTimeDelta")) DoubleEpgTimeDelta = atoi(Value); ++ else if (!strcasecmp(Name, "DoubleEpgAction")) DoubleEpgAction = atoi(Value); ++ else if (!strcasecmp(Name, "MixEpgAction")) MixEpgAction = atoi(Value); ++ else if (!strcasecmp(Name, "DisableVPS")) DisableVPS = atoi(Value); + else if (!strcasecmp(Name, "EPGScanTimeout")) EPGScanTimeout = atoi(Value); + else if (!strcasecmp(Name, "EPGBugfixLevel")) EPGBugfixLevel = atoi(Value); + else if (!strcasecmp(Name, "EPGLinger")) EPGLinger = atoi(Value); +@@ -497,6 +505,10 @@ bool cSetup::Save(void) + Store("SubtitleFgTransparency", SubtitleFgTransparency); + Store("SubtitleBgTransparency", SubtitleBgTransparency); + StoreLanguages("EPGLanguages", EPGLanguages); ++ Store("DoubleEpgTimeDelta", DoubleEpgTimeDelta); ++ Store("DoubleEpgAction", DoubleEpgAction); ++ Store("MixEpgAction", MixEpgAction); ++ Store("DisableVPS", DisableVPS); + Store("EPGScanTimeout", EPGScanTimeout); + Store("EPGBugfixLevel", EPGBugfixLevel); + Store("EPGLinger", EPGLinger); +diff -Naurp vdr-1.6.0/config.h vdr-1.6.0-disableDoubleEpgEntrys/config.h +--- vdr-1.6.0/config.h 2008-03-23 10:26:10.000000000 +0000 ++++ vdr-1.6.0-disableDoubleEpgEntrys/config.h 2009-03-29 23:25:00.000000000 +0000 +@@ -225,6 +225,10 @@ public: + int SubtitleOffset; + int SubtitleFgTransparency, SubtitleBgTransparency; + int EPGLanguages[I18N_MAX_LANGUAGES + 1]; ++ int DoubleEpgTimeDelta; ++ int DoubleEpgAction; ++ int MixEpgAction; ++ int DisableVPS; + int EPGScanTimeout; + int EPGBugfixLevel; + int EPGLinger; +diff -Naurp vdr-1.6.0/eit.c vdr-1.6.0-disableDoubleEpgEntrys/eit.c +--- vdr-1.6.0/eit.c 2007-08-26 10:56:33.000000000 +0000 ++++ vdr-1.6.0-disableDoubleEpgEntrys/eit.c 2009-03-29 23:25:00.000000000 +0000 +@@ -72,7 +72,83 @@ cEIT::cEIT(cSchedules *Schedules, int So + // not be overwritten. + if (pEvent->TableID() == 0x00) { + if (pEvent->Version() == getVersionNumber()) +- continue; ++ { ++ if(Setup.MixEpgAction == 0) ++ continue; ++ ++ //printf("in"); ++ //printf("%s", pEvent->GetTimeString()); ++ // to use the info of the original epg, update the extern one, ++ // if it has less info ++ SI::Descriptor *d; ++ SI::ExtendedEventDescriptors *ExtendedEventDescriptors = NULL; ++ //SI::ExtendedEventDescriptor *eed = NULL; ++ SI::ShortEventDescriptor *ShortEventDescriptor = NULL; ++ //SI::ShortEventDescriptor *sed = NULL; ++ //SI::TimeShiftedEventDescriptor *tsed = NULL; ++ //cLinkChannels *LinkChannels = NULL; ++ for (SI::Loop::Iterator it2; (d = SiEitEvent.eventDescriptors.getNext(it2));) ++ { ++ if(d->getDescriptorTag() == SI::ShortEventDescriptorTag) ++ { ++ int LanguagePreferenceShort = -1; ++ SI::ShortEventDescriptor *sed = (SI::ShortEventDescriptor *)d; ++ if (I18nIsPreferredLanguage(Setup.EPGLanguages, sed->languageCode, LanguagePreferenceShort) || !ShortEventDescriptor) ++ { ++ delete ShortEventDescriptor; ++ ShortEventDescriptor = sed; ++ d = NULL; // so that it is not deleted ++ } ++ } ++ else if(d->getDescriptorTag() == SI::ExtendedEventDescriptorTag) ++ { ++ int LanguagePreferenceExt = -1; ++ bool UseExtendedEventDescriptor = false; ++ SI::ExtendedEventDescriptor *eed = (SI::ExtendedEventDescriptor *)d; ++ if (I18nIsPreferredLanguage(Setup.EPGLanguages, eed->languageCode, LanguagePreferenceExt) || !ExtendedEventDescriptors) ++ { ++ delete ExtendedEventDescriptors; ++ ExtendedEventDescriptors = new SI::ExtendedEventDescriptors; ++ UseExtendedEventDescriptor = true; ++ } ++ if (UseExtendedEventDescriptor) ++ { ++ ExtendedEventDescriptors->Add(eed); ++ d = NULL; // so that it is not deleted ++ } ++ if (eed->getDescriptorNumber() == eed->getLastDescriptorNumber()) ++ UseExtendedEventDescriptor = false; ++ } ++ delete d; ++ } ++ if(pEvent) ++ { ++ ++ if(ShortEventDescriptor) ++ { ++ char buffer[256]; ++ if(ShortEventDescriptor->text.getText(buffer, sizeof(buffer)) && pEvent->ShortText() && (strlen(ShortEventDescriptor->text.getText(buffer, sizeof(buffer))) > strlen(pEvent->ShortText()))) ++ { ++ pEvent->SetShortText(ShortEventDescriptor->text.getText(buffer, sizeof(buffer))); ++ pEvent->FixEpgBugs(); ++ } ++ } ++ if(ExtendedEventDescriptors) ++ { ++ char buffer[ExtendedEventDescriptors->getMaximumTextLength(": ") + 1]; ++ //pEvent->SetDescription(ExtendedEventDescriptors->getText(buffer, sizeof(buffer), ": ")); ++ ++ if(ExtendedEventDescriptors->getText(buffer, sizeof(buffer), ": ") && pEvent->Description() && (strlen(ExtendedEventDescriptors->getText(buffer, sizeof(buffer), ": ")) > strlen(pEvent->Description()))) ++ { ++ pEvent->SetDescription(ExtendedEventDescriptors->getText(buffer, sizeof(buffer), ": ")); ++ pEvent->FixEpgBugs(); ++ } ++ } ++ } ++ delete ExtendedEventDescriptors; ++ delete ShortEventDescriptor; ++ continue; ++ } + HasExternalData = ExternalData = true; + } + // If the new event has a higher table ID, let's skip it. +@@ -97,7 +173,7 @@ cEIT::cEIT(cSchedules *Schedules, int So + if (newEvent) + pSchedule->AddEvent(newEvent); + if (Tid == 0x4E) { // we trust only the present/following info on the actual TS +- if (SiEitEvent.getRunningStatus() >= SI::RunningStatusNotRunning) ++ if (Setup.DisableVPS == 0 && SiEitEvent.getRunningStatus() >= SI::RunningStatusNotRunning) + pSchedule->SetRunningStatus(pEvent, SiEitEvent.getRunningStatus(), channel); + } + if (OnlyRunningStatus) +@@ -259,6 +335,80 @@ cEIT::cEIT(cSchedules *Schedules, int So + if (LinkChannels) + channel->SetLinkChannels(LinkChannels); + Modified = true; ++ ++ //to avoid double epg-entrys from ext and int epg sources :EW ++ if (pEvent && pEvent->TableID() != 0x00) ++ { ++ cEvent *pPreviousEvent = (cEvent *)pSchedule->GetPreviousEvent(pEvent); ++ ++ if (pPreviousEvent) ++ { ++ if(Setup.DoubleEpgAction == 0) ++ { ++ pPreviousEvent->SetStartTime(pEvent->StartTime()); ++ pPreviousEvent->SetDuration(pEvent->Duration()); ++ ++ if(Setup.DisableVPS == 0) ++ { ++ if(channel) ++ pPreviousEvent->SetRunningStatus(pEvent->RunningStatus(), channel); ++ else ++ pPreviousEvent->SetRunningStatus(pEvent->RunningStatus()); ++ } ++ ++ // to use the info of the original epg, update the extern one, ++ // if it has less info ++ char buffer_short_intern[256]; ++ char buffer_short_extern[256]; ++ int len_short_intern = 0; ++ int len_short_extern = 0; ++ ++ if (pEvent->ShortText()) ++ len_short_intern = snprintf (buffer_short_intern, sizeof(buffer_short_intern), "%s", pEvent->ShortText()); ++ ++ if (pPreviousEvent->ShortText()) ++ len_short_extern = snprintf (buffer_short_extern, sizeof(buffer_short_extern), "%s",pPreviousEvent->ShortText()); ++ ++ if(len_short_intern > 0) ++ { ++ if(len_short_extern < 1) ++ pPreviousEvent->SetShortText(buffer_short_intern); ++ else if (len_short_intern > len_short_extern) ++ pPreviousEvent->SetShortText(buffer_short_intern); ++ } ++ ++ if(pEvent->Description()) ++ { ++ char buffer_title_intern[4096]; ++ char buffer_title_extern[4096]; ++ int len_title_intern = 0; ++ int len_title_extern = 0; ++ ++ if (pEvent->Description()) ++ len_title_intern = snprintf (buffer_title_intern, sizeof(buffer_title_intern), "%s", pEvent->Description()); ++ ++ if (pPreviousEvent->Description()) ++ len_title_extern = snprintf (buffer_title_extern, sizeof(buffer_title_extern), "%s", pPreviousEvent->Description()); ++ ++ if(len_title_intern > 0) ++ { ++ if(len_title_extern < 1) ++ pPreviousEvent->SetDescription(buffer_title_intern); ++ else if (len_title_intern > len_title_extern) ++ pPreviousEvent->SetDescription(buffer_title_intern); ++ } ++ } ++ ++ if(pPreviousEvent->Vps() == 0 && pEvent->Vps() != 0) ++ pPreviousEvent->SetVps(pEvent->Vps()); ++ ++ pSchedule->DelEvent(pEvent); ++ pPreviousEvent->FixEpgBugs(); ++ } ++ else ++ pSchedule->DelEvent(pPreviousEvent); ++ } ++ } + } + if (Empty && Tid == 0x4E && getSectionNumber() == 0) + // ETR 211: an empty entry in section 0 of table 0x4E means there is currently no event running +diff -Naurp vdr-1.6.0/epg.c vdr-1.6.0-disableDoubleEpgEntrys/epg.c +--- vdr-1.6.0/epg.c 2008-02-16 16:09:12.000000000 +0000 ++++ vdr-1.6.0-disableDoubleEpgEntrys/epg.c 2009-03-29 23:25:00.000000000 +0000 +@@ -742,6 +742,29 @@ const cEvent *cSchedule::GetEventAround( + return pe; + } + ++const cEvent *cSchedule::GetPreviousEvent(cEvent *Event) const ++{ ++ ++ if(!Event || Event->Duration() == 0 || Event->StartTime() == 0) ++ return NULL; ++ // Returns either the event info to the previous/following event to the given EventID or, if that one can't be found NULL :EW ++ cEvent *pt = NULL; ++ int epgTimeDelta = Setup.DoubleEpgTimeDelta * 60 + 1; ++ for (pt = events.First(); pt; pt = events.Next(pt)) ++ if(pt && pt->TableID() == 0x00) ++ if ((Event->StartTime() - pt->StartTime()) > - epgTimeDelta && (Event->StartTime() - pt->StartTime()) < epgTimeDelta) ++ { ++ if((pt->Duration() + (pt->Duration()/ 5) + 1) > Event->Duration() && (pt->Duration() - (pt->Duration()/ 5) - 1) < Event->Duration()) ++ return pt; ++ else if (pt->Title() && Event->Title() && (strcmp(pt->Title(), ".") != 0 && strcmp(Event->Title(), ".") != 0)) ++ { ++ if (strstr(pt->Title(), Event->Title()) != NULL || strstr(Event->Title(), pt->Title()) != NULL) ++ return pt; ++ } ++ } ++ return NULL; ++} ++ + void cSchedule::SetRunningStatus(cEvent *Event, int RunningStatus, cChannel *Channel) + { + hasRunning = false; +diff -Naurp vdr-1.6.0/epg.h vdr-1.6.0-disableDoubleEpgEntrys/epg.h +--- vdr-1.6.0/epg.h 2006-10-07 13:47:19.000000000 +0000 ++++ vdr-1.6.0-disableDoubleEpgEntrys/epg.h 2009-03-29 23:25:00.000000000 +0000 +@@ -137,6 +137,7 @@ public: + void DropOutdated(time_t SegmentStart, time_t SegmentEnd, uchar TableID, uchar Version); + void Cleanup(time_t Time); + void Cleanup(void); ++ const cEvent *GetPreviousEvent(cEvent *Event) const; //:EW + cEvent *AddEvent(cEvent *Event); + void DelEvent(cEvent *Event); + void HashEvent(cEvent *Event); +diff -Naurp vdr-1.6.0/menu.c vdr-1.6.0-disableDoubleEpgEntrys/menu.c +--- vdr-1.6.0/menu.c 2008-03-16 11:15:28.000000000 +0000 ++++ vdr-1.6.0-disableDoubleEpgEntrys/menu.c 2009-03-29 23:25:00.000000000 +0000 +@@ -2388,6 +2388,10 @@ void cMenuSetupEPG::Setup(void) + for (int i = 0; i < numLanguages; i++) + // TRANSLATORS: note the singular! + Add(new cMenuEditStraItem(tr("Setup.EPG$Preferred language"), &data.EPGLanguages[i], I18nLanguages()->Size(), &I18nLanguages()->At(0))); ++ Add(new cMenuEditIntItem(tr("Setup.EPG$Period for double EPG search(min)"), &data.DoubleEpgTimeDelta)); ++ Add(new cMenuEditBoolItem(tr("Setup.EPG$extern double Epg entry"), &data.DoubleEpgAction, "adjust", "delete")); ++ Add(new cMenuEditBoolItem(tr("Setup.EPG$Mix intern and extern EPG"), &data.MixEpgAction)); ++ Add(new cMenuEditBoolItem(tr("Setup.EPG$Disable running VPS event"), &data.DisableVPS)); + + SetCurrent(Get(current)); + Display(); +diff -Naurp vdr-1.6.0/po/de_DE.po vdr-1.6.0-disableDoubleEpgEntrys/po/de_DE.po +--- vdr-1.6.0/po/de_DE.po 2008-03-23 10:31:29.000000000 +0000 ++++ vdr-1.6.0-disableDoubleEpgEntrys/po/de_DE.po 2009-03-29 23:25:00.000000000 +0000 +@@ -558,6 +558,18 @@ msgstr "EPG" + msgid "Button$Scan" + msgstr "Scan" + ++msgid "Setup.EPG$Period for double EPG search(min)" ++msgstr "Zeitspanne fr dop. EPG-Suche(min)" ++ ++msgid "Setup.EPG$extern double Epg entry" ++msgstr "Doppelten externen EPG-Eintrag" ++ ++msgid "Setup.EPG$Mix intern and extern EPG" ++msgstr "Internen und externen EPG mischen" ++ ++msgid "Setup.EPG$Disable running VPS event" ++msgstr "Erk. des lauf. VPS-Events abschalten" ++ + msgid "Setup.EPG$EPG scan timeout (h)" + msgstr "Zeit bis zur EPG-Aktualisierung (h)" + +diff -Naurp vdr-1.6.0/po/fr_FR.po vdr-1.6.0-disableDoubleEpgEntrys/po/fr_FR.po +--- vdr-1.6.0/po/fr_FR.po 2008-03-23 10:31:29.000000000 +0000 ++++ vdr-1.6.0-disableDoubleEpgEntrys/po/fr_FR.po 2009-03-29 23:25:58.000000000 +0000 +@@ -564,6 +564,18 @@ msgstr "Guide des programmes" + msgid "Button$Scan" + msgstr "Scan" + ++msgid "Setup.EPG$Period for double EPG search(min)" ++msgstr "Intervalle de recherche du double EPG(min)" ++ ++msgid "Setup.EPG$extern double Epg entry" ++msgstr "Entre EPG externe en double" ++ ++msgid "Setup.EPG$Mix intern and extern EPG" ++msgstr "Mixer EPG interne et externe" ++ ++msgid "Setup.EPG$Disable running VPS event" ++msgstr "Dsactiver vnement VPS" ++ + msgid "Setup.EPG$EPG scan timeout (h)" + msgstr "Inactivit avant rech. EPG (h)" + --- vdr-1.7.14.orig/debian/patches/list_uncritical_patches +++ vdr-1.7.14/debian/patches/list_uncritical_patches @@ -0,0 +1,12 @@ +#!/bin/sh + +# find all patches that don't modify any header files + +patches=`find ./ -name "*.dpatch"` + +for patch in $patches ; do + grep -q -e "^---.*\.h" $patch + if [ $? -ne 0 ] ; then + basename $patch + fi +done --- vdr-1.7.14.orig/debian/patches/opt-27_ttxtsubs.dpatch +++ vdr-1.7.14/debian/patches/opt-27_ttxtsubs.dpatch @@ -0,0 +1,1010 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-27_ttxtsubs.dpatch from the vdr-ttxtsubs plug-in version 0.2.1 +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: This patch is needed for the ttxtsubs plugin. + +@DPATCH@ +diff -urNad vdr-1.7.13~/MANUAL vdr-1.7.13/MANUAL +--- vdr-1.7.13~/MANUAL 2010-03-04 22:19:21.000000000 +0100 ++++ vdr-1.7.13/MANUAL 2010-03-04 22:19:21.000000000 +0100 +@@ -721,6 +721,9 @@ + background transparency. By default the values as broadcast + are used. + ++ Record Teletext Subtitles = no ++ If set to 'yes', teletext subtitles will be recorded. ++ + LNB: + + SLOF = 11700 The switching frequency (in MHz) between low and +diff -urNad vdr-1.7.13~/Makefile vdr-1.7.13/Makefile +--- vdr-1.7.13~/Makefile 2010-02-21 12:44:38.000000000 +0100 ++++ vdr-1.7.13/Makefile 2010-03-04 22:19:21.000000000 +0100 +@@ -44,6 +44,8 @@ + skinclassic.o skins.o skinsttng.o sourceparams.o sources.o spu.o status.o svdrp.o themes.o thread.o\ + timers.o tools.o transfer.o vdr.o videodir.o + ++OBJS += vdrttxtsubshooks.o ++ + ifndef NO_KBD + DEFINES += -DREMOTE_KBD + endif +diff -urNad vdr-1.7.13~/channels.c vdr-1.7.13/channels.c +--- vdr-1.7.13~/channels.c 2010-02-21 14:36:04.000000000 +0100 ++++ vdr-1.7.13/channels.c 2010-03-04 22:19:21.000000000 +0100 +@@ -365,6 +365,26 @@ + } + } + ++void cChannel::SetTeletextSubtitlePages(tTeletextSubtitlePage pages[], int numberOfPages) ++{ ++ int mod = CHANNELMOD_NONE; ++ if (totalTtxtSubtitlePages != numberOfPages) ++ mod |= CHANNELMOD_PIDS; ++ totalTtxtSubtitlePages = fixedTtxtSubtitlePages; ++ for (int i = 0; (i < numberOfPages) && (totalTtxtSubtitlePages < MAXTXTPAGES); i++) { ++ if (teletextSubtitlePages[totalTtxtSubtitlePages].ttxtMagazine != pages[i].ttxtMagazine || ++ teletextSubtitlePages[totalTtxtSubtitlePages].ttxtPage != pages[i].ttxtPage || ++ teletextSubtitlePages[totalTtxtSubtitlePages].ttxtType != pages[i].ttxtType || ++ strcmp(teletextSubtitlePages[totalTtxtSubtitlePages].ttxtLanguage, pages[i].ttxtLanguage)) { ++ mod |= CHANNELMOD_PIDS; ++ teletextSubtitlePages[totalTtxtSubtitlePages] = pages[i]; ++ } ++ totalTtxtSubtitlePages++; ++ } ++ modification |= mod; ++ Channels.SetModified(); ++} ++ + void cChannel::SetCaIds(const int *CaIds) + { + if (caids[0] && caids[0] <= CA_USER_MAX) +@@ -493,11 +513,22 @@ + q += IntArrayToString(q, Channel->dpids, 10, Channel->dlangs); + } + *q = 0; ++ const int TBufferSize = 5 + 1 + (MAXTXTPAGES * (3 + 1 + MAXLANGCODE1 + 1)) + 10; // '12345;150=deu,151=fin,...', +10: paranoia ++ char tpidbuf[TBufferSize]; ++ q = tpidbuf; ++ q += snprintf(q, sizeof(tpidbuf), "%d", Channel->tpid); ++ if (Channel->fixedTtxtSubtitlePages > 0) { ++ q += snprintf(q, sizeof(tpidbuf) - (q - tpidbuf), ";"); ++ for (int i = 0; i < Channel->fixedTtxtSubtitlePages; ++i) { ++ tTeletextSubtitlePage page = Channel->teletextSubtitlePages[i]; ++ q += snprintf(q, sizeof(tpidbuf) - (q - tpidbuf), "%d=%s", page.PageNumber(), page.ttxtLanguage); ++ } ++ } + char caidbuf[MAXCAIDS * 5 + 10]; // 5: 4 digits plus delimiting ',', 10: paranoia + q = caidbuf; + q += IntArrayToString(q, Channel->caids, 16); + *q = 0; +- buffer = cString::sprintf("%s:%d:%s:%s:%d:%s:%s:%d:%s:%d:%d:%d:%d\n", FullName, Channel->frequency, *Channel->parameters, *cSource::ToString(Channel->source), Channel->srate, vpidbuf, apidbuf, Channel->tpid, caidbuf, Channel->sid, Channel->nid, Channel->tid, Channel->rid); ++ buffer = cString::sprintf("%s:%d:%s:%s:%d:%s:%s:%s:%s:%d:%d:%d:%d\n", FullName, Channel->frequency, *Channel->parameters, *cSource::ToString(Channel->source), Channel->srate, vpidbuf, apidbuf, tpidbuf, caidbuf, Channel->sid, Channel->nid, Channel->tid, Channel->rid); + } + return buffer; + } +@@ -531,8 +562,9 @@ + char *parambuf = NULL; + char *vpidbuf = NULL; + char *apidbuf = NULL; ++ char *tpidbuf = NULL; + char *caidbuf = NULL; +- int fields = sscanf(s, "%a[^:]:%d :%a[^:]:%a[^:] :%d :%a[^:]:%a[^:]:%d :%a[^:]:%d :%d :%d :%d ", &namebuf, &frequency, ¶mbuf, &sourcebuf, &srate, &vpidbuf, &apidbuf, &tpid, &caidbuf, &sid, &nid, &tid, &rid); ++ int fields = sscanf(s, "%a[^:]:%d :%a[^:]:%a[^:] :%d :%a[^:]:%a[^:]:%a[^:]:%a[^:]:%d :%d :%d :%d ", &namebuf, &frequency, ¶mbuf, &sourcebuf, &srate, &vpidbuf, &apidbuf, &tpidbuf, &caidbuf, &sid, &nid, &tid, &rid); + if (fields >= 9) { + if (fields == 9) { + // allow reading of old format +@@ -615,7 +647,37 @@ + } + dpids[NumDpids] = 0; + } +- ++ if (tpidbuf) { ++ char *p; ++ fixedTtxtSubtitlePages = 0; ++ // 2001;150=deu,151=fin ++ if ((p = strchr(tpidbuf, ';')) != NULL) { ++ char *q, *strtok_next; ++ *p++ = 0; ++ while ((q = strtok_r(p, ",", &strtok_next)) != NULL) { ++ if (fixedTtxtSubtitlePages < MAXTXTPAGES) { ++ int page; ++ char *l = strchr(q, '='); ++ if (l) ++ *l++ = 0; ++ if (sscanf(q, "%d", &page) == 1) { ++ teletextSubtitlePages[fixedTtxtSubtitlePages] = tTeletextSubtitlePage(page); ++ if (l) ++ strn0cpy(teletextSubtitlePages[fixedTtxtSubtitlePages].ttxtLanguage, l, MAXLANGCODE1); ++ fixedTtxtSubtitlePages++; ++ } ++ else ++ esyslog("ERROR: invalid Teletext page!"); // no need to set ok to 'false' ++ } ++ else ++ esyslog("ERROR: too many Teletext pages!"); // no need to set ok to 'false' ++ p = NULL; ++ } ++ totalTtxtSubtitlePages = fixedTtxtSubtitlePages; ++ } ++ if (sscanf(tpidbuf, "%d", &tpid) != 1) ++ return false; ++ } + if (caidbuf) { + char *p = caidbuf; + char *q; +@@ -652,6 +714,7 @@ + free(sourcebuf); + free(vpidbuf); + free(apidbuf); ++ free(tpidbuf); + free(caidbuf); + free(namebuf); + if (!GetChannelID().Valid()) { +diff -urNad vdr-1.7.13~/channels.h vdr-1.7.13/channels.h +--- vdr-1.7.13~/channels.h 2010-02-21 15:05:49.000000000 +0100 ++++ vdr-1.7.13/channels.h 2010-03-04 22:19:21.000000000 +0100 +@@ -35,6 +35,7 @@ + #define MAXDPIDS 16 // dolby (AC3 + DTS) + #define MAXSPIDS 32 // subtitles + #define MAXCAIDS 8 // conditional access ++#define MAXTXTPAGES 8 // teletext pages + + #define MAXLANGCODE1 4 // a 3 letter language code, zero terminated + #define MAXLANGCODE2 8 // up to two 3 letter language codes, separated by '+' and zero terminated +@@ -71,6 +72,16 @@ + static const tChannelID InvalidID; + }; + ++struct tTeletextSubtitlePage { ++ tTeletextSubtitlePage(void) { ttxtPage = ttxtMagazine = 0; ttxtType = 0x02; strcpy(ttxtLanguage, "und"); } ++ tTeletextSubtitlePage(int page) { ttxtMagazine = (page / 100) & 0x7; ttxtPage = (((page % 100) / 10) << 4) + (page % 10); ttxtType = 0x02; strcpy(ttxtLanguage, "und"); } ++ char ttxtLanguage[MAXLANGCODE1]; ++ uchar ttxtPage; ++ uchar ttxtMagazine; ++ uchar ttxtType; ++ int PageNumber(void) const { return BCDCHARTOINT(ttxtMagazine) * 100 + BCDCHARTOINT(ttxtPage); } ++ }; ++ + class cChannel; + + class cLinkChannel : public cListObject { +@@ -113,6 +124,9 @@ + uint16_t compositionPageIds[MAXSPIDS]; + uint16_t ancillaryPageIds[MAXSPIDS]; + int tpid; ++ int fixedTtxtSubtitlePages; ++ int totalTtxtSubtitlePages; ++ tTeletextSubtitlePage teletextSubtitlePages[MAXTXTPAGES]; + int caids[MAXCAIDS + 1]; // list is zero-terminated + int nid; + int tid; +@@ -160,6 +174,8 @@ + uint16_t CompositionPageId(int i) const { return (0 <= i && i < MAXSPIDS) ? compositionPageIds[i] : uint16_t(0); } + uint16_t AncillaryPageId(int i) const { return (0 <= i && i < MAXSPIDS) ? ancillaryPageIds[i] : uint16_t(0); } + int Tpid(void) const { return tpid; } ++ const tTeletextSubtitlePage *TeletextSubtitlePages() const { return teletextSubtitlePages; } ++ int TotalTeletextSubtitlePages() const { return totalTtxtSubtitlePages; } + const int *Caids(void) const { return caids; } + int Ca(int Index = 0) const { return Index < MAXCAIDS ? caids[Index] : 0; } + int Nid(void) const { return nid; } +@@ -184,6 +200,7 @@ + void SetName(const char *Name, const char *ShortName, const char *Provider); + void SetPortalName(const char *PortalName); + void SetPids(int Vpid, int Ppid, int Vtype, int *Apids, char ALangs[][MAXLANGCODE2], int *Dpids, char DLangs[][MAXLANGCODE2], int *Spids, char SLangs[][MAXLANGCODE2], int Tpid); ++ void SetTeletextSubtitlePages(tTeletextSubtitlePage pages[], int numberOfPages); + void SetCaIds(const int *CaIds); // list must be zero-terminated + void SetCaDescriptors(int Level); + void SetLinkChannels(cLinkChannels *LinkChannels); +diff -urNad vdr-1.7.13~/ci.c vdr-1.7.13/ci.c +--- vdr-1.7.13~/ci.c 2010-01-02 11:39:50.000000000 +0100 ++++ vdr-1.7.13/ci.c 2010-03-04 22:19:21.000000000 +0100 +@@ -1911,6 +1911,8 @@ + AddPid(Channel->Sid(), *Apid, STREAM_TYPE_AUDIO); + for (const int *Dpid = Channel->Dpids(); *Dpid; Dpid++) + AddPid(Channel->Sid(), *Dpid, STREAM_TYPE_DOLBY); ++ if (Channel->Tpid() && Setup.SupportTeletext) ++ AddPid(Channel->Sid(), Channel->Tpid(), STREAM_TYPE_DOLBY); + } + } + +@@ -1932,6 +1934,9 @@ + CaPmt.AddPid(*Apid, STREAM_TYPE_AUDIO); + for (const int *Dpid = Channel->Dpids(); *Dpid; Dpid++) + CaPmt.AddPid(*Dpid, STREAM_TYPE_DOLBY); ++ if (Channel->Tpid() && Setup.SupportTeletext) { ++ CaPmt.AddPid(Channel->Tpid(), STREAM_TYPE_DOLBY); // FIXME: STREAM_TYPE_DOLBY should probably be renamed STREAM_TYPE_PRIVATE ++ } + cas->SendPMT(&CaPmt); + cTimeMs Timeout(QUERY_REPLY_TIMEOUT); + do { +diff -urNad vdr-1.7.13~/config.c vdr-1.7.13/config.c +--- vdr-1.7.13~/config.c 2010-03-04 22:19:21.000000000 +0100 ++++ vdr-1.7.13/config.c 2010-03-04 22:19:21.000000000 +0100 +@@ -333,6 +333,7 @@ + MarginStop = 10; + AudioLanguages[0] = -1; + DisplaySubtitles = 0; ++ SupportTeletext = 0; + SubtitleLanguages[0] = -1; + SubtitleOffset = 0; + SubtitleFgTransparency = 0; +@@ -530,6 +531,7 @@ + else if (!strcasecmp(Name, "MarginStop")) MarginStop = atoi(Value); + else if (!strcasecmp(Name, "AudioLanguages")) return ParseLanguages(Value, AudioLanguages); + else if (!strcasecmp(Name, "DisplaySubtitles")) DisplaySubtitles = atoi(Value); ++ else if (!strcasecmp(Name, "SupportTeletext")) SupportTeletext = atoi(Value); + else if (!strcasecmp(Name, "SubtitleLanguages")) return ParseLanguages(Value, SubtitleLanguages); + else if (!strcasecmp(Name, "SubtitleOffset")) SubtitleOffset = atoi(Value); + else if (!strcasecmp(Name, "SubtitleFgTransparency")) SubtitleFgTransparency = atoi(Value); +@@ -632,6 +634,7 @@ + Store("MarginStop", MarginStop); + StoreLanguages("AudioLanguages", AudioLanguages); + Store("DisplaySubtitles", DisplaySubtitles); ++ Store("SupportTeletext", SupportTeletext); + StoreLanguages("SubtitleLanguages", SubtitleLanguages); + Store("SubtitleOffset", SubtitleOffset); + Store("SubtitleFgTransparency", SubtitleFgTransparency); +diff -urNad vdr-1.7.13~/config.h vdr-1.7.13/config.h +--- vdr-1.7.13~/config.h 2010-03-04 22:19:21.000000000 +0100 ++++ vdr-1.7.13/config.h 2010-03-04 22:19:21.000000000 +0100 +@@ -239,6 +239,7 @@ + int MarginStart, MarginStop; + int AudioLanguages[I18N_MAX_LANGUAGES + 1]; + int DisplaySubtitles; ++ int SupportTeletext; + int SubtitleLanguages[I18N_MAX_LANGUAGES + 1]; + int SubtitleOffset; + int SubtitleFgTransparency, SubtitleBgTransparency; +diff -urNad vdr-1.7.13~/device.c vdr-1.7.13/device.c +--- vdr-1.7.13~/device.c 2010-03-04 22:19:21.000000000 +0100 ++++ vdr-1.7.13/device.c 2010-03-04 22:19:21.000000000 +0100 +@@ -18,6 +18,7 @@ + #include "receiver.h" + #include "status.h" + #include "transfer.h" ++#include "vdrttxtsubshooks.h" + + // --- cLiveSubtitle --------------------------------------------------------- + +@@ -1227,6 +1228,13 @@ + } + break; + case 0xBD: { // private stream 1 ++ // EBU Teletext data, ETSI EN 300 472 ++ // if PES data header length = 24 and data_identifier = 0x10..0x1F (EBU Data) ++ if (Data[8] == 0x24 && Data[45] >= 0x10 && Data[45] < 0x20) { ++ cVDRTtxtsubsHookListener::Hook()->PlayerTeletextData((uint8_t*)Data, Length); ++ break; ++ } ++ + int PayloadOffset = Data[8] + 9; + + // Compatibility mode for old subtitles plugin: +@@ -1386,6 +1394,7 @@ + tsToPesVideo.Reset(); + tsToPesAudio.Reset(); + tsToPesSubtitle.Reset(); ++ tsToPesTeletext.Reset(); + } + else if (Length < TS_SIZE) { + esyslog("ERROR: skipped %d bytes of TS fragment", Length); +@@ -1431,6 +1440,17 @@ + if (!VideoOnly || HasIBPTrickSpeed()) + PlayTsSubtitle(Data, TS_SIZE); + } ++ else if (Pid == patPmtParser.Tpid()) { ++ if (!VideoOnly || HasIBPTrickSpeed()) { ++ int l; ++ tsToPesTeletext.PutTs(Data, Length); ++ if (const uchar *p = tsToPesTeletext.GetPes(l)) { ++ if ((l > 45) && (p[0] == 0x00) && (p[1] == 0x00) && (p[2] == 0x01) && (p[3] == 0xbd) && (p[8] == 0x24) && (p[45] >= 0x10) && (p[45] < 0x20)) ++ cVDRTtxtsubsHookListener::Hook()->PlayerTeletextData((uchar *)p, l, false, patPmtParser.TeletextSubtitlePages(), patPmtParser.TotalTeletextSubtitlePages()); ++ tsToPesTeletext.Reset(); ++ } ++ } ++ } + } + } + else if (Pid == patPmtParser.Ppid()) { +diff -urNad vdr-1.7.13~/device.h vdr-1.7.13/device.h +--- vdr-1.7.13~/device.h 2010-03-04 22:19:21.000000000 +0100 ++++ vdr-1.7.13/device.h 2010-03-04 22:19:21.000000000 +0100 +@@ -526,6 +526,7 @@ + cTsToPes tsToPesVideo; + cTsToPes tsToPesAudio; + cTsToPes tsToPesSubtitle; ++ cTsToPes tsToPesTeletext; + bool isPlayingVideo; + protected: + const cPatPmtParser *PatPmtParser(void) const { return &patPmtParser; } +diff -urNad vdr-1.7.13~/menu.c vdr-1.7.13/menu.c +--- vdr-1.7.13~/menu.c 2010-03-04 22:19:21.000000000 +0100 ++++ vdr-1.7.13/menu.c 2010-03-04 22:19:21.000000000 +0100 +@@ -2983,6 +2983,7 @@ + Add(new cMenuEditIntItem( tr("Setup.DVB$Subtitle foreground transparency"), &data.SubtitleFgTransparency, 0, 9)); + Add(new cMenuEditIntItem( tr("Setup.DVB$Subtitle background transparency"), &data.SubtitleBgTransparency, 0, 10)); + } ++ Add(new cMenuEditBoolItem(tr("Setup.DVB$Enable teletext support"), &data.SupportTeletext)); + + SetCurrent(Get(current)); + Display(); +diff -urNad vdr-1.7.13~/pat.c vdr-1.7.13/pat.c +--- vdr-1.7.13~/pat.c 2010-01-01 16:40:05.000000000 +0100 ++++ vdr-1.7.13/pat.c 2010-03-04 22:19:21.000000000 +0100 +@@ -13,6 +13,7 @@ + #include "libsi/section.h" + #include "libsi/descriptor.h" + #include "thread.h" ++#include "vdrttxtsubshooks.h" + + #define PMT_SCAN_TIMEOUT 10 // seconds + +@@ -341,6 +342,8 @@ + char DLangs[MAXDPIDS][MAXLANGCODE2] = { "" }; + char SLangs[MAXSPIDS][MAXLANGCODE2] = { "" }; + int Tpid = 0; ++ tTeletextSubtitlePage TeletextSubtitlePages[MAXTXTPAGES]; ++ int NumTPages = 0; + int NumApids = 0; + int NumDpids = 0; + int NumSpids = 0; +@@ -426,8 +429,21 @@ + NumSpids++; + } + break; +- case SI::TeletextDescriptorTag: ++ case SI::TeletextDescriptorTag: { + Tpid = esPid; ++ SI::TeletextDescriptor *sd = (SI::TeletextDescriptor *)d; ++ SI::TeletextDescriptor::Teletext ttxt; ++ for (SI::Loop::Iterator it; sd->teletextLoop.getNext(ttxt, it); ) { ++ bool isSubtitlePage = (ttxt.getTeletextType() == 0x02) || (ttxt.getTeletextType() == 0x05); ++ if ((NumTPages < MAXTXTPAGES) && ttxt.languageCode[0] && isSubtitlePage) { ++ strn0cpy(TeletextSubtitlePages[NumTPages].ttxtLanguage, I18nNormalizeLanguageCode(ttxt.languageCode), MAXLANGCODE1); ++ TeletextSubtitlePages[NumTPages].ttxtPage = ttxt.getTeletextPageNumber(); ++ TeletextSubtitlePages[NumTPages].ttxtMagazine = ttxt.getTeletextMagazineNumber(); ++ TeletextSubtitlePages[NumTPages].ttxtType = ttxt.getTeletextType(); ++ NumTPages++; ++ } ++ } ++ } + break; + case SI::ISO639LanguageDescriptorTag: { + SI::ISO639LanguageDescriptor *ld = (SI::ISO639LanguageDescriptor *)d; +@@ -458,6 +474,12 @@ + } + if (Setup.UpdateChannels >= 2) { + Channel->SetPids(Vpid, Ppid, Vtype, Apids, ALangs, Dpids, DLangs, Spids, SLangs, Tpid); ++ if (NumTPages < MAXTXTPAGES) { ++ int manualPageNumber = cVDRTtxtsubsHookListener::Hook()->ManualPageNumber(Channel); ++ if (manualPageNumber) ++ TeletextSubtitlePages[NumTPages++] = tTeletextSubtitlePage(manualPageNumber); ++ } ++ Channel->SetTeletextSubtitlePages(TeletextSubtitlePages, NumTPages); + Channel->SetCaIds(CaDescriptors->CaIds()); + Channel->SetSubtitlingDescriptors(SubtitlingTypes, CompositionPageIds, AncillaryPageIds); + } +diff -urNad vdr-1.7.13~/po/ca_ES.po vdr-1.7.13/po/ca_ES.po +--- vdr-1.7.13~/po/ca_ES.po 2010-02-28 13:19:49.000000000 +0100 ++++ vdr-1.7.13/po/ca_ES.po 2010-03-04 22:19:21.000000000 +0100 +@@ -934,6 +934,9 @@ + msgid "Setup.DVB$Subtitle background transparency" + msgstr "Transparncia fons subttols" + ++msgid "Setup.DVB$Enable teletext support" ++msgstr "" ++ + msgid "LNB" + msgstr "Configuraci de l'LNB" + +diff -urNad vdr-1.7.13~/po/cs_CZ.po vdr-1.7.13/po/cs_CZ.po +--- vdr-1.7.13~/po/cs_CZ.po 2010-02-28 13:19:49.000000000 +0100 ++++ vdr-1.7.13/po/cs_CZ.po 2010-03-04 22:19:21.000000000 +0100 +@@ -932,6 +932,9 @@ + msgid "Setup.DVB$Subtitle background transparency" + msgstr "Prhlednost pozad titulk" + ++msgid "Setup.DVB$Enable teletext support" ++msgstr "" ++ + msgid "LNB" + msgstr "LNB" + +diff -urNad vdr-1.7.13~/po/da_DK.po vdr-1.7.13/po/da_DK.po +--- vdr-1.7.13~/po/da_DK.po 2010-02-28 13:19:49.000000000 +0100 ++++ vdr-1.7.13/po/da_DK.po 2010-03-04 22:19:21.000000000 +0100 +@@ -931,6 +931,9 @@ + msgid "Setup.DVB$Subtitle background transparency" + msgstr "Undertekst baggrundsgennemsigtighed" + ++msgid "Setup.DVB$Enable teletext support" ++msgstr "" ++ + msgid "LNB" + msgstr "LNB" + +diff -urNad vdr-1.7.13~/po/de_DE.po vdr-1.7.13/po/de_DE.po +--- vdr-1.7.13~/po/de_DE.po 2010-03-04 22:19:21.000000000 +0100 ++++ vdr-1.7.13/po/de_DE.po 2010-03-04 22:19:21.000000000 +0100 +@@ -931,6 +931,9 @@ + msgid "Setup.DVB$Subtitle background transparency" + msgstr "Untertitel-Transparenz Hintergrund" + ++msgid "Setup.DVB$Enable teletext support" ++msgstr "Videotext-Untersttzung aktivieren" ++ + msgid "LNB" + msgstr "LNB" + +diff -urNad vdr-1.7.13~/po/el_GR.po vdr-1.7.13/po/el_GR.po +--- vdr-1.7.13~/po/el_GR.po 2010-02-28 13:19:49.000000000 +0100 ++++ vdr-1.7.13/po/el_GR.po 2010-03-04 22:19:21.000000000 +0100 +@@ -931,6 +931,9 @@ + msgid "Setup.DVB$Subtitle background transparency" + msgstr "" + ++msgid "Setup.DVB$Enable teletext support" ++msgstr "" ++ + msgid "LNB" + msgstr "LNB" + +diff -urNad vdr-1.7.13~/po/es_ES.po vdr-1.7.13/po/es_ES.po +--- vdr-1.7.13~/po/es_ES.po 2010-02-28 13:19:49.000000000 +0100 ++++ vdr-1.7.13/po/es_ES.po 2010-03-04 22:19:21.000000000 +0100 +@@ -932,6 +932,9 @@ + msgid "Setup.DVB$Subtitle background transparency" + msgstr "Transparencia fondo subttulos" + ++msgid "Setup.DVB$Enable teletext support" ++msgstr "" ++ + msgid "LNB" + msgstr "LNB" + +diff -urNad vdr-1.7.13~/po/et_EE.po vdr-1.7.13/po/et_EE.po +--- vdr-1.7.13~/po/et_EE.po 2010-03-04 22:19:21.000000000 +0100 ++++ vdr-1.7.13/po/et_EE.po 2010-03-04 22:19:21.000000000 +0100 +@@ -931,6 +931,9 @@ + msgid "Setup.DVB$Subtitle background transparency" + msgstr "Subtiitri tausta lbipaistvus" + ++msgid "Setup.DVB$Enable teletext support" ++msgstr "Teleteksti tugi" ++ + msgid "LNB" + msgstr "LNB" + +diff -urNad vdr-1.7.13~/po/fi_FI.po vdr-1.7.13/po/fi_FI.po +--- vdr-1.7.13~/po/fi_FI.po 2010-03-04 22:19:21.000000000 +0100 ++++ vdr-1.7.13/po/fi_FI.po 2010-03-04 22:19:21.000000000 +0100 +@@ -934,6 +934,9 @@ + msgid "Setup.DVB$Subtitle background transparency" + msgstr "Tekstityksen taustan lpinkyvyys" + ++msgid "Setup.DVB$Enable teletext support" ++msgstr "Salli teksti-TV-tuki" ++ + msgid "LNB" + msgstr "LNB" + +diff -urNad vdr-1.7.13~/po/fr_FR.po vdr-1.7.13/po/fr_FR.po +--- vdr-1.7.13~/po/fr_FR.po 2010-03-04 22:19:21.000000000 +0100 ++++ vdr-1.7.13/po/fr_FR.po 2010-03-04 22:19:21.000000000 +0100 +@@ -937,6 +937,9 @@ + msgid "Setup.DVB$Subtitle background transparency" + msgstr "Transparence du fond" + ++msgid "Setup.DVB$Enable teletext support" ++msgstr "" ++ + msgid "LNB" + msgstr "LNB" + +diff -urNad vdr-1.7.13~/po/hr_HR.po vdr-1.7.13/po/hr_HR.po +--- vdr-1.7.13~/po/hr_HR.po 2010-02-28 13:19:49.000000000 +0100 ++++ vdr-1.7.13/po/hr_HR.po 2010-03-04 22:19:21.000000000 +0100 +@@ -933,6 +933,9 @@ + msgid "Setup.DVB$Subtitle background transparency" + msgstr "Transparentnost pozadine titla" + ++msgid "Setup.DVB$Enable teletext support" ++msgstr "" ++ + msgid "LNB" + msgstr "LNB" + +diff -urNad vdr-1.7.13~/po/hu_HU.po vdr-1.7.13/po/hu_HU.po +--- vdr-1.7.13~/po/hu_HU.po 2010-02-28 13:19:49.000000000 +0100 ++++ vdr-1.7.13/po/hu_HU.po 2010-03-04 22:19:21.000000000 +0100 +@@ -934,6 +934,9 @@ + msgid "Setup.DVB$Subtitle background transparency" + msgstr "Felirat htternek transzparencija" + ++msgid "Setup.DVB$Enable teletext support" ++msgstr "" ++ + msgid "LNB" + msgstr "LNB" + +diff -urNad vdr-1.7.13~/po/it_IT.po vdr-1.7.13/po/it_IT.po +--- vdr-1.7.13~/po/it_IT.po 2010-02-28 13:19:49.000000000 +0100 ++++ vdr-1.7.13/po/it_IT.po 2010-03-04 22:19:21.000000000 +0100 +@@ -938,6 +938,9 @@ + msgid "Setup.DVB$Subtitle background transparency" + msgstr "Trasparenza sfondo sottotitoli" + ++msgid "Setup.DVB$Enable teletext support" ++msgstr "" ++ + msgid "LNB" + msgstr "LNB" + +diff -urNad vdr-1.7.13~/po/lt_LT.po vdr-1.7.13/po/lt_LT.po +--- vdr-1.7.13~/po/lt_LT.po 2010-02-28 13:45:43.000000000 +0100 ++++ vdr-1.7.13/po/lt_LT.po 2010-03-04 22:19:21.000000000 +0100 +@@ -931,6 +931,9 @@ + msgid "Setup.DVB$Subtitle background transparency" + msgstr "Subtitrų fono permatomumas" + ++msgid "Setup.DVB$Enable teletext support" ++msgstr "" ++ + msgid "LNB" + msgstr "Konverteris (LNB)" + +diff -urNad vdr-1.7.13~/po/nl_NL.po vdr-1.7.13/po/nl_NL.po +--- vdr-1.7.13~/po/nl_NL.po 2010-02-28 13:19:49.000000000 +0100 ++++ vdr-1.7.13/po/nl_NL.po 2010-03-04 22:19:21.000000000 +0100 +@@ -935,6 +935,9 @@ + msgid "Setup.DVB$Subtitle background transparency" + msgstr "Transparantie achtergrond ondertiteling" + ++msgid "Setup.DVB$Enable teletext support" ++msgstr "" ++ + msgid "LNB" + msgstr "LNB" + +diff -urNad vdr-1.7.13~/po/nn_NO.po vdr-1.7.13/po/nn_NO.po +--- vdr-1.7.13~/po/nn_NO.po 2010-02-28 13:19:49.000000000 +0100 ++++ vdr-1.7.13/po/nn_NO.po 2010-03-04 22:19:21.000000000 +0100 +@@ -932,6 +932,9 @@ + msgid "Setup.DVB$Subtitle background transparency" + msgstr "" + ++msgid "Setup.DVB$Enable teletext support" ++msgstr "" ++ + msgid "LNB" + msgstr "LNB" + +diff -urNad vdr-1.7.13~/po/pl_PL.po vdr-1.7.13/po/pl_PL.po +--- vdr-1.7.13~/po/pl_PL.po 2010-02-28 13:19:49.000000000 +0100 ++++ vdr-1.7.13/po/pl_PL.po 2010-03-04 22:19:21.000000000 +0100 +@@ -932,6 +932,9 @@ + msgid "Setup.DVB$Subtitle background transparency" + msgstr "Przerocze podtytuw: To" + ++msgid "Setup.DVB$Enable teletext support" ++msgstr "" ++ + msgid "LNB" + msgstr "LNB" + +diff -urNad vdr-1.7.13~/po/pt_PT.po vdr-1.7.13/po/pt_PT.po +--- vdr-1.7.13~/po/pt_PT.po 2010-02-28 13:19:49.000000000 +0100 ++++ vdr-1.7.13/po/pt_PT.po 2010-03-04 22:19:21.000000000 +0100 +@@ -931,6 +931,9 @@ + msgid "Setup.DVB$Subtitle background transparency" + msgstr "Transparncia de background das legendas" + ++msgid "Setup.DVB$Enable teletext support" ++msgstr "" ++ + msgid "LNB" + msgstr "LNB" + +diff -urNad vdr-1.7.13~/po/ro_RO.po vdr-1.7.13/po/ro_RO.po +--- vdr-1.7.13~/po/ro_RO.po 2010-02-28 13:19:49.000000000 +0100 ++++ vdr-1.7.13/po/ro_RO.po 2010-03-04 22:19:21.000000000 +0100 +@@ -934,6 +934,9 @@ + msgid "Setup.DVB$Subtitle background transparency" + msgstr "Transparena fundalului subtitrrii" + ++msgid "Setup.DVB$Enable teletext support" ++msgstr "" ++ + msgid "LNB" + msgstr "LNB" + +diff -urNad vdr-1.7.13~/po/ru_RU.po vdr-1.7.13/po/ru_RU.po +--- vdr-1.7.13~/po/ru_RU.po 2010-03-04 22:19:21.000000000 +0100 ++++ vdr-1.7.13/po/ru_RU.po 2010-03-04 22:19:21.000000000 +0100 +@@ -932,6 +932,9 @@ + msgid "Setup.DVB$Subtitle background transparency" + msgstr " " + ++msgid "Setup.DVB$Enable teletext support" ++msgstr "" ++ + msgid "LNB" + msgstr "" + +diff -urNad vdr-1.7.13~/po/sk_SK.po vdr-1.7.13/po/sk_SK.po +--- vdr-1.7.13~/po/sk_SK.po 2010-02-28 13:19:50.000000000 +0100 ++++ vdr-1.7.13/po/sk_SK.po 2010-03-04 22:19:21.000000000 +0100 +@@ -932,6 +932,9 @@ + msgid "Setup.DVB$Subtitle background transparency" + msgstr "Priehadnos pozadia titulkov" + ++msgid "Setup.DVB$Enable teletext support" ++msgstr "" ++ + msgid "LNB" + msgstr "LNB" + +diff -urNad vdr-1.7.13~/po/sl_SI.po vdr-1.7.13/po/sl_SI.po +--- vdr-1.7.13~/po/sl_SI.po 2010-02-28 13:19:50.000000000 +0100 ++++ vdr-1.7.13/po/sl_SI.po 2010-03-04 22:19:21.000000000 +0100 +@@ -932,6 +932,9 @@ + msgid "Setup.DVB$Subtitle background transparency" + msgstr "Transparentnost ozadja podnapisov" + ++msgid "Setup.DVB$Enable teletext support" ++msgstr "" ++ + msgid "LNB" + msgstr "LNB" + +diff -urNad vdr-1.7.13~/po/sv_SE.po vdr-1.7.13/po/sv_SE.po +--- vdr-1.7.13~/po/sv_SE.po 2010-02-28 13:19:50.000000000 +0100 ++++ vdr-1.7.13/po/sv_SE.po 2010-03-04 22:19:21.000000000 +0100 +@@ -934,6 +934,9 @@ + msgid "Setup.DVB$Subtitle background transparency" + msgstr "Transparent bakgrund textremsa" + ++msgid "Setup.DVB$Enable teletext support" ++msgstr "" ++ + msgid "LNB" + msgstr "LNB" + +diff -urNad vdr-1.7.13~/po/tr_TR.po vdr-1.7.13/po/tr_TR.po +--- vdr-1.7.13~/po/tr_TR.po 2010-02-28 13:19:50.000000000 +0100 ++++ vdr-1.7.13/po/tr_TR.po 2010-03-04 22:19:21.000000000 +0100 +@@ -931,6 +931,9 @@ + msgid "Setup.DVB$Subtitle background transparency" + msgstr "Altyaz arka effaflk" + ++msgid "Setup.DVB$Enable teletext support" ++msgstr "" ++ + msgid "LNB" + msgstr "LNB" + +diff -urNad vdr-1.7.13~/po/uk_UA.po vdr-1.7.13/po/uk_UA.po +--- vdr-1.7.13~/po/uk_UA.po 2010-02-28 13:19:50.000000000 +0100 ++++ vdr-1.7.13/po/uk_UA.po 2010-03-04 22:19:21.000000000 +0100 +@@ -931,6 +931,9 @@ + msgid "Setup.DVB$Subtitle background transparency" + msgstr "Прозорість заднього плану субтитрів" + ++msgid "Setup.DVB$Enable teletext support" ++msgstr "" ++ + msgid "LNB" + msgstr "Конвертер" + +diff -urNad vdr-1.7.13~/po/zh_CN.po vdr-1.7.13/po/zh_CN.po +--- vdr-1.7.13~/po/zh_CN.po 2010-02-28 13:19:50.000000000 +0100 ++++ vdr-1.7.13/po/zh_CN.po 2010-03-04 22:19:21.000000000 +0100 +@@ -934,6 +934,9 @@ + msgid "Setup.DVB$Subtitle background transparency" + msgstr "字幕背景透明度" + ++msgid "Setup.DVB$Enable teletext support" ++msgstr "" ++ + msgid "LNB" + msgstr "切换器设置" + +diff -urNad vdr-1.7.13~/receiver.c vdr-1.7.13/receiver.c +--- vdr-1.7.13~/receiver.c 2010-02-28 15:25:32.000000000 +0100 ++++ vdr-1.7.13/receiver.c 2010-03-04 22:19:21.000000000 +0100 +@@ -82,7 +82,8 @@ + (Channel->Ppid() == Channel->Vpid() || AddPid(Channel->Ppid())) && + AddPids(Channel->Apids()) && + AddPids(Channel->Dpids()) && +- AddPids(Channel->Spids()); ++ AddPids(Channel->Spids()) && ++ (!Setup.SupportTeletext || AddPid(Channel->Tpid())); + } + return true; + } +diff -urNad vdr-1.7.13~/remux.c vdr-1.7.13/remux.c +--- vdr-1.7.13~/remux.c 2010-02-28 15:42:07.000000000 +0100 ++++ vdr-1.7.13/remux.c 2010-03-04 22:19:21.000000000 +0100 +@@ -215,6 +215,29 @@ + return i; + } + ++int cPatPmtGenerator::MakeTeletextDescriptor(uchar *Target, const tTeletextSubtitlePage *pages, int pageCount) ++{ ++ int i = 0, j = 0; ++ Target[i++] = SI::TeletextDescriptorTag; ++ int l = i; ++ Target[i++] = 0x00; // length ++ for (int n = 0; n < pageCount; n++) { ++ const char* Language = pages[n].ttxtLanguage; ++ Target[i++] = *Language++; ++ Target[i++] = *Language++; ++ Target[i++] = *Language++; ++ Target[i++] = (pages[n].ttxtType << 3) + pages[n].ttxtMagazine; ++ Target[i++] = pages[n].ttxtPage; ++ j++; ++ } ++ if (j > 0) { ++ Target[l] = j * 5; // update length ++ IncEsInfoLength(i); ++ return i; ++ } ++ return 0; ++} ++ + int cPatPmtGenerator::MakeLanguageDescriptor(uchar *Target, const char *Language) + { + int i = 0; +@@ -296,6 +319,7 @@ + if (Channel) { + int Vpid = Channel->Vpid(); + int Ppid = Channel->Ppid(); ++ int Tpid = Channel->Tpid(); + uchar *p = buf; + int i = 0; + p[i++] = 0x02; // table id +@@ -330,6 +354,10 @@ + i += MakeStream(buf + i, 0x06, Channel->Spid(n)); + i += MakeSubtitlingDescriptor(buf + i, Channel->Slang(n), Channel->SubtitlingType(n), Channel->CompositionPageId(n), Channel->AncillaryPageId(n)); + } ++ if (Tpid) { ++ i += MakeStream(buf + i, 0x06, Tpid); ++ i += MakeTeletextDescriptor(buf + i, Channel->TeletextSubtitlePages(), Channel->TotalTeletextSubtitlePages()); ++ } + + int sl = i - SectionLength - 2 + 4; // -2 = SectionLength storage, +4 = length of CRC + buf[SectionLength] |= (sl >> 8) & 0x0F; +@@ -403,6 +431,7 @@ + pmtPid = -1; + vpid = vtype = 0; + ppid = 0; ++ tpid = 0; + } + + void cPatPmtParser::ParsePat(const uchar *Data, int Length) +@@ -488,11 +517,13 @@ + int NumSpids = 0; + vpid = vtype = 0; + ppid = 0; ++ tpid = 0; + apids[0] = 0; + dpids[0] = 0; + spids[0] = 0; + atypes[0] = 0; + dtypes[0] = 0; ++ totalTtxtSubtitlePages = 0; + SI::PMT::Stream stream; + for (SI::Loop::Iterator it; Pmt.streamLoop.getNext(stream, it); ) { + dbgpatpmt(" stream type = %02X, pid = %d", stream.getStreamType(), stream.getPid()); +@@ -586,6 +617,28 @@ + spids[NumSpids]= 0; + } + break; ++ case SI::TeletextDescriptorTag: { ++ dbgpatpmt(" teletext"); ++ tpid = stream.getPid(); ++ SI::TeletextDescriptor *sd = (SI::TeletextDescriptor *)d; ++ SI::TeletextDescriptor::Teletext ttxt; ++ if (totalTtxtSubtitlePages < MAXTXTPAGES) { ++ for (SI::Loop::Iterator it; sd->teletextLoop.getNext(ttxt, it); ) { ++ bool isSubtitlePage = (ttxt.getTeletextType() == 0x02) || (ttxt.getTeletextType() == 0x05); ++ if (isSubtitlePage && ttxt.languageCode[0]) { ++ dbgpatpmt(" '%s:%x.%x'", ttxt.languageCode, ttxt.getTeletextMagazineNumber(), ttxt.getTeletextPageNumber()); ++ strn0cpy(teletextSubtitlePages[totalTtxtSubtitlePages].ttxtLanguage, I18nNormalizeLanguageCode(ttxt.languageCode), MAXLANGCODE1); ++ teletextSubtitlePages[totalTtxtSubtitlePages].ttxtPage = ttxt.getTeletextPageNumber(); ++ teletextSubtitlePages[totalTtxtSubtitlePages].ttxtMagazine = ttxt.getTeletextMagazineNumber(); ++ teletextSubtitlePages[totalTtxtSubtitlePages].ttxtType = ttxt.getTeletextType(); ++ totalTtxtSubtitlePages++; ++ if (totalTtxtSubtitlePages >= MAXTXTPAGES) ++ break; ++ } ++ } ++ } ++ } ++ break; + case SI::ISO639LanguageDescriptorTag: { + SI::ISO639LanguageDescriptor *ld = (SI::ISO639LanguageDescriptor *)d; + dbgpatpmt(" '%s'", ld->languageCode); +diff -urNad vdr-1.7.13~/remux.h vdr-1.7.13/remux.h +--- vdr-1.7.13~/remux.h 2010-01-29 17:51:26.000000000 +0100 ++++ vdr-1.7.13/remux.h 2010-03-04 22:19:21.000000000 +0100 +@@ -170,6 +170,7 @@ + int MakeStream(uchar *Target, uchar Type, int Pid); + int MakeAC3Descriptor(uchar *Target); + int MakeSubtitlingDescriptor(uchar *Target, const char *Language, uchar SubtitlingType, uint16_t CompositionPageId, uint16_t AncillaryPageId); ++ int MakeTeletextDescriptor(uchar *Target, const tTeletextSubtitlePage *pages, int pageCount); + int MakeLanguageDescriptor(uchar *Target, const char *Language); + int MakeCRC(uchar *Target, const uchar *Data, int Length); + void GeneratePmtPid(const cChannel *Channel); +@@ -215,6 +216,7 @@ + int vpid; + int ppid; + int vtype; ++ int tpid; + int apids[MAXAPIDS + 1]; // list is zero-terminated + int atypes[MAXAPIDS + 1]; // list is zero-terminated + char alangs[MAXAPIDS][MAXLANGCODE2]; +@@ -227,6 +229,8 @@ + uint16_t compositionPageIds[MAXSPIDS]; + uint16_t ancillaryPageIds[MAXSPIDS]; + bool updatePrimaryDevice; ++ int totalTtxtSubtitlePages; ++ tTeletextSubtitlePage teletextSubtitlePages[MAXTXTPAGES]; + protected: + int SectionLength(const uchar *Data, int Length) { return (Length >= 3) ? ((int(Data[1]) & 0x0F) << 8)| Data[2] : 0; } + public: +@@ -259,6 +263,9 @@ + int Vtype(void) const { return vtype; } + ///< Returns the video stream type as defined by the current PMT, or 0 if no video + ///< stream type has been detected, yet. ++ int Tpid(void) { return tpid; } ++ ///< Returns the teletext pid as defined by the current PMT, or 0 if no teletext ++ ///< pid has been detected, yet. + const int *Apids(void) const { return apids; } + const int *Dpids(void) const { return dpids; } + const int *Spids(void) const { return spids; } +@@ -273,6 +280,8 @@ + uchar SubtitlingType(int i) const { return (0 <= i && i < MAXSPIDS) ? subtitlingTypes[i] : uchar(0); } + uint16_t CompositionPageId(int i) const { return (0 <= i && i < MAXSPIDS) ? compositionPageIds[i] : uint16_t(0); } + uint16_t AncillaryPageId(int i) const { return (0 <= i && i < MAXSPIDS) ? ancillaryPageIds[i] : uint16_t(0); } ++ const tTeletextSubtitlePage *TeletextSubtitlePages() const { return teletextSubtitlePages; } ++ int TotalTeletextSubtitlePages() const { return totalTtxtSubtitlePages; } + }; + + // TS to PES converter: +diff -urNad vdr-1.7.13~/vdr.5 vdr-1.7.13/vdr.5 +--- vdr-1.7.13~/vdr.5 2010-02-21 15:29:06.000000000 +0100 ++++ vdr-1.7.13/vdr.5 2010-03-04 22:19:21.000000000 +0100 +@@ -207,6 +207,13 @@ + .TP + .B TPID + The teletext PID. ++ ++Fixed teletext subtitling pages can be defined separated by a semicolon. ++The pages (separated by commas) can contain ISO 639 language codes, delimited ++by a '=' sign, as in ++ ++.B ...:2001;150=deu,151=fin:... ++ + .TP + .B Conditional access + A hexadecimal integer defining how this channel can be accessed: +diff -urNad vdr-1.7.13~/vdrttxtsubshooks.c vdr-1.7.13/vdrttxtsubshooks.c +--- vdr-1.7.13~/vdrttxtsubshooks.c 1970-01-01 01:00:00.000000000 +0100 ++++ vdr-1.7.13/vdrttxtsubshooks.c 2010-03-04 22:19:21.000000000 +0100 +@@ -0,0 +1,63 @@ ++/* ++ * vdr-ttxtsubs - A plugin for the Linux Video Disk Recorder ++ * Copyright (c) 2003 - 2008 Ragnar Sundblad <ragge@nada.kth.se> ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your option) ++ * any later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more ++ * details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ * ++ */ ++ ++#include <stdlib.h> ++#include <stdio.h> ++#include <stdint.h> ++ ++#include "vdrttxtsubshooks.h" ++ ++// XXX Really should be a list... ++static cVDRTtxtsubsHookListener *gListener; ++ ++// ------ class cVDRTtxtsubsHookProxy ------ ++ ++class cVDRTtxtsubsHookProxy : public cVDRTtxtsubsHookListener ++{ ++ public: ++ virtual void HideOSD(void) { if(gListener) gListener->HideOSD(); }; ++ virtual void ShowOSD(void) { if(gListener) gListener->ShowOSD(); }; ++ virtual void PlayerTeletextData(uint8_t *p, int length, bool IsPesRecording, const struct tTeletextSubtitlePage teletextSubtitlePages[] = NULL, int pageCount = 0) ++ { if(gListener) gListener->PlayerTeletextData(p, length, IsPesRecording, teletextSubtitlePages, pageCount); }; ++ virtual int ManualPageNumber(const cChannel *channel) ++ { if(gListener) return gListener->ManualPageNumber(channel); else return 0; }; ++}; ++ ++ ++// ------ class cVDRTtxtsubsHookListener ------ ++ ++cVDRTtxtsubsHookListener::~cVDRTtxtsubsHookListener() ++{ ++ gListener = 0; ++} ++ ++void cVDRTtxtsubsHookListener::HookAttach(void) ++{ ++ gListener = this; ++ //printf("cVDRTtxtsubsHookListener::HookAttach\n"); ++} ++ ++static cVDRTtxtsubsHookProxy gProxy; ++ ++cVDRTtxtsubsHookListener *cVDRTtxtsubsHookListener::Hook(void) ++{ ++ return &gProxy; ++} ++ +diff -urNad vdr-1.7.13~/vdrttxtsubshooks.h vdr-1.7.13/vdrttxtsubshooks.h +--- vdr-1.7.13~/vdrttxtsubshooks.h 1970-01-01 01:00:00.000000000 +0100 ++++ vdr-1.7.13/vdrttxtsubshooks.h 2010-03-04 22:19:21.000000000 +0100 +@@ -0,0 +1,46 @@ ++/* ++ * vdr-ttxtsubs - A plugin for the Linux Video Disk Recorder ++ * Copyright (c) 2003 - 2008 Ragnar Sundblad <ragge@nada.kth.se> ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your option) ++ * any later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more ++ * details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ * ++ */ ++ ++#ifndef __VDRTTXTSUBSHOOKS_H ++#define __VDRTTXTSUBSHOOKS_H ++ ++#define TTXTSUBSVERSNUM 2 ++ ++class cDevice; ++class cChannel; ++struct tTeletextSubtitlePage; ++ ++class cVDRTtxtsubsHookListener { ++ public: ++ cVDRTtxtsubsHookListener(void) {}; ++ virtual ~cVDRTtxtsubsHookListener(); ++ ++ void HookAttach(void); ++ ++ virtual void HideOSD(void) {}; ++ virtual void ShowOSD(void) {}; ++ virtual void PlayerTeletextData(uint8_t *p, int length, bool IsPesRecording = true, const struct tTeletextSubtitlePage teletextSubtitlePages[] = NULL, int pageCount = 0) {}; ++ virtual int ManualPageNumber(const cChannel *channel) { return 0; }; ++ ++ // used by VDR to call hook listeners ++ static cVDRTtxtsubsHookListener *Hook(void); ++}; ++ ++#endif --- vdr-1.7.14.orig/debian/themes/sttng-cool.theme +++ vdr-1.7.14/debian/themes/sttng-cool.theme @@ -0,0 +1,62 @@ +Description = Cool +clrBackground = 80000000 +clrButtonRedFg = FFFFFFFF +clrButtonRedBg = C0C00000 +clrButtonGreenFg = FFFFFFFF +clrButtonGreenBg = C000C000 +clrButtonYellowFg = FF000000 +clrButtonYellowBg = C0C0C000 +clrButtonBlueFg = FFFFFFFF +clrButtonBlueBg = C00000C0 +clrMessageFrame = C0004080 +clrMessageStatusFg = FFFFFFFF +clrMessageStatusBg = C000C000 +clrMessageInfoFg = FFFFFFFF +clrMessageInfoBg = C00080FF +clrMessageWarningFg = FF000000 +clrMessageWarningBg = C0C0C000 +clrMessageErrorFg = FFFFFFFF +clrMessageErrorBg = C0C00000 +clrVolumeFrame = C0004080 +clrVolumeSymbol = FFFFFFFF +clrVolumeBarUpper = C00080FF +clrVolumeBarLower = C0C0C000 +clrChannelFrame = C0004080 +clrChannelName = FFFFFFFF +clrChannelDate = FFFFFFFF +clrChannelSymbolOn = FFE0E000 +clrChannelSymbolOff = FFB0B0B0 +clrChannelSymbolRecFg = FFFFFFFF +clrChannelSymbolRecBg = C0C00000 +clrChannelEpgTime = FFFFFFFF +clrChannelEpgTitle = FFE0E000 +clrChannelEpgShortText = FFB0B0B0 +clrChannelTimebarSeen = FFE0E000 +clrChannelTimebarRest = FFB0B0B0 +clrMenuFrame = C0004080 +clrMenuTitle = FFFFFFFF +clrMenuDate = FFFFFFFF +clrMenuItemCurrentFg = FFFFFFFF +clrMenuItemCurrentBg = C00080FF +clrMenuItemSelectable = FFFFFFFF +clrMenuItemNonSelectable = FFB0B0B0 +clrMenuEventTime = FFE0E000 +clrMenuEventVps = FFFFFFFF +clrMenuEventTitle = FFE0E000 +clrMenuEventShortText = FFE0E000 +clrMenuEventDescription = FFFFFFFF +clrMenuScrollbarTotal = C00080FF +clrMenuScrollbarShown = C0C0C000 +clrMenuScrollbarArrow = FFFFFFFF +clrMenuText = FFFFFFFF +clrReplayFrame = C0004080 +clrReplayTitle = FFE0E000 +clrReplayMode = FFFFFFFF +clrReplayCurrent = FFFFFFFF +clrReplayTotal = FFE0E000 +clrReplayJump = FFE0E000 +clrReplayProgressSeen = C00080FF +clrReplayProgressRest = 80000000 +clrReplayProgressSelected = C0C00000 +clrReplayProgressMark = FFFFFFFF +clrReplayProgressCurrent = FFFFFFFF --- vdr-1.7.14.orig/debian/themes/sttng-blue.theme +++ vdr-1.7.14/debian/themes/sttng-blue.theme @@ -0,0 +1,62 @@ +Description = Blue LCARS +clrBackground = 7F000000 +clrButtonRedFg = FFFCFCFC +clrButtonRedBg = FFFC1414 +clrButtonGreenFg = FF000000 +clrButtonGreenBg = FF24FC24 +clrButtonYellowFg = FF000000 +clrButtonYellowBg = FFFCC024 +clrButtonBlueFg = FFFCFCFC +clrButtonBlueBg = FF0000FC +clrMessageFrame = FF598ACD +clrMessageStatusFg = FF000000 +clrMessageStatusBg = FF00FCFC +clrMessageInfoFg = FF000000 +clrMessageInfoBg = FF9C9CFF +clrMessageWarningFg = FF000000 +clrMessageWarningBg = FFFCC024 +clrMessageErrorFg = FFFCFCFC +clrMessageErrorBg = FFFC1414 +clrVolumeFrame = FF598ACD +clrVolumeSymbol = FF000000 +clrVolumeBarUpper = FF38359E +clrVolumeBarLower = FF9FCEFF +clrChannelFrame = FF598ACD +clrChannelName = FF000000 +clrChannelDate = FF000000 +clrChannelSymbolOn = FF000000 +clrChannelSymbolOff = FF5A7CA2 +clrChannelSymbolRecFg = FFFCFCFC +clrChannelSymbolRecBg = FFFC1414 +clrChannelEpgTime = FF000000 +clrChannelEpgTitle = FF00FCFC +clrChannelEpgShortText = FFFCC024 +clrChannelTimebarSeen = FF38359E +clrChannelTimebarRest = FF9FCEFF +clrMenuFrame = FF598ACD +clrMenuTitle = FF000000 +clrMenuDate = FF000000 +clrMenuItemCurrentFg = FF000000 +clrMenuItemCurrentBg = FF9C9CFF +clrMenuItemSelectable = FF9C9CFF +clrMenuItemNonSelectable = FF00FCFC +clrMenuEventTime = FFFCC024 +clrMenuEventVps = FF000000 +clrMenuEventTitle = FF00FCFC +clrMenuEventShortText = FFFCC024 +clrMenuEventDescription = FF00FCFC +clrMenuScrollbarTotal = FF38359E +clrMenuScrollbarShown = FF00FCFC +clrMenuScrollbarArrow = FF000000 +clrMenuText = FF00FCFC +clrReplayFrame = FF598ACD +clrReplayTitle = FF000000 +clrReplayMode = FF000000 +clrReplayCurrent = FF000000 +clrReplayTotal = FF000000 +clrReplayJump = FF000000 +clrReplayProgressSeen = FF9FCEFF +clrReplayProgressRest = FF38359E +clrReplayProgressSelected = FFFC1414 +clrReplayProgressMark = FF000000 +clrReplayProgressCurrent = FFFC1414