--- vdr-1.6.0.orig/debian/vdr-dbg.install +++ vdr-1.6.0/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.6.0.orig/debian/vdr-newplugin.1 +++ vdr-1.6.0/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.6.0.orig/debian/vdr-dev.install +++ vdr-1.6.0/debian/vdr-dev.install @@ -0,0 +1,17 @@ +*.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/ + +debian/make-special-vdr.sh usr/share/vdr-dev/ --- vdr-1.6.0.orig/debian/vdr-recordingaction +++ vdr-1.6.0/debian/vdr-recordingaction @@ -0,0 +1,49 @@ +#!/bin/sh +# +# VDR Recording Action Script - Tobias Grimm +# --------------------------- +# +# 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. +# +# 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. +# + +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.6.0.orig/debian/vdr-dev.manpages +++ vdr-1.6.0/debian/vdr-dev.manpages @@ -0,0 +1,3 @@ +debian/vdr-newplugin.1 +debian/debianize-vdrplugin.1 +debian/vdrdbg-buildpackage.1 --- vdr-1.6.0.orig/debian/vdr-dbg.links +++ vdr-1.6.0/debian/vdr-dbg.links @@ -0,0 +1 @@ +usr/share/doc/vdr usr/share/doc/vdr-dbg --- vdr-1.6.0.orig/debian/vdrleaktest +++ vdr-1.6.0/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 +## +### 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.6.0.orig/debian/vdr.templates +++ vdr-1.6.0/debian/vdr.templates @@ -0,0 +1,16 @@ +Template: vdr/select_dvb_card +Type: select +_Choices: Satellite, Terrestrial, Cable +Default: Satellite +_Description: DVB card type: + VDR needs to know your DVB card type to work correctly. + Using your selection, a channels.conf file will be installed to /var/lib/vdr. + You may have to change this file depending on your setup. + +Template: vdr/create_video_dir +Type: boolean +Default: false +_Description: Create /var/lib/video.00? + By default VDR is configured to use /var/lib/video.00 to store recordings. + You can either create this directory now, or change this behavior later + by modifying the VIDEO_DIR variable in /etc/default/vdr. --- vdr-1.6.0.orig/debian/watch +++ vdr-1.6.0/debian/watch @@ -0,0 +1,3 @@ +version=2 +ftp://ftp.cadsoft.de/vdr/vdr-([\d\.]+)\.tar\.bz2 +#ftp://ftp.cadsoft.de/vdr/Developer/vdr-([\d\.]+)\.tar\.bz2 --- vdr-1.6.0.orig/debian/vdr.NEWS +++ vdr-1.6.0/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 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 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 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 + + 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 Sat, 29 May 2004 19:43:49 +0200 --- vdr-1.6.0.orig/debian/vdr-plugin-sky.examples +++ vdr-1.6.0/debian/vdr-plugin-sky.examples @@ -0,0 +1 @@ +PLUGINS/src/sky/*.sky --- vdr-1.6.0.orig/debian/debugvdr +++ vdr-1.6.0/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.6.0.orig/debian/order.commands.conf +++ vdr-1.6.0/debian/order.commands.conf @@ -0,0 +1,10 @@ +# +# If you like a fixed order in your commands menu, place the command base names +# (commands..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.6.0.orig/debian/vdr-shutdown-message +++ vdr-1.6.0/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.6.0.orig/debian/.vdr-patches.multipatch +++ vdr-1.6.0/debian/.vdr-patches.multipatch @@ -0,0 +1,41 @@ +debian/patches/opt-52_hard_link_cutter.dpatch:2a82f643d53300c33da530935c8016a4 +debian/patches/opt-43-x_recordshowfree.dpatch:66152f345b03259d28e89135cda42310 +debian/patches/12_osdbase-maxitems.dpatch:e45d1b62f7d66c3e5d279e3561034107 +debian/patches/11_sortrecordings.dpatch:9ed4cd1e144ee59dab34d4df4aa9af51 +debian/patches/opt-53_dvbsetup.dpatch:dbb3417b0b33548728b43fd8613f7c73 +debian/patches/opt-50_graphtft.dpatch:aeba283cc500591fa0b6d112c063fadf +debian/patches/16_channels.conf.terr-fix.dpatch:72595733d0b46aa4093a640708d19226 +debian/patches/06_default_svdrp_port_0.dpatch:b49237a9ee246acfa01ee7ec92ad0a52 +debian/patches/18_vdr-maintenance-1.6.0-2.dpatch:ffe53a24b2c592c18dd08b31d35fd655 +debian/patches/82_valgrind.dpatch:46960921b989f2f4dab829a51622ed85 +debian/patches/opt-42-x_MainMenuHooks.dpatch:1c4c782b5c88c4f0408890a5f50b217b +debian/patches/opt-44_rotor.dpatch:bbcc27512e0a0b610efadcde8fa67d02 +debian/patches/opt-20_liemikuutio.dpatch:bb8bb6b250b8b2ee24dad87a7c4490f8 +debian/patches/10_dd-record-option.dpatch:58c3a3dbcd9a3ec4b0ee1814f71d1e88 +debian/patches/opt-21_internal-cam-devices.dpatch:a883c0b09e67b679436b7df1e9807fc8 +debian/patches/09_sort_options.dpatch:3b561fcd7645b216b4dab989d7786fda +debian/patches/opt-41-x_timer-info.dpatch:92ee6cdf60b795d9fbcf4fdcafe401b4 +debian/patches/opt-24_jumpplay.dpatch:1ff8f1a90e02b11a42218ffba18b5f26 +debian/patches/opt-30-x_analogtv.dpatch:3789ff68d9dc9a2482f78519634b27b6 +debian/patches/17_vdr-maintenance-1.6.0-1.dpatch:3a2ff2c6d3b13489c19eda4e32f2537c +debian/patches/03_cmdsubmenu.dpatch:abff754a3d760764796f06cdf1cf5105 +debian/patches/19_dvb-api-v5.dpatch:6714266c10537521d2440cfa4d50b3f0 +debian/patches/opt-28_audioindexer.dpatch:eab872310fd03a175b3b93a90d22d5db +debian/patches/opt-31-x_reelchannelscan.dpatch:f8c06ac51888248f68badcab8533c2be +debian/patches/81_Make_config.dpatch:dcff6a00ef9474bca19d955d19574009 +debian/patches/opt-51_cuttime.dpatch:cfbf0a7934f109148fef4e385c3eb465 +debian/patches/opt-40_iptv.dpatch:2cca9430e7f83eaf9d25b1e8ca9e5fa7 +debian/patches/14_cap-memsize.dpatch:7beb9bcecb1bdce4a03c1729acfbbdb3 +debian/patches/opt-48-x_pin.dpatch:5e8f7e1b1ad5ed8ac51736d2aed02f9c +debian/patches/opt-47_sourcecaps.dpatch:626ed6d141802b9cae8c4b6cab97311e +debian/patches/opt-37-x_menuorg.dpatch:9fb02cc8bd848add50b3866b6f476644 +debian/patches/opt-45_yaepg.dpatch:351c08a687755050e1140766b56dc27b +debian/patches/opt-27_ttxtsubs.dpatch:c0b18cf05be89d87b0dff02ddeb14f05 +debian/patches/99_ncursesw-include.dpatch:90810d58108ff8d9afd768fec67be904 +debian/patches/opt-39_noepg.dpatch:424391fa1176800ec3a13ec608fafcd7 +debian/patches/opt-54_deltimeshiftrec.dpatch:5ed1505172adbdb45a583a69dfe19763 +debian/patches/opt-49-x_pvrinput.dpatch:213c07a003000b6b93f1a8d004787220 +debian/patches/04_newplugin.dpatch:e99f8d21734a19b3eb93d9e3f11b680a +debian/patches/opt-38_disableDoubleEpgEntrys.dpatch:7a09fa581f95613497b718b5c4a4a875 +debian/patches/opt-29_syncearly-audioindexer.dpatch:4093d09329d441bd25703a4892633efb +debian/patches/15_dvbplayer.dpatch:d1f31f0687c917dea48bc0ba26b7f3bb --- vdr-1.6.0.orig/debian/debianize-vdrplugin.1 +++ vdr-1.6.0/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.6.0.orig/debian/changelog +++ vdr-1.6.0/debian/changelog @@ -0,0 +1,1316 @@ +vdr (1.6.0-9ubuntu2) karmic; urgency=low + + * Fix FTBFS with gcc 4.4 + - Add 20_gcc44_ftbfs.dpatch - Thanks Fedora + - Modify debian/patches/opt-20_liemikuutio.dpatch + - Run debian/rules accept-patches to update the list of accepted + patches. + * Recommend ttf-dejavu instead of ttf-bitstream-vera as it has been + removed from karmic (LP: #434176) + + -- Felix Geyer Mon, 21 Sep 2009 22:36:10 +0200 + +vdr (1.6.0-9ubuntu1) jaunty; urgency=low + + * Merge from debian unstable (LP: #325277, #360552), remaining changes: + - Enabled patches: + - opt-20_liemikuutio + - opt-24_jumpplay + - opt-27_ttxtsubs + - opt-42-x_MainMenuHooks + - opt-51_cuttime + - Run debian/rules accept-patches to update the list of accepted + patches. + - Remove po/vdr.pot after build. + + -- Timo Aaltonen Mon, 13 Apr 2009 19:20:49 +0300 + +vdr (1.6.0-9) unstable; urgency=low + + [ Tobias Grimm ] + * Removed debconf note "VDR needs DVB kernel modules" - DVB modules should + be part of the standard kernel (at least on i386 and amd64). + * Fixed debconf to not ask to create /var/lib/video.00 if it already exists + * Added 19_dvb-api-v5.dpatch for new DVB API version 5 in kernel 2.6.28 + (Closes: #522011) + * Updated debian/copryright + * Added ${misc:Depends} to vdr-plugin-* + * Changed section of all packages to "video" except vdr-dbg which became + "debug" + * Bumped standards version to 3.8.1 + + [ Thomas Günther ] + * Added removal of vdr-dbg.1 to clean target in debian/rules + * Fixed substitution of 00list in debian/rules + * Added French language texts to 10_dd-record-option.dpatch (Thx to Michaël + Nival) + * Upgraded opt-24_jumpplay.dpatch to version 1.0 + * Added French language texts to opt-38_disableDoubleEpgEntrys.dpatch (Thx to + Michaël Nival) + + -- Tobias Grimm Thu, 02 Apr 2009 14:55:20 +0200 + +vdr (1.6.0-8) unstable; urgency=low + + * Added 18_vdr-maintenance-1.6.0-2.dpatch (Closes: #485593) + * 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) + * 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 + + -- Tobias Grimm Sat, 29 Nov 2008 14:21:04 +0100 + +vdr (1.6.0-7) unstable; urgency=medium + + [ Thomas Schmidt ] + * Fixed bashism in debian/rules (Closes: #491586) + + -- Tobias Grimm Wed, 27 Aug 2008 19:08:44 +0200 + +vdr (1.6.0-6) unstable; urgency=medium + + * Removed stdout output from vdrleaktest to /tmp/memleaktest.log, + create tempfile in debugvdr using mktemp now, to prevent + possible symlink attacks (Closes: #496421) + + -- Tobias Grimm Sun, 24 Aug 2008 23:13:44 +0200 + +vdr (1.6.0-5ubuntu2) intrepid; urgency=low + + * Run debian/rules accept-patch to update the list of accepted patches. + (FTBFS) + * debian/rules: Fix the comparison of patch lists. + + -- Timo Aaltonen Wed, 13 Aug 2008 13:20:22 +0300 + +vdr (1.6.0-5ubuntu1) intrepid; urgency=low + + * Merge from debian unstable, remaining changes: + - Enabled patches: + - opt-20_liemikuutio + - opt-24_jumpplay + - opt-27_ttxtsubs + - opt-42-x_MainMenuHooks + - opt-51_cuttime + + -- Timo Aaltonen Wed, 13 Aug 2008 12:47:30 +0300 + +vdr (1.6.0-5) unstable; urgency=low + + [ Thomas Schmidt ] + * Bumped Standards-Version to 3.8.0 + + [ Tobias Grimm ] + * 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) + * Setting VDR_LANG now takes care of /etc/default/locale if available, + otherwise uses /etc/environment or falls back to "C" (Closes: #490651) + + -- Thomas Schmidt Sat, 19 Jul 2008 16:25:21 +0200 + +vdr (1.6.0-4ubuntu1) intrepid; urgency=low + + * Merge from debian unstable, remaining changes: + - Enabled patches: + - opt-20_liemikuutio + - opt-24_jumpplay + - opt-27_ttxtsubs + - opt-42-x_MainMenuHooks + - opt-51_cuttime + + -- Timo Aaltonen Wed, 09 Jul 2008 13:16:05 +0300 + +vdr (1.6.0-4) unstable; urgency=high + + [ Tobias Grimm ] + * Made valgrind a Suggests and check in vdrleaktest, if valgrind exists + (Closes: #489003) + + [ Thomas Schmidt ] + * Set urgency to high, because it fixes an rc-bug + + -- Thomas Schmidt Thu, 03 Jul 2008 10:21:17 +0200 + +vdr (1.6.0-3) unstable; urgency=low + + * Installing the pictures plugin now with vdr-plugin-examples + * Replaced usage of 'at' with 'nohupc -c "( command )" >/dev/null 2>&1 &' + * Removed debian/linda + + -- Tobias Grimm Wed, 18 Jun 2008 00:52:58 +0200 + +vdr (1.6.0-2) unstable; urgency=low + + [ Tobias Grimm ] + * Removed makedev dependency (not needed anymore since 1.4.7-2) + (closes: #477062) + * Added dependency to at (required by shutdown scripts) + * 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) + * Added caching to plugin-loader.sh to speed up the initial startup of vdr + (Patch provided by Michael Burian ) + * Added 17_vdr-maintenance-1.6.0-1.dpatch + * Updated opt-20_liemikuutio.dpatch + * Updated opt-48-x_pin.dpatch + * Upgraded opt-37-x_menuorg.dpatch to version 0.4.2 + * 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) + * Applied a lot of spelling fixes (Thanks to Michael Nork!) + * Modified opt-49-x_pvrinput.dpatch: Added CA-Id's 0xA1 and 0xA2, required by + pvrusb2 as suggested by Christian Jarczyk + * Using txt2man for manpages that used docbook before + * Upgraded opt-21_liemikuutio.dpatch to version 1.21 + * Updated opt-48_pin.dpatch + * Upgraded extensions patch to version 61 + * 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 + + + [ Thomas Günther ] + * Upgraded make-special-vdr.sh to version 0.9 + * Upgraded opt-41-x_timer-info.dpatch to version 0.5 + * Improved caching in plugin-loader.sh + + [ Thomas Schmidt ] + * Added Galician debconf translation (gl.po) from Jacobo Tarrio + (closes: #482132) + + -- Thomas Schmidt Wed, 21 May 2008 22:03:28 +0200 + +vdr (1.6.0-1ubuntu2) hardy; urgency=low + + * Remove po/vdr.pot after build (FTBFS). + + -- Timo Aaltonen Wed, 09 Apr 2008 00:58:43 +0300 + +vdr (1.6.0-1ubuntu1) hardy; urgency=low + + * Merge from Debian experimental (LP: #212216), remaining changes: + - Enabled patches: + - opt-20_liemikuutio + - opt-24_jumpplay + - opt-27_ttxtsubs + - opt-42-x_MainMenuHooks + - opt-51_cuttime + - Unexport CXXFLAGS and LDFLAGS to fix FTBFS with the new + dpkg-buildpackage. + + -- Timo Aaltonen Sat, 05 Apr 2008 14:08:15 +0300 + +vdr (1.6.0-1) experimental; urgency=low + + [ Tobias Grimm] + * New upstream release (closes: #467512) + * Updated 03_cmdsubmenu.dpatch + * Updated 09_sort_options.dpatch + * Upgraded opt-20_liemikuutio.dpatch to version 1.19 + * Updated opt-31-x_reelchannelscan + * Updated opt-37-x_menuorg.dpatch + * Updated opt-38_disableDoubleEpgEntrys.dpatch, to avoid sprintf buffer + overflows + * Updated opt-41-x_timer-info.dpatch + * Updated opt-43-x_recordshowfree.dpatch + * Updated opt-47_sourcecaps + * Updated opt-48-x_pin.dpatch + * Applied modification from Michaël Nival to opt-45_yaepg.dpatch that fixes a + small bug + * 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 + * Adapted 15_dvbplayer.dpatch + * Added 01_pic2mpg-debian.dpatch + * Added 99_ncursesw-include.dpatch + * Added opt-49-x_pvrinput.dpatch + * Added opt_40-iptv.dpatch + * Added latest version of pin patch opt-48_pin-0.1.7.dpatch + * Added installation of the pictures plug-in + * Line-wrapped dependencies in debian/control + * COMPAT=5, debhelper (>= 5) + * Made debianize-vdrplugin create cdbs based plugin packages + * Using empty directory /usr/lib/vdr/plugins again and adding lintian + override for "package-contains-empty-directory" warning - VDR + requires the plugin directory! + * Added short description to the NAME section of the manpages to fix the + Lintian manpage-has-bad-whatis-entry warning + * Removed upgrade code for VDR 1.2.6 from postinst + * Added some lines of documentation to README.Debian, explaining that + plug-ins 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= in /etc/default/vdr + * Made vdrleaktest and debugvdr explicitly using bash, because + commands-loader.sh and plugin-loader.sh contain bashisms + * 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 + + [ Thomas Günther ] + * Adapted 04_newplugin.dpatch + * Adapted 10_dd-record-option.dpatch + * Adapted opt-24_jumpplay.dpatch + * Adapted opt-28_audioindexer.dpatch + * Updated opt-39_noepg.dpatch + * Updated opt-44_rotor.dpatch + * Adapted opt-45_yaepg.dpatch + * Adapted opt-50_graphtft.dpatch + * Adapted opt-50_graphtft-0.1.dpatch + * Adapted opt-51_cuttime.dpatch + * Removed 02_Makefile-CFGDIR.dpatch + * Removed 17_epg-conv-iso6937.dpatch + * Removed opt-27-x_subtitles-ttxtsubs-volumebar-fix.dpatch (now + integrated in opt-27_subtitles-ttxtsubs.dpatch) + * Removed opt-40_wareagle-icons.dpatch + * Added opt-29_syncearly.dpatch and opt-29_syncearly-audioindexer.dpatch + * Added opt-48_pin-submenu.dpatch + * Added opt-50_graphtft-0.1.dpatch + * Replaced opt-27_subtitles-ttxtsubs.dpatch with opt-27_ttxtsubs.dpatch - + subtitles support now integrated in upstream (closes: #352442) + * Added gettext to Build-Depends + * 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 + * Added URL for developer version to debian/watch + * Upgraded make-special-vdr.sh to version 0.7 + + [ Thomas Schmidt ] + * Added vdr-dbg-package + scripts vdrleaktest, debugvdr and + vdrdbg-buildpackage from Tobias repository + * Updated debian/copyright + * Changed config-loader.sh to get default $LANG from /etc/environment + * Updated years in debian/copyright + + -- Thomas Schmidt Mon, 24 Mar 2008 18:58:22 +0100 + +vdr (1.4.7-3) unstable; urgency=low + + [ Tobias Grimm ] + * Synced optional patches with e-tobi.net version of the VDR package + - Added opt-50_graphtft-0.1.dpatch + - Added opt-51_cuttime.dpatch + - Added opt-39_noepg.dpatch + - Added opt-32_iptv.dpatch + - Added opt-43-x_recordshowfree.dpatch + - Added opt-37-x_menuorg.dpatch + - Added opt-31-x_reelchannelscan.dpatch + - Added opt-48-x_pin.dpatch + - Removed opt-37_submenu.dpatch + - Updated opt-48_pin.dpatch + + [ Thomas Schmidt ] + * Do not ignore errors in clean-target + * Added Homepage field to debian/control + * Renamed XS-Vcs-* fields to Vcs-* in debian/control + * Bumped Standards-Version to 3.7.3 + * Removed menu file, vdr should always be used as daemon + * Do not include empty directory /usr/lib/vdr/plugins + * Use ${binary:Version} instead of ${Source-Version} to make package + binNMUable + * Converted debian/copyright to UTF-8 + * Removed override for lintian warning menu-command-not-in-package + + -- Thomas Schmidt Sat, 29 Dec 2007 18:06:09 +0100 + +vdr (1.4.7-2) unstable; urgency=low + + [ Thomas Schmidt ] + * Removed support for starting vdr without NPTL-support as glibc 2.5 does + not support this anymore + * removed creation of dvb-devices in postinst - should be created on every + system automatically (closes: #428695) + + [ Thomas Günther ] + * Upgraded make-special-vdr.sh to version 0.6 (xineliboutput, + burnbackgrounds, debianize-vdrplugin, vompserver) + + [ Tobias Grimm ] + * Changed copyright file in the new plug-in template to match + the new debian/copyright schema for VDR packages + + -- Tobias Grimm Fri, 07 Sep 2007 09:53:59 +0200 + +vdr (1.4.7-1) unstable; urgency=low + + [ Tobias Grimm ] + * Added opt-42-x_MainMenuHooks.dpatch + * Upgraded opt-48_pin.dpatch + * Updated opt-50_graphtft.dpatch + * Removed 92_MainMenuHooks.dpatch + * Removed opt-42-x_extrecmenu.dpatch + * Upgraded opt-27_subtitles-ttxtsubs to Rolf Ahrenberg's + vdr-1.4.5-subtitles-0.5.0-and-ttxtsubs-0.0.5.diff.gz (no functional changes, + just new version numbers) + * Added Portuguese debconf translations (closes: #415495) + * Modified 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 ] + * Removed debug logs in 17_epg-conv-iso6937.dpatch + + [ 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 + * New upstream release + * Added XS-Vcs-Svn and XS-Vcs-Browser fields to debian/control + * Removed version from build-dependency to dpatch - even Sarge has the + required version + + -- Thomas Schmidt Mon, 28 May 2007 14:16:19 +0200 + +vdr (1.4.6-1) experimental; urgency=low + + [ 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 + + [ Thomas Günther ] + * 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) + + [ Thomas Schmidt ] + * New upstream release + + -- Thomas Schmidt Sat, 10 Mar 2007 16:04:26 +0100 + +vdr (1.4.5-1) experimental; urgency=low + + [ Tobias Grimm ] + * Removed Conflicts line from plugin template + * Added Lintian override to vdr-dev regarding reports about + /usr/share/vdr-dev/plugin-template/rules not being a valid shell script + * Added lintian source override for "debian-rules-not-a-makefile" + * Removed lintian override for menu-command-not-in-package /usr/lib/menu/vdr:2 + * Added the complete list of optional patches from the vdr package at e-tobi.net + (Ubuntu might want to use them) + * Fixed shutdown script to not cause at to generate mails when a shutdown is + scheduled for later retry - fix provided by + Wolfgang Miller-Reichling + * Added a linda override file to source package - at the moment it will not + be installed by any binary package + + [ Thomas Günther ] + * 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 ] + * New upstream release + + -- Thomas Schmidt Sun, 14 Jan 2007 20:10:35 +0100 + +vdr (1.4.4-1) unstable; urgency=low + + [ Tobias Grimm ] + * New upstream release + * Renamed and updated optional subtitles-ttxtsubs example patch + * Created symlinks of setup.conf, channels.conf, remote.conf and + /etc/default/vdr in /etc/vdr/ + + [ Thomas Schmidt ] + * Removed linux-kernel-headers build-dependency, not needed anymore + * Removed vdr-dev dependency on dvb-dev | linux-kernel-headers + (Ubuntu Bug #65340) + + -- Thomas Schmidt Sun, 5 Nov 2006 17:40:44 +0100 + +vdr (1.4.3-1) unstable; urgency=low + + * New upstream release + - Added LC_ALL=$VDR_LANG when calling vdr in debian/runvdr + + -- Thomas Schmidt Tue, 26 Sep 2006 21:14:50 +0200 + +vdr (1.4.2-1) unstable; urgency=low + + * New upstream release + - Removed 01_IA64-FTBFS-fix.dpatch + * Added Tobias Grimm and Thomas Günther to Uploaders + + -- Thomas Schmidt Tue, 29 Aug 2006 07:57:05 +0200 + +vdr (1.4.1-1) unstable; urgency=low + + [ Thomas Günther ] + * Upgraded opt-24_jumpplay-0.8.dpatch to opt-24_jumpplay.dpatch version 0.9 + + [ Tobias Grimm ] + * New upstream release + * 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 + * Added KEYB_TTY-option which may be overridden in /etc/default/vdr to make + VDR switch to and accept input from the specified console + + [ Thomas Schmidt ] + * Using new changelog-format (closes: #343871) + * 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 Tobias Grimm, Thomas Günther and myself to debian/copyright + * Added LSB-Headers and status action to debian/vdr.init + * Added 16_channels.conf.terr-fix.dpatch to fix the example + channels.conf.terr + * Bumped Standards-Version to 3.7.2 + * Do not fail silently in postinst if invoke-rc.d vdr fails + + -- Thomas Schmidt Tue, 15 Aug 2006 07:49:08 +0200 + +vdr (1.4.0-2) unstable; urgency=low + + * Thomas Günther + - Fixed i18n texts for replay in 10_dd-record-option.dpatch + - Upgraded 03_cmdsubmenu.dpatch to version 0.7 - fixes FTBFS with G++ 4.1: + extra qualification (closes: #367360) + - Upgraded opt-24_jumpplay-0.7.dpatch to opt-24_jumpplay-0.8.dpatch + * Thomas Schmidt + - Fixed debian/watch + + -- Debian VDR Team Sat, 27 May 2006 09:54:14 +0200 + +vdr (1.4.0-1) unstable; urgency=low + + * Thomas Schmidt + - New upstream release + + -- Debian VDR Team Sun, 30 Apr 2006 14:52:45 +0200 + +vdr (1.3.48-1) unstable; urgency=low + + * New upstream release + * Tobias Grimm + - Call target clean-plugins instead of plugins-clean in debian/rules + * Thomas Günther + - Updated 10_dd-record-option.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 + - Removed 16_vdr-1.3.46_menuitems.c-fix.dpatch + - Upgraded opt-24_jumpplay-0.6.dpatch to opt-24_jumpplay-0.7.dpatch + * Thomas Schmidt + - 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 + + -- Debian VDR Team Tue, 18 Apr 2006 00:53:07 +0200 + +vdr (1.3.46-1) unstable; urgency=low + + * New upstream release + * Thomas Günther + - Removed 13_vdr_1.3.45_sources.conf-fix.dpatch + - Removed 16_vdr_1.3.45_diseqc.conf-fix.dpatch + - Removed 17_replay.dpatch + - Removed 99_epg-fix.dpatch + - Added 16_vdr-1.3.46_menuitems.c-fix.dpatch + + -- Debian VDR Team Sun, 9 Apr 2006 17:46:02 +0200 + +vdr (1.3.45-1) unstable; urgency=low + + * Thomas Schmidt + - New upstream release + + Added 13_vdr_1.3.45_sources.conf-fix.dpatch + + Added 14_cap-memsize.dpatch + + Added 16_vdr_1.3.45_diseqc.conf-fix.dpatch + + Updated 11_sortrecordings.dpatch + + Updated 15_dvbplayer.dpatch + + Removed 18_vdr-1.3.39-menu-on-control.dpatch + + Removed 19_vdr-1.3.41-no-title-fix.dpatch + - Do not build-depend on dvb-dev anymore, this package is just a + dummy-package for easier woody -> sarge upgrades and will be + removed from the archive soon + + -- Debian VDR Team Sun, 26 Mar 2006 18:08:29 +0200 + +vdr (1.3.41-1) unstable; urgency=low + + * Thomas Schmidt + - New upstream release + + Removed 13_epgfix.dpatch + + Added 99_epg-fix.dpatch + + Added 19_vdr-1.3.41-no-title-fix.dpatch + + -- Debian VDR Team Tue, 7 Feb 2006 22:50:56 +0100 + +vdr (1.3.40-1) unstable; urgency=low + + * Thomas Schmidt + - New upstream release + + Removed 19_vdr-1.3.39-clre-crash-fix.dpatch + + Removed 20_vdr-1.3.39-schedule-crash-fix.dpatch + + Removed 21_vdr-1.3.39-keys-fix.dpatch + + -- Debian VDR Team Thu, 26 Jan 2006 20:51:50 +0100 + +vdr (1.3.39-2) unstable; urgency=low + + * Thomas Schmidt + - Added 01_IA64-FTBFS-fix - fixes FTBFS of vdr>=1.3.38 on ia64 + + -- Debian VDR Team Tue, 14 Mar 2006 16:35:14 +0100 + +vdr (1.3.39-1) unstable; urgency=low + + * Thomas Schmidt + - New upstream release + + Updated 06_default_svdrp_port_0.dpatch + + Updated 09_sort_options.dpatch + + Removed 18_vdr-1.3.38-root-fix.dpatch + + Added 18_vdr-1.3.39-menu-on-control.dpatch + + Added 19_vdr-1.3.39-clre-crash-fix.dpatch + + Added 20_vdr-1.3.39-schedule-crash-fix.dpatch + + Added 21_vdr-1.3.39-keys-fix.dpatch + - Changed init-script to use almost the same start and stop + functions like ctvdr + * Thomas Günther + - Added option "-g /tmp" to vdr call in debian/vdr.init (necessary + for image grabbing from vdradmin) + + -- Debian VDR Team Sun, 22 Jan 2006 11:54:59 +0100 + +vdr (1.3.38-1) unstable; urgency=low + + * Thomas Schmidt + - 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 + + Added 18_vdr-1.3.38-root-fix.dpatch + - 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 + + -- Debian VDR Team Sun, 8 Jan 2006 20:13:57 +0100 + +vdr (1.3.37-1) unstable; urgency=low + + * Thomas Schmidt + - New upstream release + + Removed 01_Makefile-fPIC-fix.dpatch + + Updated 03_cmdsubmenu.dpatch + + Updated 04_newplugin.dpatch + + Removed 16_recordings.c-fix.dpatch + + Removed 22_vdr-playerepg.dpatch + + -- Debian VDR Team Sat, 10 Dec 2005 12:46:15 +0100 + +vdr (1.3.35-1) unstable; urgency=low + + * Thomas Schmidt + - New upstream release + + Removed 16_avoidTrashing.dpatch + + Removed 18_vdr-1.3.33-recordingsmenu.dpatch + + Removed 19_vdr-1.3.33-recordingsupdate.dpatch + + Added 16_recordings.c-fix.dpatch + - Corrected FSF address in debian/copyright + - Call dh_installman in binary-indep target in debian/rules, to + (re-)include 2 missing manpages + - 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) + + -- Debian VDR Team Tue, 1 Nov 2005 21:43:03 +0100 + +vdr (1.3.33-1) unstable; urgency=low + + * Thomas Schmidt + - New upstream release + + Removed 14_update-resume.dpatch + + Removed 18_vdr-plugin-sky-fix + - Added initial Swedish translation (sv.po) of the debconf template + from Daniel Nylander (closes: #330988) + * Thomas Günther + - Added 18_vdr-1.3.33-recordingsmenu.dpatch + - Added 19_vdr-1.3.33-recordingsupdate.dpatch + - Fixed make PLUGINS/lib in debian/rules + * Tobias Grimm + - Removed formatting spaces from substvars generated by + dpendencies.sh, because dh_gencontrol does not like it + + -- Debian VDR Team Mon, 3 Oct 2005 13:26:46 +0200 + +vdr (1.3.32-1) unstable; urgency=low + + * Thomas Schmidt + - New upstream release + + 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 + + -- Debian VDR Team Sun, 11 Sep 2005 17:58:47 +0200 + +vdr (1.3.31-3) unstable; urgency=low + + * Thomas Schmidt + - Updated 01_Makefile-fPIC-fix.dpatch again, added -fPIC to the Makefile + of the skincurses plugin + - Build-Depend on libncurses5-dev, so the skincurses plugin gets compiled + - Install the plugins svccli, svcsvr, skincurses and svdrpdemo into the + vdr-plugin-examples package + - Modified the init-script to not exit silently if vdr is disabled in + /etc/default/vdr (which is the default), instead of this showing a small + note how to enable the daemon + - 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) + * Thomas Günther + - Fixed vdr call with LD_ASSUME_KERNEL=2.4.1 in plugins-loader.sh + - Adapted debian/plugin-loader.sh to example plugins + - Fixed patchlevel substitution for architecture-independent packages + - Removed unnecessary debian/vdr-dev.dirs and unnecessary entries from + debian/vdr.dirs + + -- Debian VDR Team Tue, 6 Sep 2005 14:19:43 +0200 + +vdr (1.3.31-2) unstable; urgency=low + + * Thomas Schmidt + - Updated 01_Makefile-fPIC-fix.dpatch, added -fPIC to the Makefiles + of the new example plugins to fix the FTBFS on some architectures + + -- Debian VDR Team Fri, 2 Sep 2005 23:26:47 +0200 + +vdr (1.3.31-1) unstable; urgency=low + + * Thomas Schmidt + - New upstream release + - Use --background when calling start-stop-daemon in the init-script + - Added 16_avoidTrashing.dpatch, which prevents vdr from trashing the + file system buffers when reading/writing recordings + - Added 18_vdr-1.3.31-remuxbraces - Fixes some gcc4 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 + - Added dependencies.sh to vdr-dev to automatically fill in the right + Depends and Conflicts to vdr when building a plugin + - Cleaned up debian/rules and synced as far as possible with the version + from Tobias inofficial vdr package and changed a few things as suggested + by Thomas Günther + * Tobias Grimm + - Made debian/patchlevel.sh accept opt-entries in 00list with leading + spaces and removed leading space from vdr-patchlevel output + * Thomas Günther + - Made debian/plugin-template/rules svn-buildpackage-save + - Updated 15_dvbplayer.dpatch + - Added 22_vdr-playerepg.dpatch - Fixes mp3 plugin problems + - Made debian/plugin-template/control and debian/plugin-template/rules + compatible with dependencies.sh and new patchlevel.sh + + -- Debian VDR Team Fri, 2 Sep 2005 17:14:02 +0200 + +vdr (1.3.30-1) unstable; urgency=low + + * Thomas Schmidt + - New upstream release + + Should fix the FTBFS on several arches (closes: #324082) + - Added 11_sortrecordings.dpatch, to allow changing the sort-order + of the recordings + + -- Debian VDR Team Sat, 27 Aug 2005 19:34:47 +0200 + +vdr (1.3.29-1) unstable; urgency=low + + * Thomas Schmidt + - New upstream release + * Thomas Günther + - Improved newplugin script + - Updated opt-24_jumpplay-0.6.dpatch + - Added 13_epgfix.dpatch to force saving of EPG data on exit + + -- Debian VDR Team Mon, 15 Aug 2005 17:31:44 +0200 + +vdr (1.3.28-2) unstable; urgency=low + + * Tobias Grimm + - Added osdbase-maxitems patch, which fixes a problem with the Enigma skin + + -- Debian VDR Team Sun, 14 Aug 2005 14:33:39 +0200 + +vdr (1.3.28-1) unstable; urgency=low + + * Thomas Schmidt + - New upstream release + + Removed 13_remote.dpatch + + Removed 16_dvbspu.dpatch + + Updated 10_dd-record-option.dpatch + + Updated 15_dvbplayer.dpatch + - vdr-dev: depend on ${misc:Depends}, debhelper, + dvb-dev (>= 1.0.0) | linux-kernel-headers (>=2.5.999-test7-bk-6) + - vdr-dev: suggests dh-make + * Tobias Grimm + - Extract patch infos and install to /usr/share/doc/vdr/patchinfo + - Renamed 01_vdr_1.2.6-3.1.diff.gz to 01_Makefile-fPIC-fix + + -- Debian VDR Team Tue, 9 Aug 2005 20:45:37 +0200 + +vdr (1.3.27-1) unstable; urgency=low + + * Thomas Schmidt + - New upstream release + + Removed 12_nptl.dpatch + + Removed 18_vdr-1.3.26-pagedown-fix.dpatch + - The new upstream version seems to compile fine with gcc-4.0 + (closes: #294041) + - Added 10_dd-record-option.dpatch - allows to choose if to record + or to replay Dolby Digital independently + - Updated 03_cmdsubmenu.dpatch and opt-24_jumpplay-0.6.dpatch to the + versions from vdrdevel + - Now using debian/watch from vdrdevel + - Bumped Standards-Version to 3.6.2 + * Tobias Grimm + - Added installation of README.vps and README.developer + - Fixed parameter passing in vdr-shutdown + - Fixed package description + - Replaced some tabs with spaces and fixed indentation + - Took over commands-loader.sh from vdrdevel + - Added ${shlibs:Depends} + + -- Debian VDR Team Wed, 29 Jun 2005 15:49:58 +0200 + +vdr (1.3.26-1) unstable; urgency=low + + * Thomas Schmidt + - New upstream release + + Added 18_vdr-1.3.26-pagedown-fix.dpatch + + -- Debian VDR Team Sun, 12 Jun 2005 16:52:15 +0200 + +vdr (1.3.25-1) experimental; urgency=low + + * Thomas Schmidt + - New upstream release + + Updated 05_set_system_time_as_user.dpatch + - Create device files silently + + -- Debian VDR Team Tue, 31 May 2005 14:06:49 +0200 + +vdr (1.3.24-1) experimental; urgency=low + + * Thomas Schmidt + - New upstream release + + Removed 10_livelock.dpatch + + Removed 11_memleak.dpatch + + Updated 15_dvbplayer.dpatch + + -- Debian VDR Team Mon, 9 May 2005 15:47:50 +0200 + +vdr (1.3.23-1) experimental; urgency=low + + * Thomas Schmidt + - New upstream release + + Removed 01_gcc3.4-FTBFS-fix.dpatch + + Removed 09_amd64_epg.dpatch + + Removed opt-23_osdpip-0.0.3.dpatch + + Removed opt-20_elchiaio4d+1.dpatch + + Removed opt-22_8bitcolor.dpatch + + Updated jumpplay patch to version 0.6 + - Use LD_ASSUME_KERNEL=2.4.1 when calling vdr in plugins-loader.sh + - Changes suggested by Thomas Günther + + debian/watch: Updated to show the newest developer versions + + Install PLUGINS.html in vdr-dev only + + Install libsi header files in package vdr-dev + + Added XB-VDR-Patchlevel-field in debian/control to vdr-dev too + + Changed a few typos in README.Debian + + Added commands.update-recordings.conf from vdrdevel to have a + command for updating the recordings list manually + + Added "Blue LCARS" and "Cool" themes from vdrdevel + + Added update-resume patch from vdrdevel (updates the resume + status of recordings after replaying them) + * Tobias Grimm + - Don't restrict root capabilities with --allow-root anymore + - Passing $OPTIONS to binary compatibility test in plugin loader now + * Darren Salt + - Added patches: + + 09_sort_options: extra channel sort options + + 10_livelock: don't hang when jumping between editing marks + + 11_memleak: fix two small memory leaks + + 12_nptl: don't abort if NPTL is in use + + 15_dvbplayer: send proper I-frames [Reinhard Nissl] + + 16_dvbspu: fix some SPU bugs [Reinhard Nissl] + + 17_replay: improve end-of-recording handling [Reinhard Nissl] + - Replaced the ttxtsubs patch with a combined subtitles+ttxtsubs patch. + + -- Debian VDR Team Wed, 04 May 2005 17:17:55 +0200 + +vdr (1.2.6-13) unstable; urgency=medium + + * Darren Salt + - Make the usage of NPTL configurable in /etc/default/vdr + - Disable the usage of NPTL on amd64 in runvdr (this always + overrides the setting in /etc/default/vdr) (closes: #305098) + * Thomas Schmidt + - Added psmisc to the depends of the package vdr (thanks to Martin + Langer for the hint) + + -- Debian VDR Team Thu, 05 May 2005 21:47:56 +0200 + +vdr (1.2.6-12) unstable; urgency=low + + * Tobias Grimm + - Don't restrict root capabilities with --allow-root anymore + - Passing $OPTIONS to binary compatibility test in plugin loader now + * Thomas Schmidt + - Add "Provides: vdr-daemon, vdr-kbd, vdr-lirc, vdr-rcu" to package + vdr to ensure smooth upgrades + + -- Debian VDR Team Sun, 10 Apr 2005 17:00:24 +0200 + +vdr (1.2.6-11) unstable; urgency=low + + * Tobias Grimm + - Modified not-as-root-patch to allow to start VDR as root anyway, if the + option --allow-root is given + + -- Debian VDR Team Sat, 09 Apr 2005 22:29:02 +0200 + +vdr (1.2.6-10) unstable; urgency=low + + * Thomas Schmidt + - Added patch for the EPG handling under amd64 (closes: #300702) + - Check for existance of /usr/sbin/runvdr before sourcing the + config-loader.sh script (closes: #302826) + - Fixed small typos in the package descriptions of vdr and + vdr-dev (closes: #300042, #300074) + - Add user vdr to group cdrom in postinst, so that vdr is able to + play DVDs with the dvd-plugin again + + -- Debian VDR Team Sat, 09 Apr 2005 18:32:59 +0200 + +vdr (1.2.6-9) experimental; urgency=low + + * Thomas Schmidt + - 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) + - Added 13_remote.dpatch from Darren Salt, this allows to have + just 1 binary for all 4 possible control methods, and it should + reduce build-time by about 75% + - Removed packages vdr-daemon, vdr-kbd, vdr-lirc, vdr-rcu because + they are not necessary anymore + - Added "Conflicts and Replaces: vdr-daemon, vdr-kbd, vdr-lirc, + vdr-rcu" to debian/control + - Removed Andreas Müller from uploaders - he does not intend + to do uploads anymore + + -- Debian VDR Team Sat, 12 Mar 2005 20:05:06 +0100 + +vdr (1.2.6-8) unstable; urgency=low + + * Thomas Schmidt + - Removed patch which fixes the compilation with gcc-4.0 on + amd64 as it causes vdr to crash, will have to investigate + this further, before the patch can be re-added + (closes: #295838) + + -- Debian VDR Team Sat, 19 Feb 2005 15:17:38 +0100 + +vdr (1.2.6-7) unstable; urgency=low + + * Thomas Schmidt + - This is the first upload of vdr, i can do by myself, i want + to thank Andreas Müller (amu) and Christoph Martin (chrism) + for their help with sponsoring previous uploads + - Only try to change capabilities when vdr is called by root + (closes: #293042) + - Added patch from Andreas Jochens to fix the FTBFS on amd64 + with gcc-4.0 (closes: #294041) + - Changed my email-address to the new debian one + - Make an entry in syslog when someone tries to shutdown vdr + while the automatic shutdown is disabled + + -- Debian VDR Team Wed, 09 Feb 2005 12:41:49 +0100 + +vdr (1.2.6-6) unstable; urgency=high + + * Urgency high because it includes a fix for CAN-2005-0071 + * Thomas Günther + - new (optional) plugin check (with "vdr -V -P plugin") + - Extracted patchlevel code to patchlevel.sh + - Installing patchlevel.sh into vdr-dev package + * Tobias Grimm + - fixed small bug in vdr-recordingaction + - moved PLUGIN_DIR, PLUGIN_PREFIX, CFG_DIR, PLUGIN_CFG_DIR, + PLUGIN_ORDER_FILE, CMDHOOKSDIR, REC_CMD from the default file to + the init script + - fixed bug in shutdown script (OSD messages have to be deferred until + the shutdown script is finished) + - removed PLUGIN_ORDER_FILE paramter, order.conf should always be in + PLUGIN_CFG_DIR + - set default location for epg.data to /var/cache/vdr (vdr -E) + - 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. + - When processing the shutdown hooks, no further hook scripts will be + processed, if one script requests to delay the shutdown. + - 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 + * Thomas Schmidt + - 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 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) + - Added 08_security_CAN-2005-0071.dpatch - do not overwrite + existing files with the GRAB-Command anymore (CAN-2005-0071) + - 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 vdr-shutdown.wrapper with owner/group root:vdr and mode 6750, + which calls the normal vdr-shutdown-script so that the user vdr is + able to run vdr's shutdown-hooks + - 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 + - Changed package vdr to Architecture: any, because it now contains + a binary file + - Added patch from Ludwig Nussel to be able to synchronize the system- + time via DVB, even when vdr runs as user + - Build-depend on libcap-dev + - Package vdr: depend on adduser + - Remove some files under /var/lib/vdr and /var/cache/vdr in postrm + on purge (closes: #287914) + - Added german (de.po) debconf-translation from Jens Nachtigall + (closes: #273643) + - Added a note to the package description and README.Debian that vdr + (without special plugins) requires a DVB-Card with an mpeg-decoder + (Closes: #287428) + - Improved runvdr-script: when no loaded dvb-modules were found, + try to load the module dvb (could be an alias for the real + dvb-module) + - Added XB-VDR-Patchlevel-field in debian/control to vdr-plugin-sky + and vdr-plugin-examples + - Build-depend on dpatch (>= 2.0.9) + - Converted existing dpatch-files to the new short format + - Added newplugin-script as vdr-newplugin to vdr-dev, so + plugin-developers can initialize a new plugin-directory without a + normal vdr-source-tree + - Added debianize-vdrplugin-script and the plugin-template-dir from + c't-vdr + - Added lintian-override to avoid the lintian-warnings for the + plugin-template-scripts + - Default VIDEO_DIR is now /var/lib/video.00, so new harddisks can + be added very easy by mounting them to /var/lib/video.0{1,2,...} + (if the old directory /var/lib/video exists, create + /var/lib/video.00 as symlink to the old directory, if it does + not exist, /var/lib/video will be a symlink to /var/lib/video.00) + - Removed unnecessary debconf-question about creating the dvb + devices, they will now be created without any question when they + are not existing already + - Removed libncurses5-dev from Build-Depends + + -- Debian VDR Team Wed, 19 Jan 2005 00:12:03 +0100 + +vdr (1.2.6-5) unstable; urgency=low + + * Tobias Grimm + - fixed Bug in vdr-shutdown script - osd messages have to be send detached + - added patchlevel check in vdr.init - only plugins that have been compiled + with the same patch levels will be loaded, to avoid conflicts due to + binary incompatibility. + - removed dh_shlibdeps and $shlibs:Depends from binary independent target + - extracted common patch code from dpatch files + - added patchlevel generation + - added patchlevel checking when loading plugins - it's enabled in + /etc/default by setting PLUGIN_CHECK_PATCHLEVEL="yes" + - added ElchiAio4d as optional patch (see README.Debian) + - added ttxtsubs-patch as optional patch + - added 8-bit-color-patch as optional patch + - added osdpip-patch as optional patch + - added jumpplay-patch as optional patch + - an entry in the (commands|reccmds).order.conf can now be disabled by + prepending a "-", just like this is done in the plugins.order.conf too + * Thomas Schmidt + - It is not possible anymore to start more than one instance of vdr + with the init-script + - Changed runvdr-script as suggested by Nikolaus Regnat (Closes: #258412) + - Fix spelling error in vdr.postinst (Closes: #258615) + - Changed Maintainer to Debian VDR and DVB Packaging team + + - List Andreas Mueller as Uploader + - Added patch from Andreas Jochens to fix FTBFS with + gcc 3.4 (Closes: #262744) + - Changed $PLUGIN_CFG_DIR in /etc/default/vdr, to /etc/vdr/plugins + (Closes: #264071) + - Changed package-description of vdr-plugin-examples a little bit + + -- Debian VDR Team Sun, 08 Aug 2004 19:48:33 +0200 + +vdr (1.2.6-4) unstable; urgency=low + + * First release from the VDR and DVB Packaging team + (pkg-vdr-dvb-devel@lists.alioth.debian.org) + + * Thomas Schmidt + - Acknowledge NMU (Closes: #238395) + - Use dpatch, so build-depend on dpatch + - Build-Depend on: dvb-dev | linux-kernel-headers + - Separate plugins from the vdr-package (new packages: + vdr-plugin-examples and vdr-plugin-sky) + - Change architecture of package vdr to all - it does not + contain any architecture-dependent files anymore + - Cleaned up some parts to avoid lintian warnings and errors + - Use makedev for device-generation in postinst, therefore + depend on makedev + - Removed build-dep to g++ + - Added LD_ASSUME_KERNEL=2.4 in runvdr, to be able to run vdr + under 2.6 without problems + - New cfg-dir /var/lib/vdr, link static cfg-files from /etc/vdr to + /var/lib/vdr, install channels.conf in postinst to /var/lib/vdr, + move non-static cfg-files to /var/lib/vdr in postinst + - Add an option to vdr, to specify the cfg-dir at build-time, + and set this to /var/lib/vdr (Closes: Bug#233647) + - Selection of vdr-binary now handled by update-alternatives + - Changed runvdr, to quote plugin-options correct (Closes: Bug#239619) + - Applied patch from Emmanuel le Chevoir (Closes: Bug#238713) + - Updated debconf-translations: + + French (fr.po) by Emmanuel le Chevoir + + Czech (cs.po) by Miroslav Kure + + Dutch (nl.po) by Luk Claes + - Added myself as uploader + - Added correct watch-file + - Added manpage for runvdr + + * Tobias Grimm + - added automatic loading of plugins in init script from c't vdr + (see README.Debian) + - added dynamic generation of reccmds.conf and commands.conf from c't vdr + (see README.Debian) + - added recording hooks as used in c't vdr (see README.Debian) + - added cmd_submenus patch with improvements by Thomas Günther + - added shutdown hooks as used in c't vdr (see README.Debian) + + -- Thomas Schmidt Sat, 24 Apr 2004 12:04:41 +0200 + +vdr (1.2.6-3.1) unstable; urgency=low + + * Non-Maintainer-Upload during Bug-Squashing-Party. + * Applied patch by Lamont Jones to build all shared libraries + with -fPIC. (Closes: #238395) + + -- Michael Banck Sun, 18 Apr 2004 13:49:48 +0200 + +vdr (1.2.6-3) unstable; urgency=low + + * Moved /video to /var/lib/video now we should FHS conform + Thx to Noel Koethe. (Closes: #234429) + * changed control to arch any/all for buildd.d.o + + -- Andreas Mueller Sat, 13 Mar 2004 02:27:00 +0100 + +vdr (1.2.6-2) unstable; urgency=low + + * Thx to Nikolaus Regnat + * Corrected runvdr script dvb module detection. (Closes: #233520) + * Switched to gettext-based debconf templates (Thx to Martin Quinson). (Closes: #233107) + * Improved debconf question texts. + * Fixed vdr.postinst script so that channels.conf is no longer overwritten. + (Closes: #233646) + * Fixed bug in vdr.postinst script which prevented package upgrade. + * Adapted debian/rules to use upstream make plugin/plugin-clean targets. (Closes: #233630) + + -- Andreas Mueller Wed, 18 Feb 2004 17:08:34 +0100 + +vdr (1.2.6-1) unstable; urgency=low + + * Thx to Nikolaus Regnat + * New upstream release. + * Corrected plugin installation. Plugin libs do now reside in + /usr/lib/vdr/plugins. (Closes: #227074) + * Install needed configuration files in /etc/vdr. + * Changed (in /etc/default/vdr) CFG_DIR="/etc/vdr". (Closes: #227084) + * Added debconf info about needed kernel-modules. + * Added debconf question to select dvb card type. + * Added debconf question to create /video filesystem. + * Added debconf question to create dvb device nodes. + * Declared ca.conf, diseqc.conf, keymacros.conf, sources.conf and + svdrphosts.conf as conffiles. + * Added lirc dependency to vdr-lirc. + * Removed loading of hello plugin (in /etc/default/vdr) as it is useless. + * Modified runvdr script to accept lsmod output of module-init-tools (kernel + 2.6). (Closes: #227059) + * Used the --port=0 option (in /etc/default/vdr) to disable SVDRP port. + * Accepted various suggestion on packaging improvement (Closes: #227084) + + -- Andreas Mueller Sat, 10 Jan 2004 15:25:27 +0100 + +vdr (1.2.5-3) unstable; urgency=low + + * moved plugins-dir to /usr/lib/vdr + + -- Andreas Mueller Mon, 21 Sep 2003 19:23:12 +0200 + +vdr (1.2.5-2) unstable; urgency=low + + * vdr_1.2.5-1.dsc: invalid 'Build-Depends' field produced by a broken + version of dpkg-dev (1.10.11). Now build with 1.10.13 + + -- Andreas Mueller Tue, 18 Sep 2003 01:10:47 +0200 + +vdr (1.2.5-1) unstable; urgency=low + + * new upstream build + * Moved to Standards-Version: 3.6.1 + + -- Andreas Mueller Tue, 17 Sep 2003 22:12:38 +0200 + +vdr (1.2.2-1) unstable; urgency=low + + * new upstream build + (closes: Bug#195951) + + -- Andreas Mueller Tue, 9 Sep 2003 11:27:00 +0200 + +vdr (1.0.4-3) unstable; urgency=low + + * some cosmetic things ( ex. autobuilder ) + * added autobuilder support + + -- Andreas Mueller 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 Sat, 4 Jan 2003 16:27:00 +0100 + +vdr (1.0.4-1) unstable; urgency=low + + * New upstream release + + -- Eduard Bloch 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 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 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 Thu, 13 Dec 2001 00:58:01 +0100 + +vdr (0.98-1) unstable; urgency=low + + * New upstream release + * fixed spelling errors + + -- Eduard Bloch 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 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 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 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 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 Sat, 22 Sep 2001 03:16:11 +0200 + --- vdr-1.6.0.orig/debian/valgrind.supp +++ vdr-1.6.0/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.6.0.orig/debian/vdr-plugin-examples.examples +++ vdr-1.6.0/debian/vdr-plugin-examples.examples @@ -0,0 +1 @@ +PLUGINS/src/pictures/pic2mpg --- vdr-1.6.0.orig/debian/.vdr-patches +++ vdr-1.6.0/debian/.vdr-patches @@ -0,0 +1,22 @@ +debian/patches/12_osdbase-maxitems.dpatch:e45d1b62f7d66c3e5d279e3561034107 +debian/patches/11_sortrecordings.dpatch:9ed4cd1e144ee59dab34d4df4aa9af51 +debian/patches/16_channels.conf.terr-fix.dpatch:72595733d0b46aa4093a640708d19226 +debian/patches/06_default_svdrp_port_0.dpatch:b49237a9ee246acfa01ee7ec92ad0a52 +debian/patches/18_vdr-maintenance-1.6.0-2.dpatch:ffe53a24b2c592c18dd08b31d35fd655 +debian/patches/82_valgrind.dpatch:46960921b989f2f4dab829a51622ed85 +debian/patches/opt-42-x_MainMenuHooks.dpatch:1c4c782b5c88c4f0408890a5f50b217b +debian/patches/opt-20_liemikuutio.dpatch:0caa475f4f4c8f176dd0dab18935c5a3 +debian/patches/10_dd-record-option.dpatch:58c3a3dbcd9a3ec4b0ee1814f71d1e88 +debian/patches/09_sort_options.dpatch:3b561fcd7645b216b4dab989d7786fda +debian/patches/opt-24_jumpplay.dpatch:1ff8f1a90e02b11a42218ffba18b5f26 +debian/patches/17_vdr-maintenance-1.6.0-1.dpatch:3a2ff2c6d3b13489c19eda4e32f2537c +debian/patches/03_cmdsubmenu.dpatch:abff754a3d760764796f06cdf1cf5105 +debian/patches/19_dvb-api-v5.dpatch:6714266c10537521d2440cfa4d50b3f0 +debian/patches/81_Make_config.dpatch:dcff6a00ef9474bca19d955d19574009 +debian/patches/opt-51_cuttime.dpatch:cfbf0a7934f109148fef4e385c3eb465 +debian/patches/20_gcc44_ftbfs.dpatch:310f84b8c27541f3ecec0ce416c21a73 +debian/patches/14_cap-memsize.dpatch:7beb9bcecb1bdce4a03c1729acfbbdb3 +debian/patches/opt-27_ttxtsubs.dpatch:c0b18cf05be89d87b0dff02ddeb14f05 +debian/patches/99_ncursesw-include.dpatch:90810d58108ff8d9afd768fec67be904 +debian/patches/04_newplugin.dpatch:e99f8d21734a19b3eb93d9e3f11b680a +debian/patches/15_dvbplayer.dpatch:d1f31f0687c917dea48bc0ba26b7f3bb --- vdr-1.6.0.orig/debian/vdr.install +++ vdr-1.6.0/debian/vdr.install @@ -0,0 +1,44 @@ +vdr-kbd usr/bin/ +debian/scripts/vdr-daemon usr/bin/ +debian/scripts/vdr-lirc usr/bin/ +debian/scripts/vdr-rcu usr/bin/ + +debian/runvdr usr/sbin/ + +debian/config-loader.sh usr/lib/vdr/ +debian/plugin-loader.sh usr/lib/vdr/ +debian/commands-loader.sh usr/lib/vdr/ +debian/vdr-groups.sh usr/lib/vdr/ + +epg2html.pl usr/lib/vdr/ +svdrpsend.pl usr/lib/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/ + +diseqc.conf etc/vdr/ +keymacros.conf etc/vdr/ +sources.conf etc/vdr/ +svdrphosts.conf etc/vdr/ +debian/vdr.groups etc/vdr/ + +debian/vdr-recordingaction usr/lib/vdr/ +debian/R90.custom etc/vdr/recording-hooks/ + +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/lintian/vdr usr/share/lintian/overrides/ + +locale usr/share/ --- vdr-1.6.0.orig/debian/commands-loader.sh +++ vdr-1.6.0/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 ..conf files into one .conf using +# the order defined in order..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.6.0.orig/debian/runvdr +++ vdr-1.6.0/debian/runvdr @@ -0,0 +1,100 @@ +#!/bin/bash -p + +. /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 $*" + +KVERS_2_6=`uname -r | grep -e '2.6'` + +function get_modulenames() +{ + if [ "$KVERS_2_6" ]; then + MODULES=`lsmod | awk '/^dvb_core/ {gsub(/,/,"\n", $4); print $4}' | tac` + [ "$MODULES" ] && MODULES="$MODULES dvb_core" + else + MODULES=`lsmod | grep dvb-core | cut -d'[' -f2 | cut -d']' -f1` + [ "$MODULES" ] && MODULES="$MODULES dvb-core" + fi +} + +# TODO: check if udev handles this on newer systems!? +function 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* +} + +function 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 #2.4 + modprobe dvb_ttpci >/dev/null 2>&1 #2.6 + get_modulenames + fi + if [ "$KVERS_2_6" ]; then + wait `pidof udev` + fi + fi + if [ "$KVERS_2_6" ]; then + sleep 15 + fi +} + +function 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.6.0.orig/debian/vdr.dirs +++ vdr-1.6.0/debian/vdr.dirs @@ -0,0 +1,3 @@ +usr/lib/vdr/plugins +var/cache/vdr +var/lib/vdr/plugins --- vdr-1.6.0.orig/debian/plugin-loader.sh +++ vdr-1.6.0/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.6.0.orig/debian/vdr-plugin-examples.install +++ vdr-1.6.0/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.6.0.orig/debian/vdr.default +++ vdr-1.6.0/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=0 + +# Change this to 1 if you want vdr to be able to shutdown the +# computer +ENABLE_SHUTDOWN=0 + +# Options that will be passed to vdr's commandline +# for example: OPTIONS="-w 15" +OPTIONS="-w 60" --- vdr-1.6.0.orig/debian/vdr.prerm +++ vdr-1.6.0/debian/vdr.prerm @@ -0,0 +1,19 @@ +#! /bin/sh +# prerm script for vdr +# +# see: dh_installdeb(1) + +set -e + +case "$1" in + remove) + update-alternatives --remove vdr /usr/bin/vdr-daemon + update-alternatives --remove vdr /usr/bin/vdr-kbd + update-alternatives --remove vdr /usr/bin/vdr-lirc + update-alternatives --remove vdr /usr/bin/vdr-rcu + ;; +esac + +#DEBHELPER# + +exit 0 --- vdr-1.6.0.orig/debian/vdr-dbg.1.txt +++ vdr-1.6.0/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.6.0.orig/debian/source.lintian-overrides +++ vdr-1.6.0/debian/source.lintian-overrides @@ -0,0 +1 @@ +vdr source: debian-rules-not-a-makefile --- vdr-1.6.0.orig/debian/vdr.groups +++ vdr-1.6.0/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.6.0.orig/debian/extract-patchinfo +++ vdr-1.6.0/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.6.0.orig/debian/commands.update-recordings.conf +++ vdr-1.6.0/debian/commands.update-recordings.conf @@ -0,0 +1 @@ +Aufnahmen-Liste aktualisieren : /usr/bin/touch /var/lib/video/.update --- vdr-1.6.0.orig/debian/config-loader.sh +++ vdr-1.6.0/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.6.0.orig/debian/vdr.postinst +++ vdr-1.6.0/debian/vdr.postinst @@ -0,0 +1,151 @@ +#! /bin/sh +# postinst script for vdr +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `configure' +# * `abort-upgrade' +# * `abort-remove' `in-favour' +# +# * `abort-deconfigure' `in-favour' +# `removing' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package +# +# quoting from the policy: +# Any necessary prompting should almost always be confined to the +# post-installation script, and should be protected with a conditional +# so that unnecessary prompting doesn't happen if a package's +# installation fails and the `postinst' is called with `abort-upgrade', +# `abort-remove' or `abort-deconfigure'. + +# source debconf lib +#. /usr/share/debconf/confmodule + +case "$1" in + configure) + + . /usr/share/debconf/confmodule + + # install/move channels.conf + if [ ! -e /var/lib/vdr/channels.conf ]; then + if [ -e /etc/vdr/channels.conf ]; then + printf "Note: Moving /etc/vdr/channels.conf to /var/lib/vdr/channels.conf\n" + mv /etc/vdr/channels.conf /var/lib/vdr/channels.conf + else + db_get vdr/select_dvb_card + + case "$RET" in + Satellite) + gzip -dc /usr/share/doc/vdr/examples/channels.conf.gz \ + > /var/lib/vdr/channels.conf + chmod 644 /var/lib/vdr/channels.conf + ;; + Terrestrial) + gzip -dc /usr/share/doc/vdr/examples/channels.conf.terr.gz \ + > /var/lib/vdr/channels.conf + chmod 644 /var/lib/vdr/channels.conf + ;; + Cable) + gzip -dc /usr/share/doc/vdr/examples/channels.conf.cable.gz \ + > /var/lib/vdr/channels.conf + chmod 644 /var/lib/vdr/channels.conf + ;; + esac + fi + fi + + db_get vdr/create_video_dir + if $RET; then + # check if an old directory /var/lib/video exists, and + # symlink it to /var/lib/video.00 + if [ -d /var/lib/video ] && [ ! -e /var/lib/video.00 ]; then + ln -s video /var/lib/video.00 + fi + + # create /var/lib/video.00 if it does not exist + if [ ! -e /var/lib/video.00 ]; then + mkdir /var/lib/video.00 + fi + + # check if /var/lib/video.00 exists and /var/lib/video is + # missing, then create the symlink /var/lib/video which + # points to /var/lib/video.00 + if [ ! -e /var/lib/video ] && [ -e /var/lib/video.00 ]; then + ln -s video.00 /var/lib/video + fi + 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/ + if [ -e /var/lib/vdr ] ; then + chown $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 6750 /usr/lib/vdr/vdr-shutdown.wrapper + fi + + # Install alternatives for the different control methods + update-alternatives --install /usr/bin/vdr vdr /usr/bin/vdr-lirc 120 + update-alternatives --install /usr/bin/vdr vdr /usr/bin/vdr-kbd 110 + update-alternatives --install /usr/bin/vdr vdr /usr/bin/vdr-rcu 105 + update-alternatives --install /usr/bin/vdr vdr /usr/bin/vdr-daemon 100 + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +db_stop + + +# FIXME +# wait for vdr to properly shutdown before it is restarted again +sleep 5 + + +#DEBHELPER# + +exit 0 --- vdr-1.6.0.orig/debian/vdr-plugin-sky.install +++ vdr-1.6.0/debian/vdr-plugin-sky.install @@ -0,0 +1 @@ +PLUGINS/lib/libvdr-sky.so.* usr/lib/vdr/plugins/ --- vdr-1.6.0.orig/debian/vdr.manpages +++ vdr-1.6.0/debian/vdr.manpages @@ -0,0 +1,5 @@ +vdr.1 +vdr.5 + +debian/runvdr.8 +debian/svdrpsend.1 --- vdr-1.6.0.orig/debian/runvdr.8 +++ vdr-1.6.0/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.6.0.orig/debian/vdr-shutdown-wrapper.c +++ vdr-1.6.0/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.6.0.orig/debian/vdr.examples +++ vdr-1.6.0/debian/vdr.examples @@ -0,0 +1,2 @@ +*.conf +channels.conf.* --- vdr-1.6.0.orig/debian/copyright +++ vdr-1.6.0/debian/copyright @@ -0,0 +1,59 @@ +Upstream Homepage: + http://www.cadsoft.de/vdr/ + +Upstream Author: + Klaus Schmidinger and others + +Patch Authors: + ttxtsubs - Ragnar Sundblad + http://www.nada.kth.se/~ragge/vdr/ttxtsubs/ + + jumpplay - Torsten Kunkel (initial version) + Thomas Günther (current version) + +Theme Authors: + Blue LCARS - (debian/themes/sttng-blue.theme) from Sascha Volkenandt + 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 + Thomas Günther + Thomas Schmidt + +Copyright: + (C) 2000 - 2008 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.6.0.orig/debian/compat +++ vdr-1.6.0/debian/compat @@ -0,0 +1 @@ +5 --- vdr-1.6.0.orig/debian/svdrpsend.1 +++ vdr-1.6.0/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 +.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.6.0.orig/debian/abi-version +++ vdr-1.6.0/debian/abi-version @@ -0,0 +1 @@ +vdr-abi-1.6.0-debian --- vdr-1.6.0.orig/debian/make-special-vdr.sh +++ vdr-1.6.0/debian/make-special-vdr.sh @@ -0,0 +1,902 @@ +# +# make-special-vdr.sh by Thomas Günther +# +# Description: +# +# Make a special variation of the vdr package or of a vdr plugin package. +# These debian packages could be installed parallel to the standard vdr debian +# packages in order to test new development versions of vdr. Between the +# standard and the special variation of vdr can be switched via command menu. +# +# Standard and special packages uses the same recordings directory. Therefore, +# user and group are 'vdr' for the special packages too. The suffix of recording +# files remains also '.vdr'. +# +# Necessary adaptions in the debian source packages: +# +# The special packages are built from the same source packages as the standard +# packages. The make-special-vdr.sh script is called from "debian/rules" instead +# of the normal make. In the first line of "debian/rules" "#! /usr/bin/make -f" +# has to be replaced with "#! /bin/sh debian/make-special-vdr.sh" for the vdr +# package respectively with "#! /bin/sh /usr/share/vdr-dev/make-special-vdr.sh" +# for a vdr plugin package. +# +# Usage: +# +# The name of the special package is specified by the environment variable +# SPECIAL_VDR_SUFFIX. E.g., the vdrdevel variation is built with +# SPECIAL_VDR_SUFFIX=devel fakeroot dpkg-buildpackage -us -uc -tc +# +# The plugin packages don't include make-special-vdr.sh themselves. Instead they +# use /usr/share/vdr-dev/make-special-vdr.sh installed by the vdr-dev package. +# +# If the installed make-special-vdr.sh version of vdr-dev is to old to build the +# special variation of a particular vdr plugin package, a newer version of +# make-special-vdr.sh can be specified by the environment variable +# MAKE_SPECIAL_VDR, e.g. +# export MAKE_SPECIAL_VDR=/usr/share/vdrdevel-dev/make-special-vdr.sh +# SPECIAL_VDR_SUFFIX=devel fakeroot dpkg-buildpackage -us -uc -tc +# +# In order to build the standard vdr packages the environment variable +# SPECIAL_VDR_SUFFIX has to be empty or not set. +# +# Implementation details: +# +# If SPECIAL_VDR_SUFFIX is set and not empty make-special-vdr.sh does following +# steps: +# 1. Create the subdirectory ".save". +# 2. Copy all files and directories into ".save". +# 3. Substitute "vdr" in the contents of all files (recursively) except for +# "debian/changelog", "debian/make-special-vdr.sh", all files in +# "debian/plugin-template", and all files in ".save". +# 4. Substitute "vdr" in the names of all files (recursively) except for all +# files in ".save". +# 5. Make special changes for certain packages. +# 6. Call the normal make. +# Points 1-5 are performed only if the subdirectory ".save" not exist. +# If "debian/rules" is called with the argument "clean" all original files and +# directories are restored form ".save" and the subdirectory ".save" is removed. +# +# History: +# +# 2004-06-12 - 2005-09-29: Version 0.0.0 - 0.1.4 (vdrdevel patch) +# +# 2007-01-13: Version 0.2 +# - Converted vdrdevel patch to make-special-vdr.sh +# +# 2007-01-24: Version 0.3 +# - Fixed detection of *.vdr files in burn plugin +# +# 2007-02-11: Version 0.4 +# - Updated prepare_vompserver for new vompserver release 0.2.6 +# - Fixed prepare_vdrc +# - Exit immediately on errors +# +# 2007-02-27: Version 0.5 +# - Updated prepare_graphtft for new graphtft release 0.0.16 +# +# 2007-06-27: Version 0.6 +# - Fixed prepare_xineliboutput +# - Added prepare_burn to use backgrounds from standard packages +# - Fixed substitions for debianize-vdrplugin in prepare_vdr +# - Fixed detection of *.vdr files in vompserver plugin +# +# 2008-02-10: Version 0.7 +# - Updated prepare_text2skin to use skin locales from standard packages +# - Added substition for vdr-skins suggestion in prepare_text2skin +# - Exclude documentation files (README etc.) from substitions +# - Preserve mode, ownership and timestamps +# +# 2008-03-24: Version 0.8 +# - Updated prepare_sudoku and prepare_wapd for cdbs build system +# - Added prepare_osdteletext (no substitution in README) +# - Updated substitution for the plugin debianizer script in prepare_vdr +# +# 2008-04-16: Version 0.9 +# - Updated prepare_softdevice for cdbs build system +# - Use version of vdr-dev instead of vdrdevel-dev in the plugin +# debianizer script + + +main() +{ + set -e + echo "$0" "$@" \ + "SPECIAL_VDR_SUFFIX='${SPECIAL_VDR_SUFFIX}'" \ + "MAKE_SPECIAL_VDR='${MAKE_SPECIAL_VDR}'" \ + "NO_CHECKBUILDDEPS='${NO_CHECKBUILDDEPS}'" + if [ -z "${SPECIAL_VDR_SUFFIX}" ]; then + # Original make if SPECIAL_VDR_SUFFIX is not set + /usr/bin/make -f "$@" + elif [ "${MAKE_SPECIAL_VDR}" ]; then + # Call newer version of make-special-vdr.sh provided by MAKE_SPECIAL_VDR + MAKE_SPECIAL_VDR= /bin/sh "${MAKE_SPECIAL_VDR}" "$@" + elif ! check_clean_arg "$@"; then + # Make special variation: prepare the package before make + prepare + /usr/bin/make -f "$@" + else + # Clean prepared package + cleanup + fi +} + +SAVE_DIR=".save" + +prepare() +{ + if [ ! -e "${SAVE_DIR}" ]; then + echo "prepare: save all in subdirectory ${SAVE_DIR}" + /bin/mkdir "${SAVE_DIR}" + /bin/chmod -R +w . + /bin/cp -af $(/usr/bin/find ./ -mindepth 1 -maxdepth 1 \ + -not -name "${SAVE_DIR}") "${SAVE_DIR}" + + # Create tempfile + TMP_FILE=$(/bin/mktemp) + + # Execute substitutions + prepare_common + if check_package "vdr${SPECIAL_VDR_SUFFIX}"; then + prepare_vdr + fi + if check_package "vdr${SPECIAL_VDR_SUFFIX}-plugin-analogtv"; then + prepare_analogtv + fi + if check_package "vdr${SPECIAL_VDR_SUFFIX}-plugin-burn"; then + prepare_burn + fi + if check_package "vdr${SPECIAL_VDR_SUFFIX}-plugin-graphtft"; then + prepare_graphtft + fi + if check_package "vdr${SPECIAL_VDR_SUFFIX}-plugin-mediamvp"; then + prepare_mediamvp + fi + if check_package "vdr${SPECIAL_VDR_SUFFIX}-plugin-osdteletext"; then + prepare_osdteletext + fi + if check_package "vdr${SPECIAL_VDR_SUFFIX}-plugin-pin"; then + prepare_pin + fi + if check_package "vdr${SPECIAL_VDR_SUFFIX}-plugin-rssreader"; then + prepare_rssreader + fi + if check_package "vdr${SPECIAL_VDR_SUFFIX}-plugin-softdevice"; then + prepare_softdevice + fi + if check_package "vdr${SPECIAL_VDR_SUFFIX}-plugin-sudoku"; then + prepare_sudoku + fi + if check_package "vdr${SPECIAL_VDR_SUFFIX}-plugin-text2skin"; then + prepare_text2skin + fi + if check_package "vdr${SPECIAL_VDR_SUFFIX}-plugin-vdr${SPECIAL_VDR_SUFFIX}c"; then + prepare_vdrc + fi + if check_package "vdr${SPECIAL_VDR_SUFFIX}-plugin-vdr${SPECIAL_VDR_SUFFIX}cd"; then + prepare_vdrcd + fi + if check_package "vdr${SPECIAL_VDR_SUFFIX}-plugin-vdr${SPECIAL_VDR_SUFFIX}rip"; then + prepare_vdrrip + fi + if check_package "vdr${SPECIAL_VDR_SUFFIX}-plugin-vompserver"; then + prepare_vompserver + fi + if check_package "vdr${SPECIAL_VDR_SUFFIX}-plugin-wapd"; then + prepare_wapd + fi + if check_package "vdr${SPECIAL_VDR_SUFFIX}-plugin-xine"; then + prepare_xine + fi + if check_package "vdr${SPECIAL_VDR_SUFFIX}-plugin-xineliboutput"; then + prepare_xineliboutput + fi + + # Check build dependencies after substitutions + if [ -z "${NO_CHECKBUILDDEPS}" ]; then + if ! /usr/bin/dpkg-checkbuilddeps; then + echo >&2 "Build dependencies/conflicts unsatisfied; aborting." + echo >&2 "(Set NO_CHECKBUILDDEPS environment variable to override.)" + exit 3 + fi + fi + + # Remove tempfile + /bin/rm -f "${TMP_FILE}" + fi +} + +prepare_common() +{ + echo "prepare_common: substitute vdr -> vdr${SPECIAL_VDR_SUFFIX}" + SUBST="s.vdr.vdr${SPECIAL_VDR_SUFFIX}.g; \ + s.make-special-vdr${SPECIAL_VDR_SUFFIX}.make-special-vdr.g; \ + s./bin/sh /usr/share/vdr${SPECIAL_VDR_SUFFIX}-dev/make-special-vdr./bin/sh /usr/share/vdr-dev/make-special-vdr.g; \ + s.Source: vdr${SPECIAL_VDR_SUFFIX}.Source: vdr.g; \ + s.Source: vdr-plugin-vdr${SPECIAL_VDR_SUFFIX}c.Source: vdr-plugin-vdrc.g; \ + s.Source: vdr-plugin-vdr${SPECIAL_VDR_SUFFIX}rip.Source: vdr-plugin-vdrrip.g; \ + s.Source: vdr-plugin-svdr${SPECIAL_VDR_SUFFIX}p.Source: vdr-plugin-svdrp.g; \ + s.pkg-vdr${SPECIAL_VDR_SUFFIX}-dvb-devel.pkg-vdr-dvb-devel.g; \ + s.vdr${SPECIAL_VDR_SUFFIX}admin.vdradmin.g; \ + s.vdr${SPECIAL_VDR_SUFFIX}-xxv.vdr-xxv.g; \ + s.vdr${SPECIAL_VDR_SUFFIX}sync.vdrsync.g; \ + s.vdr${SPECIAL_VDR_SUFFIX}-xpmlogos.vdr-xpmlogos.g; \ + s.vdr${SPECIAL_VDR_SUFFIX}-genindex.vdr-genindex.g; \ + s.USER=vdr${SPECIAL_VDR_SUFFIX}.USER=vdr.g; \ + s.GROUP=vdr${SPECIAL_VDR_SUFFIX}.GROUP=vdr.g; \ + s.chown vdr${SPECIAL_VDR_SUFFIX}:vdr${SPECIAL_VDR_SUFFIX}.chown vdr:vdr.g; \ + s.chown -R vdr${SPECIAL_VDR_SUFFIX}:vdr${SPECIAL_VDR_SUFFIX}.chown -R vdr:vdr.g; \ + s/resume%s%s\.vdr${SPECIAL_VDR_SUFFIX}/resume%s%s.vdr/g; \ + s/summary\.vdr${SPECIAL_VDR_SUFFIX}/summary.vdr/g; \ + s/info\.vdr${SPECIAL_VDR_SUFFIX}/info.vdr/g; \ + s/marks\.vdr${SPECIAL_VDR_SUFFIX}/marks.vdr/g; \ + s/index\.vdr${SPECIAL_VDR_SUFFIX}/index.vdr/g; \ + s/%03d\.vdr${SPECIAL_VDR_SUFFIX}/%03d.vdr/g; \ + s/%03i\.vdr${SPECIAL_VDR_SUFFIX}/%03i.vdr/g; \ + s/dvd\.vdr${SPECIAL_VDR_SUFFIX}/dvd.vdr/g; \ + s/001\.vdr${SPECIAL_VDR_SUFFIX}/001.vdr/g; \ + s/002\.vdr${SPECIAL_VDR_SUFFIX}/002.vdr/g; \ + s/index_%02d\.vdr${SPECIAL_VDR_SUFFIX}/index_%02d.vdr/g; \ + s/\[0-9\]\.vdr${SPECIAL_VDR_SUFFIX}/[0-9].vdr/g; \ + s/\"\.vdr${SPECIAL_VDR_SUFFIX}\"/\".vdr\"/g; \ + s/}\.vdr${SPECIAL_VDR_SUFFIX}/}.vdr/g; \ + s/index_archive\.vdr${SPECIAL_VDR_SUFFIX}/index_archive.vdr/g; \ + s/{TRACK_ON_DVD}\.vdr${SPECIAL_VDR_SUFFIX}/{TRACK_ON_DVD}.vdr/g; \ + s/size_cut\.vdr${SPECIAL_VDR_SUFFIX}/size_cut.vdr/g; \ + s/size\.vdr${SPECIAL_VDR_SUFFIX}/size.vdr/g; \ + s/strcasecmp(pos, \".vdr${SPECIAL_VDR_SUFFIX}\")/strcasecmp(pos, \".vdr\")/g; \ + s/input_vdr${SPECIAL_VDR_SUFFIX}\.h/input_vdr.h/g; \ + s/dvdr${SPECIAL_VDR_SUFFIX}ecord/dvdrecord/g; \ + s/dvdr${SPECIAL_VDR_SUFFIX}ead/dvdread/g" + FILES=$(/usr/bin/find ./ -type f -not -regex "./${SAVE_DIR}/.*" \ + -not -regex "./debian/changelog" \ + -not -regex "./debian/copyright" \ + -not -regex "./debian/make-special-vdr.sh" \ + -not -regex "./debian/plugin-template/.*" \ + -not -regex "./README.*" \ + -not -regex "./LIESMICH.*" \ + -not -regex "./AUTHORS.*" \ + -not -regex "./CONTRIBUTORS.*" \ + -not -regex "./FAQ.*" \ + -not -regex "./MANUAL.*" \ + -not -regex "./TODO.*" \ + -not -regex "./TROUBLESHOOTING.*") + set -f; OLD_IFS="${IFS}"; IFS=" +"; set -- ${FILES}; IFS="${OLD_IFS}"; set +f + subst_in_files "${SUBST}" "$@" + rename_files "${SUBST}" "$@" +} + +prepare_vdr() +{ + echo "prepare_vdr: prevent conflict to standard vdr" + if /bin/grep -q "var/lib/video" "debian/vdr${SPECIAL_VDR_SUFFIX}.links"; then + /bin/sed -e "s/\${SPECIAL_VDR_SUFFIX}/${SPECIAL_VDR_SUFFIX}/g" <<'EOF' | /usr/bin/patch -p0 -F0 +--- debian/vdr${SPECIAL_VDR_SUFFIX}.links ++++ debian/vdr${SPECIAL_VDR_SUFFIX}.links +@@ -15 +14,0 @@ +-var/lib/video.00 var/lib/video +--- debian/vdr${SPECIAL_VDR_SUFFIX}.postinst ++++ debian/vdr${SPECIAL_VDR_SUFFIX}.postinst +@@ -1,1 +1,6 @@ +-#!/bin/sh ++#!/bin/sh ++if [ "$1" = "configure" ]; then ++ if [ ! -e /var/lib/video ] ; then ++ /bin/ln -s /var/lib/video.00 /var/lib/video ++ fi ++fi +EOF + fi + + echo "prepare_vdr: add debconf question which vdr variation should start automatically" + if [ ! -e "debian/vdr${SPECIAL_VDR_SUFFIX}.config" ]; then + /bin/sed -e "s/\${SPECIAL_VDR_SUFFIX}/${SPECIAL_VDR_SUFFIX}/g" <<'EOF' | /usr/bin/patch -p0 -F0 +--- debian/rules ++++ debian/rules +@@ -130 +130 @@ +- dh_installinit -a ++ dh_installinit -a --noscripts +--- debian/vdr${SPECIAL_VDR_SUFFIX}.config 1970-01-01 00:00:00.000000000 +0000 ++++ debian/vdr${SPECIAL_VDR_SUFFIX}.config +@@ -0,0 +1,6 @@ ++#! /bin/sh ++set -e ++. /usr/share/debconf/confmodule ++db_version 2.0 ++db_input high vdr${SPECIAL_VDR_SUFFIX}/autostart || true ++db_go || true +--- debian/vdr${SPECIAL_VDR_SUFFIX}.postinst ++++ debian/vdr${SPECIAL_VDR_SUFFIX}.postinst +@@ -1,1 +1,21 @@ +-#!/bin/sh ++#!/bin/sh ++. /usr/share/debconf/confmodule ++if [ "$1" = "configure" ]; then ++ db_get vdr${SPECIAL_VDR_SUFFIX}/autostart ++ if [ "$RET" = "true" ]; then ++ START="vdr${SPECIAL_VDR_SUFFIX}" ++ STOP="vdr" ++ else ++ START="vdr" ++ STOP="vdr${SPECIAL_VDR_SUFFIX}" ++ fi ++ if [ -x "/etc/init.d/$STOP" ]; then ++ /etc/init.d/$STOP stop ++ update-rc.d -f $STOP remove >/dev/null ++ fi ++ if [ -x "/etc/init.d/$START" ]; then ++ /etc/init.d/$START stop ++ update-rc.d $START defaults >/dev/null ++ /etc/init.d/$START start ++ fi ++fi +--- debian/vdr${SPECIAL_VDR_SUFFIX}.prerm 1970-01-01 00:00:00.000000000 +0000 ++++ debian/vdr${SPECIAL_VDR_SUFFIX}.prerm +@@ -0,0 +1,16 @@ ++#! /bin/sh ++set -e ++if [ -x "/etc/init.d/vdr${SPECIAL_VDR_SUFFIX}" ]; then ++ /etc/init.d/vdr${SPECIAL_VDR_SUFFIX} stop ++fi ++if [ "$1" = "remove" ] ; then ++ if [ -x "/etc/init.d/vdr${SPECIAL_VDR_SUFFIX}" ]; then ++ update-rc.d -f vdr${SPECIAL_VDR_SUFFIX} remove >/dev/null ++ fi ++ if [ -x "/etc/init.d/vdr" ]; then ++ /etc/init.d/vdr stop ++ update-rc.d vdr defaults >/dev/null ++ /etc/init.d/vdr start ++ fi ++fi ++#DEBHELPER# +--- debian/vdr${SPECIAL_VDR_SUFFIX}.templates 1970-01-01 00:00:00.000000000 +0000 ++++ debian/vdr${SPECIAL_VDR_SUFFIX}.templates +@@ -0,0 +1,7 @@ ++Template: vdr${SPECIAL_VDR_SUFFIX}/autostart ++Type: boolean ++Default: false ++Description: Start vdr${SPECIAL_VDR_SUFFIX} automatically instead of vdr? ++ On system startup either vdr${SPECIAL_VDR_SUFFIX} or vdr will be started in daemon mode. ++ By selecting this, you choose vdr${SPECIAL_VDR_SUFFIX} instead of vdr. ++ But you can manually switch between vdr${SPECIAL_VDR_SUFFIX} and vdr by menu commands. +EOF + else + /bin/sed -e "s/\${SPECIAL_VDR_SUFFIX}/${SPECIAL_VDR_SUFFIX}/g" <<'EOF' | /usr/bin/patch -p0 -F0 +--- debian/rules ++++ debian/rules +@@ -123 +123 @@ +- dh_installinit -a ++ dh_installinit -a --noscripts +--- debian/vdr${SPECIAL_VDR_SUFFIX}.config ++++ debian/vdr${SPECIAL_VDR_SUFFIX}.config +@@ -24,1 +24,3 @@ +-exit 0 ++db_input high vdr${SPECIAL_VDR_SUFFIX}/autostart || true ++db_go || true ++exit 0 +--- debian/vdr${SPECIAL_VDR_SUFFIX}.postinst ++++ debian/vdr${SPECIAL_VDR_SUFFIX}.postinst +@@ -1,1 +1,21 @@ +-#! /bin/sh ++#! /bin/sh ++. /usr/share/debconf/confmodule ++if [ "$1" = "configure" ]; then ++ db_get vdr${SPECIAL_VDR_SUFFIX}/autostart ++ if [ "$RET" = "true" ]; then ++ START="vdr${SPECIAL_VDR_SUFFIX}" ++ STOP="vdr" ++ else ++ START="vdr" ++ STOP="vdr${SPECIAL_VDR_SUFFIX}" ++ fi ++ if [ -x "/etc/init.d/$STOP" ]; then ++ /etc/init.d/$STOP stop ++ update-rc.d -f $STOP remove >/dev/null ++ fi ++ if [ -x "/etc/init.d/$START" ]; then ++ /etc/init.d/$START stop ++ update-rc.d $START defaults >/dev/null ++ /etc/init.d/$START start ++ fi ++fi +--- debian/vdr${SPECIAL_VDR_SUFFIX}.prerm ++++ debian/vdr${SPECIAL_VDR_SUFFIX}.prerm +@@ -1,1 +1,15 @@ +-#! /bin/sh ++#! /bin/sh ++set -e ++if [ -x "/etc/init.d/vdr${SPECIAL_VDR_SUFFIX}" ]; then ++ /etc/init.d/vdr${SPECIAL_VDR_SUFFIX} stop ++fi ++if [ "$1" = "remove" ] ; then ++ if [ -x "/etc/init.d/vdr${SPECIAL_VDR_SUFFIX}" ]; then ++ update-rc.d -f vdr${SPECIAL_VDR_SUFFIX} remove >/dev/null ++ fi ++ if [ -x "/etc/init.d/vdr" ]; then ++ /etc/init.d/vdr stop ++ update-rc.d vdr defaults >/dev/null ++ /etc/init.d/vdr start ++ fi ++fi +--- debian/vdr${SPECIAL_VDR_SUFFIX}.templates ++++ debian/vdr${SPECIAL_VDR_SUFFIX}.templates +@@ -0,0 +1,8 @@ ++Template: vdr${SPECIAL_VDR_SUFFIX}/autostart ++Type: boolean ++Default: false ++Description: Start vdr${SPECIAL_VDR_SUFFIX} automatically instead of vdr? ++ On system startup either vdr${SPECIAL_VDR_SUFFIX} or vdr will be started in daemon mode. ++ By selecting this, you choose vdr${SPECIAL_VDR_SUFFIX} instead of vdr. ++ But you can manually switch between vdr${SPECIAL_VDR_SUFFIX} and vdr by menu commands. ++ +EOF + fi + + # Add commands to switch between the vdr variations + /bin/sed -e "s/\${SPECIAL_VDR_SUFFIX}/${SPECIAL_VDR_SUFFIX}/g" <<'EOF' | /usr/bin/patch -p0 -F0 +--- debian/commands.switch-vdr.conf 1970-01-01 00:00:00.000000000 +0000 ++++ debian/commands.switch-vdr.conf +@@ -0,0 +1 @@ ++VDR-Standardversion starten : nohup sh -c "( /usr/lib/vdr${SPECIAL_VDR_SUFFIX}/ctvdr${SPECIAL_VDR_SUFFIX}wrapper --stop && /bin/sleep 5 && /usr/lib/vdr/ctvdrwrapper --restart )" >/dev/null 2>&1 & +--- debian/commands.switch-vdr${SPECIAL_VDR_SUFFIX}.conf 1970-01-01 00:00:00.000000000 +0000 ++++ debian/commands.switch-vdr${SPECIAL_VDR_SUFFIX}.conf +@@ -0,0 +1 @@ ++VDR-Entwicklerversion vdr${SPECIAL_VDR_SUFFIX} starten : nohup sh -c "( /usr/lib/vdr/ctvdrwrapper --stop && /bin/sleep 5 && /usr/lib/vdr${SPECIAL_VDR_SUFFIX}/ctvdr${SPECIAL_VDR_SUFFIX}wrapper --restart )" >/dev/null 2>&1 & +--- debian/vdr${SPECIAL_VDR_SUFFIX}.install ++++ debian/vdr${SPECIAL_VDR_SUFFIX}.install +@@ -0,0 +1,2 @@ ++debian/commands.switch-vdr.conf usr/share/vdr${SPECIAL_VDR_SUFFIX}/command-hooks/ ++debian/commands.switch-vdr${SPECIAL_VDR_SUFFIX}.conf usr/share/vdr/command-hooks/ +EOF + + echo "prepare_vdr: set links to use logos and addons from standard packages" + /bin/sed -e "s/\${SPECIAL_VDR_SUFFIX}/${SPECIAL_VDR_SUFFIX}/g" <<'EOF' | /usr/bin/patch -p0 -F0 +--- debian/commands-loader.sh ++++ debian/commands-loader.sh +@@ -33 +33 @@ +- cmds=( `find $CMDHOOKSDIR -maxdepth 1 -name "$cmdtype.*.conf" -printf "%f \n" | sed "s/$cmdtype\.\(.\+\)\.conf/\1/g"` ) ++ cmds=( `find $CMDHOOKSDIR -maxdepth 1 -name "$cmdtype.*.conf" -xtype f -printf "%f \n" | sed "s/$cmdtype\.\(.\+\)\.conf/\1/g"` ) +--- debian/vdr${SPECIAL_VDR_SUFFIX}.links ++++ debian/vdr${SPECIAL_VDR_SUFFIX}.links +@@ -0,0 +1,21 @@ ++var/lib/vdr/logos var/lib/vdr${SPECIAL_VDR_SUFFIX}/logos ++usr/share/vdr/shutdown-hooks/S90.acpiwakeup usr/share/vdr${SPECIAL_VDR_SUFFIX}/shutdown-hooks/S90.acpiwakeup ++usr/share/vdr/command-hooks/reccmds.noad.conf usr/share/vdr${SPECIAL_VDR_SUFFIX}/command-hooks/reccmds.noad.conf ++usr/share/vdr/recording-hooks/R10.noad usr/share/vdr${SPECIAL_VDR_SUFFIX}/recording-hooks/R10.noad ++usr/share/vdr/shutdown-hooks/S50.noad usr/share/vdr${SPECIAL_VDR_SUFFIX}/shutdown-hooks/S50.noad ++usr/share/vdr/shutdown-hooks/S90.nvram-wakeup usr/share/vdr${SPECIAL_VDR_SUFFIX}/shutdown-hooks/S90.nvram-wakeup ++usr/share/vdr/recording-hooks/R10.sharemarks usr/share/vdr${SPECIAL_VDR_SUFFIX}/recording-hooks/R10.sharemarks ++usr/share/vdr/command-hooks/reccmds.sharemarks.conf usr/share/vdr${SPECIAL_VDR_SUFFIX}/command-hooks/reccmds.sharemarks.conf ++usr/share/vdr/command-hooks/reccmds.tosvcd.conf usr/share/vdr${SPECIAL_VDR_SUFFIX}/command-hooks/reccmds.tosvcd.conf ++usr/share/vdr/shutdown-hooks/S50.tosvcd usr/share/vdr${SPECIAL_VDR_SUFFIX}/shutdown-hooks/S50.tosvcd ++usr/share/vdr/command-hooks/commands.tvinfomerk2vdr.conf usr/share/vdr${SPECIAL_VDR_SUFFIX}/command-hooks/commands.tvinfomerk2vdr.conf ++usr/share/vdr/command-hooks/commands.tvmovie2vdr.conf usr/share/vdr${SPECIAL_VDR_SUFFIX}/command-hooks/commands.tvmovie2vdr.conf ++usr/share/vdr/command-hooks/commands.vdrconvert.conf usr/share/vdr${SPECIAL_VDR_SUFFIX}/command-hooks/commands.vdrconvert.conf ++usr/share/vdr/command-hooks/reccmds.vdrconvert-divx.conf usr/share/vdr${SPECIAL_VDR_SUFFIX}/command-hooks/reccmds.vdrconvert-divx.conf ++usr/share/vdr/command-hooks/reccmds.vdrconvert-svcd.conf usr/share/vdr${SPECIAL_VDR_SUFFIX}/command-hooks/reccmds.vdrconvert-svcd.conf ++usr/share/vdr/command-hooks/reccmds.vdrconvert-vcd.conf usr/share/vdr${SPECIAL_VDR_SUFFIX}/command-hooks/reccmds.vdrconvert-vcd.conf ++usr/share/vdr/command-hooks/reccmds.vdrconvert-mpeg.conf usr/share/vdr${SPECIAL_VDR_SUFFIX}/command-hooks/reccmds.vdrconvert-mpeg.conf ++usr/share/vdr/command-hooks/reccmds.vdrconvert-mp3.conf usr/share/vdr${SPECIAL_VDR_SUFFIX}/command-hooks/reccmds.vdrconvert-mp3.conf ++usr/share/vdr/command-hooks/reccmds.vdrconvert-ac3.conf usr/share/vdr${SPECIAL_VDR_SUFFIX}/command-hooks/reccmds.vdrconvert-ac3.conf ++usr/share/vdr/command-hooks/reccmds.vdrconvert-dvd.conf usr/share/vdr${SPECIAL_VDR_SUFFIX}/command-hooks/reccmds.vdrconvert-dvd.conf ++usr/share/vdr/shutdown-hooks/S50.vdrconvert usr/share/vdr${SPECIAL_VDR_SUFFIX}/shutdown-hooks/S50.vdrconvert +EOF + + echo "prepare_vdr: add hint to the plugin debianizer script" + /bin/sed -e "s/\${SPECIAL_VDR_SUFFIX}/${SPECIAL_VDR_SUFFIX}/g" <<'EOF' >> "debian/debianize-vdr${SPECIAL_VDR_SUFFIX}plugin" +echo +echo "To build vdr${SPECIAL_VDR_SUFFIX} plugin packages use the environment variable" +echo "SPECIAL_VDR_SUFFIX, e.g.:" +echo " SPECIAL_VDR_SUFFIX=${SPECIAL_VDR_SUFFIX} fakeroot dpkg-buildpackage -us -uc -tc" +echo "See /usr/share/vdr-dev/make-special-vdr.sh for details." +EOF + /bin/sed -e "s/\${SPECIAL_VDR_SUFFIX}/${SPECIAL_VDR_SUFFIX}/g" <<'EOF' | /usr/bin/patch -p0 -F0 +--- debian/debianize-vdr${SPECIAL_VDR_SUFFIX}plugin ++++ debian/debianize-vdr${SPECIAL_VDR_SUFFIX}plugin +@@ -15 +15 @@ +- echo "The upsteam tarball should be named: vdr${SPECIAL_VDR_SUFFIX}--.tar.gz" ++ echo "The upsteam tarball should be named: vdr--.tar.gz" +@@ -17 +17 @@ +- echo "e.g.: vdr${SPECIAL_VDR_SUFFIX}-coolplugin-0.0.1.tar.gz" ++ echo "e.g.: vdr-coolplugin-0.0.1.tar.gz" +@@ -27 +27 @@ +- ORIGTARBALL="../vdr${SPECIAL_VDR_SUFFIX}-plugin-$PLUGIN"_"$VERSION.orig.tar.gz" ++ ORIGTARBALL="../vdr-plugin-$PLUGIN"_"$VERSION.orig.tar.gz" +@@ -54 +54 @@ +- VDRVERSION=`dpkg -s vdr${SPECIAL_VDR_SUFFIX}-dev | awk '/Version/ { print $2 }'` ++ VDRVERSION=`dpkg -s vdr-dev | awk '/Version/ { print $2 }'` +@@ -72 +72 @@ +-dh_make="/usr/bin/dh_make -t /usr/share/vdr${SPECIAL_VDR_SUFFIX}-dev/plugin-template -b -p vdr${SPECIAL_VDR_SUFFIX}-plugin-$PLUGIN" ++dh_make="/usr/bin/dh_make -t /usr/share/vdr${SPECIAL_VDR_SUFFIX}-dev/plugin-template -b -p vdr-plugin-$PLUGIN" +EOF +} + +prepare_analogtv() +{ + echo "prepare_analogtv: rename mp1e -> mp1e_vdr${SPECIAL_VDR_SUFFIX}" + /bin/sed -e "s/\${SPECIAL_VDR_SUFFIX}/${SPECIAL_VDR_SUFFIX}/g" <<'EOF' | /usr/bin/patch -p0 -F0 +--- player-analogtv.c ++++ player-analogtv.c +@@ -569 +569 @@ +- sprintf(cmd, "mp1e -m %d %s%s%s%s -t %d -g %s -p %s -c %s -x %s -d %d -a %d -b %d -B %d%s -r %d,%d -s %s -S %2.1f -F %d%s%s%s%s -o %s &", ++ sprintf(cmd, "mp1e_vdr${SPECIAL_VDR_SUFFIX} -m %d %s%s%s%s -t %d -g %s -p %s -c %s -x %s -d %d -a %d -b %d -B %d%s -r %d,%d -s %s -S %2.1f -F %d%s%s%s%s -o %s &", +--- debian/rules ++++ debian/rules +@@ -73,1 +73,3 @@ +- dh_install ++ dh_install ++ cd debian/vdr${SPECIAL_VDR_SUFFIX}-plugin-analogtv/usr/bin; mv mp1e mp1e_vdr${SPECIAL_VDR_SUFFIX} ++ cd debian/vdr${SPECIAL_VDR_SUFFIX}-plugin-analogtv/usr/share/man/man1; mv mp1e.1 mp1e_vdr${SPECIAL_VDR_SUFFIX}.1 +EOF +} + +prepare_burn() +{ + echo "prepare_burn: use backgrounds from standard packages" + /bin/sed -e "s/\${SPECIAL_VDR_SUFFIX}/${SPECIAL_VDR_SUFFIX}/g" <<'EOF' | /usr/bin/patch -p0 -F0 +--- debian/control ++++ debian/control +@@ -13,2 +13,2 @@ +-Suggests: vdr${SPECIAL_VDR_SUFFIX}-burnbackgrounds (>= 0.0.1-4) +-Conflicts: vdr${SPECIAL_VDR_SUFFIX}-burnbackgrounds (<= 0.0.1-3) ++Suggests: vdr-burnbackgrounds (>= 0.0.1-4) ++Conflicts: vdr-burnbackgrounds (<= 0.0.1-3) +--- debian/links ++++ debian/links +@@ -0,0 +1,6 @@ ++var/lib/vdr/plugins/burn/skins/fo-doku var/lib/vdr${SPECIAL_VDR_SUFFIX}/plugins/burn/skins/fo-doku ++var/lib/vdr/plugins/burn/skins/fo-kinder var/lib/vdr${SPECIAL_VDR_SUFFIX}/plugins/burn/skins/fo-kinder ++var/lib/vdr/plugins/burn/skins/fo-kino var/lib/vdr${SPECIAL_VDR_SUFFIX}/plugins/burn/skins/fo-kino ++var/lib/vdr/plugins/burn/skins/fo-musik var/lib/vdr${SPECIAL_VDR_SUFFIX}/plugins/burn/skins/fo-musik ++var/lib/vdr/plugins/burn/skins/fo-natur var/lib/vdr${SPECIAL_VDR_SUFFIX}/plugins/burn/skins/fo-natur ++var/lib/vdr/plugins/burn/skins/fo-sport var/lib/vdr${SPECIAL_VDR_SUFFIX}/plugins/burn/skins/fo-sport +EOF +} + +prepare_graphtft() +{ + echo "prepare_graphtft: correct device option vdr" + /bin/sed -e "s/\${SPECIAL_VDR_SUFFIX}/${SPECIAL_VDR_SUFFIX}/g" <<'EOF' | /usr/bin/patch -p0 -F0 +--- display.c ++++ display.c +@@ -165 +165 @@ +- else if ((pos = strstr(dev, "vdr${SPECIAL_VDR_SUFFIX}/"))) ++ else if ((pos = strstr(dev, "vdr/"))) +--- graphtft.c ++++ graphtft.c +@@ -118 +118 @@ +- " /dev/fb0 or vdr${SPECIAL_VDR_SUFFIX}/1 \n" ++ " /dev/fb0 or vdr/1 \n" +@@ -202,2 +202,2 @@ +- fprintf(stderr, "vdr${SPECIAL_VDR_SUFFIX}: graphtft - try device: vdr${SPECIAL_VDR_SUFFIX}/%d !\n", i); +- asprintf(&_dev, "vdr${SPECIAL_VDR_SUFFIX}/%d", i); ++ fprintf(stderr, "vdr${SPECIAL_VDR_SUFFIX}: graphtft - try device: vdr/%d !\n", i); ++ asprintf(&_dev, "vdr/%d", i); +--- debian/plugin.graphtft.conf ++++ debian/plugin.graphtft.conf +@@ -5 +5 @@ +-#-d vdr${SPECIAL_VDR_SUFFIX}/1 ++#-d vdr/1 +EOF + + echo "prepare_graphtft: use skins from standard packages" + /bin/sed -e "s/\${SPECIAL_VDR_SUFFIX}/${SPECIAL_VDR_SUFFIX}/g" <<'EOF' | /usr/bin/patch -p0 -F0 +--- debian/control ++++ debian/control +@@ -12 +12 @@ +-Depends: ${shlibs:Depends}, ${vdr${SPECIAL_VDR_SUFFIX}:Depends}, vdr${SPECIAL_VDR_SUFFIX}-tft-standard, ttf-bitstream-vera ++Depends: ${shlibs:Depends}, ${vdr${SPECIAL_VDR_SUFFIX}:Depends}, vdr-tft-standard, ttf-bitstream-vera +--- debian/dirs ++++ debian/dirs +@@ -1 +0,0 @@ +-var/lib/vdr${SPECIAL_VDR_SUFFIX}/plugins/graphTFT/themes +--- debian/links ++++ debian/links +@@ -0,0 +1 @@ ++var/lib/vdr/plugins/graphTFT/themes var/lib/vdr${SPECIAL_VDR_SUFFIX}/plugins/graphTFT/themes +EOF +} + +prepare_mediamvp() +{ + echo "prepare_mediamvp: rename mvploader -> mvploader_vdr${SPECIAL_VDR_SUFFIX}" + SUBST="s.mvploader.mvploader_vdr${SPECIAL_VDR_SUFFIX}.g; \ + s./usr/lib/mediamvp./usr/share/vdr${SPECIAL_VDR_SUFFIX}-plugin-mediamvp.g" + FILES=$(/usr/bin/find ./ -type f -not -regex "./${SAVE_DIR}/.*" \ + -not -regex "./debian/changelog") + subst_in_files "${SUBST}" ${FILES} + rename_files "${SUBST}" ${FILES} + /bin/mv "debian/mvploader" "debian/mvploader_vdr${SPECIAL_VDR_SUFFIX}" +} + +prepare_osdteletext() +{ + echo "prepare_osdteletext: correct 02_tmp-path-fix.dpatch" + /bin/sed -e "s/\${SPECIAL_VDR_SUFFIX}/${SPECIAL_VDR_SUFFIX}/g" <<'EOF' | /usr/bin/patch -p0 -F0 +--- debian/patches/02_tmp-path-fix.dpatch ++++ debian/patches/02_tmp-path-fix.dpatch +@@ -43 +43 @@ +-+ (standard value: /var/cache/vdr${SPECIAL_VDR_SUFFIX}/vtx, +++ (standard value: /var/cache/vdr/vtx, +@@ -45 +45 @@ +- or /var/cache/vdr${SPECIAL_VDR_SUFFIX}/osdteletext.) ++ or /var/cache/vdr/osdteletext.) +@@ -56 +56 @@ +-+ (Voreinstellung: /var/cache/vdr${SPECIAL_VDR_SUFFIX}/vtx, +++ (Voreinstellung: /var/cache/vdr/vtx, +@@ -58 +58 @@ +- oder /var/cache/vdr${SPECIAL_VDR_SUFFIX}/osdteletext.) ++ oder /var/cache/vdr/osdteletext.) +EOF +} + +prepare_pin() +{ + echo "prepare_pin: rename fskcheck -> fskcheck_vdr${SPECIAL_VDR_SUFFIX}" + SUBST="s/fskcheck/fskcheck_vdr${SPECIAL_VDR_SUFFIX}/g" + FILES=$(/usr/bin/find ./ -type f -not -regex "./${SAVE_DIR}/.*" \ + -not -regex "./debian/changelog") + subst_in_files "${SUBST}" ${FILES} + rename_files "${SUBST}" ${FILES} +} + +prepare_rssreader() +{ + echo "prepare_rssreader: correct rss entry" + /bin/sed -e "s/\${SPECIAL_VDR_SUFFIX}/${SPECIAL_VDR_SUFFIX}/g" <<'EOF' | /usr/bin/patch -p0 -F0 +--- debian/rssreader.conf ++++ debian/rssreader.conf +@@ -15 +15 @@ +-VDR Announcements : http://www.netholic.com/extras/vdr${SPECIAL_VDR_SUFFIX}_announce_rss.php?num=10 ++VDR Announcements : http://www.netholic.com/extras/vdr_announce_rss.php?num=10 +EOF +} + +prepare_softdevice() +{ + echo "prepare_softdevice: ShmClient -> ShmClient_vdr${SPECIAL_VDR_SUFFIX}" + if /usr/bin/dpkg --compare-versions "$(/usr/bin/dpkg-parsechangelog | /bin/egrep '^Version:' | /usr/bin/cut -f 2 -d ' ')" \ + ge "0.4.0+cvs20070830-8"; then + /bin/sed -e "s/\${SPECIAL_VDR_SUFFIX}/${SPECIAL_VDR_SUFFIX}/g" <<'EOF' >> debian/rules +common-binary-post-install-arch:: + cd debian/vdr${SPECIAL_VDR_SUFFIX}-plugin-softdevice/usr/bin; mv ShmClient ShmClient_vdr${SPECIAL_VDR_SUFFIX} +EOF + else + /bin/sed -e "s/\${SPECIAL_VDR_SUFFIX}/${SPECIAL_VDR_SUFFIX}/g" <<'EOF' | /usr/bin/patch -p0 -F0 +--- debian/rules ++++ debian/rules +@@ -54,1 +54,2 @@ +- dh_install ++ dh_install ++ cd debian/vdr${SPECIAL_VDR_SUFFIX}-plugin-softdevice/usr/bin; mv ShmClient ShmClient_vdr${SPECIAL_VDR_SUFFIX} +EOF + fi +} + +prepare_sudoku() +{ + echo "prepare_sudoku: rename sudoku_generator -> sudoku_generator_vdr${SPECIAL_VDR_SUFFIX}" + if /usr/bin/dpkg --compare-versions "$(/usr/bin/dpkg-parsechangelog | /bin/egrep '^Version:' | /usr/bin/cut -f 2 -d ' ')" \ + ge "0.2.0-1"; then + /bin/sed -e "s/\${SPECIAL_VDR_SUFFIX}/${SPECIAL_VDR_SUFFIX}/g" <<'EOF' >> debian/rules +common-binary-post-install-arch:: + cd debian/vdr${SPECIAL_VDR_SUFFIX}-plugin-sudoku/usr/bin; mv sudoku_generator sudoku_generator_vdr${SPECIAL_VDR_SUFFIX} +EOF + else + /bin/sed -e "s/\${SPECIAL_VDR_SUFFIX}/${SPECIAL_VDR_SUFFIX}/g" <<'EOF' | /usr/bin/patch -p0 -F0 +--- debian/rules ++++ debian/rules +@@ -53,1 +53,2 @@ +- dh_install ++ dh_install ++ cd debian/vdr${SPECIAL_VDR_SUFFIX}-plugin-sudoku/usr/bin; mv sudoku_generator sudoku_generator_vdr${SPECIAL_VDR_SUFFIX} +EOF + fi +} + +prepare_text2skin() +{ + echo "prepare_text2skin: use skins from standard packages" + /bin/sed -e "s/\${SPECIAL_VDR_SUFFIX}/${SPECIAL_VDR_SUFFIX}/g" <<'EOF' | /usr/bin/patch -p0 -F0 +--- debian/control ++++ debian/control +@@ -15,1 +15,1 @@ +-Suggests: vdr${SPECIAL_VDR_SUFFIX}-skins ++Suggests: vdr-skins +--- debian/links 1970-01-01 00:00:00.000000000 +0000 ++++ debian/links +@@ -0,0 +1 @@ ++var/lib/vdr/plugins/text2skin var/lib/vdr${SPECIAL_VDR_SUFFIX}/plugins/text2skin +EOF + + if /usr/bin/dpkg --compare-versions "$(/usr/bin/dpkg-parsechangelog | /bin/egrep '^Version:' | /usr/bin/cut -f 2 -d ' ')" \ + ge "1.0+cvs20080122.2311-1"; then + echo "prepare_text2skin: use skin locales from standard packages" + /bin/sed -e "s/\${SPECIAL_VDR_SUFFIX}/${SPECIAL_VDR_SUFFIX}/g" <<'EOF' | /usr/bin/patch -p0 -F0 +--- debian/patches/95_text2skin-1.1-cvs-locale.dpatch ++++ debian/patches/95_text2skin-1.1-cvs-locale.dpatch +@@ -185,2 +185,2 @@ +-+ mIdentity = std::string("vdr${SPECIAL_VDR_SUFFIX}-"PLUGIN_NAME_I18N"-") + Skin; +-+ I18nRegister(mIdentity.substr(mIdentity.find('-') + 1).c_str()); +++ mIdentity = std::string("vdr-"PLUGIN_NAME_I18N"-") + Skin; +++ extern char *bindtextdomain(const char *, const char *); bindtextdomain(mIdentity.c_str(), "/usr/share/locale"); +EOF + fi +} + +prepare_vdrc() +{ + echo "prepare_vdrc: set conflict to old special package" + /bin/sed -e "s/\${SPECIAL_VDR_SUFFIX}/${SPECIAL_VDR_SUFFIX}/g" <<'EOF' | /usr/bin/patch -p0 -F0 +--- debian/control ++++ debian/control +@@ -12,1 +12,3 @@ +-Depends: ${shlibs:Depends}, ${vdr${SPECIAL_VDR_SUFFIX}:Depends} ++Depends: ${shlibs:Depends}, ${vdr${SPECIAL_VDR_SUFFIX}:Depends} ++Conflicts: vdr${SPECIAL_VDR_SUFFIX}-plugin-vdrc ++Replaces: vdr${SPECIAL_VDR_SUFFIX}-plugin-vdrc +EOF +} + +prepare_vdrcd() +{ + echo "prepare_vdrcd: set conflict to old special package" + /bin/sed -e "s/\${SPECIAL_VDR_SUFFIX}/${SPECIAL_VDR_SUFFIX}/g" <<'EOF' | /usr/bin/patch -p0 -F0 +--- debian/control ++++ debian/control +@@ -11,1 +11,3 @@ +-Depends: ${shlibs:Depends}, ${vdr${SPECIAL_VDR_SUFFIX}:Depends}, vdr${SPECIAL_VDR_SUFFIX}-plugin-dvd, vdr${SPECIAL_VDR_SUFFIX}-plugin-vcd ++Depends: ${shlibs:Depends}, ${vdr${SPECIAL_VDR_SUFFIX}:Depends}, vdr${SPECIAL_VDR_SUFFIX}-plugin-dvd, vdr${SPECIAL_VDR_SUFFIX}-plugin-vcd ++Conflicts: vdr${SPECIAL_VDR_SUFFIX}-plugin-vdrcd ++Replaces: vdr${SPECIAL_VDR_SUFFIX}-plugin-vdrcd +EOF +} + +prepare_vdrrip() +{ + echo "prepare_vdrrip: rename queuehandler.sh -> queuehandler_vdr${SPECIAL_VDR_SUFFIX}.sh" + SUBST="s/queuehandler.sh/queuehandler_vdr${SPECIAL_VDR_SUFFIX}.sh/g" + FILES=$(/usr/bin/find ./ -type f -not -regex "./${SAVE_DIR}/.*" \ + -not -regex "./debian/changelog") + subst_in_files "${SUBST}" ${FILES} + rename_files "${SUBST}" ${FILES} + + echo "prepare_vdrrip: set conflict to old special package" + /bin/sed -e "s/\${SPECIAL_VDR_SUFFIX}/${SPECIAL_VDR_SUFFIX}/g" <<'EOF' | /usr/bin/patch -p0 -F0 +--- debian/control ++++ debian/control +@@ -12,1 +12,3 @@ +-Depends: ${shlibs:Depends}, ${misc:Depends}, ${vdr${SPECIAL_VDR_SUFFIX}:Depends} ++Depends: ${shlibs:Depends}, ${misc:Depends}, ${vdr${SPECIAL_VDR_SUFFIX}:Depends} ++Conflicts: vdr${SPECIAL_VDR_SUFFIX}-plugin-vdrrip ++Replaces: vdr${SPECIAL_VDR_SUFFIX}-plugin-vdrrip +EOF +} + +prepare_vompserver() +{ + echo "prepare_vompserver: use vompclient from standard package" + SUBST="s/vdr${SPECIAL_VDR_SUFFIX}-vompclient-mvp/vdr-vompclient-mvp/g" + subst_in_files "${SUBST}" "debian/control" + + /bin/sed -e "s/\${SPECIAL_VDR_SUFFIX}/${SPECIAL_VDR_SUFFIX}/g" <<'EOF' | /usr/bin/patch -p0 -F0 +--- debian/vomp.conf ++++ debian/vomp.conf +@@ -30 +30 @@ +-TFTP directory = /usr/share/vdr${SPECIAL_VDR_SUFFIX}-plugin-vompserver ++TFTP directory = /usr/share/vdr-plugin-vompserver +EOF +} + +prepare_wapd() +{ + echo "prepare_wapd: rename wappasswd -> wappasswd_vdr${SPECIAL_VDR_SUFFIX}" + if /usr/bin/dpkg --compare-versions "$(/usr/bin/dpkg-parsechangelog | /bin/egrep '^Version:' | /usr/bin/cut -f 2 -d ' ')" \ + ge "0.9-1"; then + /bin/sed -e "s/\${SPECIAL_VDR_SUFFIX}/${SPECIAL_VDR_SUFFIX}/g" <<'EOF' >> debian/rules +common-binary-post-install-arch:: + cd debian/vdr${SPECIAL_VDR_SUFFIX}-plugin-wapd/usr/bin; mv wappasswd wappasswd_vdr${SPECIAL_VDR_SUFFIX} +EOF + else + /bin/sed -e "s/\${SPECIAL_VDR_SUFFIX}/${SPECIAL_VDR_SUFFIX}/g" <<'EOF' | /usr/bin/patch -p0 -F0 +--- debian/rules ++++ debian/rules +@@ -53,1 +53,2 @@ +- dh_install ++ dh_install ++ cd debian/vdr${SPECIAL_VDR_SUFFIX}-plugin-wapd/usr/bin; mv wappasswd wappasswd_vdr${SPECIAL_VDR_SUFFIX} +EOF + fi +} + +prepare_xine() +{ + echo "prepare_xine: rename xineplayer -> xineplayer_vdr${SPECIAL_VDR_SUFFIX}" + /bin/sed -e "s/\${SPECIAL_VDR_SUFFIX}/${SPECIAL_VDR_SUFFIX}/g" <<'EOF' | /usr/bin/patch -p0 -F0 +--- debian/rules ++++ debian/rules +@@ -69,1 +69,2 @@ +- dh_install ++ dh_install ++ cd debian/vdr${SPECIAL_VDR_SUFFIX}-plugin-xine/usr/bin; mv xineplayer xineplayer_vdr${SPECIAL_VDR_SUFFIX} +EOF +} + +prepare_xineliboutput() +{ + echo "prepare_xineliboutput: use libxine/xineliboutput from standard package" + SUBST="/Package: libxineliboutput-fbfe/,/^\$/d; \ + /Package: libxineliboutput-sxfe/,/^\$/d; \ + /Package: xineliboutput-fbfe/,/^\$/d; \ + /Package: xineliboutput-sxfe/,/^\$/d; \ + /Package: libxine-xvdr${SPECIAL_VDR_SUFFIX}/,/^\$/d" + subst_in_files "${SUBST}" "debian/control" + + /bin/sed -e "s/\${VERSION}/$(grep 'static const char \*VERSION *=' xineliboutput.c | cut -d'"' -f2)/g" \ + -e "s/\${SPECIAL_VDR_SUFFIX}/${SPECIAL_VDR_SUFFIX}/g" <<'EOF' | /usr/bin/patch -p0 -F0 +--- debian/vdr${SPECIAL_VDR_SUFFIX}-plugin-xineliboutput.links 1970-01-01 00:00:00.000000000 +0000 ++++ debian/vdr${SPECIAL_VDR_SUFFIX}-plugin-xineliboutput.links +@@ -0,0 +1,2 @@ ++usr/lib/vdr/plugins/libxineliboutput-fbfe.so.${VERSION} usr/lib/vdr${SPECIAL_VDR_SUFFIX}/plugins/libxineliboutput-fbfe.so.${VERSION} ++usr/lib/vdr/plugins/libxineliboutput-sxfe.so.${VERSION} usr/lib/vdr${SPECIAL_VDR_SUFFIX}/plugins/libxineliboutput-sxfe.so.${VERSION} +EOF +} + +cleanup() +{ + if [ -e "${SAVE_DIR}" ]; then + echo "cleanup: remove all but ${SAVE_DIR} and restore all files form there" + /bin/rm -rf $(/usr/bin/find ./ -mindepth 1 -maxdepth 1 \ + -not -name "${SAVE_DIR}") + cd "${SAVE_DIR}" + /bin/cp -af $(/usr/bin/find ./ -mindepth 1 -maxdepth 1) .. + cd .. + /bin/rm -rf "${SAVE_DIR}" + fi +} + +check_clean_arg() +{ + for ARG; do + [ "${ARG}" = "clean" ] && return + done + false +} + +check_package() +{ + for ARG; do + /usr/bin/dh_listpackages | /bin/grep -q "^${ARG}\$" && return + done + false +} + +subst_in_files() +{ + SUBST="$1" + shift + for F; do + /bin/chmod +w "${F}" + /bin/cp -a -f "${F}" "${TMP_FILE}" + /bin/sed -e "${SUBST}" "${F}" >"${TMP_FILE}" + if ! /usr/bin/cmp -s "${F}" "${TMP_FILE}"; then + /usr/bin/touch -r "${F}" "${TMP_FILE}" + /bin/mv -f "${TMP_FILE}" "${F}" + fi + done +} + +rename_files() +{ + SUBST="$1" + shift + for F; do + N=$(dirname "${F}")/$(basename "${F}" | /bin/sed -e "${SUBST}") + if [ "${F}" != "${N}" ]; then + /bin/mv "${F}" "${N}" + fi + done +} + +main "$@" --- vdr-1.6.0.orig/debian/vdr-shutdown +++ vdr-1.6.0/debian/vdr-shutdown @@ -0,0 +1,54 @@ +#!/bin/sh +# +# VDR Shutdown Script - Tobias Grimm +# ------------------- +# +# 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.6.0.orig/debian/vdr.links +++ vdr-1.6.0/debian/vdr.links @@ -0,0 +1,27 @@ +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 + +usr/share/man/man1/vdr.1.gz usr/share/man/man1/vdr-daemon.1.gz +usr/share/man/man1/vdr.1.gz usr/share/man/man1/vdr-kbd.1.gz +usr/share/man/man1/vdr.1.gz usr/share/man/man1/vdr-lirc.1.gz +usr/share/man/man1/vdr.1.gz usr/share/man/man1/vdr-rcu.1.gz + +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.6.0.orig/debian/dependencies.sh +++ vdr-1.6.0/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.6.0.orig/debian/README.Debian +++ vdr-1.6.0/debian/README.Debian @@ -0,0 +1,290 @@ +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. + +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.6.0.orig/debian/patchcheck.py +++ vdr-1.6.0/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.6.0.orig/debian/commands.custom.conf +++ vdr-1.6.0/debian/commands.custom.conf @@ -0,0 +1,30 @@ +# +# 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: : <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. i.e.: +# +# 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! ) +# +# If you are using the reccmd-patch, you can even divide your commands into +# submenus. To do so, prefix all sub menu items with a "-". i.e.: +# +# Fortune Cookies ... : echo "sub menu, no command" +# -Long Dictum : /usr/games/fortune -l +# -Short Apothegms : /usr/games/fortune -s +# -Special Topics ... : echo "sub-sub menu, no command" +# --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.6.0.orig/debian/TODO.Debian +++ vdr-1.6.0/debian/TODO.Debian @@ -0,0 +1,5 @@ +TODO: Make runvdr more equal to official Debian version +TODO: When plugin could not be loaded, log stderr output somewhere +TODO: Remove all vdr 1.2.6 upgrade code and conflict with 1.2.6 +TODO: Manpage for pic2mpg +TODO: Remove | libcap-dev build dep, if Etch gets uninteresting --- vdr-1.6.0.orig/debian/vdr-dbg.manpages +++ vdr-1.6.0/debian/vdr-dbg.manpages @@ -0,0 +1,3 @@ +debian/debugvdr.1 +debian/vdrleaktest.1 +debian/vdr-dbg.1 --- vdr-1.6.0.orig/debian/reccmds.custom.conf +++ vdr-1.6.0/debian/reccmds.custom.conf @@ -0,0 +1,27 @@ +# +# 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: <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. Also the name of the selected recording will be passed +# in single quotes as the first parameter to the command. i.e.: +# +# 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 :-) +# +# If you are using the reccmd-patch, you can even divide your commands into +# submenus. To do so, prefix all sub menu items with a "-". i.e.: +# +# main menu node ... : echo "sub menu, no command" +# -sub menu entry 1 : do_something.sh +# -sub menu entry 2 : do_something_else.sh +# -sub menu node ... : echo "sub sub menu, no command" +# --sub-sub menu entry : do_whatever_you_want.sh +# --- vdr-1.6.0.orig/debian/vdr.config +++ vdr-1.6.0/debian/vdr.config @@ -0,0 +1,18 @@ +#!/bin/sh + +set -e + +# source debconf lib +. /usr/share/debconf/confmodule + +# ask about creating /var/lib/video.00 +if [ ! -e /var/lib/video.00 ]; then + db_input high vdr/create_video_dir || true + db_go +fi + +# ask about dvb card type +db_input high vdr/select_dvb_card || true +db_go + +exit 0 --- vdr-1.6.0.orig/debian/abi-version.multipatch +++ vdr-1.6.0/debian/abi-version.multipatch @@ -0,0 +1 @@ +vdr-abi-1.6.0-multipatch-2008-07-11 --- vdr-1.6.0.orig/debian/order.conf +++ vdr-1.6.0/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.6.0.orig/debian/vdr-groups.sh +++ vdr-1.6.0/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.6.0.orig/debian/vdr-plugin-sky.docs +++ vdr-1.6.0/debian/vdr-plugin-sky.docs @@ -0,0 +1 @@ +PLUGINS/src/sky/README --- vdr-1.6.0.orig/debian/rules +++ vdr-1.6.0/debian/rules @@ -0,0 +1,190 @@ +#! /bin/sh debian/make-special-vdr.sh +# 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) BUILDVDR=yes 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) BUILDVDR=yes + ln -f vdr vdr-kbd + + # plugins + mkdir -p PLUGINS/lib + $(MAKE) plugins $(MAKE_OPTIONS) + + cp newplugin vdr-newplugin + + gcc -o debian/vdr-shutdown.wrapper debian/vdr-shutdown-wrapper.c + + rm -f po/vdr.pot + + 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 -f vdr-kbd + rm -rf PLUGINS/lib + rm -f vdr-newplugin + rm -f debian/vdr-shutdown.wrapper + 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 + + +# 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-sky PLUGINS/src/sky/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.6.0.orig/debian/debianize-vdrplugin +++ vdr-1.6.0/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.6.0.orig/debian/S90.custom +++ vdr-1.6.0/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.6.0.orig/debian/vdr-dev.docs +++ vdr-1.6.0/debian/vdr-dev.docs @@ -0,0 +1,4 @@ +README* +CONTRIBUTORS +PLUGINS.html +debian/patchinfo --- vdr-1.6.0.orig/debian/vdr.postrm +++ vdr-1.6.0/debian/vdr.postrm @@ -0,0 +1,45 @@ +#! /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/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.6.0.orig/debian/vdrdbg-buildpackage +++ vdr-1.6.0/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 <tg@e-tobi.net> +## +### 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.6.0.orig/debian/order.reccmds.conf +++ vdr-1.6.0/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.6.0.orig/debian/vdr.init +++ vdr-1.6.0/debian/vdr.init @@ -0,0 +1,143 @@ +#! /bin/bash +# +# vdr start-stop script +# +### BEGIN INIT INFO +# Provides: vdr +# Required-Start: $network $syslog +# Required-Stop: $network $syslog +# Should-Start: $local_fs $remote_fs +# Should-Stop: $local_fs $remote_fs +# 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 + + 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 $OPTIONS $PLUGINS $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-kbd >/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.6.0.orig/debian/control +++ vdr-1.6.0/debian/control @@ -0,0 +1,83 @@ +Source: vdr +Section: video +Priority: extra +Maintainer: Ubuntu MOTU Developers <ubuntu-motu@lists.ubuntu.com> +XSBC-Original-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> +Build-Depends: debhelper (>= 5), dpatch, libjpeg62-dev, libcap2-dev | libcap-dev, + libncursesw5-dev, libfreetype6-dev, libfontconfig-dev, gettext, + txt2man, python +Standards-Version: 3.8.1 +Vcs-Svn: svn://svn.debian.org/pkg-vdr-dvb/vdr/vdr/trunk/ +Vcs-Browser: http://svn.debian.org/wsvn/pkg-vdr-dvb/vdr/vdr/trunk/ +Homepage: http://www.cadsoft.de/vdr/ + +Package: vdr +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, adduser, psmisc +Recommends: lirc, ttf-dejavu | 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 +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-sky +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 sky-plugin, which allows you to connect + the analog a/v output of a Sky Digibox to VDR, so that you can + enjoy the full recording flexibility of VDR with your Sky + subscription. + +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.6.0.orig/debian/vdr.docs +++ vdr-1.6.0/debian/vdr.docs @@ -0,0 +1,6 @@ +README* +CONTRIBUTORS +MANUAL +INSTALL +UPDATE* +debian/patchinfo --- vdr-1.6.0.orig/debian/R90.custom +++ vdr-1.6.0/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<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: +# +# 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.6.0.orig/debian/themes/sttng-cool.theme +++ vdr-1.6.0/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.6.0.orig/debian/themes/sttng-blue.theme +++ vdr-1.6.0/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 --- vdr-1.6.0.orig/debian/patches/09_sort_options.dpatch +++ vdr-1.6.0/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.6.0.orig/debian/patches/opt-21_internal-cam-devices.dpatch +++ vdr-1.6.0/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.6.0.orig/debian/patches/opt-41-x_timer-info.dpatch +++ vdr-1.6.0/debian/patches/opt-41-x_timer-info.dpatch @@ -0,0 +1,302 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-41-x_timer-info.dpatch by Andreas Brugger <brougs78@gmx.net>, Thomas Günther <tom@toms-cafe.de> +## http://toms-cafe.de/vdr/download/vdr-timer-info-0.5-1.5.15.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.5.15/README.timer-info vdr-1.5.15-timer-info-0.5/README.timer-info +--- vdr-1.5.15/README.timer-info 1970-01-01 00:00:00.000000000 +0000 ++++ vdr-1.5.15-timer-info-0.5/README.timer-info 2008-04-12 11:54:16.000000000 +0000 +@@ -0,0 +1,65 @@ +++------------------------------------------------------------------------------+ ++| 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 Günther <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 Günther <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 Günther <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 Günther <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 Günther <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 +diff -Naurp vdr-1.5.15/menu.c vdr-1.5.15-timer-info-0.5/menu.c +--- vdr-1.5.15/menu.c 2008-02-16 13:53:26.000000000 +0000 ++++ vdr-1.5.15-timer-info-0.5/menu.c 2008-04-12 11:49:23.000000000 +0000 +@@ -777,8 +777,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; } +@@ -787,6 +789,7 @@ public: + cMenuTimerItem::cMenuTimerItem(cTimer *Timer) + { + timer = Timer; ++ diskStatus = ' '; + Set(); + } + +@@ -812,7 +815,10 @@ void cMenuTimerItem::Set(void) + strftime(buffer, sizeof(buffer), "%Y%m%d", &tm_r); + day = buffer; + } +- 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, +@@ -825,6 +831,57 @@ void cMenuTimerItem::Set(void) + timer->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 { +@@ -837,14 +894,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)) { +@@ -855,6 +915,7 @@ cMenuTimers::cMenuTimers(void) + SetCurrent(First()); + SetHelpKeys(); + Timers.IncBeingEdited(); ++ actualiseDiskStatus = true; + } + + cMenuTimers::~cMenuTimers() +@@ -893,7 +954,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 +@@ -952,6 +1013,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; +@@ -960,18 +1082,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.6.0.orig/debian/patches/opt-35_setup-show-valid.dpatch +++ vdr-1.6.0/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.6.0.orig/debian/patches/opt-49-x_pvrinput.dpatch +++ vdr-1.6.0/debian/patches/opt-49-x_pvrinput.dpatch @@ -0,0 +1,24 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-49-x_pvrinput.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 pvrinput plugin and was taken from +## DP: version 2007-11-29 of the plugin. +## DP: http://drseltsam.device.name/vdr/pvr/src/pvrinput +## DP: +## DP: 2008-05-14: Added CA-Id's 0xA1 and 0xA2, required by pvrusb2 +## DP: (as suggested by Christian Jarczyk) + +@DPATCH@ +diff -urNad vdr-1.5.15~/dvbdevice.c vdr-1.5.15/dvbdevice.c +--- vdr-1.5.15~/dvbdevice.c 2008-02-09 17:11:44.000000000 +0100 ++++ vdr-1.5.15/dvbdevice.c 2008-02-20 14:38:36.000000000 +0100 +@@ -759,7 +759,7 @@ + bool result = false; + bool hasPriority = Priority < 0 || Priority > this->Priority(); + bool needsDetachReceivers = false; +- ++ if (Channel->Ca(0) == 0xA0 || Channel->Ca(0) == 0xA1 || Channel->Ca(0) == 0xA2) return false; /* this caid marks a pvrinput plugin channel, no dvb */ + if (ProvidesSource(Channel->Source())) { + result = hasPriority; + if (Priority >= 0 && Receiving(true)) { --- vdr-1.6.0.orig/debian/patches/extension-patch-helper.sh +++ vdr-1.6.0/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.6.0.orig/debian/patches/82_valgrind.dpatch +++ vdr-1.6.0/debian/patches/82_valgrind.dpatch @@ -0,0 +1,97 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 82_valgrind.dpatch by Tobias Grimm <tg@e-tobi.net> +## +## 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@ +diff -urNad vdr-1.3.49~/plugin.c vdr-1.3.49/plugin.c +--- vdr-1.3.49~/plugin.c 2006-04-17 11:20:05.000000000 +0200 ++++ vdr-1.3.49/plugin.c 2006-05-01 12:17:01.000000000 +0200 +@@ -144,6 +144,10 @@ + + // --- cDll ------------------------------------------------------------------ + ++#ifdef VDRDEBUG ++bool cDll::keepPlugins = false; ++#endif ++ + cDll::cDll(const char *FileName, const char *Args) + { + fileName = strdup(FileName); +@@ -155,8 +159,16 @@ + cDll::~cDll() + { + delete plugin; ++#ifdef VDRDEBUG ++ if (!keepPlugins) ++ { ++ if (handle) ++ dlclose(handle); ++ } ++#else + if (handle) + dlclose(handle); ++#endif + free(args); + free(fileName); + } +diff -urNad vdr-1.3.49~/plugin.h vdr-1.3.49/plugin.h +--- vdr-1.3.49~/plugin.h 2006-04-17 11:18:16.000000000 +0200 ++++ vdr-1.3.49/plugin.h 2006-05-01 12:16:44.000000000 +0200 +@@ -67,6 +67,9 @@ + 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); +diff -urNad vdr-1.3.49~/vdr.c vdr-1.3.49/vdr.c +--- vdr-1.3.49~/vdr.c 2006-05-01 12:13:12.000000000 +0200 ++++ vdr-1.3.49/vdr.c 2006-05-01 12:17:12.000000000 +0200 +@@ -213,6 +213,9 @@ + { "epgfile", required_argument, NULL, 'E' }, + { "grab", required_argument, NULL, 'g' }, + { "help", no_argument, NULL, 'h' }, ++#ifdef VDRDEBUG ++ { "keep-plugins", no_argument, NULL, 'k' }, ++#endif + { "lib", required_argument, NULL, 'L' }, + { "lirc", optional_argument, NULL, 'l' | 0x100 }, + { "log", required_argument, NULL, 'l' }, +@@ -233,7 +236,7 @@ + }; + + int c; +- while ((c = getopt_long(argc, argv, "a:c:dD:E:g:hl:L:mp:P:r:s:t:u:v:Vw:", long_options, NULL)) != -1) { ++ while ((c = getopt_long(argc, argv, "a:c:dD:E:g:hkl:L:mp:P:r:s:t:u:v:Vw:", long_options, NULL)) != -1) { + switch (c) { + case 'a': AudioCommand = optarg; + break; +@@ -256,6 +259,10 @@ + break; + case 'h': DisplayHelp = true; + break; ++#ifdef VDRDEBUG ++ case 'k': cDll::keepPlugins = true; ++ break; ++#endif + case 'l': { + char *p = strchr(optarg, '.'); + if (p) +@@ -385,6 +392,9 @@ + " existing directory, without any \"..\", double '/'\n" + " or symlinks (default: none, same as -g-)\n" + " -h, --help print this help and exit\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.6.0.orig/debian/patches/opt-38_disableDoubleEpgEntrys.dpatch +++ vdr-1.6.0/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 Günther <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 Günther <tom@toms-cafe.de>: +## - added French language texts (thanks to Michaël 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 für 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 "Entrée 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 "Désactiver événement VPS" ++ + msgid "Setup.EPG$EPG scan timeout (h)" + msgstr "Inactivité avant rech. EPG (h)" + --- vdr-1.6.0.orig/debian/patches/11_sortrecordings.dpatch +++ vdr-1.6.0/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 Günther <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.6.0.orig/debian/patches/99_ncursesw-include.dpatch +++ vdr-1.6.0/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.6.0.orig/debian/patches/14_cap-memsize.dpatch +++ vdr-1.6.0/debian/patches/14_cap-memsize.dpatch @@ -0,0 +1,20 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 14_cap-memsize.dpatch by Thomas Günther <tom@toms-cafe.de> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Add OSD_CAP_MEMSIZE from newer dvb drivers to compile with Debian package +## DP: linux-kernel-headers_2.5.999-test7-bk-17 (Sarge). + +@DPATCH@ +--- vdr-1.3.37/dvbosd.c ++++ vdr-1.3.37/dvbosd.c +@@ -11,1 +11,9 @@ + #include <linux/dvb/osd.h> ++#ifndef OSD_CAP_MEMSIZE ++typedef struct osd_cap_s { ++ int cmd; ++#define OSD_CAP_MEMSIZE 1 /* memory size */ ++ long val; ++} osd_cap_t; ++#define OSD_GET_CAPABILITY _IOR('o', 161, osd_cap_t) ++#endif --- vdr-1.6.0.orig/debian/patches/opt-20_liemikuutio.dpatch +++ vdr-1.6.0/debian/patches/opt-20_liemikuutio.dpatch @@ -0,0 +1,1498 @@ +#! /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.6.0-liemikuutio-1.21.diff.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.6.0-vanilla/HISTORY-liemikuutio vdr-1.6.0-liemikuutio/HISTORY-liemikuutio +--- vdr-1.6.0-vanilla/HISTORY-liemikuutio 1970-01-01 02:00:00.000000000 +0200 ++++ vdr-1.6.0-liemikuutio/HISTORY-liemikuutio 2008-05-08 22:47:59.000000000 +0300 +@@ -0,0 +1,108 @@ ++----------------------------------- ++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). +diff -Nru vdr-1.6.0-vanilla/config.c vdr-1.6.0-liemikuutio/config.c +--- vdr-1.6.0-vanilla/config.c 2008-03-27 21:43:25.000000000 +0200 ++++ vdr-1.6.0-liemikuutio/config.c 2008-03-27 21:47:57.000000000 +0200 +@@ -289,6 +289,11 @@ + InitialChannel = 0; + InitialVolume = -1; + EmergencyExit = 1; ++ ShowRecDate = 1; ++ ShowRecTime = 1; ++ ShowRecLength = 0; ++ ShowProgressBar = 0; ++ MenuCmdPosition = 0; + } + + cSetup& cSetup::operator= (const cSetup &s) +@@ -462,6 +467,11 @@ + else if (!strcasecmp(Name, "InitialChannel")) InitialChannel = atoi(Value); + else if (!strcasecmp(Name, "InitialVolume")) InitialVolume = 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; +@@ -545,6 +555,11 @@ + Store("InitialChannel", InitialChannel); + Store("InitialVolume", InitialVolume); + Store("EmergencyExit", EmergencyExit); ++ Store("ShowRecDate", ShowRecDate); ++ Store("ShowRecTime", ShowRecTime); ++ Store("ShowRecLength", ShowRecLength); ++ Store("ShowProgressBar", ShowProgressBar); ++ Store("MenuCmdPosition", MenuCmdPosition); + + Sort(); + +diff -Nru vdr-1.6.0-vanilla/config.h vdr-1.6.0-liemikuutio/config.h +--- vdr-1.6.0-vanilla/config.h 2008-03-27 21:43:25.000000000 +0200 ++++ vdr-1.6.0-liemikuutio/config.h 2008-04-26 23:23:40.000000000 +0300 +@@ -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 121 ++ + #define MAXPRIORITY 99 + #define MAXLIFETIME 99 + +@@ -267,6 +269,7 @@ + int InitialChannel; + int InitialVolume; + int EmergencyExit; ++ int ShowRecDate, ShowRecTime, ShowRecLength, ShowProgressBar, MenuCmdPosition; + int __EndData__; + cSetup(void); + cSetup& operator= (const cSetup &s); +diff -Nru vdr-1.6.0-vanilla/device.c vdr-1.6.0-liemikuutio/device.c +--- vdr-1.6.0-vanilla/device.c 2008-03-27 21:43:25.000000000 +0200 ++++ vdr-1.6.0-liemikuutio/device.c 2008-05-08 22:50:10.000000000 +0300 +@@ -1100,7 +1100,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.6.0-vanilla/menu.c vdr-1.6.0-liemikuutio/menu.c +--- vdr-1.6.0-vanilla/menu.c 2008-03-27 21:43:25.000000000 +0200 ++++ vdr-1.6.0-liemikuutio/menu.c 2008-04-04 00:23:09.000000000 +0300 +@@ -13,6 +13,7 @@ + #include <stdio.h> + #include <stdlib.h> + #include <string.h> ++#include <math.h> + #include "channels.h" + #include "config.h" + #include "cutter.h" +@@ -705,7 +706,22 @@ + 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)); +- Add(new cMenuEditStrItem( tr("File"), data.file, sizeof(data.file))); ++ ++ char* p = strrchr(data.file, '~'); ++ if (p) { ++ p++; ++ Utf8Strn0Cpy(name, p, sizeof(name)); ++ Utf8Strn0Cpy(path, data.file, sizeof(path)); ++ p = strrchr(path, '~'); ++ if (p) ++ p[0] = 0; ++ } ++ else { ++ Utf8Strn0Cpy(name, data.file, sizeof(name)); ++ Utf8Strn0Cpy(path, "", sizeof(path)); ++ } ++ Add(new cMenuEditStrItem( tr("File"), name, sizeof(name), tr(FileNameChars))); ++ Add(new cMenuEditRecPathItem(tr("Path"), path, sizeof(path))); + SetFirstDayItem(); + } + Timers.IncBeingEdited(); +@@ -745,6 +761,10 @@ + Skins.Message(mtError, tr("*** Invalid Channel ***")); + break; + } ++ if(strlen(path)) ++ snprintf(data.file, sizeof(data.file), "%s~%s", path, name); ++ else ++ snprintf(data.file, sizeof(data.file), "%s", name); + if (!*data.file) + strcpy(data.file, data.Channel()->ShortName(true)); + if (timer) { +@@ -1048,7 +1068,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; } +@@ -1058,12 +1079,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); + } + +@@ -1080,6 +1102,17 @@ + + static const char *TimerMatchChars = " tT"; + ++static const char * const ProgressBar[7] = ++{ ++ "[ ]", ++ "[| ]", ++ "[|| ]", ++ "[||| ]", ++ "[|||| ]", ++ "[||||| ]", ++ "[||||||]" ++}; ++ + bool cMenuScheduleItem::Update(bool Force) + { + bool result = false; +@@ -1095,7 +1128,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); +@@ -1129,7 +1169,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; +@@ -1141,7 +1181,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); + } + } + } +@@ -1883,7 +1923,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' + } +@@ -1899,13 +1939,154 @@ + 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: ++ int lifetime; ++ int priority; ++ char name[MaxFileName]; ++ char path[MaxFileName]; ++ cOsdItem *marksItem, *resumeItem; ++ bool isResume, isMarks; ++ cRecording *recording; ++public: ++ cMenuRenameRecording(cRecording *Recording); ++ virtual eOSState ProcessKey(eKeys Key); ++}; ++ ++cMenuRenameRecording::cMenuRenameRecording(cRecording *Recording) ++:cOsdMenu(tr("Rename recording"), 12) ++{ ++ cMarks marks; ++ ++ recording = Recording; ++ priority = recording->priority; ++ lifetime = recording->lifetime; ++ ++ const char* pname = strrchr(recording->Name(), '~'); ++ if (pname) { ++ Utf8Strn0Cpy(name, pname + 1, sizeof(name)); ++ Utf8Strn0Cpy(path, recording->Name(), sizeof(path)); ++ char *ppath = strrchr(path, '~'); ++ if (ppath) ++ ppath[0] = 0; ++ } ++ else { ++ Utf8Strn0Cpy(name, recording->Name(), sizeof(name)); ++ Utf8Strn0Cpy(path, "", sizeof(path)); ++ } ++ Add(new cMenuEditStrItem(tr("Name"), name, sizeof(name), tr(FileNameChars))); ++ Add(new cMenuEditRecPathItem(tr("Path"), path, sizeof(path) )); ++ Add(new cMenuEditIntItem(tr("Priority"), &priority, 0, MAXPRIORITY )); ++ Add(new cMenuEditIntItem(tr("Lifetime"), &lifetime, 0, MAXLIFETIME )); ++ ++ 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)); ++ ++ cIndexFile *index = new cIndexFile(recording->FileName(), false); ++ int recLen = 0; ++ if (index) { ++ recLen = index->Last() / FRAMESPERSEC; ++ Add(new cOsdItem(cString::sprintf("%s:\t%s", tr("Length"), *IndexToHMSF(index->Last())), osUnknown, false)); ++ delete index; ++ } ++ ++ int dirSize = DirSizeMB(recording->FileName()); ++ cString bitRate = recLen ? cString::sprintf(" (%.2f MBit/s)", 8.0 * dirSize / recLen) : cString(""); ++ 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()) && marks.Count(); ++ marksItem = new cOsdItem(tr("Delete marks information?"), osUser1, isMarks); ++ Add(marksItem); ++ ++ cResumeFile ResumeFile(recording->FileName()); ++ isResume = (ResumeFile.Read() != -1); ++ resumeItem = new cOsdItem(tr("Delete resume information?"), osUser2, isResume); ++ Add(resumeItem); ++} ++ ++eOSState cMenuRenameRecording::ProcessKey(eKeys Key) ++{ ++ eOSState state = cOsdMenu::ProcessKey(Key); ++ ++ if (state == osUnknown) { ++ if (Key == kOk) { ++ char buffer[MaxFileName]; ++ if (Utf8StrLen(path)) ++ snprintf(buffer, sizeof(buffer), "%s~%s", path, name); ++ else ++ snprintf(buffer, sizeof(buffer), "%s", name); ++ if (recording->Rename(buffer, &priority, &lifetime)) { ++ Recordings.ChangeState(); ++ Recordings.TouchUpdate(); ++ return osRecordings; ++ } ++ else ++ Skins.Message(mtError, tr("Error while accessing recording!")); ++ } ++ return osContinue; ++ } ++ else if (state == osUser1) { ++ if (isMarks && Interface->Confirm(tr("Delete marks information?"))) { ++ cMarks marks; ++ marks.Load(recording->FileName()); ++ 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()); ++ 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; +@@ -2136,6 +2318,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(); +@@ -2150,7 +2345,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; +@@ -2276,6 +2476,7 @@ + Add(new cMenuEditBoolItem(tr("Setup.OSD$Scroll wraps"), &data.MenuScrollWrap)); + 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$Main menu command position"), &data.MenuCmdPosition, tr("bottom"), tr("top"))); + SetCurrent(Get(current)); + Display(); + } +@@ -2380,6 +2581,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)); +@@ -2758,6 +2960,9 @@ + Add(new cMenuEditIntItem( tr("Setup.Recording$Instant rec. time (min)"), &data.InstantRecordTime, 1, MAXINSTANTRECTIME)); + Add(new cMenuEditIntItem( tr("Setup.Recording$Max. video file size (MB)"), &data.MaxVideoFileSize, MINVIDEOFILESIZE, MAXVIDEOFILESIZE)); + Add(new cMenuEditBoolItem(tr("Setup.Recording$Split edited files"), &data.SplitEditedFiles)); ++ 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 ------------------------------------------------------ +@@ -3045,6 +3250,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()); +@@ -3059,6 +3265,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; + } +@@ -3079,6 +3286,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; +@@ -4059,6 +4267,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; +@@ -4072,6 +4284,9 @@ + lastCurrent = lastTotal = -1; + lastPlay = lastForward = false; + lastSpeed = -2; // an invalid value ++ lastSkipKey = kNone; ++ lastSkipSeconds = REPLAYCONTROLSKIPSECONDS; ++ lastSkipTimeout.Set(0); + timeoutShow = 0; + timeSearchActive = false; + marks.Load(fileName); +@@ -4435,6 +4650,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(); +@@ -4444,12 +4685,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.6.0-vanilla/menu.h vdr-1.6.0-liemikuutio/menu.h +--- vdr-1.6.0-vanilla/menu.h 2008-03-27 21:43:25.000000000 +0200 ++++ vdr-1.6.0-liemikuutio/menu.h 2008-04-03 23:24:39.000000000 +0300 +@@ -35,6 +35,8 @@ + private: + cTimer *timer; + cTimer data; ++ char name[MaxFileName]; ++ char path[MaxFileName]; + int channel; + bool addIfConfirmed; + cMenuEditDateItem *firstday; +@@ -163,6 +165,7 @@ + eOSState Delete(void); + eOSState Info(void); + eOSState Commands(eKeys Key = kNone); ++ eOSState Rename(void); + protected: + cRecording *GetRecording(cMenuRecordingItem *Item); + public: +@@ -217,6 +220,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.6.0-vanilla/menuitems.c vdr-1.6.0-liemikuutio/menuitems.c +--- vdr-1.6.0-vanilla/menuitems.c 2008-03-27 21:43:25.000000000 +0200 ++++ vdr-1.6.0-liemikuutio/menuitems.c 2008-04-26 23:23:31.000000000 +0300 +@@ -619,6 +619,168 @@ + return osContinue; + } + ++// --- cMenuEditRecPathItem -------------------------------------------------- ++ ++cMenuEditRecPathItem::cMenuEditRecPathItem(const char* Name, char* Path, ++ int Length): cMenuEditStrItem(Name, Path, Length, tr(FileNameChars)) ++{ ++ SetBase(Path); ++} ++ ++cMenuEditRecPathItem::~cMenuEditRecPathItem() ++{ ++} ++ ++void cMenuEditRecPathItem::SetBase(const char* Path) ++{ ++ if (!Path) ++ base[0] = 0; ++ Utf8Strn0Cpy(base, Path, sizeof(base)); ++ char* p = strrchr(base, '~'); ++ if (p) ++ p[0] = 0; ++ else ++ base[0] = 0; ++} ++ ++void cMenuEditRecPathItem::FindNextLevel() ++{ ++ char item[MaxFileName]; ++ ++ for (cRecording *recording = Recordings.First(); recording; recording = Recordings.Next(recording)) ++ { ++ char* p; ++ Utf8Strn0Cpy(item, recording->Name(), sizeof(item)); ++ stripspace(value); ++ lengthUtf8 = Utf8ToArray(value, valueUtf8, length); ++ if (!lengthUtf8) ++ p = strchr(item, '~'); ++ else { ++ if (strstr(item, value) != item) ++ continue; ++ if (item[strlen(value)] != '~') ++ continue; ++ p = strchr(item + strlen(value) + 1, '~'); ++ } ++ if (!p) ++ continue; ++ p[0] = 0; ++ Utf8Strn0Cpy(base, value, length); ++ Utf8Strn0Cpy(value, item, length); ++ lengthUtf8 = Utf8ToArray(value, valueUtf8, length); ++ return; ++ } ++} ++ ++void cMenuEditRecPathItem::Find(bool Next) ++{ ++ char item[MaxFileName]; ++ char lastItem[MaxFileName] = ""; ++ ++ for (cRecording *recording = Recordings.First(); recording; recording = Recordings.Next(recording)) ++ { ++ const char* recName = recording->Name(); ++ if (Utf8StrLen(base) && strstr(recName, base) != recName) ++ continue; ++ if (strlen(base) && recName[strlen(base)] != '~') ++ continue; ++ Utf8Strn0Cpy(item, recName, sizeof(item)); ++ char* p = strchr(item + strlen(base) + 1, '~'); ++ if (!p) ++ continue; ++ p[0] = 0; ++ if (!Next && (strcmp(item, value) == 0)) { ++ if (strlen(lastItem)) ++ Utf8Strn0Cpy(value, lastItem, length); ++ lengthUtf8 = Utf8ToArray(value, valueUtf8, length); ++ return; ++ } ++ if (strcmp(lastItem, item) != 0) { ++ if(Next && Utf8StrLen(lastItem) && strcmp(lastItem, value) == 0) { ++ Utf8Strn0Cpy(value, item, length); ++ lengthUtf8 = Utf8ToArray(value, valueUtf8, length); ++ return; ++ } ++ Utf8Strn0Cpy(lastItem, item, sizeof(lastItem)); ++ } ++ } ++} ++ ++void cMenuEditRecPathItem::SetHelpKeys(void) ++{ ++ cSkinDisplay::Current()->SetButtons(tr("Rename$Up"), tr("Rename$Down"), tr("Rename$Previous"), tr("Rename$Next")); ++} ++ ++eOSState cMenuEditRecPathItem::ProcessKey(eKeys Key) ++{ ++ switch (Key) { ++ case kLeft: ++ case kRed: // one level up ++ if (!InEditMode()) ++ return cMenuEditItem::ProcessKey(Key); ++ Utf8Strn0Cpy(value, base, lengthUtf8); ++ lengthUtf8 = Utf8ToArray(value, valueUtf8, length); ++ SetBase(base); ++ pos = Utf8StrLen(base); ++ if (pos) ++ pos++; ++ if (!lengthUtf8) { ++ Utf8Strn0Cpy(value, " ", length); ++ lengthUtf8 = Utf8ToArray(value, valueUtf8, length); ++ } ++ break; ++ case kRight: ++ case kGreen: // one level down ++ if (InEditMode()) ++ FindNextLevel(); ++ else ++ EnterEditMode(); ++ if (!lengthUtf8) { ++ Utf8Strn0Cpy(value, " ", length); ++ lengthUtf8 = Utf8ToArray(value, valueUtf8, length); ++ } ++ pos = Utf8StrLen(base); ++ if (pos) ++ pos++; ++ SetHelpKeys(); ++ break; ++ case kUp|k_Repeat: ++ case kUp: ++ case kYellow|k_Repeat: ++ case kYellow: // previous directory in list ++ if (!InEditMode()) ++ return cMenuEditItem::ProcessKey(Key); ++ Find(false); ++ pos = Utf8StrLen(base); ++ if (pos) ++ pos++; ++ break; ++ case kDown|k_Repeat: ++ case kDown: ++ case kBlue|k_Repeat: ++ case kBlue: // next directory in list ++ if (!InEditMode()) ++ return cMenuEditItem::ProcessKey(Key); ++ Find(true); ++ pos = Utf8StrLen(base); ++ if (pos) ++ pos++; ++ break; ++ case kOk: // done ++ if (!InEditMode()) ++ return cMenuEditItem::ProcessKey(Key); ++ stripspace(value); ++ lengthUtf8 = Utf8ToArray(value, valueUtf8, length); ++ cSkinDisplay::Current()->SetButtons(NULL); ++ LeaveEditMode(Key == kOk); ++ break; ++ default: ++ return cMenuEditItem::ProcessKey(Key); ++ } ++ Set(); ++ return osContinue; ++} ++ + // --- cMenuEditStraItem ----------------------------------------------------- + + cMenuEditStraItem::cMenuEditStraItem(const char *Name, int *Value, int NumStrings, const char * const *Strings) +diff -Nru vdr-1.6.0-vanilla/menuitems.h vdr-1.6.0-liemikuutio/menuitems.h +--- vdr-1.6.0-vanilla/menuitems.h 2008-03-27 21:43:25.000000000 +0200 ++++ vdr-1.6.0-liemikuutio/menuitems.h 2008-04-03 23:24:39.000000000 +0300 +@@ -78,26 +78,27 @@ + + class cMenuEditStrItem : public cMenuEditItem { + private: +- char *value; +- int length; +- const char *allowed; +- int pos, offset; ++ int offset; + bool insert, newchar, uppercase; +- int lengthUtf8; +- uint *valueUtf8; + uint *allowedUtf8; + uint *charMapUtf8; + uint *currentCharUtf8; + eKeys lastKey; + cTimeMs autoAdvanceTimeout; +- void SetHelpKeys(void); + uint *IsAllowed(uint c); + void AdvancePos(void); +- virtual void Set(void); + uint Inc(uint c, bool Up); + void Insert(void); + void Delete(void); + protected: ++ char *value; ++ int length; ++ uint *valueUtf8; ++ int lengthUtf8; ++ const char *allowed; ++ int pos; ++ void SetHelpKeys(void); ++ virtual void Set(void); + void EnterEditMode(void); + void LeaveEditMode(bool SaveValue = false); + bool InEditMode(void) { return valueUtf8 != NULL; } +@@ -107,6 +108,19 @@ + virtual eOSState ProcessKey(eKeys Key); + }; + ++class cMenuEditRecPathItem : public cMenuEditStrItem { ++protected: ++ char base[MaxFileName]; ++ virtual void SetHelpKeys(void); ++ void SetBase(const char* Path); ++ void FindNextLevel(); ++ void Find(bool Next); ++public: ++ cMenuEditRecPathItem(const char* Name, char* Path, int Length); ++ ~cMenuEditRecPathItem(); ++ virtual eOSState ProcessKey(eKeys Key); ++ }; ++ + class cMenuEditStraItem : public cMenuEditIntItem { + private: + const char * const *strings; +diff -Nru vdr-1.6.0-vanilla/osdbase.c vdr-1.6.0-liemikuutio/osdbase.c +--- vdr-1.6.0-vanilla/osdbase.c 2008-03-27 21:43:25.000000000 +0200 ++++ vdr-1.6.0-liemikuutio/osdbase.c 2008-03-27 21:47:56.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; + } + } +@@ -448,20 +449,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; + } + +@@ -500,8 +543,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.6.0-vanilla/osdbase.h vdr-1.6.0-liemikuutio/osdbase.h +--- vdr-1.6.0-vanilla/osdbase.h 2008-03-27 21:43:25.000000000 +0200 ++++ vdr-1.6.0-liemikuutio/osdbase.h 2008-03-27 21:47:56.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.6.0-vanilla/po/de_DE.po vdr-1.6.0-liemikuutio/po/de_DE.po +--- vdr-1.6.0-vanilla/po/de_DE.po 2008-03-27 21:43:25.000000000 +0200 ++++ vdr-1.6.0-liemikuutio/po/de_DE.po 2008-04-03 23:31:27.000000000 +0300 +@@ -998,3 +998,51 @@ + #, 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 "Länge" ++ ++msgid "Size" ++msgstr "Größe" ++ ++msgid "Path" ++msgstr "Pfad" ++ ++msgid "Rename$Up" ++msgstr "Höher" ++ ++msgid "Rename$Down" ++msgstr "Tiefer" ++ ++msgid "Rename$Previous" ++msgstr "Vorheriger" ++ ++msgid "Rename$Next" ++msgstr "Nächster" ++ ++msgid "Delete marks information?" ++msgstr "Marks löschen?" ++ ++msgid "Delete resume information?" ++msgstr "Resume löschen?" ++ ++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 "Länge der Aufnahme anzeigen" +diff -Nru vdr-1.6.0-vanilla/po/et_EE.po vdr-1.6.0-liemikuutio/po/et_EE.po +--- vdr-1.6.0-vanilla/po/et_EE.po 2008-03-27 21:43:25.000000000 +0200 ++++ vdr-1.6.0-liemikuutio/po/et_EE.po 2008-04-03 23:38:43.000000000 +0300 +@@ -998,3 +998,51 @@ + #, c-format + msgid "VDR will shut down in %s minutes" + msgstr "VDR lülitub välja %s minuti pärast" ++ ++msgid "Rename recording" ++msgstr "Ümbernimetamine" ++ ++msgid "Date" ++msgstr "" ++ ++msgid "Length" ++msgstr "" ++ ++msgid "Size" ++msgstr "" ++ ++msgid "Path" ++msgstr "" ++ ++msgid "Rename$Up" ++msgstr "Üles" ++ ++msgid "Rename$Down" ++msgstr "Alla" ++ ++msgid "Rename$Previous" ++msgstr "Eelmine" ++ ++msgid "Rename$Next" ++msgstr "Järgmine" ++ ++msgid "Delete marks information?" ++msgstr "" ++ ++msgid "Delete resume information?" ++msgstr "" ++ ++msgid "Setup.OSD$Main menu command position" ++msgstr "Käsu asukoht peamenüüs" ++ ++msgid "Setup.EPG$Show progress bar" ++msgstr "Edenemisriba" ++ ++msgid "Setup.Recording$Show date" ++msgstr "Salvestuse kuupäev" ++ ++msgid "Setup.Recording$Show time" ++msgstr "Salvestuse kellaaeg" ++ ++msgid "Setup.Recording$Show length" ++msgstr "Salvestuse pikkus" +diff -Nru vdr-1.6.0-vanilla/po/fi_FI.po vdr-1.6.0-liemikuutio/po/fi_FI.po +--- vdr-1.6.0-vanilla/po/fi_FI.po 2008-03-27 21:43:25.000000000 +0200 ++++ vdr-1.6.0-liemikuutio/po/fi_FI.po 2008-04-03 23:34:26.000000000 +0300 +@@ -1001,3 +1001,51 @@ + #, 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 "Päiväys" ++ ++msgid "Length" ++msgstr "Pituus" ++ ++msgid "Size" ++msgstr "Koko" ++ ++msgid "Path" ++msgstr "Polku" ++ ++msgid "Rename$Up" ++msgstr "Ylemmäs" ++ ++msgid "Rename$Down" ++msgstr "Alemmas" ++ ++msgid "Rename$Previous" ++msgstr "Edellinen" ++ ++msgid "Rename$Next" ++msgstr "Seuraava" ++ ++msgid "Delete marks information?" ++msgstr "Poista tallenteen merkinnät?" ++ ++msgid "Delete resume information?" ++msgstr "Poista tallenteen paluutiedot?" ++ ++msgid "Setup.OSD$Main menu command position" ++msgstr "Komentojen sijainti päävalikossa" ++ ++msgid "Setup.EPG$Show progress bar" ++msgstr "Näytä aikajana" ++ ++msgid "Setup.Recording$Show date" ++msgstr "Näytä tallenteen päiväys" ++ ++msgid "Setup.Recording$Show time" ++msgstr "Näytä tallenteen ajankohta" ++ ++msgid "Setup.Recording$Show length" ++msgstr "Näytä tallenteen kesto" +diff -Nru vdr-1.6.0-vanilla/po/fr_FR.po vdr-1.6.0-liemikuutio/po/fr_FR.po +--- vdr-1.6.0-vanilla/po/fr_FR.po 2008-03-27 21:43:25.000000000 +0200 ++++ vdr-1.6.0-liemikuutio/po/fr_FR.po 2008-04-03 23:36:49.000000000 +0300 +@@ -1004,3 +1004,51 @@ + #, c-format + msgid "VDR will shut down in %s minutes" + msgstr "VDR s'arrêtera dans %s minutes" ++ ++msgid "Rename recording" ++msgstr "Renommer l'enregistrement" ++ ++msgid "Date" ++msgstr "Date" ++ ++msgid "Length" ++msgstr "Longueur" ++ ++msgid "Size" ++msgstr "Taille" ++ ++msgid "Path" ++msgstr "" ++ ++msgid "Rename$Up" ++msgstr "Haut" ++ ++msgid "Rename$Down" ++msgstr "Bas" ++ ++msgid "Rename$Previous" ++msgstr "Précédent" ++ ++msgid "Rename$Next" ++msgstr "Suivant" ++ ++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 "Monter la longueur de l'enregistrement" +diff -Nru vdr-1.6.0-vanilla/po/ru_RU.po vdr-1.6.0-liemikuutio/po/ru_RU.po +--- vdr-1.6.0-vanilla/po/ru_RU.po 2008-03-27 21:43:25.000000000 +0200 ++++ vdr-1.6.0-liemikuutio/po/ru_RU.po 2008-03-27 21:47:57.000000000 +0200 +@@ -999,3 +999,36 @@ + #, 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 "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.6.0-vanilla/recording.c vdr-1.6.0-liemikuutio/recording.c +--- vdr-1.6.0-vanilla/recording.c 2008-03-27 21:43:25.000000000 +0200 ++++ vdr-1.6.0-liemikuutio/recording.c 2008-03-27 21:47:56.000000000 +0200 +@@ -46,6 +46,7 @@ + #endif + #define INFOFILESUFFIX "/info.vdr" + #define MARKSFILESUFFIX "/marks.vdr" ++#define INDEXFILESUFFIX "/index.vdr" + + #define MINDISKSPACE 1024 // MB + +@@ -62,6 +63,7 @@ + #define MAX_LINK_LEVEL 6 + + bool VfatFileSystem = false; ++bool DirOrderState = false; + + cRecordings DeletedRecordings(true); + +@@ -690,6 +692,8 @@ + int cRecording::Compare(const cListObject &ListObject) const + { + cRecording *r = (cRecording *)&ListObject; ++ if (DirOrderState) ++ return strcasecmp(FileName(), r->FileName()); + return strcasecmp(SortName(), r->SortName()); + } + +@@ -705,7 +709,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); +@@ -718,6 +722,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, +@@ -728,6 +733,39 @@ + New, + Delimiter, + s)); ++ } ++ else { ++ cString RecLength("---"); ++ if (Setup.ShowRecLength && FileName()) { ++ cString filename = cString::sprintf("%s%s", FileName(), INDEXFILESUFFIX); ++ if (*filename) { ++ if (access(filename, R_OK) == 0) { ++ struct stat buf; ++ if (stat(filename, &buf) == 0) { ++ struct tIndex { int offset; uchar type; uchar number; short reserved; }; ++ int delta = buf.st_size % sizeof(tIndex); ++ if (delta) { ++ delta = sizeof(tIndex) - delta; ++ esyslog("ERROR: invalid file size (%ld) in '%s'", buf.st_size, *filename); ++ } ++ RecLength = cString::sprintf("%ld'", (buf.st_size + delta) / sizeof(tIndex) / SecondsToFrames(60)); ++ } ++ } ++ } ++ } ++ 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 '~': + if (!NewIndicator) + stripspace(titleBuffer); +@@ -864,6 +902,41 @@ + resume = RESUME_NOT_INITIALIZED; + } + ++bool cRecording::Rename(const char *newName, int *newPriority, int *newLifetime) ++{ ++ bool result = false; ++ struct tm tm_r; ++ struct tm *t = localtime_r(&start, &tm_r); ++ char *localNewName = ExchangeChars(strdup(newName), true); ++ char *newFileName = strdup(cString::sprintf(NAMEFORMAT, VideoDirectory, localNewName, t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, *newPriority, *newLifetime)); ++ 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) { ++ priority = *newPriority; ++ lifetime = *newLifetime; ++ 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; +@@ -1172,8 +1245,6 @@ + //XXX+ somewhere else??? + // --- cIndexFile ------------------------------------------------------------ + +-#define INDEXFILESUFFIX "/index.vdr" +- + // The number of frames to stay off the end in case of time shift: + #define INDEXSAFETYLIMIT 150 // frames + +diff -Nru vdr-1.6.0-vanilla/recording.h vdr-1.6.0-liemikuutio/recording.h +--- vdr-1.6.0-vanilla/recording.h 2008-03-27 21:43:25.000000000 +0200 ++++ vdr-1.6.0-liemikuutio/recording.h 2008-03-27 21:47:57.000000000 +0200 +@@ -19,6 +19,7 @@ + #include "tools.h" + + extern bool VfatFileSystem; ++extern bool DirOrderState; + + void RemoveDeletedRecordings(void); + void AssertFreeDiskSpace(int Priority = 0, bool Force = false); +@@ -88,7 +89,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; +@@ -106,6 +107,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, int *newPriority, int *newLifetime); ++ // Changes the file name ++ // Returns false in case of error + }; + + class cRecordings : public cList<cRecording>, public cThread { +diff -Nru vdr-1.6.0-vanilla/svdrp.c vdr-1.6.0-liemikuutio/svdrp.c +--- vdr-1.6.0-vanilla/svdrp.c 2008-03-27 21:43:25.000000000 +0200 ++++ vdr-1.6.0-liemikuutio/svdrp.c 2008-03-27 21:47:56.000000000 +0200 +@@ -296,6 +296,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.", +@@ -1472,6 +1474,38 @@ + 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) { ++ int priority = recording->priority; ++ int lifetime = recording->lifetime; ++ char *oldName = strdup(recording->Name()); ++ tail = skipspace(tail); ++ if (recording->Rename(tail, &priority, &lifetime)) { ++ 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) { +@@ -1587,6 +1621,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.6.0-vanilla/svdrp.h vdr-1.6.0-liemikuutio/svdrp.h +--- vdr-1.6.0-vanilla/svdrp.h 2008-03-27 21:43:25.000000000 +0200 ++++ vdr-1.6.0-liemikuutio/svdrp.h 2008-03-27 21:47:56.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.6.0.orig/debian/patches/10_dd-record-option.dpatch +++ vdr-1.6.0/debian/patches/10_dd-record-option.dpatch @@ -0,0 +1,117 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 10_dd-record-option.dpatch by Thomas Schmidt <tschmidt@debian.org> +## +## Thomas Günther <tom@toms-cafe.de>: +## - adapted to VDR-1.5.0 +## - fixed i18n texts for replay +## - adapted to VDR-1.5.7 +## http://toms-cafe.de/vdr/download/vdr-dd-record-option-1.5.7.diff +## - added French language texts (thanks to Michaël Nival) +## http://toms-cafe.de/vdr/download/vdr-dd-record-option-1.6.0.diff +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Allows to choose if to record and to replay Dolby Digital +## DP: independently (to work around some audio issues with the +## DP: dvd-plugin) + +@DPATCH@ +--- vdr-1.6.0/config.c ++++ vdr-1.6.0/config.c +@@ -259,6 +259,7 @@ cSetup::cSetup(void) + VideoDisplayFormat = 1; + VideoFormat = 0; + UpdateChannels = 5; ++ RecordDolbyDigital = 1; + UseDolbyDigital = 1; + ChannelInfoPos = 0; + ChannelInfoTime = 5; +@@ -432,6 +433,7 @@ bool cSetup::Parse(const char *Name, con + else if (!strcasecmp(Name, "VideoDisplayFormat")) VideoDisplayFormat = atoi(Value); + else if (!strcasecmp(Name, "VideoFormat")) VideoFormat = atoi(Value); + else if (!strcasecmp(Name, "UpdateChannels")) UpdateChannels = atoi(Value); ++ else if (!strcasecmp(Name, "RecordDolbyDigital")) RecordDolbyDigital = atoi(Value); + else if (!strcasecmp(Name, "UseDolbyDigital")) UseDolbyDigital = atoi(Value); + else if (!strcasecmp(Name, "ChannelInfoPos")) ChannelInfoPos = atoi(Value); + else if (!strcasecmp(Name, "ChannelInfoTime")) ChannelInfoTime = atoi(Value); +@@ -515,6 +517,7 @@ bool cSetup::Save(void) + Store("VideoDisplayFormat", VideoDisplayFormat); + Store("VideoFormat", VideoFormat); + Store("UpdateChannels", UpdateChannels); ++ Store("RecordDolbyDigital", RecordDolbyDigital); + Store("UseDolbyDigital", UseDolbyDigital); + Store("ChannelInfoPos", ChannelInfoPos); + Store("ChannelInfoTime", ChannelInfoTime); +--- vdr-1.6.0/config.h ++++ vdr-1.6.0/config.h +@@ -241,6 +241,7 @@ public: + int VideoDisplayFormat; + int VideoFormat; + int UpdateChannels; ++ int RecordDolbyDigital; + int UseDolbyDigital; + int ChannelInfoPos; + int ChannelInfoTime; +--- vdr-1.6.0/menu.c ++++ vdr-1.6.0/menu.c +@@ -2488,7 +2488,8 @@ void cMenuSetupDVB::Setup(void) + Add(new cMenuEditBoolItem(tr("Setup.DVB$Video format"), &data.VideoFormat, "4:3", "16:9")); + if (data.VideoFormat == 0) + Add(new cMenuEditStraItem(tr("Setup.DVB$Video display format"), &data.VideoDisplayFormat, 3, videoDisplayFormatTexts)); +- Add(new cMenuEditBoolItem(tr("Setup.DVB$Use Dolby Digital"), &data.UseDolbyDigital)); ++ Add(new cMenuEditBoolItem(tr("Setup.DVB$Record Dolby Digital"), &data.RecordDolbyDigital)); ++ Add(new cMenuEditBoolItem(tr("Setup.DVB$Replay Dolby Digital"), &data.UseDolbyDigital)); + Add(new cMenuEditStraItem(tr("Setup.DVB$Update channels"), &data.UpdateChannels, 6, updateChannelsTexts)); + Add(new cMenuEditIntItem( tr("Setup.DVB$Audio languages"), &numAudioLanguages, 0, I18nLanguages()->Size())); + for (int i = 0; i < numAudioLanguages; i++) +--- vdr-1.6.0/po/de_DE.po ++++ vdr-1.6.0/po/de_DE.po +@@ -620,8 +620,11 @@ msgstr "Videoformat" + msgid "Setup.DVB$Video display format" + msgstr "Video-Anzeigeformat" + +-msgid "Setup.DVB$Use Dolby Digital" +-msgstr "Dolby-Digital-Ton benutzen" ++msgid "Setup.DVB$Record Dolby Digital" ++msgstr "Dolby-Digital-Ton aufzeichnen" ++ ++msgid "Setup.DVB$Replay Dolby Digital" ++msgstr "Dolby-Digital-Ton wiedergeben" + + msgid "Setup.DVB$Update channels" + msgstr "Kanäle aktualisieren" +--- vdr-1.6.0/po/fr_FR.po ++++ vdr-1.6.0/po/fr_FR.po +@@ -626,8 +626,11 @@ msgstr "Format vidéo" + msgid "Setup.DVB$Video display format" + msgstr "Format d'affichage" + +-msgid "Setup.DVB$Use Dolby Digital" +-msgstr "Utiliser le Dolby Digital" ++msgid "Setup.DVB$Record Dolby Digital" ++msgstr "Enregistrer le Dolby Digital" ++ ++msgid "Setup.DVB$Replay Dolby Digital" ++msgstr "Lire le Dolby Digital" + + msgid "Setup.DVB$Update channels" + msgstr "Mettre à jour les chaînes" +--- vdr-1.6.0/recorder.c ++++ vdr-1.6.0/recorder.c +@@ -127,7 +127,7 @@ void cFileWriter::Action(void) + // --- cRecorder ------------------------------------------------------------- + + cRecorder::cRecorder(const char *FileName, tChannelID ChannelID, int Priority, int VPid, const int *APids, const int *DPids, const int *SPids) +-:cReceiver(ChannelID, Priority, VPid, APids, Setup.UseDolbyDigital ? DPids : NULL, SPids) ++:cReceiver(ChannelID, Priority, VPid, APids, Setup.RecordDolbyDigital ? DPids : NULL, SPids) + ,cThread("recording") + { + // Make sure the disk is up and running: +@@ -136,7 +136,7 @@ cRecorder::cRecorder(const char *FileNam + + ringBuffer = new cRingBufferLinear(RECORDERBUFSIZE, TS_SIZE * 2, true, "Recorder"); + ringBuffer->SetTimeouts(0, 100); +- remux = new cRemux(VPid, APids, Setup.UseDolbyDigital ? DPids : NULL, SPids, true); ++ remux = new cRemux(VPid, APids, Setup.RecordDolbyDigital ? DPids : NULL, SPids, true); + writer = new cFileWriter(FileName, remux); + } + --- vdr-1.6.0.orig/debian/patches/81_Make_config.dpatch +++ vdr-1.6.0/debian/patches/81_Make_config.dpatch @@ -0,0 +1,40 @@ +#!/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@ +diff -urNad vdr-1.6.0~/Make.config vdr-1.6.0/Make.config +--- vdr-1.6.0~/Make.config 1970-01-01 01:00:00.000000000 +0100 ++++ vdr-1.6.0/Make.config 2008-04-13 12:11:55.000000000 +0200 +@@ -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 ++ ++ifndef BUILDVDR ++ # Required for plugins only, not for VDR itself ++ CXXFLAGS += -fPIC ++ CFLAGS += -fPIC ++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 --- vdr-1.6.0.orig/debian/patches/opt-30-x_analogtv.dpatch +++ vdr-1.6.0/debian/patches/opt-30-x_analogtv.dpatch @@ -0,0 +1,25 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run + +## opt-30-x_analogtv.dpatch by Andreas Kool <akool@gmx.de> +## +## extracted from the analogtv plugin 0.3.6 +## original file: vdr-1.3.0.patch +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: This patch is needed for the analogtv plugin. + +@DPATCH@ +--- vdr-1.3.0.orig/channels.c 2004-01-04 13:28:49.000000000 +0100 ++++ vdr-1.3.0/channels.c 2004-01-04 18:50:40.000000000 +0100 +@@ -347,9 +347,9 @@ + ST(" S ") q += sprintf(q, "%c", polarization); + ST("CST") q += PrintParameter(q, 'I', MapToUser(inversion, InversionValues)); + ST("CST") q += PrintParameter(q, 'C', MapToUser(coderateH, CoderateValues)); +- ST(" T") q += PrintParameter(q, 'D', MapToUser(coderateL, CoderateValues)); ++ ST("C T") q += PrintParameter(q, 'D', MapToUser(coderateL, CoderateValues)); + ST("C T") q += PrintParameter(q, 'M', MapToUser(modulation, ModulationValues)); +- ST(" T") q += PrintParameter(q, 'B', MapToUser(bandwidth, BandwidthValues)); ++ ST("C T") q += PrintParameter(q, 'B', MapToUser(bandwidth, BandwidthValues)); + ST(" T") q += PrintParameter(q, 'T', MapToUser(transmission, TransmissionValues)); + ST(" T") q += PrintParameter(q, 'G', MapToUser(guard, GuardValues)); + ST(" T") q += PrintParameter(q, 'Y', MapToUser(hierarchy, HierarchyValues)); --- vdr-1.6.0.orig/debian/patches/opt-53_dvbsetup.dpatch +++ vdr-1.6.0/debian/patches/opt-53_dvbsetup.dpatch @@ -0,0 +1,150 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-53_dvbsetup.dpatch by Tobias Grimm <tg@e-tobi.net> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Setup for AC3 transfer, QAM_256, disable primary tuner +## DP: Taken from the Zulu extensions patch +## DP: See http://www.zulu-entertainment.de/download.php?group=VDR + +@DPATCH@ +diff -urNad vdr-1.6.0~/config.c vdr-1.6.0/config.c +--- vdr-1.6.0~/config.c 2008-07-25 23:53:03.000000000 +0200 ++++ vdr-1.6.0/config.c 2008-07-25 23:53:52.000000000 +0200 +@@ -253,6 +253,9 @@ + strcpy(OSDLanguage, ""); // default is taken from environment + strcpy(OSDSkin, "sttng"); + strcpy(OSDTheme, "default"); ++ DolbyTransferFix = 1; ++ NoQamOnDecoder = 0; ++ TurnOffPrimary = 0; + PrimaryDVB = 1; + ShowInfoOnChSwitch = 1; + TimeoutRequChInfo = 1; +@@ -497,6 +500,9 @@ + 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, "DolbyTransferFix")) DolbyTransferFix = atoi(Value); ++ else if (!strcasecmp(Name, "NoQamOnDecoder")) NoQamOnDecoder = atoi(Value); ++ else if (!strcasecmp(Name, "TurnOffPrimary")) TurnOffPrimary = 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); +@@ -601,6 +607,9 @@ + + bool cSetup::Save(void) + { ++ Store("DolbyTransferFix", DolbyTransferFix); ++ Store("NoQamOnDecoder", NoQamOnDecoder); ++ Store("TurnOffPrimary", TurnOffPrimary); + Store("OSDLanguage", OSDLanguage); + Store("OSDSkin", OSDSkin); + Store("OSDTheme", OSDTheme); +diff -urNad vdr-1.6.0~/config.h vdr-1.6.0/config.h +--- vdr-1.6.0~/config.h 2008-07-25 23:53:03.000000000 +0200 ++++ vdr-1.6.0/config.h 2008-07-25 23:53:03.000000000 +0200 +@@ -228,6 +228,9 @@ + public: + // Also adjust cMenuSetup (menu.c) when adding parameters here! + int __BeginData__; ++ int DolbyTransferFix; ++ int NoQamOnDecoder; ++ int TurnOffPrimary; + char OSDLanguage[I18N_MAX_LOCALE_LEN]; + char OSDSkin[MaxSkinName]; + char OSDTheme[MaxThemeName]; +diff -urNad vdr-1.6.0~/dvbdevice.c vdr-1.6.0/dvbdevice.c +--- vdr-1.6.0~/dvbdevice.c 2008-07-25 23:53:03.000000000 +0200 ++++ vdr-1.6.0/dvbdevice.c 2008-07-25 23:53:03.000000000 +0200 +@@ -438,7 +438,10 @@ + if (fd_frontend >= 0) { + dvb_frontend_info feinfo; + if (ioctl(fd_frontend, FE_GET_INFO, &feinfo) >= 0) { +- frontendType = feinfo.type; ++ if (Setup.TurnOffPrimary) ++ frontendType = n == Setup.PrimaryDVB - 1 ? frontendType : feinfo.type; ++ else ++ frontendType = feinfo.type; + dvbTuner = new cDvbTuner(fd_frontend, CardIndex(), frontendType); + } + else +@@ -657,6 +660,11 @@ + + 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; +@@ -776,11 +784,21 @@ + + bool cDvbDevice::ProvidesTransponder(const cChannel *Channel) const + { ++ if (Setup.NoQamOnDecoder) { ++ if (HasDecoder() && (cSource::IsCable(Channel->Source())) && (fe_modulation_t(Channel->Modulation()) == QAM_256)) ++ return false; ++ } ++ + return ProvidesSource(Channel->Source()) && (!cSource::IsSat(Channel->Source()) || !Setup.DiSEqC || Diseqcs.Get(Channel->Source(), Channel->Frequency(), Channel->Polarization())); + } + + bool cDvbDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers) const + { ++ if (Setup.NoQamOnDecoder) { ++ if (HasDecoder() && (cSource::IsCable(Channel->Source())) && (fe_modulation_t(Channel->Modulation()) == QAM_256)) ++ return false; ++ } ++ + bool result = false; + bool hasPriority = Priority < 0 || Priority > this->Priority(); + bool needsDetachReceivers = false; +diff -urNad vdr-1.6.0~/menu.c vdr-1.6.0/menu.c +--- vdr-1.6.0~/menu.c 2008-07-25 23:53:03.000000000 +0200 ++++ vdr-1.6.0/menu.c 2008-07-25 23:53:03.000000000 +0200 +@@ -3033,6 +3033,10 @@ + Add(new cMenuEditIntItem( tr("Setup.LNB$High LNB frequency (MHz)"), &data.LnbFrequHi)); + } + ++ Add(new cMenuEditBoolItem(tr("Setup.DVB$Use AC3-Transfer Fix"), &data.DolbyTransferFix)); ++ Add(new cMenuEditBoolItem(tr("Setup.DVB$No Qam256 on Cards with Decoder"), &data.NoQamOnDecoder)); ++ Add(new cMenuEditBoolItem(tr("Setup.DVB$Turn off Primary Tuner"), &data.TurnOffPrimary)); ++ + SetCurrent(Get(current)); + Display(); + } +diff -urNad vdr-1.6.0~/remux.c vdr-1.6.0/remux.c +--- vdr-1.6.0~/remux.c 2008-07-25 23:53:03.000000000 +0200 ++++ vdr-1.6.0/remux.c 2008-07-25 23:53:03.000000000 +0200 +@@ -1879,8 +1879,10 @@ + if (Buf[1] & TS_ERROR) + tsErrors++; + +- if (!(Buf[3] & (ADAPT_FIELD | PAY_LOAD))) ++ if (!(Buf[3] & (ADAPT_FIELD | PAY_LOAD))) { ++ dsyslog("TS packet discarded due to invalid adaption_field_control"); + return; // discard TS packet with adaption_field_control set to '00'. ++ } + + if ((Buf[3] & PAY_LOAD) && ((Buf[3] ^ ccCounter) & CONT_CNT_MASK)) { + // This should check duplicates and packets which do not increase the counter. +@@ -1892,6 +1894,7 @@ + // These are the errors I used to get with Nova-T when antenna + // was not positioned correcly (not transport errors). //tvr + //dsyslog("TS continuity error (%d)", ccCounter); ++ dsyslog("TS continuity error (%d)", ccCounter); + } + ccCounter = Buf[3] & CONT_CNT_MASK; + } +@@ -1917,6 +1920,8 @@ + + if (Buf[3] & PAY_LOAD) + instant_repack(Buf + 4 + off, TS_SIZE - 4 - off); ++ else if (off + 4 < 188) ++ dsyslog("adaption_field zu short or PAY_LOAD not set"); + } + + // --- cRingBufferLinearPes -------------------------------------------------- --- vdr-1.6.0.orig/debian/patches/16_channels.conf.terr-fix.dpatch +++ vdr-1.6.0/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.6.0.orig/debian/patches/opt-45_yaepg.dpatch +++ vdr-1.6.0/debian/patches/opt-45_yaepg.dpatch @@ -0,0 +1,90 @@ +#! /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 Günther <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 +## Tobias Grimm <tg@e-tobi.net>: +## - applied modification from Michaël 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@ +--- vdr-1.5.10/device.h ++++ vdr-1.5.10/device.h +@@ -238,12 +238,12 @@ + ///< 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; } +--- vdr-1.5.10/dvbosd.c ++++ vdr-1.5.10/dvbosd.c +@@ -80,6 +80,10 @@ void cDvbOsd::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; + } + } +@@ -115,6 +119,10 @@ eOsdError cDvbOsd::SetAreas(const tArea + 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); +@@ -198,6 +206,11 @@ void cDvbOsd::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; + } + } +--- vdr-1.5.10/osd.c ++++ vdr-1.5.10/osd.c +@@ -737,6 +737,7 @@ cOsd::cOsd(int Left, int Top, uint Level + } + } + Osds.Append(this); ++ vidWin.bpp = 0; + } + + cOsd::~cOsd() +--- vdr-1.5.10/osd.h ++++ vdr-1.5.10/osd.h +@@ -400,6 +400,7 @@ + ///< 7: vertical, falling, upper + virtual void Flush(void); + ///< Actually commits all data to the OSD hardware. ++ tArea vidWin; + }; + + class cOsdProvider { --- vdr-1.6.0.orig/debian/patches/opt-44_rotor.dpatch +++ vdr-1.6.0/debian/patches/opt-44_rotor.dpatch @@ -0,0 +1,118 @@ +#! /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 +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: This patch is needed for the rotor plugin. + +@DPATCH@ +diff -ubw vdr-1.5.5/device.h vdr-1.5.5-Rotor/device.h +--- vdr-1.5.5/device.h 2007-01-13 12:33:57.000000000 +0100 ++++ vdr-1.5.5-Rotor/device.h 2007-06-30 21:27:45.000000000 +0200 +@@ -22,6 +22,7 @@ + #include "spu.h" + #include "thread.h" + #include "tools.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 +@@ -256,6 +257,7 @@ + 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 -ubw vdr-1.5.5/dvbdevice.c vdr-1.5.5-Rotor/dvbdevice.c +--- vdr-1.5.5/dvbdevice.c 2007-02-25 12:46:52.000000000 +0100 ++++ vdr-1.5.5-Rotor/dvbdevice.c 2007-06-30 21:28:47.000000000 +0200 +@@ -71,6 +71,7 @@ + class cDvbTuner : public cThread { + private: + enum eTunerStatus { tsIdle, tsSet, tsTuned, tsLocked }; ++ bool SendDiseqc; + int fd_frontend; + int cardIndex; + int tuneTimeout; +@@ -83,6 +84,7 @@ + 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); +@@ -91,6 +93,7 @@ + virtual ~cDvbTuner(); + bool IsTunedTo(const cChannel *Channel) const; + void Set(const cChannel *Channel, bool Tune); ++ bool SendDiseqcCmd(dvb_diseqc_master_cmd cmd); + bool Locked(int TimeoutMs = 0); + }; + +@@ -97,6 +100,7 @@ + cDvbTuner::cDvbTuner(int Fd_Frontend, int CardIndex, fe_type_t FrontendType) + { + fd_frontend = Fd_Frontend; ++ SendDiseqc=false; + cardIndex = CardIndex; + frontendType = FrontendType; + tuneTimeout = 0; +@@ -145,6 +149,17 @@ + return tunerStatus >= tsLocked; + } + ++bool cDvbTuner::SendDiseqcCmd(dvb_diseqc_master_cmd cmd) ++{ ++ cMutexLock MutexLock(&mutex); ++ if (frontendType!=FE_QPSK || SendDiseqc) ++ return false; ++ diseqc_cmd=cmd; ++ SendDiseqc=true; ++ newSet.Broadcast(); ++ return true; ++} ++ + bool cDvbTuner::GetFrontendStatus(fe_status_t &Status, int TimeoutMs) + { + if (TimeoutMs) { +@@ -297,6 +312,10 @@ + 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; +@@ -858,6 +877,11 @@ + return dvbTuner ? dvbTuner->Locked(TimeoutMs) : false; + } + ++bool cDvbDevice::SendDiseqcCmd(dvb_diseqc_master_cmd cmd) ++{ ++ return dvbTuner->SendDiseqcCmd(cmd); ++} ++ + int cDvbDevice::GetAudioChannelDevice(void) + { + if (HasDecoder()) { +diff -ubw vdr-1.5.5/dvbdevice.h vdr-1.5.5-Rotor/dvbdevice.h +--- vdr-1.5.5/dvbdevice.h 2007-02-25 13:23:57.000000000 +0100 ++++ vdr-1.5.5-Rotor/dvbdevice.h 2007-06-30 21:27:45.000000000 +0200 +@@ -71,6 +71,7 @@ + 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.6.0.orig/debian/patches/opt-40_iptv.dpatch +++ vdr-1.6.0/debian/patches/opt-40_iptv.dpatch @@ -0,0 +1,296 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-40_iptv.dpatch by Tobias Grimm <tg@e-tobi.net> +## from version 0.0.7 of the IPTV plugin +## http://www.saunalahti.fi/~rahrenbe/vdr/iptv/ +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Patch required for the IPTV plugin + +@DPATCH@ +diff -urNad vdr-1.5.18~/channels.c vdr-1.5.18/channels.c +--- vdr-1.5.18~/channels.c 2008-03-16 16:08:41.000000000 +0100 ++++ vdr-1.5.18/channels.c 2008-03-16 16:08:41.000000000 +0100 +@@ -166,6 +166,7 @@ + shortName = strdup(""); + provider = strdup(""); + portalName = strdup(""); ++ pluginParam = strdup(""); + memset(&__BeginData__, 0, (char *)&__EndData__ - (char *)&__BeginData__); + inversion = INVERSION_AUTO; + bandwidth = BANDWIDTH_AUTO; +@@ -187,6 +188,7 @@ + shortName = NULL; + provider = NULL; + portalName = NULL; ++ pluginParam = NULL; + schedule = NULL; + linkChannels = NULL; + refChannel = NULL; +@@ -215,6 +217,7 @@ + free(shortName); + free(provider); + free(portalName); ++ free(pluginParam); + } + + cChannel& cChannel::operator= (const cChannel &Channel) +@@ -223,6 +226,7 @@ + shortName = strcpyrealloc(shortName, Channel.shortName); + provider = strcpyrealloc(provider, Channel.provider); + portalName = strcpyrealloc(portalName, Channel.portalName); ++ pluginParam = strcpyrealloc(pluginParam, Channel.pluginParam); + memcpy(&__BeginData__, &Channel.__BeginData__, (char *)&Channel.__EndData__ - (char *)&Channel.__BeginData__); + return *this; + } +@@ -280,9 +284,26 @@ + transmission = Channel->transmission; + guard = Channel->guard; + hierarchy = Channel->hierarchy; ++ if (IsPlug()) pluginParam = strcpyrealloc(pluginParam, Channel->pluginParam); + } + } + ++bool cChannel::SetPlugTransponderData(int Source, int Frequency, const char *PluginParam) ++{ ++ if (source != Source || frequency != Frequency || (strcmp(pluginParam, PluginParam) != 0)) { ++ if (Number()) { ++ dsyslog("changing transponder data of channel %d from %s:%d:%s to %s:%d:%s", Number(), *cSource::ToString(source), frequency, pluginParam, *cSource::ToString(Source), Frequency, PluginParam); ++ modification |= CHANNELMOD_TRANSP; ++ Channels.SetModified(); ++ } ++ source = Source; ++ frequency = Frequency; ++ pluginParam = strcpyrealloc(pluginParam, PluginParam); ++ schedule = NULL; ++ } ++ return true; ++} ++ + bool cChannel::SetSatTransponderData(int Source, int Frequency, char Polarization, int Srate, int CoderateH) + { + // Workarounds for broadcaster stupidity: +@@ -407,6 +428,18 @@ + } + } + ++void cChannel::SetPluginParam(const char *PluginParam) ++{ ++ if (!isempty(PluginParam) && strcmp(pluginParam, PluginParam) != 0) { ++ if (Number()) { ++ dsyslog("changing plugin parameters of channel %d from '%s' to '%s'", Number(), pluginParam, PluginParam); ++ modification |= CHANNELMOD_TRANSP; ++ Channels.SetModified(); ++ } ++ pluginParam = strcpyrealloc(pluginParam, PluginParam); ++ } ++} ++ + #define STRDIFF 0x01 + #define VALDIFF 0x02 + +@@ -593,7 +626,7 @@ + if (isdigit(type)) + type = 'S'; + #define ST(s) if (strchr(s, type)) +- char buffer[64]; ++ char buffer[256]; + char *q = buffer; + *q = 0; + ST(" S ") q += sprintf(q, "%c", polarization); +@@ -605,6 +638,7 @@ + ST(" T") q += PrintParameter(q, 'T', MapToUser(transmission, TransmissionValues)); + ST(" T") q += PrintParameter(q, 'G', MapToUser(guard, GuardValues)); + ST(" T") q += PrintParameter(q, 'Y', MapToUser(hierarchy, HierarchyValues)); ++ ST("P ") snprintf(buffer, sizeof(buffer), "%s", pluginParam); + return buffer; + } + +@@ -626,7 +660,7 @@ + + bool cChannel::StringToParameters(const char *s) + { +- while (s && *s) { ++ while (s && *s && !IsPlug()) { + switch (toupper(*s)) { + case 'B': s = ParseParameter(s, bandwidth, BandwidthValues); break; + case 'C': s = ParseParameter(s, coderateH, CoderateValues); break; +@@ -736,7 +770,7 @@ + dpids[0] = 0; + ok = false; + if (parambuf && sourcebuf && vpidbuf && apidbuf) { +- ok = StringToParameters(parambuf) && (source = cSource::FromString(sourcebuf)) >= 0; ++ ok = ((source = cSource::FromString(sourcebuf)) >= 0) && StringToParameters(parambuf); + + char *p = strchr(vpidbuf, '+'); + if (p) +@@ -827,6 +861,7 @@ + shortName = strcpyrealloc(shortName, p); + } + name = strcpyrealloc(name, namebuf); ++ if (IsPlug()) pluginParam = strcpyrealloc(pluginParam, parambuf); + + free(parambuf); + free(sourcebuf); +diff -urNad vdr-1.5.18~/channels.h vdr-1.5.18/channels.h +--- vdr-1.5.18~/channels.h 2008-02-08 14:48:31.000000000 +0100 ++++ vdr-1.5.18/channels.h 2008-03-16 16:08:41.000000000 +0100 +@@ -114,6 +114,7 @@ + char *shortName; + char *provider; + char *portalName; ++ char *pluginParam; + int __BeginData__; + int frequency; // MHz + int source; +@@ -165,6 +166,7 @@ + int Frequency(void) const { return frequency; } ///< Returns the actual frequency, as given in 'channels.conf' + int Transponder(void) const; ///< Returns the transponder frequency in MHz, plus the polarization in case of sat + static int Transponder(int Frequency, char Polarization); ///< builds the transponder from the given Frequency and Polarization ++ const char *PluginParam(void) const { return pluginParam; } + int Source(void) const { return source; } + int Srate(void) const { return srate; } + int Vpid(void) const { return vpid; } +@@ -199,6 +201,7 @@ + int Hierarchy(void) const { return hierarchy; } + const cLinkChannels* LinkChannels(void) const { return linkChannels; } + const cChannel *RefChannel(void) const { return refChannel; } ++ bool IsPlug(void) const { return cSource::IsPlug(source); } + bool IsCable(void) const { return cSource::IsCable(source); } + bool IsSat(void) const { return cSource::IsSat(source); } + bool IsTerr(void) const { return cSource::IsTerr(source); } +@@ -206,12 +209,14 @@ + bool HasTimer(void) const; + int Modification(int Mask = CHANNELMOD_ALL); + void CopyTransponderData(const cChannel *Channel); ++ bool SetPlugTransponderData(int Source, int Frequency, const char *PluginParam); + bool SetSatTransponderData(int Source, int Frequency, char Polarization, int Srate, int CoderateH); + bool SetCableTransponderData(int Source, int Frequency, int Modulation, int Srate, int CoderateH); + bool SetTerrTransponderData(int Source, int Frequency, int Bandwidth, int Modulation, int Hierarchy, int CodeRateH, int CodeRateL, int Guard, int Transmission); + void SetId(int Nid, int Tid, int Sid, int Rid = 0); + void SetName(const char *Name, const char *ShortName, const char *Provider); + void SetPortalName(const char *PortalName); ++ void SetPluginParam(const char *PluginParam); + void SetPids(int Vpid, int Ppid, int *Apids, char ALangs[][MAXLANGCODE2], int *Dpids, char DLangs[][MAXLANGCODE2], int *Spids, char SLangs[][MAXLANGCODE2], int Tpid); + void SetCaIds(const int *CaIds); // list must be zero-terminated + void SetCaDescriptors(int Level); +diff -urNad vdr-1.5.18~/config.h vdr-1.5.18/config.h +--- vdr-1.5.18~/config.h 2008-03-16 16:08:41.000000000 +0100 ++++ vdr-1.5.18/config.h 2008-03-16 16:08:41.000000000 +0100 +@@ -30,6 +30,8 @@ + #define APIVERSION "1.5.15" + #define APIVERSNUM 10515 // Version * 10000 + Major * 100 + Minor + ++#define PLUGINPARAMPATCHVERSNUM 1 ++ + // When loading plugins, VDR searches them by their APIVERSION, which + // may be smaller than VDRVERSION in case there have been no changes to + // VDR header files since the last APIVERSION. This allows compiled +diff -urNad vdr-1.5.18~/menu.c vdr-1.5.18/menu.c +--- vdr-1.5.18~/menu.c 2008-03-16 16:08:41.000000000 +0100 ++++ vdr-1.5.18/menu.c 2008-03-16 16:08:41.000000000 +0100 +@@ -256,6 +256,7 @@ + cChannel *channel; + cChannel data; + char name[256]; ++ char pluginParam[256]; + void Setup(void); + public: + cMenuEditChannel(cChannel *Channel, bool New = false); +@@ -288,6 +289,7 @@ + + // Parameters for all types of sources: + strn0cpy(name, data.name, sizeof(name)); ++ strn0cpy(pluginParam, data.pluginParam, sizeof(pluginParam)); + Add(new cMenuEditStrItem( tr("Name"), name, sizeof(name))); + Add(new cMenuEditSrcItem( tr("Source"), &data.source)); + Add(new cMenuEditIntItem( tr("Frequency"), &data.frequency)); +@@ -318,6 +320,7 @@ + ST(" T") Add(new cMenuEditMapItem( tr("Transmission"), &data.transmission, TransmissionValues)); + ST(" T") Add(new cMenuEditMapItem( tr("Guard"), &data.guard, GuardValues)); + ST(" T") Add(new cMenuEditMapItem( tr("Hierarchy"), &data.hierarchy, HierarchyValues, tr("none"))); ++ ST("P ") Add(new cMenuEditStrItem( tr("Parameters"), pluginParam, sizeof(pluginParam), tr(FileNameChars))); + + SetCurrent(Get(current)); + Display(); +@@ -332,6 +335,7 @@ + if (Key == kOk) { + if (Channels.HasUniqueChannelID(&data, channel)) { + data.name = strcpyrealloc(data.name, name); ++ data.pluginParam = strcpyrealloc(data.pluginParam, pluginParam); + if (channel) { + *channel = data; + isyslog("edited channel %d %s", channel->Number(), *data.ToText()); +diff -urNad vdr-1.5.18~/po/fi_FI.po vdr-1.5.18/po/fi_FI.po +--- vdr-1.5.18~/po/fi_FI.po 2008-03-16 16:08:41.000000000 +0100 ++++ vdr-1.5.18/po/fi_FI.po 2008-03-16 16:09:59.000000000 +0100 +@@ -1034,3 +1034,6 @@ + + msgid "Setup.Recording$Show length" + msgstr "Näytä tallenteen kesto" ++ ++msgid "Parameters" ++msgstr "Parametrit" +diff -urNad vdr-1.5.18~/po/fr_FR.po vdr-1.5.18/po/fr_FR.po +--- vdr-1.5.18~/po/fr_FR.po 2008-03-16 16:08:41.000000000 +0100 ++++ vdr-1.5.18/po/fr_FR.po 2008-03-16 16:10:20.000000000 +0100 +@@ -1037,3 +1037,6 @@ + + msgid "Setup.Recording$Show length" + msgstr "Monter la longueur de l'enregistrement" ++ ++msgid "Parameters" ++msgstr "Paramètres" +diff -urNad vdr-1.5.18~/sources.c vdr-1.5.18/sources.c +--- vdr-1.5.18~/sources.c 2008-02-10 15:07:26.000000000 +0100 ++++ vdr-1.5.18/sources.c 2008-03-16 16:08:41.000000000 +0100 +@@ -37,6 +37,7 @@ + char buffer[16]; + char *q = buffer; + switch (Code & st_Mask) { ++ case stPlug: *q++ = 'P'; break; + case stCable: *q++ = 'C'; break; + case stSat: *q++ = 'S'; + { +@@ -56,6 +57,7 @@ + { + int type = stNone; + switch (toupper(*s)) { ++ case 'P': type = stPlug; break; + case 'C': type = stCable; break; + case 'S': type = stSat; break; + case 'T': type = stTerr; break; +diff -urNad vdr-1.5.18~/sources.conf vdr-1.5.18/sources.conf +--- vdr-1.5.18~/sources.conf 2007-02-17 17:15:13.000000000 +0100 ++++ vdr-1.5.18/sources.conf 2008-03-16 16:08:41.000000000 +0100 +@@ -188,3 +188,7 @@ + # Terrestrial + + T Terrestrial ++ ++# Plugin ++ ++P Plugin +diff -urNad vdr-1.5.18~/sources.h vdr-1.5.18/sources.h +--- vdr-1.5.18~/sources.h 2005-05-14 11:30:41.000000000 +0200 ++++ vdr-1.5.18/sources.h 2008-03-16 16:08:41.000000000 +0100 +@@ -16,10 +16,11 @@ + public: + enum eSourceType { + stNone = 0x0000, ++ stPlug = 0x2000, + stCable = 0x4000, + stSat = 0x8000, + stTerr = 0xC000, +- st_Mask = 0xC000, ++ st_Mask = 0xE000, + st_Neg = 0x0800, + st_Pos = 0x07FF, + }; +@@ -35,6 +36,7 @@ + static cString ToString(int Code); + static int FromString(const char *s); + static int FromData(eSourceType SourceType, int Position = 0, bool East = false); ++ static bool IsPlug(int Code) { return (Code & st_Mask) == stPlug; } + static bool IsCable(int Code) { return (Code & st_Mask) == stCable; } + static bool IsSat(int Code) { return (Code & st_Mask) == stSat; } + static bool IsTerr(int Code) { return (Code & st_Mask) == stTerr; } --- vdr-1.6.0.orig/debian/patches/opt-48-x_pin.dpatch +++ vdr-1.6.0/debian/patches/opt-48-x_pin.dpatch @@ -0,0 +1,628 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-48_pin.dpatch by Jörg Wendel (Horchi) +## +## Thomas Günther <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 +## Tobias Grimm <tg@e-tobi.net>## +## - adapted to VDR 1.5.15 +## 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 +## (vdr-1.4.5.diff) + +@DPATCH@ +diff -urNad vdr-1.6.0~/Makefile vdr-1.6.0/Makefile +--- vdr-1.6.0~/Makefile 2008-05-11 01:08:05.000000000 +0200 ++++ vdr-1.6.0/Makefile 2008-05-11 01:08:06.000000000 +0200 +@@ -45,6 +45,8 @@ + + OBJS += vdrttxtsubshooks.o + ++OBJS += childlock.o ++ + ifndef NO_KBD + DEFINES += -DREMOTE_KBD + endif +diff -urNad vdr-1.6.0~/childlock.c vdr-1.6.0/childlock.c +--- vdr-1.6.0~/childlock.c 1970-01-01 01:00:00.000000000 +0100 ++++ vdr-1.6.0/childlock.c 2008-05-11 01:08:06.000000000 +0200 +@@ -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 -urNad vdr-1.6.0~/childlock.h vdr-1.6.0/childlock.h +--- vdr-1.6.0~/childlock.h 1970-01-01 01:00:00.000000000 +0100 ++++ vdr-1.6.0/childlock.h 2008-05-11 01:08:06.000000000 +0200 +@@ -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 -urNad vdr-1.6.0~/childlockservice.h vdr-1.6.0/childlockservice.h +--- vdr-1.6.0~/childlockservice.h 1970-01-01 01:00:00.000000000 +0100 ++++ vdr-1.6.0/childlockservice.h 2008-05-11 01:08:06.000000000 +0200 +@@ -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 -urNad vdr-1.6.0~/device.c vdr-1.6.0/device.c +--- vdr-1.6.0~/device.c 2008-05-11 01:08:05.000000000 +0200 ++++ vdr-1.6.0/device.c 2008-05-11 01:08:06.000000000 +0200 +@@ -18,6 +18,7 @@ + #include "receiver.h" + #include "status.h" + #include "transfer.h" ++#include "childlock.h" + + // --- cLiveSubtitle --------------------------------------------------------- + +@@ -766,6 +767,7 @@ + cChannel *channel; + while ((channel = Channels.GetByNumber(n, Direction)) != NULL) { + // try only channels which are currently available ++ if (PinPatch::ChildLock::IsChannelProtected(channel) == false) + if (GetDevice(channel, 0, true)) + break; + n = channel->Number() + Direction; +@@ -787,6 +789,9 @@ + + eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView) + { ++ if (LiveView && PinPatch::ChildLock::IsChannelProtected(Channel) == true) ++ return scrNotAvailable; ++ + if (LiveView) { + StopReplay(); + DELETENULL(liveSubtitle); +diff -urNad vdr-1.6.0~/menu.c vdr-1.6.0/menu.c +--- vdr-1.6.0~/menu.c 2008-05-11 01:08:05.000000000 +0200 ++++ vdr-1.6.0/menu.c 2008-05-11 01:09:10.000000000 +0200 +@@ -32,6 +32,7 @@ + #include "vdrttxtsubshooks.h" + #include "videodir.h" + #include "menuorgpatch.h" ++#include "childlock.h" + + #define MAXWAIT4EPGINFO 3 // seconds + #define MODETIMEOUT 3 // seconds +@@ -757,6 +758,9 @@ + 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)); ++ + char* p = strrchr(data.file, '~'); + if (p) { + p++; +@@ -2344,7 +2348,8 @@ + for (cRecording *recording = Recordings.First(); recording; recording = Recordings.Next(recording)) { + if (!base || (strstr(recording->Name(), base) == recording->Name() && recording->Name()[strlen(base)] == '~')) { + 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); +@@ -2407,6 +2412,9 @@ + { + cMenuRecordingItem *ri = (cMenuRecordingItem *)Get(Current()); + if (ri) { ++ if (PinPatch::ChildLock::IsRecordingProtected(GetRecording(ri), ri->Name(), base, ri->IsDirectory()) == true) ++ return osContinue; ++ + if (ri->IsDirectory()) + Open(); + else { +@@ -3439,6 +3447,8 @@ + } + 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()); + } +@@ -3453,9 +3463,13 @@ + + // 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: +@@ -3463,18 +3477,22 @@ + 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)); + + } +@@ -3555,6 +3573,11 @@ + 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: +@@ -3601,6 +3624,7 @@ + if (item) { + cPlugin *p = cPluginManager::GetPlugin(item->PluginIndex()); + if (p) { ++ if (!PinPatch::ChildLock::IsPluginProtected(p)) { + cOsdObject *menu = p->MainMenuAction(); + if (menu) { + if (menu->IsMenu()) +@@ -3612,6 +3636,7 @@ + } + } + } ++ } + state = osEnd; + } + break; +@@ -3814,6 +3839,7 @@ + if (Direction) { + while (Channel) { + Channel = Direction > 0 ? Channels.Next(Channel) : Channels.Prev(Channel); ++ if (PinPatch::ChildLock::IsChannelProtected(Channel) == false) + if (Channel && !Channel->GroupSep() && cDevice::GetDevice(Channel, 0, true)) + return Channel; + } +@@ -4448,6 +4474,7 @@ + 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 -urNad vdr-1.6.0~/po/de_DE.po vdr-1.6.0/po/de_DE.po +--- vdr-1.6.0~/po/de_DE.po 2008-05-11 01:08:05.000000000 +0200 ++++ vdr-1.6.0/po/de_DE.po 2008-05-11 01:08:06.000000000 +0200 +@@ -360,6 +360,9 @@ + msgid "Lifetime" + msgstr "Lebensdauer" + ++msgid "Timer$Childlock" ++msgstr "Gesichert" ++ + msgid "File" + msgstr "Datei" + +diff -urNad vdr-1.6.0~/po/fr_FR.po vdr-1.6.0/po/fr_FR.po +--- vdr-1.6.0~/po/fr_FR.po 2008-05-11 01:08:05.000000000 +0200 ++++ vdr-1.6.0/po/fr_FR.po 2008-05-11 01:08:06.000000000 +0200 +@@ -366,6 +366,9 @@ + msgid "Lifetime" + msgstr "Durée de vie" + ++msgid "Timer$Childlock" ++msgstr "Adulte" ++ + msgid "File" + msgstr "Fichier" + +diff -urNad vdr-1.6.0~/timers.c vdr-1.6.0/timers.c +--- vdr-1.6.0~/timers.c 2008-05-11 01:08:05.000000000 +0200 ++++ vdr-1.6.0/timers.c 2008-05-11 01:08:06.000000000 +0200 +@@ -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 @@ + 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()); +@@ -55,6 +56,7 @@ + + cTimer::cTimer(const cEvent *Event) + { ++ aux = NULL; + startTime = stopTime = 0; + lastSetEvent = 0; + recording = pending = inVpsMargin = false; +@@ -83,8 +85,8 @@ + const char *Title = Event->Title(); + if (!isempty(Title)) + Utf8Strn0Cpy(file, Event->Title(), sizeof(file)); +- aux = NULL; + event = NULL; // let SetEvent() be called to get a log message ++ PinPatch::ChildLock::NotifyTimerCreation(this, Event); + } + + cTimer::cTimer(const cTimer &Timer) +@@ -259,6 +261,8 @@ + 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; +@@ -313,6 +317,8 @@ + result = false; + } + } ++ if (aux && strstr(aux, AUX_STR_PROTECTED)) ++ SetFlags(tfProtected); + free(channelbuffer); + free(daybuffer); + free(filebuffer); +@@ -582,6 +588,26 @@ + 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 -urNad vdr-1.6.0~/timers.h vdr-1.6.0/timers.h +--- vdr-1.6.0~/timers.h 2008-02-16 15:33:23.000000000 +0100 ++++ vdr-1.6.0/timers.h 2008-05-11 01:08:06.000000000 +0200 +@@ -20,6 +20,7 @@ + tfInstant = 0x0002, + tfVps = 0x0004, + tfRecording = 0x0008, ++ tfProtected = 0x8000, + tfAll = 0xFFFF, + }; + enum eTimerMatch { tmNone, tmPartial, tmFull }; +diff -urNad vdr-1.6.0~/vdr.c vdr-1.6.0/vdr.c +--- vdr-1.6.0~/vdr.c 2008-05-11 01:08:05.000000000 +0200 ++++ vdr-1.6.0/vdr.c 2008-05-11 01:08:06.000000000 +0200 +@@ -64,6 +64,7 @@ + #include "tools.h" + #include "transfer.h" + #include "videodir.h" ++#include "childlock.h" + + #define MINCHANNELWAIT 10 // seconds to wait between failed channel switchings + #define ACTIVITYTIMEOUT 60 // seconds before starting housekeeping +@@ -923,6 +924,7 @@ + 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) +@@ -995,10 +997,12 @@ + 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); + } +@@ -1208,9 +1212,11 @@ + // Instant resume of the last viewed recording: + case kPlay: + if (cReplayControl::LastReplayed()) { ++ if (PinPatch::ChildLock::IsRecordingProtected(0, cReplayControl::LastReplayed(), 0, false) == false) { + cControl::Shutdown(); + cControl::Launch(new cReplayControl); + } ++ } + break; + default: break; + } --- vdr-1.6.0.orig/debian/patches/03_cmdsubmenu.dpatch +++ vdr-1.6.0/debian/patches/03_cmdsubmenu.dpatch @@ -0,0 +1,226 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 03_cmdsubmenu.dpatch by Albu at vdrportal.de +## http://toms-cafe.de/vdr/download/vdr-cmdsubmenu-0.7-1.5.15.diff +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Adds submenus within the commands and recording commands menu. +## DP: To create a submenu entry, prefix the name by one ore more "-". + +@DPATCH@ +diff -urNad vdr-1.5.15~/README.cmdsubmenu vdr-1.5.15/README.cmdsubmenu +--- vdr-1.5.15~/README.cmdsubmenu 1970-01-01 01:00:00.000000000 +0100 ++++ vdr-1.5.15/README.cmdsubmenu 2008-02-17 21:01:18.000000000 +0100 +@@ -0,0 +1,58 @@ ++CmdSubmenu patch for VDR ++------------------------ ++ ++With this patch the commands and recording commands menus can be organised ++hierarchically. To create a submenu entry, prefix the name by one ore more "-". ++ ++ ++Standard: ++ ++description_1 : cmd_1 ++description_2 : cmd_2 ++ ++ ++A submenu with two entries: ++ ++Submenu title ... : echo "submenu" ++-description_1 : cmd_1 ++-description_2 : cmd_2 ++ ++The dummy command in the title row is necessary. ++ ++ ++* History ++ ++ 2003-10-08: Version 0.1 - Albu at vdrportal.de ++ http://vdrportal.de/board/thread.php?threadid=6319 ++ ++ 2003-10-09: Version 0.2 - Tobias Grimm <tg@e-tobi.net> ++ - Added Define CMD_SUBMENUS in Makefile ++ ++ 2004-05-28: Version 0.3 - Thomas Günther <tom@toms-cafe.de> ++ - Fixed compilation with gcc-3.3.3 ++ - Added new virtual method AddConfig in cConfig ++ - Redefining of method Add in cListBase to virtual no longer necessary ++ - Improved code in menu.c ++ http://toms-cafe.de/vdr/download/vdr-cmdsubmenu-0.3.diff ++ ++ 2004-12-20: Version 0.4 - Thomas Günther <tom@toms-cafe.de> ++ - Solved conflict with jumpplay patch 0.6 ++ http://toms-cafe.de/vdr/download/vdr-cmdsubmenu-0.4.diff ++ ++ 2006-04-22: Version 0.5 - Thomas Günther <tom@toms-cafe.de> ++ - Added version define CMDSUBMENUVERSNUM ++ - Reformated to VDR style indentions ++ - Added description in README.cmdsubmenu ++ http://toms-cafe.de/vdr/download/vdr-cmdsubmenu-0.5-1.3.47.diff ++ ++ 2006-04-23: Version 0.6 - Thomas Günther <tom@toms-cafe.de> ++ - Fixed menus with more than one level ++ http://toms-cafe.de/vdr/download/vdr-cmdsubmenu-0.6-1.3.47.diff ++ ++ 2006-05-15: Version 0.7 - Thomas Günther <tom@toms-cafe.de> ++ - Fixed build with G++ 4.1 (extra qualification) ++ http://toms-cafe.de/vdr/download/vdr-cmdsubmenu-0.7-1.4.0.diff ++ ++ 2007-02-17: - Tobias Grimm <tg@e-tobi.net> ++ - Adapted to vdr-1.5.15 ++ http://toms-cafe.de/vdr/download/vdr-cmdsubmenu-0.7-1.5.15.diff +diff -urNad vdr-1.5.15~/config.c vdr-1.5.15/config.c +--- vdr-1.5.15~/config.c 2008-02-17 14:39:00.000000000 +0100 ++++ vdr-1.5.15/config.c 2008-02-17 21:03:48.000000000 +0100 +@@ -28,18 +28,26 @@ + { + title = command = NULL; + confirm = false; ++ nIndent = 0; ++ childs = NULL; + } + + cCommand::~cCommand() + { + free(title); + free(command); ++ delete childs; + } + + bool cCommand::Parse(const char *s) + { + const char *p = strchr(s, ':'); + if (p) { ++ nIndent = 0; ++ while (*s == '-') { ++ nIndent++; ++ s++; ++ } + int l = p - s; + if (l > 0) { + title = MALLOC(char, l + 1); +@@ -85,6 +93,18 @@ + return result; + } + ++int cCommand::getChildCount(void) ++{ ++ return childs ? childs->Count() : 0; ++} ++ ++void cCommand::addChild(cCommand *newChild) ++{ ++ if (!childs) ++ childs = new cCommands(); ++ childs->AddConfig(newChild); ++} ++ + // --- cSVDRPhost ------------------------------------------------------------ + + cSVDRPhost::cSVDRPhost(void) +@@ -126,6 +146,21 @@ + cCommands Commands; + cCommands RecordingCommands; + ++void cCommands::AddConfig(cCommand *Object) ++{ ++ if (!Object) ++ return; ++ //isyslog ("Indent %d %s\n", Object->getIndent(), Object->Title()); ++ for (int index = Count() - 1; index >= 0; index--) { ++ cCommand *parent = Get(index); ++ if (parent->getIndent() < Object->getIndent()) { ++ parent->addChild(Object); ++ return; ++ } ++ } ++ cConfig<cCommand>::Add(Object); ++} ++ + // --- cSVDRPhosts ----------------------------------------------------------- + + cSVDRPhosts SVDRPhosts; +diff -urNad vdr-1.5.15~/config.h vdr-1.5.15/config.h +--- vdr-1.5.15~/config.h 2008-02-05 16:35:11.000000000 +0100 ++++ vdr-1.5.15/config.h 2008-02-17 21:01:18.000000000 +0100 +@@ -36,6 +36,8 @@ + // plugins to work with newer versions of the core VDR as long as no + // VDR header files have changed. + ++#define CMDSUBMENUVERSNUM 7 ++ + #define MAXPRIORITY 99 + #define MAXLIFETIME 99 + +@@ -48,11 +50,15 @@ + #define MaxSkinName 16 + #define MaxThemeName 16 + ++class cCommands; ++ + class cCommand : public cListObject { + private: + char *title; + char *command; + bool confirm; ++ int nIndent; ++ cCommands *childs; + static char *result; + public: + cCommand(void); +@@ -61,6 +67,12 @@ + const char *Title(void) { return title; } + bool Confirm(void) { return confirm; } + const char *Execute(const char *Parameters = NULL); ++ int getIndent(void) { return nIndent; } ++ void setIndent(int nNewIndent) { nIndent = nNewIndent; } ++ cCommands *getChilds(void) { return childs; } ++ int getChildCount(void); ++ bool hasChilds(void) { return getChildCount() > 0; } ++ void addChild(cCommand *newChild); + }; + + typedef uint32_t in_addr_t; //XXX from /usr/include/netinet/in.h (apparently this is not defined on systems with glibc < 2.2) +@@ -88,6 +100,7 @@ + public: + cConfig(void) { fileName = NULL; } + virtual ~cConfig() { free(fileName); } ++ virtual void AddConfig(T *Object) { cList<T>::Add(Object); } + const char *FileName(void) { return fileName; } + bool Load(const char *FileName = NULL, bool AllowComments = false, bool MustExist = false) + { +@@ -117,7 +130,7 @@ + if (!isempty(s)) { + T *l = new T; + if (l->Parse(s)) +- Add(l); ++ AddConfig(l); + else { + esyslog("ERROR: error in %s, line %d", fileName, line); + delete l; +@@ -159,7 +172,10 @@ + } + }; + +-class cCommands : public cConfig<cCommand> {}; ++class cCommands : public cConfig<cCommand> { ++public: ++ virtual void AddConfig(cCommand *Object); ++ }; + + class cSVDRPhosts : public cConfig<cSVDRPhost> { + public: +diff -urNad vdr-1.5.15~/menu.c vdr-1.5.15/menu.c +--- vdr-1.5.15~/menu.c 2008-02-16 14:53:26.000000000 +0100 ++++ vdr-1.5.15/menu.c 2008-02-17 21:04:33.000000000 +0100 +@@ -1579,6 +1579,10 @@ + cCommand *command = commands->Get(Current()); + if (command) { + bool confirmed = true; ++ if (command->hasChilds()) { ++ AddSubMenu(new cMenuCommands(command->Title(), command->getChilds(), parameters)); ++ return osContinue; ++ } + if (command->Confirm()) + confirmed = Interface->Confirm(cString::sprintf("%s?", command->Title())); + if (confirmed) { --- vdr-1.6.0.orig/debian/patches/20_gcc44_ftbfs.dpatch +++ vdr-1.6.0/debian/patches/20_gcc44_ftbfs.dpatch @@ -0,0 +1,74 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 20_gcc44_ftbfs.dpatch copied from Fedora +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Fix FTBFS with gcc 4.4 +## DP: http://cvs.fedoraproject.org/viewvc/rpms/vdr/devel/vdr-1.6.0-const.diff?revision=1.1&view=markup + +@DPATCH@ +--- vdr-1.6.0.orig/recording.c ++++ vdr-1.6.0/recording.c +@@ -509,8 +509,8 @@ cRecording::cRecording(cTimer *Timer, co + Utf8Strn0Cpy(SubtitleBuffer, Subtitle, MAX_SUBTITLE_LENGTH); + Subtitle = SubtitleBuffer; + } +- char *macroTITLE = strstr(Timer->File(), TIMERMACRO_TITLE); +- char *macroEPISODE = strstr(Timer->File(), TIMERMACRO_EPISODE); ++ const char *macroTITLE = strstr(Timer->File(), TIMERMACRO_TITLE); ++ const char *macroEPISODE = strstr(Timer->File(), TIMERMACRO_EPISODE); + if (macroTITLE || macroEPISODE) { + name = strdup(Timer->File()); + name = strreplace(name, TIMERMACRO_TITLE, Title); +@@ -551,7 +551,7 @@ cRecording::cRecording(const char *FileN + sortBuffer = NULL; + fileName = strdup(FileName); + FileName += strlen(VideoDirectory) + 1; +- char *p = strrchr(FileName, '/'); ++ const char *p = strrchr(FileName, '/'); + + name = NULL; + info = new cRecordingInfo; +@@ -1022,7 +1022,8 @@ void cRecordings::DelByName(const char * + if (recording) { + cThreadLock DeletedRecordingsLock(&DeletedRecordings); + Del(recording, false); +- char *ext = strrchr(recording->FileName(), '.'); ++ // wtf? ++ char *ext = strrchr(const_cast<char*>(recording->FileName()), '.'); + if (ext) { + strncpy(ext, DELEXT, strlen(ext)); + recording->fileSizeMB = DirSizeMB(recording->FileName()); +--- vdr-1.6.0.orig/svdrp.c ++++ vdr-1.6.0/svdrp.c +@@ -736,7 +736,7 @@ void cSVDRP::CmdGRAB(const char *Option) + char *strtok_next; + FileName = strtok_r(p, delim, &strtok_next); + // image type: +- char *Extension = strrchr(FileName, '.'); ++ const char *Extension = strrchr(FileName, '.'); + if (Extension) { + if (strcasecmp(Extension, ".jpg") == 0 || strcasecmp(Extension, ".jpeg") == 0) + Jpeg = true; +@@ -795,16 +795,17 @@ void cSVDRP::CmdGRAB(const char *Option) + char RealFileName[PATH_MAX]; + if (FileName) { + if (grabImageDir) { +- cString s; +- char *slash = strrchr(FileName, '/'); ++ cString s(FileName); ++ FileName = s; ++ const char *slash = strrchr(FileName, '/'); + if (!slash) { + s = AddDirectory(grabImageDir, FileName); + FileName = s; + } + slash = strrchr(FileName, '/'); // there definitely is one +- *slash = 0; +- char *r = realpath(FileName, RealFileName); +- *slash = '/'; ++ cString t(s); ++ t.Truncate(slash - FileName); ++ char *r = realpath(t, RealFileName); + if (!r) { + LOG_ERROR_STR(FileName); + Reply(501, "Invalid file name \"%s\"", FileName); --- vdr-1.6.0.orig/debian/patches/opt-39_noepg.dpatch +++ vdr-1.6.0/debian/patches/opt-39_noepg.dpatch @@ -0,0 +1,149 @@ +#! /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 +## +## 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 -urNad vdr-1.6.0~/config.c vdr-1.6.0/config.c +--- vdr-1.6.0~/config.c 2008-05-11 03:35:16.000000000 +0200 ++++ vdr-1.6.0/config.c 2008-05-11 03:35:44.000000000 +0200 +@@ -339,11 +339,20 @@ + ShowRecLength = 0; + ShowProgressBar = 0; + MenuCmdPosition = 0; ++ noEPGMode=0; ++ noEPGList=strdup(""); ++} ++ ++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; + } + +@@ -504,6 +513,11 @@ + else if (!strcasecmp(Name, "FontOsdSize")) FontOsdSize = atoi(Value); + else if (!strcasecmp(Name, "FontSmlSize")) FontSmlSize = atoi(Value); + else if (!strcasecmp(Name, "FontFixSize")) FontFixSize = 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, "MaxVideoFileSize")) MaxVideoFileSize = atoi(Value); + else if (!strcasecmp(Name, "SplitEditedFiles")) SplitEditedFiles = atoi(Value); + else if (!strcasecmp(Name, "MinEventTimeout")) MinEventTimeout = atoi(Value); +@@ -599,6 +613,8 @@ + Store("FontOsd", FontOsd); + Store("FontSml", FontSml); + Store("FontFix", FontFix); ++ Store("noEPGMode", noEPGMode); ++ Store("noEPGList", noEPGList); + Store("FontOsdSize", FontOsdSize); + Store("FontSmlSize", FontSmlSize); + Store("FontFixSize", FontFixSize); +diff -urNad vdr-1.6.0~/config.h vdr-1.6.0/config.h +--- vdr-1.6.0~/config.h 2008-05-11 03:35:16.000000000 +0200 ++++ vdr-1.6.0/config.h 2008-05-11 03:35:16.000000000 +0200 +@@ -280,6 +280,7 @@ + int FontOsdSize; + int FontSmlSize; + int FontFixSize; ++ int noEPGMode; + int MaxVideoFileSize; + int SplitEditedFiles; + int MinEventTimeout, MinUserInactivity; +@@ -299,7 +300,9 @@ + int EmergencyExit; + int ShowRecDate, ShowRecTime, ShowRecLength, ShowProgressBar, MenuCmdPosition; + 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 -urNad vdr-1.6.0~/eit.c vdr-1.6.0/eit.c +--- vdr-1.6.0~/eit.c 2008-05-11 03:35:16.000000000 +0200 ++++ vdr-1.6.0/eit.c 2008-05-11 03:35:16.000000000 +0200 +@@ -22,8 +22,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) + { +@@ -35,6 +55,12 @@ + 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 -urNad vdr-1.6.0~/menu.c vdr-1.6.0/menu.c +--- vdr-1.6.0~/menu.c 2008-05-11 03:35:16.000000000 +0200 ++++ vdr-1.6.0/menu.c 2008-05-11 03:35:16.000000000 +0200 +@@ -2604,6 +2604,7 @@ + + class cMenuSetupEPG : public cMenuSetupBase { + private: ++ const char *noEPGModes[2]; + int originalNumLanguages; + int numLanguages; + void Setup(void); +@@ -2626,6 +2627,9 @@ + { + int current = Current(); + ++ noEPGModes[0]=tr("Blacklist"); ++ noEPGModes[1]=tr("Whitelist"); ++ + Clear(); + + Add(new cMenuEditIntItem( tr("Setup.EPG$EPG scan timeout (h)"), &data.EPGScanTimeout)); +@@ -2644,6 +2648,7 @@ + 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)); ++ Add(new cMenuEditStraItem(tr("Setup.EPG$Mode noEPG-Patch"), &data.noEPGMode, 2, noEPGModes)); + + SetCurrent(Get(current)); + Display(); --- vdr-1.6.0.orig/debian/patches/opt-27_ttxtsubs.dpatch +++ vdr-1.6.0/debian/patches/opt-27_ttxtsubs.dpatch @@ -0,0 +1,297 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-27_ttxtsubs.dpatch by Rolf Ahrenberg <Rolf.Ahrenberg AT sci.fi> +## http://www.saunalahti.fi/~rahrenbe/vdr/patches/vdr-1.5.14-ttxtsubs-0.0.5.diff.gz +## +## Thomas Günther <tom@toms-cafe.de>: +## - adapted to dd-record-option patch (UseDolbyDigital -> RecordDolbyDigital) +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: This patch is needed for the ttxtsubs plugin. + +@DPATCH@ +diff -Nru vdr-1.5.14-vanilla/Makefile vdr-1.5.14-ttxtsubs/Makefile +--- vdr-1.5.14-vanilla/Makefile 2008-01-27 23:04:26.000000000 +0200 ++++ vdr-1.5.14-ttxtsubs/Makefile 2008-01-27 23:06:23.000000000 +0200 +@@ -43,6 +43,8 @@ + skinclassic.o skins.o skinsttng.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 -Nru vdr-1.5.14-vanilla/dvbplayer.c vdr-1.5.14-ttxtsubs/dvbplayer.c +--- vdr-1.5.14-vanilla/dvbplayer.c 2008-01-27 23:04:26.000000000 +0200 ++++ vdr-1.5.14-ttxtsubs/dvbplayer.c 2008-01-27 23:06:23.000000000 +0200 +@@ -14,6 +14,7 @@ + #include "ringbuffer.h" + #include "thread.h" + #include "tools.h" ++#include "vdrttxtsubshooks.h" + + // --- cBackTrace ------------------------------------------------------------ + +@@ -312,6 +313,32 @@ + firstPacket = true; + } + ++static void StripExtendedPackets(uchar *b, int Length) ++{ ++ for (int i = 0; i < Length - 6; i++) { ++ if (b[i] == 0x00 && b[i + 1] == 0x00 && b[i + 2] == 0x01) { ++ uchar c = b[i + 3]; ++ int l = b[i + 4] * 256 + b[i + 5] + 6; ++ switch (c) { ++ case 0xBD: // dolby ++ // EBU Teletext data, ETSI EN 300 472 ++ if (b[i + 8] == 0x24 && b[i + 45] >= 0x10 && b[i + 45] < 0x20) { ++ cVDRTtxtsubsHookListener::Hook()->PlayerTeletextData(&b[i], l); ++ // continue with deleting the data - otherwise it disturbs DVB replay ++ int n = l; ++ for (int j = i; j < Length && n--; j++) ++ b[j] = 0x00; ++ } ++ break; ++ default: ++ break; ++ } ++ if (l) ++ i += l - 1; // the loop increments, too! ++ } ++ } ++} ++ + bool cDvbPlayer::NextFile(uchar FileNumber, int FileOffset) + { + if (FileNumber > 0) +@@ -503,6 +530,7 @@ + } + } + if (p) { ++ StripExtendedPackets(p, pc); + int w = PlayPes(p, pc, playMode != pmPlay); + if (w > 0) { + p += w; +diff -Nru vdr-1.5.14-vanilla/menu.c vdr-1.5.14-ttxtsubs/menu.c +--- vdr-1.5.14-vanilla/menu.c 2008-01-27 23:04:26.000000000 +0200 ++++ vdr-1.5.14-ttxtsubs/menu.c 2008-01-27 23:06:23.000000000 +0200 +@@ -28,6 +28,7 @@ + #include "themes.h" + #include "timers.h" + #include "transfer.h" ++#include "vdrttxtsubshooks.h" + #include "videodir.h" + + #define MAXWAIT4EPGINFO 3 // seconds +@@ -3737,8 +3738,10 @@ + isyslog("record %s", fileName); + if (MakeDirs(fileName, true)) { + const cChannel *ch = timer->Channel(); +- recorder = new cRecorder(fileName, ch->GetChannelID(), timer->Priority(), ch->Vpid(), ch->Apids(), ch->Dpids(), ch->Spids()); ++ cTtxtSubsRecorderBase *subsRecorder = cVDRTtxtsubsHookListener::Hook()->NewTtxtSubsRecorder(device, ch); ++ recorder = new cRecorder(fileName, ch->GetChannelID(), timer->Priority(), ch->Vpid(), ch->Apids(), ch->Dpids(), ch->Spids(), subsRecorder); + if (device->AttachReceiver(recorder)) { ++ if (subsRecorder) subsRecorder->DeviceAttach(); + Recording.WriteInfo(); + cStatus::MsgRecording(device, Recording.Name(), Recording.FileName(), true); + if (!Timer && !cReplayControl::LastReplayed()) // an instant recording, maybe from cRecordControls::PauseLiveVideo() +diff -Nru vdr-1.5.14-vanilla/osd.c vdr-1.5.14-ttxtsubs/osd.c +--- vdr-1.5.14-vanilla/osd.c 2008-01-27 23:04:26.000000000 +0200 ++++ vdr-1.5.14-ttxtsubs/osd.c 2008-01-27 23:06:23.000000000 +0200 +@@ -15,6 +15,7 @@ + #include <sys/stat.h> + #include <sys/unistd.h> + #include "tools.h" ++#include "vdrttxtsubshooks.h" + + // --- cPalette -------------------------------------------------------------- + +diff -Nru vdr-1.5.14-vanilla/recorder.c vdr-1.5.14-ttxtsubs/recorder.c +--- vdr-1.5.14-vanilla/recorder.c 2008-01-27 23:04:26.000000000 +0200 ++++ vdr-1.5.14-ttxtsubs/recorder.c 2008-01-27 23:06:23.000000000 +0200 +@@ -11,6 +11,7 @@ + #include <stdarg.h> + #include <stdio.h> + #include <unistd.h> ++#include <stdint.h> + #include "shutdown.h" + + #define RECORDERBUFSIZE MEGABYTE(5) +@@ -26,6 +27,7 @@ + + class cFileWriter : public cThread { + private: ++ cTtxtSubsRecorderBase *ttxtSubsRecorder; + cRemux *remux; + cFileName *fileName; + cIndexFile *index; +@@ -38,13 +40,14 @@ + protected: + virtual void Action(void); + public: +- cFileWriter(const char *FileName, cRemux *Remux); ++ cFileWriter(const char *FileName, cRemux *Remux, cTtxtSubsRecorderBase *tsr); + virtual ~cFileWriter(); + }; + +-cFileWriter::cFileWriter(const char *FileName, cRemux *Remux) ++cFileWriter::cFileWriter(const char *FileName, cRemux *Remux, cTtxtSubsRecorderBase *tsr) + :cThread("file writer") + { ++ ttxtSubsRecorder = tsr; + fileName = NULL; + remux = Remux; + index = NULL; +@@ -67,6 +70,8 @@ + Cancel(3); + delete index; + delete fileName; ++ if (ttxtSubsRecorder) ++ delete ttxtSubsRecorder; + } + + bool cFileWriter::RunningLowOnDiskSpace(void) +@@ -111,6 +116,16 @@ + } + fileSize += Count; + remux->Del(Count); ++ // not sure if the pictureType test is needed, but it seems we can get ++ // incomplete pes packets from remux if we are not getting pictures? ++ if (ttxtSubsRecorder && pictureType != NO_PICTURE) { ++ uint8_t *subsp; ++ size_t len; ++ if (ttxtSubsRecorder->GetPacket(&subsp, &len)) { ++ recordFile->Write(subsp, len); ++ fileSize += len; ++ } ++ } + } + else + break; +@@ -126,7 +141,7 @@ + + // --- cRecorder ------------------------------------------------------------- + +-cRecorder::cRecorder(const char *FileName, tChannelID ChannelID, int Priority, int VPid, const int *APids, const int *DPids, const int *SPids) ++cRecorder::cRecorder(const char *FileName, tChannelID ChannelID, int Priority, int VPid, const int *APids, const int *DPids, const int *SPids, cTtxtSubsRecorderBase *tsr) + :cReceiver(ChannelID, Priority, VPid, APids, Setup.RecordDolbyDigital ? DPids : NULL, SPids) + ,cThread("recording") + { +@@ -137,7 +152,7 @@ + ringBuffer = new cRingBufferLinear(RECORDERBUFSIZE, TS_SIZE * 2, true, "Recorder"); + ringBuffer->SetTimeouts(0, 100); + remux = new cRemux(VPid, APids, Setup.RecordDolbyDigital ? DPids : NULL, SPids, true); +- writer = new cFileWriter(FileName, remux); ++ writer = new cFileWriter(FileName, remux, tsr); + } + + cRecorder::~cRecorder() +diff -Nru vdr-1.5.14-vanilla/recorder.h vdr-1.5.14-ttxtsubs/recorder.h +--- vdr-1.5.14-vanilla/recorder.h 2008-01-27 23:04:26.000000000 +0200 ++++ vdr-1.5.14-ttxtsubs/recorder.h 2008-01-27 23:06:23.000000000 +0200 +@@ -15,6 +15,7 @@ + #include "remux.h" + #include "ringbuffer.h" + #include "thread.h" ++#include "vdrttxtsubshooks.h" + + class cFileWriter; + +@@ -28,7 +29,7 @@ + virtual void Receive(uchar *Data, int Length); + virtual void Action(void); + public: +- cRecorder(const char *FileName, tChannelID ChannelID, int Priority, int VPid, const int *APids, const int *DPids, const int *SPids); ++ cRecorder(const char *FileName, tChannelID ChannelID, int Priority, int VPid, const int *APids, const int *DPids, const int *SPids, cTtxtSubsRecorderBase *tsr); + // Creates a new recorder for the channel with the given ChannelID and + // the given Priority that will record the given PIDs into the file FileName. + virtual ~cRecorder(); +diff -Nru vdr-1.5.14-vanilla/vdrttxtsubshooks.c vdr-1.5.14-ttxtsubs/vdrttxtsubshooks.c +--- vdr-1.5.14-vanilla/vdrttxtsubshooks.c 1970-01-01 02:00:00.000000000 +0200 ++++ vdr-1.5.14-ttxtsubs/vdrttxtsubshooks.c 2008-01-27 23:06:23.000000000 +0200 +@@ -0,0 +1,44 @@ ++ ++#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) ++ { if(gListener) gListener->PlayerTeletextData(p, length); }; ++ virtual cTtxtSubsRecorderBase *NewTtxtSubsRecorder(cDevice *dev, const cChannel *ch) ++ { if(gListener) return gListener->NewTtxtSubsRecorder(dev, ch); else return NULL; }; ++}; ++ ++ ++// ------ 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 -Nru vdr-1.5.14-vanilla/vdrttxtsubshooks.h vdr-1.5.14-ttxtsubs/vdrttxtsubshooks.h +--- vdr-1.5.14-vanilla/vdrttxtsubshooks.h 1970-01-01 02:00:00.000000000 +0200 ++++ vdr-1.5.14-ttxtsubs/vdrttxtsubshooks.h 2008-01-27 23:06:23.000000000 +0200 +@@ -0,0 +1,36 @@ ++ ++#ifndef __VDRTTXTSUBSHOOKS_H ++#define __VDRTTXTSUBSHOOKS_H ++ ++class cDevice; ++class cChannel; ++ ++#define VDRTTXTSUBSHOOKS ++ ++class cTtxtSubsRecorderBase { ++ public: ++ virtual ~cTtxtSubsRecorderBase() {}; ++ ++ // returns a PES packet if there is data to add to the recording ++ virtual uint8_t *GetPacket(uint8_t **buf, size_t *len) { return NULL; }; ++ virtual void DeviceAttach(void) {}; ++}; ++ ++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) {}; ++ virtual cTtxtSubsRecorderBase *NewTtxtSubsRecorder(cDevice *dev, const cChannel *ch) ++ { return NULL; }; ++ ++ // used by VDR to call hook listeners ++ static cVDRTtxtsubsHookListener *Hook(void); ++}; ++ ++#endif --- vdr-1.6.0.orig/debian/patches/patchtest +++ vdr-1.6.0/debian/patches/patchtest @@ -0,0 +1,199 @@ +#!/bin/sh + +# Define some patch levels here: foo="patch1 patch2 ..." +# +standard="\ + 03_cmdsubmenu \ + 04_newplugin \ + 06_default_svdrp_port_0 \ + 09_sort_options \ + 10_dd-record-option \ + 11_sortrecordings \ + 12_osdbase-maxitems \ + 14_cap-memsize \ + 15_dvbplayer \ + 16_channels.conf.terr-fix \ + 17_vdr-maintenance-1.6.0-1 \ + 18_vdr-maintenance-1.6.0-2 \ + 81_Make_config \ + 82_valgrind \ + 99_ncursesw-include" +multipatch="$standard \ + opt-20_liemikuutio \ + opt-24_jumpplay \ + opt-27_ttxtsubs \ + opt-28_audioindexer \ + opt-29_syncearly-audioindexer \ + opt-30-x_analogtv \ + opt-31-x_reelchannelscan \ + opt-37-x_menuorg \ + opt-38_disableDoubleEpgEntrys \ + opt-39_noepg \ + opt-40_iptv \ + opt-41-x_timer-info \ + opt-42-x_MainMenuHooks \ + opt-43-x_recordshowfree \ + opt-44_rotor \ + opt-45_yaepg \ + opt-47_sourcecaps \ + opt-48-x_pin \ + opt-49-x_pvrinput \ + opt-50_graphtft \ + opt-51_cuttime \ + opt-52_hard_link_cutter \ + opt-53_dvbsetup \ + opt-54_deltimeshiftrec" +testpatch="$standard \ + opt-20_liemikuutio \ + opt-24_jumpplay \ + opt-27_ttxtsubs \ + opt-29_syncearly \ + opt-30-x_analogtv \ + opt-31-x_reelchannelscan \ + opt-37-x_menuorg \ + opt-38_disableDoubleEpgEntrys \ + opt-39_noepg \ + opt-40_iptv \ + opt-41-x_timer-info \ + opt-42-x_MainMenuHooks \ + opt-44_rotor \ + opt-45_yaepg \ + opt-48-x_pin \ + opt-49-x_pvrinput \ + 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.6.0.orig/debian/patches/06_default_svdrp_port_0.dpatch +++ vdr-1.6.0/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.6.0.orig/debian/patches/opt-29_syncearly-audioindexer.dpatch +++ vdr-1.6.0/debian/patches/opt-29_syncearly-audioindexer.dpatch @@ -0,0 +1,172 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-29_syncearly-audioindexer.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 +## +## Thomas Günther <tom@toms-cafe.de>: +## - adapted to audioindexer patch +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Speed up zapping channels. + +@DPATCH@ +diff -Naurp vdr-1.5.11-audioindexer/config.c vdr-1.5.11-audioindexer-syncearly/config.c +--- vdr-1.5.11-audioindexer/config.c 2007-11-13 23:00:17.000000000 +0000 ++++ vdr-1.5.11-audioindexer-syncearly/config.c 2007-11-13 23:00:17.000000000 +0000 +@@ -305,6 +305,7 @@ cSetup::cSetup(void) + UpdateChannels = 5; + RecordDolbyDigital = 1; + UseDolbyDigital = 1; ++ UseSyncEarlyPatch = 0; + ChannelInfoPos = 0; + ChannelInfoTime = 5; + OSDLeft = 54; +@@ -540,6 +541,7 @@ bool cSetup::Parse(const char *Name, con + else if (!strcasecmp(Name, "UpdateChannels")) UpdateChannels = atoi(Value); + else if (!strcasecmp(Name, "RecordDolbyDigital")) RecordDolbyDigital = 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); +@@ -643,6 +645,7 @@ bool cSetup::Save(void) + Store("UpdateChannels", UpdateChannels); + Store("RecordDolbyDigital", RecordDolbyDigital); + Store("UseDolbyDigital", UseDolbyDigital); ++ Store("UseSyncEarlyPatch", UseSyncEarlyPatch); + Store("ChannelInfoPos", ChannelInfoPos); + Store("ChannelInfoTime", ChannelInfoTime); + Store("OSDLeft", OSDLeft); +diff -Naurp vdr-1.5.11-audioindexer/config.h vdr-1.5.11-audioindexer-syncearly/config.h +--- vdr-1.5.11-audioindexer/config.h 2007-11-13 23:00:17.000000000 +0000 ++++ vdr-1.5.11-audioindexer-syncearly/config.h 2007-11-13 23:00:17.000000000 +0000 +@@ -278,6 +278,7 @@ public: + int UpdateChannels; + int RecordDolbyDigital; + int UseDolbyDigital; ++ int UseSyncEarlyPatch; + int ChannelInfoPos; + int ChannelInfoTime; + int OSDLeft, OSDTop, OSDWidth, OSDHeight; +diff -Naurp vdr-1.5.11-audioindexer/device.c vdr-1.5.11-audioindexer-syncearly/device.c +--- vdr-1.5.11-audioindexer/device.c 2007-11-13 23:00:17.000000000 +0000 ++++ vdr-1.5.11-audioindexer-syncearly/device.c 2007-11-13 23:00:17.000000000 +0000 +@@ -842,7 +842,7 @@ eSetChannelResult cDevice::SetChannel(co + } + 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 -Naurp vdr-1.5.11-audioindexer/menu.c vdr-1.5.11-audioindexer-syncearly/menu.c +--- vdr-1.5.11-audioindexer/menu.c 2007-11-13 23:00:17.000000000 +0000 ++++ vdr-1.5.11-audioindexer-syncearly/menu.c 2007-11-13 23:00:17.000000000 +0000 +@@ -2898,6 +2898,7 @@ 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 Sync Early Patch"), &data.UseSyncEarlyPatch)); + + SetCurrent(Get(current)); + Display(); +diff -Naurp vdr-1.5.11-audioindexer/remux.c vdr-1.5.11-audioindexer-syncearly/remux.c +--- vdr-1.5.11-audioindexer/remux.c 2007-11-13 23:00:17.000000000 +0000 ++++ vdr-1.5.11-audioindexer-syncearly/remux.c 2007-11-13 23:19:05.000000000 +0000 +@@ -1976,13 +1976,14 @@ void cAudioIndexer::ProcessFrame(void) + + #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; + audioIndexer = (noVideo ? new cAudioIndexer : NULL); + numUPTerrors = 0; + synced = false; ++ syncEarly = SyncEarly; + skipped = 0; + numTracks = 0; + resultSkipped = 0; +@@ -2196,12 +2197,18 @@ uchar *cRemux::Get(int &Count, uchar *Pi + 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) +@@ -2214,15 +2221,16 @@ uchar *cRemux::Get(int &Count, uchar *Pi + l = GetPacketLength(data, resultCount, i); + if (l < 0) + return resultData; +- if (noVideo) { ++ if (noVideo || !synced && syncEarly) { + uchar pt = NO_PICTURE; + if (audioIndexer && !Count) + audioIndexer->PrepareFrame(data, resultCount, i, pt); + if (!synced) { +- if (PictureType) ++ if (PictureType && noVideo) + *PictureType = pt; + 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 -Naurp vdr-1.5.11-audioindexer/remux.h vdr-1.5.11-audioindexer-syncearly/remux.h +--- vdr-1.5.11-audioindexer/remux.h 2007-11-13 23:00:17.000000000 +0000 ++++ vdr-1.5.11-audioindexer-syncearly/remux.h 2007-11-13 23:00:17.000000000 +0000 +@@ -41,6 +41,7 @@ private: + bool noVideo; + int numUPTerrors; + bool synced; ++ bool syncEarly; + int skipped; + cTS2PES *ts2pes[MAXTRACKS]; + int numTracks; +@@ -49,12 +50,14 @@ private: + cAudioIndexer *audioIndexer; + 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 -Naurp vdr-1.5.11-audioindexer/transfer.c vdr-1.5.11-audioindexer-syncearly/transfer.c +--- vdr-1.5.11-audioindexer/transfer.c 2007-11-13 23:00:17.000000000 +0000 ++++ vdr-1.5.11-audioindexer-syncearly/transfer.c 2007-11-13 23:00:17.000000000 +0000 +@@ -19,7 +19,7 @@ cTransfer::cTransfer(tChannelID ChannelI + ,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.6.0.orig/debian/patches/00list +++ vdr-1.6.0/debian/patches/00list @@ -0,0 +1,101 @@ +03_cmdsubmenu +04_newplugin +06_default_svdrp_port_0 +09_sort_options +10_dd-record-option +11_sortrecordings +12_osdbase-maxitems +14_cap-memsize +15_dvbplayer +16_channels.conf.terr-fix +17_vdr-maintenance-1.6.0-1 +18_vdr-maintenance-1.6.0-2 +19_dvb-api-v5 +20_gcc44_ftbfs + +81_Make_config +82_valgrind + +99_ncursesw-include + +# 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 + +# The Jump patch allows automatic jumping over cutting marks. +opt-24_jumpplay + +# Patch needed for the ttxtsubs plugin. +opt-27_ttxtsubs + +# Fixes length calculation for radio recordings +# opt-28_audioindexer + +# Speed up zapping channels. +# opt-29_syncearly +# opt-29_syncearly-audioindexer + +# Patch needed for the analogtv plugin. +# opt-30-x_analogtv + +# 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 required by the IPTV plugin +# opt-40_iptv + +# 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 assigning special satellites to one dvb card. +# opt-47_sourcecaps + +# Patch for the PIN plugin +# opt-48-x_pin + +# Patch for the pvrinput plugin +# opt-49-x_pvrinput + +# Patch required for the GraphTFT plugin +# opt-50_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 + +# Offers the choice to delete timeshift recordings +# opt-54_deltimeshiftrec --- vdr-1.6.0.orig/debian/patches/00list.multipatch +++ vdr-1.6.0/debian/patches/00list.multipatch @@ -0,0 +1,101 @@ +03_cmdsubmenu +04_newplugin +06_default_svdrp_port_0 +09_sort_options +10_dd-record-option +11_sortrecordings +12_osdbase-maxitems +14_cap-memsize +15_dvbplayer +16_channels.conf.terr-fix +17_vdr-maintenance-1.6.0-1 +18_vdr-maintenance-1.6.0-2 +19_dvb-api-v5 +20_gcc44_ftbfs + +81_Make_config +82_valgrind + +99_ncursesw-include + +# 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 + +# The Jump patch allows automatic jumping over cutting marks. +opt-24_jumpplay + +# Patch needed for the ttxtsubs plugin. +opt-27_ttxtsubs + +# Fixes length calculation for radio recordings +opt-28_audioindexer + +# Speed up zapping channels. +# opt-29_syncearly +opt-29_syncearly-audioindexer + +# Patch needed for the analogtv plugin. +opt-30-x_analogtv + +# 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 required by the IPTV plugin +opt-40_iptv + +# 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 assigning special satellites to one dvb card. +opt-47_sourcecaps + +# Patch for the PIN plugin +opt-48-x_pin + +# Patch for the pvrinput plugin +opt-49-x_pvrinput + +# Patch required for the GraphTFT plugin +opt-50_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 + +# Offers the choice to delete timeshift recordings +opt-54_deltimeshiftrec --- vdr-1.6.0.orig/debian/patches/19_dvb-api-v5.dpatch +++ vdr-1.6.0/debian/patches/19_dvb-api-v5.dpatch @@ -0,0 +1,21 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 19_dvb-api-v5.dpatch by Tobias Grimm <etobi@debian.org> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: No description. + +@DPATCH@ +diff -urNad vdr-1.6.0~/dvbdevice.h vdr-1.6.0/dvbdevice.h +--- vdr-1.6.0~/dvbdevice.h 2008-02-08 14:48:31.000000000 +0100 ++++ vdr-1.6.0/dvbdevice.h 2009-02-22 10:04:59.000000000 +0100 +@@ -15,8 +15,8 @@ + #include "device.h" + #include "dvbspu.h" + +-#if DVB_API_VERSION != 3 +-#error VDR requires Linux DVB driver API version 3! ++#if (DVB_API_VERSION != 3) && (DVB_API_VERSION != 5) ++#error VDR requires Linux DVB driver API version 3 or 5! + #endif + + #define MAXDVBDEVICES 8 --- vdr-1.6.0.orig/debian/patches/18_vdr-maintenance-1.6.0-2.dpatch +++ vdr-1.6.0/debian/patches/18_vdr-maintenance-1.6.0-2.dpatch @@ -0,0 +1,594 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 18_vdr-maintenance-1.6.0-2.dpatch by Klaus Schmidinger <kls@cadsoft.de> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: VDR 1.6.0 maintenance patch #2 + +@DPATCH@ +diff -ruN vdr-1.6.0-1/CONTRIBUTORS vdr-1.6.0-2/CONTRIBUTORS +--- vdr-1.6.0-1/CONTRIBUTORS 2008-04-13 15:34:03.000000000 +0200 ++++ vdr-1.6.0-2/CONTRIBUTORS 2008-09-06 16:46:56.000000000 +0200 +@@ -1053,6 +1053,7 @@ + language + for fixing displaying the free disk space when entering the recordings menu where + the last replayed recording was in a subdirectory, and pressing Back ++ for replacing the Finnish language code "smi" with "suo" + + Ralf Klueber <ralf.klueber@vodafone.com> + for reporting a bug in cutting a recording if there is only a single editing mark +@@ -1579,6 +1580,7 @@ + for making housekeeping wait for a while after a replay has ended + for fixing error handling in cCuttingThread::Action() + for suppressing the automatic shutdown if the remote control is currently disabled ++ for fixing a problem with calling isyslog() from within the SignalHandler() + + Sven Kreiensen <svenk@kammer.uni-hannover.de> + for his help in keeping 'channels.conf.terr' up to date +@@ -1895,6 +1897,7 @@ + for fixing cTimer::operator=() in case a cTimer variable is assigned to itself + for making the list of tracks given in cStatus::SetAudioTrack() NULL terminated + for fixing handling kLeft in the calls to cStatus::MsgOsdTextItem() ++ for fixing a possible integer overflow in GetAbsTime() + + Philip Prindeville <philipp_subx@redfish-solutions.com> + for updates to 'sources.conf' +@@ -2116,6 +2119,7 @@ + for making the non-breaking space symbol be rendered as a blank + for fixing a signed character used as index in cBase64Encoder::NextLine() + for fixing formatting the name section in the VDR man pages ++ for reporting unneeded include files <linux/dvb/dmx.h> und <time.h> in remux.h + + Helge Lenz <h.lenz@gmx.de> + for reporting a bug in setting the 'Delta' parameter when calling the shutdown +@@ -2352,3 +2356,10 @@ + + Nan Feng <nfgx@21cn.com> + for translating OSD texts to the Chinese language ++ ++Edgar Toernig <froese@gmx.de> ++ for suggesting to not call FcFini() to avoid problems with older (broken) versions ++ of fontconfig ++ ++Winfried Köhler <w_koehl@gmx.de> ++ for fixing wrong value for TableIdBAT in libsi/si.h +diff -ruN vdr-1.6.0-1/HISTORY vdr-1.6.0-2/HISTORY +--- vdr-1.6.0-1/HISTORY 2008-04-13 15:33:46.000000000 +0200 ++++ vdr-1.6.0-2/HISTORY 2008-09-06 16:36:51.000000000 +0200 +@@ -5740,3 +5740,21 @@ + Andreas Mair). + - Increased the time between checking the CAM status to 500ms to avoid problems + with some CAMs (reported by Arthur Konovalov). ++ ++2008-09-06: Version 1.6.0-2 ++ ++- Updated the Italian OSD texts (thanks to Diego Pierotto). ++- The SVDRP signon message now indicates the character encoding in use, as in ++ "220 video SVDRP VideoDiskRecorder 1.7.1; Fri May 2 16:17:10 2008; ISO-8859-1". ++ This may be useful for instance for external tools that provide EPG data, so that ++ they can correctly encode the strings. ++- No longer calling FcFini() to avoid problems with older (broken) versions of ++ fontconfig (suggested by Edgar Toernig). ++- Updated the sources.conf file (thanks to Oleg Roitburd). ++- Fixed a possible integer overflow in GetAbsTime() (thanks to Alexander Rieger). ++- Fixed a problem with calling isyslog() from within the SignalHandler() (thanks ++ to Udo Richter). ++- Replaced the Finnish language code "smi" with "suo" (thanks to Rolf Ahrenberg). ++- Fixed wrong value for TableIdBAT in libsi/si.h (thanks to Winfried Köhler). ++- Removed unneeded include files <linux/dvb/dmx.h> und <time.h> from remux.h ++ (reported by Tobias Grimm). +diff -ruN vdr-1.6.0-1/config.h vdr-1.6.0-2/config.h +--- vdr-1.6.0-1/config.h 2008-04-13 13:09:42.000000000 +0200 ++++ vdr-1.6.0-2/config.h 2008-09-07 11:33:03.000000000 +0200 +@@ -4,7 +4,7 @@ + * See the main source file 'vdr.c' for copyright information and + * how to reach the author. + * +- * $Id: config.h 1.310.1.1 2008/04/13 11:09:42 kls Exp $ ++ * $Id: config.h 1.310.1.2 2008/09/07 09:33:03 kls Exp $ + */ + + #ifndef __CONFIG_H +@@ -22,7 +22,7 @@ + + // VDR's own version number: + +-#define VDRVERSION "1.6.0-1" ++#define VDRVERSION "1.6.0-2" + #define VDRVERSNUM 10600 // Version * 10000 + Major * 100 + Minor + + // The plugin API's version number: +diff -ruN vdr-1.6.0-1/font.c vdr-1.6.0-2/font.c +--- vdr-1.6.0-1/font.c 2008-03-01 11:19:41.000000000 +0100 ++++ vdr-1.6.0-2/font.c 2008-05-03 11:59:24.000000000 +0200 +@@ -4,7 +4,7 @@ + * See the main source file 'vdr.c' for copyright information and + * how to reach the author. + * +- * $Id: font.c 1.25 2008/03/01 10:19:41 kls Exp $ ++ * $Id: font.c 1.25.1.1 2008/05/03 09:59:24 kls Exp $ + */ + + #include "font.h" +@@ -395,7 +395,7 @@ + FcFontSetDestroy(fontset); + FcPatternDestroy(pat); + FcObjectSetDestroy(os); +- FcFini(); ++ //FcFini(); // older versions of fontconfig are broken - and FcInit() can be called more than once + FontNames->Sort(); + } + return FontNames->Size() > 0; +@@ -431,7 +431,7 @@ + esyslog("ERROR: no usable font found for '%s'", FontName); + FcPatternDestroy(pat); + free(fn); +- FcFini(); ++ //FcFini(); // older versions of fontconfig are broken - and FcInit() can be called more than once + } + return FontFileName; + } +diff -ruN vdr-1.6.0-1/i18n.c vdr-1.6.0-2/i18n.c +--- vdr-1.6.0-1/i18n.c 2008-01-19 13:07:11.000000000 +0100 ++++ vdr-1.6.0-2/i18n.c 2008-09-06 14:21:17.000000000 +0200 +@@ -4,7 +4,7 @@ + * See the main source file 'vdr.c' for copyright information and + * how to reach the author. + * +- * $Id: i18n.c 1.319 2008/01/19 12:07:11 kls Exp $ ++ * $Id: i18n.c 1.319.1.1 2008/09/06 12:21:17 kls Exp $ + * + * + */ +@@ -45,7 +45,7 @@ + "por", + "fra,fre", + "nor", +- "fin,smi", ++ "fin,suo", + "pol", + "esl,spa", + "ell,gre", +diff -ruN vdr-1.6.0-1/libsi/si.h vdr-1.6.0-2/libsi/si.h +--- vdr-1.6.0-1/libsi/si.h 2007-04-22 15:32:09.000000000 +0200 ++++ vdr-1.6.0-2/libsi/si.h 2008-09-06 14:40:49.000000000 +0200 +@@ -6,7 +6,7 @@ + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * +- * $Id: si.h 1.17 2007/04/22 13:32:09 kls Exp $ ++ * $Id: si.h 1.17.1.1 2008/09/06 12:40:49 kls Exp $ + * * + ***************************************************************************/ + +@@ -28,7 +28,7 @@ + TableIdNIT_other = 0x41, //network information section, other network + TableIdSDT = 0x42, //service description section + TableIdSDT_other = 0x46, +- TableIdBAT = 0x46, //bouquet association section ++ TableIdBAT = 0x4A, //bouquet association section + TableIdEIT_presentFollowing = 0x4E, //event information section + TableIdEIT_presentFollowing_other = 0x4F, + //range from 0x50 to 0x5F +diff -ruN vdr-1.6.0-1/po/it_IT.po vdr-1.6.0-2/po/it_IT.po +--- vdr-1.6.0-1/po/it_IT.po 2008-03-09 11:33:04.000000000 +0100 ++++ vdr-1.6.0-2/po/it_IT.po 2008-04-19 12:03:16.000000000 +0200 +@@ -12,9 +12,9 @@ + "Project-Id-Version: VDR 1.6.0\n" + "Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n" + "POT-Creation-Date: 2008-02-10 12:22+0100\n" +-"PO-Revision-Date: 2008-03-08 21:06+0100\n" ++"PO-Revision-Date: 2008-04-17 01:07+0100\n" + "Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n" +-"Language-Team: Italian\n" ++"Language-Team: Italian\n" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=ISO-8859-15\n" + "Content-Transfer-Encoding: 8bit\n" +@@ -221,7 +221,7 @@ + msgstr "Disco" + + msgid "free" +-msgstr "liberi" ++msgstr "disponibile" + + msgid "Free To Air" + msgstr "in chiaro" +@@ -230,7 +230,7 @@ + msgstr "codificato" + + msgid "auto" +-msgstr "automatico" ++msgstr "automatica" + + msgid "Edit channel" + msgstr "Modifica canale" +@@ -293,7 +293,7 @@ + msgstr "CoderateH" + + msgid "none" +-msgstr "nessuno" ++msgstr "nessuna" + + msgid "CoderateL" + msgstr "CoderateL" +@@ -404,20 +404,20 @@ + msgstr "Prossimi programmi" + + msgid "Button$Next" +-msgstr "Prossimo" ++msgstr "Prossimi" + + msgid "Button$Now" + msgstr "Adesso" + + msgid "Button$Schedule" +-msgstr "Programma" ++msgstr "Programmi" + + msgid "Can't switch channel!" + msgstr "Impossibile cambiare canale!" + + #, c-format + msgid "Schedule - %s" +-msgstr "Programma - %s" ++msgstr "Programmi - %s" + + #, c-format + msgid "This event - %s" +@@ -500,7 +500,7 @@ + msgstr "Altezza OSD" + + msgid "Setup.OSD$Message time (s)" +-msgstr "Tempo del messaggio (s)" ++msgstr "Durata del messaggio (s)" + + msgid "Setup.OSD$Use small font" + msgstr "Utilizza caratteri piccoli" +@@ -572,7 +572,7 @@ + msgstr "Mostra vecchi dati EPG (min)" + + msgid "Setup.EPG$Set system time" +-msgstr "Imposta orario automatico" ++msgstr "Imposta orario di sistema" + + msgid "Setup.EPG$Use time from transponder" + msgstr "Utilizza orario da transponder" +@@ -628,7 +628,7 @@ + msgstr "Dolby Digital" + + msgid "Setup.DVB$Update channels" +-msgstr "Aggiorna i canali" ++msgstr "Aggiornamento canali" + + msgid "Setup.DVB$Audio languages" + msgstr "Lingue audio" +@@ -739,7 +739,7 @@ + msgstr "Nome reg. immediata" + + msgid "Setup.Recording$Instant rec. time (min)" +-msgstr "Tempo reg. immediata (min)" ++msgstr "Durata reg. immediata (min)" + + msgid "Setup.Recording$Max. video file size (MB)" + msgstr "Dim. massima file video (MB)" +@@ -899,7 +899,7 @@ + msgstr "Plugin" + + msgid "Up/Dn for new location - OK to move" +-msgstr "Su/Giù per nuova posizione - OK per muovere" ++msgstr "Su/Giù per nuova posizione - OK per spostare" + + msgid "Channel locked (recording)!" + msgstr "Canale bloccato (in registrazione)!" +diff -ruN vdr-1.6.0-1/remux.h vdr-1.6.0-2/remux.h +--- vdr-1.6.0-1/remux.h 2007-09-02 12:19:06.000000000 +0200 ++++ vdr-1.6.0-2/remux.h 2008-09-06 16:34:42.000000000 +0200 +@@ -4,14 +4,12 @@ + * See the main source file 'vdr.c' for copyright information and + * how to reach the author. + * +- * $Id: remux.h 1.17 2007/09/02 10:19:06 kls Exp $ ++ * $Id: remux.h 1.17.1.1 2008/09/06 14:34:42 kls Exp $ + */ + + #ifndef __REMUX_H + #define __REMUX_H + +-#include <time.h> //XXX FIXME: DVB/linux/dvb/dmx.h should include <time.h> itself!!! +-#include <linux/dvb/dmx.h> + #include "ringbuffer.h" + #include "tools.h" + +diff -ruN vdr-1.6.0-1/sources.conf vdr-1.6.0-2/sources.conf +--- vdr-1.6.0-1/sources.conf 2007-02-17 17:15:13.000000000 +0100 ++++ vdr-1.6.0-2/sources.conf 2008-08-16 12:06:30.000000000 +0200 +@@ -19,29 +19,34 @@ + + # Europe + +-S5E Sirius 2/3 ++S3E Telecom 2C ++S4E Eurobird 4 ++S5E Sirius 4 + S7E Eutelsat W3A ++S9E Eurobird 9 + S10E Eutelsat W1 +-S13E Hotbird 1-3/6/7A ++S13E Hotbird 6/7A/8 + S16E Eutelsat W2 +-S19.2E Astra 1B/C/E/F/G/H/2C ++S19.2E Astra F/G/H/KR/L + S21.0E Afristar 1 + S21.6E Eutelsat W6 +-S23.5E Astra 1D 3A +-S26E Arabsat 2D/2C/3A ++S23.5E Astra 1E/3A ++S25.5E Eurobird 2 ++S26E Badr 3/4/6 + S28.2E Astra 2D/A/B +-S28.5E Eurobird 1 & Astra 2A/B/D ++S28.5E Eurobird 1 & Astra 2A/B/C/D + S30.5E Arabsat 2B ++S31.5E Astra 1D/5A + S33E Eurobird 3 & Intelsat 802 + S36E Eutelsat W4 & Sesat + S38E Paksat 1 + S39E Hellas Sat 2 + S40E Express AM1 +-S42E Turksat 1C/2A ++S42E Turksat 2A/3A + S45E Intelsat 12 + S49E Yamal 202 + S53E Express AM 22 +-S55E Insat 3E & Intelsat 702 ++S55E Insat 3E + S56E Bonum 1 + S57E NSS 703 + S60E Intelsat 904 +@@ -54,10 +59,10 @@ + + # Asia + +-S74E Insat 3C & Edusat +-S75E LMI 1 ++S74E Insat 3C/4CR & Edusat ++S75E ABS 1 + S76.5E Telstar 10 +-S78.5E Thaicom 2/3 ++S78.5E Thaicom 2/5 + S80E Express AM2 + S83E Insat 2E/3B/4A + S85.2E Intelsat 709 +@@ -65,14 +70,17 @@ + S88E ST 1 + S90E Yamal 201 + S91.5E Measat 1 +-S93.5E Insat 3A ++S92.2E Chinasat 9 ++S93.5E Insat 3A/4B + S95E NSS 6 +-S96.5E Express AM 11 ++S96.5E Express AM 33 ++S98.5E Protostar 1 + S100.5E Asiasat 2 + S103E Express A2 ++S105E Asiastar + S105.5E Asiasat 3S + S107.7E Cakrawarta 1 +-S108E Telkom 1 & AAP 1 ++S108E Telkom 1 & NSS 11 + S110E N-Sat 110 & BSAT 1A/2A + S110.5E Sinosat 1 + S113E Palapa C2 & Koreasat 2 +@@ -81,38 +89,38 @@ + S120E Thaicom 1A + S122.2E Asiasat 4 + S124E JCSAT 4a ++S125E Sinosat 3 + S128E JCSAT 3 +-S132E N-Star A ++S132E Vinasat 1 & JCSAT5a + S134E Apstar 6 +-S136E N-Star B + S138E Telstar 18 + S140E Express AM 3 + S144E Superbird C + S146E Agila 2 + S148E Measat 2 + S150E JCSAT R +-S152E Optus B3 ++S152E Optus D2 + S154E JCSAT 2A + S156E Optus C1 + S158E Superbird A +-S160E Optus B1 ++S160E Optus D1 + S162E Superbird B2 +-S164E Optus A3 ++S164E Optus B3 + S166E Intelsat 8 + S169E Intelsat 2 +-S172E AMC 23 ++S172E GE 23 + S180E Intelsat 701 + S177W NSS 5 + + # Atlantic + +-S1W Thor 2/3 & Intelsat 10-02 +-S4W Amos 1/2 ++S1W Thor 3/5 & Intelsat 10-02 ++S4W Amos 1/2/3 + S5W Atlantic Bird 3 +-S7W Nilesat 101 & 102 ++S7W Nilesat 101/102 & Atlantic Bird 4 + S8W Telecom 2D & Atlantic Bird 2 + S11W Express A3 +-S12.5W Atlantic Bird 2 ++S12.5W Atlantic Bird 1 + S14W Express A4 + S15W Telstar 12 + S18W Intelsat 901 +@@ -123,9 +131,9 @@ + S30W Hispasat 1C/1D + S31.5W Intelsat 801 + S34.5W Intelsat 903 +-S37.5W Telstar 11 & AMC 12 ++S37.5W NSS 10 + S40.5W NSS 806 +-S43W Intelsat 3R/6B ++S43W Intelsat 3R/11 + S45W Intelsat 1R + S50W Intelsat 705 + S53W Intelsat 707 +@@ -137,47 +145,45 @@ + + S61.5W Echostar 3 & Rainbow 1 + S63W Estrelo de Sul 1 +-S65W Brasilsat B2 +-S70W Brasilsat B1 ++S65W Star One C1 ++S70W Star One C2 + S72W Nahuel 1 & AMC 6 +-S72.5W DirecTV 1 +-S74W SBS 6 +-S77W Echostar 4 ++S72.5W DirecTV 1R & Echostar 6 ++S74W Horizons 2 ++S77W Echostar 4 & Galaxy 4R + S79W AMC5 +-S79.5W Nimiq 3 + S82W Nimiq 2 + S83W AMC 9 +-S84W Brasilsat B3 +-S85W AMC 2 ++S84W Brasilsat B3/4 ++S85W AMC 16 + S85.1W XM 3 + S87W AMC3 + S89W Galaxy 28 +-S91W Galaxy 11 & Nimiq 1 +-S91.5W DirecTV 2 +-S92W Brasilsat B4 ++S91W Galaxy 11/17 & Nimiq 1 ++S92W Brasilsat B2 + S93W Galaxy 26 + S95W Galaxy 3C + S97W Galaxy 25 +-S99W Galaxy 4R +-S99.2W Spaceway 2 +-S101W DirecTV 1R/4S/8 & AMC4 ++S99W Galaxy 16 ++S99.2W Spaceway 2 & DirecTV 11 ++S101W DirecTV 4S/8 & AMC 2/4 + S103W AMC1 +-S105W AMC15 ++S105W AMC15/18 + S107.3W Anik F1/F1R +-S110W DirecTV 5 & Echostar 6/8/10 ++S110W DirecTV 5 & Echostar 8/10 + S111.1W Anik F2 +-S113W Solidaridad 2 +-S119W Echostar 7 & DirecTV 7S ++S113W SatMex 6 ++S116.8W SatMex 5 ++S119W Anik F3 & Echostar 7 & DirecTV 7S + S121W Echostar 9 & Galaxy 23 +-S123W Galaxy 10R ++S123W Galaxy 18 + S125W Galaxy 14 + S127W Galaxy 13/Horizons 1 + S129W Echostar 5 & Galaxy 27 + S131W AMC 11 +-S133W Galaxy15/1R ++S133W Galaxy15 + S135W AMC 10 + S137W AMC 7 +-S138.5W Echostar 10 + S139W AMC 8 + S148W Echostar 1/2 + +diff -ruN vdr-1.6.0-1/svdrp.c vdr-1.6.0-2/svdrp.c +--- vdr-1.6.0-1/svdrp.c 2008-02-17 14:36:01.000000000 +0100 ++++ vdr-1.6.0-2/svdrp.c 2008-05-02 16:29:16.000000000 +0200 +@@ -10,7 +10,7 @@ + * and interact with the Video Disk Recorder - or write a full featured + * graphical interface that sits on top of an SVDRP connection. + * +- * $Id: svdrp.c 1.109 2008/02/17 13:36:01 kls Exp $ ++ * $Id: svdrp.c 1.109.1.1 2008/05/02 14:29:16 kls Exp $ + */ + + #include "svdrp.h" +@@ -1606,7 +1606,7 @@ + char buffer[BUFSIZ]; + gethostname(buffer, sizeof(buffer)); + time_t now = time(NULL); +- Reply(220, "%s SVDRP VideoDiskRecorder %s; %s", buffer, VDRVERSION, *TimeToString(now)); ++ Reply(220, "%s SVDRP VideoDiskRecorder %s; %s; %s", buffer, VDRVERSION, *TimeToString(now), cCharSetConv::SystemCharacterTable() ? cCharSetConv::SystemCharacterTable() : "UTF-8"); + } + if (NewConnection) + lastActivity = time(NULL); +diff -ruN vdr-1.6.0-1/thread.c vdr-1.6.0-2/thread.c +--- vdr-1.6.0-1/thread.c 2008-02-15 15:17:42.000000000 +0100 ++++ vdr-1.6.0-2/thread.c 2008-08-16 13:00:40.000000000 +0200 +@@ -4,7 +4,7 @@ + * See the main source file 'vdr.c' for copyright information and + * how to reach the author. + * +- * $Id: thread.c 1.64 2008/02/15 14:17:42 kls Exp $ ++ * $Id: thread.c 1.64.1.1 2008/08/16 11:00:40 kls Exp $ + */ + + #include "thread.h" +@@ -24,11 +24,12 @@ + { + struct timeval now; + if (gettimeofday(&now, NULL) == 0) { // get current time +- now.tv_usec += MillisecondsFromNow * 1000; // add the timeout +- while (now.tv_usec >= 1000000) { // take care of an overflow +- now.tv_sec++; +- now.tv_usec -= 1000000; +- } ++ now.tv_sec += MillisecondsFromNow / 1000; // add full seconds ++ now.tv_usec += (MillisecondsFromNow % 1000) * 1000; // add microseconds ++ if (now.tv_usec >= 1000000) { // take care of an overflow ++ now.tv_sec++; ++ now.tv_usec -= 1000000; ++ } + Abstime->tv_sec = now.tv_sec; // seconds + Abstime->tv_nsec = now.tv_usec * 1000; // nano seconds + return true; +diff -ruN vdr-1.6.0-1/vdr.c vdr-1.6.0-2/vdr.c +--- vdr-1.6.0-1/vdr.c 2008-03-14 14:22:39.000000000 +0100 ++++ vdr-1.6.0-2/vdr.c 2008-09-06 13:07:52.000000000 +0200 +@@ -22,7 +22,7 @@ + * + * The project's page is at http://www.cadsoft.de/vdr + * +- * $Id: vdr.c 1.313 2008/03/14 13:22:39 kls Exp $ ++ * $Id: vdr.c 1.313.1.1 2008/09/06 11:07:52 kls Exp $ + */ + + #include <getopt.h> +@@ -141,7 +141,6 @@ + + static void SignalHandler(int signum) + { +- isyslog("caught signal %d", signum); + switch (signum) { + case SIGPIPE: + break; +@@ -1288,9 +1287,11 @@ + ReportEpgBugFixStats(); + if (WatchdogTimeout > 0) + dsyslog("max. latency time %d seconds", MaxLatencyTime); +- isyslog("exiting, exit code %d", ShutdownHandler.GetExitCode()); ++ if (LastSignal) ++ isyslog("caught signal %d", LastSignal); + if (ShutdownHandler.EmergencyExitRequested()) + esyslog("emergency exit!"); ++ isyslog("exiting, exit code %d", ShutdownHandler.GetExitCode()); + if (SysLogLevel > 0) + closelog(); + if (HasStdin) --- vdr-1.6.0.orig/debian/patches/17_vdr-maintenance-1.6.0-1.dpatch +++ vdr-1.6.0/debian/patches/17_vdr-maintenance-1.6.0-1.dpatch @@ -0,0 +1,179 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 17_vdr-maintenance-1.6.0-1.dpatch by Klaus Schmidinger <kls@cadsoft.de> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: VDR 1.6.0 maintenance patch #1 + +@DPATCH@ +diff -ruN vdr-1.6.0/CONTRIBUTORS vdr-1.6.0-1/CONTRIBUTORS +--- vdr-1.6.0/CONTRIBUTORS 2008-03-18 18:34:00.000000000 +0100 ++++ vdr-1.6.0-1/CONTRIBUTORS 2008-04-13 15:34:03.000000000 +0200 +@@ -595,6 +595,8 @@ + not two hex digits after the '#' + for suggesting to suppress the automatic shutdown if the remote control is + currently disabled ++ for suggesting to improve logging system time changes to avoid problems on slow ++ systems under heavy load + + Jeremy Hall <jhall@UU.NET> + for fixing an incomplete initialization of the filter parameters in eit.c +@@ -958,6 +960,7 @@ + for making the SVDRP command LSTC list the channels with group separators if the + option ':groups' is given + for fixing handling 3 and 4 byte UTF-8 symbols in Utf8CharGet() ++ for fixing initializing the timer's flags in the cTimer copy constructor + + Olivier Jacques <jacquesolivier@hotmail.com>) + for translating OSD texts to the French language +@@ -1174,6 +1177,7 @@ + for reporting an invalid access in the section handler when ending VDR + for pointing out that cDevice::Transferring() doesn't return the right value in the + early stage of channel switching ++ for fixing handling the counter in detection of pre 1.3.19 PS data + + Richard Robson <richard_robson@beeb.net> + for reporting freezing replay if a timer starts while in Transfer Mode from the +@@ -1506,6 +1510,7 @@ + for translating OSD texts to the Estonian language + for fixing a missing ',' in the Greek OSD texts + for fixing a missing ',' in the Swedish OSD texts ++ for reporting problems with CAMs when checking the CAM status too frequently + + Milos Kapoun <m.kapoun@cra.cz> + for suggesting to skip code table info in SI data +diff -ruN vdr-1.6.0/HISTORY vdr-1.6.0-1/HISTORY +--- vdr-1.6.0/HISTORY 2008-03-23 11:26:08.000000000 +0100 ++++ vdr-1.6.0-1/HISTORY 2008-04-13 15:33:46.000000000 +0200 +@@ -5729,3 +5729,14 @@ + - Added Chinese language texts (thanks to Nan Feng). + - Updated the Portuguese language texts. + - Added a note about VDR_CHARSET_OVERRIDE to the INSTALL file. ++ ++2008-04-13: Version 1.6.0-1 ++ ++- Fixed handling the counter in detection of pre 1.3.19 PS data (thanks to Reinhard ++ Nissl). ++- Improved logging system time changes to avoid problems on slow systems under ++ heavy load (suggested by Helmut Auer). ++- Fixed initializing the timer's flags in the cTimer copy constructor (thanks to ++ Andreas Mair). ++- Increased the time between checking the CAM status to 500ms to avoid problems ++ with some CAMs (reported by Arthur Konovalov). +diff -ruN vdr-1.6.0/ci.c vdr-1.6.0-1/ci.c +--- vdr-1.6.0/ci.c 2007-04-30 15:02:49.000000000 +0200 ++++ vdr-1.6.0-1/ci.c 2008-04-13 15:33:32.000000000 +0200 +@@ -4,7 +4,7 @@ + * See the main source file 'vdr.c' for copyright information and + * how to reach the author. + * +- * $Id: ci.c 1.48 2007/04/30 13:02:49 kls Exp $ ++ * $Id: ci.c 1.48.1.1 2008/04/13 13:33:32 kls Exp $ + */ + + #include "ci.h" +@@ -1525,7 +1525,7 @@ + + cCamSlots CamSlots; + +-#define MODULE_CHECK_INTERVAL 100 // ms ++#define MODULE_CHECK_INTERVAL 500 // ms + #define MODULE_RESET_TIMEOUT 2 // s + + cCamSlot::cCamSlot(cCiAdapter *CiAdapter) +diff -ruN vdr-1.6.0/config.h vdr-1.6.0-1/config.h +--- vdr-1.6.0/config.h 2008-03-23 11:26:10.000000000 +0100 ++++ vdr-1.6.0-1/config.h 2008-04-13 13:09:42.000000000 +0200 +@@ -4,7 +4,7 @@ + * See the main source file 'vdr.c' for copyright information and + * how to reach the author. + * +- * $Id: config.h 1.310 2008/03/23 10:26:10 kls Exp $ ++ * $Id: config.h 1.310.1.1 2008/04/13 11:09:42 kls Exp $ + */ + + #ifndef __CONFIG_H +@@ -22,7 +22,7 @@ + + // VDR's own version number: + +-#define VDRVERSION "1.6.0" ++#define VDRVERSION "1.6.0-1" + #define VDRVERSNUM 10600 // Version * 10000 + Major * 100 + Minor + + // The plugin API's version number: +diff -ruN vdr-1.6.0/device.c vdr-1.6.0-1/device.c +--- vdr-1.6.0/device.c 2008-03-09 11:03:34.000000000 +0100 ++++ vdr-1.6.0-1/device.c 2008-04-13 13:16:00.000000000 +0200 +@@ -4,7 +4,7 @@ + * See the main source file 'vdr.c' for copyright information and + * how to reach the author. + * +- * $Id: device.c 1.157 2008/03/09 10:03:34 kls Exp $ ++ * $Id: device.c 1.157.1.1 2008/04/13 11:16:00 kls Exp $ + */ + + #include "device.h" +@@ -1273,7 +1273,7 @@ + uchar SubStreamIndex = SubStreamId & 0x1F; + + // Compatibility mode for old VDR recordings, where 0xBD was only AC3: +-pre_1_3_19_PrivateStreamDeteced: ++pre_1_3_19_PrivateStreamDetected: + if (pre_1_3_19_PrivateStream > MIN_PRE_1_3_19_PRIVATESTREAM) { + SubStreamId = c; + SubStreamType = 0x80; +@@ -1314,7 +1314,8 @@ + if (pre_1_3_19_PrivateStream > MIN_PRE_1_3_19_PRIVATESTREAM) { + dsyslog("switching to pre 1.3.19 Dolby Digital compatibility mode - substream id = %02X", SubStreamId); + ClrAvailableTracks(); +- goto pre_1_3_19_PrivateStreamDeteced; ++ pre_1_3_19_PrivateStream = MIN_PRE_1_3_19_PRIVATESTREAM + 1; ++ goto pre_1_3_19_PrivateStreamDetected; + } + } + } +diff -ruN vdr-1.6.0/eit.c vdr-1.6.0-1/eit.c +--- vdr-1.6.0/eit.c 2007-08-26 12:56:33.000000000 +0200 ++++ vdr-1.6.0-1/eit.c 2008-04-13 13:46:38.000000000 +0200 +@@ -8,7 +8,7 @@ + * Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>. + * Adapted to 'libsi' for VDR 1.3.0 by Marcel Wiesweg <marcel.wiesweg@gmx.de>. + * +- * $Id: eit.c 1.126 2007/08/26 10:56:33 kls Exp $ ++ * $Id: eit.c 1.126.1.1 2008/04/13 11:46:38 kls Exp $ + */ + + #include "eit.h" +@@ -300,9 +300,9 @@ + if (diff > 2) { + mutex.Lock(); + if (abs(diff - lastDiff) < 3) { +- isyslog("System Time = %s (%ld)", *TimeToString(loctim), loctim); +- isyslog("Local Time = %s (%ld)", *TimeToString(sattim), sattim); +- if (stime(&sattim) < 0) ++ if (stime(&sattim) == 0) ++ isyslog("system time changed from %s (%ld) to %s (%ld)", *TimeToString(loctim), loctim, *TimeToString(sattim), sattim); ++ else + esyslog("ERROR while setting system time: %m"); + } + lastDiff = diff; +diff -ruN vdr-1.6.0/timers.c vdr-1.6.0-1/timers.c +--- vdr-1.6.0/timers.c 2008-02-16 15:47:40.000000000 +0100 ++++ vdr-1.6.0-1/timers.c 2008-04-13 14:47:12.000000000 +0200 +@@ -4,7 +4,7 @@ + * See the main source file 'vdr.c' for copyright information and + * how to reach the author. + * +- * $Id: timers.c 1.73 2008/02/16 14:47:40 kls Exp $ ++ * $Id: timers.c 1.73.1.1 2008/04/13 12:47:12 kls Exp $ + */ + + #include "timers.h" +@@ -92,6 +92,7 @@ + channel = NULL; + aux = NULL; + event = NULL; ++ flags = tfNone; + *this = Timer; + } + --- vdr-1.6.0.orig/debian/patches/opt-43-x_recordshowfree.dpatch +++ vdr-1.6.0/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.6.0.orig/debian/patches/opt-47_sourcecaps.dpatch +++ vdr-1.6.0/debian/patches/opt-47_sourcecaps.dpatch @@ -0,0 +1,220 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-21_sourcecaps.dpatch by Christian Schuld <chris@sonnengesicht.de> +## http://linvdr.org/mailinglists/vdr/2004/08/msg00521.html +## http://article.gmane.org/gmane.linux.vdr/27260/ +## +## Thomas Günther <tom@toms-cafe.de>: +## - adapted to VDR-1.5.0 +## Tobias Grimm <tg@e-tobi.net>: +## - adapted to VDR-1.5.16 +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Patch for assigning special satellites to one dvb card. + +@DPATCH@ +diff -urNad vdr-1.5.16~/config.c vdr-1.5.16/config.c +--- vdr-1.5.16~/config.c 2008-02-25 21:00:06.000000000 +0100 ++++ vdr-1.5.16/config.c 2008-02-25 21:00:06.000000000 +0100 +@@ -15,6 +15,7 @@ + #include "interface.h" + #include "plugin.h" + #include "recording.h" ++#include "sources.h" + + // IMPORTANT NOTE: in the 'sscanf()' calls there is a blank after the '%d' + // format characters in order to allow any number of blanks after a numeric +@@ -264,6 +265,8 @@ + LnbFrequLo = 9750; + LnbFrequHi = 10600; + DiSEqC = 0; ++ memset(SourceCaps, 0, sizeof SourceCaps); ++ SourceCapsSet = false; + SetSystemTime = 0; + TimeSource = 0; + TimeTransponder = 0; +@@ -436,6 +439,49 @@ + return true; + } + ++void cSetup::StoreSourceCaps(const char *Name) ++{ ++ cSetupLine *l; ++ while ((l = Get(Name)) != NULL) ++ Del(l); ++ ++ for (int i = 0; i < MAXDEVICES; i++) { ++ char buffer[MAXSOURCECAPS*8]={0,}, *q = buffer; ++ int j = 0; ++ while (SourceCaps[i][j] && j < MAXSOURCECAPS) { ++ if (j==0) ++ q += snprintf(buffer, sizeof(buffer), "%i ", i+1); ++ q += snprintf(q, sizeof(buffer) - (q-buffer), "%s ", *cSource::ToString(SourceCaps[i][j++])); ++ } ++ if (*buffer) ++ Store(Name, buffer, NULL, true); ++ } ++} ++ ++bool cSetup::ParseSourceCaps(const char *Value) ++{ ++ char *p; ++ int d = strtol(Value, &p, 10)-1, i = 0; ++ while (p < Value+strlen(Value)) { ++ if (*p==0) return true; ++ if (isblank(*p)) ++p; ++ if (isalpha(*p)) { ++ int source = cSource::FromString(p); ++ if (source != cSource::stNone) { ++ SourceCaps[d][i++] = source; ++ SourceCapsSet = true; ++ } ++ else ++ return false; ++ while (!isblank(*p) && *p) ++ ++p; ++ if (i>MAXSOURCECAPS) ++ return false; ++ } ++ } ++ return true; ++} ++ + bool cSetup::Parse(const char *Name, const char *Value) + { + if (!strcasecmp(Name, "OSDLanguage")) { strn0cpy(OSDLanguage, Value, sizeof(OSDLanguage)); I18nSetLocale(OSDLanguage); } +@@ -454,6 +500,7 @@ + else if (!strcasecmp(Name, "LnbFrequLo")) LnbFrequLo = atoi(Value); + else if (!strcasecmp(Name, "LnbFrequHi")) LnbFrequHi = atoi(Value); + else if (!strcasecmp(Name, "DiSEqC")) DiSEqC = atoi(Value); ++ else if (!strcasecmp(Name, "SourceCaps")) return ParseSourceCaps(Value); + 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); +@@ -557,6 +604,7 @@ + Store("LnbFrequLo", LnbFrequLo); + Store("LnbFrequHi", LnbFrequHi); + Store("DiSEqC", DiSEqC); ++ if (SourceCapsSet) StoreSourceCaps("SourceCaps"); + Store("SetSystemTime", SetSystemTime); + Store("TimeSource", cSource::ToString(TimeSource)); + Store("TimeTransponder", TimeTransponder); +diff -urNad vdr-1.5.16~/config.h vdr-1.5.16/config.h +--- vdr-1.5.16~/config.h 2008-02-25 21:00:06.000000000 +0100 ++++ vdr-1.5.16/config.h 2008-02-25 21:00:06.000000000 +0100 +@@ -54,6 +54,9 @@ + #define MINOSDHEIGHT 324 + #define MAXOSDHEIGHT 567 + ++#define MAXDEVICES 16 // the maximum number of devices in the system ++#define MAXSOURCECAPS 128 // the maximum number of different sources per device ++ + #define MaxFileName 256 + #define MaxSkinName 16 + #define MaxThemeName 16 +@@ -217,6 +220,8 @@ + void StoreLanguages(const char *Name, int *Values); + bool ParseLanguages(const char *Value, int *Values); + bool Parse(const char *Name, const char *Value); ++ void StoreSourceCaps(const char *Name); ++ bool ParseSourceCaps(const char *Value); + cSetupLine *Get(const char *Name, const char *Plugin = NULL); + void Store(const char *Name, const char *Value, const char *Plugin = NULL, bool AllowMultiple = false); + void Store(const char *Name, int Value, const char *Plugin = NULL); +@@ -239,6 +244,8 @@ + int LnbFrequLo; + int LnbFrequHi; + int DiSEqC; ++ int SourceCaps[MAXDEVICES][MAXSOURCECAPS]; ++ bool SourceCapsSet; + int SetSystemTime; + int TimeSource; + int TimeTransponder; +diff -urNad vdr-1.5.16~/device.c vdr-1.5.16/device.c +--- vdr-1.5.16~/device.c 2008-02-25 21:00:06.000000000 +0100 ++++ vdr-1.5.16/device.c 2008-02-25 21:00:06.000000000 +0100 +@@ -253,8 +253,10 @@ + for (int i = 0; i < MAXRECEIVERS; i++) + receiver[i] = NULL; + +- if (numDevices < MAXDEVICES) ++ if (numDevices < MAXDEVICES) { + device[numDevices++] = this; ++ SetSourceCaps(cardIndex); ++ } + else + esyslog("ERROR: too many devices!"); + } +@@ -457,6 +459,17 @@ + camSlot = CamSlot; + } + ++void cDevice::SetSourceCaps(int Index) ++{ ++ for (int d = 0; d < numDevices; d++) { ++ if (Index < 0 || Index == device[d]->CardIndex()) { ++ for (int i = 0; i < MAXSOURCECAPS; i++) ++ device[d]->sourceCaps[i] = Setup.SourceCaps[device[d]->CardIndex()][i]; ++ } ++ } ++} ++ ++ + void cDevice::Shutdown(void) + { + primaryDevice = NULL; +diff -urNad vdr-1.5.16~/device.h vdr-1.5.16/device.h +--- vdr-1.5.16~/device.h 2008-02-25 21:00:06.000000000 +0100 ++++ vdr-1.5.16/device.h 2008-02-25 21:00:50.000000000 +0100 +@@ -25,7 +25,6 @@ + #include "tools.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 + #define MAXRECEIVERS 16 // the maximum number of receivers per device + #define MAXVOLUME 255 +@@ -150,6 +149,8 @@ + static void SetAvoidDevice(cDevice *Device) { avoidDevice = Device; } + ///< Sets the given Device to be temporarily avoided in the next call to + ///< GetDevice(const cChannel, int, bool). ++ static void SetSourceCaps(int Index = -1); ++ ///< Sets the SourceCaps of the given device according to the Setup data. + static void Shutdown(void); + ///< Closes down all devices. + ///< Must be called at the end of the program. +@@ -157,6 +158,7 @@ + static int nextCardIndex; + int cardIndex; + protected: ++ int sourceCaps[MAXSOURCECAPS]; + cDevice(void); + virtual ~cDevice(); + virtual bool Ready(void); +diff -urNad vdr-1.5.16~/dvbdevice.c vdr-1.5.16/dvbdevice.c +--- vdr-1.5.16~/dvbdevice.c 2008-02-25 21:00:06.000000000 +0100 ++++ vdr-1.5.16/dvbdevice.c 2008-02-25 21:00:06.000000000 +0100 +@@ -762,6 +762,12 @@ + bool cDvbDevice::ProvidesSource(int Source) const + { + int type = Source & cSource::st_Mask; ++ if (Setup.SourceCapsSet && type == cSource::stSat && frontendType == FE_QPSK) { ++ for (int i = 0; i < MAXSOURCECAPS; i++) ++ if (sourceCaps[i] == Source) ++ return true; ++ return false; ++ } + return type == cSource::stNone + || type == cSource::stCable && frontendType == FE_QAM + || type == cSource::stSat && frontendType == FE_QPSK +diff -urNad vdr-1.5.16~/sources.c vdr-1.5.16/sources.c +--- vdr-1.5.16~/sources.c 2008-02-25 21:00:06.000000000 +0100 ++++ vdr-1.5.16/sources.c 2008-02-25 21:00:06.000000000 +0100 +@@ -70,7 +70,7 @@ + int pos = 0; + bool dot = false; + bool neg = false; +- while (*++s) { ++ while (*++s && !isblank(*s)) { + switch (toupper(*s)) { + case '0' ... '9': pos *= 10; + pos += *s - '0'; --- vdr-1.6.0.orig/debian/patches/list_uncritical_patches +++ vdr-1.6.0/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.6.0.orig/debian/patches/12_osdbase-maxitems.dpatch +++ vdr-1.6.0/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.6.0.orig/debian/patches/opt-37-x_menuorg.dpatch +++ vdr-1.6.0/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.6.0.orig/debian/patches/opt-29_syncearly.dpatch +++ vdr-1.6.0/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.6.0.orig/debian/patches/opt-31-x_reelchannelscan.dpatch +++ vdr-1.6.0/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 Günther <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.6.0.orig/debian/patches/opt-51_cuttime.dpatch +++ vdr-1.6.0/debian/patches/opt-51_cuttime.dpatch @@ -0,0 +1,121 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-32_cuttime.dpatch by Udo Richter <udo_richter@gmx.de> +## +## Thomas Günther <tom@toms-cafe.de>: +## - adapted to VDR-1.5.7 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 -Naur vdr-1.5.7-liemikuutio/config.c vdr-1.5.7-liemikuutio-cuttime/config.c +--- vdr-1.5.7-liemikuutio/config.c 2007-08-12 19:29:08.000000000 +0000 ++++ vdr-1.5.7-liemikuutio-cuttime/config.c 2007-08-12 19:30:55.000000000 +0000 +@@ -214,6 +214,7 @@ + + cSetup::cSetup(void) + { ++ CutTimePatchEnabled = 0; + strcpy(OSDLanguage, ""); // default is taken from environment + strcpy(OSDSkin, "sttng"); + strcpy(OSDTheme, "default"); +@@ -464,6 +465,7 @@ + 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; +@@ -546,6 +548,7 @@ + Store("ShowRecLength", ShowRecLength); + Store("ShowProgressBar", ShowProgressBar); + Store("MenuCmdPosition", MenuCmdPosition); ++ Store("CutTimePatchEnabled",CutTimePatchEnabled); + + Sort(); + +diff -Naur vdr-1.5.7-liemikuutio/config.h vdr-1.5.7-liemikuutio-cuttime/config.h +--- vdr-1.5.7-liemikuutio/config.h 2007-08-12 19:29:08.000000000 +0000 ++++ vdr-1.5.7-liemikuutio-cuttime/config.h 2007-08-12 19:29:39.000000000 +0000 +@@ -265,6 +265,7 @@ + int InitialChannel; + int InitialVolume; + int ShowRecDate, ShowRecTime, ShowRecLength, ShowProgressBar, MenuCmdPosition; ++ int CutTimePatchEnabled; + int __EndData__; + cSetup(void); + cSetup& operator= (const cSetup &s); +diff -Naur vdr-1.5.7-liemikuutio/cutter.c vdr-1.5.7-liemikuutio-cuttime/cutter.c +--- vdr-1.5.7-liemikuutio/cutter.c 2006-07-30 10:22:08.000000000 +0000 ++++ vdr-1.5.7-liemikuutio-cuttime/cutter.c 2007-08-12 19:29:39.000000000 +0000 +@@ -190,6 +190,14 @@ + error = false; + ended = false; + cRecording Recording(FileName); ++ ++ if (Setup.CutTimePatchEnabled) { ++ cMarks FromMarks; ++ FromMarks.Load(FileName); ++ cMark *First=FromMarks.First(); ++ if (First) Recording.SetStartTime(Recording.start+((First->position/FRAMESPERSEC+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 -Naur vdr-1.5.7-liemikuutio/menu.c vdr-1.5.7-liemikuutio-cuttime/menu.c +--- vdr-1.5.7-liemikuutio/menu.c 2007-08-12 19:29:08.000000000 +0000 ++++ vdr-1.5.7-liemikuutio-cuttime/menu.c 2007-08-12 19:29:39.000000000 +0000 +@@ -2887,6 +2887,7 @@ + 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 -Naur vdr-1.5.7-liemikuutio/po/de_DE.po vdr-1.5.7-liemikuutio-cuttime/po/de_DE.po +--- vdr-1.5.7-liemikuutio/po/de_DE.po 2007-08-12 12:18:04.000000000 +0000 ++++ vdr-1.5.7-liemikuutio-cuttime/po/de_DE.po 2007-08-21 21:58:37.000000000 +0000 +@@ -606,2 +606,5 @@ +-msgid "Setup.Recording$Show length" +-msgstr "Länge der Aufnahme anzeigen" ++msgid "Setup.Recording$Show length" ++msgstr "Länge der Aufnahme anzeigen" ++ ++msgid "Setup.CutTimePatch$Adapt start time to cutting marks" ++msgstr "Startzeit an Schnittmarken anpassen" +diff -Naur vdr-1.5.7-liemikuutio/recording.c vdr-1.5.7-liemikuutio-cuttime/recording.c +--- vdr-1.5.7-liemikuutio/recording.c 2007-08-12 19:29:08.000000000 +0000 ++++ vdr-1.5.7-liemikuutio-cuttime/recording.c 2007-08-12 19:29:39.000000000 +0000 +@@ -780,6 +780,15 @@ + 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 -Naur vdr-1.5.7-liemikuutio/recording.h vdr-1.5.7-liemikuutio-cuttime/recording.h +--- vdr-1.5.7-liemikuutio/recording.h 2007-08-12 19:29:08.000000000 +0000 ++++ vdr-1.5.7-liemikuutio-cuttime/recording.h 2007-08-12 19:29:39.000000000 +0000 +@@ -89,6 +89,7 @@ + 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.6.0.orig/debian/patches/15_dvbplayer.dpatch +++ vdr-1.6.0/debian/patches/15_dvbplayer.dpatch @@ -0,0 +1,253 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 15_dvbplayer.dpatch by Reinhard Nissl <rnissl@gmx.de> +## http://home.vr-web.de/~rnissl/vdr-1.3.31-dvbplayer5.patch +## +## Thomas Günther <tom@toms-cafe.de>: +## - adapted to VDR-1.3.43 +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Fixes VDR's recording replayer to send proper I-frames to a device. +## DP: Without this patch it is very likely that incomplete I-frames are sent +## DP: and therefore many I-frames will not be displayed by devices like +## DP: vdr-xine or dxr3. This patch has a very positive effect on moving +## DP: cutting marks and all fast trickspeed modes as well as slow motion +## DP: rewind. +## DP: NOTE: without this patch it is likely that xine disconnects from +## DP: vdr-xine while moving cut marks. + +@DPATCH@ +diff -urNad vdr-1.4.6~/dvbplayer.c vdr-1.4.6/dvbplayer.c +--- vdr-1.4.6~/dvbplayer.c 2007-05-01 21:22:11.000000000 +0200 ++++ vdr-1.4.6/dvbplayer.c 2007-05-01 21:29:43.000000000 +0200 +@@ -363,6 +363,202 @@ + Cancel(9); + } + ++// --- BEGIN fix for I frames ------------------------------------------- ++// ++// Prior to the introduction of cVideoRepacker, VDR didn't start a new ++// PES packet when a new frame started. So, it was likely that the tail ++// of an I frame was at the beginning of the packet which started the ++// following B frame. Due to the organisation of VDR's index file, VDR ++// typically didn't read the tail of the I frame and therefore caused ++// softdevice plugins to not render such a frame as it was incomplete, ++// e. g. when moving cutting marks. ++// ++// The following code tries to fix incomplete I frames for recordings ++// made prior to the introdcution of cVideoRepacker, to be able to ++// edit cutting marks for example with softdevice plugins like vdr-xine. ++// ++ ++#if VDRVERSNUM < 10331 ++ ++enum ePesHeader { ++ phNeedMoreData = -1, ++ phInvalid = 0, ++ phMPEG1 = 1, ++ phMPEG2 = 2 ++ }; ++ ++static ePesHeader AnalyzePesHeader(const uchar *Data, int Count, int &PesPayloadOffset, bool *ContinuationHeader = NULL) ++{ ++ if (Count < 7) ++ return phNeedMoreData; // too short ++ ++ if ((Data[6] & 0xC0) == 0x80) { // MPEG 2 ++ if (Count < 9) ++ return phNeedMoreData; // too short ++ ++ PesPayloadOffset = 6 + 3 + Data[8]; ++ if (Count < PesPayloadOffset) ++ return phNeedMoreData; // too short ++ ++ if (ContinuationHeader) ++ *ContinuationHeader = ((Data[6] == 0x80) && !Data[7] && !Data[8]); ++ ++ return phMPEG2; // MPEG 2 ++ } ++ ++ // check for MPEG 1 ... ++ PesPayloadOffset = 6; ++ ++ // skip up to 16 stuffing bytes ++ for (int i = 0; i < 16; i++) { ++ if (Data[PesPayloadOffset] != 0xFF) ++ break; ++ ++ if (Count <= ++PesPayloadOffset) ++ return phNeedMoreData; // too short ++ } ++ ++ // skip STD_buffer_scale/size ++ if ((Data[PesPayloadOffset] & 0xC0) == 0x40) { ++ PesPayloadOffset += 2; ++ ++ if (Count <= PesPayloadOffset) ++ return phNeedMoreData; // too short ++ } ++ ++ if (ContinuationHeader) ++ *ContinuationHeader = false; ++ ++ if ((Data[PesPayloadOffset] & 0xF0) == 0x20) { ++ // skip PTS only ++ PesPayloadOffset += 5; ++ } ++ else if ((Data[PesPayloadOffset] & 0xF0) == 0x30) { ++ // skip PTS and DTS ++ PesPayloadOffset += 10; ++ } ++ else if (Data[PesPayloadOffset] == 0x0F) { ++ // continuation header ++ PesPayloadOffset++; ++ ++ if (ContinuationHeader) ++ *ContinuationHeader = true; ++ } ++ else ++ return phInvalid; // unknown ++ ++ if (Count < PesPayloadOffset) ++ return phNeedMoreData; // too short ++ ++ return phMPEG1; // MPEG 1 ++} ++ ++#endif ++ ++static uchar *findStartCode(uchar *Data, int Length, int &PesPayloadOffset) ++{ ++ uchar *limit = Data + Length; ++ if (AnalyzePesHeader(Data, Length, PesPayloadOffset) <= phInvalid) ++ return 0; // neither MPEG1 nor MPEG2 ++ ++ Data += PesPayloadOffset + 3; // move to video payload and skip 00 00 01 ++ while (Data < limit) { ++ // possible start codes that appear before/after picture data ++ // 00 00 01 B3: sequence header code ++ // 00 00 01 B8: group start code ++ // 00 00 01 00: picture start code ++ // 00 00 01 B7: sequence end code ++ if (0x01 == Data[-1] && (0xB3 == Data[0] || 0xB8 == Data[0] || 0x00 == Data[0] || 0xB7 == Data[0]) && 0x00 == Data[-2] && 0x00 == Data[-3]) ++ return Data - 3; ++ Data++; ++ } ++ ++ return 0; ++} ++ ++static void fixIFrameHead(uchar *Data, int Length) ++{ ++ int pesPayloadOffset = 0; ++ uchar *p = findStartCode(Data, Length, pesPayloadOffset); ++ if (!p) { ++ esyslog("fixIframeHead: start code not found!\n"); ++ return; ++ } ++ ++ Data += pesPayloadOffset; // move to video payload ++ if (Data < p) ++ memset(Data, 0, p - Data); // zero preceeding bytes ++} ++ ++static int fixIFrameTail(uchar *Data, int Length) ++{ ++ int pesPayloadOffset = 0; ++ uchar *p = findStartCode(Data, Length, pesPayloadOffset); ++ if (!p) { ++ esyslog("fixIframeTail: start code not found!\n"); ++ return Length; ++ } ++ ++ // is this PES packet required? ++ uchar *videoPayload = Data + pesPayloadOffset; ++ if (videoPayload >= p) ++ return 0; // no ++ ++ // adjust PES length ++ int lenPES = (p - Data); ++ Data[4] = (lenPES - 6) >> 8; ++ Data[5] = (lenPES - 6) & 0xFF; ++ ++ return lenPES; ++} ++ ++#define IPACKS 2048 // originally defined in remux.c ++ ++static void fixIFrame(uchar *Data, int &Length, const int OriginalLength) ++{ ++ int done = 0; ++ ++ while (done < Length) { ++ if (0x00 != Data[0] || 0x00 != Data[1] || 0x01 != Data[2]) { ++ esyslog("fixIFrame: PES start code not found at offset %d (data length: %d, original length: %d)!", done, Length, OriginalLength); ++ if (Length > OriginalLength) // roll back additional data ++ Length = OriginalLength; ++ return; ++ } ++ ++ int lenPES = 6 + Data[4] * 256 + Data[5]; ++ if (0xBA == Data[3]) { // pack header has fixed length ++ if (0x00 == (0xC0 & Data[4])) ++ lenPES = 12; // MPEG1 ++ else ++ lenPES = 14 + (Data[13] & 0x07); // MPEG2 ++ } ++ else if (0xB9 == Data[3]) // stream end has fixed length ++ lenPES = 4; ++ else if (0xE0 == (0xF0 & Data[3])) { // video packet ++ int todo = Length - done; ++ int bite = (lenPES < todo) ? lenPES : todo; ++ if (0 == done) // first packet ++ fixIFrameHead(Data, bite); ++ else if (done >= OriginalLength) { // last packet ++ Length = done + fixIFrameTail(Data, bite); ++ return; ++ } ++ } ++ else if (0 == done && 0xC0 == (0xE0 & Data[3])) { ++ // if the first I frame packet is an audio packet then this is a radio recording: don't touch it! ++ if (Length > OriginalLength) // roll back additional data ++ Length = OriginalLength; ++ return; ++ } ++ ++ done += lenPES; ++ Data += lenPES; ++ } ++} ++ ++// --- END fix for I frames --------------------------------------------- ++ + void cDvbPlayer::Action(void) + { + uchar *b = NULL; +@@ -406,6 +602,7 @@ + readIndex = Index; + continue; + } ++ Length += IPACKS; // fixIFrame needs next video packet + } + else { + if (!TimeShiftMode && playDir == pdForward) { +@@ -450,6 +647,8 @@ + } + int r = nonBlockingFileReader->Read(replayFile, b, Length); + if (r > 0) { ++ if (playMode == pmFast || (playMode == pmSlow && playDir == pdBackward)) ++ fixIFrame(b, r, Length - IPACKS); + WaitingForData = false; + readFrame = new cFrame(b, -r, ftUnknown, readIndex); // hands over b to the ringBuffer + b = NULL; +@@ -688,9 +887,11 @@ + int FileOffset, Length; + Index = index->GetNextIFrame(Index, false, &FileNumber, &FileOffset, &Length); + if (Index >= 0 && NextFile(FileNumber, FileOffset) && Still) { ++ Length += IPACKS; // fixIFrame needs next video packet + uchar b[MAXFRAMESIZE + 4 + 5 + 4]; + int r = ReadFrame(replayFile, b, Length, sizeof(b)); + if (r > 0) { ++ fixIFrame(b, r, Length - IPACKS); + if (playMode == pmPause) + DevicePlay(); + // append sequence end code to get the image shown immediately with softdevices --- vdr-1.6.0.orig/debian/patches/opt-52_hard_link_cutter.dpatch +++ vdr-1.6.0/debian/patches/opt-52_hard_link_cutter.dpatch @@ -0,0 +1,553 @@ +#! /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.0 of the 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 -urNad vdr-1.6.0~/README-HLCUTTER vdr-1.6.0/README-HLCUTTER +--- vdr-1.6.0~/README-HLCUTTER 1970-01-01 01:00:00.000000000 +0100 ++++ vdr-1.6.0/README-HLCUTTER 2008-05-11 12:13:51.000000000 +0200 +@@ -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 -urNad vdr-1.6.0~/config.c vdr-1.6.0/config.c +--- vdr-1.6.0~/config.c 2008-05-11 12:13:51.000000000 +0200 ++++ vdr-1.6.0/config.c 2008-05-11 12:13:51.000000000 +0200 +@@ -321,7 +321,9 @@ + FontSmlSize = 18; + FontFixSize = 20; + MaxVideoFileSize = MAXVIDEOFILESIZE; ++ MaxRecordingSize = DEFAULTRECORDINGSIZE; + SplitEditedFiles = 0; ++ HardLinkCutter = 0; + MinEventTimeout = 30; + MinUserInactivity = 300; + NextWakeupTime = 0; +@@ -567,7 +569,9 @@ + noEPGList=strdup(Value ? 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, "MinEventTimeout")) MinEventTimeout = atoi(Value); + else if (!strcasecmp(Name, "MinUserInactivity")) MinUserInactivity = atoi(Value); + else if (!strcasecmp(Name, "NextWakeupTime")) NextWakeupTime = atoi(Value); +@@ -669,7 +673,9 @@ + Store("FontSmlSize", FontSmlSize); + Store("FontFixSize", FontFixSize); + Store("MaxVideoFileSize", MaxVideoFileSize); ++ Store("MaxRecordingSize", MaxRecordingSize); + Store("SplitEditedFiles", SplitEditedFiles); ++ Store("HardLinkCutter", HardLinkCutter); + Store("MinEventTimeout", MinEventTimeout); + Store("MinUserInactivity", MinUserInactivity); + Store("NextWakeupTime", NextWakeupTime); +diff -urNad vdr-1.6.0~/config.h vdr-1.6.0/config.h +--- vdr-1.6.0~/config.h 2008-05-11 12:13:51.000000000 +0200 ++++ vdr-1.6.0/config.h 2008-05-11 12:13:51.000000000 +0200 +@@ -293,7 +293,9 @@ + int FontFixSize; + int noEPGMode; + int MaxVideoFileSize; ++ int MaxRecordingSize; + int SplitEditedFiles; ++ int HardLinkCutter; + int MinEventTimeout, MinUserInactivity; + time_t NextWakeupTime; + int MultiSpeedMode; +diff -urNad vdr-1.6.0~/cutter.c vdr-1.6.0/cutter.c +--- vdr-1.6.0~/cutter.c 2008-05-11 12:13:51.000000000 +0200 ++++ vdr-1.6.0/cutter.c 2008-05-11 12:13:51.000000000 +0200 +@@ -71,6 +71,7 @@ + Mark = fromMarks.Next(Mark); + int FileSize = 0; + int CurrentFileNumber = 0; ++ bool SkipThisSourceFile = false; + int LastIFrame = 0; + toMarks.Add(0); + toMarks.Save(); +@@ -88,12 +89,92 @@ + + // Read one frame: + +- if (fromIndex->Get(Index++, &FileNumber, &FileOffset, &PictureType, &Length)) { +- if (FileNumber != CurrentFileNumber) { +- fromFile = fromFileName->SetOffset(FileNumber, FileOffset); +- fromFile->SetReadAhead(MEGABYTE(20)); +- CurrentFileNumber = FileNumber; +- } ++ if (!fromIndex->Get(Index++, &FileNumber, &FileOffset, &PictureType, &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 ++ ++ uchar MarkFileNumber; ++ int 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) { +@@ -110,19 +191,12 @@ + 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 (PictureType == I_FRAME) { // every file shall start with an I_FRAME + if (LastMark) // edited version shall end before next I-frame + break; +- if (FileSize > MEGABYTE(Setup.MaxVideoFileSize)) { ++ if (!SkipThisSourceFile && FileSize > toFileName->MaxFileSize()) { + toFile = toFileName->NextFile(); + if (!toFile) { + error = "toFile 1"; +@@ -132,12 +206,12 @@ + } + LastIFrame = 0; + +- if (cutIn) { ++ if (!SkipThisSourceFile && cutIn) { + cRemux::SetBrokenLink(buffer, Length); + cutIn = false; + } + } +- if (toFile->Write(buffer, Length) < 0) { ++ if (!SkipThisSourceFile && toFile->Write(buffer, Length) < 0) { + error = "safe_write"; + break; + } +@@ -172,7 +246,7 @@ + } + } + else +- LastMark = true; ++ LastMark = true; // After last cut-out: Write on until next I-frame, then exit + } + } + Recordings.TouchUpdate(); +diff -urNad vdr-1.6.0~/menu.c vdr-1.6.0/menu.c +--- vdr-1.6.0~/menu.c 2008-05-11 12:13:51.000000000 +0200 ++++ vdr-1.6.0/menu.c 2008-05-11 12:16:21.000000000 +0200 +@@ -3187,7 +3187,9 @@ + Add(new cMenuEditStrItem( tr("Setup.Recording$Name instant recording"), data.NameInstantRecord, sizeof(data.NameInstantRecord))); + Add(new cMenuEditIntItem( tr("Setup.Recording$Instant rec. time (min)"), &data.InstantRecordTime, 1, MAXINSTANTRECTIME)); + Add(new cMenuEditIntItem( tr("Setup.Recording$Max. video file size (MB)"), &data.MaxVideoFileSize, MINVIDEOFILESIZE, MAXVIDEOFILESIZE)); ++ 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)); + 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)); +diff -urNad vdr-1.6.0~/recorder.c vdr-1.6.0/recorder.c +--- vdr-1.6.0~/recorder.c 2008-05-11 12:13:50.000000000 +0200 ++++ vdr-1.6.0/recorder.c 2008-05-11 12:13:51.000000000 +0200 +@@ -90,7 +90,7 @@ + bool cFileWriter::NextFile(void) + { + if (recordFile && pictureType == I_FRAME) { // every file shall start with an I_FRAME +- if (fileSize > MEGABYTE(Setup.MaxVideoFileSize) || RunningLowOnDiskSpace()) { ++ if (fileSize > fileName->MaxFileSize() || RunningLowOnDiskSpace()) { + recordFile = fileName->NextFile(); + fileSize = 0; + } +diff -urNad vdr-1.6.0~/recording.c vdr-1.6.0/recording.c +--- vdr-1.6.0~/recording.c 2008-05-11 12:13:51.000000000 +0200 ++++ vdr-1.6.0/recording.c 2008-05-11 12:13:51.000000000 +0200 +@@ -1631,6 +1631,16 @@ + return NULL; + } + ++int cFileName::MaxFileSize() { ++ const int smallFiles = (255 * MAXVIDEOFILESIZE - 1024 * Setup.MaxRecordingSize) ++ / max(MAXVIDEOFILESIZE - Setup.MaxVideoFileSize, 1); ++ ++ if (fileNumber <= smallFiles) ++ return MEGABYTE(Setup.MaxVideoFileSize); ++ ++ return MEGABYTE(MAXVIDEOFILESIZE); ++} ++ + cUnbufferedFile *cFileName::NextFile(void) + { + return SetOffset(fileNumber + 1); +diff -urNad vdr-1.6.0~/recording.h vdr-1.6.0/recording.h +--- vdr-1.6.0~/recording.h 2008-05-11 12:13:51.000000000 +0200 ++++ vdr-1.6.0/recording.h 2008-05-11 12:13:51.000000000 +0200 +@@ -213,7 +213,15 @@ + // may be slightly higher because we stop recording only before the next + // 'I' frame, to have a complete Group Of Pictures): + #define MAXVIDEOFILESIZE 2000 // MB +-#define MINVIDEOFILESIZE 100 // MB ++#define MINVIDEOFILESIZE 1 // MB ++ ++#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 255.vdr + + class cIndexFile { + private: +@@ -254,6 +262,8 @@ + cUnbufferedFile *Open(void); + void Close(void); + cUnbufferedFile *SetOffset(int Number, int Offset = 0); ++ int MaxFileSize(); ++ // Dynamic file size for this file + cUnbufferedFile *NextFile(void); + }; + +diff -urNad vdr-1.6.0~/videodir.c vdr-1.6.0/videodir.c +--- vdr-1.6.0~/videodir.c 2008-02-16 14:00:03.000000000 +0100 ++++ vdr-1.6.0/videodir.c 2008-05-11 12:13:51.000000000 +0200 +@@ -19,6 +19,9 @@ + #include "recording.h" + #include "tools.h" + ++ ++//#define HARDLINK_TEST_ONLY ++ + const char *VideoDirectory = VIDEODIR; + + class cVideoDirectory { +@@ -168,6 +171,120 @@ + return RemoveFileOrDir(FileName, true); + } + ++static bool StatNearestDir(const char *FileName, struct stat *Stat) ++{ ++ cString Name(FileName); ++ char *p; ++ while ((p = strrchr((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 -urNad vdr-1.6.0~/videodir.h vdr-1.6.0/videodir.h +--- vdr-1.6.0~/videodir.h 2008-02-16 13:53:11.000000000 +0100 ++++ vdr-1.6.0/videodir.h 2008-05-11 12:13:51.000000000 +0200 +@@ -19,6 +19,7 @@ + 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.6.0.orig/debian/patches/XX_patchtest-patch-error.dpatch +++ vdr-1.6.0/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.6.0.orig/debian/patches/opt-42-x_MainMenuHooks.dpatch +++ vdr-1.6.0/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.6.0.orig/debian/patches/XX_patchtest-compile-error.dpatch +++ vdr-1.6.0/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.6.0.orig/debian/patches/opt-50_graphtft.dpatch +++ vdr-1.6.0/debian/patches/opt-50_graphtft.dpatch @@ -0,0 +1,313 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-50_graphtft-0.1.dpatch by Jörg Wendel (Horchi) +## +## Thomas Günther <tom@toms-cafe.de>: +## - adapted to pin patch +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Patch from the Graphtft plugin version 0.1.6.alpha +## DP: http://www.jwendel.de/vdr/ + +@DPATCH@ +diff -urNad vdr-1.6.0~/menu.c vdr-1.6.0/menu.c +--- vdr-1.6.0~/menu.c 2008-04-04 17:17:26.000000000 +0200 ++++ vdr-1.6.0/menu.c 2008-04-04 17:19:44.000000000 +0200 +@@ -262,6 +262,7 @@ + public: + cMenuEditChannel(cChannel *Channel, bool New = false); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuEditChannel"; } + }; + + cMenuEditChannel::cMenuEditChannel(cChannel *Channel, bool New) +@@ -484,6 +485,7 @@ + cMenuChannels(void); + ~cMenuChannels(); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuChannels"; } + }; + + cMenuChannels::cMenuChannels(void) +@@ -955,6 +957,7 @@ + virtual ~cMenuTimers(); + virtual void Display(void); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuTimers"; } + }; + + cMenuTimers::cMenuTimers(void) +@@ -1181,6 +1184,7 @@ + { + cOsdMenu::Display(); + DisplayMenu()->SetEvent(event); ++ cStatus::MsgOsdSetEvent(event); + if (event->Description()) + cStatus::MsgOsdTextItem(event->Description()); + } +@@ -1323,6 +1327,7 @@ + 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"; } + }; + + int cMenuWhatsOn::currentChannel = 0; +@@ -1490,6 +1495,7 @@ + cMenuSchedule(void); + virtual ~cMenuSchedule(); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuSchedule"; } + }; + + cMenuSchedule::cMenuSchedule(void) +@@ -1757,6 +1763,7 @@ + cMenuCommands(const char *Title, cCommands *Commands, const char *Parameters = NULL); + virtual ~cMenuCommands(); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuCommands"; } + }; + + cMenuCommands::cMenuCommands(const char *Title, cCommands *Commands, const char *Parameters) +@@ -1833,6 +1840,7 @@ + cMenuCam(cCamSlot *CamSlot); + virtual ~cMenuCam(); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuCam"; } + }; + + cMenuCam::cMenuCam(cCamSlot *CamSlot) +@@ -2012,6 +2020,7 @@ + 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) +@@ -2027,6 +2036,7 @@ + { + cOsdMenu::Display(); + DisplayMenu()->SetRecording(recording); ++ cStatus::MsgOsdSetRecording(recording); + if (recording->Info()->Description()) + cStatus::MsgOsdTextItem(recording->Info()->Description()); + } +@@ -2133,6 +2143,7 @@ + public: + cMenuRenameRecording(cRecording *Recording); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuRenameRecording"; } + }; + + cMenuRenameRecording::cMenuRenameRecording(cRecording *Recording) +@@ -2573,6 +2584,7 @@ + cMenuSetupOSD(void); + virtual ~cMenuSetupOSD(); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuSetupOsd"; } + }; + + cMenuSetupOSD::cMenuSetupOSD(void) +@@ -2720,6 +2732,7 @@ + public: + cMenuSetupEPG(void); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuSetupEpg"; } + }; + + cMenuSetupEPG::cMenuSetupEPG(void) +@@ -2824,6 +2837,7 @@ + public: + cMenuSetupDVB(void); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuSetupDvb"; } + }; + + cMenuSetupDVB::cMenuSetupDVB(void) +@@ -2955,6 +2969,7 @@ + public: + cMenuSetupLNB(void); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuSetupLnb"; } + }; + + cMenuSetupLNB::cMenuSetupLNB(void) +@@ -3035,6 +3050,7 @@ + public: + cMenuSetupCAM(void); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuSetupCam"; } + }; + + cMenuSetupCAM::cMenuSetupCAM(void) +@@ -3205,6 +3221,7 @@ + public: + cMenuSetupPlugins(void); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuSetupPlugins"; } + }; + + cMenuSetupPlugins::cMenuSetupPlugins(void) +@@ -3254,6 +3271,7 @@ + public: + cMenuSetup(void); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuSetup"; } + }; + + cMenuSetup::cMenuSetup(void) +diff -urNad vdr-1.6.0~/menu.h vdr-1.6.0/menu.h +--- vdr-1.6.0~/menu.h 2008-04-04 17:17:25.000000000 +0200 ++++ vdr-1.6.0/menu.h 2008-04-04 17:20:43.000000000 +0200 +@@ -29,6 +29,7 @@ + void SetText(const char *Text); + virtual void Display(void); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuText"; } + }; + + class cMenuEditTimer : public cOsdMenu { +@@ -44,6 +45,7 @@ + cMenuEditTimer(cTimer *Timer, bool New = false); + virtual ~cMenuEditTimer(); + virtual eOSState ProcessKey(eKeys Key); ++ virtual const char* MenuKind() { return "MenuTimerEdit"; } + }; + + class cMenuEvent : public cOsdMenu { +@@ -53,6 +55,7 @@ + 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 { +@@ -69,6 +72,7 @@ + cMenuMain(eOSState State = osUnknown); + virtual eOSState ProcessKey(eKeys Key); + static cOsdObject *PluginOsdObject(void); ++ virtual const char* MenuKind() { return "MenuMain"; } + }; + + class cDisplayChannel : public cOsdObject { +@@ -171,6 +175,7 @@ + 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 -urNad vdr-1.6.0~/menuitems.h vdr-1.6.0/menuitems.h +--- vdr-1.6.0~/menuitems.h 2008-02-16 17:09:58.000000000 +0100 ++++ vdr-1.6.0/menuitems.h 2008-04-04 17:17:53.000000000 +0200 +@@ -174,6 +174,7 @@ + cMenuSetupPage(void); + virtual eOSState ProcessKey(eKeys Key); + void SetPlugin(cPlugin *Plugin); ++ const char* MenuKind() { return "MenuSetupPage"; } + }; + + #endif //__MENUITEMS_H +diff -urNad vdr-1.6.0~/osdbase.c vdr-1.6.0/osdbase.c +--- vdr-1.6.0~/osdbase.c 2008-04-04 17:17:25.000000000 +0200 ++++ vdr-1.6.0/osdbase.c 2008-04-04 17:18:05.000000000 +0200 +@@ -98,6 +98,7 @@ + free(status); + displayMenu->Clear(); + cStatus::MsgOsdClear(); ++ cStatus::MsgOsdMenuDestroy(); + if (!--displayMenuCount) + DELETENULL(displayMenu); + } +@@ -203,6 +204,7 @@ + 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 -urNad vdr-1.6.0~/osdbase.h vdr-1.6.0/osdbase.h +--- vdr-1.6.0~/osdbase.h 2008-04-04 17:17:25.000000000 +0200 ++++ vdr-1.6.0/osdbase.h 2008-04-04 17:18:11.000000000 +0200 +@@ -131,6 +131,7 @@ + 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 -urNad vdr-1.6.0~/recording.h vdr-1.6.0/recording.h +--- vdr-1.6.0~/recording.h 2008-04-04 17:17:25.000000000 +0200 ++++ vdr-1.6.0/recording.h 2008-04-04 17:19:50.000000000 +0200 +@@ -56,6 +56,7 @@ + const char *ChannelName(void) const { return channelName; } + 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 -urNad vdr-1.6.0~/status.c vdr-1.6.0/status.c +--- vdr-1.6.0~/status.c 2008-02-16 15:46:31.000000000 +0100 ++++ vdr-1.6.0/status.c 2008-04-04 17:20:11.000000000 +0200 +@@ -124,3 +124,26 @@ + 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(); ++} +diff -urNad vdr-1.6.0~/status.h vdr-1.6.0/status.h +--- vdr-1.6.0~/status.h 2008-02-16 16:00:33.000000000 +0100 ++++ vdr-1.6.0/status.h 2008-04-04 17:20:03.000000000 +0200 +@@ -80,6 +80,15 @@ + // 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 ++ + public: + cStatus(void); + virtual ~cStatus(); +@@ -101,6 +110,10 @@ + 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(); + }; + + #endif //__STATUS_H --- vdr-1.6.0.orig/debian/patches/04_newplugin.dpatch +++ vdr-1.6.0/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 Günther <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.6.0.orig/debian/patches/opt-28_audioindexer.dpatch +++ vdr-1.6.0/debian/patches/opt-28_audioindexer.dpatch @@ -0,0 +1,319 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-28_audioindexer.dpatch by Reinhard Nissl <rnissl@gmx.de> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Fixes cRemux to only generate an index entry whenever +## DP: the recorded amount of music crosses a 40 ms boundary. +## DP: This should fix problems with the length of radio recordings. + +@DPATCH@ +diff -urNad vdr-1.5.10~/remux.c vdr-1.5.10/remux.c +--- vdr-1.5.10~/remux.c 2007-09-22 14:08:22.000000000 +0200 ++++ vdr-1.5.10/remux.c 2007-11-04 00:09:33.000000000 +0100 +@@ -19,6 +19,7 @@ + #include "channels.h" + #include "shutdown.h" + #include "tools.h" ++#include "recording.h" + + ePesHeader AnalyzePesHeader(const uchar *Data, int Count, int &PesPayloadOffset, bool *ContinuationHeader) + { +@@ -690,12 +691,13 @@ + int frameTodo; + int frameSize; + int cid; +- static bool IsValidAudioHeader(uint32_t Header, bool Mpeg2, int *FrameSize = NULL); ++ static bool IsValidAudioHeader(uint32_t Header, bool Mpeg2, int *FrameSize = NULL, int *FrameDuration = NULL); + public: + cAudioRepacker(int Cid); + virtual void Reset(void); + virtual void Repack(cRingBufferLinear *ResultBuffer, const uchar *Data, int Count); + virtual int BreakAt(const uchar *Data, int Count); ++ static int GetFrameDuration(const uchar *Data, int Count, int *TrackIndex = NULL); + }; + + int cAudioRepacker::bitRates[2][3][16] = { // all values are specified as kbits/s +@@ -711,6 +713,25 @@ + } + }; + ++int cAudioRepacker::GetFrameDuration(const uchar *Data, int Count, int *TrackIndex) ++{ ++ int PesPayloadOffset = 0; ++ ePesHeader PH = AnalyzePesHeader(Data, Count, PesPayloadOffset); ++ if (PH < phMPEG1) ++ return -1; ++ ++ const uchar *Payload = Data + PesPayloadOffset; ++ const int PayloadCount = Count - PesPayloadOffset; ++ ++ int FrameDuration = -1; ++ if ((Data[3] & 0xE0) == 0xC0 && PayloadCount >= 4) { ++ if (IsValidAudioHeader(((Payload[0] << 8 | Payload[1]) << 8 | Payload[2]) << 8 | Payload[3], PH == phMPEG2, NULL, &FrameDuration) && TrackIndex) ++ *TrackIndex = Data[3] - 0xC0; ++ } ++ ++ return FrameDuration; ++} ++ + cAudioRepacker::cAudioRepacker(int Cid) + { + cid = Cid; +@@ -726,7 +747,7 @@ + frameSize = 0; + } + +-bool cAudioRepacker::IsValidAudioHeader(uint32_t Header, bool Mpeg2, int *FrameSize) ++bool cAudioRepacker::IsValidAudioHeader(uint32_t Header, bool Mpeg2, int *FrameSize, int *FrameDuration) + { + int syncword = (Header & 0xFFF00000) >> 20; + int id = (Header & 0x00080000) >> 19; +@@ -760,32 +781,36 @@ + if (emphasis == 2) // reserved + return false; + +- if (FrameSize) { +- if (bitrate_index == 0) +- *FrameSize = 0; +- else { +- static int samplingFrequencies[2][4] = { // all values are specified in Hz +- { 44100, 48000, 32000, -1 }, // MPEG 1 +- { 22050, 24000, 16000, -1 } // MPEG 2 +- }; ++ if (FrameSize || FrameDuration) { ++ static int samplingFrequencies[2][4] = { // all values are specified in Hz ++ { 44100, 48000, 32000, -1 }, // MPEG 1 ++ { 22050, 24000, 16000, -1 } // MPEG 2 ++ }; + +- static int slots_per_frame[2][3] = { +- { 12, 144, 144 }, // MPEG 1, Layer I, II, III +- { 12, 144, 72 } // MPEG 2, Layer I, II, III +- }; ++ static int slots_per_frame[2][3] = { ++ { 12, 144, 144 }, // MPEG 1, Layer I, II, III ++ { 12, 144, 72 } // MPEG 2, Layer I, II, III ++ }; + +- int mpegIndex = 1 - id; +- int layerIndex = 3 - layer; ++ int mpegIndex = 1 - id; ++ int layerIndex = 3 - layer; + +- // Layer I (i. e., layerIndex == 0) has a larger slot size +- int slotSize = (layerIndex == 0) ? 4 : 1; // bytes ++ // Layer I (i. e., layerIndex == 0) has a larger slot size ++ int slotSize = (layerIndex == 0) ? 4 : 1; // bytes ++ int sf = samplingFrequencies[mpegIndex][sampling_frequency]; + +- int br = 1000 * bitRates[mpegIndex][layerIndex][bitrate_index]; // bits/s +- int sf = samplingFrequencies[mpegIndex][sampling_frequency]; ++ if (FrameDuration) ++ *FrameDuration = 90000 * 8 * slotSize * slots_per_frame[mpegIndex][layerIndex] / sf; + +- int N = slots_per_frame[mpegIndex][layerIndex] * br / sf; // slots ++ if (FrameSize) { ++ if (bitrate_index == 0) ++ *FrameSize = 0; ++ else { ++ int br = 1000 * bitRates[mpegIndex][layerIndex][bitrate_index]; // bits/s ++ int N = slots_per_frame[mpegIndex][layerIndex] * br / sf; // slots + +- *FrameSize = (N + padding_bit) * slotSize; // bytes ++ *FrameSize = (N + padding_bit) * slotSize; // bytes ++ } + } + } + +@@ -1086,6 +1111,7 @@ + virtual void Reset(void); + virtual void Repack(cRingBufferLinear *ResultBuffer, const uchar *Data, int Count); + virtual int BreakAt(const uchar *Data, int Count); ++ static int GetFrameDuration(const uchar *Data, int Count, int *TrackIndex = NULL); + }; + + // frameSizes are in words, i. e. multiply them by 2 to get bytes +@@ -1112,6 +1138,30 @@ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + ++int cDolbyRepacker::GetFrameDuration(const uchar *Data, int Count, int *TrackIndex) ++{ ++ int PesPayloadOffset = 0; ++ ePesHeader PH = AnalyzePesHeader(Data, Count, PesPayloadOffset); ++ if (PH < phMPEG1) ++ return -1; ++ ++ const uchar *Payload = Data + PesPayloadOffset; ++ const int PayloadCount = Count - PesPayloadOffset; ++ ++ if (Data[3] == 0xBD && PayloadCount >= 9 && ((Payload[0] & 0xF0) == 0x80) && Payload[4] == 0x0B && Payload[5] == 0x77 && frameSizes[Payload[8]] > 0) { ++ if (TrackIndex) ++ *TrackIndex = Payload[0] - 0x80; ++ ++ static int samplingFrequencies[4] = { // all values are specified in Hz ++ 48000, 44100, 32000, -1 ++ }; ++ ++ return 90000 * 1536 / samplingFrequencies[Payload[8] >> 6]; ++ } ++ ++ return -1; ++} ++ + cDolbyRepacker::cDolbyRepacker(void) + { + pesHeader[0] = 0x00; +@@ -1869,6 +1919,58 @@ + instant_repack(Buf + 4 + off, TS_SIZE - 4 - off); + } + ++// --- cAudioIndexer --------------------------------------------------------- ++ ++class cAudioIndexer { ++private: ++ int frameTrack; ++ int frameDuration; ++ int64_t trackTime[MAXAPIDS + MAXDPIDS]; ++ int64_t nextIndexTime; ++ ++public: ++ cAudioIndexer(void); ++ void Clear(void); ++ void PrepareFrame(const uchar *Data, int Count, int Offset, uchar &PictureType); ++ void ProcessFrame(void); ++ }; ++ ++cAudioIndexer::cAudioIndexer(void) ++{ ++ Clear(); ++} ++ ++void cAudioIndexer::Clear(void) ++{ ++ memset(trackTime, 0, sizeof (trackTime)); ++ nextIndexTime = 0; ++ frameTrack = -1; ++} ++ ++void cAudioIndexer::PrepareFrame(const uchar *Data, int Count, int Offset, uchar &PictureType) ++{ ++ frameDuration = cRemux::GetAudioFrameDuration(Data + Offset, Count - Offset, &frameTrack); ++ if (frameDuration <= 0) ++ return; ++ ++ if (Data[Offset + 3] == 0xBD) ++ frameTrack += MAXAPIDS; ++ ++ PictureType = (trackTime[frameTrack] >= nextIndexTime) ? I_FRAME : NO_PICTURE; ++} ++ ++void cAudioIndexer::ProcessFrame(void) ++{ ++ if (frameTrack < 0) ++ return; ++ ++ if (trackTime[frameTrack] >= nextIndexTime) ++ nextIndexTime += 90000 / FRAMESPERSEC; ++ ++ trackTime[frameTrack] += frameDuration; ++ frameTrack = -1; ++} ++ + // --- cRemux ---------------------------------------------------------------- + + #define RESULTBUFFERSIZE KILOBYTE(256) +@@ -1877,6 +1979,7 @@ + { + exitOnFailure = ExitOnFailure; + noVideo = VPid == 0 || VPid == 1 || VPid == 0x1FFF; ++ audioIndexer = (noVideo ? new cAudioIndexer : NULL); + numUPTerrors = 0; + synced = false; + skipped = 0; +@@ -1920,6 +2023,18 @@ + for (int t = 0; t < numTracks; t++) + delete ts2pes[t]; + delete resultBuffer; ++ delete audioIndexer; ++} ++ ++int cRemux::GetAudioFrameDuration(const uchar *Data, int Count, int *TrackIndex) ++{ ++ if (Count <= 4) ++ return -1; ++ ++ if (Data[3] == 0xBD) ++ return cDolbyRepacker::GetFrameDuration(Data, Count, TrackIndex); ++ ++ return cAudioRepacker::GetFrameDuration(Data, Count, TrackIndex); + } + + int cRemux::GetPid(const uchar *Data) +@@ -2099,16 +2214,19 @@ + if (l < 0) + return resultData; + if (noVideo) { ++ uchar pt = NO_PICTURE; ++ if (audioIndexer && !Count) ++ audioIndexer->PrepareFrame(data, resultCount, i, pt); + if (!synced) { + if (PictureType) +- *PictureType = I_FRAME; ++ *PictureType = pt; + resultSkipped = i; // will drop everything before this position + synced = true; + } + else if (Count) + return resultData; + else if (PictureType) +- *PictureType = I_FRAME; ++ *PictureType = pt; + } + } + if (synced) { +@@ -2129,6 +2247,8 @@ + void cRemux::Del(int Count) + { + resultBuffer->Del(Count); ++ if (audioIndexer && Count > 0) ++ audioIndexer->ProcessFrame(); + } + + void cRemux::Clear(void) +@@ -2136,6 +2256,8 @@ + for (int t = 0; t < numTracks; t++) + ts2pes[t]->Clear(); + resultBuffer->Clear(); ++ if (audioIndexer) ++ audioIndexer->Clear(); + synced = false; + skipped = 0; + resultSkipped = 0; +diff -urNad vdr-1.5.10~/remux.h vdr-1.5.10/remux.h +--- vdr-1.5.10~/remux.h 2007-09-02 12:19:06.000000000 +0200 ++++ vdr-1.5.10/remux.h 2007-11-04 00:08:43.000000000 +0100 +@@ -33,6 +33,7 @@ + #define MAXTRACKS 64 + + class cTS2PES; ++class cAudioIndexer; + + class cRemux { + private: +@@ -45,6 +46,7 @@ + int numTracks; + cRingBufferLinear *resultBuffer; + int resultSkipped; ++ cAudioIndexer *audioIndexer; + int GetPid(const uchar *Data); + public: + cRemux(int VPid, const int *APids, const int *DPids, const int *SPids, bool ExitOnFailure = false); +@@ -79,6 +81,7 @@ + static void SetBrokenLink(uchar *Data, int Length); + static int GetPacketLength(const uchar *Data, int Count, int Offset); + static int ScanVideoPacket(const uchar *Data, int Count, int Offset, uchar &PictureType); ++ static int GetAudioFrameDuration(const uchar *Data, int Count, int *TrackIndex = NULL); + }; + + #endif // __REMUX_H --- vdr-1.6.0.orig/debian/patches/opt-54_deltimeshiftrec.dpatch +++ vdr-1.6.0/debian/patches/opt-54_deltimeshiftrec.dpatch @@ -0,0 +1,169 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-54_deltimeshiftrec.dpatch by Tobias Grimm <tg@e-tobi.net> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Offers the choice to delete timeshift recordings +## DP: Taken from the Zulu extensions patch +## DP: See http://www.zulu-entertainment.de/download.php?group=VDR + +@DPATCH@ +diff -urNad vdr-1.6.0~/config.c vdr-1.6.0/config.c +--- vdr-1.6.0~/config.c 2008-07-25 23:55:15.000000000 +0200 ++++ vdr-1.6.0/config.c 2008-07-25 23:57:18.000000000 +0200 +@@ -276,6 +276,7 @@ + TimeTransponder = 0; + MarginStart = 2; + MarginStop = 10; ++ DelTimeshiftRec = 0; + AudioLanguages[0] = -1; + DisplaySubtitles = 0; + SubtitleLanguages[0] = -1; +@@ -522,6 +523,7 @@ + else if (!strcasecmp(Name, "TimeTransponder")) TimeTransponder = atoi(Value); + else if (!strcasecmp(Name, "MarginStart")) MarginStart = atoi(Value); + else if (!strcasecmp(Name, "MarginStop")) MarginStop = atoi(Value); ++ else if (!strcasecmp(Name, "DelTimeshiftRec")) DelTimeshiftRec = atoi(Value); + else if (!strcasecmp(Name, "AudioLanguages")) return ParseLanguages(Value, AudioLanguages); + else if (!strcasecmp(Name, "DisplaySubtitles")) DisplaySubtitles = atoi(Value); + else if (!strcasecmp(Name, "SubtitleLanguages")) return ParseLanguages(Value, SubtitleLanguages); +@@ -632,6 +634,7 @@ + Store("TimeTransponder", TimeTransponder); + Store("MarginStart", MarginStart); + Store("MarginStop", MarginStop); ++ Store("DelTimeshiftRec", DelTimeshiftRec); + StoreLanguages("AudioLanguages", AudioLanguages); + Store("DisplaySubtitles", DisplaySubtitles); + StoreLanguages("SubtitleLanguages", SubtitleLanguages); +diff -urNad vdr-1.6.0~/config.h vdr-1.6.0/config.h +--- vdr-1.6.0~/config.h 2008-07-25 23:55:15.000000000 +0200 ++++ vdr-1.6.0/config.h 2008-07-25 23:57:56.000000000 +0200 +@@ -253,6 +253,7 @@ + int TimeSource; + int TimeTransponder; + int MarginStart, MarginStop; ++ int DelTimeshiftRec; + int AudioLanguages[I18N_MAX_LANGUAGES + 1]; + int DisplaySubtitles; + int SubtitleLanguages[I18N_MAX_LANGUAGES + 1]; +diff -urNad vdr-1.6.0~/menu.c vdr-1.6.0/menu.c +--- vdr-1.6.0~/menu.c 2008-07-25 23:55:15.000000000 +0200 ++++ vdr-1.6.0/menu.c 2008-07-25 23:58:27.000000000 +0200 +@@ -3170,12 +3170,17 @@ + // --- cMenuSetupRecord ------------------------------------------------------ + + class cMenuSetupRecord : public cMenuSetupBase { ++private: ++ const char *DelTimeshiftRecValues[3]; + public: + cMenuSetupRecord(void); + }; + + cMenuSetupRecord::cMenuSetupRecord(void) + { ++ DelTimeshiftRecValues[0] = tr("request"); ++ DelTimeshiftRecValues[1] = tr("no"); ++ DelTimeshiftRecValues[2] = tr("yes"); + SetSection(tr("Recording")); + Add(new cMenuEditIntItem( tr("Setup.Recording$Margin at start (min)"), &data.MarginStart)); + Add(new cMenuEditIntItem( tr("Setup.Recording$Margin at stop (min)"), &data.MarginStop)); +@@ -3198,6 +3203,7 @@ + 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)); ++ Add(new cMenuEditStraItem(tr("Setup.Recording$Delete timeshift recording"), &data.DelTimeshiftRec, 3, DelTimeshiftRecValues)); + } + + // --- cMenuSetupReplay ------------------------------------------------------ +@@ -4666,6 +4672,56 @@ + currentReplayControl = NULL; + } + ++void cReplayControl::Stop(void) ++{ ++ int dummy; ++ bool playing = GetIndex(dummy, dummy, false); ++ cRecordControl* rc = cRecordControls::GetRecordControl(fileName); ++ ++ if (playing && rc && rc->InstantId()) { ++ isyslog("found Timeshiftrecording"); ++ ++ if ((Setup.DelTimeshiftRec != 0 ) || (Interface->Confirm(tr("Delete recording?")))) { ++ cRecordControl *rc = cRecordControls::GetRecordControl(fileName); ++ if (rc) { ++ cTimer *timer = rc->Timer(); ++ if (timer) { ++ const char* reccmd_backup = cRecordingUserCommand::GetCommand(); ++ cRecordingUserCommand::SetCommand(NULL); ++ ++ timer->Skip(); ++ cRecordControls::Process(time(NULL)); ++ if (timer->IsSingleEvent()) { ++ isyslog("deleting timer %s", *timer->ToDescr()); ++ Timers.Del(timer); ++ } ++ Timers.SetModified(); ++ ++ // restore reccmd ++ cRecordingUserCommand::SetCommand(reccmd_backup); ++ } ++ } ++ isyslog("stop replaying %s", fileName); ++ cDvbPlayerControl::Stop(); ++ ++ if (Setup.DelTimeshiftRec != 1) { ++ cRecording *recording = Recordings.GetByName(fileName);; ++ if (recording) { ++ if (recording->Delete()) { ++ Recordings.DelByName(fileName); ++ ClearLastReplayed(fileName); ++ return; ++ } ++ else ++ Skins.Message(mtError, tr("Error while deleting recording!")); ++ } ++ } ++ } ++ else ++ cDvbPlayerControl::Stop(); ++ } ++} ++ + void cReplayControl::SetRecording(const char *FileName, const char *Title) + { + free(fileName); +@@ -5080,7 +5136,12 @@ + else + Show(); + break; +- case kBack: return osRecordings; ++ case kBack: { cRecordControl* rc = cRecordControls::GetRecordControl(fileName); ++ if (rc && rc->InstantId()) ++ return osEnd; ++ else ++ return osRecordings; ++ } + default: return osUnknown; + } + } +diff -urNad vdr-1.6.0~/menu.h vdr-1.6.0/menu.h +--- vdr-1.6.0~/menu.h 2008-07-25 23:55:15.000000000 +0200 ++++ vdr-1.6.0/menu.h 2008-07-25 23:55:15.000000000 +0200 +@@ -248,6 +248,7 @@ + public: + cReplayControl(void); + virtual ~cReplayControl(); ++ void Stop(void); + virtual cOsdObject *GetInfo(void); + virtual eOSState ProcessKey(eKeys Key); + virtual void Show(void); +diff -urNad vdr-1.6.0~/recording.h vdr-1.6.0/recording.h +--- vdr-1.6.0~/recording.h 2008-07-25 23:55:15.000000000 +0200 ++++ vdr-1.6.0/recording.h 2008-07-25 23:55:15.000000000 +0200 +@@ -196,6 +196,7 @@ + private: + static const char *command; + public: ++ static const char *GetCommand(void) { return command; } + static void SetCommand(const char *Command) { command = Command; } + static void InvokeCommand(const char *State, const char *RecordingFileName); + }; --- vdr-1.6.0.orig/debian/patches/opt-24_jumpplay.dpatch +++ vdr-1.6.0/debian/patches/opt-24_jumpplay.dpatch @@ -0,0 +1,548 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## opt-24_jumpplay.dpatch by Torsten Kunkel <vdr@tkunkel.de>, Thomas Günther <tom@toms-cafe.de> +## http://toms-cafe.de/vdr/download/vdr-jumpplay-1.0-1.6.0.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.6.0/MANUAL vdr-1.6.0-jumpplay-1.0/MANUAL +--- vdr-1.6.0/MANUAL 2008-02-24 10:09:17.000000000 +0000 ++++ vdr-1.6.0-jumpplay-1.0/MANUAL 2009-03-31 00:11:13.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.6.0/README.jumpplay vdr-1.6.0-jumpplay-1.0/README.jumpplay +--- vdr-1.6.0/README.jumpplay 1970-01-01 00:00:00.000000000 +0000 ++++ vdr-1.6.0-jumpplay-1.0/README.jumpplay 2009-03-31 00:24:59.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 Günther <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 Günther <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 Günther <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 Günther <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 Günther <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 Günther <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 Günther <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 Günther <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 Günther <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 Günther <tom@toms-cafe.de> ++ Play&Jump: ++ - set resume position to 0 if replay stops at the first mark ++ Added French language texts (thanks to Michaël Nival) +diff -Naurp vdr-1.6.0/config.c vdr-1.6.0-jumpplay-1.0/config.c +--- vdr-1.6.0/config.c 2008-02-17 13:39:00.000000000 +0000 ++++ vdr-1.6.0-jumpplay-1.0/config.c 2009-03-31 00:11:13.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.6.0/config.h vdr-1.6.0-jumpplay-1.0/config.h +--- vdr-1.6.0/config.h 2008-03-23 10:26:10.000000000 +0000 ++++ vdr-1.6.0-jumpplay-1.0/config.h 2009-03-31 00:11:13.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 + +@@ -261,6 +263,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.6.0/dvbplayer.c vdr-1.6.0-jumpplay-1.0/dvbplayer.c +--- vdr-1.6.0/dvbplayer.c 2008-02-09 15:10:54.000000000 +0000 ++++ vdr-1.6.0-jumpplay-1.0/dvbplayer.c 2009-03-31 00:17:08.000000000 +0000 +@@ -193,6 +193,7 @@ private: + cNonBlockingFileReader *nonBlockingFileReader; + cRingBufferFrame *ringBuffer; + cBackTrace *backTrace; ++ cMarksReload marks; + cFileName *fileName; + cIndexFile *index; + cUnbufferedFile *replayFile; +@@ -234,7 +235,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; +@@ -341,6 +342,10 @@ bool cDvbPlayer::Save(void) + if (index) { + int Index = writeIndex; + 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) <= RESUMEBACKUP) ++ Index = 0; + Index -= RESUMEBACKUP; + if (Index > 0) + Index = index->GetNextIFrame(Index, false); +@@ -368,11 +373,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)); + ++ if (Setup.PlayJump && readIndex <= 0 && marks.First() && index) { ++ int Index = marks.First()->position; ++ uchar FileNumber; ++ int FileOffset; ++ if (index->Get(Index, &FileNumber, &FileOffset) && ++ NextFile(FileNumber, FileOffset)) { ++ isyslog("PlayJump: start replay at first mark %d (%s)", ++ Index, *IndexToHMSF(Index, true)); ++ readIndex = Index; ++ } ++ } ++ ++ bool LastMarkPause = false; + nonBlockingFileReader = new cNonBlockingFileReader; + int Length = 0; + bool Sleep = false; +@@ -393,7 +413,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 (playMode == pmFast || (playMode == pmSlow && playDir == pdBackward)) { +@@ -438,6 +458,44 @@ void cDvbPlayer::Action(void) + uchar FileNumber; + int FileOffset; + readIndex++; ++ if (Setup.PlayJump || Setup.PauseLastMark) { ++ // check for end mark - jump to next mark or pause ++ 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)); ++ 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() - 150, 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)); ++ readIndex = Index; ++ cutIn = true; ++ } ++ } ++ } ++ // for detecting growing length of live-recordings ++ uchar PictureType; ++ if (index->Get(readIndex, &FileNumber, &FileOffset, &PictureType) && ++ PictureType == I_FRAME) ++ total = index->Last(); + if (!(index->Get(readIndex, &FileNumber, &FileOffset, NULL, &Length) && NextFile(FileNumber, FileOffset))) { + readIndex = -1; + eof = true; +@@ -473,6 +531,10 @@ void cDvbPlayer::Action(void) + // Store the frame in the buffer: + + if (readFrame) { ++ if (cutIn) { ++ cRemux::SetBrokenLink(readFrame->Data(), readFrame->Count()); ++ cutIn = false; ++ } + if (ringBuffer->Put(readFrame)) + readFrame = NULL; + } +@@ -521,8 +583,14 @@ void cDvbPlayer::Action(void) + p = NULL; + } + } +- else ++ else { ++ if (LastMarkPause) { ++ LastMarkPause = false; ++ playMode = pmPause; ++ writeIndex = readIndex; ++ } + Sleep = true; ++ } + } + } + +diff -Naurp vdr-1.6.0/menu.c vdr-1.6.0-jumpplay-1.0/menu.c +--- vdr-1.6.0/menu.c 2008-03-16 11:15:28.000000000 +0000 ++++ vdr-1.6.0-jumpplay-1.0/menu.c 2009-03-31 00:11:13.000000000 +0000 +@@ -2775,6 +2775,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) +@@ -4064,7 +4068,7 @@ char *cReplayControl::fileName = NULL; + char *cReplayControl::title = NULL; + + cReplayControl::cReplayControl(void) +-:cDvbPlayerControl(fileName) ++:cDvbPlayerControl(fileName), marks(fileName) + { + currentReplayControl = this; + displayReplay = NULL; +@@ -4074,7 +4078,6 @@ cReplayControl::cReplayControl(void) + lastSpeed = -2; // an invalid value + timeoutShow = 0; + timeSearchActive = false; +- marks.Load(fileName); + cRecording Recording(fileName); + cStatus::MsgReplaying(this, Recording.Name(), Recording.FileName(), true); + SetTrackDescriptions(false); +@@ -4304,8 +4307,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(); + } +@@ -4318,8 +4323,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)) { ++ Goto(m->position); ++ Play(); ++ } ++ else { ++ Goto(m->position, true); ++ displayFrames = true; ++ } + } + } + } +@@ -4374,7 +4388,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)); +@@ -4396,6 +4410,7 @@ eOSState cReplayControl::ProcessKey(eKey + { + if (!Active()) + return osEnd; ++ marks.Reload(); + if (visible) { + if (timeoutShow && time(NULL) > timeoutShow) { + Hide(); +diff -Naurp vdr-1.6.0/menu.h vdr-1.6.0-jumpplay-1.0/menu.h +--- vdr-1.6.0/menu.h 2008-02-10 16:01:53.000000000 +0000 ++++ vdr-1.6.0-jumpplay-1.0/menu.h 2009-03-31 00:11:13.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.6.0/po/de_DE.po vdr-1.6.0-jumpplay-1.0/po/de_DE.po +--- vdr-1.6.0/po/de_DE.po 2008-03-23 10:31:29.000000000 +0000 ++++ vdr-1.6.0-jumpplay-1.0/po/de_DE.po 2009-03-31 00:11:13.000000000 +0000 +@@ -746,6 +746,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-/Rücklauf" + +diff -Naurp vdr-1.6.0/po/fr_FR.po vdr-1.6.0-jumpplay-1.0/po/fr_FR.po +--- vdr-1.6.0/po/fr_FR.po 2008-03-23 10:31:29.000000000 +0000 ++++ vdr-1.6.0-jumpplay-1.0/po/fr_FR.po 2009-03-31 00:11:13.000000000 +0000 +@@ -752,6 +752,18 @@ msgstr "Séparer les séquences éditées" + msgid "Replay" + msgstr "Lecture" + ++msgid "Setup.Replay$Jump&Play" ++msgstr "Lecture après saut" ++ ++msgid "Setup.Replay$Play&Jump" ++msgstr "Saut sur les marques de découpes" ++ ++msgid "Setup.Replay$Pause at last mark" ++msgstr "Pause après la dernière marque" ++ ++msgid "Setup.Replay$Reload marks" ++msgstr "Actualiser les marques" ++ + msgid "Setup.Replay$Multi speed mode" + msgstr "Mode multi-vitesses" + +diff -Naurp vdr-1.6.0/recording.c vdr-1.6.0-jumpplay-1.0/recording.c +--- vdr-1.6.0/recording.c 2008-02-24 10:28:53.000000000 +0000 ++++ vdr-1.6.0-jumpplay-1.0/recording.c 2009-03-31 00:11:13.000000000 +0000 +@@ -1154,6 +1154,49 @@ 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; ++ if (Load(recDir) && 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; ++ if (Load(recDir)) ++ 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.6.0/recording.h vdr-1.6.0-jumpplay-1.0/recording.h +--- vdr-1.6.0/recording.h 2007-10-14 10:11:34.000000000 +0000 ++++ vdr-1.6.0-jumpplay-1.0/recording.h 2009-03-31 00:11:13.000000000 +0000 +@@ -170,6 +170,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.6.0.orig/debian/plugin-template/changelog +++ vdr-1.6.0/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.6.0.orig/debian/plugin-template/links.ex +++ vdr-1.6.0/debian/plugin-template/links.ex @@ -0,0 +1 @@ +usr/share/#PACKAGE#/#PLUGIN# var/lib/vdr/plugins/#PLUGIN# --- vdr-1.6.0.orig/debian/plugin-template/copyright +++ vdr-1.6.0/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.6.0.orig/debian/plugin-template/install +++ vdr-1.6.0/debian/plugin-template/install @@ -0,0 +1,2 @@ +libvdr-#PLUGIN#.so.* usr/lib/vdr/plugins/ +debian/tmp/usr/share/locale --- vdr-1.6.0.orig/debian/plugin-template/rules +++ vdr-1.6.0/debian/plugin-template/rules @@ -0,0 +1,19 @@ +#! /bin/sh /usr/share/vdr-dev/make-special-vdr.sh + +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.6.0.orig/debian/plugin-template/control +++ vdr-1.6.0/debian/plugin-template/control @@ -0,0 +1,16 @@ +Source: #PACKAGE# +Section: misc +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> +XB-VDR-Patchlevel: ${vdr:Patchlevel} --- vdr-1.6.0.orig/debian/lintian/vdr +++ vdr-1.6.0/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.6.0.orig/debian/lintian/vdr-dev +++ vdr-1.6.0/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.6.0.orig/debian/scripts/vdr-rcu +++ vdr-1.6.0/debian/scripts/vdr-rcu @@ -0,0 +1,2 @@ +#! /bin/sh +exec /usr/bin/vdr-kbd "$@" --rcu --- vdr-1.6.0.orig/debian/scripts/vdr-daemon +++ vdr-1.6.0/debian/scripts/vdr-daemon @@ -0,0 +1,2 @@ +#! /bin/sh +exec /usr/bin/vdr-kbd "$@" --no-kbd --- vdr-1.6.0.orig/debian/scripts/vdr-lirc +++ vdr-1.6.0/debian/scripts/vdr-lirc @@ -0,0 +1,2 @@ +#! /bin/sh +exec /usr/bin/vdr-kbd "$@" --lirc --- vdr-1.6.0.orig/debian/po/de.po +++ vdr-1.6.0/debian/po/de.po @@ -0,0 +1,85 @@ +# translation of de.po to German +# +# Translators, if you are not familiar with the PO format, gettext +# documentation is worth reading, especially sections dedicated to +# this format, e.g. by running: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# Some information specific to po-debconf are available at +# /usr/share/doc/po-debconf/README-trans +# or http://www.debian.org/intl/l10n/po-debconf/README-trans# +# Developers do not need to manually edit POT or PO files. +# Jens Nachtigall <nachtigall@web.de>, 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: de\n" +"Report-Msgid-Bugs-To: vdr@packages.debian.org\n" +"POT-Creation-Date: 2009-04-02 14:42+0200\n" +"PO-Revision-Date: 2004-09-27 16:00+0200\n" +"Last-Translator: Jens Nachtigall <nachtigall@web.de>\n" +"Language-Team: German <debian-l10n-german@lists.debian.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.3.1\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. Type: select +#. Choices +#: ../vdr.templates:1001 +msgid "Satellite, Terrestrial, Cable" +msgstr "Satellit, Terrestrisch, Kabel" + +#. Type: select +#. Description +#: ../vdr.templates:1002 +msgid "DVB card type:" +msgstr "DVB-Karten-Typ:" + +#. Type: select +#. Description +#: ../vdr.templates:1002 +msgid "" +"VDR needs to know your DVB card type to work correctly. Using your " +"selection, a channels.conf file will be installed to /var/lib/vdr. You may " +"have to change this file depending on your setup." +msgstr "" +"VDR muss den Typ Ihrer DVB-Karte kennen, um korrekt zu funktionieren. Mit " +"Hilfe ihrer Auswahl wird eine channels.conf-Datei in /var/lib/vdr " +"installiert. Eventuell werden Sie diese Datei an Ihre Umgebung anpassen " +"müssen. " + +#. Type: boolean +#. Description +#: ../vdr.templates:2001 +msgid "Create /var/lib/video.00?" +msgstr "Soll /var/lib/video.00 erstellt werden?" + +#. Type: boolean +#. Description +#: ../vdr.templates:2001 +msgid "" +"By default VDR is configured to use /var/lib/video.00 to store recordings. " +"You can either create this directory now, or change this behavior later by " +"modifying the VIDEO_DIR variable in /etc/default/vdr." +msgstr "" +"Standardmäßig ist VDR so konfiguriert, dass Aufnahmen in /var/lib/video.00 " +"gespeichert werden. Sie können dieses Verzeichnis entweder jetzt erstellen, " +"oder diese Konfiguration später ändern, indem Sie die Variable VIDEO_DIR in /" +"etc/default/vdr anpassen." + +#~ msgid "VDR needs DVB kernel modules" +#~ msgstr "VDR benötigt DVB-Kernel-Module" + +#~ msgid "" +#~ "VDR needs DVB (Digital Video Broadcasting) kernel modules. You may have " +#~ "to separately install these modules. Ensure that the correct modules for " +#~ "your DVB hardware get loaded automatically e.g. by adding them to /etc/" +#~ "modules otherwise VDR won't work!" +#~ msgstr "" +#~ "VDR benötigt Kernel-Module für DVB (»Digital Video Broadcasting«). Sie " +#~ "müssen diese Module separat installieren. Stellen Sie sicher, dass die " +#~ "für Ihre DVB-Hardware richtigen Module automatisch geladen werden, indem " +#~ "Sie sie z.B. in /etc/modules eintragen. Andernfalls wird VDR nicht " +#~ "funktionieren." --- vdr-1.6.0.orig/debian/po/sv.po +++ vdr-1.6.0/debian/po/sv.po @@ -0,0 +1,79 @@ +# Translators, if you are not familiar with the PO format, gettext +# documentation is worth reading, especially sections dedicated to +# this format, e.g. by running: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# Some information specific to po-debconf are available at +# /usr/share/doc/po-debconf/README-trans +# or http://www.debian.org/intl/l10n/po-debconf/README-trans +# Developers do not need to manually edit POT or PO files. +# , fuzzy +# +# +msgid "" +msgstr "" +"Project-Id-Version: vdr 1.3.31-2\n" +"Report-Msgid-Bugs-To: vdr@packages.debian.org\n" +"POT-Creation-Date: 2009-04-02 14:42+0200\n" +"PO-Revision-Date: 2005-09-30 23:31-0700\n" +"Last-Translator: Daniel Nylander <po@danielnylander.se>\n" +"Language-Team: Swedish <sv@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: select +#. Choices +#: ../vdr.templates:1001 +msgid "Satellite, Terrestrial, Cable" +msgstr "Satellit, Marksänd, Kabel" + +#. Type: select +#. Description +#: ../vdr.templates:1002 +msgid "DVB card type:" +msgstr "DVB-korttyp:" + +#. Type: select +#. Description +#: ../vdr.templates:1002 +msgid "" +"VDR needs to know your DVB card type to work correctly. Using your " +"selection, a channels.conf file will be installed to /var/lib/vdr. You may " +"have to change this file depending on your setup." +msgstr "" +"VDR behöver veta om din DVB-korttyp för att fungera korrekt. Baserat på ditt " +"val kommer en channels.conf fil att installeras i /var/lib/vdr. Du kanske " +"måste ändra i denna fil beroende på din konfiguration." + +#. Type: boolean +#. Description +#: ../vdr.templates:2001 +msgid "Create /var/lib/video.00?" +msgstr "Skapa /var/lib/video.00?" + +#. Type: boolean +#. Description +#: ../vdr.templates:2001 +msgid "" +"By default VDR is configured to use /var/lib/video.00 to store recordings. " +"You can either create this directory now, or change this behavior later by " +"modifying the VIDEO_DIR variable in /etc/default/vdr." +msgstr "" +"Som standard är VDR konfigurerad att använda /var/lib/video.00 för att lagra " +"inspelningar. Du kan antingen skapa denna mapp nu eller ändra detta senare " +"genom att modifiera variabeln VIDEO_DIR i /etc/default/vdr." + +#~ msgid "VDR needs DVB kernel modules" +#~ msgstr "VDR behöver DVB-kernelmoduler" + +#~ msgid "" +#~ "VDR needs DVB (Digital Video Broadcasting) kernel modules. You may have " +#~ "to separately install these modules. Ensure that the correct modules for " +#~ "your DVB hardware get loaded automatically e.g. by adding them to /etc/" +#~ "modules otherwise VDR won't work!" +#~ msgstr "" +#~ "VDR behöver DVB (Digital Video Broadcasting) kernelmoduler. Du måste " +#~ "kanske installera dessa moduler separat. Se till att de korrekta " +#~ "modulerna för din DVB-hårdvara laddas in automatiskt, till exempel att " +#~ "lägga till dom i /etc/modules annars kommer VDR inte att fungera!" --- vdr-1.6.0.orig/debian/po/cs.po +++ vdr-1.6.0/debian/po/cs.po @@ -0,0 +1,79 @@ +# +# Translators, if you are not familiar with the PO format, gettext +# documentation is worth reading, especially sections dedicated to +# this format, e.g. by running: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# +# Some information specific to po-debconf are available at +# /usr/share/doc/po-debconf/README-trans +# or http://www.debian.org/intl/l10n/po-debconf/README-trans +# +# Developers do not need to manually edit POT or PO files. +# +msgid "" +msgstr "" +"Project-Id-Version: vdr\n" +"Report-Msgid-Bugs-To: vdr@packages.debian.org\n" +"POT-Creation-Date: 2009-04-02 14:42+0200\n" +"PO-Revision-Date: 2004-05-15 11:10+0200\n" +"Last-Translator: Miroslav Kure <kurem@debian.cz>\n" +"Language-Team: Czech <provoz@debian.cz>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-2\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: select +#. Choices +#: ../vdr.templates:1001 +msgid "Satellite, Terrestrial, Cable" +msgstr "Satelitní, Pozemní, Kabelová" + +#. Type: select +#. Description +#: ../vdr.templates:1002 +msgid "DVB card type:" +msgstr "Typ DVB karty:" + +#. Type: select +#. Description +#: ../vdr.templates:1002 +msgid "" +"VDR needs to know your DVB card type to work correctly. Using your " +"selection, a channels.conf file will be installed to /var/lib/vdr. You may " +"have to change this file depending on your setup." +msgstr "" +"VDR musí znát typ va¹í DVB karty. Na základì va¹í odpovìdi se do /var/lib/" +"vdr nainstaluje soubor channels.conf. Tento soubor mù¾ete pozdìji upravit " +"dle svých potøeb." + +#. Type: boolean +#. Description +#: ../vdr.templates:2001 +msgid "Create /var/lib/video.00?" +msgstr "Vytvoøit /var/lib/video.00?" + +#. Type: boolean +#. Description +#: ../vdr.templates:2001 +msgid "" +"By default VDR is configured to use /var/lib/video.00 to store recordings. " +"You can either create this directory now, or change this behavior later by " +"modifying the VIDEO_DIR variable in /etc/default/vdr." +msgstr "" +"Implicitnì je VDR nastaveno pro ukládání nahrávek do /var/lib/video.00. " +"Tento adresáø se nyní mù¾e vytvoøit automaticky. Jeho umístìní mù¾ete " +"pozdìji upravit zmìnou promìnné VIDEO_DIR v souboru /etc/default/vdr." + +#~ msgid "VDR needs DVB kernel modules" +#~ msgstr "VDR vy¾aduje jaderné moduly k DVB" + +#~ msgid "" +#~ "VDR needs DVB (Digital Video Broadcasting) kernel modules. You may have " +#~ "to separately install these modules. Ensure that the correct modules for " +#~ "your DVB hardware get loaded automatically e.g. by adding them to /etc/" +#~ "modules otherwise VDR won't work!" +#~ msgstr "" +#~ "VDR vy¾aduje jaderné moduly pro DVB (Digital Video Broadcasting). Nahrání " +#~ "a pou¾ití tìchto modulù si budete muset zajistit sami (napøíklad pøidáním " +#~ "tìchto modulù do /etc/modules). V opaèném pøípadì VDR nebude fungovat!" --- vdr-1.6.0.orig/debian/po/templates.pot +++ vdr-1.6.0/debian/po/templates.pot @@ -0,0 +1,53 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: vdr@packages.debian.org\n" +"POT-Creation-Date: 2009-04-02 14:42+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: select +#. Choices +#: ../vdr.templates:1001 +msgid "Satellite, Terrestrial, Cable" +msgstr "" + +#. Type: select +#. Description +#: ../vdr.templates:1002 +msgid "DVB card type:" +msgstr "" + +#. Type: select +#. Description +#: ../vdr.templates:1002 +msgid "" +"VDR needs to know your DVB card type to work correctly. Using your " +"selection, a channels.conf file will be installed to /var/lib/vdr. You may " +"have to change this file depending on your setup." +msgstr "" + +#. Type: boolean +#. Description +#: ../vdr.templates:2001 +msgid "Create /var/lib/video.00?" +msgstr "" + +#. Type: boolean +#. Description +#: ../vdr.templates:2001 +msgid "" +"By default VDR is configured to use /var/lib/video.00 to store recordings. " +"You can either create this directory now, or change this behavior later by " +"modifying the VIDEO_DIR variable in /etc/default/vdr." +msgstr "" --- vdr-1.6.0.orig/debian/po/pt.po +++ vdr-1.6.0/debian/po/pt.po @@ -0,0 +1,75 @@ +# Portuguese translation of vdr's debconf messages. +# Copyright (C) 2007 +# This file is distributed under the same license as the vdr package. +# Luísa Lourenço <kikentai@gmail.com>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: vdr 1.4.4-1\n" +"Report-Msgid-Bugs-To: vdr@packages.debian.org\n" +"POT-Creation-Date: 2009-04-02 14:42+0200\n" +"PO-Revision-Date: 2007-03-19 12:24+0000\n" +"Last-Translator: Luísa Lourenço <kikentai@gmail.com>\n" +"Language-Team: Portuguese <traduz@debianpt.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: select +#. Choices +#: ../vdr.templates:1001 +msgid "Satellite, Terrestrial, Cable" +msgstr "Satélite, Terrestre, Cabo" + +#. Type: select +#. Description +#: ../vdr.templates:1002 +msgid "DVB card type:" +msgstr "Tipo de placa DVB:" + +#. Type: select +#. Description +#: ../vdr.templates:1002 +msgid "" +"VDR needs to know your DVB card type to work correctly. Using your " +"selection, a channels.conf file will be installed to /var/lib/vdr. You may " +"have to change this file depending on your setup." +msgstr "" +"O VDR precisa de saber qual o tipo da sua placa DVB para funcionar " +"correctamente. Usando a sua escolha, o ficheiro channels.conf irá ser " +"instalado para /var/lib/vdr. Poderá ter que modificar este ficheiro " +"dependendo da sua configuração." + +#. Type: boolean +#. Description +#: ../vdr.templates:2001 +msgid "Create /var/lib/video.00?" +msgstr "Criar /var/lib/video.00?" + +#. Type: boolean +#. Description +#: ../vdr.templates:2001 +msgid "" +"By default VDR is configured to use /var/lib/video.00 to store recordings. " +"You can either create this directory now, or change this behavior later by " +"modifying the VIDEO_DIR variable in /etc/default/vdr." +msgstr "" +"Por omissão o VDR é configurado para usar o /var/lib/video.00 para guardar " +"as gravações. Poderá tanto criar agora este directório, ou modificar este " +"comportamento mais tarde modificando a variável VIDEO_DIR em /etc/default/" +"vdr." + +#~ msgid "VDR needs DVB kernel modules" +#~ msgstr "O VDR precisa de módulos DVB do kernel" + +#~ msgid "" +#~ "VDR needs DVB (Digital Video Broadcasting) kernel modules. You may have " +#~ "to separately install these modules. Ensure that the correct modules for " +#~ "your DVB hardware get loaded automatically e.g. by adding them to /etc/" +#~ "modules otherwise VDR won't work!" +#~ msgstr "" +#~ "O VDR precisa dos módulos DVB do kernel (Digital Video Broadcasting). " +#~ "Pode ter que instalar separadamente estes módulos. Assegure-se que os " +#~ "módulos correctos para o seu hardware DVB são carregados automaticamente " +#~ "p.e. ao adicioná-los ao /etc/modules caso contrário o VDR não irá " +#~ "funcionar!" --- vdr-1.6.0.orig/debian/po/fr.po +++ vdr-1.6.0/debian/po/fr.po @@ -0,0 +1,85 @@ +# translation of fr.po to French +# +# Translators, if you are not familiar with the PO format, gettext +# documentation is worth reading, especially sections dedicated to +# this format, e.g. by running: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# Some information specific to po-debconf are available at +# /usr/share/doc/po-debconf/README-trans +# or http://www.debian.org/intl/l10n/po-debconf/README-trans# +# Developers do not need to manually edit POT or PO files. +# Emmanuel le Chevoir <mms@debian.org>, 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: vdr_1.2.6-3\n" +"Report-Msgid-Bugs-To: vdr@packages.debian.org\n" +"POT-Creation-Date: 2009-04-02 14:42+0200\n" +"PO-Revision-Date: 2004-03-18 10:42+0100\n" +"Last-Translator: Emmanuel le Chevoir <mms@debian.org>\n" +"Language-Team: French <debian-l10n-french@lists.debian.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.3.1\n" + +#. Type: select +#. Choices +#: ../vdr.templates:1001 +msgid "Satellite, Terrestrial, Cable" +msgstr "Satellite, Terrestre, Câble" + +#. Type: select +#. Description +#: ../vdr.templates:1002 +msgid "DVB card type:" +msgstr "Type de carte DVB :" + +#. Type: select +#. Description +#: ../vdr.templates:1002 +msgid "" +"VDR needs to know your DVB card type to work correctly. Using your " +"selection, a channels.conf file will be installed to /var/lib/vdr. You may " +"have to change this file depending on your setup." +msgstr "" +"VDR a besoin de connaître le type de votre carte DVB pour fonctionner " +"correctement. Un fichier channels.conf correspondant au type que vous " +"choisirez sera installé dans le répertoire /var/lib/vdr. En fonction de " +"votre configuration, il est possible que vous ayez besoin de modifier ce " +"fichier par la suite." + +#. Type: boolean +#. Description +#: ../vdr.templates:2001 +msgid "Create /var/lib/video.00?" +msgstr "Créer le répertoire /var/lib/video.00 ?" + +#. Type: boolean +#. Description +#: ../vdr.templates:2001 +msgid "" +"By default VDR is configured to use /var/lib/video.00 to store recordings. " +"You can either create this directory now, or change this behavior later by " +"modifying the VIDEO_DIR variable in /etc/default/vdr." +msgstr "" +"Par défaut, VDR sauvegarde les enregistrements dans le répertoire /var/lib/" +"video.00. Vous pouvez changer ce répertoire en modifiant la variable " +"VIDEO_DIR dans le fichier /etc/default/vdr, ou créer ce répertoire " +"maintenant." + +#~ msgid "VDR needs DVB kernel modules" +#~ msgstr "VDR a besoin des modules DVB du noyau pour fonctionner" + +#~ msgid "" +#~ "VDR needs DVB (Digital Video Broadcasting) kernel modules. You may have " +#~ "to separately install these modules. Ensure that the correct modules for " +#~ "your DVB hardware get loaded automatically e.g. by adding them to /etc/" +#~ "modules otherwise VDR won't work!" +#~ msgstr "" +#~ "VDR a besoin des modules DVB (Digital Video Broadcasting) du noyau pour " +#~ "fonctionner. Il est possible que vous ayez besoin d'installer ces modules " +#~ "séparément. Assurez-vous que les modules correspondant à votre matériel " +#~ "DVB sont chargés automatiquement (en les ajoutant dans le fichier /etc/" +#~ "modules, par exemple), sans quoi VDR ne fonctionnera pas." --- vdr-1.6.0.orig/debian/po/gl.po +++ vdr-1.6.0/debian/po/gl.po @@ -0,0 +1,73 @@ +# Galician translation of vdr's debconf templates +# This file is distributed under the same license as the vdr package. +# Jacobo Tarrio <jtarrio@debian.org>, 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: vdr\n" +"Report-Msgid-Bugs-To: vdr@packages.debian.org\n" +"POT-Creation-Date: 2009-04-02 14:42+0200\n" +"PO-Revision-Date: 2008-05-20 23:07+0100\n" +"Last-Translator: Jacobo Tarrio <jtarrio@debian.org>\n" +"Language-Team: Galician <proxecto@trasno.net>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: select +#. Choices +#: ../vdr.templates:1001 +msgid "Satellite, Terrestrial, Cable" +msgstr "Satélite, Terrestre, Cable" + +#. Type: select +#. Description +#: ../vdr.templates:1002 +msgid "DVB card type:" +msgstr "Tipo de tarxeta de TV dixital:" + +#. Type: select +#. Description +#: ../vdr.templates:1002 +msgid "" +"VDR needs to know your DVB card type to work correctly. Using your " +"selection, a channels.conf file will be installed to /var/lib/vdr. You may " +"have to change this file depending on your setup." +msgstr "" +"VDR precisa de coñecer o tipo de tarxeta de TV dixital para funcionar " +"correctamente. Segundo o que escolla, hase instalar un ficheiro channels." +"conf en /var/lib/vdr. Pode ter que modificar este ficheiro dependendo da súa " +"configuración." + +#. Type: boolean +#. Description +#: ../vdr.templates:2001 +msgid "Create /var/lib/video.00?" +msgstr "¿Crear /var/lib/video.00?" + +#. Type: boolean +#. Description +#: ../vdr.templates:2001 +msgid "" +"By default VDR is configured to use /var/lib/video.00 to store recordings. " +"You can either create this directory now, or change this behavior later by " +"modifying the VIDEO_DIR variable in /etc/default/vdr." +msgstr "" +"Por defecto, VDR está configurado para empregar /var/lib/video.00 para " +"armacenar as gravacións. Pode crear este directorio agora, ou cambiar este " +"comportamento máis adiante modificando a variable VIDEO_DIR en /etc/default/" +"vdr." + +#~ msgid "VDR needs DVB kernel modules" +#~ msgstr "VDR precisa dos módulos de TV dixital" + +#~ msgid "" +#~ "VDR needs DVB (Digital Video Broadcasting) kernel modules. You may have " +#~ "to separately install these modules. Ensure that the correct modules for " +#~ "your DVB hardware get loaded automatically e.g. by adding them to /etc/" +#~ "modules otherwise VDR won't work!" +#~ msgstr "" +#~ "VDR precisa dos módulos de TV dixital. Pode ter que instalar estes " +#~ "módulos por separado. Asegúrese de que se carguen automaticamente os " +#~ "módulos correctos para o seu hardware de TV dixital, por exemplo, " +#~ "engadíndoos a /etc/modules. Se non o fai, VDR non ha funcionar." --- vdr-1.6.0.orig/debian/po/POTFILES.in +++ vdr-1.6.0/debian/po/POTFILES.in @@ -0,0 +1 @@ +[type: gettext/rfc822deb] vdr.templates --- vdr-1.6.0.orig/debian/po/nl.po +++ vdr-1.6.0/debian/po/nl.po @@ -0,0 +1,80 @@ +# Translators, if you are not familiar with the PO format, gettext +# documentation is worth reading, especially sections dedicated to +# this format, e.g. by running: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# +# Some information specific to po-debconf are available at +# /usr/share/doc/po-debconf/README-trans +# or http://www.debian.org/intl/l10n/po-debconf/README-trans +# +# Developers do not need to manually edit POT or PO files. +# +msgid "" +msgstr "" +"Project-Id-Version: vdr 1.2.6-4\n" +"Report-Msgid-Bugs-To: vdr@packages.debian.org\n" +"POT-Creation-Date: 2009-04-02 14:42+0200\n" +"PO-Revision-Date: 2004-05-18 08:40+0100\n" +"Last-Translator: Luk Claes <luk.claes@ugent.be>\n" +"Language-Team: Debian l10n Dutch <debian-l10n-dutch@lists.debian.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: select +#. Choices +#: ../vdr.templates:1001 +msgid "Satellite, Terrestrial, Cable" +msgstr "Satelliet, Aards, Kabel" + +#. Type: select +#. Description +#: ../vdr.templates:1002 +msgid "DVB card type:" +msgstr "DVB-kaarttype:" + +#. Type: select +#. Description +#: ../vdr.templates:1002 +msgid "" +"VDR needs to know your DVB card type to work correctly. Using your " +"selection, a channels.conf file will be installed to /var/lib/vdr. You may " +"have to change this file depending on your setup." +msgstr "" +"VDR moet uw DVB-kaarttype weten om correct te werken. Gebruikmakend van uw " +"selectie, zal een channels.conf-bestand worden geïnstalleerd in /var/lib/" +"vdr. U moet dit bestand misschien aanpassen afhankelijk van uw configuratie." + +#. Type: boolean +#. Description +#: ../vdr.templates:2001 +msgid "Create /var/lib/video.00?" +msgstr "/var/lib/video.00 aanmaken?" + +#. Type: boolean +#. Description +#: ../vdr.templates:2001 +msgid "" +"By default VDR is configured to use /var/lib/video.00 to store recordings. " +"You can either create this directory now, or change this behavior later by " +"modifying the VIDEO_DIR variable in /etc/default/vdr." +msgstr "" +"Standaard is VDR geconfigureerd om /var/lib/video.00 te gebruiken om opnames " +"te bewaren. U kunt deze map nu aanmaken of dit gedrag later wijzigen door de " +"VIDEO_DIR-variabele aan te passen in /etc/default/vdr." + +#~ msgid "VDR needs DVB kernel modules" +#~ msgstr "VDR heeft DVB-kernelmodules nodig" + +#~ msgid "" +#~ "VDR needs DVB (Digital Video Broadcasting) kernel modules. You may have " +#~ "to separately install these modules. Ensure that the correct modules for " +#~ "your DVB hardware get loaded automatically e.g. by adding them to /etc/" +#~ "modules otherwise VDR won't work!" +#~ msgstr "" +#~ "VDR heeft DVB (Digital Video Broadcasting) kernelmodules nodig. U moet " +#~ "deze modules misschien afzonderlijk installeren. Verzeker u ervan dat de " +#~ "correcte modules voor uw DVB-hardware automatisch worden geladen, " +#~ "bijvoorbeeld door ze toe te voegen aan /etc/modules, anders zal VDR niet " +#~ "werken!"