diff -Nru vdr-2.1.6/debian/abi-version vdr-2.1.6-297~3e4e445/debian/abi-version --- vdr-2.1.6/debian/abi-version 2014-04-02 19:21:18.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/abi-version 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -vdr-abi-2.1.6-yavdr0 diff -Nru vdr-2.1.6/debian/changelog vdr-2.1.6-297~3e4e445/debian/changelog --- vdr-2.1.6/debian/changelog 2014-04-23 16:29:44.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/changelog 2014-03-19 21:59:41.000000000 +0000 @@ -1,1887 +1,83 @@ -vdr (2.1.6-6yavdr0) precise; urgency=medium +vdr (2.1.6-297~3e4e445-ppa1~precise) precise; urgency=medium - * remove the dpkg-divert, compatibility with - testing/precise will be maintained with a git branch - - -- Lars Hanisch Wed, 23 Apr 2014 18:28:59 +0200 - -vdr (2.1.6-5yavdr0) precise; urgency=medium - - * add a dpkg-divert for the Upstart conf-file - for better compatibility with testing - * correct menuorg patch (osUserX) - - -- Lars Hanisch Tue, 22 Apr 2014 19:26:34 +0200 - -vdr (2.1.6-4yavdr0) precise; urgency=medium - - * bugfix in hide-first-recording-level patch - - -- Lars Hanisch Tue, 15 Apr 2014 19:42:31 +0200 - -vdr (2.1.6-3yavdr0) precise; urgency=medium - - * new version of conf.d patch - - -- Lars Hanisch Sun, 06 Apr 2014 12:34:56 +0200 - -vdr (2.1.6-2yavdr0) precise; urgency=medium - - * add new recording commands 'started' and 'deleted' to custom template - * sync vdr.default with old package - - -- Lars Hanisch Fri, 04 Apr 2014 13:14:33 +0200 - -vdr (2.1.6-1yavdr0) precise; urgency=medium - - * increase abi-version - - -- Lars Hanisch Wed, 02 Apr 2014 21:21:22 +0200 - -vdr (2.1.6-0yavdr0) precise; urgency=medium - - * new upstream release - - -- Lars Hanisch Wed, 02 Apr 2014 20:02:41 +0200 - -vdr (2.1.4-4yavdr0) precise; urgency=medium - - * correct quoting of plugin parameter - - -- Lars Hanisch Fri, 21 Mar 2014 11:20:54 +0100 - -vdr (2.1.4-3yavdr0) precise; urgency=medium - - * conf.d patch v5 - - -- Lars Hanisch Fri, 21 Mar 2014 10:02:31 +0100 - -vdr (2.1.4-2yavdr0) precise; urgency=medium - - * add conf.d patch v3 (with whitespace removal) - - -- Lars Hanisch Thu, 20 Mar 2014 01:10:38 +0100 - -vdr (2.1.4-1yavdr0) precise; urgency=medium - - * add conf.d patch - - -- Lars Hanisch Wed, 19 Mar 2014 22:30:00 +0100 - -vdr (2.1.4-0yavdr0) precise; urgency=medium - - * new upstream release - - -- Lars Hanisch Wed, 05 Feb 2014 17:30:06 +0100 - -vdr (2.1.3-1yavdr0) precise; urgency=medium - - * add following patches: - jumpplay, graphtft, pin, jumpingseconds, permashift, - hide-first-recording-level - - -- Lars Hanisch Wed, 05 Feb 2014 17:07:49 +0100 - -vdr (2.1.3-0yavdr0) precise; urgency=medium - - * new upstream release - - -- Lars Hanisch Sun, 05 Jan 2014 14:37:52 +0100 - -vdr (2.1.2-3yavdr0) precise; urgency=medium - - * re-enable dynamite and externalci patches - (don't expect dynamite to work with positioners) - - -- Lars Hanisch Sun, 15 Dec 2013 14:59:03 +0100 - -vdr (2.1.2-2yavdr0) precise; urgency=medium - - * picked patches for shutdown-wrapper and upstart job from master - - -- Lars Hanisch Wed, 27 Nov 2013 23:18:20 +0100 - -vdr (2.1.2-1yavdr0) precise; urgency=medium - - * add remote-instant-recordings patch - - -- Lars Hanisch Wed, 20 Nov 2013 23:21:03 +0100 - -vdr (2.1.2-0yavdr0) precise; urgency=medium - - * new upstream release - - -- Lars Hanisch Sat, 16 Nov 2013 15:13:38 +0100 - -vdr (2.0.4-0yavdr0) precise; urgency=medium - - * new upstream release - - -- Lars Hanisch Sat, 26 Oct 2013 09:19:37 +0200 - -vdr (2.0.3-3yavdr0) precise; urgency=medium - - * finetuning on lirc-reconnect patch - - -- Lars Hanisch Fri, 25 Oct 2013 19:20:16 +0200 - -vdr (2.0.3-2yavdr0) precise; urgency=medium - - * correct MOVR/CPYR from vasarajanauloja patch - - -- Lars Hanisch Tue, 22 Oct 2013 18:45:16 +0200 - -vdr (2.0.3-1yavdr0) precise; urgency=medium - - * add lirc-reconnect patch - - -- Lars Hanisch Mon, 14 Oct 2013 23:08:06 +0200 - -vdr (2.0.3-0yavdr0) precise; urgency=medium - - * new upstream release - - -- Lars Hanisch Wed, 11 Sep 2013 23:28:17 +0200 - -vdr (2.0.2-5yavdr0) precise; urgency=medium - - * add epghandler segment transfer patch - * update extra video directories patch - - -- Lars Hanisch Wed, 11 Sep 2013 22:54:27 +0200 - -vdr (2.0.2-4yavdr0) precise; urgency=medium - - * update pin patch - - -- Lars Hanisch Sun, 01 Sep 2013 10:32:57 +0200 - -vdr (2.0.2-3yavdr0) precise; urgency=medium - - * update extra video directory patch - - -- Lars Hanisch Fri, 26 Jul 2013 15:04:45 +0200 - -vdr (2.0.2-2yavdr0) precise; urgency=medium - - * vdr-plugin-dvbhddevice breaks old vdr packages - vdr-1.7.27 package contains a file from vdr-plugin-dvbhddevice - - -- Lars Hanisch Wed, 17 Jul 2013 23:32:45 +0200 - -vdr (2.0.2-1yavdr0) precise; urgency=medium - - * update extra video directory patch - * add simple bash completion for svdrpsend - - -- Lars Hanisch Thu, 11 Jul 2013 22:08:47 +0200 - -vdr (2.0.2-0yavdr0) precise; urgency=medium - - * new upstream release - * update permashift patch - * add loglevel patch - - -- Lars Hanisch Sun, 23 Jun 2013 09:13:37 +0200 - -vdr (2.0.1-7yavdr0) precise; urgency=medium - - * Upstart: start on static-network-up, not "stopping networking" - With Raring "networking" is not a task anymore. - - -- Lars Hanisch Wed, 08 May 2013 13:00:44 +0200 - -vdr (2.0.1-6yavdr0) precise; urgency=medium - - * increase version to sync with yavdr-0.5 - - -- Lars Hanisch Tue, 07 May 2013 19:36:06 +0200 - -vdr (2.0.1-5yavdr0) precise; urgency=medium - - * set uid/gid of vdr/vdr to 666 - - -- Lars Hanisch Tue, 07 May 2013 19:32:50 +0200 - -vdr (2.0.1-4yavdr0) precise; urgency=medium - - * don't fail if owner on recordings can't be set - - -- Lars Hanisch Sun, 21 Apr 2013 11:47:48 +0200 - -vdr (2.0.1-3yavdr0) precise; urgency=medium - - * no restart on upgrade - - -- Lars Hanisch Sat, 20 Apr 2013 10:04:59 +0200 - -vdr (2.0.1-2yavdr0) precise; urgency=medium - - * remove all channels.conf on purge - * yaVDR uses /srv/vdr/video.00 as video directory - * don't start/stop vdr on install/upgrade - * don't use series name in version anymore - - -- Lars Hanisch Fri, 19 Apr 2013 08:20:41 +0200 - -vdr (2.0.1-1yavdr0~precise) precise; urgency=medium - - * add LIRC socket /var/run/lirc/lircd to config-loader.sh as default - - -- Lars Hanisch Sat, 13 Apr 2013 22:17:58 +0200 - -vdr (2.0.1-0yavdr0~precise) precise; urgency=medium - - * new upstream release - - -- Lars Hanisch Sat, 13 Apr 2013 16:44:47 +0200 - -vdr (2.0.0-4yavdr0~precise) precise; urgency=medium - - * add olddvbapi patch - * The patchinfo is now generated with debian/rules accept-patches - * add cut-prio patch - - -- Lars Hanisch Wed, 10 Apr 2013 18:14:56 +0200 - -vdr (2.0.0-3yavdr0~precise) precise; urgency=medium - - * Append CPPFLAGS to CFLAGS, so this gets stored in vdr.pc and can be used by plugins - * extract-patchinfo: grep auhtor and description from quilt header - * update some patch headers - * simplify commands-loader.sh, use "sort" instead of order.*.conf - * add keeptracks patch - - -- Lars Hanisch Thu, 04 Apr 2013 20:57:26 +0200 - -vdr (2.0.0-2yavdr0~precise) precise; urgency=medium - - * add extra-video-directory patch - - -- Lars Hanisch Wed, 03 Apr 2013 21:47:04 +0200 - -vdr (2.0.0-1yavdr0~precise) precise; urgency=medium - - * add permashift patch - - -- Lars Hanisch Tue, 02 Apr 2013 18:52:20 +0200 - -vdr (2.0.0-0yavdr0~precise) precise; urgency=medium - - * new upstream release - - -- Lars Hanisch Tue, 02 Apr 2013 13:50:56 +0200 - -vdr (1.7.42-3yavdr0~precise) precise; urgency=medium - - * pick some patches from etobi's repository - - -- Lars Hanisch Thu, 28 Mar 2013 21:59:01 +0100 - -vdr (1.7.42-2yavdr0~precise) precise; urgency=medium - - * update vasarajanauloja patch - * add vdr-dbg Upstart job for collection crash log - * add support for "LIRC=/dev/path" in /etc/default/vdr - - -- Lars Hanisch Tue, 26 Mar 2013 19:47:17 +0100 - -vdr (1.7.42-1yavdr0~precise) precise; urgency=medium - - * add new plugin-loader - - -- Lars Hanisch Sun, 24 Mar 2013 15:58:33 +0100 - -vdr (1.7.42-0yavdr0~precise) precise; urgency=medium - - * new upstream release - - -- Lars Hanisch Sat, 23 Mar 2013 15:49:09 +0100 - -vdr (1.7.41-0yavdr0~precise) precise; urgency=medium - - * new upstream release - - -- Lars Hanisch Sat, 16 Mar 2013 15:42:10 +0100 - -vdr (1.7.40-9yavdr0~precise) precise; urgency=medium - - * don't install /etc/init.d/vdr, can now be found in - /usr/share/doc/vdr/examples/vdr-init.d - - -- Lars Hanisch Fri, 15 Mar 2013 10:51:21 +0100 - -vdr (1.7.40-8yavdr0~precise) precise; urgency=medium - - * rm db_stop from vdr.postinst - - -- Lars Hanisch Fri, 15 Mar 2013 09:11:11 +0100 - -vdr (1.7.40-7yavdr0~precise) precise; urgency=medium - - * remove debconf stuff from vdr.postinst - * add 'lastplugin' feature to plugin-loader.sh and order.conf - * add dirnamesdefaults patch - * use '--dirnames=,,1' if VFAT is set - - -- Lars Hanisch Thu, 14 Mar 2013 18:20:08 +0100 - -vdr (1.7.40-6yavdr0~precise) precise; urgency=medium - - * install Make.config to VDRDIR - - -- Lars Hanisch Thu, 14 Mar 2013 00:14:32 +0100 - -vdr (1.7.40-5yavdr0~precise) precise; urgency=medium - - * add Make.config - - -- Lars Hanisch Wed, 13 Mar 2013 22:27:06 +0100 - -vdr (1.7.40-4yavdr0~precise) precise; urgency=medium - - * add patches - * install header of dvbhddevice and dvbsddevice - * set videodir to yavdr's default - - -- Lars Hanisch Wed, 13 Mar 2013 19:56:47 +0100 - -vdr (1.7.40-1) unstable; urgency=low - - * New upstream release - * Dropped 11_sortrecordings.patch - The recording list sorting now is as it is - meant to be sortded by the upstream developer - * Dropped fix-gcc-issue.patch - fixed upstream - * Dropped fix-no-hddvbdevice-segfault.patch - fixed upstream - * Refreshed all patches - * Dropped Added 16_channels.conf.terr-fix.patch - fixed upstream - * Switch to debhelper/compat 9 - * Make use of dh and VDR's install target to simplify debian/rules - * Clean up /var/lib/vdr/themes when purging package - * vdr-dbg and vdr-plugin-*-dbg now install the debug symbols - - -- Tobias Grimm Wed, 23 Jan 2013 22:47:45 +0100 - -vdr (1.7.28-1) unstable; urgency=low - - * New upstream release - * Removed fontconfig_fontsort.patch - fixed upstream - * Updated documentation about the originial recording now passed as 3'rd - argument to the "edited" action of the recording hooks - * Fixed passing parameters to recording hooks - * Added fix-no-hddvbdevice-segfault.patch to avoid a segfault when the - dvbhddevice plugin is installed but no full featured HD DVB card is - available (Closes: #674441) - - -- Tobias Grimm Wed, 06 Jun 2012 17:57:29 +0200 - -vdr (1.7.27-2) unstable; urgency=low - - * Fixed issue with fontconfig 2.9 (Closes: #671223) - - -- Tobias Grimm Thu, 03 May 2012 19:33:19 +0200 - -vdr (1.7.27-1) unstable; urgency=low - - * New upstream release - * Dropped 17_epg_channel_name_width.patch - fixed upstream - * Fixed removing user vdr from groups in vdr-groups.sh - * Fix bashism in vdr-groups.sh (Closes: #669937) - - -- Tobias Grimm Sun, 22 Apr 2012 11:11:05 +0200 - -vdr (1.7.26-1) unstable; urgency=low - - * New upstream release (Closes: #659646) - * Dropped Added 01-upstream-fix1.patch - * Dropped Added 02-upstream-fix2.patch - * Standards-Version: 3.9.3 - - -- Tobias Grimm Sun, 11 Mar 2012 10:37:07 +0100 - -vdr (1.7.24-1) unstable; urgency=low - - * New upstream release - * Added 01-upstream-fix1.patch - a minor patch from Klaus Schmidinger - * Added 02-upstream-fix2.patch - reverts some problematic changes in the - upstream release - * Install scr.conf (Satellite Channel Routing) to /etc/vdr/ (Closes: #660729) - * Updated debianize-vdrplugin to use the debhelper V7 format - - -- Tobias Grimm Sun, 19 Feb 2012 17:21:08 +0100 - -vdr (1.7.23-1) unstable; urgency=low - - * New upstream release - * Build-depend on linux-libc-dev (>= 3.0) (DVB driver API >= 5.3 required - now, which was introduced in Linux 3.0-rc!) - - [Darren Salt] - * 17_epg_channel_name_width.patch - Show more of the channel names in the EPG now/next listings. - Without this, I see 'BBC ON', BBC TW', 'ITV1', 'Channe', 'Channe' etc. - * Enabled parallel build. - - -- Tobias Grimm Wed, 25 Jan 2012 00:37:52 +0000 - -vdr (1.7.22-1) unstable; urgency=low - - * New upstream release - * Dropped 99_dvbc-unitiymedia-fix.dpatch - fixed upstream - * Dropped multipatch patches - these are available in the etobi-branch - of the Git repository - * Dropped dpatch and use quilt for the patches - no PATCHVARIANT support - anymore! To build VDR with a different set of patches, grab the - appropriate branch from the Git. - * Added build-arch, build-indep targets - * Added installation of the dvbhddevice plugin - - -- Tobias Grimm Sat, 10 Dec 2011 21:51:31 +0100 - -vdr (1.7.21-1) unstable; urgency=low - - * Dropped 99_fix-recording-problem-vdr-1.7.20.dpatch - * Upgraded opt-20_liemikuutio.dpatch to version 1.31 - * Updated opt-24_jumpplay.dpatch - * Dropped opt-27_ttxtsubs.dpatch - * Dropped opt-48-x_pin.dpatch - * Dropped opt-51_cuttime.dpatch - * Dropped opt-52_hard_link_cutter.dpatch - * New ABI version for 1.7.21 - * chown +r on /proc/av7110_ir and /proc/budget_ci_ir - * Added 99_dvbc-unitiymedia-fix.dpatch - - -- Tobias Grimm Wed, 26 Oct 2011 00:10:58 +0200 - -vdr (1.7.20-1) unstable; urgency=low - - * New upstream release - * Added 99_fix-recording-problem-vdr-1.7.20.dpatch - * Build-depend on libjpeg-dev instead of libjpeg62-dev - * Updated multipatch patches (Not used for Debian build) - - -- Tobias Grimm Fri, 19 Aug 2011 23:16:41 +0200 - -vdr (1.7.19-1) unstable; urgency=low - - * New upstream release - * Dropped 99_gcc4.6-fix.dpatch (fixed upstream) - - -- Tobias Grimm Sun, 19 Jun 2011 18:55:51 +0200 - -vdr (1.7.18-2) unstable; urgency=low - - * Added 99_gcc4.6-fix.dpatch to fix GCC 4.6 issue in skincurses plugin - * Standards-Version: 3.9.2 - - -- Tobias Grimm Fri, 13 May 2011 07:34:28 +0200 - -vdr (1.7.18-1) unstable; urgency=low - - * New upstream release - * Dropped dvb-s2api-liplianin-headers dependency from vdr-dev - * Disabled dvbhddevice until the driver from - http://powarman.dyndns.org/hg/v4l-dvb-saa716x/ gets merged into the - kernel - * Dropped 99_vdr-workaround-broken-sys-capability.dpatch - * Use 3.0 source formate and bz2 tarballs - * Fixed spelling error in vdr.NEWS - * Replaced "dh_clean -k" by "dh_prep" - - -- Tobias Grimm Sun, 17 Apr 2011 17:39:15 +0200 - -vdr (1.7.17-1) unstable; urgency=low - - [ Thomas Günther, Tobias Grimm ] - * Updated to the latest upstream development version release 1.7.17 - (Closes: #573896, #621924) - * Updated/Removed debian/patches/* - * Setting default SVDRP port to 6419 (this was already changed by upstrem) - * Added BIDI define to 81_Make_config.dpatch - * Added libfribidi-dev to Build-Depends - * Added Make.global to vdr-dev.install and 81_Make_config.dpatch - * Removed BUILDVDR define - * Added include links via debian/vdr-dev.links to make the include structure - compatible to vdr standards - * Removed 03_cmdsubmenu.dpatch (command submenus now integrated in upstream) - * Removed installation of the sky plugin - * Added installation of the dvbsddevice plugin - * Suggest vdr-plugin-dvbsddevice - * Added NEWS entry about vdr-plugin-dvbsddevice and a probably required - modified firmware - * Updated README.Debian - * Made sure po files are unmodified after clean (Closes: #593925) - - [ Thomas Schmidt ] - * Update Vcs-* fields: Move packaging from svn to git - * Fixed some lintian warnings - - [ Tobias Grimm ] - * Removed vdr-kbd, vdr-daemon, vdr-lirc and vdr-rcu - /usr/bin/vdr should be - used instead - * Dropped conflicts to vdradmin - * Dropped moving of channels.conf from /etc/vdr/ to /var/lib/vdr/ - * Dropped marks reloading from jumpplay patch (Patch modified by Udo Richter) - - -- Tobias Grimm Sun, 10 Apr 2011 12:56:07 +0200 - -vdr (1.6.0-19.1) unstable; urgency=low - - * debian/vdrleaktest - - Remove extra colon from LD_LIBRARY_PATH to fix CVE-2010-3387. - (normal, security; Closes: #598308). - - -- Jari Aalto Thu, 21 Oct 2010 09:18:54 +0300 - -vdr (1.6.0-19) unstable; urgency=low - - * Fixed DEB_BUILD_OPTIONS export in in vdrdbg-buildpackage - (Closes: #596593) - - -- Tobias Grimm Sun, 17 Oct 2010 11:27:55 +0200 - -vdr (1.6.0-18.1) unstable; urgency=low - - * debian/vdrleaktest - - Asjust LD_LIBRARY_PATH use according to CVE-2010-3387. - (normal, security; Closes: #598308). - - -- Jari Aalto Sat, 16 Oct 2010 20:59:56 +0300 - -vdr (1.6.0-18) unstable; urgency=low - - * Added Danish translation of the debconf templates (Thx to Joe Hansen) - (Closes: #592260) - * Minor fix to options parsing in debug version start script - * Standards-Version: 3.9.1 - - -- Tobias Grimm Thu, 19 Aug 2010 00:07:33 +0200 - -vdr (1.6.0-17) unstable; urgency=low - - * Modified runvdr to also (re)load dvb modules not depending on dvb_core* - (Closes: #576337) - * Added debian/source/format 1.0 - - -- Tobias Grimm Fri, 30 Apr 2010 22:43:50 +0200 - -vdr (1.6.0-16) unstable; urgency=low - - [ Thomas Günther ] - * Added opt-22-x_edit_marks.dpatch - * Adapted opt-48-x_pin.dpatch to vdr-workaround-broken-sys-capability patch - * Updated opt-52_hard_link_cutter.dpatch to version 0.2.2 - (fixes gcc 4.4 issue) - * Added -p to bash shebang line of init script, because this is needed, - if VDR calls the init script itself via a suid wrapper - * Added linux-libc-dev to Depends of package vdr-dev (linux/dvb/*.h included - in header files, e.g. device.h) - - [ Tobias Grimm ] - * Moved /usr/include/vdr/libsi to /usr/include/libsi to make the include - structure compatible to vdr standards - - -- Tobias Grimm Sun, 28 Mar 2010 14:50:33 +0200 - -vdr (1.6.0-15) unstable; urgency=low - - * Standards-Version: 3.8.4 - * Made init script require $remote_fs (/usr/...) - * Migrated debconf _Choices to __Choices - - -- Tobias Grimm Thu, 04 Mar 2010 23:28:37 +0100 - -vdr (1.6.0-14) unstable; urgency=low - - [ Thomas Günther ] - * Removed 99_dvb-header-fixes.dpatch - * Added 99_vdr-workaround-broken-sys-capability.dpatch - - [ Tobias Grimm ] - * Added Japanese debconf translation (Closes: #555546) - - -- Tobias Grimm Fri, 15 Jan 2010 00:13:07 +0100 - -vdr (1.6.0-13) unstable; urgency=low - - * New upstream homepage http://www.tvdr.de/ - * Removed make-special-vdr.sh (Closes: #552638) - * Added README.source - - -- Tobias Grimm Sun, 08 Nov 2009 22:14:13 +0100 - -vdr (1.6.0-12) unstable; urgency=low - - [ Thomas Günther ] - * Upgraded make-special-vdr.sh to version 1.3 - - [ Tobias Grimm ] - * Added Italian debconf translation (Closes: #548798) - * Fixed FTBFS with gcc 4.4 (Closes: #549380) - * Standards-Version: 3.8.3 - - -- Tobias Grimm Fri, 09 Oct 2009 21:55:31 +0200 - -vdr (1.6.0-11) unstable; urgency=low - - * Fixed syntax error in runvdr and don't set "-p" anymore, which is only - supported by Bash (Closes: #536894) - * Added Russian debconf template provided by Yuri Kozlov (Closes: #536561) - - -- Tobias Grimm Tue, 14 Jul 2009 20:55:37 +0200 - -vdr (1.6.0-10) unstable; urgency=low - - * Upgraded opt-20_liemikuutio.dpatch to version 1.27 - * Updated and renamed opt-40_iptv.dpatch to opt-40_pluginparam.dpatch - * Added 99_dvb-header-fixes.dpatch as a workaround for the header bugs in - Linux 2.6.29 - * Fixed debianize-vdrplugin template (dropped patchlevel field in control) - * Changed section of plugin template to "video" - * Added Spanish debconf template translation (Closes: #528245) - * Build-Depend on linux-libc-dev - * Dropped Kernel 2.4 support in runvdr - * Updated make-special-vdr.sh - * New multipatch ABI version 2009-05-03 - * Bumped standards version to 3.8.2 - - -- Tobias Grimm Fri, 10 Jul 2009 20:24:50 +0200 - -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, #527664) - * 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-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-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-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 + * [3e4e4454fc01b7bd39eef06f7e02961f7edf8305] + Version 2.1.6 + VDR developer version 2.1.6 is now available at - -- 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 + ftp://ftp.tvdr.de/vdr/Developer/vdr-2.1.6.tar.bz2 -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) + A 'diff' against the previous version is available at + + ftp://ftp.tvdr.de/vdr/Developer/vdr-2.1.5-2.1.6.diff + + MD5 checksums: + + 79519dac59166fabc2029b916bd61d00 vdr-2.1.6.tar.bz2 + 99f2f7094a242462696c0da5e52bb4c3 vdr-2.1.5-2.1.6.diff + + WARNING: + ======== + + This is a *developer* version. Even though *I* use it in my productive + environment, I strongly recommend that you only use it under controlled + conditions and for testing and debugging. + + From the HISTORY file: + - Revoked "Fixed some compiler warnings with Clang 3.4.1" from ci.c, because this + did not compile with older versions of gcc (thanks to Sören Moch). + - Fixed keeping the current position in the Recordings menu if a recording was + deleted in a sub folder. + - Fixed handling transfer mode on full featured DVB cards for encrypted channels + that have no audio pid (reported by Christian Winkler). + - Fixed a possible endless loop in cH264Parser::GetGolombUe(), which caused recordings + on some HD channels to get stuck and resulted in buffer overflows. + - Fixed handling PAT packets when detecting frames, so that they can be properly + taken into account when regenerating the index of a recording. + - Fixed adding new source types in case they are already registered (reported by Rolf + Ahrenberg). + - Removed an unnecessary assignment from cMenuRecordings::~cMenuRecordings(). + - The Recordings menu now remembers the last recording the cursor was positioned on, + independent of the last replayed recording. When a replay ends, however, the cursor + will initially be positioned to the last replayed recording again when the menu + is opened. + - Updated the Finnish OSD texts (thanks to Antti Hartikainen). + - Fixed drawing the live indicator in the LCARS skin in case there are no devices. + - When checking for obsolete channels, those with an RID that is not 0 are now + ignored (suggested by Oliver Endriss). + - The SDT is now only parsed *after* the NIT has been read, and it explicitly uses + the source value derived from the NIT. This should prevent new channels from being + created with the wrong source. + - Added a log message in case a receiver is detached from its device because the + assigned CAM can't decrypt the channel. + - Refactored setup parameter handling for output devices: + + The function cDevice::GetVideoSystem() has been deprecated and will be removed + in a future version. In order to check whether a particular plugin needs to be + modified if this function is removed, you can comment out the line + #define DEPRECATED_VIDEOSYSTEM + in device.h. + + Handling the "video (display) format" (things like 16:9, 4:3, pan&scan, letterbox + etc) shall now be done by the individual output devices, because the types and + numbers of parameters are too device specific. The Setup/DVB parameters + "Video format" and "Video display format" are still there for now and can be used + by SD devices. HD devices, however, shall not use these parameters (any more), + but rather implement their own setup menu with the necessary parameters for + controlling output. + + The dvbhdffdevice plugin has been modified accordingly. + + Made it clear that cDevice::SetDigitalAudioDevice() merely tells the output device + that the current audio track is Dolby Digital. This function was only used by the + original "full featured" DVB cards - do not use it for new developments! + If an output device has several ways of replaying audio (like HDMI or analog jack) + it shall implement the proper options in its plugin's SetupMenu() function. + - Added support for "Pilot", "T2-System-Id" and "SISO/MISO" parameters (thanks to + Rolf Ahrenberg). + - Now initializing the isOnVideoDirectoryFileSystem member of cRecording when + scanning the video directory, so that it won't cause a delay when opening the menu + on a system with a large number of recordings. + - Now resetting the isOnVideoDirectoryFileSystem member of a cRecording to -1 after + renaming it, so that it will be re-checked upon the next call to + IsOnVideoDirectoryFileSystem(). + - Added support for systemd (thanks to Christopher Reimer). To activate this you + need to add "SDNOTIFY=1" to the 'make' call. - -- 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 + -- Andrey Pavlenko Thu, 20 Mar 2014 01:59:41 +0400 diff -Nru vdr-2.1.6/debian/commands.custom.conf vdr-2.1.6-297~3e4e445/debian/commands.custom.conf --- vdr-2.1.6/debian/commands.custom.conf 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/commands.custom.conf 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -# -# 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, e.g.: -# -# Open fortune cookie: /usr/games/fortune -# -# If you uncomment the line above and restart vdr, you will have a new -# command menu entry, called "Open fortune cookie", that will show you a -# random epigram. ( you may need an "apt-get install fortune" first! ) -# -# You can divide your commands into submenus, e.g.: -# -# Fortune Cookies { -# Long Dictum : /usr/games/fortune -l -# Short Apothegms : /usr/games/fortune -s -# Special Topics { -# Literature : /usr/games/fortune literature -# Riddles : /usr/games/fortune riddles -# } -# } -# -# Again, just uncomment the above lines and restart vdr to see for your self, -# how this looks like on the OSD. -# diff -Nru vdr-2.1.6/debian/commands-loader.sh vdr-2.1.6-297~3e4e445/debian/commands-loader.sh --- vdr-2.1.6/debian/commands-loader.sh 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/commands-loader.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ -# -# This file is called by /etc/init.d/vdr -# - -writewarning () -{ -echo -e \ -"#\n"\ -"# This file is automatically generated by the vdr init-script. You can\n"\ -"# define custom commands in /etc/vdr/command-hooks/$1.custom.conf\n"\ -"# (see /usr/share/doc/vdr/README.Debian.gz).\n"\ -"#\n\n\n" -} - -# merges single <cmdtype>.<name>.conf files into one <cmdtype>.conf -# in alphabetical order -mergecommands () -{ - local cmdtype - local cmdfile - - cmdtype=$1 - cmdfile="/var/cache/vdr/$cmdtype.conf" - - writewarning $cmdtype > "$cmdfile" - - find $CMDHOOKSDIR -maxdepth 1 -name "$cmdtype.*.conf" | sort | xargs cat >> "$cmdfile" -} diff -Nru vdr-2.1.6/debian/commands.update-recordings.conf vdr-2.1.6-297~3e4e445/debian/commands.update-recordings.conf --- vdr-2.1.6/debian/commands.update-recordings.conf 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/commands.update-recordings.conf 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -Aufnahmen-Liste aktualisieren : /usr/bin/svdrpsend updr >/dev/null 2>&1 & diff -Nru vdr-2.1.6/debian/compat vdr-2.1.6-297~3e4e445/debian/compat --- vdr-2.1.6/debian/compat 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/compat 2014-03-19 21:59:41.000000000 +0000 @@ -1 +1 @@ -9 +7 diff -Nru vdr-2.1.6/debian/config-loader.sh vdr-2.1.6-297~3e4e445/debian/config-loader.sh --- vdr-2.1.6/debian/config-loader.sh 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/config-loader.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,87 +0,0 @@ -# -# 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=6419 - -# Enable / Disable vdr daemon -ENABLED=0 - -# Enable / Disable automatic shutdown -ENABLE_SHUTDOWN=0 - -# Video-Directory -VIDEO_DIR="/srv/vdr/video.00" - -# Cache-Directory -CACHE_DIR="/var/cache/vdr" - -# Resource-Directory -RES_DIR="/usr/share/vdr" - -# 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 - -# if you want to use a specific lirc device, set it in /etc/default/vdr -# if you want to disable lirc, set LIRC="" -LIRC="/var/run/lirc/lircd" - -test -f /etc/default/vdr && . /etc/default/vdr diff -Nru vdr-2.1.6/debian/configs/etc/vdr/allowed_hosts.conf vdr-2.1.6-297~3e4e445/debian/configs/etc/vdr/allowed_hosts.conf --- vdr-2.1.6/debian/configs/etc/vdr/allowed_hosts.conf 1970-01-01 00:00:00.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/configs/etc/vdr/allowed_hosts.conf 2014-03-19 21:59:41.000000000 +0000 @@ -0,0 +1,12 @@ +# +# allowed_hosts.conf This file describes a number of host addresses that +# are allowed to connect to this Video Disk Recorder (VDR). +# Syntax: +# +# IP-Address[/Netmask] +# + +127.0.0.1 # always accept localhost +192.168.0.0/16 # any host on the local net +#204.152.189.113 # a specific host +#0.0.0.0/0 # any host on any net (USE THIS WITH CARE!) diff -Nru vdr-2.1.6/debian/configs/etc/vdr/channels.conf vdr-2.1.6-297~3e4e445/debian/configs/etc/vdr/channels.conf --- vdr-2.1.6/debian/configs/etc/vdr/channels.conf 1970-01-01 00:00:00.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/configs/etc/vdr/channels.conf 2014-03-19 21:59:41.000000000 +0000 @@ -0,0 +1,532 @@ +:Эфирные +Домашний;HTB+:11900:vC34M2O35S0:S36.0E:27500:329=2:409=rus@4:0:500,5601:16109:112:16:0 +Звезда;HTB+:12399:vC34M2O35S0:S36.0E:27500:329=2:419=rus@4:0:500,5601:10309:112:3:0 +НТВ;HTB+:12399:vC34M2O35S0:S36.0E:27500:320=2:400=rus@4,401=und@4:501:500,5601:10301:112:3:0 +ОТР;HTB+:11996:hC34M5O35S1:S36.0E:27500:218=27:318=rus@4:0:5601,500:19118:112:19:0 +Перец;HTB+:11900:vC34M2O35S0:S36.0E:27500:325=2:405=rus@4:0:500,5601:16105:112:16:0 +Первый HD;HTB+:12130:vC34M5O35S1:S36.0E:27500:305=27:405=rus@4:505:500,5601:20105:112:20:0 +Первый канал;HTB+:12322:vC34M2O35S0:S36.0E:27500:325=2:410=rus@4:510:500,5601:10106:112:1:0 +Пятый канал;HTB+:12265:hC34M2O35S0:S36.0E:27500:326=2:406=rus@4:0:500,5601:31006:112:10:0 +РЕН ТВ;HTB+:12322:vC34M2O35S0:S36.0E:27500:329=2:416=rus@4:0:500,5601:10108:112:1:0 +Россия 1;HTB+:12399:vC34M2O35S0:S36.0E:27500:323=2:406=rus@4:506:500,5601:10304:112:3:0 +Россия HD;HTB+:12130:vC34M5O35S1:S36.0E:27500:306=27:406=@4:0:5601,500:20106:112:20:0 +Россия К;HTB+:12399:vC34M2O35S0:S36.0E:27500:324=2:408=rus@4:508:500,5601:10305:112:3:0 +СТС;HTB+:12399:vC34M2O35S0:S36.0E:27500:325=2:410=rus@4:0:5601,500:10306:112:3:0 +ТВ3;HTB+:12399:vC34M2O35S0:S36.0E:27500:328=2:416=rus@4:0:500,5601:10308:112:3:0 +ТВЦ;HTB+:12265:hC34M2O35S0:S36.0E:27500:331=2:411=rus@4:511:500,5601:31011:112:10:0 +ТНТ;HTB+:12399:vC34M2O35S0:S36.0E:27500:321=2:402=rus@4,403=@4:0:5601,500:10302:112:3:0 + +:ФУТБОЛ +НТВ-ПЛЮС Наш футбол;HTB+:12437:vC34M2O35S0:S36.0E:27500:324=2:404=rus@4:0:500:10404:112:4:0 +НТВ-ПЛЮС Футбол 2 HD;HTB+:12130:vC34M5O35S1:S36.0E:27500:301=27:401=rus@4:0:5601,500:20101:112:20:0 +НТВ-ПЛЮС Футбол 2;HTB+:12437:vC34M2O35S0:S36.0E:27500:323=2:403=rus@4:0:500:10403:112:4:0 +НТВ-ПЛЮС Футбол HD;HTB+:11823:vC34M5O35S1:S36.0E:27500:325=27:405=rus@4:0:500,5601:14105:112:14:0 +НТВ-ПЛЮС Футбол;HTB+:12322:vC34M2O35S0:S36.0E:27500:321=2:402=rus@4:0:500,5601:10102:112:1:0 +Наш футбол HD;HTB+:12207:vC34M5O35S1:S36.0E:27500:301=2:401=@4:0:500:26001:112:9:0 +Футбол;HTB+:11996:hC34M5O35S1:S36.0E:27500:220=27:320=rus@4:0:500,5601:19120:112:19:0 +Триколор| Наш Футбол HD;TricolorTV:12418:hC34M5O35S1:S36.0E:27500:3761=27:3762=rus@4:0:4AE1,2710:37006:65535:237:0 +Триколор| Наш Футбол;TricolorTV:12226:hC34M2O35S0:S36.0E:27500:1201=2:1202=rus@4:0:4AE1,2710,4AE0:27120:65535:27:0 +Триколор| Футбол;TricolorTV:11727:hC34M5O35S1:S36.0E:27500:1051=27:1052=rus@4:0:4AE1,2710:2619:65535:1:0 + +:Спорт +Eurosport 2;HTB+:12245:vC34M2O35S0:S36.0E:27500:322=2:404=rus@4,405=eng@4:0:500:20703:112:7:0 +Eurosport HD;HTB+:12073:hC34M5O35S1:S36.0E:27500:324=27:404=rus@4,424=eng@4:0:5601,500:12104:112:12:0 +Eurosport;HTB+:12456:hC34M2O35S0:S36.0E:27500:325=2:410=rus@4,411=eng@4:0:500,5601:20506:112:5:0 +Extreme Sports;HTB+:12476:vC34M2O35S0:S36.0E:27500:340=2:432=rus@4,433=eng@4:0:500:20621:112:6:0 +HD Спорт;HTB+:12073:hC34M5O35S1:S36.0E:27500:322=27:0;402=rus@106:0:500,5601:12102:112:12:0 +Viasat Sport;HTB+:11996:hC34M5O35S1:S36.0E:27500:208=27:308=rus@4,408=eng@4:0:500:19108:112:19:0 +НТВ-ПЛЮС Баскетбол;HTB+:12437:vC34M2O35S0:S36.0E:27500:322=2:402=rus@4:0:500:10402:112:4:0 +НТВ-ПЛЮС СПОРТ ПЛЮС;HTB+:12437:vC34M2O35S0:S36.0E:27500:331=2:411=rus@4:0:500:10411:112:4:0 +НТВ-ПЛЮС СПОРТ-ОНЛАЙН;HTB+:12399:vC34M2O35S0:S36.0E:27500:334=2:424=rus@4:0:500,5601:10316:112:3:0 +НТВ-ПЛЮС СПОРТ;HTB+:12322:vC34M2O35S0:S36.0E:27500:320=2:400=rus@4:0:5601,500:10101:112:1:0 +НТВ-ПЛЮС Спорт Союз;HTB+:12437:vC34M2O35S0:S36.0E:27500:325=2:405=rus@4:0:500:10405:112:4:0 +НТВ-ПЛЮС Теннис;HTB+:12437:vC34M2O35S0:S36.0E:27500:321=2:401=rus@4:0:500:10401:112:4:0 +Россия 2;HTB+:12437:vC34M2O35S0:S36.0E:27500:328=2:408=rus@4:0:500:10408:112:4:0 +СПОРТ;HTB+:12092:vC34M2O35S0:S36.0E:27500:304=2:404=rus@4:0:500:21104:112:21:0 +Спорт 1 HD;HTB+:12130:vC34M5O35S1:S36.0E:27500:303=27:403=rus@4:0:500,5601:20103:112:20:0 +Спорт 1;HTB+:12092:vC34M2O35S0:S36.0E:27500:303=2:403=rus@4:0:500:21103:112:21:0 +СпортХит HD;HTB+:11938:vC34M5O35S1:S36.0E:27500:301=27:401=rus@4:0:500:17101:112:17:0 +СпортХит;HTB+:11785:vC34M2O35S0:S36.0E:27500:324=2:404=rus@4:0:500,5601:13104:112:13:0 +Телеканал КХЛ;HTB+:11785:vC34M2O35S0:S36.0E:27500:321=2:401=rus@4:0:5601,500:13101:112:13:0 + +:Кино +Кинорейс 1;HTB+:12341:hC34M2O35S0:S36.0E:27500:326=2:406=rus@4;426=rus@106:0:500,5601:11106:112:11:0 +Кинорейс 2;HTB+:12341:hC34M2O35S0:S36.0E:27500:327=2:407=rus@4;427=rus@106:0:5601,500:11107:112:11:0 +Кинорейс 3;HTB+:12341:hC34M2O35S0:S36.0E:27500:330=2:410=rus@4;430=rus@106:0:5601,500:11110:112:11:0 +Кинорейс 4;HTB+:12265:hC34M2O35S0:S36.0E:27500:321=2:401=rus@4;421=rus@106:0:500,5601:31001:112:10:0 +Кинорейс 5;HTB+:11977:vC34M2O35S0:S36.0E:27500:321=2:401=rus@4;421=rus@106:0:500:18101:112:18:0 +Экран 1. Кинозалы;TricolorTV:11843:hC34M5O35S1:S36.0E:27500:51=27:52=rus@4:0:4AE1,2710:26901:65535:7:0 +Экран 2. Кинозалы;TricolorTV:11843:hC34M5O35S1:S36.0E:27500:101=27:102=rus@4:0:4AE1,2710:26902:65535:7:0 +Экран 3. Кинозалы;TricolorTV:11843:hC34M5O35S1:S36.0E:27500:151=27:152=rus@4:0:4AE1,2710:26903:65535:7:0 +Экран 4. Кинозалы;TricolorTV:11843:hC34M5O35S1:S36.0E:27500:201=27:202=rus@4:0:4AE1,2710:26904:65535:7:0 +Экран 5. Кинозалы;TricolorTV:11843:hC34M5O35S1:S36.0E:27500:251=27:252=rus@4:0:4AE1,2710:26905:65535:7:0 +Экран 6. Кинозалы;TricolorTV:11843:hC34M5O35S1:S36.0E:27500:301=27:302=rus@4:0:4AE1,2710:26906:65535:7:0 +Экран 7. Кинозалы;TricolorTV:11843:hC34M5O35S1:S36.0E:27500:351=27:352=rus@4:0:4AE1,2710:26907:65535:7:0 +Экран 8. Кинозалы;TricolorTV:11843:hC34M5O35S1:S36.0E:27500:401=27:402=rus@4:0:4AE1,2710:26908:65535:7:0 +Экран 9. Кинозалы;TricolorTV:11843:hC34M5O35S1:S36.0E:27500:451=27:452=rus@4:0:4AE1,2710:26909:65535:7:0 +Экран 10. Кинозалы;TricolorTV:11843:hC34M5O35S1:S36.0E:27500:501=27:502=rus@4:0:4AE1,2710:26910:65535:7:0 +Экран 11. Кинозалы;TricolorTV:11843:hC34M5O35S1:S36.0E:27500:551=27:552=rus@4:0:4AE1,2710:26911:65535:7:0 +Экран 12. Кинозалы;TricolorTV:11843:hC34M5O35S1:S36.0E:27500:601=27:602=rus@4:0:4AE1,2710:26912:65535:7:0 +Экран 13. Кинозалы;TricolorTV:11843:hC34M5O35S1:S36.0E:27500:651=27:652=rus@4:0:4AE1,2710:26913:65535:7:0 +Экран 14. Кинозалы;TricolorTV:11843:hC34M5O35S1:S36.0E:27500:701=27:702=rus@4:0:4AE1,2710:26914:65535:7:0 +Экран 15. Кинозалы;TricolorTV:11843:hC34M5O35S1:S36.0E:27500:751=27:752=rus@4:0:4AE1,2710:26915:65535:7:0 +Экран 16. Кинозалы;TricolorTV:11843:hC34M5O35S1:S36.0E:27500:801=27:802=rus@4:0:4AE1,2710:26916:65535:7:0 +Экран 17. Кинозалы;TricolorTV:11843:hC34M5O35S1:S36.0E:27500:851=27:852=rus@4:0:4AE1,2710:26917:65535:7:0 +Экран 18. Кинозалы;TricolorTV:11843:hC34M5O35S1:S36.0E:27500:901=27:902=rus@4:0:4AE1,2710:26918:65535:7:0 +Экран 19. Кинозалы;TricolorTV:11843:hC34M5O35S1:S36.0E:27500:951=27:952=rus@4:0:4AE1,2710:26919:65535:7:0 +Экран 20. Кинозалы;TricolorTV:11843:hC34M5O35S1:S36.0E:27500:1001=27:1002=rus@4:0:4AE1,2710:26920:65535:7:0 +Экран 21. Кинозалы;TricolorTV:11843:hC34M5O35S1:S36.0E:27500:1051=27:1052=rus@4:0:4AE1,2710:26921:65535:7:0 +Экран 22. Кинозалы;TricolorTV:11843:hC34M5O35S1:S36.0E:27500:1101=27:1102=rus@4:0:4AE1,2710:26922:65535:7:0 +Экран 23. Кинозалы;TricolorTV:11843:hC34M5O35S1:S36.0E:27500:1151=27:1152=rus@4:0:4AE1,2710:26923:65535:7:0 +Экран 24. Кинозалы;TricolorTV:11843:hC34M5O35S1:S36.0E:27500:1201=27:1202=rus@4:0:4AE1,2710:26924:65535:7:0 +AMEDIA 2;HTB+:12015:vC34M2O35S0:S36.0E:27500:305=2:405=rus@4:0:5601,500:22105:112:22:0 +AMEDIA;HTB+:12015:vC34M2O35S0:S36.0E:27500:304=2:404=rus@4:0:500,5601:22104:112:22:0 +Amedia Premium HD;HTB+:12207:vC34M5O35S1:S36.0E:27500:303=2:423=eng@4;403=eng@106:0:500:26003:112:9:0 +Amedia Premium;HTB+:12015:vC34M2O35S0:S36.0E:27500:306=2:406=rus@4:0:500,5601:22106:112:22:0 +CBS Drama;HTB+:12456:hC34M2O35S0:S36.0E:27500:330=2:414=rus@4:0:500,5601:20511:112:5:0 +DIVA Universal;HTB+:12341:hC34M2O35S0:S36.0E:27500:324=2:404=rus@4,424=eng@4:0:500,5601:11104:112:11:0 +FOX;HTB+:12284:vC34M2O35S0:S36.0E:27500:338=2:408=rus@4,418=eng@4:0:500:10809:112:8:0 +Fox Life;HTB+:12284:vC34M2O35S0:S36.0E:27500:342=2:412=rus@4,422=eng@4:0:500:10813:112:8:0 +HD Кино 2;HTB+:12130:vC34M5O35S1:S36.0E:27500:302=27:0;402=rus@106:0:5601,500:20102:112:20:0 +HD Кино;HTB+:12073:hC34M5O35S1:S36.0E:27500:321=27:0;401=rus@106:0:500,5601:12101:112:12:0 +MGM Channel;HTB+:12476:vC34M2O35S0:S36.0E:27500:336=2:424=rus@4,425=eng@4:0:500:20617:112:6:0 +MGM HD;HTB+:12130:vC34M5O35S1:S36.0E:27500:304=27:404=rus@4,414=eng@4:0:500,5601:20104:112:20:0 +SONY ТВ;HTB+:11785:vC34M2O35S0:S36.0E:27500:322=2:402=rus@4,415=eng@4:0:500,5601:13102:112:13:0 +TB 1000 Русское кино;HTB+:11996:hC34M5O35S1:S36.0E:27500:204=27:304=rus@4:0:500:19104:112:19:0 +TV 1000 Action;HTB+:11996:hC34M5O35S1:S36.0E:27500:203=27:303=rus@4,403=eng@4:0:500:19103:112:19:0 +TV 1000;HTB+:11996:hC34M5O35S1:S36.0E:27500:202=27:302=rus@4,402=eng@4:0:500:19102:112:19:0 +TВ-21М;HTB+:12284:vC34M2O35S0:S36.0E:27500:336=2:406=rus@4:0:500:10807:112:8:0 +Universal Channel;HTB+:12341:hC34M2O35S0:S36.0E:27500:325=2:405=rus@4,425=eng@4:0:500,5601:11105:112:11:0 +Дом Кино;HTB+:11862:vC34M2O35S0:S36.0E:27500:323=2:403=rus@4:0:5601,500:15103:112:15:0 +ЕвроКино;HTB+:12284:vC34M2O35S0:S36.0E:27500:335=2:405=rus@4:0:500:10806:112:8:0 +Иллюзион+;HTB+:12284:vC34M2O35S0:S36.0E:27500:332=2:402=rus@4:0:500:10803:112:8:0 +Индия ТВ;HTB+:12380:hC34M2O35S0:S36.0E:27500:323=2:406=rus@4:0:500,5601:10204:112:2:0 +Кинопоказ HD-1;TricolorTV:11766:hC34M5O35S1:S36.0E:27500:3021=27:3022=rus@4;3023=rus@106:0:4AE1,2710:3002:65535:203:0 +Кинопоказ HD-2;TricolorTV:11766:hC34M5O35S1:S36.0E:27500:3031=27:3032=rus@4;3033=rus@106:0:4AE1,2710:3003:65535:203:0 +Кинопоказ;TricolorTV:12111:hC34M5O35S1:S36.0E:27500:1321=27:1322=rus@4:0:4AE1,2710:2109:65535:21:0 +Комедия ТВ;HTB+:12380:hC34M2O35S0:S36.0E:27500:322=2:404=rus@4:0:500,5601:10203:112:2:0 +МНОГОсерийное ТВ;HTB+:12380:hC34M2O35S0:S36.0E:27500:326=2:412=rus@4:0:500,5601:10207:112:2:0 +НТВ-ПЛЮС КИНО ПЛЮС;HTB+:12322:vC34M2O35S0:S36.0E:27500:331=2:420=rus@4;450=rus@106:0:5601,500:10110:112:1:0 +НТВ-ПЛЮС КИНОКЛУБ;HTB+:12322:vC34M2O35S0:S36.0E:27500:323=2:407=rus@4;437=rus@106:0:5601,500:10104:112:1:0 +НТВ-ПЛЮС КИНОЛЮКС;HTB+:11785:vC34M2O35S0:S36.0E:27500:323=2:403=rus@4;423=rus@106:0:5601,500:13103:112:13:0 +НТВ-ПЛЮС КИНОСОЮЗ;HTB+:12399:vC34M2O35S0:S36.0E:27500:332=2:422=rus@4:0:500,5601:10314:112:3:0 +НТВ-ПЛЮС КИНОХИТ;HTB+:11900:vC34M2O35S0:S36.0E:27500:332=2:412=rus@4;432=rus@106:0:500:16112:112:16:0 +НТВ-ПЛЮС НАШЕ КИНО;HTB+:12322:vC34M2O35S0:S36.0E:27500:324=2:408=rus@4:0:500,5601:10105:112:1:0 +НТВ-ПЛЮС ПРЕМЬЕРА;HTB+:12322:vC34M2O35S0:S36.0E:27500:322=2:405=rus@4;435=rus@106:0:500,5601:10103:112:1:0 +Наше новое кино;HTB+:11900:vC34M2O35S0:S36.0E:27500:333=2:413=rus@4:0:500:16113:112:16:0 +Русский Иллюзион;HTB+:12284:vC34M2O35S0:S36.0E:27500:331=2:401=rus@4:0:500:10802:112:8:0 +Эгоист ТВ;HTB+:11785:vC34M2O35S0:S36.0E:27500:331=2:411=rus@4:0:5601,500:13111:112:13:0 + +:Новостные +5 канал (Украина);HTB+:11996:hC34M5O35S1:S36.0E:27500:212=27:312=ukr@4:0:500,5601:19112:112:19:0 +BBC World News;HTB+:12245:vC34M2O35S0:S36.0E:27500:331=2:416=eng@4:0:500:20712:112:7:0 +Bloomberg Television;HTB+:12245:vC34M2O35S0:S36.0E:27500:323=2:406=eng@4:0:500:20704:112:7:0 +CNN International;HTB+:12476:vC34M2O35S0:S36.0E:27500:332=2:418=eng@4:0:500:20613:112:6:0 +Euronews;HTB+:11996:hC34M5O35S1:S36.0E:27500:214=27:114=ukr@4,314=rus@4,414=eng@4,514=deu@4,614=fra@4,714=ita@4,914=esl@4:0:500,5601:19114:112:19:0 +FRANCE 24;HTB+:12245:vC34M2O35S0:S36.0E:27500:334=2:422=eng@4:0:500:20715:112:7:0 +Дождь;HTB+:11785:vC34M2O35S0:S36.0E:27500:330=2:410=rus@4:0:500,5601:13110:112:13:0 +Комсомольская правда;HTB+:11977:vC34M2O35S0:S36.0E:27500:331=2:411=rus@4:0:500:18111:112:18:0 +Москва 24;HTB+:11785:vC34M2O35S0:S36.0E:27500:325=2:405=rus@4:0:500,5601:13105:112:13:0 +Первый МЕТЕО;HTB+:12265:hC34M2O35S0:S36.0E:27500:329=2:409=rus@4:0:500,5601:31009:112:10:0 +Подмосковье;HTB+:11977:vC34M2O35S0:S36.0E:27500:329=2:409=rus@4:0:500:18109:112:18:0 +РБК-ТВ;HTB+:12265:hC34M2O35S0:S36.0E:27500:334=2:414=rus@4:0:500,5601:31014:112:10:0 +Россия 24;HTB+:12399:vC34M2O35S0:S36.0E:27500:326=2:412=rus@4:0:500,5601:10307:112:3:0 + +:Детские +Cartoon Network;HTB+:12476:vC34M2O35S0:S36.0E:27500:333=2:420=eng@4,421=rus@4:0:500:20614:112:6:0 +Gulli;HTB+:12341:hC34M2O35S0:S36.0E:27500:332=2:412=rus@4:0:5601,500:11112:112:11:0 +JimJam;HTB+:12476:vC34M2O35S0:S36.0E:27500:342=2:436=rus@4,437=eng@4:0:500:20623:112:6:0 +Karusel int;HTB+:11862:vC34M2O35S0:S36.0E:27500:326=2:406=rus@4:0:500,5601:15106:112:15:0 +Nickelodeon HD;HTB+:11823:vC34M5O35S1:S36.0E:27500:326=27:0;406=rus@106,416=eng@106:0:500,5601:14106:112:14:0 +Nickelodeon;HTB+:12245:vC34M2O35S0:S36.0E:27500:325=2:409=rus@4,419=eng@4:0:500:20706:112:7:0 +TiJi;HTB+:12341:hC34M2O35S0:S36.0E:27500:331=2:411=rus@4:0:500,5601:11111:112:11:0 +Детский мир/Телеклуб;HTB+:12245:vC34M2O35S0:S36.0E:27500:333=2:420=rus@4:0:500:20714:112:7:0 +Канал Disney;HTB+:11785:vC34M2O35S0:S36.0E:27500:328=2:408=rus@4:0:5601,500:13108:112:13:0 +Карусель;HTB+:11862:vC34M2O35S0:S36.0E:27500:325=2:405=rus@4:576:500,5601:15105:112:15:0 +Мультимания;TricolorTV:11727:hC34M5O35S1:S36.0E:27500:151=27:152=rus@4:0:4AE1,2710:2603:65535:1:0 +Радость моя;TricolorTV:11804:hC34M5O35S1:S36.0E:27500:1601=27:1602=rus@4:0:4AE1,2710:332:65535:5:0 + +:~HTB+~ +2X2;HTB+:12092:vC34M2O35S0:S36.0E:27500:310=2:410=rus@4:0:500:21110:112:21:0 +8;HTB+:12015:vC34M2O35S0:S36.0E:27500:301=2:401=rus@4:0:0:22101:112:22:0 +24Док;HTB+:11900:vC34M2O35S0:S36.0E:27500:324=2:404=rus@4:0:500,5601:16104:112:16:0 +365 дней ТВ;HTB+:12380:hC34M2O35S0:S36.0E:27500:320=2:400=rus@4:0:500,5601:10201:112:2:0 +Amazing Life;HTB+:11996:hC34M5O35S1:S36.0E:27500:221=27:321=rus@4:0:500,5601:19121:112:19:0 +Animal Planet HD;HTB+:11823:vC34M5O35S1:S36.0E:27500:324=27:0;404=rus@106,414=eng@106:0:500,5601:14104:112:14:0 +Animal Planet;HTB+:12456:hC34M2O35S0:S36.0E:27500:323=2:406=rus@4,407=eng@4:0:500,5601:20504:112:5:0 +BRIDGE TV;HTB+:11977:vC34M2O35S0:S36.0E:27500:327=2:407=rus@4:0:500:18107:112:18:0 +CBS Reality;HTB+:12476:vC34M2O35S0:S36.0E:27500:338=2:428=rus@4,429=eng@4:0:500:20619:112:6:0 +CCTV4;HTB+:12284:vC34M2O35S0:S36.0E:27500:333=2:403=chi@4:0:500:10804:112:8:0 +CCTV-News;HTB+:12284:vC34M2O35S0:S36.0E:27500:334=2:404=eng@4:0:500:10805:112:8:0 +CCTV-Русский;HTB+:11862:vC34M2O35S0:S36.0E:27500:321=2:401=rus@4:0:500,5601:15101:112:15:0 +Comedy TV;HTB+:12341:hC34M2O35S0:S36.0E:27500:321=2:401=rus@4:0:500,5601:11101:112:11:0 +Discovery Channel;HTB+:12456:hC34M2O35S0:S36.0E:27500:320=2:400=rus@4,401=eng@4:0:500,5601:20501:112:5:0 +Discovery HD Showcase;HTB+:12073:hC34M5O35S1:S36.0E:27500:325=27:0;405=rus@106,425=eng@106:0:500,5601:12105:112:12:0 +Discovery Science;HTB+:12476:vC34M2O35S0:S36.0E:27500:335=2:423=rus@4,443=eng@4:0:500:20616:112:6:0 +Discovery World;HTB+:12476:vC34M2O35S0:S36.0E:27500:334=2:422=rus@4,442=eng@4:0:500:20615:112:6:0 +HD Life;HTB+:12073:hC34M5O35S1:S36.0E:27500:323=27:403=rus@4:0:500,5601:12103:112:12:0 +HTH;HTB+:11996:hC34M5O35S1:S36.0E:27500:213=27:313=ukr@4:0:500,5601:19113:112:19:0 +History HD;HTB+:12207:vC34M5O35S1:S36.0E:27500:304=2:404=rus@4,424=eng@4:0:500:26004:112:9:0 +History;HTB+:12015:vC34M2O35S0:S36.0E:27500:308=2:408=rus@4,428=eng@4:0:500,5601:22108:112:22:0 +Hustler TV;HTB+:12322:vC34M2O35S0:S36.0E:27500:326=2:412=eng@4:0:500,5601:10125:112:1:0 +Investigation Discovery;HTB+:12476:vC34M2O35S0:S36.0E:27500:330=2:414=rus@4,415=eng@4:0:500:20611:112:6:0 +KidsCo;HTB+:12456:hC34M2O35S0:S36.0E:27500:328=2:413=rus@4,423=eng@4:0:500,5601:20509:112:5:0 +MCM Top;HTB+:12476:vC34M2O35S0:S36.0E:27500:339=2:430=fra@4:0:500:20620:112:6:0 +MTV Dance;HTB+:12476:vC34M2O35S0:S36.0E:27500:337=2:426=eng@4:0:500:20618:112:6:0 +MTV Hits;HTB+:11862:vC34M2O35S0:S36.0E:27500:322=2:402=eng@4:0:500,5601:15102:112:15:0 +MTV Live HD;HTB+:12073:hC34M5O35S1:S36.0E:27500:326=27:0;406=eng@106:0:500,5601:12106:112:12:0 +MTV Rocks;HTB+:12284:vC34M2O35S0:S36.0E:27500:341=2:411=eng@4:0:500:10812:112:8:0 +MTV;HTB+:12456:hC34M2O35S0:S36.0E:27500:321=2:402=rus@4:0:5601,500:20502:112:5:0 +Mezzo Live HD;HTB+:11823:vC34M5O35S1:S36.0E:27500:323=27:403=fra@4:0:5601,500:14103:112:14:0 +Mezzo;HTB+:12456:hC34M2O35S0:S36.0E:27500:341=2:431=fra@4:0:500,5601:20508:112:5:0 +NHK WORLD TV;HTB+:12092:vC34M2O35S0:S36.0E:27500:311=2:411=@4:0:500:21111:112:21:0 +National Geographic HD;HTB+:12207:vC34M5O35S1:S36.0E:27500:302=2:422=@4;422=@106:0:500:26002:112:9:0 +National Geographic;HTB+:12456:hC34M2O35S0:S36.0E:27500:329=2:420=rus@4,421=eng@4:0:5601,500:20514:112:5:0 +Nat Geo Wild HD;HTB+:11823:vC34M5O35S1:S36.0E:27500:321=27:401=rus@4,451=eng@4:0:500,5601:14101:112:14:0 +Nat Geo Wild;HTB+:12456:hC34M2O35S0:S36.0E:27500:331=2:416=rus@4,417=eng@4:0:500,5601:20512:112:5:0 +Nick Jr.;HTB+:12456:hC34M2O35S0:S36.0E:27500:322=2:404=rus@4,405=eng@4:0:5601,500:20503:112:5:0 +OCEAN-TV;HTB+:11996:hC34M5O35S1:S36.0E:27500:222=27:322=rus@4:0:5601,500:19122:112:19:0 +Outdoor Channel;HTB+:11977:vC34M2O35S0:S36.0E:27500:326=2:406=rus@4,426=eng@4:0:500:18106:112:18:0 +Paramount Comedy;HTB+:11862:vC34M2O35S0:S36.0E:27500:330=2:410=rus@4:0:500,5601:15110:112:15:0 +Playboy TV;HTB+:11785:vC34M2O35S0:S36.0E:27500:332=2:412=eng@4:0:5601,500:13112:112:13:0 +RTG TV;HTB+:11977:vC34M2O35S0:S36.0E:27500:322=2:402=rus@4:0:500:18102:112:18:0 +RT (английский);HTB+:11900:vC34M2O35S0:S36.0E:27500:326=2:406=eng@4:0:500,5601:16106:112:16:0 +RT (арабский);HTB+:11996:hC34M5O35S1:S36.0E:27500:215=27:315=ara@4:0:5601,500:19115:112:19:0 +RT (испанский);HTB+:11996:hC34M5O35S1:S36.0E:27500:216=27:316=esl@4:0:5601,500:19116:112:19:0 +RTД;HTB+:11977:vC34M2O35S0:S36.0E:27500:330=2:410=eng@4:0:500:18110:112:18:0 +RUSONG TV;HTB+:11977:vC34M2O35S0:S36.0E:27500:328=2:408=rus@4:0:500:18108:112:18:0 +RU.TV;HTB+:12341:hC34M2O35S0:S36.0E:27500:329=2:409=rus@4:0:500,5601:11109:112:11:0 +Relax FM;HTB+:12399:vC34M2O35S0:S36.0E:27500:0:427=rus@4:0:0:10327:112:3:0 +Russian extreme TV;HTB+:12437:vC34M2O35S0:S36.0E:27500:326=2:406=rus@4:0:500:10406:112:4:0 +STV;HTB+:12245:vC34M2O35S0:S36.0E:27500:324=2:408=rus@4:0:500:20705:112:7:0 +TEST VIRTUAL;HTB+:12437:vC34M2O35S0:S36.0E:27500:324=2:404=rus@4:0:500:10454:112:4:0 +TLC HD;HTB+:12207:vC34M5O35S1:S36.0E:27500:305=2:425=@4;425=@106:0:500:26005:112:9:0 +TLC;HTB+:12456:hC34M2O35S0:S36.0E:27500:324=2:408=rus@4,409=eng@4:0:5601,500:20505:112:5:0 +TV5 Monde;HTB+:12245:vC34M2O35S0:S36.0E:27500:329=2:402=@4:0:500:20702:112:7:0 +Travel Channel HD;HTB+:12207:vC34M5O35S1:S36.0E:27500:306=2:406=rus@4,426=eng@4:0:500:26006:112:9:0 +Travel Channel;HTB+:12092:vC34M2O35S0:S36.0E:27500:302=2:402=rus@4,422=eng@4:0:500:21102:112:21:0 +VH1 Classic;HTB+:12476:vC34M2O35S0:S36.0E:27500:331=2:416=eng@4:0:500:20612:112:6:0 +VH1 European;HTB+:12456:hC34M2O35S0:S36.0E:27500:326=2:412=eng@4:0:500,5601:20507:112:5:0 +Viasat Explorer;HTB+:11996:hC34M5O35S1:S36.0E:27500:205=27:305=rus@4,405=eng@4:0:500:19105:112:19:0 +Viasat Golf Test;HTB+:12245:vC34M2O35S0:S36.0E:27500:7330=2:7430=eng@4:0:500:20710:112:7:0 +Viasat History;HTB+:11996:hC34M5O35S1:S36.0E:27500:206=27:306=rus@4,406=eng@4:0:500:19106:112:19:0 +Viasat Nature;HTB+:11996:hC34M5O35S1:S36.0E:27500:207=27:307=rus@4,407=eng@4:0:500:19107:112:19:0 +World Fashion;HTB+:11785:vC34M2O35S0:S36.0E:27500:329=2:409=rus@4:0:500,5601:13109:112:13:0 +АРМЕНИЯ ТВ;HTB+:11996:hC34M5O35S1:S36.0E:27500:217=27:317=Arm@4:0:5601,500:19117:112:19:0 +Авто Плюс;HTB+:12380:hC34M2O35S0:S36.0E:27500:332=2:422=rus@4:0:500,5601:10212:112:2:0 +Боец;HTB+:12380:hC34M2O35S0:S36.0E:27500:331=2:420=kur@4:0:500,5601:10211:112:2:0 +Бойцовский клуб;HTB+:12092:vC34M2O35S0:S36.0E:27500:305=2:405=rus@4:0:500:21105:112:21:0 +Время далекое и близкое;HTB+:12284:vC34M2O35S0:S36.0E:27500:340=2:410=rus@4:0:500:10811:112:8:0 +ДОМАШНИЕ ЖИВОТНЫЕ;HTB+:11862:vC34M2O35S0:S36.0E:27500:332=2:412=rus@4:0:5601,500:15112:112:15:0 +Девятый канал ОРБИТА;HTB+:12015:vC34M2O35S0:S36.0E:27500:302=2:402=rus@4:0:500,5601:22102:112:22:0 +Детское радио;HTB+:11900:vC34M2O35S0:S36.0E:27500:0:481=@4:0:0:16181:112:16:0 +Европа Плюс ТВ;HTB+:12380:hC34M2O35S0:S36.0E:27500:321=2:402=rus@4:0:500,5601:10202:112:2:0 +ЖИВИ!;HTB+:11862:vC34M2O35S0:S36.0E:27500:335=2:415=rus@4:0:500,5601:15115:112:15:0 +Загородная жизнь;HTB+:12092:vC34M2O35S0:S36.0E:27500:308=2:408=rus@4:0:500:21108:112:21:0 +Закон-ТВ;HTB+:11900:vC34M2O35S0:S36.0E:27500:322=2:402=rus@4,422=eng@4:0:500,5601:16102:112:16:0 +Интересное ТВ;HTB+:12380:hC34M2O35S0:S36.0E:27500:330=2:414=rus@4:0:5601,500:10208:112:2:0 +Инфоканал;HTB+:11900:vC34M2O35S0:S36.0E:27500:321=2:401=rus@4:0:0:16101:112:16:0 +История;HTB+:12265:hC34M2O35S0:S36.0E:27500:322=2:402=rus@4:0:500,5601:31002:112:10:0 +Кто есть кто;HTB+:12322:vC34M2O35S0:S36.0E:27500:330=2:418=rus@4:0:500,5601:10109:112:1:0 +Кухня ТВ;HTB+:12380:hC34M2O35S0:S36.0E:27500:328=2:416=rus@4:0:5601,500:10209:112:2:0 +ЛИДЕР ТВ - РФ;HTB+:11996:hC34M5O35S1:S36.0E:27500:209=27:309=Aze@4:0:500,5601:19109:112:19:0 +Ля-минор ТВ;HTB+:12380:hC34M2O35S0:S36.0E:27500:325=2:410=rus@4:0:5601,500:10206:112:2:0 +МИР 24;HTB+:12265:hC34M2O35S0:S36.0E:27500:324=2:404=rus@4:0:5601,500:31004:112:10:0 +МУЗ;HTB+:12015:vC34M2O35S0:S36.0E:27500:307=2:407=rus@4:0:500,5601:22107:112:22:0 +Мир;HTB+:12265:hC34M2O35S0:S36.0E:27500:328=2:408=rus@4:0:500,5601:31008:112:10:0 +Моя Планета;HTB+:11977:vC34M2O35S0:S36.0E:27500:324=2:404=rus@4:0:500:18104:112:18:0 +Мужской;HTB+:12092:vC34M2O35S0:S36.0E:27500:307=2:407=rus@4:0:500:21107:112:21:0 +Музыка Первого;HTB+:11862:vC34M2O35S0:S36.0E:27500:324=2:404=rus@4:0:500,5601:15104:112:15:0 +НТВ-Мир;HTB+:12245:vC34M2O35S0:S36.0E:27500:326=2:412=rus@4,413=nol@4:0:500:20707:112:7:0 +НТВ-ПЛЮС 3D;HTB+:11823:vC34M5O35S1:S36.0E:27500:322=27:0;402=rus@106:0:500,5601:14102:112:14:0 +НЮ АРТ ТВ;HTB+:12015:vC34M2O35S0:S36.0E:27500:303=2:403=rus@4:0:500,5601:22103:112:22:0 +Наука 2.0;HTB+:11977:vC34M2O35S0:S36.0E:27500:325=2:405=rus@4:0:500:18105:112:18:0 +Ностальгия;HTB+:12437:vC34M2O35S0:S36.0E:27500:330=2:410=rus@4:0:500:10410:112:4:0 +Охота и рыбалка;HTB+:11862:vC34M2O35S0:S36.0E:27500:333=2:413=rus@4:0:500,5601:15113:112:15:0 +ПРОСВЕЩЕНИЕ;HTB+:11996:hC34M5O35S1:S36.0E:27500:219=27:319=rus@4:0:5601,500:19119:112:19:0 +ПСИХОЛОГИЯ21;HTB+:11862:vC34M2O35S0:S36.0E:27500:334=2:414=@4:0:500,5601:15114:112:15:0 +ПЯТНИЦА;HTB+:12399:vC34M2O35S0:S36.0E:27500:322=2:404=rus@4:0:500,5601:10303:112:3:0 +Парк развлечений;HTB+:11996:hC34M5O35S1:S36.0E:27500:210=27:310=rus@4:0:500,5601:19110:112:19:0 +Первый канал. Всемирная сеть;HTB+:12284:vC34M2O35S0:S36.0E:27500:339=2:409=rus@4:0:500:10810:112:8:0 +Первый образовательный;HTB+:11996:hC34M5O35S1:S36.0E:27500:211=27:311=rus@4:0:500,5601:19111:112:19:0 +РТР-Планета;HTB+:12284:vC34M2O35S0:S36.0E:27500:330=2:400=rus@4,430=nol@4:0:500:10801:112:8:0 +Радио Зенит;HTB+:12265:hC34M2O35S0:S36.0E:27500:0:422=rus@4:0:0:31102:112:10:0 +Русская ночь;HTB+:12380:hC34M2O35S0:S36.0E:27500:324=2:408=rus@4:0:500,5601:10205:112:2:0 +СПАС;HTB+:11900:vC34M2O35S0:S36.0E:27500:323=2:403=rus@4:0:500,5601:16103:112:16:0 +Совершенно секретно;HTB+:12341:hC34M2O35S0:S36.0E:27500:328=2:408=rus@4:0:5601,500:11108:112:11:0 +ТВ СЭЙЛ;HTB+:12265:hC34M2O35S0:S36.0E:27500:335=2:415=rus@4:0:0:31015:112:10:0 +ТДК;HTB+:11862:vC34M2O35S0:S36.0E:27500:331=2:411=rus@3:0:500,5601:15111:112:15:0 +ТЕЛЕКАФЕ;HTB+:11785:vC34M2O35S0:S36.0E:27500:326=2:406=rus@4:0:500,5601:13106:112:13:0 +ТНВ-Планета;HTB+:11900:vC34M2O35S0:S36.0E:27500:331=2:411=rus@4:0:500,5601:16111:112:16:0 +Телеканал Да Винчи;HTB+:11996:hC34M5O35S1:S36.0E:27500:201=27:301=rus@4:0:500:19101:112:19:0 +Успех;HTB+:12092:vC34M2O35S0:S36.0E:27500:306=2:406=rus@4:0:500:21106:112:21:0 +Эхо Москвы;HTB+:12399:vC34M2O35S0:S36.0E:27500:0:428=rus@4:0:0:10328:112:3:0 +Ю-ТВ;HTB+:12437:vC34M2O35S0:S36.0E:27500:327=2:407=rus@4:0:500:10407:112:4:0 + +:~Триколор~ +2x2;TricolorTV:12149:hC34M5O35S1:S36.0E:27500:1251=27:1252=rus@4:0:4AE1,2710:23270:65535:23:0 +8 канал;TricolorTV:11727:hC34M5O35S1:S36.0E:27500:1961=27:1962=rus@4:0:4AE1,2710:2626:65535:1:0 +9 Волна;TricolorTV:11804:hC34M5O35S1:S36.0E:27500:501=27:502=rus@4:0:4AE1,2710:310:65535:5:0 +9 Орбита;TricolorTV:12149:hC34M5O35S1:S36.0E:27500:801=27:802=rus@4:0:4AE1,2710:23080:65535:23:0 +365 дней;TricolorTV:12190:hC34M2O35S0:S36.0E:20000:251=2:252=rus@4:0:4AE1,2710,4AE0:25000:65535:25:0 +Animal Planet HD;TricolorTV:11919:hC34M5O35S1:S36.0E:27500:2121=27:2122=rus@4:0:4AE1,2710:21002:65535:11:0 +A-One;TricolorTV:11727:hC34M5O35S1:S36.0E:27500:956=27:957=rus@4:0:4AE1,2710:2623:65535:1:0 +BRIDGE TV;TricolorTV:12303:hC34M2O35S0:S36.0E:27500:308=2:256=rus@4:0:4AE1,2710,4AE0:59:112:310:0 +Baby TV;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:2401=2:2402=eng@4:0:4AE1,2710:18060:65535:18:0 +Boomerang;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:2351=2:2352=rus@4:0:4AE1,2710:18055:65535:18:0 +Cartoon Network;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:2341=2:2342=rus@4:0:4AE1,2710:18054:65535:18:0 +Comedy TV;TricolorTV:11881:hC34M2O35S0:S36.0E:27500:251=2:252=rus@4:0:4AE1,2710,4AE0:905:65535:9:0 +DANGE TV;TricolorTV:11727:hC34M5O35S1:S36.0E:27500:906=27:907=rus@4:0:4AE1,2710:3418:65535:1:0 +DFM;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:1891=rus@4:0:4AE1,2710:18009:65535:18:0 +Deutsche Welle;TricolorTV:12149:hC34M5O35S1:S36.0E:27500:201=27:202=rus@4:0:4AE1,2710:23040:65535:23:0 +Discovery HD Showcase;TricolorTV:11919:hC34M5O35S1:S36.0E:27500:2111=27:2112=rus@4:0:4AE1,2710:21001:65535:11:0 +Disney;TricolorTV:11727:hC34M5O35S1:S36.0E:27500:2801=27:2802=rus@4:0:4AE1,2710:2628:65535:1:0 +Euronews;TricolorTV:12149:hC34M5O35S1:S36.0E:27500:751=27:752=rus@4:0:4AE1,2710:23150:65535:23:0 +Europa Plus TV;TricolorTV:11727:hC34M5O35S1:S36.0E:27500:1451=27:1452=rus@4:0:4AE1,2710:2624:65535:1:0 +FOX HD;TricolorTV:11958:hC34M5O35S1:S36.0E:27500:1351=27:1352=rus@4:0:4AE1,2710:13005:65535:213:0 +FOX;TricolorTV:12149:hC34M5O35S1:S36.0E:27500:651=27:652=rus@4:0:4AE1,2710:23130:65535:23:0 +Fashion One HD;TricolorTV:12034:hC34M5O35S1:S36.0E:27500:1751=27:1752=eng@4:0:4AE1,2710:17005:65535:217:0 +Fox Life HD;TricolorTV:11958:hC34M5O35S1:S36.0E:27500:1321=27:1322=rus@4:0:4AE1,2710:13002:65535:213:0 +Fox Life;TricolorTV:12149:hC34M5O35S1:S36.0E:27500:101=27:102=rus@4:0:4AE1,2710:23020:65535:23:0 +France 24;TricolorTV:12149:hC34M5O35S1:S36.0E:27500:151=27:152=rus@4:0:4AE1,2710:23030:65535:23:0 +Gulli;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:2381=2:2382=rus@4:0:4AE1,2710:18058:65535:18:0 +HD Life;TricolorTV:11766:hC34M5O35S1:S36.0E:27500:3061=27:3062=rus@4:0:4AE1,2710:3006:65535:203:0 +JimJam;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:2391=2:2392=rus@4:0:4AE1,2710:18059:65535:18:0 +KidsCo;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:2361=2:2362=rus@4:0:4AE1,2710:18056:65535:18:0 +MCM Top;TricolorTV:12149:hC34M5O35S1:S36.0E:27500:1551=27:1552=rus@4:0:4AE1,2710:23380:65535:23:0 +MGM HD;TricolorTV:12418:hC34M5O35S1:S36.0E:27500:3731=27:3732=rus@4:0:4AE1,2710:37003:65535:237:0 +MTV Dance;TricolorTV:12149:hC34M5O35S1:S36.0E:27500:1601=27:1602=rus@4:0:4AE1,2710:23390:65535:23:0 +MTV Hits;TricolorTV:12149:hC34M5O35S1:S36.0E:27500:901=27:902=rus@4:0:4AE1,2710:23090:65535:23:0 +MTV Live HD;TricolorTV:12418:hC34M5O35S1:S36.0E:27500:3741=27:3742=rus@4:0:4AE1,2710:37004:65535:237:0 +MTV Rocks;TricolorTV:11727:hC34M5O35S1:S36.0E:27500:1101=27:1102=rus@4:0:4AE1,2710:2616:65535:1:0 +Mezzo Live HD;TricolorTV:12418:hC34M5O35S1:S36.0E:27500:3711=27:3712=rus@4:0:4AE1,2710:37001:65535:237:0 +Mezzo;TricolorTV:11804:hC34M5O35S1:S36.0E:27500:951=27:952=rus@4:0:4AE1,2710:319:65535:5:0 +NatGeoWild;TricolorTV:12149:hC34M5O35S1:S36.0E:27500:51=27:52=rus@4:0:4AE1,2710:23010:65535:23:0 +National Geographic Channel HD;TricolorTV:11958:hC34M5O35S1:S36.0E:27500:1341=27:1342=rus@4;1343=rus@106:0:4AE1,2710:13004:65535:213:0 +National Geographic Channel;TricolorTV:12149:hC34M5O35S1:S36.0E:27500:501=27:502=rus@4:0:4AE1,2710:23100:65535:23:0 +Nat Geo Wild HD;TricolorTV:11958:hC34M5O35S1:S36.0E:27500:1331=27:1332=rus@4:0:4AE1,2710:13003:65535:213:0 +Nickelodeon HD;TricolorTV:12418:hC34M5O35S1:S36.0E:27500:3751=27:3752=rus@4:0:4AE1,2710:37005:65535:237:0 +Nickelodeon Junior;TricolorTV:12149:hC34M5O35S1:S36.0E:27500:1101=27:1102=rus@4:0:4AE1,2710:23240:65535:23:0 +OTP;TricolorTV:11804:hC34M5O35S1:S36.0E:27500:401=27:402=rus@4:0:4AE1,2710:308:65535:5:0 +Outdoor Channel HD;TricolorTV:12034:hC34M5O35S1:S36.0E:27500:1741=27:1742=rus@4:0:4AE1,2710:17004:65535:217:0 +Promo;TricolorTV:11881:hC34M2O35S0:S36.0E:27500:1001=2:1002=rus@4:0:0:917:65535:9:0 +RTG HD;TricolorTV:12034:hC34M5O35S1:S36.0E:27500:1721=27:1722=rus@4:0:4AE1,2710:17002:65535:217:0 +RUSONG TV;TricolorTV:11881:hC34M2O35S0:S36.0E:27500:201=2:202=rus@4:0:4AE1,2710,4AE0:904:65535:9:0 +RuTV;TricolorTV:12111:hC34M5O35S1:S36.0E:27500:1621=27:1622=rus@4:0:4AE1,2710:2117:65535:21:0 +Russia Today;TricolorTV:12149:hC34M5O35S1:S36.0E:27500:301=27:302=rus@4:0:4AE1,2710:23060:65535:23:0 +Ru FM;TricolorTV:11823:vC34M5O35S1:S36.0E:27500:0:3481=rus@4:0:4AE1,2710:34008:65535:34:0 +STV;TricolorTV:11804:hC34M5O35S1:S36.0E:27500:1101=27:1102=rus@4:0:4AE1,2710:322:65535:5:0 +Shopping Live;TricolorTV:11881:hC34M2O35S0:S36.0E:27500:1051=2:1052=rus@4:0:4AE1,2710,4AE0:918:65535:9:0 +TOPSONG TV;TricolorTV:11804:hC34M5O35S1:S36.0E:27500:1701=27:1702=@4:0:4AE1,2710:333:65535:5:0 +TRACE Sport Stars HD;TricolorTV:11919:hC34M5O35S1:S36.0E:27500:2131=27:2132=eng@4:0:4AE1,2710:21003:65535:11:0 +TV Sale;TricolorTV:12226:hC34M2O35S0:S36.0E:27500:701=2:702=rus@4:0:4AE1,2710,4AE0:27070:65535:27:0 +Teen TV;TricolorTV:12190:hC34M2O35S0:S36.0E:20000:701=2:702=rus@4:0:4AE1,2710,4AE0:25070:65535:25:0 +Teletravel HD;TricolorTV:11766:hC34M5O35S1:S36.0E:27500:3011=27:3012=rus@4;3013=rus@106:0:4AE1,2710:3001:65535:203:0 +TiJi;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:2371=2:2372=rus@4:0:4AE1,2710:18057:65535:18:0 +Top Shop;TricolorTV:11881:hC34M2O35S0:S36.0E:27500:151=2:152=rus@4:0:4AE1,2710,4AE0:903:65535:9:0 +Travel+Adventure HD;TricolorTV:12034:hC34M5O35S1:S36.0E:27500:1731=27:1732=rus@4:0:4AE1,2710:17003:65535:217:0 +Travel+Adventure;TricolorTV:12149:hC34M5O35S1:S36.0E:27500:251=27:252=rus@4:0:4AE1,2710:23050:65535:23:0 +VH1 Classic;TricolorTV:11727:hC34M5O35S1:S36.0E:27500:851=27:852=rus@4:0:4AE1,2710:2615:65535:1:0 +VH1;TricolorTV:11727:hC34M5O35S1:S36.0E:27500:1151=27:1152=rus@4:0:4AE1,2710:2621:65535:1:0 +Автоплюс;TricolorTV:12190:hC34M2O35S0:S36.0E:20000:401=2:402=rus@4:0:4AE1,2710,4AE0:25040:65535:25:0 +Авторадио;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:2221=rus@4:0:4AE1,2710:18042:65535:18:0 +Агро ТВ;TricolorTV:11804:hC34M5O35S1:S36.0E:27500:1001=27:1002=rus@4:0:4AE1,2710:320:65535:5:0 +БСТ;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:2311=2:2312=rus@4:0:4AE1,2710:18051:65535:18:0 +Бест FM;TricolorTV:11823:vC34M5O35S1:S36.0E:27500:0:3451=rus@4:0:4AE1,2710:34005:65535:34:0 +Боец ТВ;TricolorTV:12303:hC34M2O35S0:S36.0E:27500:601=2:608=rus@4:0:4AE1,2710,4AE0:31060:112:310:0 +ВМЕСТЕ-РФ;TricolorTV:12149:hC34M5O35S1:S36.0E:27500:951=27:952=rus@4:0:4AE1,2710:23180:65535:23:0 +Вести FM;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:1981=rus@4:0:4AE1,2710:18018:65535:18:0 +Воскресение;TricolorTV:12303:hC34M2O35S0:S36.0E:27500:0:126=@4:0:0:4:112:310:0 +Время;TricolorTV:11727:hC34M5O35S1:S36.0E:27500:2001=27:2002=rus@4:0:4AE1,2710:2627:65535:1:0 +Дагестан;TricolorTV:11804:hC34M5O35S1:S36.0E:27500:751=27:752=rus@4:0:4AE1,2710:315:65535:5:0 +Детский Мир;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:2331=2:2332=rus@4:0:4AE1,2710:18053:65535:18:0 +Дождь HD;TricolorTV:11919:hC34M5O35S1:S36.0E:27500:2151=27:2152=rus@4:0:4AE1,2710:21005:65535:11:0 +Дождь;TricolorTV:11881:hC34M2O35S0:S36.0E:27500:51=2:52=rus@4:0:4AE1,2710,4AE0:901:65535:9:0 +Дом Кино;TricolorTV:12190:hC34M2O35S0:S36.0E:20000:101=2:102=rus@4:0:4AE1,2710,4AE0:25010:65535:25:0 +Домашний магазин;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:2241=2:2242=rus@4:0:4AE1,2710:18044:65535:18:0 +Домашний;TricolorTV:12303:hC34M2O35S0:S36.0E:27500:1501=2:1502=rus@4:0:4AE1,2710,4AE0:31040:112:310:0 +Дорожное радио;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:2056=rus@4:0:4AE1,2710:18025:65535:18:0 +Европа плюс;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:2071=rus@4:0:4AE1,2710:18027:65535:18:0 +Еда HD;TricolorTV:11766:hC34M5O35S1:S36.0E:27500:3041=27:3042=rus@4:0:4AE1,2710:3004:65535:203:0 +Еда;TricolorTV:12111:hC34M5O35S1:S36.0E:27500:1471=27:1472=rus@4:0:4AE1,2710:2118:65535:21:0 +Загородный ТВ;TricolorTV:11804:hC34M5O35S1:S36.0E:27500:701=27:702=rus@4:0:4AE1,2710:314:65535:5:0 +Звезда;TricolorTV:12111:hC34M5O35S1:S36.0E:27500:1371=27:1372=rus@4:0:4AE1,2710:2110:65535:21:0 +Зоо ТВ;TricolorTV:12303:hC34M2O35S0:S36.0E:27500:1301=2:1302=rus@4:0:4AE1,2710,4AE0:31030:112:310:0 +ИНГУШЕТИЯ;TricolorTV:11727:hC34M5O35S1:S36.0E:27500:601=27:602=rus@4:0:4AE1,2710:2612:65535:1:0 +Инва Медиа ТВ;TricolorTV:11727:hC34M5O35S1:S36.0E:27500:951=27:952=rus@4:0:4AE1,2710:2618:65535:1:0 +Индия ТВ;TricolorTV:12303:hC34M2O35S0:S36.0E:27500:1101=2:1102=rus@4:0:4AE1,2710,4AE0:31010:112:310:0 +Интересное ТВ;TricolorTV:11804:hC34M5O35S1:S36.0E:27500:1051=27:1052=rus@4:0:4AE1,2710:321:65535:5:0 +Инфоканал;TricolorTV:12226:hC34M2O35S0:S36.0E:27500:271=2:272=rus@4:0:0:27000:65535:27:0 +Искушение HD;TricolorTV:11766:hC34M5O35S1:S36.0E:27500:3051=27:3052=rus@4:0:4AE1,2710:3005:65535:203:0 +Искушение;TricolorTV:11881:hC34M2O35S0:S36.0E:27500:756=2:757=rus@4:0:4AE1,2710,4AE0:912:65535:9:0 +История;TricolorTV:12149:hC34M5O35S1:S36.0E:27500:1351=27:1352=rus@4:0:4AE1,2710:23290:65535:23:0 +КХЛ;TricolorTV:11804:hC34M5O35S1:S36.0E:27500:901=27:902=rus@4:0:4AE1,2710:318:65535:5:0 +Казак FM;TricolorTV:11823:vC34M5O35S1:S36.0E:27500:0:3411=rus@4:0:4AE1,2710:34001:65535:34:0 +Карусель (+3);TricolorTV:12054:vC34M5O35S1:S36.0E:27500:2251=2:2252=rus@4:0:4AE1,2710:18045:65535:18:0 +Карусель;TricolorTV:12111:hC34M5O35S1:S36.0E:27500:971=27:972=rus@4:973:4AE1,2710:2104:65535:21:0 +Кекс FM;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:2106=rus@4:0:4AE1,2710:18030:65535:18:0 +КиноПремиум HD;TricolorTV:11823:vC34M5O35S1:S36.0E:27500:3511=27:3512=rus@4;3513=rus@106:0:4AE1,2710:34011:65535:34:0 +Комедия ТВ;TricolorTV:12190:hC34M2O35S0:S36.0E:20000:601=2:602=rus@4:0:4AE1,2710,4AE0:25060:65535:25:0 +Комсомольская правда;TricolorTV:11727:hC34M5O35S1:S36.0E:27500:551=27:552=rus@4:0:4AE1,2710:2611:65535:1:0 +Комсомольская правда;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:2121=rus@4:0:4AE1,2710:18032:65535:18:0 +Культура;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:1971=rus@4:0:4AE1,2710:18017:65535:18:0 +Кухня ТВ;TricolorTV:11804:hC34M5O35S1:S36.0E:27500:1201=27:1202=rus@4:0:4AE1,2710:324:65535:5:0 +Ля Минор;TricolorTV:11804:hC34M5O35S1:S36.0E:27500:1151=27:1152=rus@4:0:4AE1,2710:323:65535:5:0 +МАКС - FM;TricolorTV:11823:vC34M5O35S1:S36.0E:27500:0:3421=rus@4:0:4AE1,2710:34002:65535:34:0 +Максимум;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:1911=rus@4:0:4AE1,2710:18011:65535:18:0 +Мать и дитя;TricolorTV:11804:hC34M5O35S1:S36.0E:27500:151=27:152=rus@4:0:4AE1,2710:303:65535:5:0 +Маяк;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:1966=rus@4:0:4AE1,2710:18016:65535:18:0 +Мир 24;TricolorTV:11727:hC34M5O35S1:S36.0E:27500:651=27:652=rus@4:0:4AE1,2710:2613:65535:1:0 +Мир;TricolorTV:11881:hC34M2O35S0:S36.0E:27500:1101=2:1102=rus@4:0:4AE1,2710,4AE0:919:65535:9:0 +Много ТВ;TricolorTV:12190:hC34M2O35S0:S36.0E:20000:201=2:202=rus@4:0:4AE1,2710,4AE0:25020:65535:25:0 +Монте Карло;TricolorTV:11823:vC34M5O35S1:S36.0E:27500:0:3431=rus@4:0:4AE1,2710:34003:65535:34:0 +Москва 24;TricolorTV:11727:hC34M5O35S1:S36.0E:27500:1106=27:1107=rus@4:0:4AE1,2710:2620:65535:1:0 +Моя планета;TricolorTV:11804:hC34M5O35S1:S36.0E:27500:51=27:52=rus@4:0:4AE1,2710:301:65535:5:0 +Муз ТВ;TricolorTV:11727:hC34M5O35S1:S36.0E:27500:1956=27:1957=rus@4:0:4AE1,2710:2617:65535:1:0 +Музыка Первого;TricolorTV:11804:hC34M5O35S1:S36.0E:27500:1401=27:1402=rus@4:0:4AE1,2710:328:65535:5:0 +НСТВ;TricolorTV:11804:hC34M5O35S1:S36.0E:27500:1501=27:1502=rus@4:0:4AE1,2710:330:65535:5:0 +НТВ (+2);TricolorTV:12054:vC34M5O35S1:S36.0E:27500:2281=2:2282=rus@4:2283:4AE1,2710:18048:65535:18:0 +НТВ;TricolorTV:12111:hC34M5O35S1:S36.0E:27500:921=27:922=rus@4:923:4AE1,2710:2103:65535:21:0 +Нано ТВ;TricolorTV:11727:hC34M5O35S1:S36.0E:27500:2101=27:2102=rus@4:0:4AE1,2710:2629:65535:1:0 +Наука 2.0;TricolorTV:11727:hC34M5O35S1:S36.0E:27500:401=27:402=rus@4:0:4AE1,2710:2608:65535:1:0 +Наше HD;TricolorTV:11823:vC34M5O35S1:S36.0E:27500:3551=27:3552=rus@4;3553=rus@106:0:4AE1,2710:34015:65535:34:0 +Наше радио;TricolorTV:11823:vC34M5O35S1:S36.0E:27500:0:3441=rus@4:0:4AE1,2710:34004:65535:34:0 +Ночной Клуб;TricolorTV:11881:hC34M2O35S0:S36.0E:27500:351=2:352=rus@4:0:4AE1,2710,4AE0:907:65535:9:0 +Орфей;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:2161=rus@4:0:4AE1,2710:18036:65535:18:0 +Остросюжетное HD;TricolorTV:11823:vC34M5O35S1:S36.0E:27500:3521=27:3522=rus@4;3523=rus@106:0:4AE1,2710:34012:65535:34:0 +Охотник и рыболов HD;TricolorTV:12418:hC34M5O35S1:S36.0E:27500:3721=27:3722=rus@4:0:4AE1,2710:37002:65535:237:0 +Охотник и рыболов;TricolorTV:12111:hC34M5O35S1:S36.0E:27500:1571=27:1572=rus@4:0:4AE1,2710:2115:65535:21:0 +ПЯТНИЦА;TricolorTV:12149:hC34M5O35S1:S36.0E:27500:1301=27:1302=rus@4:0:4AE1,2710:23280:65535:23:0 +Первый HD;TricolorTV:11919:hC34M5O35S1:S36.0E:27500:2141=27:2142=rus@4:2144:4AE1,2710:21004:65535:11:0 +Первый (+2);TricolorTV:12054:vC34M5O35S1:S36.0E:27500:2421=2:2422=rus@4:0:4AE1,2710:18062:65535:18:0 +Первый;TricolorTV:12111:hC34M5O35S1:S36.0E:27500:821=27:822=rus@4:823:4AE1,2710:2101:65535:21:0 +Перец;TricolorTV:12111:hC34M5O35S1:S36.0E:27500:1521=27:1522=rus@4:0:4AE1,2710:2114:65535:21:0 +Подмосковье;TricolorTV:12303:hC34M2O35S0:S36.0E:27500:1906=2:1907=rus@4:0:4AE1,2710,4AE0:31090:112:310:0 +Пятый канал (+2);TricolorTV:12054:vC34M5O35S1:S36.0E:27500:2261=2:2262=rus@4:0:4AE1,2710:18046:65535:18:0 +Пятый канал;TricolorTV:12111:hC34M5O35S1:S36.0E:27500:1071=27:1072=rus@4:0:4AE1,2710:2107:65535:21:0 +РБК ТВ;TricolorTV:11804:hC34M5O35S1:S36.0E:27500:101=27:102=rus@4:0:4AE1,2710:302:65535:5:0 +РЖД;TricolorTV:11804:hC34M5O35S1:S36.0E:27500:601=27:602=rus@4:0:4AE1,2710:312:65535:5:0 +Радио 7;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:2091=rus@4:0:4AE1,2710:18029:65535:18:0 +Радио 107 (Краснодар);TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:2156=rus@4:0:4AE1,2710:18035:65535:18:0 +Радио Energy;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:2206=rus@4:0:4AE1,2710:18040:65535:18:0 +Радио Romantika;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:2212=rus@4:0:4AE1,2710:18041:65535:18:0 +Радио Ваня;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:1861=rus@4:0:4AE1,2710:18006:65535:18:0 +Радио Звезда;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:2181=rus@4:0:4AE1,2710:18038:65535:18:0 +Радио Зенит;TricolorTV:11823:vC34M5O35S1:S36.0E:27500:0:3501=rus@4:0:4AE1,2710:34010:65535:34:0 +Радио Мир;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:2111=rus@4:0:4AE1,2710:18031:65535:18:0 +Радио РОКС;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:2131=rus@4:0:4AE1,2710:18033:65535:18:0 +Радио России;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:1951=rus@4:0:4AE1,2710:18015:65535:18:0 +Радио Ультра;TricolorTV:11823:vC34M5O35S1:S36.0E:27500:0:3471=rus@4:0:4AE1,2710,7BE0:34007:65535:34:0 +Радио для Двоих;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:2081=rus@4:0:4AE1,2710:18028:65535:18:0 +Раз ТВ;TricolorTV:11881:hC34M2O35S0:S36.0E:27500:1501=2:1502=rus@4:0:4AE1,2710,4AE0:913:65535:9:0 +Рен ТВ;TricolorTV:11881:hC34M2O35S0:S36.0E:27500:501=2:502=rus@4:0:4AE1,2710,4AE0:910:65535:9:0 +Ретро FM;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:2061=rus@4:0:4AE1,2710:18026:65535:18:0 +Рок FM;TricolorTV:11823:vC34M5O35S1:S36.0E:27500:0:3461=rus@4:0:4AE1,2710:34006:65535:34:0 +Россия 1 (+2);TricolorTV:12054:vC34M5O35S1:S36.0E:27500:2231=2:2232=rus@4:0:4AE1,2710:18043:65535:18:0 +Россия 1;TricolorTV:12111:hC34M5O35S1:S36.0E:27500:871=27:872=rus@4:873:4AE1,2710:2102:65535:21:0 +Россия 2;TricolorTV:12111:hC34M5O35S1:S36.0E:27500:1171=27:1172=rus@4:0:4AE1,2710:2105:65535:21:0 +Россия 24;TricolorTV:12111:hC34M5O35S1:S36.0E:27500:1021=27:1022=rus@4:0:4AE1,2710:2106:65535:21:0 +Россия HD;TricolorTV:11958:hC34M5O35S1:S36.0E:27500:1311=27:1312=rus@4:0:4AE1,2710:13001:65535:213:0 +Россия К (+2);TricolorTV:12054:vC34M5O35S1:S36.0E:27500:2271=2:2272=rus@4:0:4AE1,2710:18047:65535:18:0 +Россия К;TricolorTV:12111:hC34M5O35S1:S36.0E:27500:1121=27:1122=rus@4:1123:4AE1,2710:2108:65535:21:0 +Русская Ночь;TricolorTV:11881:hC34M2O35S0:S36.0E:27500:401=2:402=rus@4:0:4AE1,2710,4AE0:908:65535:9:0 +Русская служба новостей;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:1931=rus@4:0:4AE1,2710:18013:65535:18:0 +Русский Экстрим;TricolorTV:12149:hC34M5O35S1:S36.0E:27500:351=27:352=rus@4:0:4AE1,2710:23070:65535:23:0 +Русское радио;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:1941=rus@4:0:4AE1,2710:18014:65535:18:0 +СТВ Ставрополь;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:2411=2:2412=rus@4:0:4AE1,2710:18061:65535:18:0 +СТС (+2);TricolorTV:12054:vC34M5O35S1:S36.0E:27500:2301=2:2302=rus@4:0:4AE1,2710:18050:65535:18:0 +СТС;TricolorTV:12111:hC34M5O35S1:S36.0E:27500:1271=27:1272=rus@4:0:4AE1,2710:2112:65535:21:0 +Санкт-Петербург;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:2321=2:2322=rus@4:0:4AE1,2710:18052:65535:18:0 +Сарафан;TricolorTV:11727:hC34M5O35S1:S36.0E:27500:501=27:502=rus@4:0:4AE1,2710:2610:65535:1:0 +Север;TricolorTV:11727:hC34M5O35S1:S36.0E:27500:201=27:202=rus@4:0:4AE1,2710:2604:65535:1:0 +Семейное HD;TricolorTV:11823:vC34M5O35S1:S36.0E:27500:3531=27:3532=rus@4;3533=rus@106:0:4AE1,2710:34013:65535:34:0 +Сериал HD;TricolorTV:11823:vC34M5O35S1:S36.0E:27500:3541=27:3542=rus@4;3543=rus@106:0:4AE1,2710:34014:65535:34:0 +Сеть Новая жизнь;TricolorTV:11823:vC34M5O35S1:S36.0E:27500:0:3491=rus@4:0:4AE1,2710:34009:65535:34:0 +Союз;TricolorTV:12303:hC34M2O35S0:S36.0E:27500:303=2:405=rus@4:0:0:3:112:310:0 +Спас;TricolorTV:12149:hC34M5O35S1:S36.0E:27500:1151=27:1152=rus@4:0:4AE1,2710:23170:65535:23:0 +Спорт 1 HD;TricolorTV:12034:hC34M5O35S1:S36.0E:27500:1711=27:1712=rus@4:0:4AE1,2710:17001:65535:217:0 +Спорт;TricolorTV:11727:hC34M5O35S1:S36.0E:27500:301=27:302=rus@4:0:4AE1,2710:2606:65535:1:0 +Стиль и мода;TricolorTV:12226:hC34M2O35S0:S36.0E:27500:251=2:252=rus@4:0:4AE1,2710,4AE0:27025:65535:27:0 +Страна;TricolorTV:11727:hC34M5O35S1:S36.0E:27500:751=27:752=rus@4:0:4AE1,2710:2609:65535:1:0 +ТВ3;TricolorTV:12149:hC34M5O35S1:S36.0E:27500:1201=27:1202=rus@4:0:4AE1,2710:23260:65535:23:0 +ТВ Молл;TricolorTV:12149:hC34M5O35S1:S36.0E:27500:1501=27:1502=rus@4:0:0:23370:65535:23:0 +ТВЦ;TricolorTV:12226:hC34M2O35S0:S36.0E:27500:1001=2:1002=rus@4:1003:4AE1,2710,4AE0:27100:65535:27:0 +ТВпоиск;TricolorTV:11843:hC34M5O35S1:S36.0E:27500:41=27:42=@4:0:0:26900:65535:7:0 +ТДК;TricolorTV:11804:hC34M5O35S1:S36.0E:27500:351=27:352=rus@4:0:4AE1,2710:307:65535:5:0 +ТНВ Планета;TricolorTV:11804:hC34M5O35S1:S36.0E:27500:301=27:302=rus@4:0:4AE1,2710:306:65535:5:0 +ТНТ (+2);TricolorTV:12054:vC34M5O35S1:S36.0E:27500:2291=2:2292=rus@4:0:4AE1,2710:18049:65535:18:0 +ТНТ;TricolorTV:11881:hC34M2O35S0:S36.0E:27500:1151=2:1152=rus@4:0:4AE1,2710,4AE0:920:65535:9:0 +ТРО;TricolorTV:11804:hC34M5O35S1:S36.0E:27500:1351=27:1352=rus@4:0:4AE1,2710:327:65535:5:0 +ТТС;TricolorTV:12190:hC34M2O35S0:S36.0E:20000:501=2:502=rus@4:0:4AE1,2710,4AE0:25050:65535:25:0 +Теледом;TricolorTV:12149:hC34M5O35S1:S36.0E:27500:761=27:762=rus@4:0:4AE1,2710:23190:65535:23:0 +Телеинструктор;TricolorTV:11881:hC34M2O35S0:S36.0E:27500:451=2:452=rus@4:0:0:911:65535:9:0 +Телекафе;TricolorTV:11804:hC34M5O35S1:S36.0E:27500:1851=27:1852=@4:0:4AE1,2710:334:65535:5:0 +Телепутешествия;TricolorTV:12111:hC34M5O35S1:S36.0E:27500:1421=27:1422=rus@4:0:4AE1,2710:2116:65535:21:0 +Тонус ТВ;TricolorTV:12303:hC34M2O35S0:S36.0E:27500:1803=2:1802=rus@4:0:4AE1,2710,4AE0:31080:112:310:0 +Хит FM;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:1921=rus@4:0:4AE1,2710:18012:65535:18:0 +ЧГТРК Грозный;TricolorTV:11804:hC34M5O35S1:S36.0E:27500:1251=27:1252=rus@4:0:4AE1,2710:325:65535:5:0 +Шансон ТВ;TricolorTV:12149:hC34M5O35S1:S36.0E:27500:1451=27:1452=rus@4:0:4AE1,2710:23360:65535:23:0 +Шансон;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:1881=rus@4:0:4AE1,2710:18008:65535:18:0 +Ю-ТВ;TricolorTV:12303:hC34M2O35S0:S36.0E:27500:1701=2:1702=@4:0:4AE1,2710,4AE0:31070:112:310:0 +Южный Регион Дон;TricolorTV:11727:hC34M5O35S1:S36.0E:27500:251=27:252=rus@4:0:4AE1,2710:2605:65535:1:0 +Юмор FM;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:2191=rus@4:0:4AE1,2710:18039:65535:18:0 +Юность;TricolorTV:12054:vC34M5O35S1:S36.0E:27500:0:1991=rus@4:0:4AE1,2710:18019:65535:18:0 + +:~Lybid TV~ +1+1;Lybid TV:12169:vC34M5O35S1:S36.0E:27500:1020=2:1021=ukr@4:0:2710:34008:1:34:0 +2+2;Lybid TV:12169:vC34M5O35S1:S36.0E:27500:1030=2:1031=ukr@4:0:2710:34010:1:34:0 +5 Канал;Lybid TV:12169:vC34M5O35S1:S36.0E:27500:1040=2:1041=ukr@4:0:2710:34014:1:34:0 +24 Канал;Lybid TV:12169:vC34M5O35S1:S36.0E:27500:1150=2:1151=ukr@4:0:2710:34019:1:34:0 +Cartoon Network;Lybid TV:12169:vC34M5O35S1:S36.0E:27500:1260=2:1261=rus@4:0:2710:34026:1:34:0 +Gulli;Lybid TV:11747:vC34M5O35S1:S36.0E:27500:261=27:265=rus@4:0:2710:35160:210:2:0 +HTB-мир;Lybid TV:12169:vC34M5O35S1:S36.0E:27500:1180=2:1181=rus@4:0:2710:34013:1:34:0 +History;Lybid TV:11747:vC34M5O35S1:S36.0E:27500:171=27:175=eng@4,176=rus@4:0:2710:35070:210:2:0 +ICTV;Lybid TV:12169:vC34M5O35S1:S36.0E:27500:1160=2:1161=ukr@4:0:2710:34003:1:34:0 +M1;Lybid TV:12169:vC34M5O35S1:S36.0E:27500:1140=2:1141=ukr@4:0:2710:34005:1:34:0 +M2;Lybid TV:12169:vC34M5O35S1:S36.0E:27500:1170=2:1171=ukr@4:0:2710:34006:1:34:0 +Qtv;Lybid TV:12169:vC34M5O35S1:S36.0E:27500:1110=2:1111=ukr@4:0:2710:34007:1:34:0 +RTG TV;Lybid TV:11747:vC34M5O35S1:S36.0E:27500:641=27:645=rus@4:0:2710:35540:210:2:0 +RTVi;Lybid TV:11747:vC34M5O35S1:S36.0E:27500:341=27:345=rus@4,346=rus@4:0:2710:35240:210:2:0 +TBi;Lybid TV:12169:vC34M5O35S1:S36.0E:27500:1070=2:1071=ukr@4:0:2710:34017:1:34:0 +TET;Lybid TV:12169:vC34M5O35S1:S36.0E:27500:1080=2:1081=ukr@4:0:2710:34012:1:34:0 +TVCi TV;Lybid TV:11747:vC34M5O35S1:S36.0E:27500:651=27:655=@4:0:2710:35550:210:2:0 +Tiji;Lybid TV:11747:vC34M5O35S1:S36.0E:27500:271=27:275=rus@4:0:2710:35170:210:2:0 +Travel Channel;Lybid TV:11747:vC34M5O35S1:S36.0E:27500:401=27:405=eng@3,406=rus@3:0:2710:35300:210:2:0 +Universal Channel;Lybid TV:11747:vC34M5O35S1:S36.0E:27500:451=27:455=eng@4,456=rus@4:0:2710:35350:210:2:0 +test;Lybid TV:11747:vC34M5O35S1:S36.0E:27500:911=27:915=ukr@4:0:2710:35810:210:2:0 +Боец;Lybid TV:11747:vC34M5O35S1:S36.0E:27500:421=27:425=kur@4:0:2710:35320:210:2:0 +Ваш Успех;Lybid TV:11747:vC34M5O35S1:S36.0E:27500:531=27:535=rus@4:0:2710:35430:210:2:0 +Детский Мир Телеклуб;Lybid TV:11747:vC34M5O35S1:S36.0E:27500:281=27:285=rus@4:0:2710:35180:210:2:0 +Европа Плюс ТВ;Lybid TV:12169:vC34M5O35S1:S36.0E:27500:1250=2:1251=rus@4:0:2710:34025:1:34:0 +Загородная жизнь;Lybid TV:11747:vC34M5O35S1:S36.0E:27500:391=27:395=rus@4:0:2710:35290:210:2:0 +Инфоканал;Lybid TV:12169:vC34M5O35S1:S36.0E:27500:1010=2:1011=ukr@4:0:0:34001:1:34:0 +КТО ЕСТЬ КТО;Lybid TV:11747:vC34M5O35S1:S36.0E:27500:431=27:435=rus@4:0:2710:35330:210:2:0 +Кино Плюс;Lybid TV:11747:vC34M5O35S1:S36.0E:27500:501=27:506=rus@4;505=rus@106:0:2710:35400:210:2:0 +Кинолюкс;Lybid TV:11747:vC34M5O35S1:S36.0E:27500:441=27:445=rus@4:0:2710:35340:210:2:0 +Кухня ТВ;Lybid TV:11747:vC34M5O35S1:S36.0E:27500:581=27:585=rus@4:0:2710:35480:210:2:0 +Много TV;Lybid TV:11747:vC34M5O35S1:S36.0E:27500:481=27:485=rus@4:0:2710:35380:210:2:0 +Моя Дитина;Lybid TV:11747:vC34M5O35S1:S36.0E:27500:291=27:295=ukr@3:0:2710:35190:210:2:0 +Мужской;Lybid TV:11747:vC34M5O35S1:S36.0E:27500:541=27:545=rus@4:0:2710:35440:210:2:0 +НЛО-TV;Lybid TV:12169:vC34M5O35S1:S36.0E:27500:1050=2:1051=ukr@4:0:2710:34018:1:34:0 +НТВ-ПЛЮС Теннис;Lybid TV:11747:vC34M5O35S1:S36.0E:27500:381=27:385=rus@4:0:2710:35280:210:2:0 +Наш Футбол;Lybid TV:11747:vC34M5O35S1:S36.0E:27500:351=27:355=rus@4:0:2710:35250:210:2:0 +Наше любимое кино;Lybid TV:11747:vC34M5O35S1:S36.0E:27500:471=27:475=rus@4,476=rus@4:0:2710:35370:210:2:0 +Новый канал;Lybid TV:12169:vC34M5O35S1:S36.0E:27500:1120=2:1121=ukr@4:0:2710:34004:1:34:0 +Ностальгия;Lybid TV:11747:vC34M5O35S1:S36.0E:27500:1313=27:525=rus@4:0:2710:35420:210:2:0 +Охотник и Рыболов HD;Lybid TV:12169:vC34M5O35S1:S36.0E:27500:1210=2:1211=rus@4:0:2710:34024:1:34:0 +Перший Нацiональний;Lybid TV:12169:vC34M5O35S1:S36.0E:27500:1220=2:1221=ukr@4:0:2710:34011:1:34:0 +Плюс-Плюс;Lybid TV:12169:vC34M5O35S1:S36.0E:27500:1060=2:1061=ukr@4:0:2710:34016:1:34:0 +СТБ;Lybid TV:12169:vC34M5O35S1:S36.0E:27500:1130=2:1131=ukr@4:0:2710:34002:1:34:0 +Совершенно секретно;Lybid TV:11747:vC34M5O35S1:S36.0E:27500:411=27:415=rus@4:0:2710:35310:210:2:0 +Спорт 1;Lybid TV:12169:vC34M5O35S1:S36.0E:27500:1240=2:1241=ukr@4,1242=rus@4:0:2710:34022:1:34:0 +Спорт 2;Lybid TV:12169:vC34M5O35S1:S36.0E:27500:1270=2:1271=ukr@4,1272=rus@4:0:2710:34023:1:34:0 +ТРК Украина;Lybid TV:12169:vC34M5O35S1:S36.0E:27500:1100=2:1101=ukr@4:0:2710:34009:1:34:0 +Тонис;Lybid TV:12169:vC34M5O35S1:S36.0E:27500:1090=2:1091=ukr@4:0:2710:34015:1:34:0 +Футбол +;Lybid TV:12169:vC34M5O35S1:S36.0E:27500:1190=2:1191=ukr@4:0:2710:34021:1:34:0 +Футбол;Lybid TV:12169:vC34M5O35S1:S36.0E:27500:1230=2:1231=ukr@4:0:2710:34020:1:34:0 + +:~Connecto~ +Avtoradio;Connecto:12303:hC34M2O35S0:S36.0E:27500:0:4200=@3:0:0:32:112:310:0 +Energy;Connecto:12303:hC34M2O35S0:S36.0E:27500:0:4143=@3:0:0:30:112:310:0 +Humor FM;Connecto:12303:hC34M2O35S0:S36.0E:27500:0:4092=@3:0:0:57:112:310:0 +Romantika;Connecto:12303:hC34M2O35S0:S36.0E:27500:0:4180=@3:0:0:45:112:310:0 diff -Nru vdr-2.1.6/debian/configs/etc/vdr/diseqc.conf vdr-2.1.6-297~3e4e445/debian/configs/etc/vdr/diseqc.conf --- vdr-2.1.6/debian/configs/etc/vdr/diseqc.conf 1970-01-01 00:00:00.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/configs/etc/vdr/diseqc.conf 2014-03-19 21:59:41.000000000 +0000 @@ -0,0 +1,104 @@ +# DiSEqC configuration for VDR +# +# Format: +# +# satellite slof polarization lof command... +# +# satellite: one of the 'S' codes defined in sources.conf +# slof: switch frequency of LNB; the first entry with +# an slof greater than the actual transponder +# frequency will be used +# polarization: V = vertical, H = horizontal, L = Left circular, R = Right circular +# lof: the local oscillator frequency to subtract from +# the actual transponder frequency +# command: +# t tone off +# T tone on +# v voltage low (13V) +# V voltage high (18V) +# A mini A +# B mini B +# Sn Satellite channel routing code sequence for bank n follows +# Wnn wait nn milliseconds (nn may be any positive integer number) +# [xx ...] hex code sequence (max. 6) +# +# The 'command...' part is optional. +# +# A line containing space separated integer numbers, terminated with a ':', +# defines that any following DiSEqC sequences apply only to the given list +# of device numbers. +# +# Examples: + +# Full DiSEqC sequence: + +# Eutelsat W4/W7 +S36E 00000 V 10750 t v W15 [E0 10 38 F0] [E0 10 38 F0] W15 t +S36E 99999 V 10750 t v W15 [E0 10 38 F1] [E0 10 38 F1] W15 T +S36E 00000 H 10750 t V W15 [E0 10 38 F2] [E0 10 38 F2] W15 t +S36E 99999 H 10750 t V W15 [E0 10 38 F3] [E0 10 38 F3] W15 T + +# EuroBird 9.0 +#S9E 11700 V 9750 t v W15 [E0 10 38 F4] W15 [E0 10 38 F4] W15 t +#S9E 99999 V 10600 t v W15 [E0 10 38 F5] W15 [E0 10 38 F5] W15 T +#S9E 11700 H 9750 t V W15 [E0 10 38 F6] W15 [E0 10 38 F6] W15 t +#S9E 99999 H 10600 t V W15 [E0 10 38 F7] W15 [E0 10 38 F7] W15 T + +# Hotbird 6/8/9 +#S13E 11700 V 9750 t v W15 [E0 10 38 F8] W15 [E0 10 38 F8] W15 t +#S13E 99999 V 10600 t v W15 [E0 10 38 F9] W15 [E0 10 38 F9] W15 T +#S13E 11700 H 9750 t V W15 [E0 10 38 FA] W15 [E0 10 38 FA] W15 t +#S13E 99999 H 10600 t V W15 [E0 10 38 FB] W15 [E0 10 38 FB] W15 T + +# S19.2E Astra 1H/1KR/1L/1M/2C +#S19.2E 11700 V 9750 t v W15 [E0 10 38 FC] W15 [E0 10 38 FC] W15 t +#S19.2E 99999 V 10600 t v W15 [E0 10 38 FD] W15 [E0 10 38 FD] W15 T +#S19.2E 11700 H 9750 t V W15 [E0 10 38 FE] W15 [E0 10 38 FE] W15 t +#S19.2E 99999 H 10600 t V W15 [E0 10 38 FF] W15 [E0 10 38 FF] W15 T + +# Optimized for mini DiSEqC (aka toneburst): +# +# S19.2E 11700 V 9750 t v W15 A W15 t +# S19.2E 99999 V 10600 t v W15 A W15 T +# S19.2E 11700 H 9750 t V W15 A W15 t +# S19.2E 99999 H 10600 t V W15 A W15 T +# +# S13.0E 11700 V 9750 t v W15 B W15 t +# S13.0E 99999 V 10600 t v W15 B W15 T +# S13.0E 11700 H 9750 t V W15 B W15 t +# S13.0E 99999 H 10600 t V W15 B W15 T +# +# Optimized for full DiSEqC: +# +# S19.2E 11700 V 9750 [E0 10 38 F0] +# S19.2E 99999 V 10600 [E0 10 38 F1] +# S19.2E 11700 H 9750 [E0 10 38 F2] +# S19.2E 99999 H 10600 [E0 10 38 F3] +# +# S13.0E 11700 V 9750 [E0 10 38 F4] +# S13.0E 99999 V 10600 [E0 10 38 F5] +# S13.0E 11700 H 9750 [E0 10 38 F6] +# S13.0E 99999 H 10600 [E0 10 38 F7] +# +# DisiCon-4 Single Cable Network: +# +# horizontal: 11.704 - 12.205 GHz (1. IF: 1144 - 1645 MHz) - LOF 1 (10,56 GHz) +# horizontal: 12.676 - 12.709 GHz (1. IF: 2116 - 2148 MHz) - LOF 1 (10,56 GHz) +# vertical: 12.035 - 12.107 GHz (1. IF: 955 - 1027 MHz) - LOF 3 (11,08 GHz) +# vertical: 12.464 - 12.716 GHz (1. IF: 1744 - 1996 MHz) - LOF 2 (10,72 GHz) +# +# S19.2E 99999 H 10560 t v +# S19.2E 12110 V 11080 t v +# S19.2E 99999 V 10720 t v +# +# SCR (Satellite Channel Routing): +# +# S19.2E 11700 V 9750 t V W10 S0 [E0 10 5A 00 00] W10 v +# S19.2E 99999 V 10600 t V W10 S1 [E0 10 5A 00 00] W10 v +# S19.2E 11700 H 9750 t V W10 S2 [E0 10 5A 00 00] W10 v +# S19.2E 99999 H 10600 t V W10 S3 [E0 10 5A 00 00] W10 v +# +# S13.0E 11700 V 9750 t V W10 S4 [E0 10 5A 00 00] W10 v +# S13.0E 99999 V 10600 t V W10 S5 [E0 10 5A 00 00] W10 v +# S13.0E 11700 H 9750 t V W10 S6 [E0 10 5A 00 00] W10 v +# S13.0E 99999 H 10600 t V W10 S7 [E0 10 5A 00 00] W10 v diff -Nru vdr-2.1.6/debian/configs/etc/vdr/setup.conf vdr-2.1.6-297~3e4e445/debian/configs/etc/vdr/setup.conf --- vdr-2.1.6/debian/configs/etc/vdr/setup.conf 1970-01-01 00:00:00.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/configs/etc/vdr/setup.conf 2014-03-19 21:59:41.000000000 +0000 @@ -0,0 +1,2 @@ +DiSEqC = 1 +UpdateChannels = 0 \ No newline at end of file diff -Nru vdr-2.1.6/debian/control vdr-2.1.6-297~3e4e445/debian/control --- vdr-2.1.6/debian/control 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/control 2014-03-19 21:59:41.000000000 +0000 @@ -1,22 +1,17 @@ Source: vdr Section: video Priority: extra -Maintainer: Debian VDR Team <pkg-vdr-dvb-devel@lists.alioth.debian.org> -Uploaders: Thomas Schmidt <tschmidt@debian.org>, Tobias Grimm <etobi@debian.org>, Thomas Günther <tom@toms-cafe.de> -Build-Depends: debhelper (>= 9), quilt, libjpeg-dev, libcap-dev, - libncursesw5-dev, libfreetype6-dev, libfontconfig-dev, gettext, - python, linux-libc-dev (>= 3.0), libfribidi-dev -Standards-Version: 3.9.4 -Vcs-Git: git://git.debian.org/pkg-vdr-dvb/vdr.git -Vcs-Browser: http://git.debian.org/?p=pkg-vdr-dvb/vdr.git +Maintainer: Andrey Pavlenko <andrey.a.pavlenko@gmail.com> +Build-Depends: debhelper (>= 8.0.0), libfontconfig-dev, libjpeg-dev, libcap-dev, + pkg-config +Standards-Version: 3.9.3 Homepage: http://www.tvdr.de/ +Vcs-Git: git://projects.vdr-developer.org/vdr.git +Vcs-Browser: http://projects.vdr-developer.org/git/vdr.git Package: vdr Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends}, adduser, psmisc -Recommends: lirc, ttf-bitstream-vera | ttf-freefont -Suggests: vdr-plugin-dvbsddevice -Provides: ${vdr:Provides} +Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends}, adduser 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, @@ -34,7 +29,7 @@ Package: vdr-dev Architecture: all Depends: ${misc:Depends}, debhelper, linux-libc-dev (>= 3.0) -Suggests: dh-make, make +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, @@ -43,7 +38,7 @@ . 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 @@ -56,7 +51,7 @@ (hardware accelerated) with some comfort and use an IR remote control. . This package contains the debugging symbols for vdr. - + Package: vdr-plugin-dvbsddevice Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, vdr (= ${binary:Version}) @@ -69,21 +64,8 @@ output device for the "Full Featured" DVB cards based on the TechnoTrend/Fujitsu-Siemens design. -Package: vdr-plugin-dvbsddevice-dbg -Section: debug -Priority: extra -Architecture: any -Depends: ${misc:Depends}, vdr-plugin-dvbsddevice (= ${binary:Version}) -Description: Plugin that adds support for full featured SD-DVB cards to 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 debugging symbols for the dvbsddevice-plugin. - Package: vdr-plugin-dvbhddevice Architecture: any -Breaks: vdr (<< 2.0.0) Depends: ${shlibs:Depends}, ${misc:Depends}, vdr (= ${binary:Version}) Description: Plugin that adds support for full featured HD-DVB cards to VDR Video Disk Recorder (VDR) is a digital sat-receiver program using @@ -92,28 +74,3 @@ . This package contains the dvbhddevice-plugin, which implements the output device for the "Full Featured TechnoTrend S2-6400" DVB cards. - -Package: vdr-plugin-dvbhddevice-dbg -Section: debug -Priority: extra -Architecture: any -Depends: ${misc:Depends}, vdr-plugin-dvbhddevice (= ${binary:Version}) -Description: Plugin that adds support for full featured HD-DVB cards to 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 debugging symbols for the dvbhddevice-plugin. - -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. diff -Nru vdr-2.1.6/debian/copyright vdr-2.1.6-297~3e4e445/debian/copyright --- vdr-2.1.6/debian/copyright 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/copyright 1970-01-01 00:00:00.000000000 +0000 @@ -1,59 +0,0 @@ -Upstream Homepage: - http://www.tvdr.de/ - -Upstream Author: - Klaus Schmidinger <Klaus.Schmidinger@tvdr.de> and others - -Patch Authors: - ttxtsubs - Ragnar Sundblad <ragge@nada.kth.se> - http://www.nada.kth.se/~ragge/vdr/ttxtsubs/ - - jumpplay - Torsten Kunkel <vdr@tkunkel.de> (initial version) - Thomas Günther <tom@toms-cafe.de> (current version) - -Theme Authors: - Blue LCARS - (debian/themes/sttng-blue.theme) from Sascha Volkenandt - <sascha@akv-soft.de> was downloaded from - http://www.magoa.net/sttng-blue.theme - - Cool - (debian/themes/sttng-cool.theme) from - clocker@vdrportal.de, downloaded from - http://vdrportal.de/board/thread.php?postid=260715#post260715 - -Debian Maintainers: - Tobias Grimm <etobi@debian.org> - Thomas Günther <tom@toms-cafe.de> - Thomas Schmidt <tschmidt@debian.org> - -Copyright: - (C) 2000 - 2013 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 - 2013 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. diff -Nru vdr-2.1.6/debian/debianize-vdrplugin vdr-2.1.6-297~3e4e445/debian/debianize-vdrplugin --- vdr-2.1.6/debian/debianize-vdrplugin 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/debianize-vdrplugin 1970-01-01 00:00:00.000000000 +0000 @@ -1,82 +0,0 @@ -#!/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 ../ -regex ".*$PLUGIN-$VERSION.t.*\(gz\|bz2\)"`; do - ln -sf `basename $tarball` $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 -d -s -t /usr/share/vdr-dev/plugin-template -p vdr-plugin-$PLUGIN" -if [ ! -e $ORIGTARBALL ] ; then - dh_make="$dh_make -n" -fi - -$dh_make - -if [ "$?" -eq "0" ]; then - replace_vdr_version - replace_plugin_name -fi - -if [ ! -d debian/source ]; then - mkdir debian/source - echo "3.0 (quilt)" >debian/source/format -fi diff -Nru vdr-2.1.6/debian/debianize-vdrplugin.1 vdr-2.1.6-297~3e4e445/debian/debianize-vdrplugin.1 --- vdr-2.1.6/debian/debianize-vdrplugin.1 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/debianize-vdrplugin.1 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -.\" 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 <thomas@thsnet.de> -.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. diff -Nru vdr-2.1.6/debian/dependencies.sh vdr-2.1.6-297~3e4e445/debian/dependencies.sh --- vdr-2.1.6/debian/dependencies.sh 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/dependencies.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -# 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 diff -Nru vdr-2.1.6/debian/gbp.conf vdr-2.1.6-297~3e4e445/debian/gbp.conf --- vdr-2.1.6/debian/gbp.conf 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/gbp.conf 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -[DEFAULT] -pristine-tar = True -builder = git-pbuilder -cleaner = fakeroot debian/rules clean -upstream-branch = backend-upstream -debian-branch = backend-master - diff -Nru vdr-2.1.6/debian/order.conf vdr-2.1.6-297~3e4e445/debian/order.conf --- vdr-2.1.6/debian/order.conf 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/order.conf 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -# -# 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 append some plugins behind all the other plugins, then you -# can 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 -*lastplugin --thirdplugin --fourthplugin -*anotherlastplugin - diff -Nru vdr-2.1.6/debian/patchcheck.py vdr-2.1.6-297~3e4e445/debian/patchcheck.py --- vdr-2.1.6/debian/patchcheck.py 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patchcheck.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,106 +0,0 @@ -#!/usr/bin/python - -import re -import hashlib -import os -import subprocess -from textwrap import TextWrapper -from optparse import OptionParser - -PATCHES_FILE = 'debian/.vdr-patches' -PATCH_INFO_FILE = 'debian/patchinfo' - -def collect_patch_info(): - patchInfo = [] - for patch in subprocess.check_output('quilt series', shell=True).splitlines(): - md5 = hashlib.md5(open('debian/patches/' + patch).read()).hexdigest() - header = subprocess.check_output("quilt header '%s'" % patch, shell=True) - author = description = None - match = re.search('^Author: (.*)', header, re.MULTILINE) - if match: - author = match.group(1) - match = re.search('^Description: ((.*?)\n( .*?\n)*)', header, re.DOTALL) - if match: - description = re.sub(r'^ \.?', '', match.group(1), 0, re.MULTILINE) - description = re.sub(r'^([^.].*)\n', r'\1 ', description, 0, re.MULTILINE) - if author and description: - patchInfo.append((patch, md5, author, description)) - else: - print 'Incomplete patch header in %s' % patch - exit(1) - return patchInfo - -def get_last_patches(): - lastPatches = [] - for line in open(PATCHES_FILE, "r"): - match = re.match('(.+):(.+)', line.rstrip()) - if match: - lastPatches.append((match.group(1), match.group(2))) - return lastPatches - -def generate_patchlist(patchInfo): - patchListFile = open(PATCHES_FILE, "w") - for (fileName, md5, author, description) in patchInfo: - print >>patchListFile, "%s:%s" % (fileName, md5) - -def generate_patchinfo(patchInfo): - patchInfoFile = open(PATCH_INFO_FILE, "w") - print >>patchInfoFile, 'Patches applied to vanilla vdr sources' - print >>patchInfoFile, '--------------------------------------' - print >>patchInfoFile - for (fileName, md5, author, description) in patchInfo: - print >>patchInfoFile, fileName - print >>patchInfoFile, ' ' + author - print >>patchInfoFile - wrapper = TextWrapper(initial_indent=' ', subsequent_indent=' ', break_on_hyphens=False, width=80) - for paragraph in description.splitlines(): - print >>patchInfoFile, wrapper.fill(paragraph) - print >>patchInfoFile - -def report_patches(patches, reportText): - if len(patches) > 0: - print reportText - for p in patches: - print " " + p - print - -def check_patches(): - current_patches = [(p[0], p[1]) for p in collect_patch_info()] - last_patches = get_last_patches() - - new_patches = set(p[0] for p in current_patches) - set(p[0] for p in last_patches) - removed_patches = set(p[0] for p in last_patches) - set(p[0] for p in current_patches) - changed_patches = set(p[0] for p in (set(last_patches) - set(current_patches))) - set(removed_patches) - - 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" - 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") - -(options, args) = parser.parse_args() - -if options.doCheck: - check_patches() -elif options.doUpdate: - patchInfo = collect_patch_info() - generate_patchlist(patchInfo) - generate_patchinfo(patchInfo) -else: - parser.print_help() diff -Nru vdr-2.1.6/debian/patches/04_newplugin.patch vdr-2.1.6-297~3e4e445/debian/patches/04_newplugin.patch --- vdr-2.1.6/debian/patches/04_newplugin.patch 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/04_newplugin.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -Description: Patch for the newplugin-script, to not require a normal - vdr-source-dir -Author: Thomas Schmidt <tschmidt@debian.org> -Re-Authored: Lars Hanisch <dvb@flensrocker.de> - ---- a/newplugin -+++ b/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). -@@ -172,7 +172,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 --exclude .hg --exclude .git \$(ARCHIVE) - \@-rm -rf \$(TMPDIR)/\$(ARCHIVE) - \@echo Distribution package created as \$(PACKAGE).tgz - -@@ -346,7 +346,7 @@ - * 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" from the plugin's source directory to build your plugin - - }; - diff -Nru vdr-2.1.6/debian/patches/06_default_svdrp_port_0.patch vdr-2.1.6-297~3e4e445/debian/patches/06_default_svdrp_port_0.patch --- vdr-2.1.6/debian/patches/06_default_svdrp_port_0.patch 2014-04-02 17:59:09.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/06_default_svdrp_port_0.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -Description: This sets the default svdrp-port to 0, which means that - SVDRP is disabled by default unless someone specifies - another port with the --port option when starting vdr -Author: Thomas Schmidt <tschmidt@debian.org> - ---- a/vdr.c -+++ b/vdr.c -@@ -186,7 +186,7 @@ - // Command line options: - - #define dd(a, b) (*a ? a : b) --#define DEFAULTSVDRPPORT 6419 -+#define DEFAULTSVDRPPORT 0 - #define DEFAULTWATCHDOG 0 // seconds - #define DEFAULTVIDEODIR VIDEODIR - #define DEFAULTCONFDIR dd(CONFDIR, VideoDirectory) diff -Nru vdr-2.1.6/debian/patches/12_osdbase-maxitems.patch vdr-2.1.6-297~3e4e445/debian/patches/12_osdbase-maxitems.patch --- vdr-2.1.6/debian/patches/12_osdbase-maxitems.patch 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/12_osdbase-maxitems.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -Description: Fixes problems with text2skin skin enigma. -Author: Andreas Brugger <brougs78@gmx.net> -Origin: http://vdrportal.de/board/thread.php?postid=343665#post343665 - ---- a/osdbase.c -+++ b/osdbase.c -@@ -325,6 +325,7 @@ - - void cOsdMenu::CursorUp(void) - { -+ displayMenuItems = displayMenu->MaxItems(); - int tmpCurrent = current; - int lastOnScreen = first + displayMenuItems - 1; - int last = Count() - 1; -@@ -363,6 +364,7 @@ - - void cOsdMenu::CursorDown(void) - { -+ displayMenuItems = displayMenu->MaxItems(); - int tmpCurrent = current; - int lastOnScreen = first + displayMenuItems - 1; - int last = Count() - 1; -@@ -403,6 +405,7 @@ - - void cOsdMenu::PageUp(void) - { -+ displayMenuItems = displayMenu->MaxItems(); - int oldCurrent = current; - int oldFirst = first; - current -= displayMenuItems; -@@ -437,6 +440,7 @@ - - void cOsdMenu::PageDown(void) - { -+ displayMenuItems = displayMenu->MaxItems(); - int oldCurrent = current; - int oldFirst = first; - current += displayMenuItems; diff -Nru vdr-2.1.6/debian/patches/81_Make_config.patch vdr-2.1.6-297~3e4e445/debian/patches/81_Make_config.patch --- vdr-2.1.6/debian/patches/81_Make_config.patch 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/81_Make_config.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,85 +0,0 @@ -Description: Add Make.config to compile debug versions. -Author: Tobias Grimm <vdr@e-tobi.net> -Re-Authored: Lars Hanisch <dvb@flensrocker.de> - ---- /dev/null -+++ b/Make.config -@@ -0,0 +1,78 @@ -+# -+# User defined Makefile options for the Video Disk Recorder -+# -+# Copy this file to 'Make.config' and change the parameters as necessary. -+# -+# See the main source file 'vdr.c' for copyright information and -+# how to reach the author. -+# -+# $Id: Make.config.template 2.19 2013/02/18 10:55:39 kls Exp $ -+ -+### The C compiler and options: -+ -+CC = gcc -+CFLAGS = -g -O3 -Wall -+ -+CXX = g++ -+CXXFLAGS = -g -O3 -Wall -Werror=overloaded-virtual -Wno-parentheses -+ -+# Use 'make M32=1 ...' to build a 32-bit version of VDR on a 64-bit machine: -+ifdef M32 -+CFLAGS += -m32 -+CXXFLAGS += -m32 -+endif -+ -+### The directory environment: -+ -+# Default directories (adjust as necessary or desired): -+ -+PREFIX = /usr -+BINDIR = $(PREFIX)/bin -+INCDIR = $(PREFIX)/include -+LIBDIR = $(PREFIX)/lib/vdr/plugins -+LOCDIR = $(PREFIX)/share/locale -+MANDIR = $(PREFIX)/share/man -+PCDIR = $(PREFIX)/lib/pkgconfig -+RESDIR = $(PREFIX)/share/vdr -+#DVBDIR = /usr/src/v4l-dvb/linux/include/uapi -+ -+VIDEODIR = /srv/vdr/video.00 -+CONFDIR = /var/lib/vdr -+CACHEDIR = /var/cache/vdr -+ -+# Overrides for preset/legacy configurations: -+ -+# Use 'make LCLBLD=1' to build locale and plugin files under the source directory: -+ifdef LCLBLD -+LOCDIR = $(CWD)/locale -+PLUGINDIR = $(CWD)/PLUGINS -+ifndef PLUGIN # don't overwrite for plugins with old makefiles -+LIBDIR = $(PLUGINDIR)/lib -+endif -+HDRDIR = $(CWD)/include -+endif -+ -+# Use 'make ONEDIR=1' to have all data in one single directory: -+ifdef ONEDIR -+VIDEODIR = /video -+CACHEDIR = $(VIDEODIR) -+CONFDIR = $(VIDEODIR) -+RESDIR = $(VIDEODIR) -+endif -+ -+# Use this if you want to have a central place where you configure compile time -+# parameters for plugins: -+#PLGCFG = $(CONFDIR)/plugins.mk -+ -+### The remote control: -+ -+LIRC_DEVICE = /var/run/lirc/lircd -+ -+### Define if you want vdr to not run as root: -+#VDR_USER = vdr -+ -+### Fallback for plugins with old makefiles: -+ifdef PLUGIN -+CFLAGS += -fPIC -+CXXFLAGS += -fPIC -+endif diff -Nru vdr-2.1.6/debian/patches/82_valgrind.patch vdr-2.1.6-297~3e4e445/debian/patches/82_valgrind.patch --- vdr-2.1.6/debian/patches/82_valgrind.patch 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/82_valgrind.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,89 +0,0 @@ -Description: In order to allow valgrind to find memory leaks in VDR plugins, - VDR must not unload the plugin libraries when shutting down. This patch adds a - new option -k / --keep-plugins (which is only available in the debug build) - to disable plugin unloading. -Author: Tobias Grimm <tg@e-tobi.net> - ---- a/plugin.c -+++ b/plugin.c -@@ -176,6 +176,10 @@ - - // --- cDll ------------------------------------------------------------------ - -+#ifdef VDRDEBUG -+bool cDll::keepPlugins = false; -+#endif -+ - cDll::cDll(const char *FileName, const char *Args) - { - fileName = strdup(FileName); -@@ -187,8 +191,15 @@ - cDll::~cDll() - { - delete plugin; -+#ifdef VDRDEBUG -+ if (!keepPlugins) { -+ if (handle) -+ dlclose(handle); -+ } -+#else - if (handle) - dlclose(handle); -+#endif - free(args); - free(fileName); - } ---- a/plugin.h -+++ b/plugin.h -@@ -72,6 +72,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); ---- a/vdr.c -+++ b/vdr.c -@@ -239,6 +239,9 @@ - { "grab", required_argument, NULL, 'g' }, - { "help", no_argument, NULL, 'h' }, - { "instance", required_argument, NULL, 'i' }, -+#ifdef VDRDEBUG -+ { "keep-plugins", no_argument, NULL, 'k' }, -+#endif - { "lib", required_argument, NULL, 'L' }, - { "lirc", optional_argument, NULL, 'l' | 0x100 }, - { "localedir",required_argument, NULL, 'l' | 0x200 }, -@@ -262,7 +265,7 @@ - }; - - int c; -- while ((c = getopt_long(argc, argv, "a:c:dD:e:E:g:hi:l:L:mp:P:r:s:t:u:v:Vw:", long_options, NULL)) != -1) { -+ while ((c = getopt_long(argc, argv, "a:c:dD:e:E:g:hi:kl:L:mp:P:r:s:t:u:v:Vw:", long_options, NULL)) != -1) { - switch (c) { - case 'a': AudioCommand = optarg; - break; -@@ -354,6 +357,10 @@ - } - fprintf(stderr, "vdr: invalid instance id: %s\n", optarg); - return 2; -+#ifdef VDRDEBUG -+ case 'k': cDll::keepPlugins = true; -+ break; -+#endif - case 'l': { - char *p = strchr(optarg, '.'); - if (p) -@@ -512,6 +519,9 @@ - " or symlinks (default: none, same as -g-)\n" - " -h, --help print this help and exit\n" - " -i ID, --instance=ID use ID as the id of this VDR instance (default: 0)\n" -+#ifdef VDRDEBUG -+ " -k --keep-plugins Support valgrind by not unloading plugins\n" -+#endif - " -l LEVEL, --log=LEVEL set log level (default: 3)\n" - " 0 = no logging, 1 = errors only,\n" - " 2 = errors and info, 3 = errors, info and debug\n" diff -Nru vdr-2.1.6/debian/patches/99_ncursesw-include.patch vdr-2.1.6-297~3e4e445/debian/patches/99_ncursesw-include.patch --- vdr-2.1.6/debian/patches/99_ncursesw-include.patch 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/99_ncursesw-include.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -Description: Use ncursesw header file -Author: Tobias Grimm <tg@e-tobi.net> - ---- a/PLUGINS/src/skincurses/skincurses.c -+++ b/PLUGINS/src/skincurses/skincurses.c -@@ -6,7 +6,7 @@ - * $Id: skincurses.c 3.1 2014/01/05 10:56:27 kls Exp $ - */ - --#include <ncurses.h> -+#include <ncursesw/ncurses.h> - #include <vdr/osd.h> - #include <vdr/plugin.h> - #include <vdr/skins.h> diff -Nru vdr-2.1.6/debian/patches/list_uncritical_patches vdr-2.1.6-297~3e4e445/debian/patches/list_uncritical_patches --- vdr-2.1.6/debian/patches/list_uncritical_patches 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/list_uncritical_patches 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -#!/bin/sh - -# find all patches that don't modify any header files - -patches=`find ./ -name "*.patch"` - -for patch in $patches ; do - grep -q -e "^---.*\.h" $patch - if [ $? -ne 0 ] ; then - basename $patch - fi -done diff -Nru vdr-2.1.6/debian/patches/opt-10_vdr-2.0.3-vasarajanauloja.patch vdr-2.1.6-297~3e4e445/debian/patches/opt-10_vdr-2.0.3-vasarajanauloja.patch --- vdr-2.1.6/debian/patches/opt-10_vdr-2.0.3-vasarajanauloja.patch 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/opt-10_vdr-2.0.3-vasarajanauloja.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,1417 +0,0 @@ -Description: vasara ja nauloja - different enhancements -Author: Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi> - ---- a/cutter.c -+++ b/cutter.c -@@ -8,6 +8,7 @@ - */ - - #include "cutter.h" -+#include "interface.h" - #include "menu.h" - #include "recording.h" - #include "remux.h" -@@ -649,7 +650,7 @@ - bool cCutter::error = false; - bool cCutter::ended = false; - --bool cCutter::Start(const char *FileName) -+bool cCutter::Start(const char *FileName, const char *TargetFileName, bool Overwrite) - { - cMutexLock MutexLock(&mutex); - if (!cuttingThread) { -@@ -663,11 +664,16 @@ - if (cMark *First = FromMarks.GetNextBegin()) - Recording.SetStartTime(Recording.Start() + (int(First->Position() / Recording.FramesPerSecond() + 30) / 60) * 60); - -- const char *evn = Recording.PrefixFileName('%'); -- if (evn && RemoveVideoFile(evn) && MakeDirs(evn, true)) { -+ cString evn = (TargetFileName && *TargetFileName) ? Recording.UpdateFileName(TargetFileName) : Recording.PrefixFileName('%'); -+ if (!Overwrite && *evn && (access(*evn, F_OK) == 0) && !Interface->Confirm(tr("File already exists - overwrite?"))) { -+ do { -+ evn = PrefixVideoFileName(*evn, '%'); -+ } while (*evn && (access(*evn, F_OK) == 0)); -+ } -+ if (*evn && RemoveVideoFile(*evn) && MakeDirs(*evn, true)) { - // XXX this can be removed once RenameVideoFile() follows symlinks (see videodir.c) - // remove a possible deleted recording with the same name to avoid symlink mixups: -- char *s = strdup(evn); -+ char *s = strdup(*evn); - char *e = strrchr(s, '.'); - if (e) { - if (strcmp(e, ".rec") == 0) { ---- a/cutter.h -+++ b/cutter.h -@@ -24,7 +24,7 @@ - static bool error; - static bool ended; - public: -- static bool Start(const char *FileName); -+ static bool Start(const char *FileName, const char *TargetFileName = NULL, bool Overwrite = true); - static void Stop(void); - static bool Active(const char *FileName = NULL); - ///< Returns true if the cutter is currently active. ---- a/dvbplayer.c -+++ b/dvbplayer.c -@@ -374,11 +374,16 @@ - if (index) { - int Index = ptsIndex.FindIndex(DeviceGetSTC()); - if (Index >= 0) { -- Index -= int(round(RESUMEBACKUP * framesPerSecond)); -- if (Index > 0) -- Index = index->GetNextIFrame(Index, false); -- else -+ int backup = int(round(RESUMEBACKUP * framesPerSecond)); -+ if (Index >= index->Last() - backup) - Index = 0; -+ else { -+ Index -= backup; -+ if (Index > 0) -+ Index = index->GetNextIFrame(Index, false); -+ else -+ Index = 0; -+ } - if (Index >= 0) - return index->StoreResume(Index); - } ---- /dev/null -+++ b/filetransfer.c -@@ -0,0 +1,281 @@ -+/* -+ * filetransfer.c: The video file transfer facilities -+ * -+ * See the main source file 'vdr.c' for copyright information and -+ * how to reach the author. -+ * -+ * $Id: $ -+ */ -+ -+#include "videodir.h" -+#include "filetransfer.h" -+ -+static cString StripLastDirectory(const char *DirName) -+{ -+ if (DirName && *DirName) { -+ cString s(DirName); -+ int l = strlen(*s); -+ const char *p = *s + l; -+ while (l > 0) { -+ if (*p-- == '/') -+ break; -+ l--; -+ } -+ if (l) -+ s = s.Truncate(l); -+ return s; -+ } -+ return NULL; -+} -+ -+// --- cCopyingThread -------------------------------------------------------- -+ -+class cCopyingThread : public cThread { -+private: -+ const char *error; -+ bool deleteSource; -+ cString source; -+ cString target; -+protected: -+ virtual void Action(void); -+public: -+ cCopyingThread(const char *SourceName, const char *ToFileName, bool DeleteSource = false); -+ virtual ~cCopyingThread(); -+ const char *Error(void) { return error; } -+ }; -+ -+cCopyingThread::cCopyingThread(const char *SourceName, const char *TargetName, bool DeleteSource) -+:cThread("copying"), -+ error(NULL), -+ deleteSource(DeleteSource), -+ source(SourceName), -+ target(TargetName) -+{ -+ // add missing directory delimiters -+ const char *delim = "/"; -+ if (!endswith(*source, delim)) -+ source = cString::sprintf("%s%s", *source, delim); -+ if (!endswith(*target, delim)) -+ target = cString::sprintf("%s%s", *target, delim); -+ -+ Start(); -+} -+ -+cCopyingThread::~cCopyingThread() -+{ -+ Cancel(3); -+} -+ -+void cCopyingThread::Action(void) -+{ -+ SetPriority(19); -+ SetIOPriority(7); -+ -+ if (strcmp(*source, *target)) { -+ // validate target directory -+ if (strstr(*target, *source)) { -+ error = "invalid target"; -+ return; -+ } -+ -+ // recordings methods require the last directory delimiter to be stripped off -+ cString recname = target; -+ recname.Truncate(strlen(*recname) - 1); -+ Recordings.AddByName(*recname, false); -+ -+ RemoveFileOrDir(*target); -+ if (!MakeDirs(*target, true)) { -+ error = "MakeDirs"; -+ return; -+ } -+ -+ if (deleteSource && EntriesOnSameFileSystem(*source, *target)) { -+ if (rename(*source, *target) == -1) { -+ error = "rename"; -+ return; -+ } -+ // delete all empty source directories -+ recname = source; -+ recname.Truncate(strlen(*recname) - 1); -+ recname = StripLastDirectory(*recname); -+ do { -+ if (!RemoveEmptyDirectories(*recname, true)) -+ break; -+ recname = StripLastDirectory(*recname); -+ } -+ while (strcmp(*recname, VideoDirectory)); -+ } -+ else { -+ int required = DirSizeMB(*source); -+ int available = FreeDiskSpaceMB(*target); -+ -+ // validate free space -+ if (required < available) { -+ cReadDir d(*source); -+ struct dirent *e; -+ bool success = true; -+ -+ // allocate copying buffer -+ const int len = 1024 * 1024; -+ char *buffer = MALLOC(char, len); -+ if (!buffer) { -+ error = "MALLOC"; -+ return; -+ } -+ -+ // loop through all files, but skip all sub-directories -+ while (Running() && (e = d.Next()) != NULL) { -+ // skip generic entries -+ if (strcmp(e->d_name, ".") && strcmp(e->d_name, "..") && strcmp(e->d_name, "lost+found")) { -+ cString sourceFile = cString::sprintf("%s%s", *source, e->d_name); -+ cString targetFile = cString::sprintf("%s%s", *target, e->d_name); -+ -+ // copy only regular files -+ struct stat sts; -+ if (!stat(*sourceFile, &sts) && S_ISREG(sts.st_mode)) { -+ int r = -1, w = -1; -+ cUnbufferedFile *inputFile = cUnbufferedFile::Create(*sourceFile, O_RDONLY | O_LARGEFILE); -+ cUnbufferedFile *outputFile = cUnbufferedFile::Create(*targetFile, O_RDWR | O_CREAT | O_LARGEFILE); -+ -+ // validate files -+ if (!inputFile || !outputFile) { -+ success = false; -+ break; -+ } -+ -+ // do actual copy -+ do { -+ r = inputFile->Read(buffer, len); -+ if (r > 0) -+ w = outputFile->Write(buffer, r); -+ else -+ w = 0; -+ } while (Running() && r > 0 && w > 0); -+ DELETENULL(inputFile); -+ DELETENULL(outputFile); -+ -+ // validate result -+ if (!Running() || r < 0 || w < 0) { -+ success = false; -+ break; -+ } -+ } -+ } -+ } -+ -+ // release allocated buffer -+ free(buffer); -+ -+ // delete all created target files and directories -+ if (!success) { -+ target = StripLastDirectory(*target); -+ RemoveFileOrDir(*target, true); -+ target = StripLastDirectory(*target); -+ RemoveEmptyDirectories(*target, true); -+ error = "copy failed"; -+ return; -+ } -+ } -+ else { -+ // delete all created empty target directories -+ recname = target; -+ recname.Truncate(strlen(*recname) - 1); -+ recname = StripLastDirectory(*recname); -+ do { -+ if (!RemoveEmptyDirectories(*recname, true)) -+ break; -+ recname = StripLastDirectory(*recname); -+ } -+ while (strcmp(*recname, VideoDirectory)); -+ error = "insufficient free space"; -+ return; -+ } -+ } -+ -+ if (deleteSource) { -+ // Recordings' methods require the last directory delimiter to be stripped off -+ source.Truncate(strlen(*source) - 1); -+ cRecording *recording = Recordings.GetByName(*source); -+ if (recording->Delete()) -+ Recordings.DelByName(*source, false); -+ target.Truncate(strlen(*target) - 1); -+ Recordings.UpdateByName(*target); -+ } -+ -+ // Must inform all VDR instances about the modification -+ Recordings.TouchUpdate(); -+ } -+} -+ -+// --- cFileTransfer ---------------------------------------------------------------- -+ -+cMutex cFileTransfer::mutex; -+char *cFileTransfer::copiedVersionName = NULL; -+cCopyingThread *cFileTransfer::copyingThread = NULL; -+bool cFileTransfer::error = false; -+bool cFileTransfer::ended = false; -+ -+bool cFileTransfer::Start(cRecording *Recording, const char *FileName, bool CopyOnly) -+{ -+ cMutexLock MutexLock(&mutex); -+ if (!copyingThread) { -+ cString NewName = NewVideoFileName(Recording->FileName(), FileName); -+ error = false; -+ ended = false; -+ if (strlen(*NewName)) { -+ copiedVersionName = strdup(*NewName); -+ copyingThread = new cCopyingThread(Recording->FileName(), copiedVersionName, !CopyOnly); -+ return true; -+ } -+ } -+ return false; -+} -+ -+void cFileTransfer::Stop(void) -+{ -+ cMutexLock MutexLock(&mutex); -+ bool Interrupted = copyingThread && copyingThread->Active(); -+ const char *Error = copyingThread ? copyingThread->Error() : NULL; -+ DELETENULL(copyingThread); -+ if (Interrupted || Error) { -+ if (Interrupted) -+ isyslog("file transfer has been interrupted"); -+ if (Error) -+ esyslog("ERROR: '%s' during file transfer", Error); -+ RemoveVideoFile(copiedVersionName); //XXX what if this file is currently being replayed? -+ Recordings.DelByName(copiedVersionName); -+ free(copiedVersionName); -+ copiedVersionName = NULL; -+ } -+} -+ -+bool cFileTransfer::Active(void) -+{ -+ cMutexLock MutexLock(&mutex); -+ if (copyingThread) { -+ if (copyingThread->Active()) -+ return true; -+ error = copyingThread->Error(); -+ Stop(); -+ free(copiedVersionName); -+ copiedVersionName = NULL; -+ ended = true; -+ } -+ return false; -+} -+ -+bool cFileTransfer::Error(void) -+{ -+ cMutexLock MutexLock(&mutex); -+ bool result = error; -+ error = false; -+ return result; -+} -+ -+bool cFileTransfer::Ended(void) -+{ -+ cMutexLock MutexLock(&mutex); -+ bool result = ended; -+ ended = false; -+ return result; -+} ---- /dev/null -+++ b/filetransfer.h -@@ -0,0 +1,33 @@ -+/* -+ * filetransfer.h: The video file transfer facilities -+ * -+ * See the main source file 'vdr.c' for copyright information and -+ * how to reach the author. -+ * -+ * $Id: $ -+ */ -+ -+#ifndef __FILETRANSFER_H -+#define __FILETRANSFER_H -+ -+#include "recording.h" -+#include "thread.h" -+ -+class cCopyingThread; -+ -+class cFileTransfer { -+private: -+ static cMutex mutex; -+ static char *copiedVersionName; -+ static cCopyingThread *copyingThread; -+ static bool error; -+ static bool ended; -+public: -+ static bool Start(cRecording *Recording, const char *NewName, bool CopyOnly = false); -+ static void Stop(void); -+ static bool Active(void); -+ static bool Error(void); -+ static bool Ended(void); -+ }; -+ -+#endif //__FILETRANSFER_H ---- a/Makefile -+++ b/Makefile -@@ -67,8 +67,8 @@ - SILIB = $(LSIDIR)/libsi.a - - OBJS = audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o dvbci.o\ -- dvbplayer.o dvbspu.o dvbsubtitle.o eit.o eitscan.o epg.o filter.o font.o i18n.o interface.o keys.o\ -- lirc.o menu.o menuitems.o nit.o osdbase.o osd.o pat.o player.o plugin.o\ -+ dvbplayer.o dvbspu.o dvbsubtitle.o eit.o eitscan.o epg.o filetransfer.o filter.o font.o i18n.o\ -+ interface.o keys.o lirc.o menu.o menuitems.o nit.o osdbase.o osd.o pat.o player.o plugin.o\ - receiver.o recorder.o recording.o remote.o remux.o ringbuffer.o sdt.o sections.o shutdown.o\ - skinclassic.o skinlcars.o skins.o skinsttng.o sourceparams.o sources.o spu.o status.o svdrp.o themes.o thread.o\ - timers.o tools.o transfer.o vdr.o videodir.o ---- a/MANUAL -+++ b/MANUAL -@@ -48,7 +48,7 @@ - FastRew fast rewind - - Next Next/previous channel group (in live tv mode) -- Prev or next/previous editing mark (in replay mode) -+ Prev or binary skipping (in replay mode) - - Channel+ channel up - Channel- channel down ---- a/menu.c -+++ b/menu.c -@@ -18,6 +18,7 @@ - #include "config.h" - #include "cutter.h" - #include "eitscan.h" -+#include "filetransfer.h" - #include "i18n.h" - #include "interface.h" - #include "plugin.h" -@@ -2218,6 +2219,167 @@ - DisplayMenu->SetItem(Text(), Index, Current, Selectable); - } - -+// --- cMenuEditRecording ---------------------------------------------------- -+ -+class cMenuEditRecording : public cOsdMenu { -+private: -+ char name[MaxFileName]; -+ cMenuEditStrItem *file; -+ cOsdItem *marksItem, *resumeItem; -+ bool isResume, isMarks; -+ cRecording *recording; -+ void SetHelpKeys(void); -+ eOSState SetFolder(void); -+public: -+ cMenuEditRecording(cRecording *Recording); -+ virtual eOSState ProcessKey(eKeys Key); -+}; -+ -+cMenuEditRecording::cMenuEditRecording(cRecording *Recording) -+:cOsdMenu(tr("Edit recording"), 14) -+{ -+ cMarks marks; -+ -+ file = NULL; -+ recording = Recording; -+ -+ if (recording) { -+ Utf8Strn0Cpy(name, recording->Name(), sizeof(name)); -+ Add(file = new cMenuEditStrItem(tr("File"), name, sizeof(name))); -+ -+ Add(new cOsdItem("", osUnknown, false)); -+ -+ Add(new cOsdItem(cString::sprintf("%s:\t%s", tr("Date"), *DayDateTime(recording->Start())), osUnknown, false)); -+ -+ cChannel *channel = Channels.GetByChannelID(((cRecordingInfo *)recording->Info())->ChannelID()); -+ if (channel) -+ Add(new cOsdItem(cString::sprintf("%s:\t%s", tr("Channel"), *ChannelString(channel, 0)), osUnknown, false)); -+ -+ int recLen = recording->LengthInSeconds(); -+ if (recLen >= 0) -+ Add(new cOsdItem(cString::sprintf("%s:\t%d:%02d:%02d", tr("Length"), recLen / 3600, recLen / 60 % 60, recLen % 60), osUnknown, false)); -+ else -+ recLen = 0; -+ -+ int dirSize = DirSizeMB(recording->FileName()); -+ cString bitRate = recLen ? cString::sprintf(" (%.2f MBit/s)", 8.0 * dirSize / recLen) : cString(""); -+ Add(new cOsdItem(cString::sprintf("%s:\t%s", tr("Format"), recording->IsPesRecording() ? tr("PES") : tr("TS")), osUnknown, false)); -+ Add(new cOsdItem((dirSize > 9999) ? cString::sprintf("%s:\t%.2f GB%s", tr("Size"), dirSize / 1024.0, *bitRate) : cString::sprintf("%s:\t%d MB%s", tr("Size"), dirSize, *bitRate), osUnknown, false)); -+ -+ Add(new cOsdItem("", osUnknown, false)); -+ -+ isMarks = marks.Load(recording->FileName(), recording->FramesPerSecond(), recording->IsPesRecording()) && marks.Count(); -+ marksItem = new cOsdItem(tr("Delete marks information?"), osUser1, isMarks); -+ Add(marksItem); -+ -+ cResumeFile ResumeFile(recording->FileName(), recording->IsPesRecording()); -+ isResume = (ResumeFile.Read() != -1); -+ resumeItem = new cOsdItem(tr("Delete resume information?"), osUser2, isResume); -+ Add(resumeItem); -+ } -+ -+ SetHelpKeys(); -+} -+ -+void cMenuEditRecording::SetHelpKeys(void) -+{ -+ SetHelp(tr("Button$Folder"), tr("Button$Cut"), tr("Button$Copy"), tr("Button$Rename/Move")); -+} -+ -+eOSState cMenuEditRecording::SetFolder(void) -+{ -+ cMenuFolder *mf = (cMenuFolder *)SubMenu(); -+ if (mf) { -+ cString Folder = mf->GetFolder(); -+ char *p = strrchr(name, FOLDERDELIMCHAR); -+ if (p) -+ p++; -+ else -+ p = name; -+ if (!isempty(*Folder)) -+ strn0cpy(name, cString::sprintf("%s%c%s", *Folder, FOLDERDELIMCHAR, p), sizeof(name)); -+ else if (p != name) -+ memmove(name, p, strlen(p) + 1); -+ SetCurrent(file); -+ Display(); -+ } -+ return CloseSubMenu(); -+} -+ -+eOSState cMenuEditRecording::ProcessKey(eKeys Key) -+{ -+ eOSState state = cOsdMenu::ProcessKey(Key); -+ -+ if (state == osUnknown) { -+ switch (Key) { -+ case kRed: -+ return AddSubMenu(new cMenuFolder(tr("Select folder"), &Folders, name)); -+ break; -+ case kGreen: -+ if (!cCutter::Active()) { -+ if (!isMarks) -+ Skins.Message(mtError, tr("No editing marks defined!")); -+ else if (!cCutter::Start(recording->FileName(), strcmp(recording->Name(), name) ? *NewVideoFileName(recording->FileName(), name) : NULL, false)) -+ Skins.Message(mtError, tr("Can't start editing process!")); -+ else -+ Skins.Message(mtInfo, tr("Editing process started")); -+ } -+ else -+ Skins.Message(mtError, tr("Editing process already active!")); -+ return osContinue; -+ case kYellow: -+ case kBlue: -+ if (strcmp(recording->Name(), name)) { -+ if (!cFileTransfer::Active()) { -+ if (cFileTransfer::Start(recording, name, (Key == kYellow))) -+ Skins.Message(mtInfo, tr("File transfer started")); -+ else -+ Skins.Message(mtError, tr("Can't start file transfer!")); -+ } -+ else -+ Skins.Message(mtError, tr("File transfer already active!")); -+ } -+ return osRecordings; -+ default: -+ break; -+ } -+ return osContinue; -+ } -+ else if (state == osEnd && HasSubMenu()) -+ state = SetFolder(); -+ else if (state == osUser1) { -+ if (isMarks && Interface->Confirm(tr("Delete marks information?"))) { -+ cMarks marks; -+ marks.Load(recording->FileName(), recording->FramesPerSecond(), recording->IsPesRecording()); -+ cMark *mark = marks.First(); -+ while (mark) { -+ cMark *nextmark = marks.Next(mark); -+ marks.Del(mark); -+ mark = nextmark; -+ } -+ marks.Save(); -+ isMarks = false; -+ marksItem->SetSelectable(isMarks); -+ SetCurrent(First()); -+ Display(); -+ } -+ return osContinue; -+ } -+ else if (state == osUser2) { -+ if (isResume && Interface->Confirm(tr("Delete resume information?"))) { -+ cResumeFile ResumeFile(recording->FileName(), recording->IsPesRecording()); -+ ResumeFile.Delete(); -+ isResume = false; -+ resumeItem->SetSelectable(isResume); -+ SetCurrent(First()); -+ Display(); -+ } -+ return osContinue; -+ } -+ -+ return state; -+} -+ - // --- cMenuRecordings ------------------------------------------------------- - - cMenuRecordings::cMenuRecordings(const char *Base, int Level, bool OpenSubMenus) -@@ -2458,6 +2620,16 @@ - return osContinue; - } - -+eOSState cMenuRecordings::Edit(void) -+{ -+ if (HasSubMenu() || Count() == 0) -+ return osContinue; -+ cMenuRecordingItem *ri = (cMenuRecordingItem *)Get(Current()); -+ if (ri && !ri->IsDirectory() && ri->Recording()) -+ return AddSubMenu(new cMenuEditRecording(ri->Recording())); -+ return osContinue; -+} -+ - eOSState cMenuRecordings::ProcessKey(eKeys Key) - { - bool HadSubMenu = HasSubMenu(); -@@ -2471,7 +2643,7 @@ - case kRed: return (helpKeys > 1 && RecordingCommands.Count()) ? Commands() : Play(); - case kGreen: return Rewind(); - case kYellow: return Delete(); -- case kInfo: -+ case kInfo: return Edit(); - case kBlue: return Info(); - case k0: return Sort(); - case k1...k9: return Commands(Key); -@@ -3371,6 +3543,7 @@ - replaying = false; - stopReplayItem = NULL; - cancelEditingItem = NULL; -+ cancelFileTransferItem = NULL; - stopRecordingItem = NULL; - recordControlsState = 0; - Set(); -@@ -3465,6 +3638,19 @@ - result = true; - } - -+ // File transfer control: -+ bool FileTransferActive = cFileTransfer::Active(); -+ if (FileTransferActive && !cancelFileTransferItem) { -+ // TRANSLATORS: note the leading blank! -+ Add(cancelFileTransferItem = new cOsdItem(tr(" Cancel file transfer"), osCancelTransfer)); -+ result = true; -+ } -+ else if (cancelFileTransferItem && !FileTransferActive) { -+ Del(cancelFileTransferItem->Index()); -+ cancelFileTransferItem = NULL; -+ result = true; -+ } -+ - // Record control: - if (cRecordControls::StateChanged(recordControlsState)) { - while (stopRecordingItem) { -@@ -3513,6 +3699,12 @@ - return osEnd; - } - break; -+ case osCancelTransfer: -+ if (Interface->Confirm(tr("Cancel file transfer?"))) { -+ cFileTransfer::Stop(); -+ return osEnd; -+ } -+ break; - case osPlugin: { - cMenuPluginItem *item = (cMenuPluginItem *)Get(Current()); - if (item) { -@@ -4486,6 +4678,10 @@ - - // --- cReplayControl -------------------------------------------------------- - -+#define REPLAYCONTROLSKIPLIMIT 9 // s -+#define REPLAYCONTROLSKIPSECONDS 90 // s -+#define REPLAYCONTROLSKIPTIMEOUT 5000 // ms -+ - cReplayControl *cReplayControl::currentReplayControl = NULL; - cString cReplayControl::fileName; - -@@ -4500,6 +4696,9 @@ - lastCurrent = lastTotal = -1; - lastPlay = lastForward = false; - lastSpeed = -2; // an invalid value -+ lastSkipKey = kNone; -+ lastSkipSeconds = REPLAYCONTROLSKIPSECONDS; -+ lastSkipTimeout.Set(0); - timeoutShow = 0; - timeSearchActive = false; - cRecording Recording(fileName); -@@ -4836,7 +5035,7 @@ - Skins.Message(mtError, tr("No editing marks defined!")); - else if (!marks.GetNumSequences()) - Skins.Message(mtError, tr("No editing sequences defined!")); -- else if (!cCutter::Start(fileName)) -+ else if (!cCutter::Start(fileName, NULL, false)) - Skins.Message(mtError, tr("Can't start editing process!")); - else - Skins.Message(mtInfo, tr("Editing process started")); -@@ -4934,6 +5133,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(); -@@ -4943,12 +5168,8 @@ - switch (int(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: ---- a/menu.h -+++ b/menu.h -@@ -101,6 +101,7 @@ - bool replaying; - cOsdItem *stopReplayItem; - cOsdItem *cancelEditingItem; -+ cOsdItem *cancelFileTransferItem; - cOsdItem *stopRecordingItem; - int recordControlsState; - static cOsdObject *pluginOsdObject; -@@ -206,6 +207,7 @@ - eOSState Info(void); - eOSState Sort(void); - eOSState Commands(eKeys Key = kNone); -+ eOSState Edit(void); - protected: - cString DirectoryName(void); - public: -@@ -264,6 +266,9 @@ - int lastCurrent, lastTotal; - bool lastPlay, lastForward; - int lastSpeed; -+ int lastSkipSeconds; -+ eKeys lastSkipKey; -+ cTimeMs lastSkipTimeout; - time_t timeoutShow; - bool timeSearchActive, timeSearchHide; - int timeSearchTime, timeSearchPos; ---- a/osdbase.c -+++ b/osdbase.c -@@ -82,6 +82,7 @@ - { - isMenu = true; - digit = 0; -+ key_nr = -1; - hasHotkeys = false; - displayMenuItems = 0; - title = NULL; -@@ -131,7 +132,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; - } - } -@@ -481,20 +482,60 @@ - } - } - -+#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; - } - -@@ -533,8 +574,8 @@ - } - } - switch (int(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: ---- a/osdbase.h -+++ b/osdbase.h -@@ -30,6 +30,7 @@ - osStopRecord, - osStopReplay, - osCancelEdit, -+ osCancelTransfer, - osSwitchDvb, - osBack, - osEnd, -@@ -98,6 +99,8 @@ - char *status; - int digit; - bool hasHotkeys; -+ int key_nr; -+ cTimeMs lastActivity; - void DisplayHelp(bool Force = false); - protected: - void SetDisplayMenu(void); ---- a/po/de_DE.po -+++ b/po/de_DE.po -@@ -1398,3 +1398,70 @@ - - msgid "free" - msgstr "frei" -+ -+msgid "Edit recording" -+msgstr "Aufnahme bearbeiten" -+ -+msgid "Button$Cut" -+msgstr "Schneiden" -+ -+msgid "Button$Copy" -+msgstr "Kopieren" -+ -+msgid "Button$Rename/Move" -+msgstr "Umbenennen/Bewegen" -+ -+msgid "Date" -+msgstr "Datum" -+ -+msgid "Length" -+msgstr "Lnge" -+ -+msgid "Format" -+msgstr "Format" -+ -+msgid "PES" -+msgstr "PES" -+ -+msgid "TS" -+msgstr "TS" -+ -+msgid "Size" -+msgstr "Gre" -+ -+msgid "Delete marks information?" -+msgstr "Gespeicherte Schnittmarken lschen?" -+ -+msgid "Delete resume information?" -+msgstr "Gespeicherten Zeitpunkt der letzten Wiedergabe lschen?" -+ -+msgid "File transfer started" -+msgstr "Dateibertragung gestartet" -+ -+msgid "Can't start file transfer!" -+msgstr "Dateibertragung kann nicht gestartet werden!" -+ -+msgid "File transfer already active!" -+msgstr "Dateibertragung bereits aktiv!" -+ -+#. TRANSLATORS: note the leading blank! -+msgid " Cancel file transfer" -+msgstr " Dateibertragung beenden" -+ -+msgid "Cancel file transfer?" -+msgstr "Dateibertragung beenden?" -+ -+msgid "Transfering file - shut down anyway?" -+msgstr "bertrage Datei - trotzdem ausschalten?" -+ -+msgid "Transfering file - restart anyway?" -+msgstr "bertrage Datei - trotzdem neustarten?" -+ -+msgid "File transfer failed!" -+msgstr "Dateibertragung fehlgeschlagen!" -+ -+msgid "File transfer finished" -+msgstr "Dateibertragung fertiggestellt" -+ -+msgid "File already exists - overwrite?" -+msgstr "Datei besteht bereits - berschreiben?" ---- a/po/fi_FI.po -+++ b/po/fi_FI.po -@@ -1402,3 +1402,70 @@ - - msgid "free" - msgstr "vapaana" -+ -+msgid "Edit recording" -+msgstr "Muokkaa tallennetta" -+ -+msgid "Button$Cut" -+msgstr "Leikkaa" -+ -+msgid "Button$Copy" -+msgstr "Kopioi" -+ -+msgid "Button$Rename/Move" -+msgstr "Nimeä/Siirrä" -+ -+msgid "Date" -+msgstr "Päiväys" -+ -+msgid "Length" -+msgstr "Pituus" -+ -+msgid "Format" -+msgstr "Tiedostomuoto" -+ -+msgid "PES" -+msgstr "PES" -+ -+msgid "TS" -+msgstr "TS" -+ -+msgid "Size" -+msgstr "Koko" -+ -+msgid "Delete marks information?" -+msgstr "Poista tallenteen merkinnät?" -+ -+msgid "Delete resume information?" -+msgstr "Poista tallenteen paluutiedot?" -+ -+msgid "File transfer started" -+msgstr "Tiedoston siirto aloitettu" -+ -+msgid "Can't start file transfer!" -+msgstr "Tiedoston siirron aloitus epäonnistui!" -+ -+msgid "File transfer already active!" -+msgstr "Tiedoston siirto on jo käynnissä!" -+ -+#. TRANSLATORS: note the leading blank! -+msgid " Cancel file transfer" -+msgstr " Peru tiedoston siirto" -+ -+msgid "Cancel file transfer?" -+msgstr "Perutaanko tiedoston siirto?" -+ -+msgid "Transfering file - shut down anyway?" -+msgstr "Tiedoston siirto kesken - sammutetaanko?" -+ -+msgid "Transfering file - restart anyway?" -+msgstr "Tiedoston siirto kesken - käynnistetäänkö uudelleen?" -+ -+msgid "File transfer failed!" -+msgstr "Tiedoston siirto epäonnistui!" -+ -+msgid "File transfer finished" -+msgstr "Tiedoston siirto valmis" -+ -+msgid "File already exists - overwrite?" -+msgstr "Tiedosto on jo olemassa - ylikirjoitetaanko?" ---- a/po/hu_HU.po -+++ b/po/hu_HU.po -@@ -1402,3 +1402,70 @@ - - msgid "free" - msgstr "szabad" -+ -+msgid "Edit recording" -+msgstr "Felvétel szerkesztése" -+ -+msgid "Button$Cut" -+msgstr "Vágás" -+ -+msgid "Button$Copy" -+msgstr "Másolás" -+ -+msgid "Button$Rename/Move" -+msgstr "Áthelyezés" -+ -+msgid "Date" -+msgstr "Dátum" -+ -+msgid "Length" -+msgstr "Hossz" -+ -+msgid "Format" -+msgstr "Formátum" -+ -+msgid "PES" -+msgstr "PES" -+ -+msgid "TS" -+msgstr "TS" -+ -+msgid "Size" -+msgstr "Méret" -+ -+msgid "Delete marks information?" -+msgstr "Vágópontok törlése?" -+ -+msgid "Delete resume information?" -+msgstr "Lejátszott pozició törlése?" -+ -+msgid "File transfer started" -+msgstr "Áthelyezés folyamatban" -+ -+msgid "Can't start file transfer!" -+msgstr "Áthelyezés nem indítható" -+ -+msgid "File transfer already active!" -+msgstr "Áthelyezés már aktív!" -+ -+#. TRANSLATORS: note the leading blank! -+msgid " Cancel file transfer" -+msgstr " Áthelyezés megszakítása" -+ -+msgid "Cancel file transfer?" -+msgstr "Áthelyezés megszakítása?" -+ -+msgid "Transfering file - shut down anyway?" -+msgstr "Áthelyezése folyamatban - biztos leállítjuk?" -+ -+msgid "Transfering file - restart anyway?" -+msgstr "Áthelyezés folyamatban - biztos újraindítjuk?" -+ -+msgid "File transfer failed!" -+msgstr "Sikertelen áthelyezés!" -+ -+msgid "File transfer finished" -+msgstr "Áthelyezés befejezve" -+ -+msgid "File already exists - overwrite?" -+msgstr "A file létezik - felülírjam?" ---- a/recording.c -+++ b/recording.c -@@ -1072,6 +1072,16 @@ - return NULL; - } - -+const char *cRecording::UpdateFileName(const char *FileName) -+{ -+ if (FileName && *FileName) { -+ free(fileName); -+ fileName = strdup(FileName); -+ return fileName; -+ } -+ return NULL; -+} -+ - int cRecording::HierarchyLevels(void) const - { - const char *s = name; -@@ -1364,7 +1374,7 @@ - } - } - --void cRecordings::DelByName(const char *FileName) -+void cRecordings::DelByName(const char *FileName, bool RemoveRecording) - { - LOCK_THREAD; - cRecording *recording = GetByName(FileName); -@@ -1372,7 +1382,7 @@ - cThreadLock DeletedRecordingsLock(&DeletedRecordings); - Del(recording, false); - char *ext = strrchr(recording->fileName, '.'); -- if (ext) { -+ if (ext && RemoveRecording) { - strncpy(ext, DELEXT, strlen(ext)); - if (access(recording->FileName(), F_OK) == 0) { - recording->deleted = time(NULL); -@@ -2400,7 +2410,7 @@ - - // --- Recordings Sort Mode -------------------------------------------------- - --eRecordingsSortMode RecordingsSortMode = rsmName; -+eRecordingsSortMode RecordingsSortMode = rsmTime; - - bool HasRecordingsSortMode(const char *Directory) - { ---- a/recording.h -+++ b/recording.h -@@ -119,6 +119,7 @@ - const char *Title(char Delimiter = ' ', bool NewIndicator = false, int Level = -1) const; - const cRecordingInfo *Info(void) const { return info; } - const char *PrefixFileName(char Prefix); -+ const char *UpdateFileName(const char *FileName); - int HierarchyLevels(void) const; - void ResetResume(void) const; - double FramesPerSecond(void) const { return framesPerSecond; } -@@ -130,7 +131,7 @@ - int FileSizeMB(void) const; - ///< Returns the total file size of this recording (in MB), or -1 if the file - ///< size is unknown. -- bool IsNew(void) const { return GetResume() <= 0; } -+ bool IsNew(void) const { return GetResume() < 0; } - bool IsEdited(void) const; - bool IsPesRecording(void) const { return isPesRecording; } - bool IsOnVideoDirectoryFileSystem(void) const; -@@ -191,7 +192,7 @@ - void ClearSortNames(void); - cRecording *GetByName(const char *FileName); - void AddByName(const char *FileName, bool TriggerUpdate = true); -- void DelByName(const char *FileName); -+ void DelByName(const char *FileName, bool RemoveRecording = true); - void UpdateByName(const char *FileName); - int TotalFileSizeMB(void); - double MBperMinute(void); ---- a/shutdown.c -+++ b/shutdown.c -@@ -17,6 +17,7 @@ - #include "channels.h" - #include "config.h" - #include "cutter.h" -+#include "filetransfer.h" - #include "i18n.h" - #include "interface.h" - #include "menu.h" -@@ -171,6 +172,10 @@ - if (!Interactive || !Interface->Confirm(tr("Editing - shut down anyway?"))) - return false; - } -+ if (cFileTransfer::Active()) { -+ if (!Interactive || !Interface->Confirm(tr("Transfering file - shut down anyway?"))) -+ return false; -+ } - - cTimer *timer = Timers.GetNextActiveTimer(); - time_t Next = timer ? timer->StartTime() : 0; -@@ -214,6 +219,10 @@ - if (!Interactive || !Interface->Confirm(tr("Editing - restart anyway?"))) - return false; - } -+ if (cFileTransfer::Active()) { -+ if (!Interactive || !Interface->Confirm(tr("Transfering file - restart anyway?"))) -+ return false; -+ } - - cTimer *timer = Timers.GetNextActiveTimer(); - time_t Next = timer ? timer->StartTime() : 0; ---- a/svdrp.c -+++ b/svdrp.c -@@ -31,6 +31,7 @@ - #include "cutter.h" - #include "device.h" - #include "eitscan.h" -+#include "filetransfer.h" - #include "keys.h" - #include "menu.h" - #include "plugin.h" -@@ -193,6 +194,11 @@ - " After a CLRE command, no further EPG processing is done for 10\n" - " seconds, so that data sent with subsequent PUTE commands doesn't\n" - " interfere with data from the broadcasters.", -+ "CPYR <number> <new name>\n" -+ " Copy the recording with the given number. Before a recording can be\n" -+ " copied, an LSTR command must have been executed in order to retrieve\n" -+ " the recording numbers. The numbers don't change during subsequent CPYR\n" -+ " commands.", - "DELC <number>\n" - " Delete channel.", - "DELR <number>\n" -@@ -258,6 +264,11 @@ - " used to easily activate or deactivate a timer.", - "MOVC <number> <to>\n" - " Move a channel to a new position.", -+ "MOVR <number> <new name>\n" -+ " Move the recording with the given number. Before a recording can be\n" -+ " moved, an LSTR command must have been executed in order to retrieve\n" -+ " the recording numbers. The numbers don't change during subsequent MOVR\n" -+ " commands.", - "NEWC <settings>\n" - " Create a new channel. Settings must be in the same format as returned\n" - " by the LSTC command.", -@@ -612,6 +623,32 @@ - } - } - -+void cSVDRP::CmdCPYR(const char *Option) -+{ -+ if (*Option) { -+ char *tail; -+ int n = strtol(Option, &tail, 10); -+ cRecording *recording = recordings.Get(n - 1); -+ if (recording && tail && tail != Option) { -+ char *oldName = strdup(recording->Name()); -+ tail = skipspace(tail); -+ if (!cFileTransfer::Active()) { -+ if (cFileTransfer::Start(recording, tail, true)) -+ Reply(250, "Copying recording \"%s\" to \"%s\"", oldName, tail); -+ else -+ Reply(554, "Can't start file transfer"); -+ } -+ else -+ Reply(554, "File transfer already active"); -+ free(oldName); -+ } -+ else -+ Reply(550, "Recording \"%d\" not found%s", n, recordings.Count() ? "" : " (use LSTR before copying)"); -+ } -+ else -+ Reply(501, "Invalid Option \"%s\"", Option); -+} -+ - void cSVDRP::CmdDELC(const char *Option) - { - if (*Option) { -@@ -1320,6 +1357,32 @@ - Reply(501, "Missing channel number"); - } - -+void cSVDRP::CmdMOVR(const char *Option) -+{ -+ if (*Option) { -+ char *tail; -+ int n = strtol(Option, &tail, 10); -+ cRecording *recording = recordings.Get(n - 1); -+ if (recording && tail && tail != Option) { -+ char *oldName = strdup(recording->Name()); -+ tail = skipspace(tail); -+ if (!cFileTransfer::Active()) { -+ if (cFileTransfer::Start(recording, tail)) -+ Reply(250, "Moving recording \"%s\" to \"%s\"", oldName, tail); -+ else -+ Reply(554, "Can't start file transfer"); -+ } -+ else -+ Reply(554, "File transfer already active"); -+ free(oldName); -+ } -+ else -+ Reply(550, "Recording \"%d\" not found%s", n, recordings.Count() ? "" : " (use LSTR before moving)"); -+ } -+ else -+ Reply(501, "Invalid Option \"%s\"", Option); -+} -+ - void cSVDRP::CmdNEWC(const char *Option) - { - if (*Option) { -@@ -1644,6 +1707,7 @@ - s = skipspace(s); - if (CMD("CHAN")) CmdCHAN(s); - else if (CMD("CLRE")) CmdCLRE(s); -+ else if (CMD("CPYR")) CmdCPYR(s); - else if (CMD("DELC")) CmdDELC(s); - else if (CMD("DELR")) CmdDELR(s); - else if (CMD("DELT")) CmdDELT(s); -@@ -1659,6 +1723,7 @@ - else if (CMD("MODC")) CmdMODC(s); - else if (CMD("MODT")) CmdMODT(s); - else if (CMD("MOVC")) CmdMOVC(s); -+ else if (CMD("MOVR")) CmdMOVR(s); - else if (CMD("NEWC")) CmdNEWC(s); - else if (CMD("NEWT")) CmdNEWT(s); - else if (CMD("NEXT")) CmdNEXT(s); ---- a/svdrp.h -+++ b/svdrp.h -@@ -56,6 +56,7 @@ - void PrintHelpTopics(const char **hp); - void CmdCHAN(const char *Option); - void CmdCLRE(const char *Option); -+ void CmdCPYR(const char *Option); - void CmdDELC(const char *Option); - void CmdDELR(const char *Option); - void CmdDELT(const char *Option); -@@ -71,6 +72,7 @@ - void CmdMODC(const char *Option); - void CmdMODT(const char *Option); - void CmdMOVC(const char *Option); -+ void CmdMOVR(const char *Option); - void CmdNEWC(const char *Option); - void CmdNEWT(const char *Option); - void CmdNEXT(const char *Option); ---- a/vdr.c -+++ b/vdr.c -@@ -45,6 +45,7 @@ - #include "dvbdevice.h" - #include "eitscan.h" - #include "epg.h" -+#include "filetransfer.h" - #include "i18n.h" - #include "interface.h" - #include "keys.h" -@@ -1331,6 +1332,12 @@ - else - Skins.Message(mtInfo, tr("Editing process finished")); - } -+ if (!cFileTransfer::Active() && cFileTransfer::Ended()) { -+ if (cFileTransfer::Error()) -+ Skins.Message(mtError, tr("File transfer failed!")); -+ else -+ Skins.Message(mtInfo, tr("File transfer finished")); -+ } - } - - // SIGHUP shall cause a restart: -@@ -1346,7 +1353,7 @@ - ShutdownHandler.countdown.Cancel(); - } - -- if ((Now - LastInteract) > ACTIVITYTIMEOUT && !cRecordControls::Active() && !cCutter::Active() && !Interface->HasSVDRPConnection() && (Now - cRemote::LastActivity()) > ACTIVITYTIMEOUT) { -+ if ((Now - LastInteract) > ACTIVITYTIMEOUT && !cRecordControls::Active() && !cCutter::Active() && !cFileTransfer::Active() && !Interface->HasSVDRPConnection() && (Now - cRemote::LastActivity()) > ACTIVITYTIMEOUT) { - // Handle housekeeping tasks - - // Shutdown: -@@ -1395,6 +1402,7 @@ - - PluginManager.StopPlugins(); - cRecordControls::Shutdown(); -+ cFileTransfer::Stop(); - cCutter::Stop(); - delete Menu; - cControl::Shutdown(); ---- a/videodir.c -+++ b/videodir.c -@@ -229,6 +229,22 @@ - return NULL; - } - -+cString NewVideoFileName(const char *FileName, const char *NewDirName) -+{ -+ char *NewDir = ExchangeChars(strdup(NewDirName), true); -+ if (NewDir) { -+ const char *p = FileName + strlen(FileName); // p points at the terminating 0 -+ while (p-- > FileName) { -+ if (*p == '/') -+ break; -+ } -+ cString NewName = cString::sprintf("%s/%s%s", VideoDirectory, NewDir, p); -+ free(NewDir); -+ return NewName; -+ } -+ return NULL; -+} -+ - void RemoveEmptyVideoDirectories(const char *IgnoreFiles[]) - { - cVideoDirectory Dir; ---- a/videodir.h -+++ b/videodir.h -@@ -23,6 +23,7 @@ - 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); -+cString NewVideoFileName(const char *FileName, const char *NewDirName); - void RemoveEmptyVideoDirectories(const char *IgnoreFiles[] = NULL); - bool IsOnVideoDirectoryFileSystem(const char *FileName); - diff -Nru vdr-2.1.6/debian/patches/opt-22-x_edit_marks.patch vdr-2.1.6-297~3e4e445/debian/patches/opt-22-x_edit_marks.patch --- vdr-2.1.6/debian/patches/opt-22-x_edit_marks.patch 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/opt-22-x_edit_marks.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,67 +0,0 @@ -Description: Patch adds keys '1', '3' in replay mode to move marks by +/-5secs. - When in replay mode key '0' sets a mark and stops there. - 'Green' and 'Yellow' act as 'Prev' and 'Next'. -Author: FrankJepsen at vdrportal.de -Origin: http://vdrportal.de/board/thread.php?postid=718583#post718583 - ---- a/menu.c -+++ b/menu.c -@@ -5133,10 +5133,6 @@ - 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; -@@ -5164,10 +5160,46 @@ - Stop(); - return osEnd; - default: { -+ bool play, forward; -+ int speed; -+ int Current, Total; -+ cMark *m; -+ - DoShowMode = false; - switch (int(Key)) { - // Editing: -- case kMarkToggle: MarkToggle(); break; -+ case k1|k_Repeat: -+ case k1: if (GetReplayMode(play, forward, speed) && !play && GetIndex(Current, Total) && (m = marks.Get(Current)) != NULL) { -+ displayFrames = true; -+ int p = SkipFrames(-SecondsToFrames(5, FramesPerSecond())); -+ cMark *m2; -+ if ((m2 = marks.Prev(m)) != NULL && m2->Position() >= p) -+ break; -+ m->SetPosition(p); Goto(p, true); -+ marks.Save(); -+ } -+ else -+ SkipSeconds(-20); -+ break; -+ case k3|k_Repeat: -+ case k3: if (GetReplayMode(play, forward, speed) && !play && GetIndex(Current, Total) && (m = marks.Get(Current)) != NULL) { -+ displayFrames = true; -+ int p = SkipFrames(SecondsToFrames(5, FramesPerSecond())); -+ cMark *m2; -+ if ((m2 = marks.Next(m)) != NULL && m2->Position() <= p) -+ break; -+ m->SetPosition(p); Goto(p, true); -+ marks.Save(); -+ } -+ else -+ SkipSeconds(20); -+ break; -+ case kMarkToggle: if (GetReplayMode(play, forward, speed) && play) { -+ displayFrames = true; -+ Pause(); -+ } -+ MarkToggle(); -+ break; - case kMarkJumpBack|k_Repeat: - case kMarkJumpBack: MarkJump(false); break; - case kMarkJumpForward|k_Repeat: diff -Nru vdr-2.1.6/debian/patches/opt-24_jumpplay.patch vdr-2.1.6-297~3e4e445/debian/patches/opt-24_jumpplay.patch --- vdr-2.1.6/debian/patches/opt-24_jumpplay.patch 2014-04-02 17:59:19.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/opt-24_jumpplay.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,398 +0,0 @@ -Description: Play after jump to next mark. Automatically jump over commercial breaks. - See README.jumpplay and MANUAL for details. - 2011-03-19: Remove marks reloading for VDR-1.7.17, by Udo Richter <udo_richter@gmx.de> -Author: Torsten Kunkel <vdr@tkunkel.de>, Thomas Günther <tom@toms-cafe.de> -Origin: http://toms-cafe.de/vdr/download/vdr-jumpplay-1.0-1.7.6.diff - ---- a/MANUAL -+++ b/MANUAL -@@ -949,6 +949,25 @@ - 0 resulting in a file named 'resume', and any other - value resulting in 'resume.n'. - -+ 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. -+ - Miscellaneous: - - Min. event timeout = 30 ---- /dev/null -+++ b/README.jumpplay -@@ -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) ---- a/config.c -+++ b/config.c -@@ -471,6 +471,9 @@ - ProgressDisplayTime = 0; - PauseOnMarkSet = 0; - ResumeID = 0; -+ JumpPlay = 0; -+ PlayJump = 0; -+ PauseLastMark = 0; - CurrentChannel = -1; - CurrentVolume = MAXVOLUME; - CurrentDolby = 0; -@@ -682,6 +685,9 @@ - else if (!strcasecmp(Name, "ProgressDisplayTime")) ProgressDisplayTime= atoi(Value); - else if (!strcasecmp(Name, "PauseOnMarkSet")) PauseOnMarkSet = 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, "CurrentChannel")) CurrentChannel = atoi(Value); - else if (!strcasecmp(Name, "CurrentVolume")) CurrentVolume = atoi(Value); - else if (!strcasecmp(Name, "CurrentDolby")) CurrentDolby = atoi(Value); -@@ -797,6 +803,9 @@ - Store("ProgressDisplayTime",ProgressDisplayTime); - Store("PauseOnMarkSet", PauseOnMarkSet); - Store("ResumeID", ResumeID); -+ Store("JumpPlay", JumpPlay); -+ Store("PlayJump", PlayJump); -+ Store("PauseLastMark", PauseLastMark); - Store("CurrentChannel", CurrentChannel); - Store("CurrentVolume", CurrentVolume); - Store("CurrentDolby", CurrentDolby); ---- a/config.h -+++ b/config.h -@@ -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 110 -+ - #define MAXPRIORITY 99 - #define MINPRIORITY (-MAXPRIORITY) - #define LIVEPRIORITY 0 // priority used when selecting a device for live viewing -@@ -334,6 +336,9 @@ - int ProgressDisplayTime; - int PauseOnMarkSet; - int ResumeID; -+ int JumpPlay; -+ int PlayJump; -+ int PauseLastMark; - int CurrentChannel; - int CurrentVolume; - int CurrentDolby; ---- a/dvbplayer.c -+++ b/dvbplayer.c -@@ -211,6 +211,7 @@ - cNonBlockingFileReader *nonBlockingFileReader; - cRingBufferFrame *ringBuffer; - cPtsIndex ptsIndex; -+ cMarks marks; - cFileName *fileName; - cIndexFile *index; - cUnbufferedFile *replayFile; -@@ -296,6 +297,7 @@ - } - else if (PauseLive) - framesPerSecond = cRecording(FileName).FramesPerSecond(); // the fps rate might have changed from the default -+ marks.Load(FileName, framesPerSecond, isPesRecording); - } - - cDvbPlayer::~cDvbPlayer() -@@ -374,6 +376,10 @@ - if (index) { - int Index = ptsIndex.FindIndex(DeviceGetSTC()); - if (Index >= 0) { -+ // set resume position to 0 if replay stops at the first mark -+ if (Setup.PlayJump && marks.First() && -+ abs(Index - marks.First()->Position()) <= int(round(RESUMEBACKUP * framesPerSecond))) -+ Index = 0; - Index -= int(round(RESUMEBACKUP * framesPerSecond)); - if (Index > 0) - Index = index->GetNextIFrame(Index, false); -@@ -400,11 +406,26 @@ - { - uchar *p = NULL; - int pc = 0; -+ bool cutIn = false; -+ int total = -1; - - readIndex = Resume(); - if (readIndex >= 0) - isyslog("resuming replay at index %d (%s)", readIndex, *IndexToHMSF(readIndex, true, framesPerSecond)); - -+ if (Setup.PlayJump && readIndex <= 0 && marks.First() && index) { -+ int Index = marks.First()->Position(); -+ uint16_t FileNumber; -+ off_t FileOffset; -+ if (index->Get(Index, &FileNumber, &FileOffset) && -+ NextFile(FileNumber, FileOffset)) { -+ isyslog("PlayJump: start replay at first mark %d (%s)", -+ Index, *IndexToHMSF(Index, true, framesPerSecond)); -+ readIndex = Index; -+ } -+ } -+ -+ bool LastMarkPause = false; - nonBlockingFileReader = new cNonBlockingFileReader; - int Length = 0; - bool Sleep = false; -@@ -431,7 +452,7 @@ - - // Read the next frame from the file: - -- if (playMode != pmStill && playMode != pmPause) { -+ if (playMode != pmStill && playMode != pmPause && !LastMarkPause) { - if (!readFrame && (replayFile || readIndex >= 0)) { - if (!nonBlockingFileReader->Reading()) { - if (!SwitchToPlayFrame && (playMode == pmFast || (playMode == pmSlow && playDir == pdBackward))) { -@@ -468,6 +489,44 @@ - else if (index) { - uint16_t FileNumber; - off_t FileOffset; -+ if (Setup.PlayJump || Setup.PauseLastMark) { -+ // check for end mark - jump to next mark or pause -+ readIndex++; -+ marks.Update(); -+ cMark *m = marks.Get(readIndex); -+ if (m && (m->Index() & 0x01) != 0) { -+ m = marks.Next(m); -+ int Index; -+ if (m) -+ Index = m->Position(); -+ else if (Setup.PauseLastMark) { -+ // pause at last mark -+ isyslog("PauseLastMark: pause at position %d (%s)", -+ readIndex, *IndexToHMSF(readIndex, true, framesPerSecond)); -+ LastMarkPause = true; -+ Index = -1; -+ } -+ else if (total == index->Last()) -+ // at last mark jump to end of recording -+ Index = index->Last() - 1; -+ else -+ // jump but stay off end of live-recordings -+ Index = index->GetNextIFrame(index->Last() - int(round(MAXSTUCKATEOF * framesPerSecond)), true); -+ // don't jump in edited recordings -+ if (Setup.PlayJump && Index > readIndex && -+ Index > index->GetNextIFrame(readIndex, true)) { -+ isyslog("PlayJump: %d frames to %d (%s)", -+ Index - readIndex, Index, -+ *IndexToHMSF(Index, true, framesPerSecond)); -+ readIndex = Index; -+ cutIn = true; -+ } -+ } -+ readIndex--; -+ } -+ // for detecting growing length of live-recordings -+ if (index->Get(readIndex + 1, &FileNumber, &FileOffset, &readIndependent) && readIndependent) -+ total = index->Last(); - if (index->Get(readIndex + 1, &FileNumber, &FileOffset, &readIndependent, &Length) && NextFile(FileNumber, FileOffset)) - readIndex++; - else -@@ -512,6 +571,13 @@ - // Store the frame in the buffer: - - if (readFrame) { -+ if (cutIn) { -+ if (isPesRecording) -+ cRemux::SetBrokenLink(readFrame->Data(), readFrame->Count()); -+ //else -+ // TsSetTeiOnBrokenPackets(readFrame->Data(), readFrame->Count()); -+ cutIn = false; -+ } - if (ringBuffer->Put(readFrame)) - readFrame = NULL; - else -@@ -578,8 +644,13 @@ - p = NULL; - } - } -- else -+ else { -+ if (LastMarkPause) { -+ LastMarkPause = false; -+ playMode = pmPause; -+ } - Sleep = true; -+ } - - // Handle hitting begin/end of recording: - ---- a/menu.c -+++ b/menu.c -@@ -3568,6 +3568,9 @@ - Add(new cMenuEditIntItem( tr("Setup.Replay$Progress display time (s)"), &data.ProgressDisplayTime, 0, 60)); - Add(new cMenuEditBoolItem(tr("Setup.Replay$Pause replay when setting mark"), &data.PauseOnMarkSet)); - 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)); - } - - void cMenuSetupReplay::Store(void) -@@ -5209,8 +5212,17 @@ - if (GetIndex(Current, Total)) { - if (marks.Count()) { - if (cMark *m = Forward ? marks.GetNext(Current) : marks.GetPrev(Current)) { -- Goto(m->Position(), true); -- displayFrames = true; -+ bool Play2, Forward2; -+ int Speed; -+ if (Setup.JumpPlay && GetReplayMode(Play2, Forward2, Speed) && -+ Play2 && Forward && m->Position() < Total - SecondsToFrames(3, FramesPerSecond())) { -+ Goto(m->Position()); -+ Play(); -+ } -+ else { -+ Goto(m->Position(), true); -+ displayFrames = true; -+ } - return; - } - } -@@ -5273,7 +5285,7 @@ - if (!m) - m = marks.GetNext(Current); - if (m) { -- if ((m->Index() & 0x01) != 0) -+ if ((m->Index() & 0x01) != 0 && !Setup.PlayJump) - m = marks.Next(m); - if (m) { - Goto(m->Position() - SecondsToFrames(3, FramesPerSecond())); ---- a/po/de_DE.po -+++ b/po/de_DE.po -@@ -1201,6 +1201,15 @@ - 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$Multi speed mode" - msgstr "Mehrstufiger Vor-/Rcklauf" - ---- a/po/fr_FR.po -+++ b/po/fr_FR.po -@@ -1211,6 +1211,15 @@ - 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$Multi speed mode" - msgstr "Mode multi-vitesses" - diff -Nru vdr-2.1.6/debian/patches/opt-27_ttxtsubs.patch vdr-2.1.6-297~3e4e445/debian/patches/opt-27_ttxtsubs.patch --- vdr-2.1.6/debian/patches/opt-27_ttxtsubs.patch 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/opt-27_ttxtsubs.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,933 +0,0 @@ -Description: This patch is needed for the ttxtsubs plugin. -Author: ? -Origin: ttxsubs plugin - ---- a/MANUAL -+++ b/MANUAL -@@ -761,6 +761,9 @@ - background transparency. By default the values as broadcast - are used. - -+ Record Teletext Subtitles = no -+ If set to 'yes', teletext subtitles will be recorded. -+ - LNB: - - Use DiSEqC = no Generally turns DiSEqC support on or off. ---- a/Makefile -+++ b/Makefile -@@ -73,6 +73,8 @@ - skinclassic.o skinlcars.o skins.o skinsttng.o sourceparams.o sources.o spu.o status.o svdrp.o themes.o thread.o\ - timers.o tools.o transfer.o vdr.o videodir.o - -+OBJS += vdrttxtsubshooks.o -+ - DEFINES += $(CDEFINES) - INCLUDES += $(CINCLUDES) - ---- a/channels.c -+++ b/channels.c -@@ -408,6 +408,26 @@ - } - } - -+void cChannel::SetTeletextSubtitlePages(tTeletextSubtitlePage pages[], int numberOfPages) -+{ -+ int mod = CHANNELMOD_NONE; -+ if (totalTtxtSubtitlePages != (fixedTtxtSubtitlePages + numberOfPages)) -+ mod |= CHANNELMOD_PIDS; -+ totalTtxtSubtitlePages = fixedTtxtSubtitlePages; -+ for (int i = 0; (i < numberOfPages) && (totalTtxtSubtitlePages < MAXTXTPAGES); i++) { -+ if (teletextSubtitlePages[totalTtxtSubtitlePages].ttxtMagazine != pages[i].ttxtMagazine || -+ teletextSubtitlePages[totalTtxtSubtitlePages].ttxtPage != pages[i].ttxtPage || -+ teletextSubtitlePages[totalTtxtSubtitlePages].ttxtType != pages[i].ttxtType || -+ strcmp(teletextSubtitlePages[totalTtxtSubtitlePages].ttxtLanguage, pages[i].ttxtLanguage)) { -+ mod |= CHANNELMOD_PIDS; -+ teletextSubtitlePages[totalTtxtSubtitlePages] = pages[i]; -+ } -+ totalTtxtSubtitlePages++; -+ } -+ modification |= mod; -+ Channels.SetModified(); -+} -+ - void cChannel::SetCaIds(const int *CaIds) - { - if (caids[0] && caids[0] <= CA_USER_MAX) -@@ -538,10 +558,17 @@ - q += IntArrayToString(q, Channel->dpids, 10, Channel->dlangs, Channel->dtypes); - } - *q = 0; -- const int TBufferSize = MAXSPIDS * (5 + 1 + MAXLANGCODE2) + 10; // 5 digits plus delimiting ',' or ';' plus optional '=cod+cod', +10: paranoia and tpid -+ const int TBufferSize = (MAXTXTPAGES * MAXSPIDS) * (5 + 1 + MAXLANGCODE2) + 10; // 5 digits plus delimiting ',' or ';' plus optional '=cod+cod', +10: paranoia and tpid - char tpidbuf[TBufferSize]; - q = tpidbuf; - q += snprintf(q, sizeof(tpidbuf), "%d", Channel->tpid); -+ if (Channel->fixedTtxtSubtitlePages > 0) { -+ *q++ = '+'; -+ for (int i = 0; i < Channel->fixedTtxtSubtitlePages; ++i) { -+ tTeletextSubtitlePage page = Channel->teletextSubtitlePages[i]; -+ q += snprintf(q, sizeof(tpidbuf) - (q - tpidbuf), "%d=%s", page.PageNumber(), page.ttxtLanguage); -+ } -+ } - if (Channel->spids[0]) { - *q++ = ';'; - q += IntArrayToString(q, Channel->spids, 10, Channel->slangs); -@@ -712,6 +739,32 @@ - } - spids[NumSpids] = 0; - } -+ fixedTtxtSubtitlePages = 0; -+ if ((p = strchr(tpidbuf, '+')) != NULL) { -+ *p++ = 0; -+ char *q; -+ char *strtok_next; -+ while ((q = strtok_r(p, ",", &strtok_next)) != NULL) { -+ if (fixedTtxtSubtitlePages < MAXTXTPAGES) { -+ int page; -+ char *l = strchr(q, '='); -+ if (l) -+ *l++ = 0; -+ if (sscanf(q, "%d", &page) == 1) { -+ teletextSubtitlePages[fixedTtxtSubtitlePages] = tTeletextSubtitlePage(page); -+ if (l) -+ strn0cpy(teletextSubtitlePages[fixedTtxtSubtitlePages].ttxtLanguage, l, MAXLANGCODE2); -+ fixedTtxtSubtitlePages++; -+ } -+ else -+ esyslog("ERROR: invalid Teletext page!"); // no need to set ok to 'false' -+ } -+ else -+ esyslog("ERROR: too many Teletext pages!"); // no need to set ok to 'false' -+ p = NULL; -+ } -+ totalTtxtSubtitlePages = fixedTtxtSubtitlePages; -+ } - if (sscanf(tpidbuf, "%d", &tpid) != 1) - return false; - if (caidbuf) { ---- a/channels.h -+++ b/channels.h -@@ -35,6 +35,7 @@ - #define MAXDPIDS 16 // dolby (AC3 + DTS) - #define MAXSPIDS 32 // subtitles - #define MAXCAIDS 12 // conditional access -+#define MAXTXTPAGES 8 // teletext pages - - #define MAXLANGCODE1 4 // a 3 letter language code, zero terminated - #define MAXLANGCODE2 8 // up to two 3 letter language codes, separated by '+' and zero terminated -@@ -71,6 +72,16 @@ - static const tChannelID InvalidID; - }; - -+struct tTeletextSubtitlePage { -+ tTeletextSubtitlePage(void) { ttxtPage = ttxtMagazine = 0; ttxtType = 0x02; strcpy(ttxtLanguage, "und"); } -+ tTeletextSubtitlePage(int page) { ttxtMagazine = (page / 100) & 0x7; ttxtPage = (((page % 100) / 10) << 4) + (page % 10); ttxtType = 0x02; strcpy(ttxtLanguage, "und"); } -+ char ttxtLanguage[MAXLANGCODE1]; -+ uchar ttxtPage; -+ uchar ttxtMagazine; -+ uchar ttxtType; -+ int PageNumber(void) const { return BCDCHARTOINT(ttxtMagazine) * 100 + BCDCHARTOINT(ttxtPage); } -+ }; -+ - class cChannel; - - class cLinkChannel : public cListObject { -@@ -115,6 +126,9 @@ - uint16_t compositionPageIds[MAXSPIDS]; - uint16_t ancillaryPageIds[MAXSPIDS]; - int tpid; -+ int fixedTtxtSubtitlePages; -+ int totalTtxtSubtitlePages; -+ tTeletextSubtitlePage teletextSubtitlePages[MAXTXTPAGES]; - int caids[MAXCAIDS + 1]; // list is zero-terminated - int nid; - int tid; -@@ -166,6 +180,8 @@ - uint16_t CompositionPageId(int i) const { return (0 <= i && i < MAXSPIDS) ? compositionPageIds[i] : uint16_t(0); } - uint16_t AncillaryPageId(int i) const { return (0 <= i && i < MAXSPIDS) ? ancillaryPageIds[i] : uint16_t(0); } - int Tpid(void) const { return tpid; } -+ const tTeletextSubtitlePage *TeletextSubtitlePages() const { return teletextSubtitlePages; } -+ int TotalTeletextSubtitlePages() const { return totalTtxtSubtitlePages; } - const int *Caids(void) const { return caids; } - int Ca(int Index = 0) const { return Index < MAXCAIDS ? caids[Index] : 0; } - int Nid(void) const { return nid; } -@@ -192,6 +208,7 @@ - void SetName(const char *Name, const char *ShortName, const char *Provider); - void SetPortalName(const char *PortalName); - void SetPids(int Vpid, int Ppid, int Vtype, int *Apids, int *Atypes, char ALangs[][MAXLANGCODE2], int *Dpids, int *Dtypes, char DLangs[][MAXLANGCODE2], int *Spids, char SLangs[][MAXLANGCODE2], int Tpid); -+ void SetTeletextSubtitlePages(tTeletextSubtitlePage pages[], int numberOfPages); - void SetCaIds(const int *CaIds); // list must be zero-terminated - void SetCaDescriptors(int Level); - void SetLinkChannels(cLinkChannels *LinkChannels); ---- a/ci.c -+++ b/ci.c -@@ -1914,6 +1914,8 @@ - AddPid(Channel->Sid(), *Dpid, STREAM_TYPE_PRIVATE); - for (const int *Spid = Channel->Spids(); *Spid; Spid++) - AddPid(Channel->Sid(), *Spid, STREAM_TYPE_PRIVATE); -+ if (Channel->Tpid() && Setup.SupportTeletext) -+ AddPid(Channel->Sid(), Channel->Tpid(), STREAM_TYPE_PRIVATE); - } - } - -@@ -1937,6 +1939,8 @@ - CaPmt.AddPid(*Dpid, STREAM_TYPE_PRIVATE); - for (const int *Spid = Channel->Spids(); *Spid; Spid++) - CaPmt.AddPid(*Spid, STREAM_TYPE_PRIVATE); -+ if (Channel->Tpid() && Setup.SupportTeletext) -+ CaPmt.AddPid(Channel->Tpid(), STREAM_TYPE_PRIVATE); - cas->SendPMT(&CaPmt); - cTimeMs Timeout(QUERY_REPLY_TIMEOUT); - do { ---- a/config.c -+++ b/config.c -@@ -397,6 +397,7 @@ - MarginStop = 10; - AudioLanguages[0] = -1; - DisplaySubtitles = 0; -+ SupportTeletext = 0; - SubtitleLanguages[0] = -1; - SubtitleOffset = 0; - SubtitleFgTransparency = 0; -@@ -605,6 +606,7 @@ - else if (!strcasecmp(Name, "MarginStop")) MarginStop = atoi(Value); - else if (!strcasecmp(Name, "AudioLanguages")) return ParseLanguages(Value, AudioLanguages); - else if (!strcasecmp(Name, "DisplaySubtitles")) DisplaySubtitles = atoi(Value); -+ else if (!strcasecmp(Name, "SupportTeletext")) SupportTeletext = atoi(Value); - else if (!strcasecmp(Name, "SubtitleLanguages")) return ParseLanguages(Value, SubtitleLanguages); - else if (!strcasecmp(Name, "SubtitleOffset")) SubtitleOffset = atoi(Value); - else if (!strcasecmp(Name, "SubtitleFgTransparency")) SubtitleFgTransparency = atoi(Value); -@@ -717,6 +719,7 @@ - Store("MarginStop", MarginStop); - StoreLanguages("AudioLanguages", AudioLanguages); - Store("DisplaySubtitles", DisplaySubtitles); -+ Store("SupportTeletext", SupportTeletext); - StoreLanguages("SubtitleLanguages", SubtitleLanguages); - Store("SubtitleOffset", SubtitleOffset); - Store("SubtitleFgTransparency", SubtitleFgTransparency); ---- a/config.h -+++ b/config.h -@@ -275,6 +275,7 @@ - int MarginStart, MarginStop; - int AudioLanguages[I18N_MAX_LANGUAGES + 1]; - int DisplaySubtitles; -+ int SupportTeletext; - int SubtitleLanguages[I18N_MAX_LANGUAGES + 1]; - int SubtitleOffset; - int SubtitleFgTransparency, SubtitleBgTransparency; ---- a/device.c -+++ b/device.c -@@ -18,6 +18,7 @@ - #include "receiver.h" - #include "status.h" - #include "transfer.h" -+#include "vdrttxtsubshooks.h" - - // --- cLiveSubtitle --------------------------------------------------------- - -@@ -1313,6 +1314,13 @@ - } - break; - case 0xBD: { // private stream 1 -+ // EBU Teletext data, ETSI EN 300 472 -+ // if PES data header length = 24 and data_identifier = 0x10..0x1F (EBU Data) -+ if (Data[8] == 0x24 && Data[45] >= 0x10 && Data[45] < 0x20) { -+ cVDRTtxtsubsHookListener::Hook()->PlayerTeletextData((uint8_t*)Data, Length); -+ break; -+ } -+ - int PayloadOffset = Data[8] + 9; - - // Compatibility mode for old subtitles plugin: -@@ -1472,6 +1480,7 @@ - tsToPesVideo.Reset(); - tsToPesAudio.Reset(); - tsToPesSubtitle.Reset(); -+ tsToPesTeletext.Reset(); - } - else if (Length < TS_SIZE) { - esyslog("ERROR: skipped %d bytes of TS fragment", Length); -@@ -1516,6 +1525,17 @@ - if (!VideoOnly || HasIBPTrickSpeed()) - PlayTsSubtitle(Data, TS_SIZE); - } -+ else if (Pid == patPmtParser.Tpid()) { -+ if (!VideoOnly || HasIBPTrickSpeed()) { -+ int l; -+ tsToPesTeletext.PutTs(Data, Length); -+ if (const uchar *p = tsToPesTeletext.GetPes(l)) { -+ if ((l > 45) && (p[0] == 0x00) && (p[1] == 0x00) && (p[2] == 0x01) && (p[3] == 0xbd) && (p[8] == 0x24) && (p[45] >= 0x10) && (p[45] < 0x20)) -+ cVDRTtxtsubsHookListener::Hook()->PlayerTeletextData((uchar *)p, l, false, patPmtParser.TeletextSubtitlePages(), patPmtParser.TotalTeletextSubtitlePages()); -+ tsToPesTeletext.Reset(); -+ } -+ } -+ } - } - } - else if (Pid == patPmtParser.Ppid()) { ---- a/device.h -+++ b/device.h -@@ -584,6 +584,7 @@ - cTsToPes tsToPesVideo; - cTsToPes tsToPesAudio; - cTsToPes tsToPesSubtitle; -+ cTsToPes tsToPesTeletext; - bool isPlayingVideo; - protected: - const cPatPmtParser *PatPmtParser(void) const { return &patPmtParser; } ---- a/menu.c -+++ b/menu.c -@@ -3013,6 +3013,7 @@ - Add(new cMenuEditIntItem( tr("Setup.DVB$Subtitle foreground transparency"), &data.SubtitleFgTransparency, 0, 9)); - Add(new cMenuEditIntItem( tr("Setup.DVB$Subtitle background transparency"), &data.SubtitleBgTransparency, 0, 10)); - } -+ Add(new cMenuEditBoolItem(tr("Setup.DVB$Enable teletext support"), &data.SupportTeletext)); - - SetCurrent(Get(current)); - Display(); ---- a/pat.c -+++ b/pat.c -@@ -13,6 +13,7 @@ - #include "libsi/section.h" - #include "libsi/descriptor.h" - #include "thread.h" -+#include "vdrttxtsubshooks.h" - - #define PMT_SCAN_TIMEOUT 10 // seconds - -@@ -343,6 +344,8 @@ - char DLangs[MAXDPIDS][MAXLANGCODE2] = { "" }; - char SLangs[MAXSPIDS][MAXLANGCODE2] = { "" }; - int Tpid = 0; -+ tTeletextSubtitlePage TeletextSubtitlePages[MAXTXTPAGES]; -+ int NumTPages = 0; - int NumApids = 0; - int NumDpids = 0; - int NumSpids = 0; -@@ -434,8 +437,21 @@ - NumSpids++; - } - break; -- case SI::TeletextDescriptorTag: -+ case SI::TeletextDescriptorTag: { - Tpid = esPid; -+ SI::TeletextDescriptor *sd = (SI::TeletextDescriptor *)d; -+ SI::TeletextDescriptor::Teletext ttxt; -+ for (SI::Loop::Iterator it; sd->teletextLoop.getNext(ttxt, it); ) { -+ bool isSubtitlePage = (ttxt.getTeletextType() == 0x02) || (ttxt.getTeletextType() == 0x05); -+ if ((NumTPages < MAXTXTPAGES) && ttxt.languageCode[0] && isSubtitlePage) { -+ strn0cpy(TeletextSubtitlePages[NumTPages].ttxtLanguage, I18nNormalizeLanguageCode(ttxt.languageCode), MAXLANGCODE1); -+ TeletextSubtitlePages[NumTPages].ttxtPage = ttxt.getTeletextPageNumber(); -+ TeletextSubtitlePages[NumTPages].ttxtMagazine = ttxt.getTeletextMagazineNumber(); -+ TeletextSubtitlePages[NumTPages].ttxtType = ttxt.getTeletextType(); -+ NumTPages++; -+ } -+ } -+ } - break; - case SI::ISO639LanguageDescriptorTag: { - SI::ISO639LanguageDescriptor *ld = (SI::ISO639LanguageDescriptor *)d; -@@ -547,6 +563,12 @@ - } - if (Setup.UpdateChannels >= 2) { - Channel->SetPids(Vpid, Ppid, Vtype, Apids, Atypes, ALangs, Dpids, Dtypes, DLangs, Spids, SLangs, Tpid); -+ if (NumTPages < MAXTXTPAGES) { -+ int manualPageNumber = cVDRTtxtsubsHookListener::Hook()->ManualPageNumber(Channel); -+ if (manualPageNumber) -+ TeletextSubtitlePages[NumTPages++] = tTeletextSubtitlePage(manualPageNumber); -+ } -+ Channel->SetTeletextSubtitlePages(TeletextSubtitlePages, NumTPages); - Channel->SetCaIds(CaDescriptors->CaIds()); - Channel->SetSubtitlingDescriptors(SubtitlingTypes, CompositionPageIds, AncillaryPageIds); - } ---- a/po/ca_ES.po -+++ b/po/ca_ES.po -@@ -974,6 +974,9 @@ - msgid "Setup.DVB$Subtitle background transparency" - msgstr "Transparncia fons subttols" - -+msgid "Setup.DVB$Enable teletext support" -+msgstr "" -+ - msgid "LNB" - msgstr "Configuraci de l'LNB" - ---- a/po/cs_CZ.po -+++ b/po/cs_CZ.po -@@ -974,6 +974,9 @@ - msgid "Setup.DVB$Subtitle background transparency" - msgstr "Průhlednost pozadí titulků" - -+msgid "Setup.DVB$Enable teletext support" -+msgstr "" -+ - msgid "LNB" - msgstr "LNB" - ---- a/po/da_DK.po -+++ b/po/da_DK.po -@@ -971,6 +971,9 @@ - msgid "Setup.DVB$Subtitle background transparency" - msgstr "Undertekst baggrundsgennemsigtighed" - -+msgid "Setup.DVB$Enable teletext support" -+msgstr "" -+ - msgid "LNB" - msgstr "LNB" - ---- a/po/de_DE.po -+++ b/po/de_DE.po -@@ -971,6 +971,9 @@ - msgid "Setup.DVB$Subtitle background transparency" - msgstr "Untertitel-Transparenz Hintergrund" - -+msgid "Setup.DVB$Enable teletext support" -+msgstr "Videotext-Untersttzung aktivieren" -+ - msgid "LNB" - msgstr "LNB" - ---- a/po/el_GR.po -+++ b/po/el_GR.po -@@ -971,6 +971,9 @@ - msgid "Setup.DVB$Subtitle background transparency" - msgstr "" - -+msgid "Setup.DVB$Enable teletext support" -+msgstr "" -+ - msgid "LNB" - msgstr "LNB" - ---- a/po/es_ES.po -+++ b/po/es_ES.po -@@ -972,6 +972,9 @@ - msgid "Setup.DVB$Subtitle background transparency" - msgstr "Transparencia fondo subttulos" - -+msgid "Setup.DVB$Enable teletext support" -+msgstr "" -+ - msgid "LNB" - msgstr "LNB" - ---- a/po/et_EE.po -+++ b/po/et_EE.po -@@ -971,6 +971,9 @@ - msgid "Setup.DVB$Subtitle background transparency" - msgstr "Subtiitri tausta läbipaistvus" - -+msgid "Setup.DVB$Enable teletext support" -+msgstr "Teleteksti tugi" -+ - msgid "LNB" - msgstr "LNB" - ---- a/po/fi_FI.po -+++ b/po/fi_FI.po -@@ -975,6 +975,9 @@ - msgid "Setup.DVB$Subtitle background transparency" - msgstr "Tekstityksen taustan läpinäkyvyys" - -+msgid "Setup.DVB$Enable teletext support" -+msgstr "Salli teksti-TV-tuki" -+ - msgid "LNB" - msgstr "LNB" - ---- a/po/fr_FR.po -+++ b/po/fr_FR.po -@@ -981,6 +981,9 @@ - msgid "Setup.DVB$Subtitle background transparency" - msgstr "Transparence du fond des sous-titres" - -+msgid "Setup.DVB$Enable teletext support" -+msgstr "" -+ - msgid "LNB" - msgstr "LNB" - ---- a/po/hr_HR.po -+++ b/po/hr_HR.po -@@ -973,6 +973,9 @@ - msgid "Setup.DVB$Subtitle background transparency" - msgstr "Transparentnost pozadine titla" - -+msgid "Setup.DVB$Enable teletext support" -+msgstr "" -+ - msgid "LNB" - msgstr "LNB" - ---- a/po/hu_HU.po -+++ b/po/hu_HU.po -@@ -975,6 +975,9 @@ - msgid "Setup.DVB$Subtitle background transparency" - msgstr "Felirat hátterének transzparenciája" - -+msgid "Setup.DVB$Enable teletext support" -+msgstr "" -+ - msgid "LNB" - msgstr "LNB" - ---- a/po/it_IT.po -+++ b/po/it_IT.po -@@ -978,6 +978,9 @@ - msgid "Setup.DVB$Subtitle background transparency" - msgstr "Trasparenza sfondo sottotitoli" - -+msgid "Setup.DVB$Enable teletext support" -+msgstr "" -+ - msgid "LNB" - msgstr "LNB" - ---- a/po/lt_LT.po -+++ b/po/lt_LT.po -@@ -971,6 +971,9 @@ - msgid "Setup.DVB$Subtitle background transparency" - msgstr "Subtitrų fono permatomumas" - -+msgid "Setup.DVB$Enable teletext support" -+msgstr "" -+ - msgid "LNB" - msgstr "Konverteris (LNB)" - ---- a/po/nl_NL.po -+++ b/po/nl_NL.po -@@ -976,6 +976,9 @@ - msgid "Setup.DVB$Subtitle background transparency" - msgstr "Transparantie achtergrond ondertiteling" - -+msgid "Setup.DVB$Enable teletext support" -+msgstr "" -+ - msgid "LNB" - msgstr "LNB" - ---- a/po/nn_NO.po -+++ b/po/nn_NO.po -@@ -972,6 +972,9 @@ - msgid "Setup.DVB$Subtitle background transparency" - msgstr "" - -+msgid "Setup.DVB$Enable teletext support" -+msgstr "" -+ - msgid "LNB" - msgstr "LNB" - ---- a/po/pl_PL.po -+++ b/po/pl_PL.po -@@ -973,6 +973,9 @@ - msgid "Setup.DVB$Subtitle background transparency" - msgstr "Przerocze podtytuw: To" - -+msgid "Setup.DVB$Enable teletext support" -+msgstr "" -+ - msgid "LNB" - msgstr "LNB" - ---- a/po/pt_PT.po -+++ b/po/pt_PT.po -@@ -972,6 +972,9 @@ - msgid "Setup.DVB$Subtitle background transparency" - msgstr "Transparncia de fundo das legendas" - -+msgid "Setup.DVB$Enable teletext support" -+msgstr "" -+ - msgid "LNB" - msgstr "LNB" - ---- a/po/ro_RO.po -+++ b/po/ro_RO.po -@@ -973,6 +973,9 @@ - msgid "Setup.DVB$Subtitle background transparency" - msgstr "Transparenţa fundalului subtitrării" - -+msgid "Setup.DVB$Enable teletext support" -+msgstr "" -+ - msgid "LNB" - msgstr "LNB" - ---- a/po/ru_RU.po -+++ b/po/ru_RU.po -@@ -972,6 +972,9 @@ - msgid "Setup.DVB$Subtitle background transparency" - msgstr " " - -+msgid "Setup.DVB$Enable teletext support" -+msgstr "" -+ - msgid "LNB" - msgstr "" - ---- a/po/sk_SK.po -+++ b/po/sk_SK.po -@@ -971,6 +971,9 @@ - msgid "Setup.DVB$Subtitle background transparency" - msgstr "Priehadnos pozadia titulkov" - -+msgid "Setup.DVB$Enable teletext support" -+msgstr "" -+ - msgid "LNB" - msgstr "LNB (nzko umov jednotka)" - ---- a/po/sl_SI.po -+++ b/po/sl_SI.po -@@ -972,6 +972,9 @@ - msgid "Setup.DVB$Subtitle background transparency" - msgstr "Transparentnost ozadja podnapisov" - -+msgid "Setup.DVB$Enable teletext support" -+msgstr "" -+ - msgid "LNB" - msgstr "LNB" - ---- a/po/sv_SE.po -+++ b/po/sv_SE.po -@@ -975,6 +975,9 @@ - msgid "Setup.DVB$Subtitle background transparency" - msgstr "Transparent bakgrund textremsa" - -+msgid "Setup.DVB$Enable teletext support" -+msgstr "" -+ - msgid "LNB" - msgstr "LNB" - ---- a/po/tr_TR.po -+++ b/po/tr_TR.po -@@ -971,6 +971,9 @@ - msgid "Setup.DVB$Subtitle background transparency" - msgstr "Altyaz arka effaflk" - -+msgid "Setup.DVB$Enable teletext support" -+msgstr "" -+ - msgid "LNB" - msgstr "LNB" - ---- a/po/uk_UA.po -+++ b/po/uk_UA.po -@@ -972,6 +972,9 @@ - msgid "Setup.DVB$Subtitle background transparency" - msgstr "Прозорість заднього плану субтитрів" - -+msgid "Setup.DVB$Enable teletext support" -+msgstr "" -+ - msgid "LNB" - msgstr "Конвертер" - ---- a/po/zh_CN.po -+++ b/po/zh_CN.po -@@ -973,6 +973,9 @@ - msgid "Setup.DVB$Subtitle background transparency" - msgstr "字幕背景透明度" - -+msgid "Setup.DVB$Enable teletext support" -+msgstr "" -+ - msgid "LNB" - msgstr "切换器设置" - ---- a/receiver.c -+++ b/receiver.c -@@ -67,7 +67,8 @@ - (Channel->Ppid() == Channel->Vpid() || AddPid(Channel->Ppid())) && - AddPids(Channel->Apids()) && - AddPids(Channel->Dpids()) && -- AddPids(Channel->Spids()); -+ AddPids(Channel->Spids()) && -+ (!Setup.SupportTeletext || AddPid(Channel->Tpid())); - } - return true; - } ---- a/remux.c -+++ b/remux.c -@@ -385,6 +385,29 @@ - return i; - } - -+int cPatPmtGenerator::MakeTeletextDescriptor(uchar *Target, const tTeletextSubtitlePage *pages, int pageCount) -+{ -+ int i = 0, j = 0; -+ Target[i++] = SI::TeletextDescriptorTag; -+ int l = i; -+ Target[i++] = 0x00; // length -+ for (int n = 0; n < pageCount; n++) { -+ const char* Language = pages[n].ttxtLanguage; -+ Target[i++] = *Language++; -+ Target[i++] = *Language++; -+ Target[i++] = *Language++; -+ Target[i++] = (pages[n].ttxtType << 3) + pages[n].ttxtMagazine; -+ Target[i++] = pages[n].ttxtPage; -+ j++; -+ } -+ if (j > 0) { -+ Target[l] = j * 5; // update length -+ IncEsInfoLength(i); -+ return i; -+ } -+ return 0; -+} -+ - int cPatPmtGenerator::MakeLanguageDescriptor(uchar *Target, const char *Language) - { - int i = 0; -@@ -472,6 +495,7 @@ - if (Channel) { - int Vpid = Channel->Vpid(); - int Ppid = Channel->Ppid(); -+ int Tpid = Channel->Tpid(); - uchar *p = buf; - int i = 0; - p[i++] = 0x02; // table id -@@ -504,6 +528,10 @@ - i += MakeStream(buf + i, 0x06, Channel->Spid(n)); - i += MakeSubtitlingDescriptor(buf + i, Channel->Slang(n), Channel->SubtitlingType(n), Channel->CompositionPageId(n), Channel->AncillaryPageId(n)); - } -+ if (Tpid) { -+ i += MakeStream(buf + i, 0x06, Tpid); -+ i += MakeTeletextDescriptor(buf + i, Channel->TeletextSubtitlePages(), Channel->TotalTeletextSubtitlePages()); -+ } - - int sl = i - SectionLength - 2 + 4; // -2 = SectionLength storage, +4 = length of CRC - buf[SectionLength] |= (sl >> 8) & 0x0F; -@@ -577,6 +605,7 @@ - pmtPids[0] = 0; - vpid = vtype = 0; - ppid = 0; -+ tpid = 0; - } - - void cPatPmtParser::ParsePat(const uchar *Data, int Length) -@@ -665,11 +694,13 @@ - int NumSpids = 0; - vpid = vtype = 0; - ppid = 0; -+ tpid = 0; - apids[0] = 0; - dpids[0] = 0; - spids[0] = 0; - atypes[0] = 0; - dtypes[0] = 0; -+ totalTtxtSubtitlePages = 0; - SI::PMT::Stream stream; - for (SI::Loop::Iterator it; Pmt.streamLoop.getNext(stream, it); ) { - dbgpatpmt(" stream type = %02X, pid = %d", stream.getStreamType(), stream.getPid()); -@@ -768,6 +799,28 @@ - spids[NumSpids] = 0; - } - break; -+ case SI::TeletextDescriptorTag: { -+ dbgpatpmt(" teletext"); -+ tpid = stream.getPid(); -+ SI::TeletextDescriptor *sd = (SI::TeletextDescriptor *)d; -+ SI::TeletextDescriptor::Teletext ttxt; -+ if (totalTtxtSubtitlePages < MAXTXTPAGES) { -+ for (SI::Loop::Iterator it; sd->teletextLoop.getNext(ttxt, it); ) { -+ bool isSubtitlePage = (ttxt.getTeletextType() == 0x02) || (ttxt.getTeletextType() == 0x05); -+ if (isSubtitlePage && ttxt.languageCode[0]) { -+ dbgpatpmt(" '%s:%x.%x'", ttxt.languageCode, ttxt.getTeletextMagazineNumber(), ttxt.getTeletextPageNumber()); -+ strn0cpy(teletextSubtitlePages[totalTtxtSubtitlePages].ttxtLanguage, I18nNormalizeLanguageCode(ttxt.languageCode), MAXLANGCODE1); -+ teletextSubtitlePages[totalTtxtSubtitlePages].ttxtPage = ttxt.getTeletextPageNumber(); -+ teletextSubtitlePages[totalTtxtSubtitlePages].ttxtMagazine = ttxt.getTeletextMagazineNumber(); -+ teletextSubtitlePages[totalTtxtSubtitlePages].ttxtType = ttxt.getTeletextType(); -+ totalTtxtSubtitlePages++; -+ if (totalTtxtSubtitlePages >= MAXTXTPAGES) -+ break; -+ } -+ } -+ } -+ } -+ break; - case SI::ISO639LanguageDescriptorTag: { - SI::ISO639LanguageDescriptor *ld = (SI::ISO639LanguageDescriptor *)d; - dbgpatpmt(" '%s'", ld->languageCode); ---- a/remux.h -+++ b/remux.h -@@ -294,6 +294,7 @@ - int MakeStream(uchar *Target, uchar Type, int Pid); - int MakeAC3Descriptor(uchar *Target, uchar Type); - int MakeSubtitlingDescriptor(uchar *Target, const char *Language, uchar SubtitlingType, uint16_t CompositionPageId, uint16_t AncillaryPageId); -+ int MakeTeletextDescriptor(uchar *Target, const tTeletextSubtitlePage *pages, int pageCount); - int MakeLanguageDescriptor(uchar *Target, const char *Language); - int MakeCRC(uchar *Target, const uchar *Data, int Length); - void GeneratePmtPid(const cChannel *Channel); -@@ -341,6 +342,7 @@ - int vpid; - int ppid; - int vtype; -+ int tpid; - int apids[MAXAPIDS + 1]; // list is zero-terminated - int atypes[MAXAPIDS + 1]; // list is zero-terminated - char alangs[MAXAPIDS][MAXLANGCODE2]; -@@ -353,6 +355,8 @@ - uint16_t compositionPageIds[MAXSPIDS]; - uint16_t ancillaryPageIds[MAXSPIDS]; - bool updatePrimaryDevice; -+ int totalTtxtSubtitlePages; -+ tTeletextSubtitlePage teletextSubtitlePages[MAXTXTPAGES]; - protected: - int SectionLength(const uchar *Data, int Length) { return (Length >= 3) ? ((int(Data[1]) & 0x0F) << 8)| Data[2] : 0; } - public: -@@ -389,6 +393,9 @@ - int Vtype(void) const { return vtype; } - ///< Returns the video stream type as defined by the current PMT, or 0 if no video - ///< stream type has been detected, yet. -+ int Tpid(void) { return tpid; } -+ ///< Returns the teletext pid as defined by the current PMT, or 0 if no teletext -+ ///< pid has been detected, yet. - const int *Apids(void) const { return apids; } - const int *Dpids(void) const { return dpids; } - const int *Spids(void) const { return spids; } -@@ -403,6 +410,8 @@ - uchar SubtitlingType(int i) const { return (0 <= i && i < MAXSPIDS) ? subtitlingTypes[i] : uchar(0); } - uint16_t CompositionPageId(int i) const { return (0 <= i && i < MAXSPIDS) ? compositionPageIds[i] : uint16_t(0); } - uint16_t AncillaryPageId(int i) const { return (0 <= i && i < MAXSPIDS) ? ancillaryPageIds[i] : uint16_t(0); } -+ const tTeletextSubtitlePage *TeletextSubtitlePages() const { return teletextSubtitlePages; } -+ int TotalTeletextSubtitlePages() const { return totalTtxtSubtitlePages; } - }; - - // TS to PES converter: ---- a/vdr.5 -+++ b/vdr.5 -@@ -240,6 +240,12 @@ - - .B ...:201;2001=deu,2002=eng:... - -+Manual teletext subtitling pages can be defined separated by a '+' sign. -+The pages (separated by commas) can contain language codes, delimited by a '=' -+sign, as in -+ -+.B ...:201+150=deu,151=fin;2001,2002:... -+ - .TP - .B Conditional access - A hexadecimal integer defining how this channel can be accessed: ---- /dev/null -+++ b/vdrttxtsubshooks.c -@@ -0,0 +1,63 @@ -+/* -+ * vdr-ttxtsubs - A plugin for the Linux Video Disk Recorder -+ * Copyright (c) 2003 - 2008 Ragnar Sundblad <ragge@nada.kth.se> -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your option) -+ * any later version. -+ * -+ * This program is distributed in the hope that it will be useful, but -+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -+ * details. -+ * -+ * You should have received a copy of the GNU General Public License along with -+ * this program; if not, write to the Free Software Foundation, Inc., -+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#include <stdlib.h> -+#include <stdio.h> -+#include <stdint.h> -+ -+#include "vdrttxtsubshooks.h" -+ -+// XXX Really should be a list... -+static cVDRTtxtsubsHookListener *gListener; -+ -+// ------ class cVDRTtxtsubsHookProxy ------ -+ -+class cVDRTtxtsubsHookProxy : public cVDRTtxtsubsHookListener -+{ -+ public: -+ virtual void HideOSD(void) { if(gListener) gListener->HideOSD(); }; -+ virtual void ShowOSD(void) { if(gListener) gListener->ShowOSD(); }; -+ virtual void PlayerTeletextData(uint8_t *p, int length, bool IsPesRecording, const struct tTeletextSubtitlePage teletextSubtitlePages[] = NULL, int pageCount = 0) -+ { if(gListener) gListener->PlayerTeletextData(p, length, IsPesRecording, teletextSubtitlePages, pageCount); }; -+ virtual int ManualPageNumber(const cChannel *channel) -+ { if(gListener) return gListener->ManualPageNumber(channel); else return 0; }; -+}; -+ -+ -+// ------ class cVDRTtxtsubsHookListener ------ -+ -+cVDRTtxtsubsHookListener::~cVDRTtxtsubsHookListener() -+{ -+ gListener = 0; -+} -+ -+void cVDRTtxtsubsHookListener::HookAttach(void) -+{ -+ gListener = this; -+ //printf("cVDRTtxtsubsHookListener::HookAttach\n"); -+} -+ -+static cVDRTtxtsubsHookProxy gProxy; -+ -+cVDRTtxtsubsHookListener *cVDRTtxtsubsHookListener::Hook(void) -+{ -+ return &gProxy; -+} -+ ---- /dev/null -+++ b/vdrttxtsubshooks.h -@@ -0,0 +1,46 @@ -+/* -+ * vdr-ttxtsubs - A plugin for the Linux Video Disk Recorder -+ * Copyright (c) 2003 - 2008 Ragnar Sundblad <ragge@nada.kth.se> -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your option) -+ * any later version. -+ * -+ * This program is distributed in the hope that it will be useful, but -+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -+ * details. -+ * -+ * You should have received a copy of the GNU General Public License along with -+ * this program; if not, write to the Free Software Foundation, Inc., -+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#ifndef __VDRTTXTSUBSHOOKS_H -+#define __VDRTTXTSUBSHOOKS_H -+ -+#define TTXTSUBSVERSNUM 2 -+ -+class cDevice; -+class cChannel; -+struct tTeletextSubtitlePage; -+ -+class cVDRTtxtsubsHookListener { -+ public: -+ cVDRTtxtsubsHookListener(void) {}; -+ virtual ~cVDRTtxtsubsHookListener(); -+ -+ void HookAttach(void); -+ -+ virtual void HideOSD(void) {}; -+ virtual void ShowOSD(void) {}; -+ virtual void PlayerTeletextData(uint8_t *p, int length, bool IsPesRecording = true, const struct tTeletextSubtitlePage teletextSubtitlePages[] = NULL, int pageCount = 0) {}; -+ virtual int ManualPageNumber(const cChannel *channel) { return 0; }; -+ -+ // used by VDR to call hook listeners -+ static cVDRTtxtsubsHookListener *Hook(void); -+}; -+ -+#endif diff -Nru vdr-2.1.6/debian/patches/opt-37-x_menuorg.patch vdr-2.1.6-297~3e4e445/debian/patches/opt-37-x_menuorg.patch --- vdr-2.1.6/debian/patches/opt-37-x_menuorg.patch 2014-04-22 17:48:02.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/opt-37-x_menuorg.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,274 +0,0 @@ -Description: This patch is required by the MenuOrg plugin. It adds a service - interface, that can be implemented by plugins to reorganize - VDR's main menu entries with the ability to create custom sub - menus. - This is version 0.5.s of the patch -Author: Tobias Grimm <tg@e-tobi.net> - ---- /dev/null -+++ b/mainmenuitemsprovider.h -@@ -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 ---- a/menu.c -+++ b/menu.c -@@ -31,6 +31,7 @@ - #include "timers.h" - #include "transfer.h" - #include "videodir.h" -+#include "menuorgpatch.h" - - #define MAXWAIT4EPGINFO 3 // seconds - #define MODETIMEOUT 3 // seconds -@@ -3778,6 +3779,9 @@ - cancelEditingItem = NULL; - stopRecordingItem = NULL; - recordControlsState = 0; -+ -+ MenuOrgPatch::EnterRootMenu(); -+ - Set(); - - // Initial submenus: -@@ -3806,6 +3810,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)); -@@ -3832,6 +3859,8 @@ - if (Commands.Count()) - Add(new cOsdItem(hk(tr("Commands")), osCommands)); - -+ } -+ - Update(true); - - Display(); -@@ -3937,6 +3966,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 osUser7: { -+ if (MenuOrgPatch::IsCustomMenuAvailable()) { -+ MenuOrgPatch::EnterSubMenu(Get(Current())); -+ Set(); -+ return osContinue; -+ } -+ } -+ break; -+ case osUser8: { -+ 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) ---- /dev/null -+++ b/menuorgpatch.h -@@ -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 diff -Nru vdr-2.1.6/debian/patches/opt-41-x_timer-info.patch vdr-2.1.6-297~3e4e445/debian/patches/opt-41-x_timer-info.patch --- vdr-2.1.6/debian/patches/opt-41-x_timer-info.patch 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/opt-41-x_timer-info.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,300 +0,0 @@ -Description: Shows info, if it is possible to record an event in the timer-info of - vdr - see README.timer-info for details. -Author: Andreas Brugger <brougs78@gmx.net>, Thomas Günther <tom@toms-cafe.de> -Origin: http://toms-cafe.de/vdr/download/vdr-timer-info-0.5-1.7.13.diff - ---- /dev/null -+++ b/README.timer-info -@@ -0,0 +1,69 @@ -++------------------------------------------------------------------------------+ -+| Info about the timer-info-patch by Brougs78 | -+| brougs78@gmx.net / home.pages.at/brougs78 | -++------------------------------------------------------------------------------+ -+ -+ -+README timer-info: -+------------------ -+ -+Features: -+ - Shows info, if it is possible to record an event in the timer menu of vdr. -+ For calculations the free space incl. the deleted recordings is used, -+ considering an average consumtion of 25.75 MB/min (also used by vdr itself). -+ The first column in the timer-list shows: -+ ( + ) recording will be most probably possible (enough space) -+ (+/-) recording may be possible -+ ( - ) recording will most probably fail (to less space) -+ The calculations also consider repeating timers. -+ - It is possible to deactivate the patch in the OSD-menu of VDR. -+ -+ -+HISTORY timer-info: -+------------------- -+ -+25.11.2004: v0.1 -+ - Initial release -+ -+11.01.2005: v0.1b -+ - Bugfixes for vdr-1.3.18 -+ - In the menu the free recording-time no longer includes the space of the -+ deleted recordings, because this slowed the vdr down to much. -+ -+08.07.2005: v0.1c -+ - Made the patch configurable -+ -+29.01.2006: v0.2 - Thomas Gnther <tom@toms-cafe.de> -+ - Rewritten great parts for vdr-1.3.38+ -+ http://toms-cafe.de/vdr/download/vdr-timer-info-0.2-1.3.38+.diff -+ -+05.02.2006: v0.3 - Thomas Gnther <tom@toms-cafe.de> -+ - Fixed refresh of timer menu in cMenuTimers::OnOff -+ - Fixed check of repeating timers -+ - Syslog debug messages can be enabled with Define DEBUG_TIMER_INFO -+ http://toms-cafe.de/vdr/download/vdr-timer-info-0.3-1.3.38+.diff -+ -+03.03.2006: v0.4 - Thomas Gnther <tom@toms-cafe.de> -+ - Adapted to vdr-1.3.44 -+ - Removed setup parameter "Show timer-info" -+ http://toms-cafe.de/vdr/download/vdr-timer-info-0.4-1.3.44.diff -+ -+26.03.2006: - Tobias Grimm <tg@e-tobi.net> -+ - Adapted to vdr-1.3.45 -+ http://toms-cafe.de/vdr/download/vdr-timer-info-0.4-1.3.45.diff -+ -+14.01.2008: - Thomas Gnther <tom@toms-cafe.de> -+ - Adapted to vdr-1.5.13 -+ http://toms-cafe.de/vdr/download/vdr-timer-info-0.4-1.5.13.diff -+ -+17.02.2008: - Tobias Grimm <tg@e-tobi.net> -+ - Adapted to vdr-1.5.15 -+ http://toms-cafe.de/vdr/download/vdr-timer-info-0.4-1.5.15.diff -+ -+12.04.2008: v0.5 - Thomas Gnther <tom@toms-cafe.de> -+ - Fixed display of +/- sign with UTF-8 -+ http://toms-cafe.de/vdr/download/vdr-timer-info-0.5-1.5.15.diff -+ -+28.02.2010: - Thomas Gnther <tom@toms-cafe.de> -+ - Adapted to vdr-1.7.13 -+ http://toms-cafe.de/vdr/download/vdr-timer-info-0.5-1.7.13.diff ---- a/menu.c -+++ b/menu.c -@@ -1005,8 +1005,10 @@ - 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; } -@@ -1016,6 +1018,7 @@ - cMenuTimerItem::cMenuTimerItem(cTimer *Timer) - { - timer = Timer; -+ diskStatus = ' '; - Set(); - } - -@@ -1046,7 +1049,10 @@ - File++; - else - File = timer->File(); -- SetText(cString::sprintf("%c\t%d\t%s%s%s\t%02d:%02d\t%02d:%02d\t%s", -+ cCharSetConv csc("ISO-8859-1", cCharSetConv::SystemCharacterTable()); -+ char diskStatusString[2] = { diskStatus, 0 }; -+ SetText(cString::sprintf("%s%c\t%d\t%s%s%s\t%02d:%02d\t%02d:%02d\t%s", -+ csc.Convert(diskStatusString), - !(timer->HasFlags(tfActive)) ? ' ' : timer->FirstDay() ? '!' : timer->Recording() ? '#' : '>', - timer->Channel()->Number(), - *name, -@@ -1065,6 +1071,57 @@ - DisplayMenu->SetItem(Text(), Index, Current, Selectable); - } - -+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 { -@@ -1077,14 +1134,17 @@ - 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) - { - SetMenuCategory(mcTimer); - helpKeys = -1; -@@ -1096,6 +1156,7 @@ - SetCurrent(First()); - SetHelpKeys(); - Timers.IncBeingEdited(); -+ actualiseDiskStatus = true; - } - - cMenuTimers::~cMenuTimers() -@@ -1134,7 +1195,7 @@ - timer->OnOff(); - timer->SetEventFromSchedule(); - RefreshCurrent(); -- DisplayCurrent(true); -+ Display(); - if (timer->FirstDay()) - isyslog("timer %s first day set to %s", *timer->ToDescr(), *timer->PrintFirstDay()); - else -@@ -1193,6 +1254,67 @@ - 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 / 25.75); // 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; -@@ -1201,18 +1323,22 @@ - 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) diff -Nru vdr-2.1.6/debian/patches/opt-42-x_MainMenuHooks-v1.0.1.patch vdr-2.1.6-297~3e4e445/debian/patches/opt-42-x_MainMenuHooks-v1.0.1.patch --- vdr-2.1.6/debian/patches/opt-42-x_MainMenuHooks-v1.0.1.patch 2014-04-02 17:59:30.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/opt-42-x_MainMenuHooks-v1.0.1.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,180 +0,0 @@ -Description: This patch allows plugins to replace the VDR mainmenus "Schedule", "Channels", "Timers" and "Recordings" by a different implementation. -Author: Frank Schmirler <vdrdev@schmirler.de> - -* History -2010-10-15: Version 1.0.1 -- return a cOsdObject instead of its subclass cOsdMenu (thanks to - Joe_D@vdrportal) -- version number defines in config.h now follow the ususal conventions: - MAINMENUHOOKSVERSNUM is now a number, the newly added define - MAINMENUHOOKSVERSION is a string (suggested by gnapheus@vdrportal) -- patch is now based on VDR 1.6.0 -- updated documentation - -2007-02-26: Version 1.0 -- Initial revision. - -* Authors: -Tobias Grimm <vdr at e-tobi dot net> -Martin Prochnow <nordlicht at martins-kabuff dot de> -Frank Schmirler <vdrdev at schmirler dot de> -Christian Wieninger <cwieninger at gmx dot 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_1.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; -} - -Since patch version 1.0.1 the service call may return a cOsdObject -instead of a cOsdMenu. Use "#ifdef MAINMENUHOOKSVERSION" to detect -version 1.0.1. - -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. - ---- a/config.h -+++ b/config.h -@@ -38,6 +38,10 @@ - - #define JUMPPLAYVERSNUM 110 - -+// The MainMenuHook Patch's version number: -+#define MAINMENUHOOKSVERSION "1.0.1" -+#define MAINMENUHOOKSVERSNUM 10001 // Version * 10000 + Major * 100 + Minor -+ - #define MAXPRIORITY 99 - #define MINPRIORITY (-MAXPRIORITY) - #define LIVEPRIORITY 0 // priority used when selecting a device for live viewing ---- a/menu.c -+++ b/menu.c -@@ -3786,15 +3786,31 @@ - - // Initial submenus: - -+ cOsdObject *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, OpenSubMenus)); 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, OpenSubMenus); -+ break; -+ case osSetup: menu = new cMenuSetup; break; -+ case osCommands: menu = new cMenuCommands(tr("Commands"), &Commands); break; - default: break; - } -+ if (menu) -+ if (menu->IsMenu()) -+ AddSubMenu((cOsdMenu *) menu); - } - - cOsdObject *cMenuMain::PluginOsdObject(void) -@@ -3927,13 +3943,34 @@ - eOSState state = cOsdMenu::ProcessKey(Key); - HadSubMenu |= HasSubMenu(); - -+ cOsdObject *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) { -@@ -4020,6 +4057,12 @@ - default: break; - } - } -+ if (menu) { -+ if (menu->IsMenu()) -+ return AddSubMenu((cOsdMenu *) menu); -+ pluginOsdObject = menu; -+ return osPlugin; -+ } - if (!HasSubMenu() && Update(HadSubMenu)) - Display(); - if (Key != kNone) { diff -Nru vdr-2.1.6/debian/patches/opt-44_rotor.patch vdr-2.1.6-297~3e4e445/debian/patches/opt-44_rotor.patch --- vdr-2.1.6/debian/patches/opt-44_rotor.patch 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/opt-44_rotor.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,127 +0,0 @@ -Description: This patch is needed for the rotor plugin. -Author: Thomas Bergwinkl <Bergwinkl.Thomas@vr-web.de> -Origin: extracted from the rotor plugin 0.1.4-vdr1.5 - ---- a/device.h -+++ b/device.h -@@ -24,6 +24,8 @@ - #include "spu.h" - #include "thread.h" - #include "tools.h" -+#include <asm/types.h> -+#include <linux/dvb/frontend.h> - - #define MAXDEVICES 16 // the maximum number of devices in the system - #define MAXPIDHANDLES 64 // the maximum number of different PIDs per device -@@ -337,6 +339,7 @@ - virtual bool HasProgramme(void) const; - ///< 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 - ---- a/dvbdevice.c -+++ b/dvbdevice.c -@@ -285,6 +285,7 @@ - private: - static cMutex bondMutex; - enum eTunerStatus { tsIdle, tsSet, tsTuned, tsLocked }; -+ bool SendDiseqc; - int frontendType; - const cDvbDevice *device; - int fd_frontend; -@@ -301,6 +302,7 @@ - cMutex mutex; - cCondVar locked; - cCondVar newSet; -+ dvb_diseqc_master_cmd diseqc_cmd; - cDvbTuner *bondedTuner; - bool bondedMaster; - bool SetFrontendType(const cChannel *Channel); -@@ -327,12 +329,16 @@ - bool Locked(int TimeoutMs = 0); - int GetSignalStrength(void) const; - int GetSignalQuality(void) const; -+ bool SendDiseqcCmd(dvb_diseqc_master_cmd cmd); -+private: -+ int GetCurrentDeliverySystem(void); - }; - - cMutex cDvbTuner::bondMutex; - - cDvbTuner::cDvbTuner(const cDvbDevice *Device, int Fd_Frontend, int Adapter, int Frontend) - { -+ SendDiseqc = false; - frontendType = SYS_UNDEFINED; - device = Device; - fd_frontend = Fd_Frontend; -@@ -655,6 +661,35 @@ - return -1; - } - -+int cDvbTuner::GetCurrentDeliverySystem() -+{ -+ dtv_property Frontend[1]; -+ memset(&Frontend, 0, sizeof(Frontend)); -+ dtv_properties CmdSeq; -+ memset(&CmdSeq, 0, sizeof(CmdSeq)); -+ CmdSeq.props = Frontend; -+ Frontend[0].cmd = DTV_DELIVERY_SYSTEM; -+ Frontend[0].u.data = 0; -+ if (ioctl(fd_frontend, FE_GET_PROPERTY, &CmdSeq) < 0) { -+ esyslog("ERROR: frontend %d/%d: %m", adapter, frontend); -+ return SYS_UNDEFINED; -+ } -+ return Frontend[0].u.data; -+} -+ -+bool cDvbTuner::SendDiseqcCmd(dvb_diseqc_master_cmd cmd) -+{ -+ cMutexLock MutexLock(&mutex); -+ int frontendType = GetCurrentDeliverySystem(); -+ if ((frontendType != SYS_DVBS && frontendType != SYS_DVBS2) || SendDiseqc) -+ return false; -+ diseqc_cmd=cmd; -+ SendDiseqc=true; -+ newSet.Broadcast(); -+ return true; -+} -+ -+ - static unsigned int FrequencyToHz(unsigned int f) - { - while (f && f < 1000000) -@@ -874,6 +909,10 @@ - if (GetFrontendStatus(NewStatus)) - Status = NewStatus; - cMutexLock MutexLock(&mutex); -+ if (SendDiseqc) { -+ CHECK(ioctl(fd_frontend, FE_DISEQC_SEND_MASTER_CMD, &diseqc_cmd)); -+ SendDiseqc=false; -+ } - int WaitTime = 1000; - switch (tunerStatus) { - case tsIdle: -@@ -1576,6 +1615,11 @@ - return dvbTuner ? dvbTuner->Locked(TimeoutMs) : false; - } - -+bool cDvbDevice::SendDiseqcCmd(dvb_diseqc_master_cmd cmd) -+{ -+ return dvbTuner->SendDiseqcCmd(cmd); -+} -+ - void cDvbDevice::SetTransferModeForDolbyDigital(int Mode) - { - setTransferModeForDolbyDigital = Mode; ---- a/dvbdevice.h -+++ b/dvbdevice.h -@@ -242,6 +242,7 @@ - virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView); - public: - virtual bool HasLock(int TimeoutMs = 0) const; -+ virtual bool SendDiseqcCmd(dvb_diseqc_master_cmd cmd); - - // PID handle facilities - diff -Nru vdr-2.1.6/debian/patches/opt-45_yaepg.patch vdr-2.1.6-297~3e4e445/debian/patches/opt-45_yaepg.patch --- vdr-2.1.6/debian/patches/opt-45_yaepg.patch 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/opt-45_yaepg.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,77 +0,0 @@ -Description: This patch is needed for the yaepg plugin. -Author: bball950@yahoo.com -Origin: http://www.hoochvdr.info/yaepg/vdr-1.3.19-core-yaepg.diff - ---- a/PLUGINS/src/dvbsddevice/dvbsdffosd.c -+++ b/PLUGINS/src/dvbsddevice/dvbsdffosd.c -@@ -77,6 +77,10 @@ - Cmd(OSD_SetWindow, 0, i + 1); - Cmd(OSD_Close); - } -+ if (vidWin.bpp != 0) { -+ Cmd(OSD_SetWindow, 0, MAXNUMWINDOWS); -+ Cmd(OSD_Close); -+ } - shown = false; - } - } -@@ -111,6 +115,10 @@ - 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); -@@ -194,6 +202,11 @@ - 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; - } - } ---- a/device.h -+++ b/device.h -@@ -306,12 +306,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; } ---- a/osd.c -+++ b/osd.c -@@ -1643,6 +1643,7 @@ - } - } - Osds.Append(this); -+ vidWin.bpp = 0; - } - - cOsd::~cOsd() ---- a/osd.h -+++ b/osd.h -@@ -926,6 +926,7 @@ - ///< MyOsdDrawPixmap(Left() + pm->ViewPort().X(), Top() + pm->ViewPort().Y(), pm->Data(), w, h, h * d); - ///< delete pm; - ///< } -+ tArea vidWin; - }; - - #define MAXOSDIMAGES 64 diff -Nru vdr-2.1.6/debian/patches/opt-50_graphtft-liemikuutio.patch vdr-2.1.6-297~3e4e445/debian/patches/opt-50_graphtft-liemikuutio.patch --- vdr-2.1.6/debian/patches/opt-50_graphtft-liemikuutio.patch 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/opt-50_graphtft-liemikuutio.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -Description: Patch required for the GraphTFT plugin with liemikuutio patch. -Author: Jörg Wendel (Horchi) -Origin: https://vdr-graphtft.svn.sourceforge.net/svnroot/vdr-graphtft - ---- a/menu.c -+++ b/menu.c -@@ -2395,6 +2395,7 @@ - public: - cMenuEditRecording(cRecording *Recording); - virtual eOSState ProcessKey(eKeys Key); -+ virtual const char* MenuKind() { return "MenuRenameRecording"; } - }; - - cMenuEditRecording::cMenuEditRecording(cRecording *Recording) diff -Nru vdr-2.1.6/debian/patches/opt-50_graphtft.patch vdr-2.1.6-297~3e4e445/debian/patches/opt-50_graphtft.patch --- vdr-2.1.6/debian/patches/opt-50_graphtft.patch 2014-04-02 17:59:41.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/opt-50_graphtft.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,331 +0,0 @@ -Description: Patch required for the GraphTFT plugin. -Author: Jrg Wendel (Horchi) -Origin: https://vdr-graphtft.svn.sourceforge.net/svnroot/vdr-graphtft - ---- a/menu.c -+++ b/menu.c -@@ -168,6 +168,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) -@@ -357,6 +358,7 @@ - cMenuChannels(void); - ~cMenuChannels(); - virtual eOSState ProcessKey(eKeys Key); -+ virtual const char* MenuKind() { return "MenuChannels"; } - }; - - cMenuChannels::cMenuChannels(void) -@@ -1098,6 +1100,7 @@ - cMenuTimers(void); - virtual ~cMenuTimers(); - virtual eOSState ProcessKey(eKeys Key); -+ virtual const char* MenuKind() { return "MenuTimers"; } - }; - - cMenuTimers::cMenuTimers(void) -@@ -1260,6 +1263,7 @@ - { - cOsdMenu::Display(); - DisplayMenu()->SetEvent(event); -+ cStatus::MsgOsdSetEvent(event); - if (event->Description()) - cStatus::MsgOsdTextItem(event->Description()); - } -@@ -1389,6 +1393,8 @@ - static void SetCurrentChannel(int ChannelNr) { currentChannel = ChannelNr; } - static const cEvent *ScheduleEvent(void); - virtual eOSState ProcessKey(eKeys Key); -+ virtual const char* MenuKind() { return now ? "MenuWhatsOnNow" : "MenuWhatsOnNext"; } -+ virtual void Display(void); - }; - - int cMenuWhatsOn::currentChannel = 0; -@@ -1417,6 +1423,18 @@ - SetHelpKeys(); - } - -+void cMenuWhatsOn::Display(void) -+{ -+ cOsdMenu::Display(); -+ -+ if (Count() > 0) { -+ int ni = 0; -+ for (cOsdItem *item = First(); item; item = Next(item)) { -+ cStatus::MsgOsdEventItem(((cMenuScheduleItem*)item)->event, item->Text(), ni++, Count()); -+ } -+ } -+} -+ - bool cMenuWhatsOn::Update(void) - { - bool result = false; -@@ -1557,6 +1575,8 @@ - cMenuSchedule(void); - virtual ~cMenuSchedule(); - virtual eOSState ProcessKey(eKeys Key); -+ virtual const char* MenuKind() { return "MenuSchedule"; } -+ virtual void Display(void); - }; - - cMenuSchedule::cMenuSchedule(void) -@@ -1583,6 +1603,18 @@ - cMenuWhatsOn::ScheduleEvent(); // makes sure any posted data is cleared - } - -+void cMenuSchedule::Display(void) -+{ -+ cOsdMenu::Display(); -+ -+ if (Count() > 0) { -+ int ni = 0; -+ for (cOsdItem *item = First(); item; item = Next(item)) { -+ cStatus::MsgOsdEventItem(((cMenuScheduleItem*)item)->event, item->Text(), ni++, Count()); -+ } -+ } -+} -+ - void cMenuSchedule::PrepareScheduleAllThis(const cEvent *Event, const cChannel *Channel) - { - Clear(); -@@ -1947,6 +1979,7 @@ - cMenuCam(cCamSlot *CamSlot); - virtual ~cMenuCam(); - virtual eOSState ProcessKey(eKeys Key); -+ virtual const char* MenuKind() { return "MenuCam"; } - }; - - cMenuCam::cMenuCam(cCamSlot *CamSlot) -@@ -2437,6 +2470,7 @@ - cMenuRecording(cRecording *Recording, bool WithButtons = false); - virtual void Display(void); - virtual eOSState ProcessKey(eKeys Key); -+ virtual const char* MenuKind() { return "MenuRecording"; } - }; - - cMenuRecording::cMenuRecording(cRecording *Recording, bool WithButtons) -@@ -2472,6 +2506,7 @@ - } - cOsdMenu::Display(); - DisplayMenu()->SetRecording(recording); -+ cStatus::MsgOsdSetRecording(recording); - if (recording->Info()->Description()) - cStatus::MsgOsdTextItem(recording->Info()->Description()); - } -@@ -2932,6 +2967,7 @@ - cMenuSetupOSD(void); - virtual ~cMenuSetupOSD(); - virtual eOSState ProcessKey(eKeys Key); -+ virtual const char* MenuKind() { return "MenuSetupOsd"; } - }; - - cMenuSetupOSD::cMenuSetupOSD(void) -@@ -3085,6 +3121,7 @@ - public: - cMenuSetupEPG(void); - virtual eOSState ProcessKey(eKeys Key); -+ virtual const char* MenuKind() { return "MenuSetupEpg"; } - }; - - cMenuSetupEPG::cMenuSetupEPG(void) -@@ -3182,6 +3219,7 @@ - public: - cMenuSetupDVB(void); - virtual eOSState ProcessKey(eKeys Key); -+ virtual const char* MenuKind() { return "MenuSetupDvb"; } - }; - - cMenuSetupDVB::cMenuSetupDVB(void) -@@ -3327,6 +3365,7 @@ - public: - cMenuSetupLNB(void); - virtual eOSState ProcessKey(eKeys Key); -+ virtual const char* MenuKind() { return "MenuSetupLnb"; } - }; - - cMenuSetupLNB::cMenuSetupLNB(void) -@@ -3441,6 +3480,7 @@ - public: - cMenuSetupCAM(void); - virtual eOSState ProcessKey(eKeys Key); -+ virtual const char* MenuKind() { return "MenuSetupCam"; } - }; - - cMenuSetupCAM::cMenuSetupCAM(void) -@@ -3628,6 +3668,7 @@ - public: - cMenuSetupPlugins(void); - virtual eOSState ProcessKey(eKeys Key); -+ virtual const char* MenuKind() { return "MenuSetupPlugins"; } - }; - - cMenuSetupPlugins::cMenuSetupPlugins(void) -@@ -3683,6 +3724,7 @@ - public: - cMenuSetup(void); - virtual eOSState ProcessKey(eKeys Key); -+ virtual const char* MenuKind() { return "MenuSetup"; } - }; - - cMenuSetup::cMenuSetup(void) ---- a/menu.h -+++ b/menu.h -@@ -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 cMenuFolder : public cOsdMenu { -@@ -86,6 +87,7 @@ - cMenuEditTimer(cTimer *Timer, bool New = false); - virtual ~cMenuEditTimer(); - virtual eOSState ProcessKey(eKeys Key); -+ virtual const char* MenuKind() { return "MenuTimerEdit"; } - }; - - class cMenuEvent : public cOsdMenu { -@@ -95,6 +97,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 { -@@ -111,6 +114,7 @@ - cMenuMain(eOSState State = osUnknown, bool OpenSubMenus = false); - virtual eOSState ProcessKey(eKeys Key); - static cOsdObject *PluginOsdObject(void); -+ virtual const char* MenuKind() { return "MenuMain"; } - }; - - class cDisplayChannel : public cOsdObject { -@@ -226,6 +230,7 @@ - virtual eOSState ProcessKey(eKeys Key); - static void SetPath(const char *Path); - static void SetRecording(const char *FileName); -+ virtual const char* MenuKind() { return "MenuRecordings"; } - }; - - class cRecordControl { ---- a/menuitems.h -+++ b/menuitems.h -@@ -220,6 +220,7 @@ - cMenuSetupPage(void); - virtual eOSState ProcessKey(eKeys Key); - void SetPlugin(cPlugin *Plugin); -+ const char* MenuKind() { return "MenuSetupPage"; } - }; - - #endif //__MENUITEMS_H ---- a/osdbase.c -+++ b/osdbase.c -@@ -105,6 +105,7 @@ - free(status); - displayMenu->Clear(); - cStatus::MsgOsdClear(); -+ cStatus::MsgOsdMenuDestroy(); - if (!--displayMenuCount) - DELETENULL(displayMenu); - } -@@ -224,6 +225,7 @@ - cStatus::MsgOsdClear(); - if (menuCategory != displayMenu->MenuCategory()) - displayMenu->SetMenuCategory(menuCategory); -+ cStatus::MsgOsdMenuDisplay(MenuKind()); - displayMenuItems = displayMenu->MaxItems(); - displayMenu->SetTabs(cols[0], cols[1], cols[2], cols[3], cols[4]);//XXX - displayMenu->SetTitle(title); ---- a/osdbase.h -+++ b/osdbase.h -@@ -136,6 +136,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 ---- a/recording.h -+++ b/recording.h -@@ -84,6 +84,7 @@ - const cEvent *GetEvent(void) const { return event; } - const char *Title(void) const { return event->Title(); } - const char *ShortText(void) const { return event->ShortText(); } -+ tEventID EventID(void) const { return event->EventID(); } - const char *Description(void) const { return event->Description(); } - const cComponents *Components(void) const { return event->Components(); } - const char *Aux(void) const { return aux; } ---- a/status.c -+++ b/status.c -@@ -130,3 +130,32 @@ - for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) - sm->OsdProgramme(PresentTime, PresentTitle, PresentSubtitle, FollowingTime, FollowingTitle, FollowingSubtitle); - } -+ -+void cStatus::MsgOsdSetEvent(const cEvent* event) -+{ -+ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) -+ sm->OsdSetEvent(event); -+} -+ -+void cStatus::MsgOsdSetRecording(const cRecording* recording) -+{ -+ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) -+ sm->OsdSetRecording(recording); -+} -+ -+void cStatus::MsgOsdMenuDisplay(const char* kind) -+{ -+ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) -+ sm->OsdMenuDisplay(kind); -+} -+ -+void cStatus::MsgOsdMenuDestroy() -+{ -+ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) -+ sm->OsdMenuDestroy(); -+} -+void cStatus::MsgOsdEventItem(const cEvent* Event, const char *Text, int Index, int Count) -+{ -+ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) -+ sm->OsdEventItem(Event, Text, Index, Count); -+} ---- a/status.h -+++ b/status.h -@@ -84,6 +84,17 @@ - // The OSD displays the single line Text with the current channel information. - virtual void OsdProgramme(time_t PresentTime, const char *PresentTitle, const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, const char *FollowingSubtitle) {} - // The OSD displays the given programme information. -+ virtual void OsdSetRecording(const cRecording* recording) {} -+ // The OSD displays the recording information. -+ virtual void OsdSetEvent(const cEvent* event) {} -+ // The OSD displays the event information. -+ virtual void OsdMenuDisplay(const char* kind) {} -+ // report menu creation -+ virtual void OsdMenuDestroy() {} -+ // report menu destruvtion -+ virtual void OsdEventItem(const cEvent* Event, const char *Text, int Index, int Count) {} -+ // The OSD displays the given single line Event as menu item at Index. -+ - public: - cStatus(void); - virtual ~cStatus(); -@@ -106,6 +117,11 @@ - static void MsgOsdTextItem(const char *Text, bool Scroll = false); - static void MsgOsdChannel(const char *Text); - static void MsgOsdProgramme(time_t PresentTime, const char *PresentTitle, const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, const char *FollowingSubtitle); -+ static void MsgOsdSetEvent(const cEvent* event); -+ static void MsgOsdSetRecording(const cRecording* recording); -+ static void MsgOsdMenuDisplay(const char* kind); -+ static void MsgOsdMenuDestroy(); -+ static void MsgOsdEventItem(const cEvent* Event, const char *Text, int Index, int Count); - }; - - #endif //__STATUS_H diff -Nru vdr-2.1.6/debian/patches/opt-55_wareagleicon.patch vdr-2.1.6-297~3e4e445/debian/patches/opt-55_wareagleicon.patch --- vdr-2.1.6/debian/patches/opt-55_wareagleicon.patch 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/opt-55_wareagleicon.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,268 +0,0 @@ -Description: Adds some icons to timer, recording and channel list -Origin: http://toms-cafe.de/vdr/download/vdr-wareagle-icons+setup-1.3.22.diff -Forwarded: no -Author: Torsten Kunkel <vdr@tkunkel.de> -Author: Thomas Günther <tom@toms-cafe.de> ---- a/config.c -+++ b/config.c -@@ -376,6 +376,7 @@ - strcpy(OSDLanguage, ""); // default is taken from environment - strcpy(OSDSkin, "lcars"); - strcpy(OSDTheme, "default"); -+ WarEagleIcons = 1; - PrimaryDVB = 1; - ShowInfoOnChSwitch = 1; - TimeoutRequChInfo = 1; -@@ -585,6 +586,7 @@ - if (!strcasecmp(Name, "OSDLanguage")) { strn0cpy(OSDLanguage, Value, sizeof(OSDLanguage)); I18nSetLocale(OSDLanguage); } - else if (!strcasecmp(Name, "OSDSkin")) Utf8Strn0Cpy(OSDSkin, Value, MaxSkinName); - else if (!strcasecmp(Name, "OSDTheme")) Utf8Strn0Cpy(OSDTheme, Value, MaxThemeName); -+ else if (!strcasecmp(Name, "WarEagleIcons")) WarEagleIcons = atoi(Value); - else if (!strcasecmp(Name, "PrimaryDVB")) PrimaryDVB = atoi(Value); - else if (!strcasecmp(Name, "ShowInfoOnChSwitch")) ShowInfoOnChSwitch = atoi(Value); - else if (!strcasecmp(Name, "TimeoutRequChInfo")) TimeoutRequChInfo = atoi(Value); -@@ -698,6 +700,7 @@ - Store("OSDLanguage", OSDLanguage); - Store("OSDSkin", OSDSkin); - Store("OSDTheme", OSDTheme); -+ Store("WarEagleIcons", WarEagleIcons); - Store("PrimaryDVB", PrimaryDVB); - Store("ShowInfoOnChSwitch", ShowInfoOnChSwitch); - Store("TimeoutRequChInfo", TimeoutRequChInfo); ---- a/config.h -+++ b/config.h -@@ -259,6 +259,7 @@ - char OSDLanguage[I18N_MAX_LOCALE_LEN]; - char OSDSkin[MaxSkinName]; - char OSDTheme[MaxThemeName]; -+ int WarEagleIcons; - int PrimaryDVB; - int ShowInfoOnChSwitch; - int TimeoutRequChInfo; ---- /dev/null -+++ b/iconpatch.c -@@ -0,0 +1,28 @@ -+ -+#include "iconpatch.h" -+ -+#include <langinfo.h> -+#include <locale.h> -+#include <stdio.h> -+#include <stdlib.h> -+#include <string.h> -+ -+bool IsLangUtf8(void) -+{ -+ char *CodeSet = NULL; -+ if (setlocale(LC_CTYPE, "")) -+ CodeSet = nl_langinfo(CODESET); -+ else { -+ char *LangEnv = getenv("LANG"); // last resort in case locale stuff isn't installed -+ if (LangEnv) { -+ CodeSet = strchr(LangEnv, '.'); -+ if (CodeSet) -+ CodeSet++; // skip the dot -+ } -+ } -+ -+ if (CodeSet && strcasestr(CodeSet, "UTF-8") != 0) -+ return true; -+ -+ return false; -+} ---- /dev/null -+++ b/iconpatch.h -@@ -0,0 +1,72 @@ -+/* -+ * iconpatch.h: Information of iconpatch -+ * -+ * Diese Datei ist die Übersichtsdatei für den Iconpatch. -+ * Hier werden kleine Infos abgelegt. -+ * Der Iconpatch ändert die Dateien: -+ * iconpatch.h -+ * menu.c -+ * recording.c -+ * fontosd.c -+ * -+ */ -+ -+// Iconpatch-Variablen - Anfang -+#define ICON_NUMBERSIGN "\x23" -+#define ICON_ASTERISK "\x2A" -+#define ICON_GREATER "\x3E" -+#define ICON_EXCLAM "\x21" -+#define ICON_PLUSMINUS "\xB1" -+ -+#define ICON_RESUME "\x80" -+#define ICON_DVD "\x81" -+#define ICON_FOLDER "\x82" -+#define ICON_BLANK "\x83" -+#define ICON_CUTTING "\x84" -+#define ICON_MOVE_FILE "\x85" -+#define ICON_MOVE_FOLDER "\x86" -+#define ICON_BAR_START "\x87" -+#define ICON_BAR_FILLED "\x88" -+#define ICON_BAR_CLEAR "\x89" -+#define ICON_BAR_END "\x8A" -+#define ICON_REC "\x8B" -+#define ICON_CLOCK "\x8C" -+#define ICON_TV_CRYPTED "\x8D" -+#define ICON_RADIO "\x8E" -+#define ICON_TV "\x8F" -+#define ICON_NEW "\x90" -+#define ICON_ARROW "\x91" -+#define ICON_RUNNING "\x92" -+#define ICON_VPS "\x93" -+#define ICON_CLOCK_UH "\x94" -+#define ICON_CLOCK_LH "\x95" -+ -+// UTF-8 Icons -+#define ICON_RESUME_UTF8 "\uE000" -+#define ICON_DVD_UTF8 "\uE001" -+#define ICON_FOLDER_UTF8 "\uE002" -+#define ICON_BLANK_UTF8 "\uE003" -+#define ICON_CUTTING_UTF8 "\uE004" -+#define ICON_MOVE_FILE_UTF8 "\uE005" -+#define ICON_MOVE_FOLDER_UTF8 "\uE006" -+#define ICON_BAR_START_UTF8 "\uE007" -+#define ICON_BAR_FILLED_UTF8 "\uE008" -+#define ICON_BAR_EMPTY_UTF8 "\uE009" -+#define ICON_BAR_CLOSE_UTF8 "\uE00A" -+#define ICON_REC_UTF8 "\uE00B" -+#define ICON_CLOCK_UTF8 "\uE00C" -+#define ICON_TV_CRYPTED_UTF8 "\uE00D" -+#define ICON_RADIO_UTF8 "\uE00E" -+#define ICON_TV_UTF8 "\uE00F" -+#define ICON_NEW_UTF8 "\uE010" -+#define ICON_ARROW_UTF8 "\uE011" -+#define ICON_RUNNING_UTF8 "\uE012" -+#define ICON_VPS_UTF8 "\uE013" -+#define ICON_CLOCK_UH_UTF8 "\uE014" -+#define ICON_CLOCK_LH_UTF8 "\uE015" -+ -+// Iconpatch-Variablen - Ende -+ -+bool IsLangUtf8(void); -+ -+ ---- a/Makefile -+++ b/Makefile -@@ -74,6 +74,7 @@ - timers.o tools.o transfer.o vdr.o videodir.o - - OBJS += vdrttxtsubshooks.o -+OBJS += iconpatch.o - - DEFINES += $(CDEFINES) - INCLUDES += $(CINCLUDES) ---- a/menu.c -+++ b/menu.c -@@ -8,6 +8,7 @@ - */ - - #include "menu.h" -+#include "iconpatch.h" - #include <ctype.h> - #include <limits.h> - #include <math.h> -@@ -319,6 +320,14 @@ - if (!channel->GroupSep()) { - if (sortMode == csmProvider) - buffer = cString::sprintf("%d\t%s - %s", channel->Number(), channel->Provider(), channel->Name()); -+ else if (Setup.WarEagleIcons) { -+ if (channel->Vpid() == 1 || channel->Vpid() == 0) -+ buffer = cString::sprintf("%d\t%s %-30s", channel->Number(), IsLangUtf8() ? ICON_RADIO_UTF8 : ICON_RADIO, channel->Name()); -+ else if (channel->Ca() == 0) -+ buffer = cString::sprintf("%d\t%s %-30s", channel->Number(), IsLangUtf8() ? ICON_TV_UTF8 : ICON_TV, channel->Name()); -+ else -+ buffer = cString::sprintf("%d\t%s %-30s", channel->Number(), IsLangUtf8() ? ICON_TV_CRYPTED_UTF8 : ICON_TV_CRYPTED, channel->Name()); -+ } - else - buffer = cString::sprintf("%d\t%s", channel->Number(), channel->Name()); - } -@@ -1053,9 +1062,9 @@ - File = timer->File(); - cCharSetConv csc("ISO-8859-1", cCharSetConv::SystemCharacterTable()); - char diskStatusString[2] = { diskStatus, 0 }; -- SetText(cString::sprintf("%s%c\t%d\t%s%s%s\t%02d:%02d\t%02d:%02d\t%s", -+ SetText(cString::sprintf("%s%s\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->HasFlags(tfActive)) ? " " : timer->FirstDay() ? Setup.WarEagleIcons ? IsLangUtf8() ? ICON_ARROW_UTF8 : ICON_ARROW : "!" : timer->Recording() ? Setup.WarEagleIcons ? IsLangUtf8() ? ICON_REC_UTF8 : ICON_REC : "#" : Setup.WarEagleIcons ? IsLangUtf8() ? ICON_CLOCK_UTF8 : ICON_CLOCK : ">", - timer->Channel()->Number(), - *name, - *name && **name ? " " : "", -@@ -1451,7 +1460,12 @@ - return r; - } - --static const char *TimerMatchChars = " tT"; -+static const char *TimerMatchChars[9] = -+{ -+ " ", "t", "T", -+ ICON_BLANK, ICON_CLOCK_UH, ICON_CLOCK, -+ ICON_BLANK_UTF8, ICON_CLOCK_UH_UTF8, ICON_CLOCK_UTF8 -+}; - - bool cMenuScheduleItem::Update(bool Force) - { -@@ -1460,17 +1474,17 @@ - Timers.GetMatch(event, &timerMatch); - if (Force || timerMatch != OldTimerMatch) { - cString buffer; -- char t = TimerMatchChars[timerMatch]; -- char v = event->Vps() && (event->Vps() - event->StartTime()) ? 'V' : ' '; -- char r = event->SeenWithin(30) && event->IsRunning() ? '*' : ' '; -+ const char *t = Setup.WarEagleIcons ? IsLangUtf8() ? TimerMatchChars[timerMatch+6] : TimerMatchChars[timerMatch+3] : TimerMatchChars[timerMatch]; -+ const char *v = event->Vps() && (event->Vps() - event->StartTime()) ? Setup.WarEagleIcons ? IsLangUtf8() ? ICON_VPS_UTF8 : ICON_VPS : "V" : " "; -+ const char *r = event->SeenWithin(30) && event->IsRunning() ? Setup.WarEagleIcons ? IsLangUtf8() ? ICON_RUNNING_UTF8 : ICON_RUNNING : "*" : " "; - const char *csn = channel ? channel->ShortName(true) : NULL; - cString eds = event->GetDateString(); - if (channel && withDate) -- buffer = cString::sprintf("%d\t%.*s\t%.*s\t%s\t%c%c%c\t%s", channel->Number(), Utf8SymChars(csn, 999), csn, Utf8SymChars(eds, 6), *eds, *event->GetTimeString(), t, v, r, event->Title()); -+ buffer = cString::sprintf("%d\t%.*s\t%.*s\t%s\t%s%s%s\t%s", channel->Number(), Utf8SymChars(csn, 999), 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, 999), csn, *event->GetTimeString(), t, v, r, event->Title()); -+ buffer = cString::sprintf("%d\t%.*s\t%s\t%s%s%s\t%s", channel->Number(), Utf8SymChars(csn, 999), csn, *event->GetTimeString(), t, v, r, event->Title()); - else -- buffer = cString::sprintf("%.*s\t%s\t%c%c%c\t%s", Utf8SymChars(eds, 6), *eds, *event->GetTimeString(), t, v, r, event->Title()); -+ buffer = cString::sprintf("%.*s\t%s\t%s%s%s\t%s", Utf8SymChars(eds, 6), *eds, *event->GetTimeString(), t, v, r, event->Title()); - SetText(buffer); - result = true; - } -@@ -2920,6 +2934,7 @@ - Add(new cMenuEditStraItem(tr("Setup.OSD$Skin"), &skinIndex, numSkins, skinDescriptions)); - if (themes.NumThemes()) - Add(new cMenuEditStraItem(tr("Setup.OSD$Theme"), &themeIndex, themes.NumThemes(), themes.Descriptions())); -+ Add(new cMenuEditBoolItem(tr("Setup.OSD$WarEagle icons"), &data.WarEagleIcons)); - Add(new cMenuEditPrcItem( tr("Setup.OSD$Left (%)"), &data.OSDLeftP, 0.0, 0.5)); - Add(new cMenuEditPrcItem( tr("Setup.OSD$Top (%)"), &data.OSDTopP, 0.0, 0.5)); - Add(new cMenuEditPrcItem( tr("Setup.OSD$Width (%)"), &data.OSDWidthP, 0.5, 1.0)); ---- a/recording.c -+++ b/recording.c -@@ -8,6 +8,7 @@ - */ - - #include "recording.h" -+#include "iconpatch.h" - #include <ctype.h> - #include <dirent.h> - #include <errno.h> -@@ -1002,7 +1003,7 @@ - - const char *cRecording::Title(char Delimiter, bool NewIndicator, int Level) const - { -- char New = NewIndicator && IsNew() ? '*' : ' '; -+ const char *New = NewIndicator && IsNew() ? Setup.WarEagleIcons ? IsLangUtf8() ? ICON_NEW_UTF8 : ICON_NEW : "*" : " "; - free(titleBuffer); - titleBuffer = NULL; - if (Level < 0 || Level == HierarchyLevels()) { -@@ -1022,7 +1023,7 @@ - Minutes % 60 - ); - } -- titleBuffer = strdup(cString::sprintf("%02d.%02d.%02d%c%02d:%02d%s%c%c%s", -+ titleBuffer = strdup(cString::sprintf("%02d.%02d.%02d%c%02d:%02d%s%s%c%s", - t->tm_mday, - t->tm_mon + 1, - t->tm_year % 100, diff -Nru vdr-2.1.6/debian/patches/opt-56_eventdetails_v3.patch vdr-2.1.6-297~3e4e445/debian/patches/opt-56_eventdetails_v3.patch --- vdr-2.1.6/debian/patches/opt-56_eventdetails_v3.patch 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/opt-56_eventdetails_v3.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,109 +0,0 @@ -Description: Patch for vdr-plugin-restfulapi -Author: Michael Eiler <eiler.mike@gmail.com> -Origin: https://github.com/yavdr/vdr-plugin-restfulapi - ---- a/epg.c -+++ b/epg.c -@@ -429,6 +429,21 @@ - return buf; - } - -+void cEvent::AddDetail(char* value) -+{ -+ std::string strValue = std::string(value); -+ int delim = strValue.find_first_of(' '); -+ AddDetail(strValue.substr(0, delim), strValue.substr(delim+1)); -+} -+ -+void cEvent::AddDetail(std::string key, std::string value) -+{ -+ tEpgDetail detail; -+ detail.key = key; -+ detail.value = value; -+ details.push_back(detail); -+} -+ - void cEvent::Dump(FILE *f, const char *Prefix, bool InfoOnly) const - { - if (InfoOnly || startTime + duration + Setup.EPGLinger * 60 >= time(NULL)) { -@@ -442,6 +457,12 @@ - fprintf(f, "%sD %s\n", Prefix, description); - strreplace(description, '|', '\n'); - } -+ for(int i=0;i<(int)details.size();i++) { -+ char* value = (char*)details[i].value.c_str(); -+ strreplace(value, '\n', '|'); -+ fprintf(f, "K %s %s\n", details[i].key.c_str(), value); -+ strreplace(value, '|', '\n'); -+ } - if (contents[0]) { - fprintf(f, "%sG", Prefix); - for (int i = 0; Contents(i); i++) -@@ -474,6 +495,9 @@ - case 'D': strreplace(t, '|', '\n'); - SetDescription(t); - break; -+ case 'K': strreplace(t, '|', '\n'); -+ AddDetail(t); -+ break; - case 'G': { - memset(contents, 0, sizeof(contents)); - for (int i = 0; i < MaxEventContents; i++) { -@@ -538,6 +562,7 @@ - } - } - } -+ if (Event != NULL) { Event->ClearDetails(); } - break; - case 'e': if (Event && !Event->Title()) - Event->SetTitle(tr("No title")); ---- a/epg.h -+++ b/epg.h -@@ -17,6 +17,8 @@ - #include "libsi/section.h" - #include "thread.h" - #include "tools.h" -+#include <string> -+#include <vector> - - #define MAXEPGBUGFIXLEVEL 3 - -@@ -64,6 +66,12 @@ - // In case of an audio stream the 'type' check actually just distinguishes between "normal" and "Dolby Digital" - }; - -+#define EPG_DETAILS_PATCH -+struct tEpgDetail { -+ std::string key; -+ std::string value; -+ }; -+ - class cSchedule; - - typedef u_int32_t tEventID; -@@ -87,6 +95,7 @@ - int duration; // Duration of this event in seconds - time_t vps; // Video Programming Service timestamp (VPS, aka "Programme Identification Label", PIL) - time_t seen; // When this event was last seen in the data stream -+ std::vector< struct tEpgDetail > details; // additional information provided by epg source - public: - cEvent(tEventID EventID); - ~cEvent(); -@@ -117,6 +126,7 @@ - cString GetTimeString(void) const; - cString GetEndTimeString(void) const; - cString GetVpsString(void) const; -+ const std::vector< struct tEpgDetail >& Details(void) const { return details; }; - void SetEventID(tEventID EventID); - void SetTableID(uchar TableID); - void SetVersion(uchar Version); -@@ -131,6 +141,9 @@ - void SetDuration(int Duration); - void SetVps(time_t Vps); - void SetSeen(void); -+ void AddDetail(char* value); -+ void AddDetail(std::string key, std::string value); -+ void ClearDetails() { details.erase(details.begin(), details.end()); }; - cString ToDescr(void) const; - void Dump(FILE *f, const char *Prefix = "", bool InfoOnly = false) const; - bool Parse(char *s); diff -Nru vdr-2.1.6/debian/patches/opt-57_vdr-remote_instant_recordings.patch vdr-2.1.6-297~3e4e445/debian/patches/opt-57_vdr-remote_instant_recordings.patch --- vdr-2.1.6/debian/patches/opt-57_vdr-remote_instant_recordings.patch 2014-04-02 17:59:49.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/opt-57_vdr-remote_instant_recordings.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,105 +0,0 @@ -Description: Patch for vdr-plugin-remotetimers -Author: Frank Schmirler <vdrdev@schmirler.de> -Origin: http://vdr.schmirler.de/ - ---- a/config.h -+++ b/config.h -@@ -42,6 +42,8 @@ - #define MAINMENUHOOKSVERSION "1.0.1" - #define MAINMENUHOOKSVERSNUM 10001 // Version * 10000 + Major * 100 + Minor - -+#define REMOTEINSTANTVERSION 1.0 -+ - #define MAXPRIORITY 99 - #define MINPRIORITY (-MAXPRIORITY) - #define LIVEPRIORITY 0 // priority used when selecting a device for live viewing ---- a/menu.c -+++ b/menu.c -@@ -33,6 +33,8 @@ - #include "videodir.h" - #include "menuorgpatch.h" - -+#include "remotetimers.h" -+ - #define MAXWAIT4EPGINFO 3 // seconds - #define MODETIMEOUT 3 // seconds - #define NEWTIMERLIMIT 120 // seconds until the start time of a new timer created from the Schedule menu, -@@ -4881,6 +4883,50 @@ - - bool cRecordControls::Start(cTimer *Timer, bool Pause) - { -+ if (!Timer) { -+ cTimer *t = new cTimer(true, Pause); -+ -+ //get event -+ cSchedulesLock SchedulesLock; -+ const cEvent *event = NULL;; -+ const cSchedules *Schedules = cSchedules::Schedules(SchedulesLock); -+ if (Schedules) { -+ const cSchedule *Schedule = Schedules->GetSchedule(t->Channel()); -+ if (Schedule) { -+ event = Schedule->GetEventAround(t->StartTime() + INSTANT_REC_EPG_LOOKAHEAD); -+ } -+ } -+ -+ if (cPluginManager::GetPlugin("timersync")) { -+ // sets the file name -+ cRecording recording(t, event); -+ Timers.Add(t); -+ Timers.SetModified(); -+ if (!cReplayControl::LastReplayed()) -+ cReplayControl::SetRecording(recording.FileName()); -+ return true; -+ } -+ else { -+ RemoteTimers_InstantRecording_v1_0 ir; -+ ir.timer = t; -+ ir.pause = Pause; -+ ir.event = event; -+ ir.name = NULL; -+ ir.fileName = NULL; -+ -+ if (cPluginManager::CallFirstService("RemoteTimers::InstantRecording-v1.0", &ir)) { -+ if (!cReplayControl::LastReplayed()) -+ cReplayControl::SetRecording(ir.fileName); -+ delete t; -+ // empty names indicate an error -+ return *ir.fileName && *ir.name; -+ } -+ // service disabled or an error occured and the user confirmed local recording -+ // fall through to local instant recording -+ } -+ delete t; -+ } -+ - static time_t LastNoDiskSpaceMessage = 0; - int FreeMB = 0; - if (Timer) { ---- /dev/null -+++ b/remotetimers.h -@@ -0,0 +1,25 @@ -+/* -+ * remotetimers.h: Public interface of the plugin's services -+ * -+ * See the README file for copyright information and how to reach the author. -+ */ -+ -+#ifndef _SERVICE__H -+#define _SERVICE__H -+ -+#ifndef __TIMERS_H -+#include <vdr/timer.h> -+#include <vdr/epg.h> -+#endif -+ -+struct RemoteTimers_InstantRecording_v1_0 { -+//in -+ const cTimer *timer; -+ bool pause; -+ const cEvent *event; -+//out -+ cString name; -+ cString fileName; -+}; -+ -+#endif //_SERVICE__H diff -Nru vdr-2.1.6/debian/patches/opt-61_dynamite.patch vdr-2.1.6-297~3e4e445/debian/patches/opt-61_dynamite.patch --- vdr-2.1.6/debian/patches/opt-61_dynamite.patch 2014-04-02 17:59:56.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/opt-61_dynamite.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,795 +0,0 @@ -Description: Patch for VDR to support hotpluggable devices via the - dynamite plugin. -Origin: https://github.com/flensrocker/vdr-plugin-dynamite -Forwarded: no -Author: Lars Hanisch <dvb@flensrocker.de> - ---- a/ci.h -+++ b/ci.h -@@ -113,6 +113,8 @@ - cCiAdapter(void); - virtual ~cCiAdapter(); - ///< The derived class must call Cancel(3) in its destructor. -+ virtual bool SetIdle(bool Idle, bool TestOnly) { return false; } -+ virtual bool IsIdle(void) const { return false; } - }; - - class cTPDU; ---- a/device.c -+++ b/device.c -@@ -69,12 +69,22 @@ - cDevice *cDevice::device[MAXDEVICES] = { NULL }; - cDevice *cDevice::primaryDevice = NULL; - cList<cDeviceHook> cDevice::deviceHooks; -+cDevice *cDevice::nextParentDevice = NULL; - --cDevice::cDevice(void) -+cDevice::cDevice(cDevice *ParentDevice) - :patPmtParser(true) --{ -- cardIndex = nextCardIndex++; -- dsyslog("new device number %d", CardIndex() + 1); -+,isIdle(false) -+,parentDevice(ParentDevice) -+,subDevice(NULL) -+{ -+ if (!ParentDevice) -+ parentDevice = nextParentDevice; -+ cDevice::nextParentDevice = NULL; -+ if (parentDevice) -+ cardIndex = parentDevice->cardIndex; -+ else -+ cardIndex = nextCardIndex++; -+ dsyslog("new %sdevice number %d", parentDevice ? "sub-" : "", CardIndex() + 1); - - SetDescription("receiver on device %d", CardIndex() + 1); - -@@ -106,10 +116,14 @@ - for (int i = 0; i < MAXRECEIVERS; i++) - receiver[i] = NULL; - -- if (numDevices < MAXDEVICES) -- device[numDevices++] = this; -+ if (!parentDevice) { -+ if (numDevices < MAXDEVICES) -+ device[numDevices++] = this; -+ else -+ esyslog("ERROR: too many devices or \"dynamite\"-unpatched device creator!"); -+ } - else -- esyslog("ERROR: too many devices!"); -+ parentDevice->subDevice = this; - } - - cDevice::~cDevice() -@@ -120,6 +134,29 @@ - delete dvbSubtitleConverter; - if (this == primaryDevice) - primaryDevice = NULL; -+ if (parentDevice && (parentDevice->subDevice == this)) -+ parentDevice->subDevice = NULL; -+} -+ -+bool cDevice::SetIdle(bool Idle) -+{ -+ if (parentDevice) -+ return parentDevice->SetIdle(Idle); -+ if (isIdle == Idle) -+ return true; -+ if (Receiving(false)) -+ return false; -+ if (Idle) { -+ Detach(player); -+ DetachAllReceivers(); -+ } -+ if (!SetIdleDevice(Idle, true)) -+ return false; -+ isIdle = Idle; -+ if (SetIdleDevice(Idle, false)) -+ return true; -+ isIdle = !Idle; -+ return false; - } - - bool cDevice::WaitForAllDevicesReady(int Timeout) -@@ -158,6 +195,8 @@ - - int cDevice::DeviceNumber(void) const - { -+ if (parentDevice) -+ return parentDevice->DeviceNumber(); - for (int i = 0; i < numDevices; i++) { - if (device[i] == this) - return i; -@@ -358,6 +397,8 @@ - - void cDevice::SetCamSlot(cCamSlot *CamSlot) - { -+ if (parentDevice) -+ return parentDevice->SetCamSlot(CamSlot); - LOCK_THREAD; - camSlot = CamSlot; - } -@@ -565,6 +606,10 @@ - - void cDevice::StartSectionHandler(void) - { -+ if (parentDevice) { -+ parentDevice->StartSectionHandler(); -+ return; -+ } - if (!sectionHandler) { - sectionHandler = new cSectionHandler(this); - AttachFilter(eitFilter = new cEitFilter); -@@ -576,6 +621,10 @@ - - void cDevice::StopSectionHandler(void) - { -+ if (parentDevice) { -+ parentDevice->StopSectionHandler(); -+ return; -+ } - if (sectionHandler) { - delete nitFilter; - delete sdtFilter; -@@ -607,12 +656,17 @@ - - void cDevice::AttachFilter(cFilter *Filter) - { -+ if (parentDevice) -+ return parentDevice->AttachFilter(Filter); -+ SetIdle(false); - if (sectionHandler) - sectionHandler->Attach(Filter); - } - - void cDevice::Detach(cFilter *Filter) - { -+ if (parentDevice) -+ return parentDevice->Detach(Filter); - if (sectionHandler) - sectionHandler->Detach(Filter); - } -@@ -782,6 +836,7 @@ - sectionHandler->SetStatus(false); - sectionHandler->SetChannel(NULL); - } -+ SetIdle(false); - // Tell the camSlot about the channel switch and add all PIDs of this - // channel to it, for possible later decryption: - if (camSlot) -@@ -829,19 +884,27 @@ - { - if (!cTransferControl::ReceiverDevice()) { - cChannel *Channel = Channels.GetByNumber(CurrentChannel()); -- if (Channel) -+ if (Channel) { -+ SetIdle(false); - SetChannelDevice(Channel, false); // this implicitly starts Transfer Mode -+ } - } - } - - int cDevice::Occupied(void) const - { -+ if (parentDevice) -+ return parentDevice->Occupied(); - int Seconds = occupiedTimeout - time(NULL); - return Seconds > 0 ? Seconds : 0; - } - - void cDevice::SetOccupied(int Seconds) - { -+ if (parentDevice) { -+ parentDevice->SetOccupied(Seconds); -+ return; -+ } - if (Seconds >= 0) - occupiedTimeout = time(NULL) + min(Seconds, MAXOCCUPIEDTIMEOUT); - } -@@ -1222,7 +1285,10 @@ - - bool cDevice::AttachPlayer(cPlayer *Player) - { -+ if (parentDevice) -+ return parentDevice->AttachPlayer(Player); - if (CanReplay()) { -+ SetIdle(false); - if (player) - Detach(player); - DELETENULL(liveSubtitle); -@@ -1241,6 +1307,8 @@ - - void cDevice::Detach(cPlayer *Player) - { -+ if (parentDevice) -+ return parentDevice->Detach(Player); - if (Player && player == Player) { - cPlayer *p = player; - player = NULL; // avoids recursive calls to Detach() -@@ -1260,6 +1328,8 @@ - - void cDevice::StopReplay(void) - { -+ if (parentDevice) -+ return parentDevice->StopReplay(); - if (player) { - Detach(player); - if (IsPrimaryDevice()) -@@ -1540,6 +1610,8 @@ - - int cDevice::Priority(void) const - { -+ if (parentDevice) -+ return parentDevice->Priority(); - int priority = IDLEPRIORITY; - if (IsPrimaryDevice() && !Replaying() && HasProgramme()) - priority = TRANSFERPRIORITY; // we use the same value here, no matter whether it's actual Transfer Mode or real live viewing -@@ -1558,6 +1630,8 @@ - - bool cDevice::Receiving(bool Dummy) const - { -+ if (parentDevice) -+ return parentDevice->Receiving(Dummy); - cMutexLock MutexLock(&mutexReceiver); - for (int i = 0; i < MAXRECEIVERS; i++) { - if (receiver[i]) -@@ -1639,10 +1713,13 @@ - - bool cDevice::AttachReceiver(cReceiver *Receiver) - { -+ if (parentDevice) -+ return parentDevice->AttachReceiver(Receiver); - if (!Receiver) - return false; - if (Receiver->device == this) - return true; -+ SetIdle(false); - // activate the following line if you need it - actually the driver should be fixed! - //#define WAIT_FOR_TUNER_LOCK - #ifdef WAIT_FOR_TUNER_LOCK -@@ -1681,6 +1758,8 @@ - - void cDevice::Detach(cReceiver *Receiver) - { -+ if (parentDevice) -+ return parentDevice->Detach(Receiver); - if (!Receiver || Receiver->device != this) - return; - bool receiversLeft = false; -@@ -1710,6 +1789,8 @@ - - void cDevice::DetachAll(int Pid) - { -+ if (parentDevice) -+ return parentDevice->DetachAll(Pid); - if (Pid) { - cMutexLock MutexLock(&mutexReceiver); - for (int i = 0; i < MAXRECEIVERS; i++) { -@@ -1802,3 +1883,25 @@ - ringBuffer->Del(Count); - delivered = false; - } -+ -+// --- cDynamicDeviceProbe ------------------------------------------------------- -+ -+cList<cDynamicDeviceProbe> DynamicDeviceProbes; -+ -+cList<cDynamicDeviceProbe::cDynamicDeviceProbeItem> cDynamicDeviceProbe::commandQueue; -+ -+void cDynamicDeviceProbe::QueueDynamicDeviceCommand(eDynamicDeviceProbeCommand Cmd, const char *DevPath) -+{ -+ if (DevPath) -+ commandQueue.Add(new cDynamicDeviceProbeItem(Cmd, new cString(DevPath))); -+} -+ -+cDynamicDeviceProbe::cDynamicDeviceProbe(void) -+{ -+ DynamicDeviceProbes.Add(this); -+} -+ -+cDynamicDeviceProbe::~cDynamicDeviceProbe() -+{ -+ DynamicDeviceProbes.Del(this, false); -+} ---- a/device.h -+++ b/device.h -@@ -174,7 +174,6 @@ - static int nextCardIndex; - int cardIndex; - protected: -- cDevice(void); - virtual ~cDevice(); - virtual bool Ready(void); - ///< Returns true if this device is ready. Devices with conditional -@@ -201,9 +200,6 @@ - ///< A derived class must call the MakePrimaryDevice() function of its - ///< base class. - public: -- bool IsPrimaryDevice(void) const { return this == primaryDevice && HasDecoder(); } -- int CardIndex(void) const { return cardIndex; } -- ///< Returns the card index of this device (0 ... MAXDEVICES - 1). - int DeviceNumber(void) const; - ///< Returns the number of this device (0 ... numDevices - 1). - virtual cString DeviceType(void) const; -@@ -433,9 +429,6 @@ - ///< 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; } -- ///< Returns the CAM slot that is currently used with this device, -- ///< or NULL if no CAM slot is in use. - - // Image Grab facilities - -@@ -604,9 +597,6 @@ - cTsToPes tsToPesSubtitle; - bool isPlayingVideo; - protected: -- const cPatPmtParser *PatPmtParser(void) const { return &patPmtParser; } -- ///< Returns a pointer to the patPmtParser, so that a derived device -- ///< can use the stream information from it. - virtual bool CanReplay(void) const; - ///< Returns true if this device can currently start a replay session. - virtual bool SetPlayMode(ePlayMode PlayMode); -@@ -821,6 +811,38 @@ - ///< Detaches all receivers from this device for this pid. - virtual void DetachAllReceivers(void); - ///< Detaches all receivers from this device. -+ -+// --- dynamite subdevice patch start --- -+ friend class cDynamicDevice; -+private: -+ static cDevice *nextParentDevice; -+ ///< Holds the parent device for the next subdevice -+ ///< so the dynamite-plugin can work with unpatched plugins -+ bool isIdle; -+protected: -+ cDevice *parentDevice; -+ cDevice *subDevice; -+ cDevice(cDevice *ParentDevice = NULL); -+ const cPatPmtParser *PatPmtParser(void) const { if (parentDevice) return parentDevice->PatPmtParser(); return &patPmtParser; } -+ ///< Returns a pointer to the patPmtParser, so that a derived device -+ ///< can use the stream information from it. -+public: -+ bool IsPrimaryDevice(void) const { if (parentDevice) return parentDevice->IsPrimaryDevice(); return this == primaryDevice && HasDecoder(); } -+ int CardIndex(void) const { if (parentDevice) return parentDevice->cardIndex; return cardIndex; } -+ ///< Returns the card index of this device (0 ... MAXDEVICES - 1). -+ cCamSlot *CamSlot(void) const { if (parentDevice) return parentDevice->CamSlot(); return camSlot; } -+ ///< Returns the CAM slot that is currently used with this device, -+ ///< or NULL if no CAM slot is in use. -+ bool IsSubDevice(void) const { return (parentDevice != NULL); } -+ bool HasSubDevice(void) const { return (subDevice != NULL); } -+ cDevice *SubDevice(void) const { return subDevice; } -+ bool IsIdle(void) const { if (parentDevice) return parentDevice->IsIdle(); return isIdle; } -+ bool SetIdle(bool Idle); -+ virtual bool SetIdleDevice(bool Idle, bool TestOnly) { return false; } -+ ///< Called by SetIdle -+ ///< if TestOnly, don't do anything, just return, if the device -+ ///< can be set to the new idle state -+ // --- dynamite subdevice patch end --- - }; - - /// Derived cDevice classes that can receive channels will have to provide -@@ -857,4 +879,47 @@ - ///< to Get(). - }; - -+/// A plugin that want to create devices handled by the dynamite-plugin needs to create -+/// a cDynamicDeviceProbe derived object on the heap in order to have its Probe() -+/// function called, where it can actually create the appropriate device. -+/// The cDynamicDeviceProbe object must be created in the plugin's constructor, -+/// and deleted in its destructor. -+/// The "DevPath" hasn't to be a physical device or a path in the filesystem. -+/// It can be any string a plugin may react on. -+ -+#define __DYNAMIC_DEVICE_PROBE -+ -+enum eDynamicDeviceProbeCommand { ddpcAttach, ddpcDetach, ddpcService }; -+ -+class cDynamicDeviceProbe : public cListObject { -+ friend class cDynamicDevice; -+private: -+ class cDynamicDeviceProbeItem : public cListObject { -+ public: -+ eDynamicDeviceProbeCommand cmd; -+ cString *devpath; -+ cDynamicDeviceProbeItem(eDynamicDeviceProbeCommand Cmd, cString *DevPath):cmd(Cmd),devpath(DevPath) {} -+ virtual ~cDynamicDeviceProbeItem() { if (devpath) delete devpath; } -+ }; -+ static cList<cDynamicDeviceProbeItem> commandQueue; -+ ///< A list where all attach/detach commands are queued -+ ///< so they can be processed in the MainThreadHook of -+ ///< the dynamite plugin. -+public: -+ static void QueueDynamicDeviceCommand(eDynamicDeviceProbeCommand Cmd, const char *DevPath); -+ ///< Plugins which support cDynamicDeviceProbe must use this function -+ ///< to queue the devices they normally create in their Initialize method. -+ ///< These devices are created as subdevices in the Start-method of the dynamite-plugin. -+ cDynamicDeviceProbe(void); -+ virtual ~cDynamicDeviceProbe(); -+ virtual cDevice *Attach(cDevice *ParentDevice, const char *DevPath) = 0; -+ ///< Probes for a device at the given device-path like /dev/dvb/adapter0/frontend0 -+ ///< or /dev/video0 etc. and creates the appropriate -+ ///< object derived from cDevice if applicable. -+ ///< Returns the device that has been created or NULL if not. -+ ///< The dynamite-plugin will delete the device if it is detached. -+ }; -+ -+extern cList<cDynamicDeviceProbe> DynamicDeviceProbes; -+ - #endif //__DEVICE_H ---- a/dvbci.c -+++ b/dvbci.c -@@ -10,15 +10,18 @@ - #include "dvbci.h" - #include <linux/dvb/ca.h> - #include <sys/ioctl.h> --#include "device.h" -+#include "dvbdevice.h" - - // --- cDvbCiAdapter --------------------------------------------------------- - --cDvbCiAdapter::cDvbCiAdapter(cDevice *Device, int Fd) -+cDvbCiAdapter::cDvbCiAdapter(cDevice *Device, int Fd, int Adapter, int Frontend) - { - device = Device; - SetDescription("CI adapter on device %d", device->DeviceNumber()); - fd = Fd; -+ adapter = Adapter; -+ frontend = Frontend; -+ idle = false; - ca_caps_t Caps; - if (ioctl(fd, CA_GET_CAP, &Caps) == 0) { - if ((Caps.slot_type & CA_CI_LINK) != 0) { -@@ -41,10 +44,44 @@ - cDvbCiAdapter::~cDvbCiAdapter() - { - Cancel(3); -+ if (device->IsSubDevice() || device->HasSubDevice()) -+ CloseCa(); -+} -+ -+bool cDvbCiAdapter::OpenCa(void) -+{ -+ if (fd >= 0) -+ return true; -+ fd = cDvbDevice::DvbOpen(DEV_DVB_CA, adapter, frontend, O_RDWR); -+ return (fd >= 0); -+} -+ -+void cDvbCiAdapter::CloseCa(void) -+{ -+ if (fd < 0) -+ return; -+ close(fd); -+ fd = -1; -+} -+ -+bool cDvbCiAdapter::SetIdle(bool Idle, bool TestOnly) -+{ -+ if ((adapter < 0) || (frontend < 0)) -+ return false; -+ if (TestOnly || (idle == Idle)) -+ return true; -+ if (Idle) -+ CloseCa(); -+ else -+ OpenCa(); -+ idle = Idle; -+ return true; - } - - int cDvbCiAdapter::Read(uint8_t *Buffer, int MaxLength) - { -+ if (idle || (fd < 0)) -+ return 0; - if (Buffer && MaxLength > 0) { - struct pollfd pfd[1]; - pfd[0].fd = fd; -@@ -61,6 +98,8 @@ - - void cDvbCiAdapter::Write(const uint8_t *Buffer, int Length) - { -+ if (idle || (fd < 0)) -+ return; - if (Buffer && Length > 0) { - if (safe_write(fd, Buffer, Length) != Length) - esyslog("ERROR: can't write to CI adapter on device %d: %m", device->DeviceNumber()); -@@ -69,6 +108,8 @@ - - bool cDvbCiAdapter::Reset(int Slot) - { -+ if (idle || (fd < 0)) -+ return false; - if (ioctl(fd, CA_RESET, 1 << Slot) != -1) - return true; - else -@@ -78,6 +119,8 @@ - - eModuleStatus cDvbCiAdapter::ModuleStatus(int Slot) - { -+ if (idle || (fd < 0)) -+ return msNone; - ca_slot_info_t sinfo; - sinfo.num = Slot; - if (ioctl(fd, CA_GET_SLOT_INFO, &sinfo) != -1) { -@@ -99,10 +142,10 @@ - return true; - } - --cDvbCiAdapter *cDvbCiAdapter::CreateCiAdapter(cDevice *Device, int Fd) -+cDvbCiAdapter *cDvbCiAdapter::CreateCiAdapter(cDevice *Device, int Fd, int Adapter, int Frontend) - { - // TODO check whether a CI is actually present? - if (Device) -- return new cDvbCiAdapter(Device, Fd); -+ return new cDvbCiAdapter(Device, Fd, Adapter, Frontend); - return NULL; - } ---- a/dvbci.h -+++ b/dvbci.h -@@ -16,16 +16,24 @@ - private: - cDevice *device; - int fd; -+ int adapter; -+ int frontend; -+ bool idle; -+ -+ bool OpenCa(void); -+ void CloseCa(void); - protected: - virtual int Read(uint8_t *Buffer, int MaxLength); - virtual void Write(const uint8_t *Buffer, int Length); - virtual bool Reset(int Slot); - virtual eModuleStatus ModuleStatus(int Slot); - virtual bool Assign(cDevice *Device, bool Query = false); -- cDvbCiAdapter(cDevice *Device, int Fd); -+ cDvbCiAdapter(cDevice *Device, int Fd, int Adapter = -1, int Frontend = -1); - public: - virtual ~cDvbCiAdapter(); -- static cDvbCiAdapter *CreateCiAdapter(cDevice *Device, int Fd); -+ virtual bool SetIdle(bool Idle, bool TestOnly); -+ virtual bool IsIdle(void) const { return idle; } -+ static cDvbCiAdapter *CreateCiAdapter(cDevice *Device, int Fd, int Adapter = -1, int Frontend = -1); - }; - - #endif //__DVBCI_H ---- a/dvbdevice.c -+++ b/dvbdevice.c -@@ -303,7 +303,7 @@ - enum eTunerStatus { tsIdle, tsSet, tsPositioning, tsTuned, tsLocked }; - int frontendType; - const cDvbDevice *device; -- int fd_frontend; -+ mutable int fd_frontend; - int adapter, frontend; - uint32_t subsystemId; - int tuneTimeout; -@@ -317,7 +317,7 @@ - const cScr *scr; - bool lnbPowerTurnedOn; - eTunerStatus tunerStatus; -- cMutex mutex; -+ mutable cMutex mutex; - cCondVar locked; - cCondVar newSet; - cDvbTuner *bondedTuner; -@@ -333,6 +333,10 @@ - void ResetToneAndVoltage(void); - bool SetFrontend(void); - virtual void Action(void); -+ -+ mutable bool isIdle; -+ bool OpenFrontend(void) const; -+ bool CloseFrontend(void); - public: - cDvbTuner(const cDvbDevice *Device, int Fd_Frontend, int Adapter, int Frontend); - virtual ~cDvbTuner(); -@@ -348,6 +352,8 @@ - const cPositioner *Positioner(void) const { return positioner; } - int GetSignalStrength(void) const; - int GetSignalQuality(void) const; -+ bool SetIdle(bool Idle); -+ bool IsIdle(void) const { return isIdle; } - }; - - cMutex cDvbTuner::bondMutex; -@@ -372,6 +378,7 @@ - tunerStatus = tsIdle; - bondedTuner = NULL; - bondedMaster = false; -+ isIdle = false; - SetDescription("tuner on frontend %d/%d", adapter, frontend); - Start(); - } -@@ -389,6 +396,8 @@ - ExecuteDiseqc(lastDiseqc, &Frequency); - } - */ -+ if (device && device->IsSubDevice()) -+ CloseFrontend(); - } - - bool cDvbTuner::Bond(cDvbTuner *Tuner) -@@ -534,6 +543,8 @@ - - void cDvbTuner::ClearEventQueue(void) const - { -+ if (!OpenFrontend()) -+ return; - cPoller Poller(fd_frontend); - if (Poller.Poll(TUNER_POLL_TIMEOUT)) { - dvb_frontend_event Event; -@@ -777,6 +788,8 @@ - - bool cDvbTuner::SetFrontend(void) - { -+ if (!OpenFrontend()) -+ return false; - #define MAXFRONTENDCMDS 16 - #define SETCMD(c, d) { Frontend[CmdSeq.num].cmd = (c);\ - Frontend[CmdSeq.num].u.data = (d);\ -@@ -929,9 +942,11 @@ - bool LostLock = false; - fe_status_t Status = (fe_status_t)0; - while (Running()) { -- fe_status_t NewStatus; -- if (GetFrontendStatus(NewStatus)) -- Status = NewStatus; -+ if (!isIdle) { -+ fe_status_t NewStatus; -+ if (GetFrontendStatus(NewStatus)) -+ Status = NewStatus; -+ } - cMutexLock MutexLock(&mutex); - int WaitTime = 1000; - switch (tunerStatus) { -@@ -1001,6 +1016,40 @@ - } - } - -+bool cDvbTuner::SetIdle(bool Idle) -+{ -+ if (isIdle == Idle) -+ return true; -+ isIdle = Idle; -+ if (Idle) -+ return CloseFrontend(); -+ return OpenFrontend(); -+} -+ -+bool cDvbTuner::OpenFrontend(void) const -+{ -+ if (fd_frontend >= 0) -+ return true; -+ cMutexLock MutexLock(&mutex); -+ fd_frontend = cDvbDevice::DvbOpen(DEV_DVB_FRONTEND, adapter, frontend, O_RDWR | O_NONBLOCK); -+ if (fd_frontend < 0) -+ return false; -+ isIdle = false; -+ return true; -+} -+ -+bool cDvbTuner::CloseFrontend(void) -+{ -+ if (fd_frontend < 0) -+ return true; -+ cMutexLock MutexLock(&mutex); -+ tunerStatus = tsIdle; -+ newSet.Broadcast(); -+ close(fd_frontend); -+ fd_frontend = -1; -+ return true; -+} -+ - // --- cDvbSourceParam ------------------------------------------------------- - - class cDvbSourceParam : public cSourceParam { -@@ -1089,7 +1138,8 @@ - NULL - }; - --cDvbDevice::cDvbDevice(int Adapter, int Frontend) -+cDvbDevice::cDvbDevice(int Adapter, int Frontend, cDevice *ParentDevice) -+:cDevice(ParentDevice) - { - adapter = Adapter; - frontend = Frontend; -@@ -1109,7 +1159,7 @@ - - fd_ca = DvbOpen(DEV_DVB_CA, adapter, frontend, O_RDWR); - if (fd_ca >= 0) -- ciAdapter = cDvbCiAdapter::CreateCiAdapter(this, fd_ca); -+ ciAdapter = cDvbCiAdapter::CreateCiAdapter(parentDevice ? parentDevice : this, fd_ca, adapter, frontend); - - // The DVR device (will be opened and closed as needed): - -@@ -1349,7 +1399,11 @@ - if (d >= 0) { - int ErrorDevice = 0; - if (cDevice *Device1 = cDevice::GetDevice(i)) { -+ if (Device1->HasSubDevice()) -+ Device1 = Device1->SubDevice(); - if (cDevice *Device2 = cDevice::GetDevice(d)) { -+ if (Device2->HasSubDevice()) -+ Device2 = Device2->SubDevice(); - if (cDvbDevice *DvbDevice1 = dynamic_cast<cDvbDevice *>(Device1)) { - if (cDvbDevice *DvbDevice2 = dynamic_cast<cDvbDevice *>(Device2)) { - if (!DvbDevice1->Bond(DvbDevice2)) -@@ -1383,7 +1437,10 @@ - void cDvbDevice::UnBondDevices(void) - { - for (int i = 0; i < cDevice::NumDevices(); i++) { -- if (cDvbDevice *d = dynamic_cast<cDvbDevice *>(cDevice::GetDevice(i))) -+ cDevice *dev = cDevice::GetDevice(i); -+ if (dev && dev->HasSubDevice()) -+ dev = dev->SubDevice(); -+ if (cDvbDevice *d = dynamic_cast<cDvbDevice *>(dev)) - d->UnBond(); - } - } -@@ -1437,6 +1494,26 @@ - return true; - } - -+bool cDvbDevice::SetIdleDevice(bool Idle, bool TestOnly) -+{ -+ if (TestOnly) { -+ if (ciAdapter) -+ return ciAdapter->SetIdle(Idle, true); -+ return true; -+ } -+ if (!dvbTuner->SetIdle(Idle)) -+ return false; -+ if (ciAdapter && !ciAdapter->SetIdle(Idle, false)) { -+ dvbTuner->SetIdle(!Idle); -+ return false; -+ } -+ if (Idle) -+ StopSectionHandler(); -+ else -+ StartSectionHandler(); -+ return true; -+} -+ - bool cDvbDevice::HasCi(void) - { - return ciAdapter; -@@ -1606,7 +1683,7 @@ - - bool cDvbDevice::ProvidesEIT(void) const - { -- return dvbTuner != NULL; -+ return !IsIdle() && (dvbTuner != NULL) && !dvbTuner->IsIdle() && ((ciAdapter == NULL) || !ciAdapter->IsIdle()); - } - - int cDvbDevice::NumProvidedSystems(void) const ---- a/dvbdevice.h -+++ b/dvbdevice.h -@@ -165,7 +165,7 @@ - /// The cDvbDevice implements a DVB device which can be accessed through the Linux DVB driver API. - - class cDvbDevice : public cDevice { --protected: -+public: - static cString DvbName(const char *Name, int Adapter, int Frontend); - static int DvbOpen(const char *Name, int Adapter, int Frontend, int Mode, bool ReportError = false); - private: -@@ -191,12 +191,14 @@ - mutable bool needsDetachBondedReceivers; - bool QueryDeliverySystems(int fd_frontend); - public: -- cDvbDevice(int Adapter, int Frontend); -+ cDvbDevice(int Adapter, int Frontend, cDevice *ParentDevice = NULL); - virtual ~cDvbDevice(); - int Adapter(void) const { return adapter; } - int Frontend(void) const { return frontend; } - virtual cString DeviceType(void) const; - virtual cString DeviceName(void) const; -+ virtual bool SetIdleDevice(bool Idle, bool TestOnly); -+ - static bool BondDevices(const char *Bondings); - ///< Bonds the devices as defined in the given Bondings string. - ///< A bonding is a sequence of device numbers (starting at 1), diff -Nru vdr-2.1.6/debian/patches/opt-62_hard_link_cutter.patch vdr-2.1.6-297~3e4e445/debian/patches/opt-62_hard_link_cutter.patch --- vdr-2.1.6/debian/patches/opt-62_hard_link_cutter.patch 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/opt-62_hard_link_cutter.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,603 +0,0 @@ -Description: 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. -Author: Udo Richter <udo_richter@gmx.de> -Origin: http://www.udo-richter.de/vdr/patches.html#hlcutter - ---- a/config.c -+++ b/config.c -@@ -451,8 +451,10 @@ - FontSmlSize = 18; - FontFixSize = 20; - MaxVideoFileSize = MAXVIDEOFILESIZEDEFAULT; -+ MaxRecordingSize = DEFAULTRECORDINGSIZE; - SplitEditedFiles = 0; - DelTimeshiftRec = 0; -+ HardLinkCutter = 0; - MinEventTimeout = 30; - MinUserInactivity = 300; - NextWakeupTime = 0; -@@ -655,8 +657,10 @@ - else if (!strcasecmp(Name, "FontSmlSize")) FontSmlSize = atoi(Value); - else if (!strcasecmp(Name, "FontFixSize")) FontFixSize = atoi(Value); - else if (!strcasecmp(Name, "MaxVideoFileSize")) MaxVideoFileSize = atoi(Value); -+ else if (!strcasecmp(Name, "MaxRecordingSize")) MaxRecordingSize = atoi(Value); - else if (!strcasecmp(Name, "SplitEditedFiles")) SplitEditedFiles = atoi(Value); - else if (!strcasecmp(Name, "DelTimeshiftRec")) DelTimeshiftRec = 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); -@@ -762,8 +766,10 @@ - Store("FontSmlSize", FontSmlSize); - Store("FontFixSize", FontFixSize); - Store("MaxVideoFileSize", MaxVideoFileSize); -+ Store("MaxRecordingSize", MaxRecordingSize); - Store("SplitEditedFiles", SplitEditedFiles); - Store("DelTimeshiftRec", DelTimeshiftRec); -+ Store("HardLinkCutter", HardLinkCutter); - Store("MinEventTimeout", MinEventTimeout); - Store("MinUserInactivity", MinUserInactivity); - Store("NextWakeupTime", NextWakeupTime); ---- a/config.h -+++ b/config.h -@@ -322,8 +322,10 @@ - int FontSmlSize; - int FontFixSize; - int MaxVideoFileSize; -+ int MaxRecordingSize; - int SplitEditedFiles; - int DelTimeshiftRec; -+ int HardLinkCutter; - int MinEventTimeout, MinUserInactivity; - time_t NextWakeupTime; - int MultiSpeedMode; ---- a/cutter.c -+++ b/cutter.c -@@ -81,6 +81,7 @@ - Mark = fromMarks.Next(Mark); - off_t FileSize = 0; - int CurrentFileNumber = 0; -+ bool SkipThisSourceFile = false; - int LastIFrame = 0; - toMarks.Add(0); - toMarks.Save(); -@@ -117,13 +118,93 @@ - - // Read one frame: - -- if (fromIndex->Get(Index++, &FileNumber, &FileOffset, &Independent, &Length)) { -- if (FileNumber != CurrentFileNumber) { -- fromFile = fromFileName->SetOffset(FileNumber, FileOffset); -- if (fromFile) -- fromFile->SetReadAhead(MEGABYTE(20)); -- CurrentFileNumber = FileNumber; -+ if (!fromIndex->Get(Index++, &FileNumber, &FileOffset, &Independent, &Length)) { -+ // Error, unless we're past last cut-in and there's no cut-out -+ if (Mark || LastMark) -+ error = "index"; -+ break; -+ } -+ -+ if (FileNumber != CurrentFileNumber) { -+ fromFile = fromFileName->SetOffset(FileNumber, FileOffset); -+ if (fromFile) -+ fromFile->SetReadAhead(MEGABYTE(20)); -+ CurrentFileNumber = FileNumber; -+ if (SkipThisSourceFile) { -+ // At end of fast forward: Always skip to next file -+ toFile = toFileName->NextFile(); -+ if (!toFile) { -+ error = "toFile 4"; -+ break; -+ } -+ FileSize = 0; -+ SkipThisSourceFile = false; - } -+ -+ -+ if (Setup.HardLinkCutter && FileOffset == 0) { -+ // We are at the beginning of a new source file. -+ // Do we need to copy the whole file? -+ -+ // if !Mark && LastMark, then we're past the last cut-out and continue to next I-frame -+ // if !Mark && !LastMark, then there's just a cut-in, but no cut-out -+ // if Mark, then we're between a cut-in and a cut-out -+ -+ uint16_t MarkFileNumber; -+ off_t MarkFileOffset; -+ // Get file number of next cut mark -+ if (!Mark && !LastMark -+ || Mark -+ && fromIndex->Get(Mark->Position(), &MarkFileNumber, &MarkFileOffset) -+ && (MarkFileNumber != CurrentFileNumber)) { -+ // The current source file will be copied completely. -+ // Start new output file unless we did that already -+ if (FileSize != 0) { -+ toFile = toFileName->NextFile(); -+ if (!toFile) { -+ error = "toFile 3"; -+ break; -+ } -+ FileSize = 0; -+ } -+ -+ // Safety check that file has zero size -+ struct stat buf; -+ if (stat(toFileName->Name(), &buf) == 0) { -+ if (buf.st_size != 0) { -+ esyslog("cCuttingThread: File %s exists and has nonzero size", toFileName->Name()); -+ error = "nonzero file exist"; -+ break; -+ } -+ } -+ else if (errno != ENOENT) { -+ esyslog("cCuttingThread: stat failed on %s", toFileName->Name()); -+ error = "stat"; -+ break; -+ } -+ -+ // Clean the existing 0-byte file -+ toFileName->Close(); -+ cString ActualToFileName(ReadLink(toFileName->Name()), true); -+ unlink(ActualToFileName); -+ unlink(toFileName->Name()); -+ -+ // Try to create a hard link -+ if (HardLinkVideoFile(fromFileName->Name(), toFileName->Name())) { -+ // Success. Skip all data transfer for this file -+ SkipThisSourceFile = true; -+ cutIn = false; -+ toFile = NULL; // was deleted by toFileName->Close() -+ } -+ else { -+ // Fallback: Re-open the file if necessary -+ toFile = toFileName->Open(); -+ } -+ } -+ } -+ } -+ -+ if (!SkipThisSourceFile) { - if (fromFile) { - int len = ReadFrame(fromFile, buffer, Length, sizeof(buffer)); - if (len < 0) { -@@ -140,19 +221,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 (Independent) { // every file shall start with an independent frame - if (LastMark) // edited version shall end before next I-frame - break; -- if (FileSize > maxVideoFileSize) { -+ if (!SkipThisSourceFile && FileSize > toFileName->MaxFileSize()) { - toFile = toFileName->NextFile(); - if (!toFile) { - error = "toFile 1"; -@@ -176,7 +250,7 @@ - } - CheckForSeamlessStream = false; - } -- if (cutIn) { -+ if (!SkipThisSourceFile && cutIn) { - if (isPesRecording) - cRemux::SetBrokenLink(buffer, Length); - else -@@ -184,7 +258,7 @@ - cutIn = false; - } - } -- if (toFile->Write(buffer, Length) < 0) { -+ if (!SkipThisSourceFile && toFile->Write(buffer, Length) < 0) { - error = "safe_write"; - break; - } -@@ -229,7 +303,7 @@ - } - } - else -- LastMark = true; -+ LastMark = true; // After last cut-out: Write on until next I-frame, then exit - } - } - Recordings.TouchUpdate(); ---- a/menu.c -+++ b/menu.c -@@ -3481,8 +3481,10 @@ - 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, 0, MAXINSTANTRECTIME, tr("Setup.Recording$present event"))); - Add(new cMenuEditIntItem( tr("Setup.Recording$Max. video file size (MB)"), &data.MaxVideoFileSize, MINVIDEOFILESIZE, MAXVIDEOFILESIZETS)); -+ 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 cMenuEditStraItem(tr("Setup.Recording$Delete timeshift recording"),&data.DelTimeshiftRec, 3, delTimeshiftRecTexts)); -+ Add(new cMenuEditBoolItem(tr("Setup.Recording$Hard Link Cutter"), &data.HardLinkCutter)); - } - - // --- cMenuSetupReplay ------------------------------------------------------ ---- a/po/de_DE.po -+++ b/po/de_DE.po -@@ -1083,12 +1083,18 @@ - msgid "Setup.Recording$Max. video file size (MB)" - msgstr "Max. Videodateigre (MB)" - -+msgid "Setup.Recording$Max. recording size (GB)" -+msgstr "Max. Aufnahmegre (GB)" -+ - msgid "Setup.Recording$Split edited files" - msgstr "Editierte Dateien aufteilen" - - msgid "Setup.Recording$Delete timeshift recording" - msgstr "Zeitversetzte Aufnahme lschen" - -+msgid "Setup.Recording$Hard Link Cutter" -+msgstr "Hard Link Cutter" -+ - msgid "Replay" - msgstr "Wiedergabe" - ---- a/po/fi_FI.po -+++ b/po/fi_FI.po -@@ -1086,12 +1086,18 @@ - msgid "Setup.Recording$Max. video file size (MB)" - msgstr "Suurin tiedostokoko (Mt)" - -+msgid "Setup.Recording$Max. recording size (GB)" -+msgstr "Suurin tallennekoko (Gt)" -+ - msgid "Setup.Recording$Split edited files" - msgstr "Jaottele muokatut tallenteet" - - msgid "Setup.Recording$Delete timeshift recording" - msgstr "Poista ajansiirtotallenne" - -+msgid "Setup.Recording$Hard Link Cutter" -+msgstr "Käytä kovia linkkejä muokkauksessa" -+ - msgid "Replay" - msgstr "Toisto" - ---- /dev/null -+++ b/README-HLCUTTER -@@ -0,0 +1,128 @@ -+ -+ 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 don't -+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, don't 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.3 -+ Fix: Compatible to VDR-1.7.27+ thx to Ville Skyttä -+ New: Add German translation -+ New: Add Finnish translation, thx to Ville Skyttä -+ -+Version 0.2.2 -+ Fix: Adapt to GCC-4.4, thx to Ville Skyttä -+ -+Version 0.2.1 -+ New: Support for TS recordings with up to 65535 files and up to 1TB per file -+ -+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 dangling 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. ---- a/recorder.c -+++ b/recorder.c -@@ -90,7 +90,7 @@ - bool cRecorder::NextFile(void) - { - if (recordFile && frameDetector->IndependentFrame()) { // every file shall start with an independent frame -- if (fileSize > MEGABYTE(off_t(Setup.MaxVideoFileSize)) || RunningLowOnDiskSpace()) { -+ if (fileSize > fileName->MaxFileSize() || RunningLowOnDiskSpace()) { - recordFile = fileName->NextFile(); - fileSize = 0; - } ---- a/recording.c -+++ b/recording.c -@@ -2151,6 +2151,20 @@ - return NULL; - } - -+off_t cFileName::MaxFileSize() { -+ const int maxVideoFileSize = isPesRecording ? MAXVIDEOFILESIZEPES : MAXVIDEOFILESIZETS; -+ const int setupMaxVideoFileSize = min(maxVideoFileSize, Setup.MaxVideoFileSize); -+ const int maxFileNumber = isPesRecording ? 255 : 65535; -+ -+ const off_t smallFiles = (maxFileNumber * off_t(maxVideoFileSize) - 1024 * Setup.MaxRecordingSize) -+ / max(maxVideoFileSize - setupMaxVideoFileSize, 1); -+ -+ if (fileNumber <= smallFiles) -+ return MEGABYTE(off_t(setupMaxVideoFileSize)); -+ -+ return MEGABYTE(off_t(maxVideoFileSize)); -+} -+ - cUnbufferedFile *cFileName::NextFile(void) - { - return SetOffset(fileNumber + 1); ---- a/recording.h -+++ b/recording.h -@@ -262,9 +262,17 @@ - // before the next independent frame, to have a complete Group Of Pictures): - #define MAXVIDEOFILESIZETS 1048570 // MB - #define MAXVIDEOFILESIZEPES 2000 // MB --#define MINVIDEOFILESIZE 100 // MB -+#define MINVIDEOFILESIZE 1 // MB - #define MAXVIDEOFILESIZEDEFAULT MAXVIDEOFILESIZEPES - -+#define MINRECORDINGSIZE 25 // GB -+#define MAXRECORDINGSIZE 500 // GB -+#define DEFAULTRECORDINGSIZE 100 // GB -+// Dynamic recording size: -+// Keep recording file size at Setup.MaxVideoFileSize for as long as possible, -+// but switch to MAXVIDEOFILESIZE early enough, so that Setup.MaxRecordingSize -+// will be reached, before recording to file 65535.vdr -+ - struct tIndexTs; - class cIndexFileGenerator; - -@@ -322,6 +330,8 @@ - cUnbufferedFile *Open(void); - void Close(void); - cUnbufferedFile *SetOffset(int Number, off_t Offset = 0); // yes, Number is int for easier internal calculating -+ off_t MaxFileSize(); -+ // Dynamic file size for this file - cUnbufferedFile *NextFile(void); - }; - ---- a/videodir.c -+++ b/videodir.c -@@ -19,6 +19,9 @@ - #include "recording.h" - #include "tools.h" - -+ -+//#define HARDLINK_TEST_ONLY -+ - const char *VideoDirectory = VIDEODIR; - - void SetVideoDirectory(const char *Directory) -@@ -173,6 +176,120 @@ - return RemoveFileOrDir(FileName, true); - } - -+static bool StatNearestDir(const char *FileName, struct stat *Stat) -+{ -+ cString Name(FileName); -+ char *p; -+ while ((p = strrchr((char*)(const char*)Name + 1, '/')) != NULL) { -+ *p = 0; // truncate at last '/' -+ if (stat(Name, Stat) == 0) { -+ isyslog("StatNearestDir: Stating %s", (const char*)Name); -+ return true; -+ } -+ } -+ return false; -+} -+ -+bool HardLinkVideoFile(const char *OldName, const char *NewName) -+{ -+ // Incoming name must be in base video directory: -+ if (strstr(OldName, VideoDirectory) != OldName) { -+ esyslog("ERROR: %s not in %s", OldName, VideoDirectory); -+ return false; -+ } -+ if (strstr(NewName, VideoDirectory) != NewName) { -+ esyslog("ERROR: %s not in %s", NewName, VideoDirectory); -+ return false; -+ } -+ -+ const char *ActualNewName = NewName; -+ cString ActualOldName(ReadLink(OldName), true); -+ -+ // Some safety checks: -+ struct stat StatOldName; -+ if (lstat(ActualOldName, &StatOldName) == 0) { -+ if (S_ISLNK(StatOldName.st_mode)) { -+ esyslog("HardLinkVideoFile: Failed to resolve symbolic link %s", (const char*)ActualOldName); -+ return false; -+ } -+ } -+ else { -+ esyslog("HardLinkVideoFile: lstat failed on %s", (const char*)ActualOldName); -+ return false; -+ } -+ isyslog("HardLinkVideoFile: %s is on %i", (const char*)ActualOldName, (int)StatOldName.st_dev); -+ -+ // Find the video directory where ActualOldName is located -+ -+ cVideoDirectory Dir; -+ struct stat StatDir; -+ if (!StatNearestDir(NewName, &StatDir)) { -+ esyslog("HardLinkVideoFile: stat failed on %s", NewName); -+ return false; -+ } -+ -+ isyslog("HardLinkVideoFile: %s is on %i", NewName, (int)StatDir.st_dev); -+ if (StatDir.st_dev != StatOldName.st_dev) { -+ // Not yet found. -+ -+ if (!Dir.IsDistributed()) { -+ esyslog("HardLinkVideoFile: No matching video folder to hard link %s", (const char*)ActualOldName); -+ return false; -+ } -+ -+ // Search in video01 and upwards -+ bool found = false; -+ while (Dir.Next()) { -+ Dir.Store(); -+ const char *TmpNewName = Dir.Adjust(NewName); -+ if (StatNearestDir(TmpNewName, &StatDir) && StatDir.st_dev == StatOldName.st_dev) { -+ isyslog("HardLinkVideoFile: %s is on %i (match)", TmpNewName, (int)StatDir.st_dev); -+ ActualNewName = TmpNewName; -+ found = true; -+ break; -+ } -+ isyslog("HardLinkVideoFile: %s is on %i", TmpNewName, (int)StatDir.st_dev); -+ } -+ if (ActualNewName == NewName) { -+ esyslog("HardLinkVideoFile: No matching video folder to hard link %s", (const char*)ActualOldName); -+ return false; -+ } -+ -+ // Looking good, we have a match. Create necessary folders. -+ if (!MakeDirs(ActualNewName, false)) -+ return false; -+ // There's no guarantee that the directory of ActualNewName -+ // is on the same device as the dir that StatNearestDir found. -+ // But worst case is that the link fails. -+ } -+ -+#ifdef HARDLINK_TEST_ONLY -+ // Do the hard link to *.vdr_ for testing only -+ char *name = NULL; -+ asprintf(&name, "%s_",ActualNewName); -+ link(ActualOldName, name); -+ free(name); -+ return false; -+#endif // HARDLINK_TEST_ONLY -+ -+ // Try creating the hard link -+ if (link(ActualOldName, ActualNewName) != 0) { -+ // Failed to hard link. Maybe not allowed on file system. -+ LOG_ERROR_STR(ActualNewName); -+ isyslog("HardLinkVideoFile: failed to hard link from %s to %s", (const char*)ActualOldName, ActualNewName); -+ return false; -+ } -+ -+ if (ActualNewName != NewName) { -+ // video01 and up. Do the remaining symlink -+ if (symlink(ActualNewName, NewName) < 0) { -+ LOG_ERROR_STR(NewName); -+ return false; -+ } -+ } -+ return true; -+} -+ - bool VideoFileSpaceAvailable(int SizeMB) - { - cVideoDirectory Dir; ---- a/videodir.h -+++ b/videodir.h -@@ -20,6 +20,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); diff -Nru vdr-2.1.6/debian/patches/opt-63_naludump.patch vdr-2.1.6-297~3e4e445/debian/patches/opt-63_naludump.patch --- vdr-2.1.6/debian/patches/opt-63_naludump.patch 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/opt-63_naludump.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,630 +0,0 @@ -Description: Naludump-Patch for VDR -Author: Udo Richter <udo_richter@gmx.de> -Origin: http://www.udo-richter.de/vdr/naludump.html - ---- a/config.c -+++ b/config.c -@@ -454,6 +454,7 @@ - MaxRecordingSize = DEFAULTRECORDINGSIZE; - SplitEditedFiles = 0; - DelTimeshiftRec = 0; -+ DumpNaluFill = 0; - HardLinkCutter = 0; - MinEventTimeout = 30; - MinUserInactivity = 300; -@@ -660,6 +661,7 @@ - else if (!strcasecmp(Name, "MaxRecordingSize")) MaxRecordingSize = atoi(Value); - else if (!strcasecmp(Name, "SplitEditedFiles")) SplitEditedFiles = atoi(Value); - else if (!strcasecmp(Name, "DelTimeshiftRec")) DelTimeshiftRec = atoi(Value); -+ else if (!strcasecmp(Name, "DumpNaluFill")) DumpNaluFill = 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); -@@ -769,6 +771,7 @@ - Store("MaxRecordingSize", MaxRecordingSize); - Store("SplitEditedFiles", SplitEditedFiles); - Store("DelTimeshiftRec", DelTimeshiftRec); -+ Store("DumpNaluFill", DumpNaluFill); - Store("HardLinkCutter", HardLinkCutter); - Store("MinEventTimeout", MinEventTimeout); - Store("MinUserInactivity", MinUserInactivity); ---- a/config.h -+++ b/config.h -@@ -325,6 +325,7 @@ - int MaxRecordingSize; - int SplitEditedFiles; - int DelTimeshiftRec; -+ int DumpNaluFill; - int HardLinkCutter; - int MinEventTimeout, MinUserInactivity; - time_t NextWakeupTime; ---- a/menu.c -+++ b/menu.c -@@ -3484,6 +3484,7 @@ - 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 cMenuEditStraItem(tr("Setup.Recording$Delete timeshift recording"),&data.DelTimeshiftRec, 3, delTimeshiftRecTexts)); -+ Add(new cMenuEditBoolItem(tr("Setup.Recording$Dump NALU Fill data"), &data.DumpNaluFill)); - Add(new cMenuEditBoolItem(tr("Setup.Recording$Hard Link Cutter"), &data.HardLinkCutter)); - } - ---- a/recorder.c -+++ b/recorder.c -@@ -46,6 +46,14 @@ - Type = 0x06; - } - frameDetector = new cFrameDetector(Pid, Type); -+ if ( Type == 0x1B // MPEG4 video -+ && (Setup.DumpNaluFill ? (strstr(FileName, "NALUKEEP") == NULL) : (strstr(FileName, "NALUDUMP") != NULL))) { // MPEG4 -+ isyslog("Starting NALU fill dumper"); -+ naluStreamProcessor = new cNaluStreamProcessor(); -+ naluStreamProcessor->SetPid(Pid); -+ } -+ else -+ naluStreamProcessor = NULL; - index = NULL; - fileSize = 0; - lastDiskSpaceCheck = time(NULL); -@@ -67,6 +75,12 @@ - cRecorder::~cRecorder() - { - Detach(); -+ if (naluStreamProcessor) { -+ long long int TotalPackets = naluStreamProcessor->GetTotalPackets(); -+ long long int DroppedPackets = naluStreamProcessor->GetDroppedPackets(); -+ isyslog("NALU fill dumper: %lld of %lld packets dropped, %lli%%", DroppedPackets, TotalPackets, TotalPackets ? DroppedPackets*100/TotalPackets : 0); -+ delete naluStreamProcessor; -+ } - delete index; - delete fileName; - delete frameDetector; -@@ -155,11 +169,32 @@ - fileSize += TS_SIZE; - } - } -- if (recordFile->Write(b, Count) < 0) { -- LOG_ERROR_STR(fileName->Name()); -- break; -+ if (naluStreamProcessor) { -+ naluStreamProcessor->PutBuffer(b, Count); -+ bool Fail = false; -+ while (true) { -+ int OutLength = 0; -+ uchar *OutData = naluStreamProcessor->GetBuffer(OutLength); -+ if (!OutData || OutLength <= 0) -+ break; -+ if (recordFile->Write(OutData, OutLength) < 0) { -+ LOG_ERROR_STR(fileName->Name()); -+ Fail = true; -+ break; -+ } -+ fileSize += OutLength; -+ } -+ if (Fail) -+ break; -+ } -+ else { -+ if (recordFile->Write(b, Count) < 0) { -+ LOG_ERROR_STR(fileName->Name()); -+ break; -+ } -+ fileSize += Count; - } -- fileSize += Count; -+ - t = time(NULL); - } - } ---- a/recorder.h -+++ b/recorder.h -@@ -21,6 +21,7 @@ - cRingBufferLinear *ringBuffer; - cFrameDetector *frameDetector; - cPatPmtGenerator patPmtGenerator; -+ cNaluStreamProcessor *naluStreamProcessor; - cFileName *fileName; - cIndexFile *index; - cUnbufferedFile *recordFile; ---- a/remux.c -+++ b/remux.c -@@ -146,6 +146,42 @@ - } - } - -+void TsExtendAdaptionField(unsigned char *Packet, int ToLength) -+{ -+ // Hint: ExtenAdaptionField(p, TsPayloadOffset(p) - 4) is a null operation -+ -+ int Offset = TsPayloadOffset(Packet); // First byte after existing adaption field -+ -+ if (ToLength <= 0) -+ { -+ // Remove adaption field -+ Packet[3] = Packet[3] & ~TS_ADAPT_FIELD_EXISTS; -+ return; -+ } -+ -+ // Set adaption field present -+ Packet[3] = Packet[3] | TS_ADAPT_FIELD_EXISTS; -+ -+ // Set new length of adaption field: -+ Packet[4] = ToLength <= TS_SIZE-4 ? ToLength-1 : TS_SIZE-4-1; -+ -+ if (Packet[4] == TS_SIZE-4-1) -+ { -+ // No more payload, remove payload flag -+ Packet[3] = Packet[3] & ~TS_PAYLOAD_EXISTS; -+ } -+ -+ int NewPayload = TsPayloadOffset(Packet); // First byte after new adaption field -+ -+ // Fill new adaption field -+ if (Offset == 4 && Offset < NewPayload) -+ Offset++; // skip adaptation_field_length -+ if (Offset == 5 && Offset < NewPayload) -+ Packet[Offset++] = 0; // various flags set to 0 -+ while (Offset < NewPayload) -+ Packet[Offset++] = 0xff; // stuffing byte -+} -+ - // --- cPatPmtGenerator ------------------------------------------------------ - - cPatPmtGenerator::cPatPmtGenerator(const cChannel *Channel) -@@ -1066,3 +1102,344 @@ - } - return Processed; - } -+ -+// --- cNaluDumper --------------------------------------------------------- -+ -+cNaluDumper::cNaluDumper() -+{ -+ LastContinuityOutput = -1; -+ reset(); -+} -+ -+void cNaluDumper::reset() -+{ -+ LastContinuityInput = -1; -+ ContinuityOffset = 0; -+ PesId = -1; -+ PesOffset = 0; -+ NaluFillState = NALU_NONE; -+ NaluOffset = 0; -+ History = 0xffffffff; -+ DropAllPayload = false; -+} -+ -+void cNaluDumper::ProcessPayload(unsigned char *Payload, int size, bool PayloadStart, sPayloadInfo &Info) -+{ -+ Info.DropPayloadStartBytes = 0; -+ Info.DropPayloadEndBytes = 0; -+ int LastKeepByte = -1; -+ -+ if (PayloadStart) -+ { -+ History = 0xffffffff; -+ PesId = -1; -+ NaluFillState = NALU_NONE; -+ } -+ -+ for (int i=0; i<size; i++) { -+ History = (History << 8) | Payload[i]; -+ -+ PesOffset++; -+ NaluOffset++; -+ -+ bool DropByte = false; -+ -+ if (History >= 0x00000180 && History <= 0x000001FF) -+ { -+ // Start of PES packet -+ PesId = History & 0xff; -+ PesOffset = 0; -+ NaluFillState = NALU_NONE; -+ } -+ else if (PesId >= 0xe0 && PesId <= 0xef // video stream -+ && History >= 0x00000100 && History <= 0x0000017F) // NALU start code -+ { -+ int NaluId = History & 0xff; -+ NaluOffset = 0; -+ NaluFillState = ((NaluId & 0x1f) == 0x0c) ? NALU_FILL : NALU_NONE; -+ } -+ -+ if (PesId >= 0xe0 && PesId <= 0xef // video stream -+ && PesOffset >= 1 && PesOffset <= 2) -+ { -+ Payload[i] = 0; // Zero out PES length field -+ } -+ -+ if (NaluFillState == NALU_FILL && NaluOffset > 0) // Within NALU fill data -+ { -+ // We expect a series of 0xff bytes terminated by a single 0x80 byte. -+ -+ if (Payload[i] == 0xFF) -+ { -+ DropByte = true; -+ } -+ else if (Payload[i] == 0x80) -+ { -+ NaluFillState = NALU_TERM; // Last byte of NALU fill, next byte sets NaluFillEnd=true -+ DropByte = true; -+ } -+ else // Invalid NALU fill -+ { -+ dsyslog("cNaluDumper: Unexpected NALU fill data: %02x", Payload[i]); -+ NaluFillState = NALU_END; -+ if (LastKeepByte == -1) -+ { -+ // Nalu fill from beginning of packet until last byte -+ // packet start needs to be dropped -+ Info.DropPayloadStartBytes = i; -+ } -+ } -+ } -+ else if (NaluFillState == NALU_TERM) // Within NALU fill data -+ { -+ // We are after the terminating 0x80 byte -+ NaluFillState = NALU_END; -+ if (LastKeepByte == -1) -+ { -+ // Nalu fill from beginning of packet until last byte -+ // packet start needs to be dropped -+ Info.DropPayloadStartBytes = i; -+ } -+ } -+ -+ if (!DropByte) -+ LastKeepByte = i; // Last useful byte -+ } -+ -+ Info.DropAllPayloadBytes = (LastKeepByte == -1); -+ Info.DropPayloadEndBytes = size-1-LastKeepByte; -+} -+ -+bool cNaluDumper::ProcessTSPacket(unsigned char *Packet) -+{ -+ bool HasAdaption = TsHasAdaptationField(Packet); -+ bool HasPayload = TsHasPayload(Packet); -+ -+ // Check continuity: -+ int ContinuityInput = TsContinuityCounter(Packet); -+ if (LastContinuityInput >= 0) -+ { -+ int NewContinuityInput = HasPayload ? (LastContinuityInput + 1) & TS_CONT_CNT_MASK : LastContinuityInput; -+ int Offset = (NewContinuityInput - ContinuityInput) & TS_CONT_CNT_MASK; -+ if (Offset > 0) -+ dsyslog("cNaluDumper: TS continuity offset %i", Offset); -+ if (Offset > ContinuityOffset) -+ ContinuityOffset = Offset; // max if packets get dropped, otherwise always the current one. -+ } -+ LastContinuityInput = ContinuityInput; -+ -+ if (HasPayload) { -+ sPayloadInfo Info; -+ int Offset = TsPayloadOffset(Packet); -+ ProcessPayload(Packet + Offset, TS_SIZE - Offset, TsPayloadStart(Packet), Info); -+ -+ if (DropAllPayload && !Info.DropAllPayloadBytes) -+ { -+ // Return from drop packet mode to normal mode -+ DropAllPayload = false; -+ -+ // Does the packet start with some remaining NALU fill data? -+ if (Info.DropPayloadStartBytes > 0) -+ { -+ // Add these bytes as stuffing to the adaption field. -+ -+ // Sample payload layout: -+ // FF FF FF FF FF 80 00 00 01 xx xx xx xx -+ // ^DropPayloadStartBytes -+ -+ TsExtendAdaptionField(Packet, Offset - 4 + Info.DropPayloadStartBytes); -+ } -+ } -+ -+ bool DropThisPayload = DropAllPayload; -+ -+ if (!DropAllPayload && Info.DropPayloadEndBytes > 0) // Payload ends with 0xff NALU Fill -+ { -+ // Last packet of useful data -+ // Do early termination of NALU fill data -+ Packet[TS_SIZE-1] = 0x80; -+ DropAllPayload = true; -+ // Drop all packets AFTER this one -+ -+ // Since we already wrote the 0x80, we have to make sure that -+ // as soon as we stop dropping packets, any beginning NALU fill of next -+ // packet gets dumped. (see DropPayloadStartBytes above) -+ } -+ -+ if (DropThisPayload && HasAdaption) -+ { -+ // Drop payload data, but keep adaption field data -+ TsExtendAdaptionField(Packet, TS_SIZE-4); -+ DropThisPayload = false; -+ } -+ -+ if (DropThisPayload) -+ { -+ return true; // Drop packet -+ } -+ } -+ -+ // Fix Continuity Counter and reproduce incoming offsets: -+ int NewContinuityOutput = TsHasPayload(Packet) ? (LastContinuityOutput + 1) & TS_CONT_CNT_MASK : LastContinuityOutput; -+ NewContinuityOutput = (NewContinuityOutput + ContinuityOffset) & TS_CONT_CNT_MASK; -+ TsSetContinuityCounter(Packet, NewContinuityOutput); -+ LastContinuityOutput = NewContinuityOutput; -+ ContinuityOffset = 0; -+ -+ return false; // Keep packet -+} -+ -+// --- cNaluStreamProcessor --------------------------------------------------------- -+ -+cNaluStreamProcessor::cNaluStreamProcessor() -+{ -+ pPatPmtParser = NULL; -+ vpid = -1; -+ data = NULL; -+ length = 0; -+ tempLength = 0; -+ tempLengthAtEnd = false; -+ TotalPackets = 0; -+ DroppedPackets = 0; -+} -+ -+void cNaluStreamProcessor::PutBuffer(uchar *Data, int Length) -+{ -+ if (length > 0) -+ esyslog("cNaluStreamProcessor::PutBuffer: New data before old data was processed!"); -+ -+ data = Data; -+ length = Length; -+} -+ -+uchar* cNaluStreamProcessor::GetBuffer(int &OutLength) -+{ -+ if (length <= 0) -+ { -+ // Need more data - quick exit -+ OutLength = 0; -+ return NULL; -+ } -+ if (tempLength > 0) // Data in temp buffer? -+ { -+ if (tempLengthAtEnd) // Data is at end, copy to beginning -+ { -+ // Overlapping src and dst! -+ for (int i=0; i<tempLength; i++) -+ tempBuffer[i] = tempBuffer[TS_SIZE-tempLength+i]; -+ } -+ // Normalize TempBuffer fill -+ if (tempLength < TS_SIZE && length > 0) -+ { -+ int Size = min(TS_SIZE-tempLength, length); -+ memcpy(tempBuffer+tempLength, data, Size); -+ data += Size; -+ length -= Size; -+ tempLength += Size; -+ } -+ if (tempLength < TS_SIZE) -+ { -+ // All incoming data buffered, but need more data -+ tempLengthAtEnd = false; -+ OutLength = 0; -+ return NULL; -+ } -+ // Now: TempLength==TS_SIZE -+ if (tempBuffer[0] != TS_SYNC_BYTE) -+ { -+ // Need to sync on TS within temp buffer -+ int Skipped = 1; -+ while (Skipped < TS_SIZE && (tempBuffer[Skipped] != TS_SYNC_BYTE || (Skipped < length && data[Skipped] != TS_SYNC_BYTE))) -+ Skipped++; -+ esyslog("ERROR: skipped %d bytes to sync on start of TS packet", Skipped); -+ // Pass through skipped bytes -+ tempLengthAtEnd = true; -+ tempLength = TS_SIZE - Skipped; // may be 0, thats ok -+ OutLength = Skipped; -+ return tempBuffer; -+ } -+ // Now: TempBuffer is a TS packet -+ int Pid = TsPid(tempBuffer); -+ if (pPatPmtParser) -+ { -+ if (Pid == 0) -+ pPatPmtParser->ParsePat(tempBuffer, TS_SIZE); -+ else if (Pid == pPatPmtParser->PmtPid()) -+ pPatPmtParser->ParsePmt(tempBuffer, TS_SIZE); -+ } -+ -+ TotalPackets++; -+ bool Drop = false; -+ if (Pid == vpid || (pPatPmtParser && Pid == pPatPmtParser->Vpid() && pPatPmtParser->Vtype() == 0x1B)) -+ Drop = NaluDumper.ProcessTSPacket(tempBuffer); -+ if (!Drop) -+ { -+ // Keep this packet, then continue with new data -+ tempLength = 0; -+ OutLength = TS_SIZE; -+ return tempBuffer; -+ } -+ // Drop TempBuffer -+ DroppedPackets++; -+ tempLength = 0; -+ } -+ // Now: TempLength==0, just process data/length -+ -+ // Pointer to processed data / length: -+ uchar *Out = data; -+ uchar *OutEnd = Out; -+ -+ while (length >= TS_SIZE) -+ { -+ if (data[0] != TS_SYNC_BYTE) { -+ int Skipped = 1; -+ while (Skipped < length && (data[Skipped] != TS_SYNC_BYTE || (length - Skipped > TS_SIZE && data[Skipped + TS_SIZE] != TS_SYNC_BYTE))) -+ Skipped++; -+ esyslog("ERROR: skipped %d bytes to sync on start of TS packet", Skipped); -+ -+ // Pass through skipped bytes -+ if (OutEnd != data) -+ memcpy(OutEnd, data, Skipped); -+ OutEnd += Skipped; -+ continue; -+ } -+ // Now: Data starts with complete TS packet -+ -+ int Pid = TsPid(data); -+ if (pPatPmtParser) -+ { -+ if (Pid == 0) -+ pPatPmtParser->ParsePat(data, TS_SIZE); -+ else if (Pid == pPatPmtParser->PmtPid()) -+ pPatPmtParser->ParsePmt(data, TS_SIZE); -+ } -+ -+ TotalPackets++; -+ bool Drop = false; -+ if (Pid == vpid || (pPatPmtParser && Pid == pPatPmtParser->Vpid() && pPatPmtParser->Vtype() == 0x1B)) -+ Drop = NaluDumper.ProcessTSPacket(data); -+ if (!Drop) -+ { -+ if (OutEnd != data) -+ memcpy(OutEnd, data, TS_SIZE); -+ OutEnd += TS_SIZE; -+ } -+ else -+ { -+ DroppedPackets++; -+ } -+ data += TS_SIZE; -+ length -= TS_SIZE; -+ } -+ // Now: Less than a packet remains. -+ if (length > 0) -+ { -+ // copy remains into temp buffer -+ memcpy(tempBuffer, data, length); -+ tempLength = length; -+ tempLengthAtEnd = false; -+ length = 0; -+ } -+ OutLength = (OutEnd - Out); -+ return OutLength > 0 ? Out : NULL; -+} ---- a/remux.h -+++ b/remux.h -@@ -57,6 +57,11 @@ - return p[3] & TS_PAYLOAD_EXISTS; - } - -+inline bool TsSetPayload(const uchar *p) -+{ -+ return p[3] & TS_PAYLOAD_EXISTS; -+} -+ - inline bool TsHasAdaptationField(const uchar *p) - { - return p[3] & TS_ADAPT_FIELD_EXISTS; -@@ -103,6 +108,11 @@ - return p[3] & TS_CONT_CNT_MASK; - } - -+inline void TsSetContinuityCounter(uchar *p, int Counter) -+{ -+ p[3] = (p[3] & ~TS_CONT_CNT_MASK) | (Counter & TS_CONT_CNT_MASK); -+} -+ - inline int TsGetAdaptationField(const uchar *p) - { - return TsHasAdaptationField(p) ? p[5] : 0x00; -@@ -112,6 +122,7 @@ - - int64_t TsGetPts(const uchar *p, int l); - void TsSetTeiOnBrokenPackets(uchar *p, int l); -+void TsExtendAdaptionField(unsigned char *Packet, int ToLength); - - // Some PES handling tools: - // The following functions that take a pointer to PES data all assume that -@@ -390,4 +401,78 @@ - ///< available. - }; - -+ -+#define PATCH_NALUDUMP 100 -+ -+class cNaluDumper { -+ unsigned int History; -+ -+ int LastContinuityInput; -+ int LastContinuityOutput; -+ int ContinuityOffset; -+ -+ bool DropAllPayload; -+ -+ int PesId; -+ int PesOffset; -+ -+ int NaluOffset; -+ -+ enum eNaluFillState { -+ NALU_NONE=0, // currently not NALU fill stream -+ NALU_FILL, // Within NALU fill stream, 0xff bytes and NALU start code in byte 0 -+ NALU_TERM, // Within NALU fill stream, read 0x80 terminating byte -+ NALU_END // Beyond end of NALU fill stream, expecting 0x00 0x00 0x01 now -+ }; -+ -+ eNaluFillState NaluFillState; -+ -+ struct sPayloadInfo { -+ int DropPayloadStartBytes; -+ int DropPayloadEndBytes; -+ bool DropAllPayloadBytes; -+ }; -+ -+public: -+ cNaluDumper(); -+ -+ void reset(); -+ -+ // Single packet interface: -+ bool ProcessTSPacket(unsigned char *Packet); -+ -+private: -+ void ProcessPayload(unsigned char *Payload, int size, bool PayloadStart, sPayloadInfo &Info); -+}; -+ -+class cNaluStreamProcessor { -+ //Buffer stream interface: -+ int vpid; -+ uchar *data; -+ int length; -+ uchar tempBuffer[TS_SIZE]; -+ int tempLength; -+ bool tempLengthAtEnd; -+ cPatPmtParser *pPatPmtParser; -+ cNaluDumper NaluDumper; -+ -+ long long int TotalPackets; -+ long long int DroppedPackets; -+public: -+ cNaluStreamProcessor(); -+ -+ void SetPid(int VPid) { vpid = VPid; } -+ void SetPatPmtParser(cPatPmtParser *_pPatPmtParser) { pPatPmtParser = _pPatPmtParser; } -+ // Set either a PID or set a pointer to an PatPmtParser that will detect _one_ PID -+ -+ void PutBuffer(uchar *Data, int Length); -+ // Add new data to be processed. Data must be valid until Get() returns NULL. -+ uchar* GetBuffer(int &OutLength); -+ // Returns filtered data, or NULL/0 to indicate that all data from Put() was processed -+ // or buffered. -+ -+ long long int GetTotalPackets() { return TotalPackets; } -+ long long int GetDroppedPackets() { return DroppedPackets; } -+}; -+ - #endif // __REMUX_H diff -Nru vdr-2.1.6/debian/patches/opt-65_pin.patch vdr-2.1.6-297~3e4e445/debian/patches/opt-65_pin.patch --- vdr-2.1.6/debian/patches/opt-65_pin.patch 2014-04-22 19:22:26.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/opt-65_pin.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,423 +0,0 @@ -Description: patch for the pin plugin -Author: Jörg Wendel (horchi@vdr-portal) - ---- a/device.c -+++ b/device.c -@@ -778,6 +778,7 @@ - cChannel *channel; - while ((channel = Channels.GetByNumber(n, Direction)) != NULL) { - // try only channels which are currently available -+ if (!cStatus::MsgChannelProtected(0, channel)) // PIN PATCH - if (GetDevice(channel, LIVEPRIORITY, true, true)) - break; - n = channel->Number() + Direction; -@@ -799,6 +800,12 @@ - - eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView) - { -+ // I hope 'LiveView = false' indicates a channel switch for recording, // PIN PATCH -+ // I really don't know, but it works ... // PIN PATCH -+ -+ if (LiveView && cStatus::MsgChannelProtected(this, Channel)) // PIN PATCH -+ return scrNotAvailable; // PIN PATCH -+ - cStatus::MsgChannelSwitch(this, 0, LiveView); - - if (LiveView) { ---- a/menu.c -+++ b/menu.c -@@ -920,6 +920,18 @@ - 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)); -+ -+ // PIN PATCH -+ if (cOsd::pinValid || !data.fskProtection) Add(new cMenuEditBoolItem(tr("Childlock"),&data.fskProtection)); -+ else { -+ char* buf = 0; -+ int res = 0; -+ res = asprintf(&buf, "%s\t%s", tr("Childlock"), data.fskProtection ? tr("yes") : tr("no")); -+ if (res < 0) ; // memory problems :o -+ Add(new cOsdItem(buf)); -+ free(buf); -+ } -+ - Add(file = new cMenuEditStrItem( tr("File"), data.file, sizeof(data.file))); - SetFirstDayItem(); - } -@@ -2688,7 +2700,8 @@ - } - } - } -- if (*Item->Text() && !LastDir) { -+ if (*Item->Text() && !LastDir -+ && (!cStatus::MsgReplayProtected(Item->Recording(), Item->Name(), base, Item->IsDirectory(), true))) { // PIN PATCH - Add(Item); - LastItem = Item; - if (Item->IsDirectory()) -@@ -2753,6 +2766,9 @@ - { - cMenuRecordingItem *ri = (cMenuRecordingItem *)Get(Current()); - if (ri) { -+ if (cStatus::MsgReplayProtected(ri->Recording(), ri->Name(), base, -+ ri->IsDirectory()) == true) // PIN PATCH -+ return osContinue; // PIN PATCH - if (ri->IsDirectory()) - Open(); - else { -@@ -3895,28 +3911,32 @@ - - // Basic menu items: - -- Add(new cOsdItem(hk(tr("Schedule")), osSchedule)); -- Add(new cOsdItem(hk(tr("Channels")), osChannels)); -- Add(new cOsdItem(hk(tr("Timers")), osTimers)); -- Add(new cOsdItem(hk(tr("Recordings")), osRecordings)); -+ // PIN PATCH -+ if (!cStatus::MsgMenuItemProtected("Schedule", true)) Add(new cOsdItem(hk(tr("Schedule")), osSchedule)); -+ if (!cStatus::MsgMenuItemProtected("Channels", true)) Add(new cOsdItem(hk(tr("Channels")), osChannels)); -+ if (!cStatus::MsgMenuItemProtected("Timers", true)) Add(new cOsdItem(hk(tr("Timers")), osTimers)); -+ if (!cStatus::MsgMenuItemProtected("Recordings", true)) Add(new cOsdItem(hk(tr("Recordings")), osRecordings)); - - // Plugins: - - for (int i = 0; ; i++) { - cPlugin *p = cPluginManager::GetPlugin(i); - if (p) { -+ if (!cStatus::MsgPluginProtected(p, true)) { // PIN PATCH - const char *item = p->MainMenuEntry(); - if (item) - Add(new cMenuPluginItem(hk(item), i)); - } -+ } - else - break; - } - - // More basic menu items: - -- Add(new cOsdItem(hk(tr("Setup")), osSetup)); -+ if (!cStatus::MsgMenuItemProtected("Setup", true)) Add(new cOsdItem(hk(tr("Setup")), osSetup)); // PIN PATCH - if (Commands.Count()) -+ if (!cStatus::MsgMenuItemProtected("Commands", true)) // PIN PATCH - Add(new cOsdItem(hk(tr("Commands")), osCommands)); - - } -@@ -3987,6 +4007,14 @@ - eOSState state = cOsdMenu::ProcessKey(Key); - HadSubMenu |= HasSubMenu(); - -+ // > PIN PATCH -+ cOsdItem* item = Get(Current()); -+ -+ if (item && item->Text() && state != osContinue && state != osUnknown && state != osBack) -+ if (cStatus::MsgMenuItemProtected(item->Text())) -+ return osContinue; -+ // PIN PATCH < -+ - cOsdObject *menu = NULL; - switch (state) { - case osSchedule: -@@ -4033,6 +4061,7 @@ - if (item) { - cPlugin *p = cPluginManager::GetPlugin(item->PluginIndex()); - if (p) { -+ if (!cStatus::MsgPluginProtected(p)) { // PIN PATCH - cOsdObject *menu = p->MainMenuAction(); - if (menu) { - if (menu->IsMenu()) -@@ -4044,6 +4073,7 @@ - } - } - } -+ } - state = osEnd; - } - break; -@@ -4257,6 +4287,7 @@ - Channel = Direction > 0 ? Channels.Next(Channel) : Channels.Prev(Channel); - if (!Channel && Setup.ChannelsWrap) - Channel = Direction > 0 ? Channels.First() : Channels.Last(); -+ if (!cStatus::MsgChannelProtected(0, Channel)) // PIN PATCH - if (Channel && !Channel->GroupSep() && cDevice::GetDevice(Channel, LIVEPRIORITY, true, true)) - return Channel; - } -@@ -4961,6 +4992,7 @@ - for (int i = 0; i < MAXRECORDCONTROLS; i++) { - if (!RecordControls[i]) { - RecordControls[i] = new cRecordControl(device, Timer, Pause); -+ cStatus::MsgRecordingFile(RecordControls[i]->FileName()); // PIN PATCH - return RecordControls[i]->Process(time(NULL)); - } - } ---- a/osd.c -+++ b/osd.c -@@ -1634,6 +1634,7 @@ - int cOsd::osdHeight = 0; - cVector<cOsd *> cOsd::Osds; - cMutex cOsd::mutex; -+bool cOsd::pinValid = false; // PIN PATCH - - cOsd::cOsd(int Left, int Top, uint Level) - { ---- a/osd.h -+++ b/osd.h -@@ -930,6 +930,7 @@ - ///< MyOsdDrawPixmap(Left() + pm->ViewPort().X(), Top() + pm->ViewPort().Y(), pm->Data(), w, h, h * d); - ///< delete pm; - ///< } -+ static bool pinValid; // PIN PATCH - }; - - #define MAXOSDIMAGES 64 ---- a/status.c -+++ b/status.c -@@ -159,3 +159,55 @@ - for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) - sm->OsdEventItem(Event, Text, Index, Count); - } -+ -+bool cStatus::MsgChannelProtected(const cDevice* Device, const cChannel* Channel) // PIN PATCH -+{ -+ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) -+ if (sm->ChannelProtected(Device, Channel) == true) -+ return true; -+ -+ return false; -+} -+ -+bool cStatus::MsgReplayProtected(const cRecording* Recording, const char* Name, -+ const char* Base, bool isDirectory, int menuView) // PIN PATCH -+{ -+ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) -+ if (sm->ReplayProtected(Recording, Name, Base, isDirectory, menuView) == true) -+ return true; -+ return false; -+} -+ -+void cStatus::MsgRecordingFile(const char* FileName) -+{ -+ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) // PIN PATCH -+ sm->RecordingFile(FileName); -+} -+ -+void cStatus::MsgTimerCreation(cTimer* Timer, const cEvent *Event) -+{ -+ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) // PIN PATCH -+ sm->TimerCreation(Timer, Event); -+} -+ -+bool cStatus::MsgPluginProtected(cPlugin* Plugin, int menuView) // PIN PATCH -+{ -+ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) -+ if (sm->PluginProtected(Plugin, menuView) == true) -+ return true; -+ return false; -+} -+ -+void cStatus::MsgUserAction(const eKeys key, const cOsdObject* Interact) // PIN PATCH -+{ -+ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) -+ sm->UserAction(key, Interact); -+} -+ -+bool cStatus::MsgMenuItemProtected(const char* Name, int menuView) // PIN PATCH -+{ -+ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) -+ if (sm->MenuItemProtected(Name, menuView) == true) -+ return true; -+ return false; -+} ---- a/status.h -+++ b/status.h -@@ -14,6 +14,7 @@ - #include "device.h" - #include "player.h" - #include "tools.h" -+#include "plugin.h" - - enum eTimerChange { tcMod, tcAdd, tcDel }; - -@@ -94,6 +95,22 @@ - // report menu destruvtion - virtual void OsdEventItem(const cEvent* Event, const char *Text, int Index, int Count) {} - // The OSD displays the given single line Event as menu item at Index. -+ virtual bool ChannelProtected(const cDevice *Device, const cChannel* Channel) { return false; } // PIN PATCH -+ // Checks if a channel is protected. -+ virtual bool ReplayProtected(const cRecording* Recording, const char* Name, -+ const char* Base, bool isDirectory, int menuView = false) { return false; } // PIN PATCH -+ // Checks if a recording is protected. -+ virtual void RecordingFile(const char* FileName) {} // PIN PATCH -+ // The given DVB device has started recording to FileName. FileName is the name of the -+ // recording directory -+ virtual void TimerCreation(cTimer* Timer, const cEvent *Event) {} // PIN PATCH -+ // The given timer is created -+ virtual bool PluginProtected(cPlugin* Plugin, int menuView = false) { return false; } // PIN PATCH -+ // Checks if a plugin is protected. -+ virtual void UserAction(const eKeys key, const cOsdObject* Interact) {} // PIN PATCH -+ // report user action -+ virtual bool MenuItemProtected(const char* Name, int menuView = false) { return false; } // PIN PATCH -+ // Checks if a menu entry is protected. - - public: - cStatus(void); -@@ -122,6 +139,14 @@ - static void MsgOsdMenuDisplay(const char* kind); - static void MsgOsdMenuDestroy(); - static void MsgOsdEventItem(const cEvent* Event, const char *Text, int Index, int Count); -+ static bool MsgChannelProtected(const cDevice* Device, const cChannel* Channel); // PIN PATCH -+ static bool MsgReplayProtected(const cRecording* Recording, const char* Name, -+ const char* Base, bool isDirectory, int menuView = false); // PIN PATCH -+ static void MsgRecordingFile(const char* FileName); // PIN PATCH -+ static void MsgTimerCreation(cTimer* Timer, const cEvent *Event); // PIN PATCH -+ static bool MsgPluginProtected(cPlugin* Plugin, int menuView = false); // PIN PATCH -+ static void MsgUserAction(const eKeys key, const cOsdObject* Interact); -+ static bool MsgMenuItemProtected(const char* Name, int menuView = false); // PIN PATCH - }; - - #endif //__STATUS_H ---- a/timers.c -+++ b/timers.c -@@ -76,6 +76,7 @@ - stop -= 2400; - priority = Pause ? Setup.PausePriority : Setup.DefaultPriority; - lifetime = Pause ? Setup.PauseLifetime : Setup.DefaultLifetime; -+ fskProtection = 0; // PIN PATCH - if (Instant && channel) - snprintf(file, sizeof(file), "%s%s", Setup.MarkInstantRecord ? "@" : "", *Setup.NameInstantRecord ? Setup.NameInstantRecord : channel->Name()); - } -@@ -110,10 +111,12 @@ - stop -= 2400; - priority = Setup.DefaultPriority; - lifetime = Setup.DefaultLifetime; -+ fskProtection = 0; // PIN PATCH - const char *Title = Event->Title(); - if (!isempty(Title)) - Utf8Strn0Cpy(file, Event->Title(), sizeof(file)); - SetEvent(Event); -+ cStatus::MsgTimerCreation(this, Event); // PIN PATCH - } - - cTimer::cTimer(const cTimer &Timer) -@@ -149,6 +152,7 @@ - stop = Timer.stop; - priority = Timer.priority; - lifetime = Timer.lifetime; -+ fskProtection = Timer.fskProtection; // PIN PATCH - strncpy(file, Timer.file, sizeof(file)); - free(aux); - aux = Timer.aux ? strdup(Timer.aux) : NULL; -@@ -331,6 +335,7 @@ - result = false; - } - } -+ fskProtection = aux && strstr(aux, "<pin-plugin><protected>yes</protected></pin-plugin>"); // PIN PATCH - free(channelbuffer); - free(daybuffer); - free(filebuffer); -@@ -689,6 +694,36 @@ - Matches(); // refresh start and end time - } - -+void cTimer::SetFskProtection(int aFlag) // PIN PATCH -+{ -+ char* p; -+ char* tmp = 0; -+ int res = 0; -+ -+ fskProtection = aFlag; -+ -+ if (fskProtection && (!aux || !strstr(aux, "<pin-plugin><protected>yes</protected></pin-plugin>"))) -+ { -+ // add protection info to aux -+ -+ if (aux) { tmp = strdup(aux); free(aux); } -+ res = asprintf(&aux, "%s<pin-plugin><protected>yes</protected></pin-plugin>", tmp ? tmp : ""); -+ } -+ else if (!fskProtection && aux && (p = strstr(aux, "<pin-plugin><protected>yes</protected></pin-plugin>"))) -+ { -+ // remove protection info from aux -+ -+ res = asprintf(&tmp, "%.*s%s", (int)(p-aux), aux, p+strlen("<pin-plugin><protected>yes</protected></pin-plugin>")); -+ free(aux); -+ aux = strdup(tmp); -+ } -+ -+ if (res < 0) ; // memory problems :o -+ -+ if (tmp) -+ free(tmp); -+} -+ - // --- cTimers --------------------------------------------------------------- - - cTimers Timers; ---- a/timers.h -+++ b/timers.h -@@ -38,6 +38,7 @@ - int start; - int stop; - int priority; -+ int fskProtection; // PIN PATCH - int lifetime; - mutable char file[NAME_MAX * 2 + 1]; // *2 to be able to hold 'title' and 'episode', which can each be up to 255 characters long - char *aux; -@@ -59,6 +60,7 @@ - int Start(void) const { return start; } - int Stop(void) const { return stop; } - int Priority(void) const { return priority; } -+ int FskProtection(void) const { return fskProtection; } // PIN PATCH - int Lifetime(void) const { return lifetime; } - const char *File(void) const { return file; } - time_t FirstDay(void) const { return weekdays ? day : 0; } -@@ -95,6 +97,7 @@ - void SetAux(const char *Aux); - void SetDeferred(int Seconds); - void SetFlags(uint Flags); -+ void SetFskProtection(int aFlag); // PIN PATCH - void ClrFlags(uint Flags); - void InvFlags(uint Flags); - bool HasFlags(uint Flags) const; ---- a/vdr.c -+++ b/vdr.c -@@ -69,6 +69,7 @@ - #include "tools.h" - #include "transfer.h" - #include "videodir.h" -+#include "status.h" // PIN PATCH - - #define MINCHANNELWAIT 10 // seconds to wait between failed channel switchings - #define ACTIVITYTIMEOUT 60 // seconds before starting housekeeping -@@ -1032,6 +1033,7 @@ - cOsdObject *Interact = Menu ? Menu : cControl::Control(); - eKeys key = Interface->GetKey(!Interact || !Interact->NeedsFastResponse()); - if (ISREALKEY(key)) { -+ cStatus::MsgUserAction(key, Interact); // PIN PATCH - EITScanner.Activity(); - // Cancel shutdown countdown: - if (ShutdownHandler.countdown) -@@ -1104,10 +1106,12 @@ - cControl::Control()->Hide(); - cPlugin *plugin = cPluginManager::GetPlugin(PluginName); - if (plugin) { -+ if (!cStatus::MsgPluginProtected(plugin)) { // PIN PATCH - Menu = plugin->MainMenuAction(); - if (Menu) - Menu->Show(); - } -+ } - else - esyslog("ERROR: unknown plugin '%s'", PluginName); - } -@@ -1320,9 +1324,11 @@ - // Instant resume of the last viewed recording: - case kPlay: - if (cReplayControl::LastReplayed()) { -+ if (cStatus::MsgReplayProtected(0, cReplayControl::LastReplayed(), 0, false) == false) { // PIN PATCH - cControl::Shutdown(); - cControl::Launch(new cReplayControl); - } -+ } - else - DirectMainFunction(osRecordings); // no last viewed recording, so enter the Recordings menu - break; diff -Nru vdr-2.1.6/debian/patches/opt-66_jumpingseconds.patch vdr-2.1.6-297~3e4e445/debian/patches/opt-66_jumpingseconds.patch --- vdr-2.1.6/debian/patches/opt-66_jumpingseconds.patch 2014-04-02 18:00:07.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/opt-66_jumpingseconds.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,66 +0,0 @@ -Description: ? -Author: ? - ---- a/config.c -+++ b/config.c -@@ -483,6 +483,8 @@ - ChannelsWrap = 0; - ShowChannelNamesWithSource = 0; - EmergencyExit = 1; -+ JumpSeconds = 60; -+ JumpSecondsSlow = 10; - } - - cSetup& cSetup::operator= (const cSetup &s) -@@ -698,6 +700,8 @@ - else if (!strcasecmp(Name, "ShowChannelNamesWithSource")) ShowChannelNamesWithSource = atoi(Value); - else if (!strcasecmp(Name, "EmergencyExit")) EmergencyExit = atoi(Value); - else if (!strcasecmp(Name, "LastReplayed")) cReplayControl::SetRecording(Value); -+ else if (!strcasecmp(Name, "JumpSeconds")) JumpSeconds = atoi(Value); -+ else if (!strcasecmp(Name, "JumpSecondsSlow")) JumpSecondsSlow = atoi(Value); - else - return false; - return true; -@@ -816,6 +820,8 @@ - Store("ShowChannelNamesWithSource", ShowChannelNamesWithSource); - Store("EmergencyExit", EmergencyExit); - Store("LastReplayed", cReplayControl::LastReplayed()); -+ Store("JumpSeconds", JumpSeconds); -+ Store("JumpSecondsSlow", JumpSecondsSlow); - - Sort(); - ---- a/config.h -+++ b/config.h -@@ -352,6 +352,8 @@ - int ChannelsWrap; - int ShowChannelNamesWithSource; - int EmergencyExit; -+ int JumpSeconds; -+ int JumpSecondsSlow; - int __EndData__; - cString InitialChannel; - cString DeviceBondings; ---- a/menu.c -+++ b/menu.c -@@ -3630,6 +3630,8 @@ - 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 cMenuEditIntItem(tr("Setup.Replay$Jump Seconds"), &data.JumpSeconds)); -+ Add(new cMenuEditIntItem(tr("Setup.Replay$Jump Seconds Slow"), &data.JumpSecondsSlow)); - } - - void cMenuSetupReplay::Store(void) -@@ -5588,9 +5590,9 @@ - case kRight: Forward(); break; - case kRed: TimeSearch(); break; - case kGreen|k_Repeat: -- case kGreen: SkipSeconds(-60); break; -+ case kGreen: SkipSeconds(-Setup.JumpSeconds); break; - case kYellow|k_Repeat: -- case kYellow: SkipSeconds( 60); break; -+ case kYellow: SkipSeconds(Setup.JumpSeconds); break; - case kStop: - case kBlue: Hide(); - Stop(); diff -Nru vdr-2.1.6/debian/patches/opt-67_epgsearch-exttimeredit-0.0.2.patch vdr-2.1.6-297~3e4e445/debian/patches/opt-67_epgsearch-exttimeredit-0.0.2.patch --- vdr-2.1.6/debian/patches/opt-67_epgsearch-exttimeredit-0.0.2.patch 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/opt-67_epgsearch-exttimeredit-0.0.2.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,135 +0,0 @@ -Description: <short summary of the patch> - TODO: Put a short summary on the line above and replace this paragraph - with a longer explanation of this change. Complete the meta-information - with other relevant fields (see below for details). To make it easier, the - information below has been extracted from the changelog. Adjust it or drop - it. - . - vdr (1.7.27-5yavdr0~precise) precise; urgency=medium - . - * Fix bug with wareagle patch and vim 1.7.27 (thx oldmanuk) -Author: Marco Scholl <develop@marco-scholl.de> - ---- -The information above should follow the Patch Tagging Guidelines, please -checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here -are templates for supplementary fields that you might want to add: - -Origin: <vendor|upstream|other>, <url of original patch> -Bug: <url in upstream bugtracker> -Bug-Debian: http://bugs.debian.org/<bugnumber> -Bug-Ubuntu: https://launchpad.net/bugs/<bugnumber> -Forwarded: <no|not-needed|url proving that it has been forwarded> -Reviewed-By: <name and email of someone who approved the patch> -Last-Update: <YYYY-MM-DD> - ---- a/menu.c -+++ b/menu.c -@@ -1028,6 +1028,7 @@ - class cMenuTimerItem : public cOsdItem { - private: - cTimer *timer; -+ void DoSet(void); - char diskStatus; - public: - cMenuTimerItem(cTimer *Timer); -@@ -1042,7 +1043,7 @@ - { - timer = Timer; - diskStatus = ' '; -- Set(); -+ DoSet(); - } - - int cMenuTimerItem::Compare(const cListObject &ListObject) const -@@ -1052,6 +1053,18 @@ - - void cMenuTimerItem::Set(void) - { -+ // check for deleted timer -+ for (cTimer *t = Timers.First(); ; t = Timers.Next(t)) { -+ if (t == timer) -+ break; // timer still there -+ if (t == NULL) -+ return; // no matching timer found -+ } -+ DoSet(); -+} -+ -+void cMenuTimerItem::DoSet(void) -+{ - cString day, name(""); - if (timer->WeekDays()) - day = timer->PrintDay(0, timer->WeekDays(), false); -@@ -1150,8 +1163,7 @@ - class cMenuTimers : public cOsdMenu { - private: - int helpKeys; -- eOSState Edit(void); -- eOSState New(void); -+ eOSState Edit(bool New = false); - eOSState Delete(void); - eOSState OnOff(void); - eOSState Info(void); -@@ -1229,19 +1241,30 @@ - return osContinue; - } - --eOSState cMenuTimers::Edit(void) -+eOSState cMenuTimers::Edit(bool New) - { -- if (HasSubMenu() || Count() == 0) -+ if (HasSubMenu() || (Count() == 0 && !New)) - return osContinue; -- isyslog("editing timer %s", *CurrentTimer()->ToDescr()); -- return AddSubMenu(new cMenuEditTimer(CurrentTimer())); --} -+ if (!New) -+ isyslog("editing timer %s", *CurrentTimer()->ToDescr()); - --eOSState cMenuTimers::New(void) --{ -- if (HasSubMenu()) -- return osContinue; -- return AddSubMenu(new cMenuEditTimer(new cTimer, true)); -+ // Data structure for service "Epgsearch-exttimeredit-v1.0" -+ struct Epgsearch_exttimeredit_v1_0 -+ { -+ // in -+ cTimer* timer; // pointer to the timer to edit -+ bool bNew; // flag that indicates, if this is a new timer or an existing one -+ const cEvent* event; // pointer to the event corresponding to this timer (may be NULL) -+ // out -+ cOsdMenu* pTimerMenu; // pointer to the menu of results -+ } exttimeredit; -+ exttimeredit.timer = New ? (new cTimer) : CurrentTimer(); -+ exttimeredit.bNew = New; -+ exttimeredit.event = exttimeredit.timer->Event(); -+ if (cPluginManager::CallFirstService("Epgsearch-exttimeredit-v1.0", &exttimeredit)) -+ return AddSubMenu(exttimeredit.pTimerMenu); -+ -+ return AddSubMenu(new cMenuEditTimer(exttimeredit.timer, New)); - } - - eOSState cMenuTimers::Delete(void) -@@ -1349,7 +1372,7 @@ - case kOk: return Edit(); - case kRed: actualiseDiskStatus = true; - state = OnOff(); break; // must go through SetHelpKeys()! -- case kGreen: return New(); -+ case kGreen: return Edit(true); - case kYellow: actualiseDiskStatus = true; - state = Delete(); break; - case kInfo: -@@ -1365,6 +1388,11 @@ - actualiseDiskStatus = true; - Display(); - } -+ if (!HasSubMenu() && Timers.Count()<Count()) { -+ // timer was deleted -+ cOsdMenu::Del(Current()); -+ Display(); -+ } - if (Key != kNone) - SetHelpKeys(); - return state; diff -Nru vdr-2.1.6/debian/patches/opt-99_dvbhddevice-make.patch vdr-2.1.6-297~3e4e445/debian/patches/opt-99_dvbhddevice-make.patch --- vdr-2.1.6/debian/patches/opt-99_dvbhddevice-make.patch 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/opt-99_dvbhddevice-make.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ ---- a/PLUGINS/src/dvbhddevice/Makefile -+++ b/PLUGINS/src/dvbhddevice/Makefile -@@ -9,7 +9,7 @@ - # IMPORTANT: the presence of this macro is important for the Make.config - # file. So it must be defined, even if it is not used here! - # --PLUGIN = dvbhddevice -+export PLUGIN = dvbhddevice - - ### The version number of this plugin (taken from the main source file): - diff -Nru vdr-2.1.6/debian/patches/series vdr-2.1.6-297~3e4e445/debian/patches/series --- vdr-2.1.6/debian/patches/series 2014-04-06 10:34:04.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/series 1970-01-01 00:00:00.000000000 +0000 @@ -1,66 +0,0 @@ -04_newplugin.patch -06_default_svdrp_port_0.patch -#12_osdbase-maxitems.patch - -81_Make_config.patch -#82_valgrind.patch - -99_ncursesw-include.patch - -# rofafor Patch collection -# http://www.saunalahti.fi/~rahrenbe/vdr/patches/index.php -#opt-10_vdr-2.0.3-vasarajanauloja.patch - -# Easy editing of cutting marks -# (Requires opt-10_vasarajanauloja!) -#opt-22-x_edit_marks.patch - -# The Jump patch allows automatic jumping over cutting marks. -opt-24_jumpplay.patch - -# Patch needed for the ttxtsubs plugin. -#opt-27_ttxtsubs.patch - -# Patch needed for the menuorg plugin. -opt-37-x_menuorg.patch - -# Patch to show an info, if it is possible to record an event in the timer-info. -#opt-41-x_timer-info.patch - -# Patch to allow plugins to replace the VDR mainmenus -opt-42-x_MainMenuHooks-v1.0.1.patch - -# Patch needed for the rotor plugin. -#opt-44_rotor.patch - -# Patch needed for the yaepg plugin. -#opt-45_yaepg.patch - -# Patch required for the GraphTFT plugin -opt-50_graphtft.patch -#opt-50_graphtft-liemikuutio.patch - -#opt-55_wareagleicon.patch -opt-56_eventdetails_v3.patch - -opt-57_vdr-remote_instant_recordings.patch -opt-61_dynamite.patch - -##opt-63_naludump.patch -opt-65_pin.patch -opt-66_jumpingseconds.patch -#opt-67_epgsearch-exttimeredit-0.0.2.patch - -#xprmtl-01_externalci.patch -xprmtl-02_permashift-0.5.4.patch -#xprmtl-03_extra-video-directory.patch -xprmtl-03_hide-first-recording-level-v3.patch - -#xprmtl-04_loglevel.patch - -#backports from vdr 2.1.x -#xprmtl-05_epghandler-segment-transfer.patch - -#xprmtl-06_lirc-reconnect.patch -vdr-2.1.6-conf.d-v6.diff - diff -Nru vdr-2.1.6/debian/patches/vdr-2.1.6-conf.d-v6.diff vdr-2.1.6-297~3e4e445/debian/patches/vdr-2.1.6-conf.d-v6.diff --- vdr-2.1.6/debian/patches/vdr-2.1.6-conf.d-v6.diff 2014-04-06 10:34:29.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/vdr-2.1.6-conf.d-v6.diff 1970-01-01 00:00:00.000000000 +0000 @@ -1,313 +0,0 @@ -Description: Patch for VDR to support reading its arguments from files. -Origin: https://github.com/flensrocker/vdr/tree/conf.d-args -Forwarded: yes -Author: Lars Hanisch <dvb@flensrocker.de> - ---- a/Make.config.template -+++ b/Make.config.template -@@ -38,6 +38,7 @@ - - #VIDEODIR = /srv/vdr/video - #CONFDIR = /var/lib/vdr -+#ARGSDIR = /etc/vdr/conf.d - #CACHEDIR = /var/cache/vdr - - # Overrides for preset/legacy configurations: ---- a/Makefile -+++ b/Makefile -@@ -31,6 +31,7 @@ - DESTDIR ?= - VIDEODIR ?= /srv/vdr/video - CONFDIR ?= /var/lib/vdr -+ARGSDIR ?= /etc/vdr/conf.d - CACHEDIR ?= /var/cache/vdr - - PREFIX ?= /usr/local -@@ -66,7 +67,7 @@ - - SILIB = $(LSIDIR)/libsi.a - --OBJS = audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o dvbci.o\ -+OBJS = args.o audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o dvbci.o\ - dvbplayer.o dvbspu.o dvbsubtitle.o eit.o eitscan.o epg.o filter.o font.o i18n.o interface.o keys.o\ - lirc.o menu.o menuitems.o nit.o osdbase.o osd.o pat.o player.o plugin.o positioner.o\ - receiver.o recorder.o recording.o remote.o remux.o ringbuffer.o sdt.o sections.o shutdown.o\ -@@ -105,6 +106,7 @@ - DEFINES += -DVIDEODIR=\"$(VIDEODIR)\" - DEFINES += -DCONFDIR=\"$(CONFDIR)\" - DEFINES += -DCACHEDIR=\"$(CACHEDIR)\" -+DEFINES += -DARGSDIR=\"$(ARGSDIR)\" - DEFINES += -DRESDIR=\"$(RESDIR)\" - DEFINES += -DPLUGINDIR=\"$(LIBDIR)\" - DEFINES += -DLOCDIR=\"$(LOCDIR)\" -@@ -147,6 +149,7 @@ - @echo "bindir=$(BINDIR)" > $@ - @echo "mandir=$(MANDIR)" >> $@ - @echo "configdir=$(CONFDIR)" >> $@ -+ @echo "argsdir=$(ARGSDIR)" >> $@ - @echo "videodir=$(VIDEODIR)" >> $@ - @echo "cachedir=$(CACHEDIR)" >> $@ - @echo "resdir=$(RESDIR)" >> $@ -@@ -265,6 +268,7 @@ - install-dirs: - @mkdir -p $(DESTDIR)$(VIDEODIR) - @mkdir -p $(DESTDIR)$(CONFDIR) -+ @mkdir -p $(DESTDIR)$(ARGSDIR) - @mkdir -p $(DESTDIR)$(CACHEDIR) - @mkdir -p $(DESTDIR)$(RESDIR) - ---- /dev/null -+++ b/args.c -@@ -0,0 +1,135 @@ -+/* -+ * args.c: Read arguments from files -+ * -+ * See the main source file 'vdr.c' for copyright information and -+ * how to reach the author. -+ * -+ * $Id: $ -+ */ -+ -+#include "args.h" -+#include <unistd.h> -+ -+cArgs::cArgs(const char *Argv0) -+{ -+ argv0 = Argv0; -+ argc = 0; -+ argv = NULL; -+} -+ -+cArgs::~cArgs(void) -+{ -+ if (argv != NULL) -+ delete [] argv; -+} -+ -+bool cArgs::AddArg(const char *s) -+{ -+ if (inVdrSection) -+ args.Append(strdup(s)); -+ else if (*lastArg == NULL) -+ return false; -+ else -+ lastArg = cString::sprintf("%s %s", *lastArg, s); -+ return true; -+} -+ -+bool cArgs::ReadDirectory(const char *Directory) -+{ -+ if (argv != NULL) -+ delete [] argv; -+ argc = 0; -+ argv = NULL; -+ args.Clear(); -+ lastArg = NULL; -+ inVdrSection = false; -+ -+ cFileNameList files(Directory, false); -+ if (files.Size() == 0) -+ return false; -+ -+ for (int i = 0; i < files.Size(); i++) { -+ const char *fileName = files.At(i); -+ if (startswith(fileName, ".") || !endswith(fileName, ".conf")) -+ continue; -+ -+ cString fullFileName = AddDirectory(Directory, fileName); -+ struct stat fs; -+ if ((access(*fullFileName, F_OK) != 0) || (stat(*fullFileName, &fs) != 0) || S_ISDIR(fs.st_mode)) -+ continue; -+ -+ bool ok = true; -+ int line = 0; -+ FILE *f = fopen(*fullFileName, "r"); -+ if (f) { -+ char *s; -+ cReadLine ReadLine; -+ while ((s = ReadLine.Read(f)) != NULL) { -+ line++; -+ s = stripspace(skipspace(s)); -+ if (!isempty(s) && (s[0] != '#')) { -+ if (startswith(s, "[") && endswith(s, "]")) { -+ s[strlen(s) - 1] = 0; -+ s++; -+ -+ if (*lastArg) { -+ args.Append(strdup(*lastArg)); -+ lastArg = NULL; -+ } -+ -+ if (strcmp(s, "vdr") == 0) -+ inVdrSection = true; -+ else { -+ inVdrSection = false; -+ lastArg = cString::sprintf("--plugin=%s", s); -+ } -+ } -+ else { -+ if ((strlen(s) > 2) && (s[0] == '-') && (s[1] != '-')) { // short option, split at first space -+ char *p = strchr(s, ' '); -+ if (p == NULL) { -+ ok = AddArg(s); -+ if (!ok) -+ break; -+ } -+ else { -+ *p = 0; -+ p++; -+ ok = AddArg(s); -+ if (!ok) -+ break; -+ ok = AddArg(p); -+ if (!ok) -+ break; -+ } -+ } -+ else { -+ ok = AddArg(s); -+ if (!ok) -+ break; -+ } -+ } -+ } -+ } -+ fclose(f); -+ } -+ if (!ok) { -+ esyslog("ERROR: args file %s, line %d", *fullFileName, line); -+ return false; -+ } -+ } -+ if (*lastArg) { -+ args.Append(strdup(*lastArg)); -+ lastArg = NULL; -+ } -+ -+ argv = new char*[args.Size() + 1]; -+ argv[0] = strdup(*argv0); -+ argc = 1; -+ for (int i = 0; i < args.Size(); i++) { -+ argv[argc] = args.At(i); -+ argc++; -+ } -+ return true; -+} -+ ---- /dev/null -+++ b/args.h -@@ -0,0 +1,36 @@ -+/* -+ * args.h: Read arguments from files -+ * -+ * See the main source file 'vdr.c' for copyright information and -+ * how to reach the author. -+ * -+ * $Id: $ -+ */ -+ -+#ifndef __ARGS_H -+#define __ARGS_H -+ -+#include "tools.h" -+ -+class cArgs { -+private: -+ cString argv0; -+ cStringList args; -+ cString lastArg; -+ bool inVdrSection; -+ int argc; -+ char **argv; -+ -+ bool AddArg(const char *s); -+ -+public: -+ cArgs(const char *Argv0); -+ ~cArgs(void); -+ -+ bool ReadDirectory(const char *Directory); -+ -+ int GetArgc(void) const { return argc; }; -+ char **GetArgv(void) const { return argv; }; -+ }; -+ -+#endif //__ARGS_H ---- a/vdr.c -+++ b/vdr.c -@@ -39,6 +39,7 @@ - #endif - #include <termios.h> - #include <unistd.h> -+#include "args.h" - #include "audio.h" - #include "channels.h" - #include "config.h" -@@ -191,6 +192,7 @@ - #define DEFAULTWATCHDOG 0 // seconds - #define DEFAULTVIDEODIR VIDEODIR - #define DEFAULTCONFDIR dd(CONFDIR, VideoDirectory) -+#define DEFAULTARGSDIR dd(ARGSDIR, "/etc/vdr/conf.d") - #define DEFAULTCACHEDIR dd(CACHEDIR, VideoDirectory) - #define DEFAULTRESDIR dd(RESDIR, ConfigDirectory) - #define DEFAULTPLUGINDIR PLUGINDIR -@@ -228,6 +230,15 @@ - VdrUser = VDR_USER; - #endif - -+ cArgs *args = NULL; -+ if (argc == 1) { -+ args = new cArgs(argv[0]); -+ if (args->ReadDirectory(DEFAULTARGSDIR)) { -+ argc = args->GetArgc(); -+ argv = args->GetArgv(); -+ } -+ } -+ - cVideoDirectory::SetName(VideoDirectory); - cPluginManager PluginManager(DEFAULTPLUGINDIR); - -@@ -256,6 +267,7 @@ - { "port", required_argument, NULL, 'p' }, - { "record", required_argument, NULL, 'r' }, - { "resdir", required_argument, NULL, 'r' | 0x100 }, -+ { "showargs", optional_argument, NULL, 's' | 0x200 }, - { "shutdown", required_argument, NULL, 's' }, - { "split", no_argument, NULL, 's' | 0x100 }, - { "terminal", required_argument, NULL, 't' }, -@@ -430,6 +442,19 @@ - case 's' | 0x100: - Setup.SplitEditedFiles = 1; - break; -+ case 's' | 0x200: { -+ const char *argsdir = optarg ? optarg : DEFAULTARGSDIR; -+ cArgs a(argv[0]); -+ if (!a.ReadDirectory(argsdir)) { -+ fprintf(stderr, "vdr: can't read arguments from directory: %s\n", argsdir); -+ return 2; -+ } -+ int c = a.GetArgc(); -+ char **v = a.GetArgv(); -+ for (int i = 1; i < c; i++) -+ printf("%s\n", v[i]); -+ return 0; -+ } - case 't': Terminal = optarg; - if (access(Terminal, R_OK | W_OK) < 0) { - fprintf(stderr, "vdr: can't access terminal: %s\n", Terminal); -@@ -550,6 +575,7 @@ - " -s CMD, --shutdown=CMD call CMD to shutdown the computer\n" - " --split split edited files at the editing marks (only\n" - " useful in conjunction with --edit)\n" -+ " --showargs[=DIR] print the arguments read from DIR and exit (default: %s)\n" - " -t TTY, --terminal=TTY controlling tty\n" - " -u USER, --user=USER run as user USER; only applicable if started as\n" - " root\n" -@@ -572,6 +598,7 @@ - DEFAULTLOCDIR, - DEFAULTSVDRPPORT, - DEFAULTRESDIR, -+ DEFAULTARGSDIR, - DEFAULTVIDEODIR, - DEFAULTWATCHDOG - ); diff -Nru vdr-2.1.6/debian/patches/xprmtl-01_externalci.patch vdr-2.1.6-297~3e4e445/debian/patches/xprmtl-01_externalci.patch --- vdr-2.1.6/debian/patches/xprmtl-01_externalci.patch 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/xprmtl-01_externalci.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,247 +0,0 @@ -Description: used by the ddci plugin -Origin: https://github.com/flensrocker/vdr-plugin-ddci -Forwarded: no -Author: Lars Hanisch <dvb@flensrocker.de> - ---- a/ci.h -+++ b/ci.h -@@ -72,6 +72,7 @@ - }; - - class cDevice; -+class cTSBufferBase; - class cCamSlot; - - enum eModuleStatus { msNone, msReset, msPresent, msReady }; -@@ -115,6 +116,11 @@ - ///< The derived class must call Cancel(3) in its destructor. - virtual bool Ready(void); - ///< Returns 'true' if all present CAMs in this adapter are ready. -+#define EXTERNALCI_PATCH -+ virtual cTSBufferBase *GetTSBuffer(int FdDvr) { return NULL; } -+ ///< Derived classes can return a special TS buffer with features -+ ///< like rerouting the stream through an external ci. -+ ///< The caller must delete the buffer. - virtual bool SetIdle(bool Idle, bool TestOnly) { return false; } - virtual bool IsIdle(void) const { return false; } - }; ---- a/device.h -+++ b/device.h -@@ -840,7 +840,14 @@ - /// sure the returned data points to a TS packet and automatically - /// re-synchronizes after broken packets. - --class cTSBuffer : public cThread { -+class cTSBufferBase { -+public: -+ cTSBufferBase() {} -+ virtual ~cTSBufferBase() {} -+ virtual uchar *Get(void) = 0; -+ }; -+ -+class cTSBuffer : public cTSBufferBase, public cThread { - private: - int f; - int cardIndex; -@@ -849,8 +856,8 @@ - virtual void Action(void); - public: - cTSBuffer(int File, int Size, int CardIndex); -- ~cTSBuffer(); -- uchar *Get(void); -+ virtual ~cTSBuffer(); -+ virtual uchar *Get(void); - }; - - /// A plugin that want to create devices handled by the dynamite-plugin needs to create ---- a/dvbci.c -+++ b/dvbci.c -@@ -22,23 +22,8 @@ - adapter = Adapter; - frontend = Frontend; - idle = false; -- ca_caps_t Caps; -- if (ioctl(fd, CA_GET_CAP, &Caps) == 0) { -- if ((Caps.slot_type & CA_CI_LINK) != 0) { -- int NumSlots = Caps.slot_num; -- if (NumSlots > 0) { -- for (int i = 0; i < NumSlots; i++) -- new cCamSlot(this); -- Start(); -- } -- else -- esyslog("ERROR: no CAM slots found on device %d", device->DeviceNumber()); -- } -- else -- isyslog("device %d doesn't support CI link layer interface", device->DeviceNumber()); -- } -- else -- esyslog("ERROR: can't get CA capabilities on device %d", device->DeviceNumber()); -+ GetNumCamSlots(Device, Fd, this); -+ Start(); - } - - cDvbCiAdapter::~cDvbCiAdapter() -@@ -48,6 +33,13 @@ - CloseCa(); - } - -+cTSBufferBase *cDvbCiAdapter::GetTSBuffer(int FdDvr) -+{ -+ if (device) -+ return new cTSBuffer(FdDvr, MEGABYTE(2), device->CardIndex() + 1); -+ return NULL; -+} -+ - bool cDvbCiAdapter::OpenCa(void) - { - if (fd >= 0) -@@ -142,10 +134,60 @@ - return true; - } - -+int cDvbCiAdapter::GetNumCamSlots(cDevice *Device, int Fd, cCiAdapter *CiAdapter) -+{ -+ int NumSlots = -1; -+ if (Fd >= 0) { -+ ca_caps_t Caps; -+ if (ioctl(Fd, CA_GET_CAP, &Caps) == 0) { -+ if ((Caps.slot_type & CA_CI_LINK) != 0) { -+ NumSlots = Caps.slot_num; -+ if (NumSlots == 0) -+ esyslog("ERROR: no CAM slots found on device %d", Device->DeviceNumber()); -+ else if (CiAdapter != NULL) { -+ for (int i = 0; i < NumSlots; i++) -+ new cCamSlot(CiAdapter); -+ } -+ else -+ return NumSlots; -+ } -+ else -+ isyslog("device %d doesn't support CI link layer interface", Device->DeviceNumber()); -+ } -+ else -+ esyslog("ERROR: can't get CA capabilities on device %d", Device->DeviceNumber()); -+ } -+ return -1; -+} -+ - cDvbCiAdapter *cDvbCiAdapter::CreateCiAdapter(cDevice *Device, int Fd, int Adapter, int Frontend) - { -- // TODO check whether a CI is actually present? -- if (Device) -+ // don't create a ci-adapter if it's not useable -+ if (Device && (Fd >= 0) && (GetNumCamSlots(Device, Fd, NULL) > 0)) - return new cDvbCiAdapter(Device, Fd, Adapter, Frontend); -- return NULL; -+ -+ if (Fd >= 0) -+ close(Fd); -+ -+ // try to find an external ci-adapter -+ for (cDvbCiAdapterProbe *cp = DvbCiAdapterProbes.First(); cp; cp = DvbCiAdapterProbes.Next(cp)) { -+ cDvbCiAdapter *ca = cp->Probe(Device); -+ if (ca) -+ return ca; -+ } -+ return NULL; -+} -+ -+// --- cDvbCiAdapterProbe ------------------------------------------------------- -+ -+cList<cDvbCiAdapterProbe> DvbCiAdapterProbes; -+ -+cDvbCiAdapterProbe::cDvbCiAdapterProbe(void) -+{ -+ DvbCiAdapterProbes.Add(this); -+} -+ -+cDvbCiAdapterProbe::~cDvbCiAdapterProbe() -+{ -+ DvbCiAdapterProbes.Del(this, false); - } ---- a/dvbci.h -+++ b/dvbci.h -@@ -31,9 +31,33 @@ - cDvbCiAdapter(cDevice *Device, int Fd, int Adapter = -1, int Frontend = -1); - public: - virtual ~cDvbCiAdapter(); -+ virtual cTSBufferBase *GetTSBuffer(int FdDvr); -+ static int GetNumCamSlots(cDevice *Device, int Fd, cCiAdapter *CiAdapter); -+ ///< Tests if the CA device is usable for vdr. -+ ///< If CiAdapter is not NULL it will create the CamSlots for the given ci-adapter. - virtual bool SetIdle(bool Idle, bool TestOnly); - virtual bool IsIdle(void) const { return idle; } - static cDvbCiAdapter *CreateCiAdapter(cDevice *Device, int Fd, int Adapter = -1, int Frontend = -1); - }; - -+// A plugin that implements an external DVB ci-adapter derived from cDvbCiAdapter needs to create -+// a cDvbCiAdapterProbe derived object on the heap in order to have its Probe() -+// function called, where it can actually create the appropriate ci-adapter. -+// The cDvbCiAdapterProbe object must be created in the plugin's constructor, -+// and deleted in its destructor. -+// Every plugin has to track its own list of already used device nodes. -+// The Probes are always called if the base cDvbCiAdapter can't create a ci-adapter on its own. -+ -+class cDvbCiAdapterProbe : public cListObject { -+public: -+ cDvbCiAdapterProbe(void); -+ virtual ~cDvbCiAdapterProbe(); -+ virtual cDvbCiAdapter *Probe(cDevice *Device) = 0; -+ ///< Probes for a DVB ci-adapter for the given Device and creates the appropriate -+ ///< object derived from cDvbCiAdapter if applicable. -+ ///< Returns NULL if no adapter has been created. -+ }; -+ -+extern cList<cDvbCiAdapterProbe> DvbCiAdapterProbes; -+ - #endif //__DVBCI_H ---- a/dvbdevice.c -+++ b/dvbdevice.c -@@ -1140,9 +1140,8 @@ - - // Common Interface: - -- fd_ca = DvbOpen(DEV_DVB_CA, adapter, frontend, O_RDWR); -- if (fd_ca >= 0) -- ciAdapter = cDvbCiAdapter::CreateCiAdapter(parentDevice ? parentDevice : this, fd_ca, adapter, frontend); -+ int fd_ca = DvbOpen(DEV_DVB_CA, adapter, frontend, O_RDWR); -+ ciAdapter = cDvbCiAdapter::CreateCiAdapter(parentDevice ? parentDevice : this, fd_ca, adapter, frontend); - - // The DVR device (will be opened and closed as needed): - -@@ -1729,8 +1728,12 @@ - { - CloseDvr(); - fd_dvr = DvbOpen(DEV_DVB_DVR, adapter, frontend, O_RDONLY | O_NONBLOCK, true); -- if (fd_dvr >= 0) -- tsBuffer = new cTSBuffer(fd_dvr, MEGABYTE(5), CardIndex() + 1); -+ if (fd_dvr >= 0) { -+ if (ciAdapter) -+ tsBuffer = ciAdapter->GetTSBuffer(fd_dvr); -+ if (tsBuffer == NULL) -+ tsBuffer = new cTSBuffer(fd_dvr, MEGABYTE(5), CardIndex() + 1); -+ } - return fd_dvr >= 0; - } - ---- a/dvbdevice.h -+++ b/dvbdevice.h -@@ -176,7 +176,7 @@ - int deliverySystems[MAXDELIVERYSYSTEMS]; - int numDeliverySystems; - int numModulations; -- int fd_dvr, fd_ca; -+ int fd_dvr; - static cMutex bondMutex; - cDvbDevice *bondedDevice; - mutable bool needsDetachBondedReceivers; -@@ -277,7 +277,7 @@ - // Receiver facilities - - private: -- cTSBuffer *tsBuffer; -+ cTSBufferBase *tsBuffer; - protected: - virtual bool OpenDvr(void); - virtual void CloseDvr(void); diff -Nru vdr-2.1.6/debian/patches/xprmtl-02_permashift-0.5.4.patch vdr-2.1.6-297~3e4e445/debian/patches/xprmtl-02_permashift-0.5.4.patch --- vdr-2.1.6/debian/patches/xprmtl-02_permashift-0.5.4.patch 2014-04-02 18:00:14.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/xprmtl-02_permashift-0.5.4.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,301 +0,0 @@ -Description: patch for permashift plugin -Origin: http://ein-eike.de/vdr-plugin-permashift/ -Forwarded: no -Author: Eike Sauer <eike@ein-eike.de> - ---- a/dvbplayer.h -+++ b/dvbplayer.h -@@ -19,7 +19,7 @@ - private: - cDvbPlayer *player; - public: -- cDvbPlayerControl(const char *FileName, bool PauseLive = false); -+ cDvbPlayerControl(const char *FileName, bool PauseLive = false, bool ReusedPauseLive = false); - // Sets up a player for the given file. - // If PauseLive is true, special care is taken to make sure the index - // file of the recording is long enough to allow the player to display ---- a/menu.h -+++ b/menu.h -@@ -257,8 +257,11 @@ - private: - static cRecordControl *RecordControls[]; - static int state; -+ static bool TryReuseRecording(bool Pause); -+ ///< Tries to reuse an existing recording instead of creating a second one in parallel. -+ ///< Returns true if successful. - public: -- static bool Start(cTimer *Timer = NULL, bool Pause = false); -+ static bool Start(cTimer *Timer = NULL, bool Pause = false, bool* reused = NULL); - static void Stop(const char *InstantId); - static bool PauseLiveVideo(void); - static const char *GetInstantId(const char *LastInstantId); -@@ -266,9 +269,14 @@ - static cRecordControl *GetRecordControl(const cTimer *Timer); - ///< Returns the cRecordControl for the given Timer. - ///< If there is no cRecordControl for Timer, NULL is returned. -+ static cRecordControl *GetRecordControl(int channelNo); -+ ///< Returns the cRecordControl for the given channel number. -+ ///< If there is no cRecordControl, NULL is returned. - static void Process(time_t t); - static void ChannelDataModified(cChannel *Channel); -- static bool Active(void); -+ static bool Active(int minimumPriority = MINPRIORITY); -+ ///< Only recordings with at least minimumPriority are considered active. -+ ///< Default value of parameter considers every recording as "activity". - static void Shutdown(void); - static void ChangeState(void) { state++; } - static bool StateChanged(int &State); -@@ -300,7 +308,7 @@ - void EditCut(void); - void EditTest(void); - public: -- cReplayControl(bool PauseLive = false); -+ cReplayControl(bool PauseLive = false, bool ReusedPauseLive = false); - virtual ~cReplayControl(); - void Stop(void); - virtual cOsdObject *GetInfo(void); ---- a/timers.h -+++ b/timers.h -@@ -120,7 +120,7 @@ - cTimer *GetTimer(cTimer *Timer); - cTimer *GetMatch(time_t t); - cTimer *GetMatch(const cEvent *Event, eTimerMatch *Match = NULL); -- cTimer *GetNextActiveTimer(void); -+ cTimer *GetNextActiveTimer(int minimumPriority = MINPRIORITY); - int BeingEdited(void) { return beingEdited; } - void IncBeingEdited(void) { beingEdited++; } - void DecBeingEdited(void) { if (!--beingEdited) lastSetEvents = 0; } ---- a/dvbplayer.c -+++ b/dvbplayer.c -@@ -218,6 +218,7 @@ - double framesPerSecond; - bool isPesRecording; - bool pauseLive; -+ bool reusedPauseLive; - bool eof; - bool firstPacket; - ePlayModes playMode; -@@ -238,7 +239,7 @@ - virtual void Activate(bool On); - virtual void Action(void); - public: -- cDvbPlayer(const char *FileName, bool PauseLive); -+ cDvbPlayer(const char *FileName, bool PauseLive, bool ReusedPauseLive = false); - virtual ~cDvbPlayer(); - bool Active(void) { return cThread::Running(); } - void Pause(void); -@@ -260,7 +261,7 @@ - #define SPEED_MULT 12 // the speed multiplier - int cDvbPlayer::Speeds[] = { 0, -2, -4, -8, 1, 2, 4, 12, 0 }; - --cDvbPlayer::cDvbPlayer(const char *FileName, bool PauseLive) -+cDvbPlayer::cDvbPlayer(const char *FileName, bool PauseLive, bool ReusedPauseLive) - :cThread("dvbplayer") - { - nonBlockingFileReader = NULL; -@@ -270,6 +271,7 @@ - framesPerSecond = Recording.FramesPerSecond(); - isPesRecording = Recording.IsPesRecording(); - pauseLive = PauseLive; -+ reusedPauseLive = ReusedPauseLive; - eof = false; - firstPacket = true; - playMode = pmPlay; -@@ -435,8 +437,17 @@ - int LastReadIFrame = -1; - int SwitchToPlayFrame = 0; - -- if (pauseLive) -- Goto(0, true); -+ if (reusedPauseLive) { -+ int Current, Total; -+ GetIndex(Current, Total, false); -+ readIndex = max(Total - 1, 0); -+ Goto(readIndex, true); -+ playMode = pmStill; -+ } -+ else if (pauseLive) { -+ Goto(0, true); -+ } -+ - while (Running()) { - if (WaitingForData) - WaitingForData = !nonBlockingFileReader->WaitForDataMs(3); // this keeps the CPU load low, but reacts immediately on new data -@@ -930,8 +941,8 @@ - - // --- cDvbPlayerControl ----------------------------------------------------- - --cDvbPlayerControl::cDvbPlayerControl(const char *FileName, bool PauseLive) --:cControl(player = new cDvbPlayer(FileName, PauseLive)) -+cDvbPlayerControl::cDvbPlayerControl(const char *FileName, bool PauseLive, bool ReusedPauseLive) -+:cControl(player = new cDvbPlayer(FileName, PauseLive, ReusedPauseLive)) - { - } - ---- a/menu.c -+++ b/menu.c -@@ -4914,7 +4914,7 @@ - cRecordControl *cRecordControls::RecordControls[MAXRECORDCONTROLS] = { NULL }; - int cRecordControls::state = 0; - --bool cRecordControls::Start(cTimer *Timer, bool Pause) -+bool cRecordControls::Start(cTimer *Timer, bool Pause, bool* reused) - { - if (!Timer) { - cTimer *t = new cTimer(true, Pause); -@@ -4977,6 +4977,13 @@ - } - LastNoDiskSpaceMessage = 0; - -+ if (Timer == NULL) { -+ if (TryReuseRecording(Pause)) { -+ if (reused != NULL) *reused = true; -+ return true; -+ } -+ } -+ - ChangeState(); - int ch = Timer ? Timer->Channel()->Number() : cDevice::CurrentChannel(); - cChannel *channel = Channels.GetByNumber(ch); -@@ -5030,12 +5037,53 @@ - } - } - -+bool cRecordControls::TryReuseRecording(bool Pause) -+{ -+ cRecordControl* runningRecording = cRecordControls::GetRecordControl(cDevice::CurrentChannel()); -+ if (runningRecording != NULL && runningRecording->Timer() != NULL) { -+ cTimer *reuseTimer = runningRecording->Timer(); -+ // calculate length from current time -+ time_t t = time(NULL); -+ struct tm *tmNow = localtime(&t); -+ int now = tmNow->tm_hour * 60 + tmNow->tm_min; -+ int stop = reuseTimer->Stop(); -+ stop = stop / 100 * 60 + stop % 100; -+ int lengthFromNow = stop - now; -+ if (lengthFromNow < 0) -+ lengthFromNow += 24 * 60; -+ // Only use low priority recordings or, for pause, recordings which are long enough. -+ if (runningRecording->Timer()->Priority() <= LIVEPRIORITY || (Pause && lengthFromNow >= Setup.InstantRecordTime)) { -+ // always adapt recording time for instant recording, only raise stop time for pause -+ if (!Pause || lengthFromNow < Setup.InstantRecordTime) { -+ int stop = now + Setup.InstantRecordTime; -+ stop = (stop / 60) * 100 + (stop % 60); -+ if (stop >= 2400) stop -= 2400; -+ reuseTimer->SetStop(stop); -+ } -+ ChangeState(); -+ // for pause, set replay to the recording -+ if (Pause) { -+ cReplayControl::SetRecording(runningRecording->FileName()); -+ } -+ // for instant recording, raise priority and lifetime -+ else { -+ reuseTimer->SetPriority(max(Setup.DefaultPriority, reuseTimer->Priority())); -+ reuseTimer->SetLifetime(max(Setup.DefaultLifetime, reuseTimer->Lifetime())); -+ } -+ // We found a usable recording, don't create a new one. -+ return true; -+ } -+ } -+ return false; -+} -+ - bool cRecordControls::PauseLiveVideo(void) - { - Skins.Message(mtStatus, tr("Pausing live video...")); -+ bool reused = false; - cReplayControl::SetRecording(NULL); // make sure the new cRecordControl will set cReplayControl::LastReplayed() -- if (Start(NULL, true)) { -- cReplayControl *rc = new cReplayControl(true); -+ if (Start(NULL, true, &reused)) { -+ cReplayControl *rc = new cReplayControl(true, reused); - cControl::Launch(rc); - cControl::Attach(); - Skins.Message(mtStatus, NULL); -@@ -5078,6 +5126,23 @@ - return NULL; - } - -+cRecordControl *cRecordControls::GetRecordControl(int channelNo) -+{ -+ for (int i = 0; i < MAXRECORDCONTROLS; i++) { -+ if (RecordControls[i] != NULL) { -+ cTimer* existentTimer = RecordControls[i]->Timer(); -+ if (existentTimer != NULL && existentTimer->Channel() != NULL) { -+ if (RecordControls[i]->Timer()->Channel()->Number() == channelNo) { -+ if (existentTimer->Recording()) { -+ return RecordControls[i]; -+ } -+ } -+ } -+ } -+ } -+ return NULL; -+} -+ - void cRecordControls::Process(time_t t) - { - for (int i = 0; i < MAXRECORDCONTROLS; i++) { -@@ -5107,12 +5172,13 @@ - } - } - --bool cRecordControls::Active(void) -+bool cRecordControls::Active(int minimumPriority /* = MINPRIORITY */) - { -- for (int i = 0; i < MAXRECORDCONTROLS; i++) { -- if (RecordControls[i]) -+ for (int i = 0; i < MAXRECORDCONTROLS; i++) -+ if (RecordControls[i]) -+ if (RecordControls[i]->Timer() == NULL || RecordControls[i]->Timer()->Priority() >= minimumPriority) - return true; -- } -+ - return false; - } - -@@ -5136,8 +5202,8 @@ - cReplayControl *cReplayControl::currentReplayControl = NULL; - cString cReplayControl::fileName; - --cReplayControl::cReplayControl(bool PauseLive) --:cDvbPlayerControl(fileName, PauseLive) -+cReplayControl::cReplayControl(bool PauseLive, bool ReusedPauseLive) -+:cDvbPlayerControl(fileName, PauseLive, ReusedPauseLive) - { - cDevice::PrimaryDevice()->SetKeepTracks(PauseLive); - currentReplayControl = this; ---- a/shutdown.c -+++ b/shutdown.c -@@ -172,11 +172,11 @@ - return false; - } - -- cTimer *timer = Timers.GetNextActiveTimer(); -+ cTimer *timer = Timers.GetNextActiveTimer(TRANSFERPRIORITY); - time_t Next = timer ? timer->StartTime() : 0; - time_t Delta = timer ? Next - time(NULL) : 0; - -- if (cRecordControls::Active() || (Next && Delta <= 0)) { -+ if (cRecordControls::Active(TRANSFERPRIORITY) || (Next && Delta <= 0)) { - // VPS recordings in timer end margin may cause Delta <= 0 - if (!Interactive || !Interface->Confirm(tr("Recording - shut down anyway?"))) - return false; ---- a/timers.c -+++ b/timers.c -@@ -789,12 +789,12 @@ - return t; - } - --cTimer *cTimers::GetNextActiveTimer(void) -+cTimer *cTimers::GetNextActiveTimer(int minimumPriority /* = MINPRIORITY */) - { - cTimer *t0 = NULL; - for (cTimer *ti = First(); ti; ti = Next(ti)) { - ti->Matches(); -- if ((ti->HasFlags(tfActive)) && (!t0 || ti->StopTime() > time(NULL) && ti->Compare(*t0) < 0)) -+ if ((ti->HasFlags(tfActive)) && (!t0 || ti->StopTime() > time(NULL) && ti->Compare(*t0) < 0) && ti->Priority() >= minimumPriority) - t0 = ti; - } - return t0; diff -Nru vdr-2.1.6/debian/patches/xprmtl-03_extra-video-directory.patch vdr-2.1.6-297~3e4e445/debian/patches/xprmtl-03_extra-video-directory.patch --- vdr-2.1.6/debian/patches/xprmtl-03_extra-video-directory.patch 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/xprmtl-03_extra-video-directory.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,572 +0,0 @@ -Description: Add several video directories to vdr - and display all recordings in one list -Origin: https://github.com/flensrocker/vdr-plugin-dbus2vdr -Forwarded: no -Author: Lars Hanisch <dvb@flensrocker.de> - ---- a/menu.c -+++ b/menu.c -@@ -2701,6 +2701,19 @@ - char *s = ExchangeChars(strdup(base), true); - d = AddDirectory(d, s); - free(s); -+ if (!DirectoryOk(*d, false, true)) { -+ cString e; -+ if (LockExtraVideoDirectories(true)) { -+ for (int i = 0; i < ExtraVideoDirectories.Size(); i++) { -+ e = AddDirectory(ExtraVideoDirectories.At(i), s); -+ if (DirectoryOk(*e, false, true)) { -+ UnlockExtraVideoDirectories(); -+ return e; -+ } -+ } -+ UnlockExtraVideoDirectories(); -+ } -+ } - } - return d; - } -@@ -2731,7 +2744,7 @@ - if (ri->IsDirectory()) - Open(); - else { -- cReplayControl::SetRecording(ri->Recording()->FileName()); -+ cReplayControl::SetRecording(ri->Recording()->FileName(), ri->Recording()->VideoDir()); - return osReplay; - } - } -@@ -5151,6 +5164,7 @@ - - cReplayControl *cReplayControl::currentReplayControl = NULL; - cString cReplayControl::fileName; -+cString cReplayControl::videoDir; - - cReplayControl::cReplayControl(bool PauseLive, bool ReusedPauseLive) - :cDvbPlayerControl(fileName, PauseLive, ReusedPauseLive) -@@ -5168,7 +5182,7 @@ - lastSkipTimeout.Set(0); - timeoutShow = 0; - timeSearchActive = false; -- cRecording Recording(fileName); -+ cRecording Recording(fileName, videoDir); - cStatus::MsgReplaying(this, Recording.Name(), Recording.FileName(), true); - marks.Load(fileName, Recording.FramesPerSecond(), Recording.IsPesRecording()); - SetTrackDescriptions(false); -@@ -5218,9 +5232,12 @@ - cDvbPlayerControl::Stop(); - } - --void cReplayControl::SetRecording(const char *FileName) -+void cReplayControl::SetRecording(const char *FileName, const char *VideoDir) - { - fileName = FileName; -+ videoDir = VideoDir; -+ if ((FileName != NULL) && (VideoDir == NULL)) -+ videoDir = FindMatchingExtraVideoDirectory(FileName); - } - - const char *cReplayControl::NowReplaying(void) ---- a/menu.h -+++ b/menu.h -@@ -292,6 +292,7 @@ - void ShowTimed(int Seconds = 0); - static cReplayControl *currentReplayControl; - static cString fileName; -+ static cString videoDir; - void ShowMode(void); - bool ShowProgress(bool Initial); - void MarkToggle(void); -@@ -309,7 +310,7 @@ - virtual void Show(void); - virtual void Hide(void); - bool Visible(void) { return visible; } -- static void SetRecording(const char *FileName); -+ static void SetRecording(const char *FileName, const char *VideoDir = NULL); - static const char *NowReplaying(void); - static const char *LastReplayed(void); - static void ClearLastReplayed(const char *FileName); ---- a/recording.c -+++ b/recording.c -@@ -731,6 +731,7 @@ - resume = RESUME_NOT_INITIALIZED; - titleBuffer = NULL; - sortBufferName = sortBufferTime = NULL; -+ videoDir = VideoDirectory; - fileName = NULL; - name = NULL; - fileSizeMB = -1; // unknown -@@ -783,7 +784,7 @@ - info->lifetime = lifetime; - } - --cRecording::cRecording(const char *FileName) -+cRecording::cRecording(const char *FileName, const char *VideoDir) - { - resume = RESUME_NOT_INITIALIZED; - fileSizeMB = -1; // unknown -@@ -798,11 +799,20 @@ - deleted = 0; - titleBuffer = NULL; - sortBufferName = sortBufferTime = NULL; -+ if (VideoDir == NULL) { -+ cString extraVideoDir = FindMatchingExtraVideoDirectory(FileName); -+ if (*extraVideoDir == NULL) -+ videoDir = VideoDirectory; -+ else -+ videoDir = strdup(*extraVideoDir); -+ } -+ else -+ videoDir = strdup(VideoDir); - FileName = fileName = strdup(FileName); - if (*(fileName + strlen(fileName) - 1) == '/') - *(fileName + strlen(fileName) - 1) = 0; -- if (strstr(FileName, VideoDirectory) == FileName) -- FileName += strlen(VideoDirectory) + 1; -+ if (strstr(FileName, videoDir) == FileName) -+ FileName += strlen(videoDir) + 1; - const char *p = strrchr(FileName, '/'); - - name = NULL; -@@ -909,6 +919,8 @@ - - cRecording::~cRecording() - { -+ if (videoDir != VideoDirectory) -+ free((char*)videoDir); - free(titleBuffer); - free(sortBufferName); - free(sortBufferTime); -@@ -950,7 +962,7 @@ - { - char **sb = (RecordingsSortMode == rsmName) ? &sortBufferName : &sortBufferTime; - if (!*sb) { -- char *s = strdup(FileName() + strlen(VideoDirectory)); -+ char *s = strdup(FileName() + strlen(videoDir)); - if (RecordingsSortMode != rsmName || Setup.AlwaysSortFoldersFirst) - s = StripEpisodeName(s, RecordingsSortMode != rsmName); - strreplace(s, '/', '0'); // some locales ignore '/' when sorting -@@ -991,11 +1003,11 @@ - const char *fmt = isPesRecording ? NAMEFORMATPES : NAMEFORMATTS; - int ch = isPesRecording ? priority : channel; - int ri = isPesRecording ? lifetime : instanceId; -- char *Name = LimitNameLengths(strdup(name), DirectoryPathMax - strlen(VideoDirectory) - 1 - 42, DirectoryNameMax); // 42 = length of an actual recording directory name (generated with DATAFORMATTS) plus some reserve -+ char *Name = LimitNameLengths(strdup(name), DirectoryPathMax - strlen(videoDir) - 1 - 42, DirectoryNameMax); // 42 = length of an actual recording directory name (generated with DATAFORMATTS) plus some reserve - if (strcmp(Name, name) != 0) - dsyslog("recording file name '%s' truncated to '%s'", name, Name); - Name = ExchangeChars(Name, true); -- fileName = strdup(cString::sprintf(fmt, VideoDirectory, Name, t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, ch, ri)); -+ fileName = strdup(cString::sprintf(fmt, videoDir, Name, t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, ch, ri)); - free(Name); - } - return fileName; -@@ -1273,9 +1285,14 @@ - ChangeState(); - Unlock(); - ScanVideoDir(VideoDirectory, Foreground); -+ if (LockExtraVideoDirectories()) { -+ for (int i = 0; i < ExtraVideoDirectories.Size(); i++) -+ ScanVideoDir(ExtraVideoDirectories.At(i), Foreground, 0, ExtraVideoDirectories.At(i)); -+ UnlockExtraVideoDirectories(); -+ } - } - --void cRecordings::ScanVideoDir(const char *DirName, bool Foreground, int LinkLevel) -+void cRecordings::ScanVideoDir(const char *DirName, bool Foreground, int LinkLevel, const char *BaseVideoDir) - { - cReadDir d(DirName); - struct dirent *e; -@@ -1295,7 +1312,7 @@ - } - if (S_ISDIR(st.st_mode)) { - if (endswith(buffer, deleted ? DELEXT : RECEXT)) { -- cRecording *r = new cRecording(buffer); -+ cRecording *r = new cRecording(buffer, BaseVideoDir); - if (r->Name()) { - r->NumFrames(); // initializes the numFrames member - r->FileSizeMB(); // initializes the fileSizeMB member -@@ -1310,7 +1327,7 @@ - delete r; - } - else -- ScanVideoDir(buffer, Foreground, LinkLevel + Link); -+ ScanVideoDir(buffer, Foreground, LinkLevel + Link, BaseVideoDir); - } - } - } ---- a/recording.h -+++ b/recording.h -@@ -106,9 +106,10 @@ - int priority; - int lifetime; - time_t deleted; -+ const char *videoDir; - public: - cRecording(cTimer *Timer, const cEvent *Event); -- cRecording(const char *FileName); -+ cRecording(const char *FileName, const char *VideoDir = NULL); - virtual ~cRecording(); - time_t Start(void) const { return start; } - int Priority(void) const { return priority; } -@@ -117,6 +118,7 @@ - virtual int Compare(const cListObject &ListObject) const; - const char *Name(void) const { return name; } - const char *FileName(void) const; -+ const char *VideoDir(void) const { return videoDir; } - const char *Title(char Delimiter = ' ', bool NewIndicator = false, int Level = -1) const; - const cRecordingInfo *Info(void) const { return info; } - const char *PrefixFileName(char Prefix); -@@ -166,7 +168,7 @@ - int state; - const char *UpdateFileName(void); - void Refresh(bool Foreground = false); -- void ScanVideoDir(const char *DirName, bool Foreground = false, int LinkLevel = 0); -+ void ScanVideoDir(const char *DirName, bool Foreground = false, int LinkLevel = 0, const char *BaseVideoDir = NULL); - protected: - void Action(void); - public: ---- a/svdrp.c -+++ b/svdrp.c -@@ -334,6 +334,14 @@ - " be turned up or down, respectively. The option 'mute' will toggle the\n" - " audio muting. If no option is given, the current audio volume level will\n" - " be returned.", -+ "AXVD directory\n" -+ " add directory to extra video directory list", -+ "CXVD\n" -+ " clear extra video directory list", -+ "DXVD directory\n" -+ " delete directory from extra video directory list", -+ "LXVD\n" -+ " list extra video directories", - "QUIT\n" - " Exit vdr (SVDRP).\n" - " You can also hit Ctrl-D to exit.", -@@ -1472,7 +1480,7 @@ - else - resume.Save(pos); - } -- cReplayControl::SetRecording(recording->FileName()); -+ cReplayControl::SetRecording(recording->FileName(), recording->VideoDir()); - cControl::Launch(new cReplayControl); - cControl::Attach(); - Reply(250, "Playing recording \"%s\" [%s]", num, recording->Title()); -@@ -1683,6 +1691,62 @@ - Reply(250, "Audio volume is %d", cDevice::CurrentVolume()); - } - -+void cSVDRP::CmdAXVD(const char *Option) -+{ -+ if (*Option) { -+ if (!LockExtraVideoDirectories(false)) { -+ Reply(550, "Unable to lock extra video directory list"); -+ return; -+ } -+ AddExtraVideoDirectory(Option); -+ UnlockExtraVideoDirectories(); -+ Reply(250, "added '%s' to extra video directory list", Option); -+ return; -+ } -+ Reply(501, "Missing directory name"); -+} -+ -+void cSVDRP::CmdCXVD(const char *Option) -+{ -+ if (!LockExtraVideoDirectories(false)) { -+ Reply(550, "Unable to lock extra video directory list"); -+ return; -+ } -+ ExtraVideoDirectories.Clear(); -+ UnlockExtraVideoDirectories(); -+ Reply(250, "cleared extra video directory list"); -+} -+ -+void cSVDRP::CmdDXVD(const char *Option) -+{ -+ if (*Option) { -+ if (!LockExtraVideoDirectories(false)) { -+ Reply(550, "Unable to lock extra video directory list"); -+ return; -+ } -+ DelExtraVideoDirectory(Option); -+ UnlockExtraVideoDirectories(); -+ Reply(250, "removed '%s' from extra video directory list", Option); -+ return; -+ } -+ Reply(501, "Missing directory name"); -+} -+ -+void cSVDRP::CmdLXVD(const char *Option) -+{ -+ if (!LockExtraVideoDirectories(false)) { -+ Reply(550, "Unable to lock extra video directory list"); -+ return; -+ } -+ if (ExtraVideoDirectories.Size() == 0) -+ Reply(550, "no extra video directories in list"); -+ else { -+ for (int i = 0; i < ExtraVideoDirectories.Size(); i++) -+ Reply(i < ExtraVideoDirectories.Size() - 1 ? -250 : 250, "%s", ExtraVideoDirectories.At(i)); -+ } -+ UnlockExtraVideoDirectories(); -+} -+ - #define CMD(c) (strcasecmp(Cmd, c) == 0) - - void cSVDRP::Execute(char *Cmd) -@@ -1736,6 +1800,10 @@ - else if (CMD("UPDR")) CmdUPDR(s); - else if (CMD("UPDT")) CmdUPDT(s); - else if (CMD("VOLU")) CmdVOLU(s); -+ else if (CMD("AXVD")) CmdAXVD(s); -+ else if (CMD("CXVD")) CmdCXVD(s); -+ else if (CMD("DXVD")) CmdDXVD(s); -+ else if (CMD("LXVD")) CmdLXVD(s); - else if (CMD("QUIT")) Close(true); - else Reply(500, "Command unrecognized: \"%s\"", Cmd); - } ---- a/svdrp.h -+++ b/svdrp.h -@@ -85,6 +85,10 @@ - void CmdUPDT(const char *Option); - void CmdUPDR(const char *Option); - void CmdVOLU(const char *Option); -+ void CmdAXVD(const char *Option); -+ void CmdCXVD(const char *Option); -+ void CmdDXVD(const char *Option); -+ void CmdLXVD(const char *Option); - void Execute(char *Cmd); - public: - cSVDRP(int Port); ---- a/tools.c -+++ b/tools.c -@@ -375,12 +375,15 @@ - return Free; - } - --bool DirectoryOk(const char *DirName, bool LogErrors) -+bool DirectoryOk(const char *DirName, bool LogErrors, bool JustReadOnly) - { -+ int mode = R_OK; -+ if (!JustReadOnly) -+ mode |= W_OK | X_OK; - struct stat ds; - if (stat(DirName, &ds) == 0) { - if (S_ISDIR(ds.st_mode)) { -- if (access(DirName, R_OK | W_OK | X_OK) == 0) -+ if (access(DirName, mode) == 0) - return true; - else if (LogErrors) - esyslog("ERROR: can't access %s", DirName); ---- a/tools.h -+++ b/tools.h -@@ -228,7 +228,7 @@ - cString AddDirectory(const char *DirName, const char *FileName); - bool EntriesOnSameFileSystem(const char *File1, const char *File2); - int FreeDiskSpaceMB(const char *Directory, int *UsedMB = NULL); --bool DirectoryOk(const char *DirName, bool LogErrors = false); -+bool DirectoryOk(const char *DirName, bool LogErrors = false, bool JustReadOnly = false); - bool MakeDirs(const char *FileName, bool IsDirectory = false); - bool RemoveFileOrDir(const char *FileName, bool FollowSymlinks = false); - bool RemoveEmptyDirectories(const char *DirName, bool RemoveThis = false, const char *IgnoreFiles[] = NULL); ---- a/vdr.c -+++ b/vdr.c -@@ -200,6 +200,7 @@ - int SVDRPport = DEFAULTSVDRPPORT; - const char *AudioCommand = NULL; - const char *VideoDirectory = DEFAULTVIDEODIR; -+ const char *ExtraVideoDirectory = NULL; - const char *ConfigDirectory = NULL; - const char *CacheDirectory = NULL; - const char *ResourceDirectory = NULL; -@@ -262,6 +263,7 @@ - { "version", no_argument, NULL, 'V' }, - { "vfat", no_argument, NULL, 'v' | 0x100 }, - { "video", required_argument, NULL, 'v' }, -+ { "extravideo", required_argument, NULL, 'v' | 0x200 }, - { "watchdog", required_argument, NULL, 'w' }, - { NULL, no_argument, NULL, 0 } - }; -@@ -453,6 +455,12 @@ - while (optarg && *optarg && optarg[strlen(optarg) - 1] == '/') - optarg[strlen(optarg) - 1] = 0; - break; -+ case 'v' | 0x200: -+ ExtraVideoDirectory = optarg; -+ while (optarg && *optarg && optarg[strlen(optarg) - 1] == '/') -+ optarg[strlen(optarg) - 1] = 0; -+ AddExtraVideoDirectory(ExtraVideoDirectory); -+ break; - case 'w': if (isnumber(optarg)) { - int t = atoi(optarg); - if (t >= 0) { -@@ -550,6 +558,8 @@ - " root\n" - " --userdump allow coredumps if -u is given (debugging)\n" - " -v DIR, --video=DIR use DIR as video directory (default: %s)\n" -+ " --extravideo=DIR use DIR as an additional readonly video directory\n" -+ " can be used multiple times\n" - " -V, --version print version information and exit\n" - " --vfat for backwards compatibility (same as\n" - " --dirnames=250,40,1\n" ---- a/videodir.c -+++ b/videodir.c -@@ -19,6 +19,65 @@ - #include "recording.h" - #include "tools.h" - -+cStringList ExtraVideoDirectories; -+bool ExtraVideoDirectoriesIsLocked = false; -+cMutex ExtraVideoDirectoriesMutex; -+ -+bool LockExtraVideoDirectories(bool Wait) -+{ -+ if (!Wait && ExtraVideoDirectoriesIsLocked) -+ return false; -+ ExtraVideoDirectoriesMutex.Lock(); -+ ExtraVideoDirectoriesIsLocked = true; -+ return true; -+} -+ -+void UnlockExtraVideoDirectories(void) -+{ -+ ExtraVideoDirectoriesIsLocked = false; -+ ExtraVideoDirectoriesMutex.Unlock(); -+} -+ -+void AddExtraVideoDirectory(const char *Directory) -+{ -+ if ((Directory != NULL) && (ExtraVideoDirectories.Find(Directory) < 0)) -+ ExtraVideoDirectories.Append(strdup(Directory)); -+} -+ -+void DelExtraVideoDirectory(const char *Directory) -+{ -+ if (Directory != NULL) { -+ int index = ExtraVideoDirectories.Find(Directory); -+ if (index < 0) -+ return; -+ char *dir = ExtraVideoDirectories.At(index); -+ ExtraVideoDirectories.Remove(index); -+ free(dir); -+ } -+} -+ -+cString FindMatchingExtraVideoDirectory(const char *FileName) -+{ -+ if (FileName == NULL) -+ return cString(NULL); -+ uint fileLen = strlen(FileName); -+ if ((strlen(VideoDirectory) < fileLen) && startswith(FileName, VideoDirectory)) -+ return cString(NULL); -+ if (!LockExtraVideoDirectories()) -+ return cString(NULL); -+ int i = 0; -+ cString videoDir(NULL); -+ while (i < ExtraVideoDirectories.Size()) { -+ if ((strlen(ExtraVideoDirectories.At(i)) < fileLen) && startswith(FileName, ExtraVideoDirectories.At(i))) { -+ videoDir = ExtraVideoDirectories.At(i); -+ break; -+ } -+ i++; -+ } -+ UnlockExtraVideoDirectories(); -+ return videoDir; -+} -+ - const char *VideoDirectory = VIDEODIR; - - void SetVideoDirectory(const char *Directory) -@@ -28,13 +87,13 @@ - - class cVideoDirectory { - private: -- char *name, *stored, *adjusted; -+ char *videoDir, *name, *stored, *adjusted; - int length, number, digits; - public: -- cVideoDirectory(void); -+ cVideoDirectory(const char *VideoDir = NULL); - ~cVideoDirectory(); - int FreeMB(int *UsedMB = NULL); -- const char *Name(void) { return name ? name : VideoDirectory; } -+ const char *Name(void) { return name ? name : videoDir; } - const char *Stored(void) { return stored; } - int Length(void) { return length; } - bool IsDistributed(void) { return name != NULL; } -@@ -43,10 +102,14 @@ - const char *Adjust(const char *FileName); - }; - --cVideoDirectory::cVideoDirectory(void) -+cVideoDirectory::cVideoDirectory(const char *VideoDir) - { -- length = strlen(VideoDirectory); -- name = (VideoDirectory[length - 1] == '0') ? strdup(VideoDirectory) : NULL; -+ if (VideoDir == NULL) -+ videoDir = strdup(VideoDirectory); -+ else -+ videoDir = strdup(VideoDir); -+ length = strlen(videoDir); -+ name = (videoDir[length - 1] == '0') ? strdup(videoDir) : NULL; - stored = adjusted = NULL; - number = -1; - digits = 0; -@@ -54,6 +117,7 @@ - - cVideoDirectory::~cVideoDirectory() - { -+ free(videoDir); - free(name); - free(stored); - free(adjusted); -@@ -61,7 +125,7 @@ - - int cVideoDirectory::FreeMB(int *UsedMB) - { -- return FreeDiskSpaceMB(name ? name : VideoDirectory, UsedMB); -+ return FreeDiskSpaceMB(name ? name : videoDir, UsedMB); - } - - bool cVideoDirectory::Next(void) -@@ -113,14 +177,18 @@ - const char *ActualFileName = FileName; - - // Incoming name must be in base video directory: -+ cString extraVideoDir; - if (strstr(FileName, VideoDirectory) != FileName) { -- esyslog("ERROR: %s not in %s", FileName, VideoDirectory); -- errno = ENOENT; // must set 'errno' - any ideas for a better value? -- return NULL; -+ extraVideoDir = FindMatchingExtraVideoDirectory(FileName); -+ if (*extraVideoDir == NULL) { -+ esyslog("ERROR: %s not in %s", FileName, VideoDirectory); -+ errno = ENOENT; // must set 'errno' - any ideas for a better value? -+ return NULL; -+ } - } - // Are we going to create a new file? - if ((Flags & O_CREAT) != 0) { -- cVideoDirectory Dir; -+ cVideoDirectory Dir(*extraVideoDir); - if (Dir.IsDistributed()) { - // Find the directory with the most free space: - int MaxFree = Dir.FreeMB(); ---- a/videodir.h -+++ b/videodir.h -@@ -13,6 +13,16 @@ - #include <stdlib.h> - #include "tools.h" - -+#define EXTRA_VIDEO_DIRECTORIES_PATCH 1 -+ -+extern cStringList ExtraVideoDirectories; -+ -+bool LockExtraVideoDirectories(bool Wait = true); -+void UnlockExtraVideoDirectories(void); -+void AddExtraVideoDirectory(const char *Directory); -+void DelExtraVideoDirectory(const char *Directory); -+cString FindMatchingExtraVideoDirectory(const char *FileName); -+ - extern const char *VideoDirectory; - - void SetVideoDirectory(const char *Directory); diff -Nru vdr-2.1.6/debian/patches/xprmtl-03_hide-first-recording-level-v3.patch vdr-2.1.6-297~3e4e445/debian/patches/xprmtl-03_hide-first-recording-level-v3.patch --- vdr-2.1.6/debian/patches/xprmtl-03_hide-first-recording-level-v3.patch 2014-04-15 17:42:03.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/xprmtl-03_hide-first-recording-level-v3.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,160 +0,0 @@ -Description: Hide the first level of directories - in the recordings menu, all recordings are stored at - the "local" directory -Origin: www.vdr-portal.de/board17-developer/board97-vdr-core/p1177898-/#post1177898 -Forwarded: no -Author: Lars Hanisch <dvb@flensrocker.de> - ---- a/recording.c -+++ b/recording.c -@@ -44,9 +44,9 @@ - #define NAMEFORMAT "%s/%s/" DATAFORMAT - */ - #define DATAFORMATPES "%4d-%02d-%02d.%02d%*c%02d.%02d.%02d" RECEXT --#define NAMEFORMATPES "%s/%s/" "%4d-%02d-%02d.%02d.%02d.%02d.%02d" RECEXT -+#define NAMEFORMATPES "%s/%s%s/" "%4d-%02d-%02d.%02d.%02d.%02d.%02d" RECEXT - #define DATAFORMATTS "%4d-%02d-%02d.%02d.%02d.%d-%d" RECEXT --#define NAMEFORMATTS "%s/%s/" DATAFORMATTS -+#define NAMEFORMATTS "%s/%s%s/" DATAFORMATTS - - #define RESUMEFILESUFFIX "/resume%s%s" - #ifdef SUMMARYFALLBACK -@@ -752,6 +752,9 @@ - sortBufferName = sortBufferTime = NULL; - fileName = NULL; - name = NULL; -+ firstLevelFolderIfHidden = ""; -+ if (cVideoDirectory::HideFirstRecordingLevel()) -+ firstLevelFolderIfHidden = "local/"; - fileSizeMB = -1; // unknown - channel = Timer->Channel()->Number(); - instanceId = InstanceId; -@@ -823,6 +826,7 @@ - if (strstr(FileName, cVideoDirectory::Name()) == FileName) - FileName += strlen(cVideoDirectory::Name()) + 1; - const char *p = strrchr(FileName, '/'); -+ firstLevelFolderIfHidden = ""; - - name = NULL; - info = new cRecordingInfo(fileName); -@@ -837,9 +841,18 @@ - t.tm_mon--; - t.tm_sec = 0; - start = mktime(&t); -- name = MALLOC(char, p - FileName + 1); -- strncpy(name, FileName, p - FileName); -- name[p - FileName] = 0; -+ const char *copyFileName = FileName; -+ if (cVideoDirectory::HideFirstRecordingLevel()) { -+ const char *f = strchr(FileName, '/'); -+ if ((f != NULL) && (f < p)) { -+ copyFileName = f + 1; -+ firstLevelFolderIfHidden = FileName; -+ firstLevelFolderIfHidden.Truncate(f - FileName + 1); -+ } -+ } -+ name = MALLOC(char, p - copyFileName + 1); -+ strncpy(name, copyFileName, p - copyFileName); -+ name[p - copyFileName] = 0; - name = ExchangeChars(name, false); - isPesRecording = instanceId < 0; - } -@@ -976,7 +989,7 @@ - *sb = strdup(buf); - } - else { -- char *s = strdup(FileName() + strlen(cVideoDirectory::Name())); -+ char *s = strdup(FileName() + strlen(cVideoDirectory::Name()) + strlen(*firstLevelFolderIfHidden)); - if (RecordingsSortMode != rsmName || Setup.AlwaysSortFoldersFirst) - s = StripEpisodeName(s, RecordingsSortMode != rsmName); - strreplace(s, '/', '0'); // some locales ignore '/' when sorting -@@ -1045,7 +1058,7 @@ - if (strcmp(Name, name) != 0) - dsyslog("recording file name '%s' truncated to '%s'", name, Name); - Name = ExchangeChars(Name, true); -- fileName = strdup(cString::sprintf(fmt, cVideoDirectory::Name(), Name, t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, ch, ri)); -+ fileName = strdup(cString::sprintf(fmt, cVideoDirectory::Name(), *firstLevelFolderIfHidden, Name, t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, ch, ri)); - free(Name); - } - return fileName; ---- a/recording.h -+++ b/recording.h -@@ -105,6 +105,7 @@ - mutable char *sortBufferTime; - mutable char *fileName; - mutable char *name; -+ cString firstLevelFolderIfHidden; - mutable int fileSizeMB; - mutable int numFrames; - int channel; ---- a/vdr.c -+++ b/vdr.c -@@ -244,6 +244,7 @@ - { "genindex", required_argument, NULL, 'g' | 0x100 }, - { "grab", required_argument, NULL, 'g' }, - { "help", no_argument, NULL, 'h' }, -+ { "hide-first-recording-level", no_argument, NULL, 'H' }, - { "instance", required_argument, NULL, 'i' }, - { "lib", required_argument, NULL, 'L' }, - { "lirc", optional_argument, NULL, 'l' | 0x100 }, -@@ -268,7 +269,7 @@ - }; - - int c; -- while ((c = getopt_long(argc, argv, "a:c:dD:e:E:g:hi:l:L:mp:P:r:s:t:u:v:Vw:", long_options, NULL)) != -1) { -+ while ((c = getopt_long(argc, argv, "a:c:dD:e:E:g:hHi:l:L:mp:P:r:s:t:u:v:Vw:", long_options, NULL)) != -1) { - switch (c) { - case 'a': AudioCommand = optarg; - break; -@@ -353,6 +354,8 @@ - break; - case 'h': DisplayHelp = true; - break; -+ case 'H': cVideoDirectory::SetHideFirstRecordingLevel(true); -+ break; - case 'i': if (isnumber(optarg)) { - InstanceId = atoi(optarg); - if (InstanceId >= 0) -@@ -518,6 +521,13 @@ - " existing directory, without any \"..\", double '/'\n" - " or symlinks (default: none, same as -g-)\n" - " -h, --help print this help and exit\n" -+ " -H, --hide-first-recording-level\n" -+ " The first level directories in the video directory\n" -+ " will be ignored in the recordings menu.\n" -+ " All recordings will be placed in the directory 'local'.\n" -+ " You can mount/link other video directories inside the\n" -+ " video directory to display their contents side by side\n" -+ " with your local video directory\n" - " -i ID, --instance=ID use ID as the id of this VDR instance (default: 0)\n" - " -l LEVEL, --log=LEVEL set log level (default: 3)\n" - " 0 = no logging, 1 = errors only,\n" ---- a/videodir.c -+++ b/videodir.c -@@ -20,6 +20,7 @@ - #include "tools.h" - - cString cVideoDirectory::name; -+bool cVideoDirectory::hide_first_recording_level = false; - cVideoDirectory *cVideoDirectory::current = NULL; - - cVideoDirectory::cVideoDirectory(void) ---- a/videodir.h -+++ b/videodir.h -@@ -16,6 +16,7 @@ - class cVideoDirectory { - private: - static cString name; -+ static bool hide_first_recording_level; - static cVideoDirectory *current; - static cVideoDirectory *Current(void); - public: -@@ -81,6 +82,8 @@ - static cString PrefixVideoFileName(const char *FileName, char Prefix); - static void RemoveEmptyVideoDirectories(const char *IgnoreFiles[] = NULL); - static bool IsOnVideoDirectoryFileSystem(const char *FileName); -+ static void SetHideFirstRecordingLevel(bool Hide) { hide_first_recording_level = Hide; }; -+ static bool HideFirstRecordingLevel(void) { return hide_first_recording_level; }; - }; - - class cVideoDiskUsage { diff -Nru vdr-2.1.6/debian/patches/xprmtl-04_loglevel.patch vdr-2.1.6-297~3e4e445/debian/patches/xprmtl-04_loglevel.patch --- vdr-2.1.6/debian/patches/xprmtl-04_loglevel.patch 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/xprmtl-04_loglevel.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -Description: set correct level on syslog messages -Origin: http://www.vdr-portal.de/board17-developer/board97-vdr-core/p1148688-/#post1148688 -Forwarded: no -Author: Lars Hanisch <dvb@flensrocker.de> - ---- a/tools.h -+++ b/tools.h -@@ -32,8 +32,8 @@ - extern int SysLogLevel; - - #define esyslog(a...) void( (SysLogLevel > 0) ? syslog_with_tid(LOG_ERR, a) : void() ) --#define isyslog(a...) void( (SysLogLevel > 1) ? syslog_with_tid(LOG_ERR, a) : void() ) --#define dsyslog(a...) void( (SysLogLevel > 2) ? syslog_with_tid(LOG_ERR, a) : void() ) -+#define isyslog(a...) void( (SysLogLevel > 1) ? syslog_with_tid(SysLogLevel > 3 ? LOG_ERR : LOG_INFO, a) : void() ) -+#define dsyslog(a...) void( (SysLogLevel > 2) ? syslog_with_tid(SysLogLevel > 3 ? LOG_ERR : LOG_DEBUG, a) : void() ) - - #define LOG_ERROR esyslog("ERROR (%s,%d): %m", __FILE__, __LINE__) - #define LOG_ERROR_STR(s) esyslog("ERROR (%s,%d): %s: %m", __FILE__, __LINE__, s) ---- a/vdr.c -+++ b/vdr.c -@@ -371,7 +371,7 @@ - *p = 0; - if (isnumber(optarg)) { - int l = atoi(optarg); -- if (0 <= l && l <= 3) { -+ if (0 <= l && l <= 4) { - SysLogLevel = l; - if (!p) - break; diff -Nru vdr-2.1.6/debian/patches/xprmtl-05_epghandler-segment-transfer.patch vdr-2.1.6-297~3e4e445/debian/patches/xprmtl-05_epghandler-segment-transfer.patch --- vdr-2.1.6/debian/patches/xprmtl-05_epghandler-segment-transfer.patch 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/xprmtl-05_epghandler-segment-transfer.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,68 +0,0 @@ -Description: patch for the epg2vdr plugin -Author: Jörg Wendel (horchi@vdr-portal) - ---- a/eit.c -+++ b/eit.c -@@ -46,6 +46,8 @@ - return; - } - -+ EpgHandlers.BeginSegmentTransfer(channel, OnlyRunningStatus); -+ - bool handledExternally = EpgHandlers.HandledExternally(channel); - cSchedule *pSchedule = (cSchedule *)Schedules->GetSchedule(channel, true); - -@@ -310,6 +312,7 @@ - Schedules->SetModified(pSchedule); - } - Channels.Unlock(); -+ EpgHandlers.EndSegmentTransfer(Modified, OnlyRunningStatus); - } - - // --- cTDT ------------------------------------------------------------------ ---- a/epg.c -+++ b/epg.c -@@ -1565,3 +1565,19 @@ - } - Schedule->DropOutdated(SegmentStart, SegmentEnd, TableID, Version); - } -+ -+void cEpgHandlers::BeginSegmentTransfer(const cChannel *Channel, bool OnlyRunningStatus) -+{ -+ for (cEpgHandler *eh = First(); eh; eh = Next(eh)) { -+ if (eh->BeginSegmentTransfer(Channel, OnlyRunningStatus)) -+ return; -+ } -+} -+ -+void cEpgHandlers::EndSegmentTransfer(bool Modified, bool OnlyRunningStatus) -+{ -+ for (cEpgHandler *eh = First(); eh; eh = Next(eh)) { -+ if (eh->EndSegmentTransfer(Modified, OnlyRunningStatus)) -+ return; -+ } -+} ---- a/epg.h -+++ b/epg.h -@@ -286,6 +286,12 @@ - virtual bool DropOutdated(cSchedule *Schedule, time_t SegmentStart, time_t SegmentEnd, uchar TableID, uchar Version) { return false; } - ///< Takes a look at all EPG events between SegmentStart and SegmentEnd and - ///< drops outdated events. -+ virtual bool BeginSegmentTransfer(const cChannel *Channel, bool OnlyRunningStatus) { return false; } -+ ///< called directly after IgnoreChannel before any other handler method called -+ ///< designed to give handlers the ossibility to prepare a transaction -+ virtual bool EndSegmentTransfer(bool Modified, bool OnlyRunningStatus) { return false; } -+ ///< called at last after the segment data is processed -+ ///< at this oint handlers should close/commt/rollback their transactions - }; - - class cEpgHandlers : public cList<cEpgHandler> { -@@ -308,6 +314,8 @@ - void HandleEvent(cEvent *Event); - void SortSchedule(cSchedule *Schedule); - void DropOutdated(cSchedule *Schedule, time_t SegmentStart, time_t SegmentEnd, uchar TableID, uchar Version); -+ void BeginSegmentTransfer(const cChannel *Channel, bool OnlyRunningStatus); -+ void EndSegmentTransfer(bool Modified, bool OnlyRunningStatus); - }; - - extern cEpgHandlers EpgHandlers; diff -Nru vdr-2.1.6/debian/patches/xprmtl-06_lirc-reconnect.patch vdr-2.1.6-297~3e4e445/debian/patches/xprmtl-06_lirc-reconnect.patch --- vdr-2.1.6/debian/patches/xprmtl-06_lirc-reconnect.patch 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patches/xprmtl-06_lirc-reconnect.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -Description: try to reconnect to lirc socket even if it's not present at startup -Origin: http://www.vdr-portal.de/board16-video-disk-recorder/board4-vdr-installation/120551-inputlirc-startet-zu-fr%C3%BCh-upstart/ -Forwarded: no -Author: Lars Hanisch <dvb@flensrocker.de> - ---- a/lirc.c -+++ b/lirc.c -@@ -21,11 +21,9 @@ - { - addr.sun_family = AF_UNIX; - strcpy(addr.sun_path, DeviceName); -- if (Connect()) { -- Start(); -- return; -- } -- f = -1; -+ if (!Connect()) -+ f = -1; -+ Start(); - } - - cLircRemote::~cLircRemote() -@@ -67,14 +65,15 @@ - bool repeat = false; - int timeout = -1; - -- while (Running() && f >= 0) { -+ while (Running()) { - -- bool ready = cFile::FileReady(f, timeout); -+ bool ready = f >= 0 ? cFile::FileReady(f, timeout) : false; - int ret = ready ? safe_read(f, buf, sizeof(buf)) : -1; - -- if (ready && ret <= 0 ) { -+ if ((f < 0) || (ready && ret <= 0)) { - esyslog("ERROR: lircd connection broken, trying to reconnect every %.1f seconds", float(RECONNECTDELAY) / 1000); -- close(f); -+ if (f >= 0) -+ close(f); - f = -1; - while (Running() && f < 0) { - cCondWait::SleepMs(RECONNECTDELAY); diff -Nru vdr-2.1.6/debian/patchinfo vdr-2.1.6-297~3e4e445/debian/patchinfo --- vdr-2.1.6/debian/patchinfo 2014-04-22 19:22:39.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/patchinfo 1970-01-01 00:00:00.000000000 +0000 @@ -1,92 +0,0 @@ -Patches applied to vanilla vdr sources --------------------------------------- - -04_newplugin.patch - Thomas Schmidt <tschmidt@debian.org> - - Patch for the newplugin-script, to not require a normal vdr-source-dir - -06_default_svdrp_port_0.patch - Thomas Schmidt <tschmidt@debian.org> - - This sets the default svdrp-port to 0, which means that SVDRP is disabled by - default unless someone specifies another port with the --port option when - starting vdr - -81_Make_config.patch - Tobias Grimm <vdr@e-tobi.net> - - Add Make.config to compile debug versions. - -99_ncursesw-include.patch - Tobias Grimm <tg@e-tobi.net> - - Use ncursesw header file - -opt-24_jumpplay.patch - Torsten Kunkel <vdr@tkunkel.de>, Thomas Günther <tom@toms-cafe.de> - - Play after jump to next mark. Automatically jump over commercial breaks. See - README.jumpplay and MANUAL for details. 2011-03-19: Remove marks reloading - for VDR-1.7.17, by Udo Richter <udo_richter@gmx.de> - -opt-37-x_menuorg.patch - Tobias Grimm <tg@e-tobi.net> - - This patch is required by the MenuOrg plugin. It adds a service interface, - that can be implemented by plugins to reorganize VDR's main menu entries - with the ability to create custom sub menus. This is version 0.5.s of the - patch - -opt-42-x_MainMenuHooks-v1.0.1.patch - Frank Schmirler <vdrdev@schmirler.de> - - This patch allows plugins to replace the VDR mainmenus "Schedule", - "Channels", "Timers" and "Recordings" by a different implementation. - -opt-50_graphtft.patch - Jrg Wendel (Horchi) - - Patch required for the GraphTFT plugin. - -opt-56_eventdetails_v3.patch - Michael Eiler <eiler.mike@gmail.com> - - Patch for vdr-plugin-restfulapi - -opt-57_vdr-remote_instant_recordings.patch - Frank Schmirler <vdrdev@schmirler.de> - - Patch for vdr-plugin-remotetimers - -opt-61_dynamite.patch - Lars Hanisch <dvb@flensrocker.de> - - Patch for VDR to support hotpluggable devices via the dynamite plugin. - -opt-65_pin.patch - Jörg Wendel (horchi@vdr-portal) - - patch for the pin plugin - -opt-66_jumpingseconds.patch - ? - - ? - -xprmtl-02_permashift-0.5.4.patch - Eike Sauer <eike@ein-eike.de> - - patch for permashift plugin - -xprmtl-03_hide-first-recording-level-v3.patch - Lars Hanisch <dvb@flensrocker.de> - - Hide the first level of directories in the recordings menu, all recordings - are stored at the "local" directory - -vdr-2.1.6-conf.d-v6.diff - Lars Hanisch <dvb@flensrocker.de> - - Patch for VDR to support reading its arguments from files. - diff -Nru vdr-2.1.6/debian/plugin-loader2.cpp vdr-2.1.6-297~3e4e445/debian/plugin-loader2.cpp --- vdr-2.1.6/debian/plugin-loader2.cpp 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/plugin-loader2.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,249 +0,0 @@ -#include <dirent.h> -#include <getopt.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <unistd.h> - -#include <algorithm> -#include <cctype> -#include <fstream> -#include <functional> -#include <iostream> -#include <locale> -#include <vector> - -using namespace std; - -// trim from start -static inline string <rim(string &s) -{ - s.erase(s.begin(), find_if(s.begin(), s.end(), not1(ptr_fun<int, int>(isspace)))); - return s; -} - -// trim from end -static inline string &rtrim(string &s) -{ - s.erase(find_if(s.rbegin(), s.rend(), not1(ptr_fun<int, int>(isspace))).base(), s.end()); - return s; -} - -// trim from both ends -static inline string &trim(string &s) -{ - return ltrim(rtrim(s)); -} - -static int IndexOf(const vector<string> &list, const string &entry) -{ - int index = 0; - for (vector<string>::const_iterator it = list.begin(); it != list.end(); ++it) { - if (*it == entry) - return index; - ++index; - } - return -1; -} - -// read file line by line, drop empty lines and everything after # -static vector<string> &ReadFile(vector<string> &list, const string &filename) -{ - string line; - size_t pos; - list.clear(); - try - { - ifstream file(filename.c_str(), ifstream::in); - while (file.peek() != EOF) { - getline(file, line); - line = trim(line); - pos = line.find("#"); - if (pos != string::npos) - line = line.substr(0, pos); - if (!line.empty()) - list.push_back(line); - } - file.close(); - } - catch (...) - { - } - return list; -} - -static void ReadOrderConf(vector<string> &top, vector<string> &bottom, vector<string> &disabled, const string &filename) -{ - vector<string> lines; - top.clear(); - bottom.clear(); - disabled.clear(); - ReadFile(lines, filename); - bool in_top = true; - for (vector<string>::iterator it = lines.begin(); it != lines.end(); ++it) { - if ((*it).substr(0, 1) == "*") { - if ((*it).length() == 1) // new order.conf syntax with an * spliting first and last plugins - in_top = false; - else // old yavdr order.conf syntax with an * in front of all last plugins - bottom.push_back((*it).substr( 1, (*it).length())); - } - else if ((*it).substr(0, 1) == "-") - disabled.push_back((*it).substr(1, string::npos)); - else if (in_top) - top.push_back(*it); - else - bottom.push_back(*it); - } -} - -static string &GetPluginParameters(string ¶meters, const string &plugin_cfg_dir, const string &plugin) -{ - vector<string> lines; - parameters.clear(); - ReadFile(lines, plugin_cfg_dir + "/plugin." + plugin + ".conf"); - for (vector<string>::iterator it = lines.begin(); it != lines.end(); ++it) - parameters += " " + *it; - if (parameters.empty()) - parameters = " -P " + plugin; - else - parameters = " -P \"" + plugin + parameters + "\""; - return parameters; -} - -static bool HasPluginParameter(const string &plugin_cfg_dir, const string &plugin, const string ¶meter_name) -{ - vector<string> lines; - ReadFile(lines, plugin_cfg_dir + "/plugin." + plugin + ".conf"); - for (vector<string>::iterator it = lines.begin(); it != lines.end(); ++it) { - if ((*it).find(parameter_name) != string::npos) - return true; - } - return false; -} - -static vector<string> &GetInstalledPlugins(vector<string> &plugins, const string &plugin_dir, const string &vdr_apiversion, const vector<string> &disabled) -{ - plugins.clear(); - DIR *dir = opendir(plugin_dir.c_str()); - if (dir == NULL) - return plugins; - struct dirent *ent; - struct stat ds; - string name; - string plugin; - string praefix = "libvdr-"; - string ext = ".so." + vdr_apiversion; - while ((ent = readdir(dir)) != NULL) { - name = ent->d_name; - if (name.length() <= (praefix.length() + ext.length())) - if ((stat(name.c_str(), &ds) != 0) || !S_ISREG(ds.st_mode)) - continue; - if ((name.substr(0, praefix.length()) != praefix) || (name.substr(name.length() - ext.length(), ext.length()) != ext)) - continue; - plugin = name.substr(praefix.length(), name.length() - praefix.length() - ext.length()); - if (IndexOf(disabled, plugin) < 0) - plugins.push_back(plugin); - } - closedir(dir); - return plugins; -} - -int main(int argc, char *argv[]) -{ - // config - string vdr_apiversion; - string plugin_cfg_dir; - string plugin_dir; - string plugin; - string has_parameter; - - // read parameter from environment - const char *tmp = getenv("VDR_APIVERSION"); - if (tmp != NULL) - vdr_apiversion = tmp; - - plugin_cfg_dir = "/etc/vdr/plugins"; - tmp = getenv("PLUGIN_CFG_DIR"); - if (tmp != NULL) - plugin_cfg_dir = tmp; - - plugin_dir = "/usr/lib/vdr/plugins"; - tmp = getenv("PLUGIN_DIR"); - if (tmp != NULL) - plugin_dir = tmp; - - static struct option long_options[] = { - { "apiversion", required_argument, NULL, 'a' }, - { "confdir", required_argument, NULL, 'c' }, - { "libdir", required_argument, NULL, 'L' }, - { "plugin", required_argument, NULL, 'P' }, - { "has-parameter", required_argument, NULL, 'h' }, - { NULL, no_argument, NULL, 0 } - }; - - int c; - while ((c = getopt_long(argc, argv, "a:c:L:P:h:", long_options, NULL)) != -1) { - switch (c) { - case 'a': - vdr_apiversion = optarg; - break; - case 'c': - plugin_cfg_dir = optarg; - break; - case 'L': - plugin_dir = optarg; - break; - case 'P': - plugin = optarg; - break; - case 'h': - has_parameter = optarg; - break; - } - } - - if (!plugin.empty() && !has_parameter.empty()) { - if (HasPluginParameter(plugin_cfg_dir, plugin, has_parameter)) { - cout << "1"; - return 0; - } - return 1; - } - - if (vdr_apiversion.empty()) { - cerr << "missing VDR_APIVERSION" << endl; - return 1; - } - - vector<string> top; - vector<string> bottom; - vector<string> disabled; - ReadOrderConf(top, bottom, disabled, plugin_cfg_dir + "/order.conf"); - - vector<string> plugins; - GetInstalledPlugins(plugins, plugin_dir, vdr_apiversion, disabled); - string output_top; - string parameters; - for (vector<string>::iterator it = top.begin(); it != top.end(); ++it) { - int pos = IndexOf(plugins, *it); - if (pos >= 0) { - output_top += GetPluginParameters(parameters, plugin_cfg_dir, *it); - plugins.erase(plugins.begin() + pos); - } - } - - string output_bottom; - for (vector<string>::iterator it = bottom.begin(); it != bottom.end(); ++it) { - int pos = IndexOf(plugins, *it); - if (pos >= 0) { - output_bottom += GetPluginParameters(parameters, plugin_cfg_dir, *it); - plugins.erase(plugins.begin() + pos); - } - } - - string output_center; - for (vector<string>::iterator it = plugins.begin(); it != plugins.end(); ++it) - output_center += GetPluginParameters(parameters, plugin_cfg_dir, *it); - - cout << output_top << output_center << output_bottom; - return 0; -} diff -Nru vdr-2.1.6/debian/plugin-loader.sh vdr-2.1.6-297~3e4e445/debian/plugin-loader.sh --- vdr-2.1.6/debian/plugin-loader.sh 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/plugin-loader.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,132 +0,0 @@ -# -# This file is called by /etc/init.d/vdr -# - -mkdir -p /var/run/vdr -chown -R vdr:vdr /var/run/vdr - -getplugins () -{ - local plugin_order - local installed_plugins - local ordered_plugins - local last_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]}" -o "$plugin" = "-*${installed_plugins[$i]}" ]; then - unset installed_plugins[$i] - installed_plugins=( "${installed_plugins[@]}" ) - break - fi - if [ "$plugin" = "*${installed_plugins[$i]}" ]; then - last_plugins=( "${last_plugins[@]}" "${installed_plugins[$i]}" ) - 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 and last plugins to ordered plugins - ordered_plugins=( "${ordered_plugins[@]}" "${installed_plugins[@]}" "${last_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 -} diff -Nru vdr-2.1.6/debian/plugin-template/changelog vdr-2.1.6-297~3e4e445/debian/plugin-template/changelog --- vdr-2.1.6/debian/plugin-template/changelog 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/plugin-template/changelog 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -#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# - diff -Nru vdr-2.1.6/debian/plugin-template/compat vdr-2.1.6-297~3e4e445/debian/plugin-template/compat --- vdr-2.1.6/debian/plugin-template/compat 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/plugin-template/compat 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -8 diff -Nru vdr-2.1.6/debian/plugin-template/control vdr-2.1.6-297~3e4e445/debian/plugin-template/control --- vdr-2.1.6/debian/plugin-template/control 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/plugin-template/control 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -Source: #PACKAGE# -Section: video -Priority: extra -Maintainer: #USERNAME# <#EMAIL#> -Build-Depends: #BUILD_DEPS#, vdr-dev (>= #VDRVERSION#), gettext -Standards-Version: #POLICY# -Vcs-Svn: svn://svn.debian.org/pkg-vdr-dvb/vdr/#PACKAGE#/trunk/ -Vcs-Browser: http://svn.debian.org/wsvn/pkg-vdr-dvb/vdr/#PACKAGE#/trunk/ -Homepage: <url://example.com> - -Package: #PACKAGE# -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends}, ${vdr:Depends} -Description: <insert up to 60 chars description> - <insert long description, indented with spaces> diff -Nru vdr-2.1.6/debian/plugin-template/copyright vdr-2.1.6-297~3e4e445/debian/plugin-template/copyright --- vdr-2.1.6/debian/plugin-template/copyright 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/plugin-template/copyright 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -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. diff -Nru vdr-2.1.6/debian/plugin-template/init.d.ex vdr-2.1.6-297~3e4e445/debian/plugin-template/init.d.ex --- vdr-2.1.6/debian/plugin-template/init.d.ex 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/plugin-template/init.d.ex 1970-01-01 00:00:00.000000000 +0000 @@ -1,154 +0,0 @@ -#!/bin/sh -### BEGIN INIT INFO -# Provides: #PACKAGE# -# Required-Start: $network $local_fs -# Required-Stop: -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: <Enter a short description of the sortware> -# Description: <Enter a long description of the software> -# <...> -# <...> -### END INIT INFO - -# Author: #USERNAME# <#EMAIL#> - -# PATH should only include /usr/* if it runs after the mountnfs.sh script -PATH=/sbin:/usr/sbin:/bin:/usr/bin -DESC=#PACKAGE# # Introduce a short description here -NAME=#PACKAGE# # Introduce the short server's name here -DAEMON=/usr/sbin/#PACKAGE# # Introduce the server's location here -DAEMON_ARGS="" # Arguments to run the daemon with -PIDFILE=/var/run/$NAME.pid -SCRIPTNAME=/etc/init.d/$NAME - -# Exit if the package is not installed -[ -x $DAEMON ] || exit 0 - -# Read configuration variable file if it is present -[ -r /etc/default/$NAME ] && . /etc/default/$NAME - -# Load the VERBOSE setting and other rcS variables -. /lib/init/vars.sh - -# Define LSB log_* functions. -# Depend on lsb-base (>= 3.0-6) to ensure that this file is present. -. /lib/lsb/init-functions - -# -# Function that starts the daemon/service -# -do_start() -{ - # Return - # 0 if daemon has been started - # 1 if daemon was already running - # 2 if daemon could not be started - start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \ - || return 1 - start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \ - $DAEMON_ARGS \ - || return 2 - # Add code here, if necessary, that waits for the process to be ready - # to handle requests from services started subsequently which depend - # on this one. As a last resort, sleep for some time. -} - -# -# Function that stops the daemon/service -# -do_stop() -{ - # Return - # 0 if daemon has been stopped - # 1 if daemon was already stopped - # 2 if daemon could not be stopped - # other if a failure occurred - start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME - RETVAL="$?" - [ "$RETVAL" = 2 ] && return 2 - # Wait for children to finish too if this is a daemon that forks - # and if the daemon is only ever run from this initscript. - # If the above conditions are not satisfied then add some other code - # that waits for the process to drop all resources that could be - # needed by services started subsequently. A last resort is to - # sleep for some time. - start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON - [ "$?" = 2 ] && return 2 - # Many daemons don't delete their pidfiles when they exit. - rm -f $PIDFILE - return "$RETVAL" -} - -# -# Function that sends a SIGHUP to the daemon/service -# -do_reload() { - # - # If the daemon can reload its configuration without - # restarting (for example, when it is sent a SIGHUP), - # then implement that here. - # - start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME - return 0 -} - -case "$1" in - start) - [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC " "$NAME" - do_start - case "$?" in - 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; - 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; - esac - ;; - stop) - [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" - do_stop - case "$?" in - 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; - 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; - esac - ;; - status) - status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? - ;; - #reload|force-reload) - # - # If do_reload() is not implemented then leave this commented out - # and leave 'force-reload' as an alias for 'restart'. - # - #log_daemon_msg "Reloading $DESC" "$NAME" - #do_reload - #log_end_msg $? - #;; - restart|force-reload) - # - # If the "reload" option is implemented then remove the - # 'force-reload' alias - # - log_daemon_msg "Restarting $DESC" "$NAME" - do_stop - case "$?" in - 0|1) - do_start - case "$?" in - 0) log_end_msg 0 ;; - 1) log_end_msg 1 ;; # Old process is still running - *) log_end_msg 1 ;; # Failed to start - esac - ;; - *) - # Failed to stop - log_end_msg 1 - ;; - esac - ;; - *) - #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2 - echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2 - exit 3 - ;; -esac - -: diff -Nru vdr-2.1.6/debian/plugin-template/install vdr-2.1.6-297~3e4e445/debian/plugin-template/install --- vdr-2.1.6/debian/plugin-template/install 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/plugin-template/install 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -libvdr-#PLUGIN#.so.* usr/lib/vdr/plugins/ -locale usr/share/ diff -Nru vdr-2.1.6/debian/plugin-template/links.ex vdr-2.1.6-297~3e4e445/debian/plugin-template/links.ex --- vdr-2.1.6/debian/plugin-template/links.ex 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/plugin-template/links.ex 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -usr/share/#PACKAGE#/#PLUGIN# var/lib/vdr/plugins/#PLUGIN# diff -Nru vdr-2.1.6/debian/plugin-template/postinst.ex vdr-2.1.6-297~3e4e445/debian/plugin-template/postinst.ex --- vdr-2.1.6/debian/plugin-template/postinst.ex 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/plugin-template/postinst.ex 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -#!/bin/sh -# postinst script for #PACKAGE# -# -# see: dh_installdeb(1) - -set -e - -# summary of how this script can be called: -# * <postinst> `configure' <most-recently-configured-version> -# * <old-postinst> `abort-upgrade' <new version> -# * <conflictor's-postinst> `abort-remove' `in-favour' <package> -# <new-version> -# * <postinst> `abort-remove' -# * <deconfigured's-postinst> `abort-deconfigure' `in-favour' -# <failed-install-package> <version> `removing' -# <conflicting-package> <version> -# for details, see http://www.debian.org/doc/debian-policy/ or -# the debian-policy package - - -case "$1" in - configure) - ;; - - 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. - -#DEBHELPER# - -exit 0 diff -Nru vdr-2.1.6/debian/plugin-template/postrm.ex vdr-2.1.6-297~3e4e445/debian/plugin-template/postrm.ex --- vdr-2.1.6/debian/plugin-template/postrm.ex 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/plugin-template/postrm.ex 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ -#!/bin/sh -# postrm script for #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' <overwriter> -# <overwriter-version> -# for details, see http://www.debian.org/doc/debian-policy/ or -# the debian-policy package - - -case "$1" in - purge|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 diff -Nru vdr-2.1.6/debian/plugin-template/preinst.ex vdr-2.1.6-297~3e4e445/debian/plugin-template/preinst.ex --- vdr-2.1.6/debian/plugin-template/preinst.ex 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/plugin-template/preinst.ex 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ -#!/bin/sh -# preinst script for #PACKAGE# -# -# see: dh_installdeb(1) - -set -e - -# summary of how this script can be called: -# * <new-preinst> `install' -# * <new-preinst> `install' <old-version> -# * <new-preinst> `upgrade' <old-version> -# * <old-preinst> `abort-upgrade' <new-version> -# for details, see http://www.debian.org/doc/debian-policy/ or -# the debian-policy package - - -case "$1" in - install|upgrade) - ;; - - abort-upgrade) - ;; - - *) - echo "preinst 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 diff -Nru vdr-2.1.6/debian/plugin-template/prerm.ex vdr-2.1.6-297~3e4e445/debian/plugin-template/prerm.ex --- vdr-2.1.6/debian/plugin-template/prerm.ex 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/plugin-template/prerm.ex 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -#!/bin/sh -# prerm script for #PACKAGE# -# -# see: dh_installdeb(1) - -set -e - -# summary of how this script can be called: -# * <prerm> `remove' -# * <old-prerm> `upgrade' <new-version> -# * <new-prerm> `failed-upgrade' <old-version> -# * <conflictor's-prerm> `remove' `in-favour' <package> <new-version> -# * <deconfigured's-prerm> `deconfigure' `in-favour' -# <package-being-installed> <version> `removing' -# <conflicting-package> <version> -# for details, see http://www.debian.org/doc/debian-policy/ or -# the debian-policy package - - -case "$1" in - remove|upgrade|deconfigure) - ;; - - failed-upgrade) - ;; - - *) - echo "prerm 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 diff -Nru vdr-2.1.6/debian/plugin-template/README.Debian vdr-2.1.6-297~3e4e445/debian/plugin-template/README.Debian --- vdr-2.1.6/debian/plugin-template/README.Debian 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/plugin-template/README.Debian 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -#PACKAGE# for Debian -#DASHLINE# - -<possible notes regarding this package - if none, delete this file> - - -- #USERNAME# <#EMAIL#> #DATE# diff -Nru vdr-2.1.6/debian/plugin-template/README.source vdr-2.1.6-297~3e4e445/debian/plugin-template/README.source --- vdr-2.1.6/debian/plugin-template/README.source 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/plugin-template/README.source 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -#PACKAGE# for Debian -#DASHLINE# - -<this file describes information about the source package, see Debian policy -manual section 4.14. You WILL either need to modify or delete this file> - -#SOURCE_EXTRADOCS# - - diff -Nru vdr-2.1.6/debian/plugin-template/rules vdr-2.1.6-297~3e4e445/debian/plugin-template/rules --- vdr-2.1.6/debian/plugin-template/rules 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/plugin-template/rules 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -#!/usr/bin/make -f - -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 - -MAKE_OPTIONS = VDRDIR=/usr/include/vdr LIBDIR=. LOCALEDIR=locale - -%: - dh $@ - -override_dh_auto_build: - dh_auto_build -- all $(MAKE_OPTIONS) - -override_dh_auto_clean: - $(MAKE) -o .dependencies clean $(MAKE_OPTIONS) - rm -rf locale libvdr-*.so.* - -override_dh_gencontrol: - sh /usr/share/vdr-dev/dependencies.sh - dh_gencontrol diff -Nru vdr-2.1.6/debian/plugin-template/watch.ex vdr-2.1.6-297~3e4e445/debian/plugin-template/watch.ex --- vdr-2.1.6/debian/plugin-template/watch.ex 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/plugin-template/watch.ex 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -# Example watch control file for uscan -# Rename this file to "watch" and then you can run the "uscan" command -# to check for upstream updates and more. -# See uscan(1) for format - -# Compulsory line, this is a version 3 file -version=3 - -# Uncomment to examine a Webpage -# <Webpage URL> <string match> -#http://www.example.com/downloads.php #PACKAGE#-(.*)\.tar\.gz - -# Uncomment to examine a Webserver directory -#http://www.example.com/pub/#PACKAGE#-(.*)\.tar\.gz - -# Uncommment to examine a FTP server -#ftp://ftp.example.com/pub/#PACKAGE#-(.*)\.tar\.gz debian uupdate - -# Uncomment to find new files on sourceforge, for devscripts >= 2.9 -# http://sf.net/#PACKAGE#/#PACKAGE#-(.*)\.tar\.gz - -# Uncomment to find new files on GooglePages -# http://example.googlepages.com/foo.html #PACKAGE#-(.*)\.tar\.gz diff -Nru vdr-2.1.6/debian/po/cs.po vdr-2.1.6-297~3e4e445/debian/po/cs.po --- vdr-2.1.6/debian/po/cs.po 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/po/cs.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,78 +0,0 @@ -# -# 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: 2010-03-04 22:58+0100\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" -msgstr "Satelitn" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "Terrestrial" -msgstr "Pozemn" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "Cable" -msgstr "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 znt typ va DVB karty. Na zklad va odpovdi se do /var/lib/" -"vdr nainstaluje soubor channels.conf. Tento soubor mete pozdji upravit " -"dle svch poteb." - -#. Type: boolean -#. Description -#: ../vdr.templates:2001 -msgid "Create /var/lib/video.00?" -msgstr "Vytvoit /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 ukldn nahrvek do /var/lib/video.00. " -"Tento adres se nyn me vytvoit automaticky. Jeho umstn mete " -"pozdji upravit zmnou promnn VIDEO_DIR v souboru /etc/default/vdr." diff -Nru vdr-2.1.6/debian/po/da.po vdr-2.1.6-297~3e4e445/debian/po/da.po --- vdr-2.1.6/debian/po/da.po 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/po/da.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,71 +0,0 @@ -# Danish translation vdr. -# Copyright (C) 2010 vdr & nedenstående oversættere. -# This file is distributed under the same license as the vdr package. -# Joe Hansen (joedalton2@yahoo.dk), 2010. -# -msgid "" -msgstr "" -"Project-Id-Version: vdr\n" -"Report-Msgid-Bugs-To: vdr@packages.debian.org\n" -"POT-Creation-Date: 2010-03-04 22:58+0100\n" -"PO-Revision-Date: 2010-08-08 17:30+01:00\n" -"Last-Translator: Joe Hansen <joedalton2@yahoo.dk>\n" -"Language-Team: Danish <debian-l10n-danish@lists.debian.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" -msgstr "Satellit" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "Terrestrial" -msgstr "Terrestrisk" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "Cable" -msgstr "Kabel" - -#. Type: select -#. Description -#: ../vdr.templates:1002 -msgid "DVB card type:" -msgstr "DVB-korttype:" - -#. 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 skal kende din DVB-korttype for at fungere korrekt. Filen channels.conf " -"vil med dine valg blive installeret i /var/lib/vdr. Du skal måske ændre denne " -"fil afhængig af din opsætning." - -#. Type: boolean -#. Description -#: ../vdr.templates:2001 -msgid "Create /var/lib/video.00?" -msgstr "Opret /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 er VDR konfigureret til at bruge /var/lib/video.00 til at gemme " -"optagelser. Du kan enten oprette denne mappe nu, eller ændre denne opførsel " -"senere ved at ændre variablen VIDEO_DIR i /etc/default/vdr." - diff -Nru vdr-2.1.6/debian/po/de.po vdr-2.1.6-297~3e4e445/debian/po/de.po --- vdr-2.1.6/debian/po/de.po 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/po/de.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,82 +0,0 @@ -# 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: 2010-03-04 22:58+0100\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" -msgstr "Satellit" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "Terrestrial" -msgstr "Terrestrisch" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "Cable" -msgstr "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." diff -Nru vdr-2.1.6/debian/po/es.po vdr-2.1.6-297~3e4e445/debian/po/es.po --- vdr-2.1.6/debian/po/es.po 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/po/es.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,98 +0,0 @@ -# vdr po-debconf translation to Spanish. -# Copyright (C) 2009 Software in the Public Interest. -# This file is distributed under the same license as the vdrpackage. -# -# Changes: -# - Initial translation -# Fernando González de Requena <fgrequena@gmail.com>, 2009. -# -# -# Traductores, si no conoce el formato PO, merece la pena leer la -# documentación de gettext, especialmente las secciones dedicadas a este -# formato, por ejemplo ejecutando: -# info -n '(gettext)PO Files' -# info -n '(gettext)Header Entry' -# -# Equipo de traducción al español, por favor lean antes de traducir -# los siguientes documentos: -# -# - El proyecto de traducción de Debian al español -# http://www.debian.org/intl/spanish/ -# especialmente las notas y normas de traducción en -# http://www.debian.org/intl/spanish/notas -# -# - La guía de traducción de po's de debconf: -# /usr/share/doc/po-debconf/README-trans -# o http://www.debian.org/intl/l10n/po-debconf/README-trans -# -# Si tiene dudas o consultas sobre esta traducción consulte con el último -# traductor (campo Last-Translator) y ponga en copia a la lista de -# traducción de Debian al español (<debian-l10n-spanish@lists.debian.org>) -# -msgid "" -msgstr "" -"Project-Id-Version: vdr 1.6.0-8\n" -"Report-Msgid-Bugs-To: vdr@packages.debian.org\n" -"POT-Creation-Date: 2010-03-04 22:58+0100\n" -"PO-Revision-Date: 2009-04-26 19:29+0200\n" -"Last-Translator: Fernando González de Requena <fgrequena@gmail.com>\n" -"Language-Team: Spanish <debian-l10n-spanish@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.11.4\n" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "Satellite" -msgstr "Satélite" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "Terrestrial" -msgstr "Terrestre" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "Cable" -msgstr "Cable" - -#. Type: select -#. Description -#: ../vdr.templates:1002 -msgid "DVB card type:" -msgstr "Tipo de tarjeta 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 necesita saber el tipo de la tarjeta DVB para funcionar correctamente. " -"Utilizando su selección, se instalará un archivo «channels.conf» en «/var/lib/" -"vdr». Puede que necesite cambiar este archivo dependiendo de su " -"configuración." - -#. Type: boolean -#. Description -#: ../vdr.templates:2001 -msgid "Create /var/lib/video.00?" -msgstr "¿Desea 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 "" -"VDR se configura por omisión para utilizar «/var/lib/video.00» para almacenar " -"las grabaciones. Puede crear ahora este directorio, o cambiar más tarde este " -"comportamiento modificando la variable VIDEO_DIR en «/etc/default/vdr»." diff -Nru vdr-2.1.6/debian/po/fr.po vdr-2.1.6-297~3e4e445/debian/po/fr.po --- vdr-2.1.6/debian/po/fr.po 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/po/fr.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,82 +0,0 @@ -# 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: 2010-03-04 22:58+0100\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" -msgstr "Satellite" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "Terrestrial" -msgstr "Terrestre" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "Cable" -msgstr "Cble" - -#. 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 connatre le type de votre carte DVB pour fonctionner " -"correctement. Un fichier channels.conf correspondant au type que vous " -"choisirez sera install dans le rpertoire /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 "Crer le rpertoire /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 dfaut, VDR sauvegarde les enregistrements dans le rpertoire /var/lib/" -"video.00. Vous pouvez changer ce rpertoire en modifiant la variable " -"VIDEO_DIR dans le fichier /etc/default/vdr, ou crer ce rpertoire " -"maintenant." diff -Nru vdr-2.1.6/debian/po/gl.po vdr-2.1.6-297~3e4e445/debian/po/gl.po --- vdr-2.1.6/debian/po/gl.po 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/po/gl.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,71 +0,0 @@ -# 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: 2010-03-04 22:58+0100\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" -msgstr "Satélite" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "Terrestrial" -msgstr "Terrestre" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "Cable" -msgstr "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." diff -Nru vdr-2.1.6/debian/po/it.po vdr-2.1.6-297~3e4e445/debian/po/it.po --- vdr-2.1.6/debian/po/it.po 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/po/it.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,71 +0,0 @@ -# Italian translation of vdr. -# COPYRIGHT (C) 2009 THE VDR'S COPYRIGHT HOLDER -# This file is distributed under the same license as the vdr package. -# Luca Monducci <luca.mo@tiscali.it>, 2009. -# -msgid "" -msgstr "" -"Project-Id-Version: vdr 1.6.0 italian debconf templates\n" -"Report-Msgid-Bugs-To: vdr@packages.debian.org\n" -"POT-Creation-Date: 2010-03-04 22:58+0100\n" -"PO-Revision-Date: 2009-09-28 22:36+0200\n" -"Last-Translator: Luca Monducci <luca.mo@tiscali.it>\n" -"Language-Team: Italian <debian-l10n-italian@lists.debian.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" -msgstr "Satellite" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "Terrestrial" -msgstr "Terrestre" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "Cable" -msgstr "Cavo" - -#. Type: select -#. Description -#: ../vdr.templates:1002 -msgid "DVB card type:" -msgstr "Tipo di scheda 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 "" -"Per funzionare correttamente è necessario indicare a VDR il tipo di scheda " -"DVB. In base a questa scelta verrà creato un file channels.conf che verrà " -"installato in /var/lib/vdr. Potrebbe essere necessario adattare questo file " -"al sistema in uso." - -#. Type: boolean -#. Description -#: ../vdr.templates:2001 -msgid "Create /var/lib/video.00?" -msgstr "Creare /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 "" -"Con la configurazione predefinita, VDR usa /var/lib/video.00 per memorizzare " -"le registrazioni. È possibile creare questa directory adesso oppure cambiare " -"questo comportamento modificando la variabile VIDEO_DIR in /etc/default/vdr." diff -Nru vdr-2.1.6/debian/po/ja.po vdr-2.1.6-297~3e4e445/debian/po/ja.po --- vdr-2.1.6/debian/po/ja.po 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/po/ja.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,69 +0,0 @@ -# Japanese translation of vdr debconf templates. -# Copyright (C) 2009 Hideki Yamane <henrich@debian.or.jp> -# This file is distributed under the same license as vdr package. -# -msgid "" -msgstr "" -"Project-Id-Version: vdr 1.6.0-12\n" -"Report-Msgid-Bugs-To: vdr@packages.debian.org\n" -"POT-Creation-Date: 2010-03-04 22:58+0100\n" -"PO-Revision-Date: 2009-10-29 06:26+0900\n" -"Last-Translator: Hideki Yamane (Debian-JP) <henrich@debian.or.jp>\n" -"Language-Team: Japanese <debian-japanese@lists.debian.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" -msgstr "衛星放送" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "Terrestrial" -msgstr "地上デジタル放送" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "Cable" -msgstr "ケーブル放送" - -#. Type: select -#. Description -#: ../vdr.templates:1002 -msgid "DVB card type:" -msgstr "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 は正常に動作するために DVB カードの種類を知っている必要があります。ここで" -"の選択を元にして、/var/lib/vdr に channels.conf ファイルがインストールされま" -"す。設定によってはこのファイルを変更する必要があるかもしれません。" - -#. Type: boolean -#. Description -#: ../vdr.templates:2001 -msgid "Create /var/lib/video.00?" -msgstr "/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 "" -"デフォルトでは VDR は録画を保存するのに /var/lib/video.00 を使うように設定さ" -"れています。このディレクトリをすぐに作成する、あるいは後ほど /etc/default/" -"vdr 内の VIDEO_DIR 変数の設定にて、保存するディレクトリの指定を変更できます。" diff -Nru vdr-2.1.6/debian/po/nl.po vdr-2.1.6-297~3e4e445/debian/po/nl.po --- vdr-2.1.6/debian/po/nl.po 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/po/nl.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,77 +0,0 @@ -# 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: 2010-03-04 22:58+0100\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" -msgstr "Satelliet" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "Terrestrial" -msgstr "Aards" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "Cable" -msgstr "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 genstalleerd 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." diff -Nru vdr-2.1.6/debian/po/POTFILES.in vdr-2.1.6-297~3e4e445/debian/po/POTFILES.in --- vdr-2.1.6/debian/po/POTFILES.in 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/po/POTFILES.in 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -[type: gettext/rfc822deb] vdr.templates diff -Nru vdr-2.1.6/debian/po/pt.po vdr-2.1.6-297~3e4e445/debian/po/pt.po --- vdr-2.1.6/debian/po/pt.po 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/po/pt.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -# 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: 2010-03-04 22:58+0100\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" -msgstr "Satélite" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "Terrestrial" -msgstr "Terrestre" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "Cable" -msgstr "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." diff -Nru vdr-2.1.6/debian/po/ru.po vdr-2.1.6-297~3e4e445/debian/po/ru.po --- vdr-2.1.6/debian/po/ru.po 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/po/ru.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,73 +0,0 @@ -# translation of ru.po to Russian -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# -# Yuri Kozlov <yuray@komyakino.ru>, 2009. -msgid "" -msgstr "" -"Project-Id-Version: vdr 1.6.0-8\n" -"Report-Msgid-Bugs-To: vdr@packages.debian.org\n" -"POT-Creation-Date: 2010-03-04 22:58+0100\n" -"PO-Revision-Date: 2009-07-02 21:17+0400\n" -"Last-Translator: Yuri Kozlov <yuray@komyakino.ru>\n" -"Language-Team: Russian <debian-l10n-russian@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.11.4\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" -"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "Satellite" -msgstr "Спутниковая" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "Terrestrial" -msgstr "Эфирная" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "Cable" -msgstr "Кабельная" - -#. Type: select -#. Description -#: ../vdr.templates:1002 -msgid "DVB card type:" -msgstr "Тип карты 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 требуется указать тип карты DVB. На основе вашего " -"выбора в каталог /var/lib/vdr будет помещён подходящий файл channels.conf. В " -"зависимости от установки вам может потребоваться изменить этот файл." - -#. Type: boolean -#. Description -#: ../vdr.templates:2001 -msgid "Create /var/lib/video.00?" -msgstr "Создать /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 "" -"По умолчанию для хранения записей VDR использует /var/lib/video.00. Вы " -"можете создать этот каталог сейчас, или изменить эту настройку позже, " -"отредактировав значение переменной VIDEO_DIR в /etc/default/vdr." diff -Nru vdr-2.1.6/debian/po/sv.po vdr-2.1.6-297~3e4e445/debian/po/sv.po --- vdr-2.1.6/debian/po/sv.po 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/po/sv.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,77 +0,0 @@ -# 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: 2010-03-04 22:58+0100\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" -msgstr "Satellit" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "Terrestrial" -msgstr "Marksnd" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "Cable" -msgstr "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 behver veta om din DVB-korttyp fr att fungera korrekt. Baserat p ditt " -"val kommer en channels.conf fil att installeras i /var/lib/vdr. Du kanske " -"mste 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 anvnda /var/lib/video.00 fr att lagra " -"inspelningar. Du kan antingen skapa denna mapp nu eller ndra detta senare " -"genom att modifiera variabeln VIDEO_DIR i /etc/default/vdr." diff -Nru vdr-2.1.6/debian/po/templates.pot vdr-2.1.6-297~3e4e445/debian/po/templates.pot --- vdr-2.1.6/debian/po/templates.pot 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/po/templates.pot 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -# 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: 2010-03-04 22:58+0100\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" -msgstr "" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "Terrestrial" -msgstr "" - -#. Type: select -#. Choices -#: ../vdr.templates:1001 -msgid "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 "" diff -Nru vdr-2.1.6/debian/R90.custom vdr-2.1.6-297~3e4e445/debian/R90.custom --- vdr-2.1.6/debian/R90.custom 2014-04-03 19:16:29.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/R90.custom 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ -# -# 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 - ;; - started) - # do here whatever you would like to do right AFTER - # the recording $2 STARTED - ;; - 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 - # $3 is the original recording - ;; - deleted) - # do here whatever you would like to do right AFTER - # the recording $2 has been DELETED - ;; -esac diff -Nru vdr-2.1.6/debian/README.Debian vdr-2.1.6-297~3e4e445/debian/README.Debian --- vdr-2.1.6/debian/README.Debian 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/README.Debian 1970-01-01 00:00:00.000000000 +0000 @@ -1,286 +0,0 @@ -vdr for Debian --------------- - -Comments to the Debian version: - - - You need a DVB card and a driver using the "Linux DVB S2API". - These drivers have been merged into the Linux-Kernel in version 2.6.28, - but you might require a later kernel or special drivers for you DVB card. - You can get more information about the DVB driver development at: - - http://www.linuxtv.org - - Please also note, that proper trick speed playback with a full featured DVB - card needs an improved av7110 firmware. Without this firmware you might - experience problems like jumping backwards when stopping fast-forward - playback. The improved firmware is provided by Oliver Endriss and can be - download here: - - http://www.escape-edv.de/endriss/firmware/ - - - 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 - - -Additional configuration options -------------------------------- - -The following options can be configured in /etc/default/vdr. - -KEYB_TTY="<CONSOLE>" - - 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="<yes|no>" - - 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="<COMMAND>" - - Default: "/sbin/shutdown -h now" - - VDR executes <COMMAND> 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=<PORT> - - Default: 6419 - - Default port for SVDRP (Simple Video Disk Recorder Protocol), the telnet - like interface to control VDR. - -USER=<USERNAME> - - 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=<CHARSET> - - 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=<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="<VIDEODIR>" - - Default: "/var/lib/video.00" - - The video directory where vdr recordings will be stored. - - -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<plugin_name> -will be created automatically. - -If a file /etc/vdr/plugins/plugin.<plugin_name>.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. - - -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.<descriptor>.conf and reccmds.<descriptor>.conf found in -/usr/share/vdr/command-hooks/. <descriptor> 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. - - -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<XX>.<identifier> - -Where <XX> is a two digit number, that mainly specifies the execution order -and <identifier> is a unique descriptor. - -Two parameters are passed to each recording hook: - -Parameter 1 can have the values "before", "after" and "edited", depending -on whether the recording hook is called before the recording starts, -after the recording ends or after the recording has been edited. - -Parameter 2 is the directory of the recording. Be aware, that this directory -doesn't exist before the recording starts. if parameter 1 is "edited", this -is the result of the cutting. - -Parameter 3 is the directory of the original recording if parameter 1 is -"edited" - -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. - - -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<XX>.<identifier> - -Where <XX> is a two digit number, that mainly specifies the execution order -and <identifier> 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=<message to display> - -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=<minutes to wait before next shutdown request> - -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=<new shutdown command> - - -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/<plugin-name>.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 -<plugin-name>.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. - - -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-<nn>_<patch name>, where <nn> is a -two-digit-number and <patch name> 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-<nn>-x_<patch name> 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. diff -Nru vdr-2.1.6/debian/README.source vdr-2.1.6-297~3e4e445/debian/README.source --- vdr-2.1.6/debian/README.source 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/README.source 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -This package uses the dpatch system to save and apply patches to the -upstream source code of the software that is packaged. For details -about how to use dpatch read - - /usr/share/doc/dpatch/README.source.gz - -from the dpatch package. diff -Nru vdr-2.1.6/debian/reccmds.custom.conf vdr-2.1.6-297~3e4e445/debian/reccmds.custom.conf --- vdr-2.1.6/debian/reccmds.custom.conf 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/reccmds.custom.conf 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ -# -# 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, e.g.: -# -# Show me the recording name: echo -# -# If you uncomment the line above and restart vdr, you will have a new -# recordings command menu entry, called "Show me the recording name", that -# will simply show you the recording name :-) -# -# You can divide your commands into submenus, e.g.: -# -# main menu node { -# sub menu entry 1 : do_something.sh -# sub menu entry 2 : do_something_else.sh -# sub menu node { -# sub-sub menu entry : do_whatever_you_want.sh -# } -# } -# diff -Nru vdr-2.1.6/debian/rules vdr-2.1.6-297~3e4e445/debian/rules --- vdr-2.1.6/debian/rules 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/rules 2014-03-19 21:59:41.000000000 +0000 @@ -1,58 +1,38 @@ #!/usr/bin/make -f -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 - -CXXFLAGS += $(CPPFLAGS) -CFLAGS += $(CPPFLAGS) -PREFIX = /usr -VIDEODIR = /srv/vdr/video.00 -LIBDIR = /usr/lib/vdr/plugins -MAKE_OPTIONS = PREFIX=$(PREFIX) VIDEODIR=$(VIDEODIR) LIBDIR=$(LIBDIR) +DIR := $(CURDIR) +DESTDIR := $(DIR)/debian/tmp +NPROC := $(shell getconf _NPROCESSORS_ONLN) +RM_PLUGINS := $(shell ls PLUGINS/src/ | grep -vE '(dvbhddevice|dvbsddevice)') +MAKE_ARGS := PREFIX=/usr RESDIR=/usr/share/vdr VIDEODIR=/var/lib/video.00 \ + CONFDIR=/etc/vdr CACHEDIR=/var/cache/vdr LIBDIR=/usr/lib/vdr/plugins \ + DESTDIR="$(DESTDIR)" %: - dh $@ + dh $@ override_dh_auto_build: - dh_auto_build -- $(MAKE_OPTIONS) - $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o debian/vdr-shutdown.wrapper debian/vdr-shutdown-wrapper.c - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) -o debian/plugin-loader2 debian/plugin-loader2.cpp - -override_dh_auto_clean: - dh_auto_clean - rm -f debian/vdr-shutdown.wrapper - rm -f debian/plugin-loader2 + for i in $(RM_PLUGINS); do /bin/rm -rf "$(DIR)/PLUGINS/src/$$i"; done + unset CFLAGS CPPFLAGS CXXFLAGS; $(MAKE) -j$(NPROC) $(MAKE_ARGS) override_dh_auto_install: - dh_auto_install -- $(MAKE_OPTIONS) + unset CFLAGS CPPFLAGS CXXFLAGS; $(MAKE) install $(MAKE_ARGS) + +# Includes + cp -pLR "$(DIR)/include" "$(DESTDIR)/usr" -override_dh_install: - dh_install --fail-missing -Xlibvdr-epgtableid0.so - install -D -m 755 newplugin debian/vdr-dev/usr/bin/vdr-newplugin - echo -n "vdr:Provides=" >> debian/vdr.substvars - cat debian/abi-version >> debian/vdr.substvars - for example in hello osddemo pictures servicedemo skincurses status svdrpdemo rcu; do \ - install -D PLUGINS/src/$$example/README debian/vdr-plugin-examples/usr/share/doc/vdr-plugin-examples/README.$$example; \ - done +# pkg-config + [ -d "$(DESTDIR)/usr/lib/pkgconfig" ] || mkdir -p "$(DESTDIR)/usr/lib/pkgconfig" + cp -pLR "$(DIR)/vdr.pc" "$(DESTDIR)/usr/lib/pkgconfig" -override_dh_installinit: - dh_installinit --no-start --no-restart-on-upgrade +# Configs + cp -r "$(DIR)/debian/configs"/* "$(DESTDIR)" +# Scripts + cp -r "$(DIR)/debian/scripts"/* "$(DESTDIR)" + override_dh_strip: - dh_strip -p vdr --dbg-package=vdr-dbg - dh_strip -p vdr-plugin-dvbsddevice --dbg-package=vdr-plugin-dvbsddevice-dbg - dh_strip -p vdr-plugin-dvbhddevice --dbg-package=vdr-plugin-dvbhddevice-dbg + dh_strip -pvdr --dbg-package=vdr-dbg dh_strip -override_dh_installchangelogs: - dh_installchangelogs -pvdr HISTORY - dh_installchangelogs -pvdr-plugin-dvbsddevice PLUGINS/src/dvbsddevice/HISTORY - dh_installchangelogs -pvdr-plugin-dvbhddevice PLUGINS/src/dvbhddevice/HISTORY - dh_installchangelogs -pvdr-plugin-examples - dh_installchangelogs - -check-patches: - python debian/patchcheck.py -c $(PATCHCHECKOPTION) - -accept-patches: - python debian/patchcheck.py -u $(PATCHCHECKOPTION) +override_dh_installdocs: diff -Nru vdr-2.1.6/debian/runvdr vdr-2.1.6-297~3e4e445/debian/runvdr --- vdr-2.1.6/debian/runvdr 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/runvdr 1970-01-01 00:00:00.000000000 +0000 @@ -1,89 +0,0 @@ -#!/bin/sh - -. /usr/lib/vdr/config-loader.sh - -VDR_ENV="LANG=$VDR_LANG LC_ALL=$VDR_LANG" -if [ -n "$VDR_CHARSET_OVERRIDE" ] ; then - VDR_ENV="$VDR_ENV VDR_CHARSET_OVERRIDE=$VDR_CHARSET_OVERRIDE" -fi - -VDRCMD="$VDR_ENV /usr/bin/vdr $*" - -get_modulenames() -{ - MODULES=`lsmod | awk '/^dvb/ {gsub(/,/,"\n", $4); print $4}' | uniq | tac | grep -v "^$"` - [ "$MODULES" ] && MODULES="$MODULES dvb_core" -} - -# TODO: check if udev handles this on newer systems!? -set_permissions() -{ - if [ "$USER" -o "$GROUP" ]; then - for FILE in av7110_ir budget_ci_ir; do - if [ -e "/proc/$FILE" ]; then - chown $USER.$GROUP /proc/$FILE - chmod +r /proc/$FILE - fi - done - fi - chmod o+r /dev/input/event* -} - -load_dvb_modules() -{ - if modprobe dvb >/dev/null 2>&1 ; then - get_modulenames - else - if [ "$MODULES" ]; then - for MODULE in $MODULES; do - modprobe $MODULE >/dev/null 2>&1 - done - else - modprobe dvb_ttpci >/dev/null 2>&1 - get_modulenames - fi - wait `pidof udev` - fi - sleep 15 -} - -unload_dvb_modules() -{ - for MODULE in $MODULES; do - rmmod $MODULE >/dev/null 2>&1 - wait `pidof rmmod` - done -} - - -VDR_ERR=`mktemp -p /tmp vdr-err.XXXXXX` - -get_modulenames - -[ -z "$MODULES" ] && load_dvb_modules - -while (true) do - - set_permissions - - eval $VDRCMD >/dev/null 2>"$VDR_ERR" - - case $? in - 0) - exit - ;; - 2) - ERROR=`cat "$VDR_ERR"` - logger -t runvdr "stopping after fatal fail ($ERROR)" - exit - ;; - esac - - logger -t runvdr "restarting VDR" - killall -q -TERM /usr/bin/vdr - wait `pidof vdr` - unload_dvb_modules - sleep 2 - load_dvb_modules - -done diff -Nru vdr-2.1.6/debian/runvdr.8 vdr-2.1.6-297~3e4e445/debian/runvdr.8 --- vdr-2.1.6/debian/runvdr.8 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/runvdr.8 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -.\" 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 <thomas@thsnet.de> -.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. diff -Nru vdr-2.1.6/debian/S90.custom vdr-2.1.6-297~3e4e445/debian/S90.custom --- vdr-2.1.6/debian/S90.custom 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/S90.custom 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -# -# 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 -# - - diff -Nru vdr-2.1.6/debian/scripts/etc/init/vdr.conf vdr-2.1.6-297~3e4e445/debian/scripts/etc/init/vdr.conf --- vdr-2.1.6/debian/scripts/etc/init/vdr.conf 1970-01-01 00:00:00.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/scripts/etc/init/vdr.conf 2014-03-19 21:59:41.000000000 +0000 @@ -0,0 +1,26 @@ +description "Video Disk Recorder (VDR) service" + +start on runlevel [2345] +stop on runlevel [016] + +emits vdr-started +emits vdr-stopped + +console log + +respawn +respawn limit 5 60 + +script + exec /usr/sbin/runvdr +end script + +post-start script + logger -s -t vdr 'VDR started' + initctl emit --no-wait vdr-started +end script + +post-stop script + logger -s -t vdr 'VDR stopped' + initctl emit --no-wait vdr-stopped +end script diff -Nru vdr-2.1.6/debian/scripts/etc/pm/sleep.d/vdr vdr-2.1.6-297~3e4e445/debian/scripts/etc/pm/sleep.d/vdr --- vdr-2.1.6/debian/scripts/etc/pm/sleep.d/vdr 1970-01-01 00:00:00.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/scripts/etc/pm/sleep.d/vdr 2014-03-19 21:59:41.000000000 +0000 @@ -0,0 +1,12 @@ +#!/bin/sh + +STATUS_FILE='/var/run/vdr.pm' + +case $1 in + suspend|suspend_hybrid|hibernate) + status vdr | tee "$STATUS_FILE" | grep -q 'start/' && stop vdr || true + ;; + resume|thaw) + grep -q 'start/' "$STATUS_FILE" && start vdr || true + ;; +esac \ No newline at end of file diff -Nru vdr-2.1.6/debian/scripts/usr/sbin/runvdr vdr-2.1.6-297~3e4e445/debian/scripts/usr/sbin/runvdr --- vdr-2.1.6/debian/scripts/usr/sbin/runvdr 1970-01-01 00:00:00.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/scripts/usr/sbin/runvdr 2014-03-19 21:59:41.000000000 +0000 @@ -0,0 +1,113 @@ +#! /bin/sh +# +# Video Disk Recorder (VDR) startup script +# + +. /etc/default/vdr + +EXECUTABLE='/usr/bin/vdr' +USER='vdr' +GROUP='vdr' + +if [ "$RELOAD_DRIVERS" = 'true' ] +then + MODULES=$(lsmod | awk '/^dvb/ {gsub(/,/,"\n", $4); print $4}' | sort -u | tac | grep -v '^$') + + if [ -z "$MODULES" ] + then + RELOAD_DRIVERS='false' + else + MODULES="$MODULES dvb_core" + fi +fi + +unloadModule() { + for i in $(seq 1 2) + do + modprobe -r $MODULE && break || sleep 1 + done +} + +unloadDrivers() { + for MODULE in $MODULES + do + unloadModule $MODULE >/dev/null 2>&1 + done +} + +loadDrivers() { + for MODULE in $MODULES + do + modprobe $MODULE >/dev/null 2>&1 + done +} + +reloadDrivers() { + echo "Reloading modules: $MODULES" + + for i in $(seq 1 $RELOAD_RETRIES) + do + unloadDrivers + sleep $LOAD_DRIVERS_DELAY + loadDrivers + sleep $RELOAD_CONDITION_DELAY + $RELOAD_CONDITION && break + done +} + +getLang() { + [ -r /etc/environment ] && . /etc/environment > /dev/null 2>&1 || true + [ -r /etc/default/locale ] && . /etc/default/locale > /dev/null 2>&1 || true + + if [ -n "$LANG" ] + then + echo "$LANG" + elif [ -n "$LC_ALL" ] + then + echo "$LC_ALL" + else + echo 'C.UTF-8' + fi +} + +setEnv() { + if [ -z "$VDR_LANG" ] + then + local VDR_LANG=$(getLang) + fi + + export LANG=$VDR_LANG LC_ALL=$VDR_LANG $VDR_ENV +} + +start() { + local plugins='' + local args="-u $USER -v $VIDEO_DIR -c $CFG_DIR -L $PLUGIN_DIR -s $VDRSHUTDOWN \ + -E $EPG_FILE -g /tmp --port $SVDRP_PORT $OPTIONS $@" + local epg_dir=$(dirname "$EPG_FILE") + + for i in $PLUGINS + do + if [ -f "$PLUGIN_CFG_DIR/plugin.$i.conf" ] + then + a="$(echo $(cat "$PLUGIN_CFG_DIR/plugin.$i.conf" | sed "s/ *#.*$//"))" + plugins="$plugins -P '$i $a'" + else + plugins="$plugins -P $i" + fi + done + + [ ! -d "$epg_dir" ] && mkdir "$epg_dir" || true + [ ! -d "$VIDEO_DIR" ] && mkdir "$VIDEO_DIR" || true + chown $USER:$GROUP "$epg_dir" + chown $USER:$GROUP "$VIDEO_DIR" + setEnv + + [ "$RELOAD_DRIVERS" = 'true' ] && reloadDrivers + + ([ -z "$PLUGINS" ] && echo 'Starting VDR') || \ + echo "Starting VDR with plugins: $PLUGINS" + + eval exec "$EXECUTABLE" $args $plugins +} + +start $@ diff -Nru vdr-2.1.6/debian/source/options vdr-2.1.6-297~3e4e445/debian/source/options --- vdr-2.1.6/debian/source/options 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/source/options 2014-03-19 21:59:41.000000000 +0000 @@ -1 +1 @@ -compression = "bzip2" +compression = "bzip2" \ No newline at end of file diff -Nru vdr-2.1.6/debian/svdrpsend vdr-2.1.6-297~3e4e445/debian/svdrpsend --- vdr-2.1.6/debian/svdrpsend 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/svdrpsend 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ - -have svdrpsend && -_svdrpsend () -{ - local cur prev - - _get_comp_words_by_ref cur prev - - COMPREPLY=() - - if [[ ($COMP_CWORD -eq 1) || ("${prev^^}" == "HELP") ]]; then - - cmds="CHAN CLRE DELC DELR DELT EDIT GRAB HELP HITK LSTC LSTE LSTR LSTT MESG MODC MODT MOVC MOVR NEWC NEWT NEXT PLAY PLUG PUTE REMO SCAN STAT UPDT UPDR VOLU" - COMPREPLY=( $( compgen -W "$cmds" | grep -i "^$cur" ) ) - - else - - case "${prev}" in - - chan|CHAN) - COMPREPLY=( $( compgen -W "+ -" $cur ) ) - ;; - - plug|PLUG) - apiversion=`eval "/usr/bin/vdr -V -L/usr/bin/vdr 2>/dev/null | sed 's/.*(.*\/\(.*\)).*/\1/'"` - plugins=`eval "find /usr/lib/vdr/plugins -name 'libvdr-*.so.${apiversion}' -printf '%f\n' | sed -e 's/libvdr-\(.*\)\.so\.${apiversion}/\1/'"` - COMPREPLY=( $( compgen -W "$plugins" | grep -i "^$cur" ) ) - ;; - - esac - - fi -} - -[ "$have" ] && complete -F _svdrpsend -o filenames svdrpsend diff -Nru vdr-2.1.6/debian/themes/lcars-BlueGlass.theme vdr-2.1.6-297~3e4e445/debian/themes/lcars-BlueGlass.theme --- vdr-2.1.6/debian/themes/lcars-BlueGlass.theme 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/themes/lcars-BlueGlass.theme 1970-01-01 00:00:00.000000000 +0000 @@ -1,104 +0,0 @@ -Description = BlueGlass -clrBackground = 8C1B1B1B - -clrTrackName = FFFFCC66 -clrAlertFg = FFFFFFFF -clrAlertBg = DCFF0000 -clrChannelName = FFFFFFFF -clrEventTitle = FF99CCFF -clrEventTime = FFFFFFFF #FFCC66 -clrEventShortText = FFFFCC66 -clrEventDescription = FF99CCFF - -# Pulsanti -clrButtonRedFg = FF000000 -clrButtonRedBg = DCFF7F7F -clrButtonGreenFg = FF000000 -clrButtonGreenBg = DC9df97d -clrButtonYellowFg = FF000000 -clrButtonYellowBg = DCf9f47d -clrButtonBlueFg = FF000000 -clrButtonBlueBg = DC7DB4F9 - -# Messaggi di stato -clrMessageStatusFg = FFFFFFFF -clrMessageStatusBg = DC7DB4F9 -clrMessageInfoFg = FFFFCC66 #FF000000 -clrMessageInfoBg = DC21244B #DCFFCC00 -clrMessageWarningFg = FF000000 -clrMessageWarningBg = DCFFCC00 -clrMessageErrorFg = FFFFFFFF -clrMessageErrorBg = DCB20000 - -# Volume -clrVolumeFrame = DCFFFFFF #sfondo volume -clrVolumeSymbol = FF000000 -clrVolumeBarUpper = DCC0C0C0 #barra volume non attivo -clrVolumeBarLower = FF336699 #barra volume attivo - -# Menu info canale -clrChannelFrameFg = FFFFFFFF #numero canale e orario programma -clrChannelFrameBg = DC323D68 #cornice -clrChannelSymbolOn = FFFFFFFF -clrChannelSymbolOff = DC666666 -clrChannelSymbolRecFg = FFFFFFFF -clrChannelSymbolRecBg = FFB20000 - -# Device -clrDeviceFg = FFff9900 #testo -clrDeviceBg = A01B1B1B #sfondo -clrSignalValue = F0FFCC00 #livello segnale -clrSignalRest = A0000000 #resto segnale - -# Timer Text -clrTimerFg = FF000000 #testo -clrTimerBg = DCE9E0DB #sfondo - -# Progressbar -clrSeen = F0F9F6F4 - -# Data e ora -clrDateFg = FF000000 #testo -clrDateBg = F0E9E0DB #sfondo - -# Menu principale -clrMenuFrameFg = FFFFCC99 #testo -clrMenuFrameBg = DC21244B #cornice -clrMenuTitle = FFEA962D #testo titoli - -# Menu lista voci -clrMenuMainBracket = F0202740 #cornice sup/inf -clrMenuItemCurrentFg = FFffcc99 #Voce selezionata (testo) -clrMenuItemCurrentBg = FF202740 #Voce selezionata (barra) -clrMenuItemSelectable = FF99CCFF #Lista delle voci selezionabili -clrMenuItemNonSelectable = FF8C8C8C #lista delle voci (non selezionabili) - -# Tempo registrazione -clrMenuTimerRecording = FFF6A03D -clrMenuDeviceRecording = A01B1B1B - -# Scrollbar -clrMenuScrollbarTotal = A0202740 -clrMenuScrollbarShown = FF202740 -clrMenuScrollbarArrow = FF000000 -clrMenuText = FFFFFFFF #FFff00ff - -# Replay OSD -clrReplayFrameFg = FFFFFFFF -clrReplayFrameBg = DC007090 -clrReplayPosition = FFFFFFFF #testo -clrReplayJumpFg = FFFFFFFF -clrReplayJumpBg = DCFF7F7F #21244B -clrReplayProgressSeen = F0FF8F00 -clrReplayProgressRest = A0CCCCCC -clrReplayProgressSelected = FFFFFFFF -clrReplayProgressMark = FFA00000 #taglio -clrReplayProgressCurrent = FF990000 #marcatore - -# Audio -clrTrackFrameFg = FFFFFFFF -clrTrackFrameBg = DC323D68 #Audio skin -clrTrackItemFg = DC858585 -clrTrackItemBg = A0FFFFFF #Audio no select -clrTrackItemCurrentFg = FF000000 -clrTrackItemCurrentBg = FFFFFFFF #Audio select diff -Nru vdr-2.1.6/debian/themes/lcars-LbSense.theme vdr-2.1.6-297~3e4e445/debian/themes/lcars-LbSense.theme --- vdr-2.1.6/debian/themes/lcars-LbSense.theme 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/themes/lcars-LbSense.theme 1970-01-01 00:00:00.000000000 +0000 @@ -1,105 +0,0 @@ -Description = LbSense -clrBackground = A0141717 - -clrTrackName = FFFFCC66 -clrAlertFg = FFFFFFFF -clrAlertBg = FFFF0000 -clrChannelName = FFFFFFFF #FF99CCFF -clrEventTitle = FFFFCC99 #99CCFF -clrEventTime = FFFFCC66 -clrEventShortText = FF99CCFF #FFCC66 -clrEventDescription = FF99CCFF #99CCFF - -# Pulsanti -clrButtonRedFg = FF000000 -clrButtonRedBg = FFf97d7d -clrButtonGreenFg = FF000000 -clrButtonGreenBg = FF9df97d -clrButtonYellowFg = FF000000 -clrButtonYellowBg = FFf9f47d -clrButtonBlueFg = FF000000 -clrButtonBlueBg = FF7db4f9 - -# Messaggi di stato -clrMessageStatusFg = FFFFFFFF -clrMessageStatusBg = FF7DB4F9 #FF0000B2 -clrMessageInfoFg = FF202740 #FFFFFFFF #FF000000 -clrMessageInfoBg = FFFFCC99 #FF00DD00 #FFCC00 #FF00B200 -clrMessageWarningFg = FF000000 -clrMessageWarningBg = FFFFBB00 #FF9900 #FFBB00 #FFCC00 #FFB2B200 -clrMessageErrorFg = FFFFFFFF -clrMessageErrorBg = FFB20000 #FFB20000 - -# Volume -clrVolumeFrame = F0FFCC99 #3C3C3C -clrVolumeSymbol = FF000000 -clrVolumeBarUpper = FFCC9966 #CC9863 #FFCC99 #FFFFFF -clrVolumeBarLower = FF4D5D6D - -# Menu info canale -clrChannelFrameFg = FF000000 -clrChannelFrameBg = FF8A9EC9 -clrChannelSymbolOn = FF202740 -clrChannelSymbolOff = FF738EC9 -clrChannelSymbolRecFg = FFFFFFFF -clrChannelSymbolRecBg = FFB20000 - -# Device -clrDeviceFg = FF000000 -clrDeviceBg = FF8A9EC9 -clrSignalValue = FFFFCC99 #FFFFFFFF #FFFFCC00 -clrSignalRest = FF5D6D7D #A08A9EC9 #A0FFCC99 #A0FFFFFF - -# Timer Text -clrTimerFg = FF000000 -clrTimerBg = FF8A9EC9 #99CCFF - -# Progressbar -clrSeen = FFCC99CC - -# Data e ora -clrDateFg = FF000000 -clrDateBg = FF99CCFF - -# Menu principale -clrMenuFrameFg = FF202740 -clrMenuFrameBg = FFFFCC99 #FFFF9966 -clrMenuTitle = FFea962d - -# Menu lista voci -clrMenuMainBracket = FF8899EE #FF9999ff -clrMenuItemCurrentFg = FFFFFFFF #FFFFCC00 #FF000000 -clrMenuItemCurrentBg = FF7A8EC9 #FF8A9EC9 #FF202740 -clrMenuItemSelectable = FF99CCFF #8A9EC9 -clrMenuItemNonSelectable = FF99CCFF - -# Tempo registrazione -clrMenuTimerRecording = FFF1B1AF -clrMenuDeviceRecording = FF99CCFF - -# Scrollbar -clrMenuScrollbarTotal = A08A9EC9 #A09999ff #FFFFBC57 -clrMenuScrollbarShown = FFCC99CC -clrMenuScrollbarArrow = FF000000 -clrMenuText = FFff00ff - -# Replay OSD -clrReplayFrameFg = FF000000 -clrReplayFrameBg = FFCC6666 -clrReplayPosition = FFFFFFFF #testo -clrReplayJumpFg = FF000000 -clrReplayJumpBg = FFFFCC99 #FFCC99CC -clrReplayProgressSeen = FFFFCC99 #CC99CC -clrReplayProgressRest = FFCCCCCC -clrReplayProgressSelected = FF990000 #FF7A8EC9 # -clrReplayProgressMark = FF000000 -clrReplayProgressCurrent = FF990000 - -# Audio -clrTrackFrameFg = FF000000 -clrTrackFrameBg = FFFFFCC99 #skin -clrTrackItemFg = DC858585 -clrTrackItemBg = A0FFFFFF #Audio no select -clrTrackItemCurrentFg = FF000000 -clrTrackItemCurrentBg = FF99CCFF #Audio select - diff -Nru vdr-2.1.6/debian/themes/sttng-blue.theme vdr-2.1.6-297~3e4e445/debian/themes/sttng-blue.theme --- vdr-2.1.6/debian/themes/sttng-blue.theme 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/themes/sttng-blue.theme 1970-01-01 00:00:00.000000000 +0000 @@ -1,62 +0,0 @@ -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 diff -Nru vdr-2.1.6/debian/themes/sttng-cool.theme vdr-2.1.6-297~3e4e445/debian/themes/sttng-cool.theme --- vdr-2.1.6/debian/themes/sttng-cool.theme 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/themes/sttng-cool.theme 1970-01-01 00:00:00.000000000 +0000 @@ -1,62 +0,0 @@ -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 diff -Nru vdr-2.1.6/debian/TODO.Debian vdr-2.1.6-297~3e4e445/debian/TODO.Debian --- vdr-2.1.6/debian/TODO.Debian 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/TODO.Debian 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -TODO: Make runvdr more equal to official Debian version -TODO: When plugin could not be loaded, log stderr output somewhere -TODO: Add option USE_LIRC=yes|no (see http://www.vdr-portal.de/board/thread.php?postid=829057#post829057) -TODO: Get rid of bash in init script, debugvdr and vdrleaktest -TODO: The runvdr module (re)loading stuff is weird - it was introduced to workaround driver bugs and can probably be removed diff -Nru vdr-2.1.6/debian/vdr-dbg.upstart vdr-2.1.6-297~3e4e445/debian/vdr-dbg.upstart --- vdr-2.1.6/debian/vdr-dbg.upstart 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr-dbg.upstart 1970-01-01 00:00:00.000000000 +0000 @@ -1,57 +0,0 @@ -start on ( stopped vdr RESULT=failed EXIT_SIGNAL=?* or \ - stopped vdr RESULT=failed EXIT_STATUS!=[02] ) - -task - -script -if [ "$EXIT_SIGNAL" = "" ]; then - logger -t "vdr-crash" "vdr exit with exit status $EXIT_STATUS" -else - logger -t "vdr-crash" "vdr exit with signal $EXIT_SIGNAL" -fi - -# cleanup possible leftovers after core dump -if [ -e /tmp/vdr-xine ]; then - rm -rf /tmp/vdr-xine -fi - -# save other artifacts helping to debug - -TIMESTAMP=$(date +%Y%m%d%H%M%S) -# stdout output (which should not happen, but anyway) -if [ -e /tmp/vdr.log ]; then - cp /tmp/vdr.log /var/log/vdr/stdout.vdr.$TIMESTAMP.log -fi -if [ -e /tmp/vdr-frontend.log ]; then - cp /tmp/vdr-frontend.log /var/log/vdr/stdout.vdr-frontend.$TIMESTAMP.log -fi - -# only keep files from last day -find /var/log/vdr -name '*.log' -mtime +1 | xargs rm -f - -# generate a crashlog if we run debug vdr and cleanup the core file -CRASHLOG=/var/log/vdr/crashlog.$TIMESTAMP -echo "Crashlog from $(date)" > $CRASHLOG -echo "----------------------------------" >> $CRASHLOG -echo "" >> $CRASHLOG - -echo "Environment details:" >> $CRASHLOG -env >> $CRASHLOG -echo "" >> $CRASHLOG - -echo "Backtrace:" >> $CRASHLOG -echo "----------" >> $CRASHLOG -echo "" >> $CRASHLOG -for CORE in $(find /var/log/vdr -name 'core.*') ; do - gdb /usr/bin/vdr --core="$CORE" --batch -ex "where" >> $CRASHLOG - echo "" >> $CRASHLOG - echo "" >> $CRASHLOG - gdb /usr/bin/vdr --core="$CORE" --batch -ex "bt" >> $CRASHLOG - echo "" >> $CRASHLOG - echo "" >> $CRASHLOG - echo "Detailed Backtrace with Threads" >> $CRASHLOG - gdb /usr/bin/vdr --core="$CORE" --batch -ex "thread apply all bt" >> $CRASHLOG - rm -f $CORE -done - -end script diff -Nru vdr-2.1.6/debian/vdr.default vdr-2.1.6-297~3e4e445/debian/vdr.default --- vdr-2.1.6/debian/vdr.default 2014-04-04 11:01:13.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr.default 2014-03-19 21:59:41.000000000 +0000 @@ -1,15 +1,49 @@ -# /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" +# Config-Directory +CFG_DIR='/etc/vdr' + +# Plugin-Directory +PLUGIN_DIR='/usr/lib/vdr/plugins' + +# Plugin Config-Directory +PLUGIN_CFG_DIR='/etc/vdr/plugins' + +# Commmand executed by vdr to shutdown the system +SHUTDOWNCMD='/sbin/shutdown -h now' + +# EPG data file +EPG_FILE='/var/cache/vdr/epg.data' + +# Default port for SVDRP +SVDRP_PORT='0' + +# Video-Directory +VIDEO_DIR='/var/lib/video.00' + +# Environment variables to be set before starting VDR +VDR_ENV='' + +# VDR options +OPTIONS='--vfat -w 60' + +# Space separated names of plugins to be loaded on VDR startup. To pass any +# arguments to a plugin put them into the $PLUGIN_CFG_DIR/plugin.{name}.conf file. +PLUGINS=$(echo -n $(ls $PLUGIN_DIR/libvdr-*.so.* 2> /dev/null | sed -r 's:.*/libvdr-(.+)\.so\..+:\1:g')) + +# Reload DVB drivers on start. +RELOAD_DRIVERS='true' + +# Maximum number of retries when reloading drivers. +RELOAD_RETRIES='5' + +# Reload drivers until either this condition is met or RELOAD_RETRIES exceeded. +RELOAD_CONDITION='[ -e /dev/dvb/adapter0/frontend0 ]' + +# Number of seconds to wait after drivers unload but before load. +LOAD_DRIVERS_DELAY='0' + +# Number of seconds to wait after drivers load but before checking +# the RELOAD_CONDITION. +RELOAD_CONDITION_DELAY='5' + +# Number of seconds to wait before VDR start. +START_DELAY='0' diff -Nru vdr-2.1.6/debian/vdr-dev.docs vdr-2.1.6-297~3e4e445/debian/vdr-dev.docs --- vdr-2.1.6/debian/vdr-dev.docs 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr-dev.docs 2014-03-19 21:59:41.000000000 +0000 @@ -1,4 +1,3 @@ README* CONTRIBUTORS -PLUGINS.html -debian/patchinfo +PLUGINS.html \ No newline at end of file diff -Nru vdr-2.1.6/debian/vdr-dev.install vdr-2.1.6-297~3e4e445/debian/vdr-dev.install --- vdr-2.1.6/debian/vdr-dev.install 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr-dev.install 2014-03-19 21:59:41.000000000 +0000 @@ -1,16 +1,6 @@ usr/include -usr/lib/pkgconfig/vdr.pc +usr/lib/pkgconfig -Make.config usr/include/vdr/ - -PLUGINS/src/dvbhddevice/dvbhdffdevice.h usr/include/vdr/plugins/dvbhddevice/ -PLUGINS/src/dvbhddevice/hdffcmd.h usr/include/vdr/plugins/dvbhddevice/ +PLUGINS/src/dvbsddevice/*.h usr/include/vdr/plugins/dvbsddevice/ +PLUGINS/src/dvbhddevice/*.h usr/include/vdr/plugins/dvbhddevice/ PLUGINS/src/dvbhddevice/libhdffcmd/*.h usr/include/vdr/plugins/dvbhddevice/libhdffcmd/ - -PLUGINS/src/dvbsddevice/dvbsdffdevice.h usr/include/vdr/plugins/dvbsddevice/ - -debian/debianize-vdrplugin usr/bin/ - -debian/plugin-template/ usr/share/vdr-dev/ -debian/dependencies.sh usr/share/vdr-dev/ -debian/abi-version usr/share/vdr-dev diff -Nru vdr-2.1.6/debian/vdr-dev.links vdr-2.1.6-297~3e4e445/debian/vdr-dev.links --- vdr-2.1.6/debian/vdr-dev.links 1970-01-01 00:00:00.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr-dev.links 2014-03-19 21:59:41.000000000 +0000 @@ -0,0 +1,2 @@ +usr/include/vdr usr/include/vdr/include/vdr +usr/include/libsi usr/include/vdr/include/libsi diff -Nru vdr-2.1.6/debian/vdr-dev.manpages vdr-2.1.6-297~3e4e445/debian/vdr-dev.manpages --- vdr-2.1.6/debian/vdr-dev.manpages 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr-dev.manpages 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -debian/vdr-newplugin.1 -debian/debianize-vdrplugin.1 diff -Nru vdr-2.1.6/debian/vdr.dirs vdr-2.1.6-297~3e4e445/debian/vdr.dirs --- vdr-2.1.6/debian/vdr.dirs 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr.dirs 2014-03-19 21:59:41.000000000 +0000 @@ -1,3 +1 @@ -usr/lib/vdr/plugins -var/cache/vdr -var/lib/vdr/plugins +usr/lib/vdr/plugins \ No newline at end of file diff -Nru vdr-2.1.6/debian/vdr.docs vdr-2.1.6-297~3e4e445/debian/vdr.docs --- vdr-2.1.6/debian/vdr.docs 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr.docs 2014-03-19 21:59:41.000000000 +0000 @@ -2,5 +2,4 @@ CONTRIBUTORS MANUAL INSTALL -UPDATE* -debian/patchinfo +UPDATE* \ No newline at end of file diff -Nru vdr-2.1.6/debian/vdr.examples vdr-2.1.6-297~3e4e445/debian/vdr.examples --- vdr-2.1.6/debian/vdr.examples 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr.examples 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -channels.conf.* diff -Nru vdr-2.1.6/debian/vdr.groups vdr-2.1.6-297~3e4e445/debian/vdr.groups --- vdr-2.1.6/debian/vdr.groups 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr.groups 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -# -# 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 diff -Nru vdr-2.1.6/debian/vdr-groups.sh vdr-2.1.6-297~3e4e445/debian/vdr-groups.sh --- vdr-2.1.6/debian/vdr-groups.sh 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr-groups.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,115 +0,0 @@ -# -# 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 - - for file in $DIR/*; do - if [ "$file" != "$groups_file" ] ; then - needed_groups="$needed_groups `read_groups $file`" - fi - done - - 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 diff -Nru vdr-2.1.6/debian/vdr.init vdr-2.1.6-297~3e4e445/debian/vdr.init --- vdr-2.1.6/debian/vdr.init 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr.init 2014-03-19 21:59:41.000000000 +0000 @@ -1,150 +1,21 @@ -#! /bin/bash -p +#! /bin/sh # -# vdr start-stop script +# Video Disk Recorder (VDR) SysV script. +# +# Note: The script has been converted to Upstart job. # -### BEGIN INIT INFO -# Provides: vdr -# Required-Start: $remote_fs $network $syslog -# Required-Stop: $remote_fs $network $syslog -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: Starts the Linux Video Disk Recorder (VDR) -# Description: Starts the Linux Video Disk Recorder (VDR), -# if it is enabled in /etc/default/vdr. -### END INIT INFO -PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin -NAME=vdr -DESC="Linux Video Disk Recorder" - -DAEMON=/usr/sbin/runvdr -PIDFILE=/var/run/runvdr.pid -VDRPRG=/usr/bin/vdr - -test -x $DAEMON || exit 0 -test -x $VDRPRG || exit 0 - -. /usr/lib/vdr/config-loader.sh - -# Set shutdown command -test "$ENABLE_SHUTDOWN" = "1" && VDRSHUTDOWN="/usr/lib/vdr/vdr-shutdown.wrapper" \ - || VDRSHUTDOWN="" - -. /usr/lib/vdr/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 [ -n "$LIRC" ]; then - OPTIONS="--lirc=$LIRC $OPTIONS" - fi - if [ "$VFAT" == "1" ]; then - OPTIONS="--dirname=,,1 $OPTIONS" - fi - if [ "$CACHE_DIR" != "" ]; then - OPTIONS="--cachedir=$CACHE_DIR $OPTIONS" - fi - if [ "$RES_DIR" != "" ]; then - OPTIONS="--resdir=$RES_DIR $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 >/dev/null - rm -f $PIDFILE - clean_console - else - echo -n " - seems not to be running" - fi -} +JOB='vdr' 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 - ;; + start|stop|status) + $1 $JOB + ;; + restart) + stop $JOB > /dev/null 2>&1 + start $JOB + ;; + *) + echo "Usage: $0 {start|stop|restart|status}" + exit 1 esac - -exit 0 diff -Nru vdr-2.1.6/debian/vdr.install vdr-2.1.6-297~3e4e445/debian/vdr.install --- vdr-2.1.6/debian/vdr.install 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr.install 2014-03-19 21:59:41.000000000 +0000 @@ -1,36 +1,9 @@ -usr/bin/ +etc/init +etc/pm/sleep.d/vdr +etc/vdr/*.conf +usr/bin/* +usr/sbin/* +usr/share/locale usr/share/man -usr/share/locale/*/*/vdr.* - -var/lib/vdr/diseqc.conf etc/vdr/ -var/lib/vdr/keymacros.conf etc/vdr/ -var/lib/vdr/scr.conf etc/vdr/ -var/lib/vdr/sources.conf etc/vdr/ -var/lib/vdr/svdrphosts.conf etc/vdr/ -var/lib/vdr/*.conf usr/share/doc/vdr/examples/ - -epg2html usr/lib/vdr/ - -debian/runvdr usr/sbin/ - -debian/config-loader.sh usr/lib/vdr/ -debian/plugin-loader.sh usr/lib/vdr/ -debian/plugin-loader2 usr/lib/vdr/ -debian/commands-loader.sh usr/lib/vdr/ -debian/vdr-groups.sh usr/lib/vdr/ -debian/vdr-recordingaction usr/lib/vdr/ -debian/vdr-shutdown usr/lib/vdr/ -debian/vdr-shutdown.wrapper usr/lib/vdr/ - -debian/svdrpsend etc/bash_completion.d/ - -debian/vdr.groups etc/vdr/ -debian/R90.custom etc/vdr/recording-hooks/ -debian/S90.custom etc/vdr/shutdown-hooks/ -debian/order.conf etc/vdr/plugins/ -debian/commands.custom.conf etc/vdr/command-hooks/ -debian/reccmds.custom.conf etc/vdr/command-hooks/ - -debian/commands.update-recordings.conf usr/share/vdr/command-hooks/ - -debian/themes/*.theme var/lib/vdr/themes/ +var/cache/vdr +var/lib/video.00 \ No newline at end of file diff -Nru vdr-2.1.6/debian/vdr.links vdr-2.1.6-297~3e4e445/debian/vdr.links --- vdr-2.1.6/debian/vdr.links 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr.links 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -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/scr.conf var/lib/vdr/scr.conf -etc/vdr/sources.conf var/lib/vdr/sources.conf -etc/vdr/svdrphosts.conf var/lib/vdr/svdrphosts.conf - -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 diff -Nru vdr-2.1.6/debian/vdr.lintian-overrides vdr-2.1.6-297~3e4e445/debian/vdr.lintian-overrides --- vdr-2.1.6/debian/vdr.lintian-overrides 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -vdr: package-contains-upstream-install-documentation usr/share/doc/vdr/INSTALL.gz diff -Nru vdr-2.1.6/debian/vdr.manpages vdr-2.1.6-297~3e4e445/debian/vdr.manpages --- vdr-2.1.6/debian/vdr.manpages 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr.manpages 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -debian/runvdr.8 diff -Nru vdr-2.1.6/debian/vdr-newplugin.1 vdr-2.1.6-297~3e4e445/debian/vdr-newplugin.1 --- vdr-2.1.6/debian/vdr-newplugin.1 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr-newplugin.1 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -.\" 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 <pluginname> - -.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 <thomas@thsnet.de> -.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. diff -Nru vdr-2.1.6/debian/vdr.NEWS vdr-2.1.6-297~3e4e445/debian/vdr.NEWS --- vdr-2.1.6/debian/vdr.NEWS 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr.NEWS 1970-01-01 00:00:00.000000000 +0000 @@ -1,100 +0,0 @@ -vdr (1.7.17-1) unstable; urgency=low - - * Changed Full Featured DVB card support - - Starting with VDR 1.7 support for full featured DVB cards (the ones with - built-in SDTV video output) requires one to install an extra plug-in provided - by the vdr-plugin-dvbsddevice package. - - Please also note, that proper trick speed playback with a full featured DVB - card needs an improved av7110 firmware. Without this firmware you might - experience problems like jumping backwards when stopping fast-forward playback. - The improved firmware is provided by Oliver Endriss and can be download here: - - http://www.escape-edv.de/endriss/firmware/ - - * Dropped vdr-* scripts - - The vdr-daemon, vdr-lirc and vdr-rcu wrapper scripts as well as the vdr-kbd - binary have been removed from the package. Please use /use/bin/vdr with the - options "--no-kbd", "--lirc" and "--rcu" instead. - - -- Tobias Grimm <etobi@debian.org> Sat, 01 Jan 2011 16:24:50 +0100 - -vdr (1.4.7-1) experimental; urgency=low - - The script /usr/lib/vdr/vdr-groups.sh may now be used by plugins to - manage the group memberships of the user 'vdr'. See README.Debian - for details on how to use this script. - - If you manually need to add the user 'vdr' to a group, you should - add the group name to /etc/vdr/vdr-groups. This way the vdr-groups.sh - script used by plugin installation/deinstallation procedures does - not try to remove vdr from this group. - - -- Tobias Grimm <tg@e-tobi.net> Sun, 6 May 2007 20:43:44 +0200 - -vdr (1.2.6-9) experimental; urgency=low - - This release adds a patch which allows us to have just one binary- - package for all four control-methods, so we do not need the - packages vdr-daemon, vdr-kbd, vdr-lirc and vdr-rcu anymore. - You can run vdr with the control-method you want by calling - /usr/bin/vdr-{daemon,kbd,lirc,rcu} or by using - - update-alternatives --config vdr - - and setting it to the desired control-method. (lirc is default) - After this a call of /usr/bin/vdr will always use the control- - method you selected with update-alternatives. - - -- Thomas Schmidt <tschmidt@debian.org> Sun, 27 Feb 2005 00:44:05 +0100 - -vdr (1.2.6-6) unstable; urgency=low - - The most important change in this release is that vdr from now on - will run under the username vdr, not as root. This is due to some - security problems when vdr runs as root. The video-directory and - configfiles will be changed at installation, so they are owned by - the user and group vdr. - - The second thing is that the automatic shutdown of vdr is now disabled - by default, you can enable it again by changing ENABLE_SHUTDOWN to 1 - in /etc/default/vdr. - - In this release we also changed the default VIDEO_DIR from - /var/lib/video to /var/lib/video.00, to make adding extra harddisks - for vdr very easy by just creating /var/lib/video.0{1,2,3,...} and - mounting the drive(s) there. In existing installations we will simply - create a symlink /var/lib/video.00 which points to /var/lib/video. In - new installations /var/lib/video will be a symlink which points to - /var/lib/video.00. (These changes will only be asked for when you - selected yes in the debconf-question to create the video-directory!) - - -- Thomas Schmidt <tschmidt@debian.org> Fri, 14 Jan 2005 12:17:51 +0100 - -vdr (1.2.6-4) unstable; urgency=low - - This is the first release from the VDR and DVB Packaging Team - <pkg-vdr-dvb-devel@lists.alioth.debian.org> - Many thanks to Tobias Grimm and Thomas Günther for the various improvements - of the package. - - In this Release, we changed the path of the conf-files to /var/lib/vdr, - static conf-files will still be under /etc/vdr, and symlinked to - /var/lib/vdr. - If you already have non-static files (channels.conf, remote.conf, - setup.conf and timers.conf), these files will be moved by the - postinst-script to /var/lib/vdr. - - The most important change in this release is the new init-system of vdr, - which was taken from c't-vdr, a woody-based distribution, optimized for vdr. - - Plugins are no longer loaded via /etc/default/vdr. Instead of this, - every installed plugin will be loaded automatically. The order of the - plugins can be configured via /etc/vdr/plugins/order.conf. - - The commands.conf and the reccmds.conf files will be auto-generated - by the init-script for better integration of vdr-addons. - If you already have a commands.conf or reccmds.conf, you should move it - to /etc/vdr/command-hooks/{commands|reccmds}.custom.conf . - - -- Thomas Schmidt <tschmidt@debian.org> Sat, 29 May 2004 19:43:49 +0200 diff -Nru vdr-2.1.6/debian/.vdr-patches vdr-2.1.6-297~3e4e445/debian/.vdr-patches --- vdr-2.1.6/debian/.vdr-patches 2014-04-22 19:22:38.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/.vdr-patches 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -04_newplugin.patch:4b1964ee4ebf7c793333151d299c0611 -06_default_svdrp_port_0.patch:8d5ae3afa660d727237cde0cfec4b8d5 -81_Make_config.patch:0c7ea8e353c4c4403290d39b7be7db5f -99_ncursesw-include.patch:7a408b2f76b2d2d6e08caf47e91c469c -opt-24_jumpplay.patch:4361b7bb723b11fc6a7fbe5042038384 -opt-37-x_menuorg.patch:65581c86a52f534d23c1046887d49544 -opt-42-x_MainMenuHooks-v1.0.1.patch:6e9893507448c563fc1a515f6fefd424 -opt-50_graphtft.patch:5107c4989569cb4b7646e4b6fc2edb43 -opt-56_eventdetails_v3.patch:e2ff963982af0673b0436d3f7f6c2048 -opt-57_vdr-remote_instant_recordings.patch:a6adcadd90c13a201145ca9f9e402ed4 -opt-61_dynamite.patch:7ae0a8bb7782424c3ea1cb1fb2fb9463 -opt-65_pin.patch:f0177e4b789ad269cb696aa6c05be4d9 -opt-66_jumpingseconds.patch:6735eb7409071cbd24780a6c12674ac2 -xprmtl-02_permashift-0.5.4.patch:3b89f9f556623ed6ec96b1a58a91a13a -xprmtl-03_hide-first-recording-level-v3.patch:585313aedd38fc0d4ac15ca089d3659f -vdr-2.1.6-conf.d-v6.diff:49e4d191dc83a121ce585323d65144fe diff -Nru vdr-2.1.6/debian/vdr-plugin-dvbhddevice.install vdr-2.1.6-297~3e4e445/debian/vdr-plugin-dvbhddevice.install --- vdr-2.1.6/debian/vdr-plugin-dvbhddevice.install 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr-plugin-dvbhddevice.install 2014-03-19 21:59:41.000000000 +0000 @@ -1,2 +1 @@ usr/lib/vdr/plugins/libvdr-dvbhddevice.so.* -usr/share/locale/*/*/vdr-dvbhddevice.* \ No newline at end of file diff -Nru vdr-2.1.6/debian/vdr-plugin-examples.examples vdr-2.1.6-297~3e4e445/debian/vdr-plugin-examples.examples --- vdr-2.1.6/debian/vdr-plugin-examples.examples 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr-plugin-examples.examples 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -PLUGINS/src/pictures/pic2mpg diff -Nru vdr-2.1.6/debian/vdr-plugin-examples.install vdr-2.1.6-297~3e4e445/debian/vdr-plugin-examples.install --- vdr-2.1.6/debian/vdr-plugin-examples.install 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr-plugin-examples.install 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -usr/lib/vdr/plugins/libvdr-hello.so.* -usr/lib/vdr/plugins/libvdr-osddemo.so.* -usr/lib/vdr/plugins/libvdr-svccli.so.* -usr/lib/vdr/plugins/libvdr-svcsvr.so.* -usr/lib/vdr/plugins/libvdr-skincurses.so.* -usr/lib/vdr/plugins/libvdr-status.so.* -usr/lib/vdr/plugins/libvdr-svdrpdemo.so.* -usr/lib/vdr/plugins/libvdr-pictures.so.* -usr/lib/vdr/plugins/libvdr-rcu.so.* - -usr/share/locale/*/*/vdr-hello.* -usr/share/locale/*/*/vdr-skincurses.* -usr/share/locale/*/*/vdr-pictures.* diff -Nru vdr-2.1.6/debian/vdr-plugin-examples.lintian-overrides vdr-2.1.6-297~3e4e445/debian/vdr-plugin-examples.lintian-overrides --- vdr-2.1.6/debian/vdr-plugin-examples.lintian-overrides 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr-plugin-examples.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -vdr-plugin-examples: hardening-no-fortify-functions usr/lib/vdr/plugins/libvdr-pictures.so.* diff -Nru vdr-2.1.6/debian/vdr.postinst vdr-2.1.6-297~3e4e445/debian/vdr.postinst --- vdr-2.1.6/debian/vdr.postinst 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr.postinst 2014-03-19 21:59:41.000000000 +0000 @@ -1,93 +1,19 @@ #! /bin/sh -# postinst script for vdr -# -# see: dh_installdeb(1) - set -e -# summary of how this script can be called: -# * <postinst> `configure' <most-recently-configured-version> -# * <old-postinst> `abort-upgrade' <new version> -# * <conflictor's-postinst> `abort-remove' `in-favour' <package> -# <new-version> -# * <deconfigured's-postinst> `abort-deconfigure' `in-favour' -# <failed-install-package> <version> `removing' -# <conflicting-package> <version> -# 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'. - +USER='vdr' +GROUP='vdr' case "$1" in configure) - - # install/move channels.conf - if [ ! -e /var/lib/vdr/channels.conf ]; then - cp /usr/share/doc/vdr/examples/channels.conf* /var/lib/vdr/ - gunzip /var/lib/vdr/channels.conf*.gz - fi - - [ ! -d /var/lib/video.00 ] && mkdir /var/lib/video.00 - [ ! -d /srv/vdr/video.00 ] && mkdir -p /srv/vdr/video.00 - - # 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 --gid 666 --system $GROUP - echo "..done" - fi - if ! getent passwd | grep -q "^$USER:"; then - echo -n "Adding user $USER.." - adduser --system --uid 666 --home /var/lib/vdr --shell /bin/false \ - --gecos "VDR user" --no-create-home \ - --disabled-login --disabled-password \ - --ingroup $GROUP \ - $USER - echo "...done" - fi - - # put vdr in group video so that it can access the DVB device nodes - adduser $USER video > /dev/null || true - - # ensure that vdr's config and recording files are correctly owned - [ -e /var/lib/video ] && chown -R $USER:$GROUP /var/lib/video/ - [ -e /var/lib/video.00 ] && chown -R $USER:$GROUP /var/lib/video.00/ - if [ -e /srv/vdr/video.00 ] ; then - chown -R $USER:$GROUP /srv/vdr/video.00/ > /dev/null 2>&1 || true - fi - 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 - - # set execution bit for /etc/vdr/recording-hooks/R90.custom - chmod +x /etc/vdr/recording-hooks/R90.custom > /dev/null 2>&1 || true - - # 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 - - # Dropped alternatives from old package version - # (This can be dropped at squeeze +2) - #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 + addgroup --quiet --system $GROUP || true + adduser --system --home /var/lib/vdr --shell /bin/false \ + --gecos "VDR user" --no-create-home \ + --disabled-login --disabled-password \ + --ingroup $GROUP $USER > /dev/null 2>&1 || true + adduser $USER video > /dev/null 2>&1 || true + adduser $USER dialout > /dev/null 2>&1 || true + chown -R $USER:$GROUP /etc/vdr ;; abort-upgrade|abort-remove|abort-deconfigure) @@ -98,10 +24,3 @@ exit 1 ;; esac - -# dh_installdeb will replace this with shell code automatically -# generated by other debhelper scripts. - -#DEBHELPER# - -exit 0 diff -Nru vdr-2.1.6/debian/vdr.postrm vdr-2.1.6-297~3e4e445/debian/vdr.postrm --- vdr-2.1.6/debian/vdr.postrm 2014-04-23 16:36:11.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr.postrm 2014-03-19 21:59:41.000000000 +0000 @@ -1,50 +1,22 @@ #! /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 +USER='vdr' +GROUP='vdr' 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 -rf /var/lib/vdr/themes > /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 - ;; - upgrade) - ;; -# remove|failed-upgrade|abort-install|abort-upgrade|disappear) -# dpkg-divert --package vdr --remove --rename \ -# --divert /etc/init/vdr.conf.dontremove /etc/init/vdr.conf -# ;; - *) - echo "postrm called with unknown argument \`$1'" >&2 - exit 1 + purge|remove) + if [ "$1" = 'purge' ] + then + stop vdr 2>/dev/null || true + groupdel $GROUP 2>/dev/null || true + userdel -rf $USER 2>/dev/null || true + rm -rf /etc/vdr/themes + rm -f /etc/vdr/timers.conf + rm -rf /var/cache/vdr + rm -rf /var/lib/video.00 + fi + + rm -f /var/run/vdr.* + rm -f /var/log/upstart/vdr.* ;; esac - -# dh_installdeb will replace this with shell code automatically -# generated by other debhelper scripts. - -#DEBHELPER# - -exit 0 diff -Nru vdr-2.1.6/debian/vdr.preinst vdr-2.1.6-297~3e4e445/debian/vdr.preinst --- vdr-2.1.6/debian/vdr.preinst 2014-04-23 16:27:49.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr.preinst 2014-03-19 21:59:41.000000000 +0000 @@ -1,6 +1,9 @@ -#!/bin/sh +#! /bin/sh +set -e -#if [ install = "$1" -o upgrade = "$1" ]; then -# dpkg-divert --package vdr --add --rename \ -# --divert /etc/init/vdr.conf.dontremove /etc/init/vdr.conf -#fi +if grep -q 'BEGIN INIT INFO' /etc/init.d/vdr > /dev/null 2>&1 +then + # Remove obsolete SysV links + /etc/init.d/vdr stop > /dev/null 2>&1 || true + update-rc.d -f vdr remove > /dev/null 2>&1 || true +fi diff -Nru vdr-2.1.6/debian/vdr.prerm vdr-2.1.6-297~3e4e445/debian/vdr.prerm --- vdr-2.1.6/debian/vdr.prerm 1970-01-01 00:00:00.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr.prerm 2014-03-19 21:59:41.000000000 +0000 @@ -0,0 +1,8 @@ +#!/bin/sh + +case "$1" in + remove) + stop vdr > /dev/null 2>&1 || true + ;; +esac + diff -Nru vdr-2.1.6/debian/vdr-recordingaction vdr-2.1.6-297~3e4e445/debian/vdr-recordingaction --- vdr-2.1.6/debian/vdr-recordingaction 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr-recordingaction 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -#!/bin/sh -# -# VDR Recording Action Script - Tobias Grimm <tg@e-tobi.net> -# --------------------------- -# -# This script gets executed by VDR before a recording starts, after a -# recording ends and after a recording has been edited. -# In order to allow other addons to hook into this process, this script will -# search for any executables in /usr/share/vdr/recording-hooks. These -# hooks are called in their alphabetical order and should follow this -# naming scheme: -# -# R<XX>.<identifier> -# -# Where <XX> is a two digit number, that mainly specifies the execution order -# and <identifier> is a unique descriptor. -# -# Two parameters are passed to each recording hook: -# -# Parameter 1 can have the values "before", "after" and "edited", depending -# on whether the recording hook is called before the recording starts, -# after the recording ends or after the recording has been edited. -# -# Parameter 2 is the directory of the recording. Be aware, that this directory -# doesn't exist before the recording starts. -# - -REC_HOOKS_DIR=/usr/share/vdr/recording-hooks - -recordinghooks=`find $REC_HOOKS_DIR -maxdepth 1 -xtype f | sort` - -for recordinghook in $recordinghooks; do - case $1 in - before|after) - action="$1 recording $2" - ;; - edited) - action="after cutting recording $2 from $3" - ;; - 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 diff -Nru vdr-2.1.6/debian/vdr-shutdown vdr-2.1.6-297~3e4e445/debian/vdr-shutdown --- vdr-2.1.6/debian/vdr-shutdown 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr-shutdown 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ -#!/bin/sh -# -# VDR Shutdown Script - Tobias Grimm <tg@e-tobi.net> -# ------------------- -# -# see README.Debian -# - -. /usr/lib/vdr/config-loader.sh - -SHUTDOWN_HOOKS_DIR=/usr/share/vdr/shutdown-hooks/ - -log="logger -t vdr-shutdown" -svdrpsend="/usr/bin/svdrpsend" - -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 & diff -Nru vdr-2.1.6/debian/vdr-shutdown-wrapper.c vdr-2.1.6-297~3e4e445/debian/vdr-shutdown-wrapper.c --- vdr-2.1.6/debian/vdr-shutdown-wrapper.c 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr-shutdown-wrapper.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -#include <unistd.h> - -int main (int argc, char *argv[]) { - setuid(0); - return execv("/usr/lib/vdr/vdr-shutdown", argv); -} diff -Nru vdr-2.1.6/debian/vdr.templates vdr-2.1.6-297~3e4e445/debian/vdr.templates --- vdr-2.1.6/debian/vdr.templates 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr.templates 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -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. diff -Nru vdr-2.1.6/debian/vdr.upstart vdr-2.1.6-297~3e4e445/debian/vdr.upstart --- vdr-2.1.6/debian/vdr.upstart 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/vdr.upstart 1970-01-01 00:00:00.000000000 +0000 @@ -1,83 +0,0 @@ -# Starts the vdr, with config and installed plugins - -description "VDR upstart script" -author "Steffen Barszus <steffenbpunkt@gmail.com>" -author "Lars Hanisch <dvb@flensrocker.de>" - -start on ((filesystem and started dbus and started udev and static-network-up) \ - or (stopped vdr RESULT=failed EXIT_SIGNAL=?* \ - or stopped vdr RESULT=failed EXIT_STATUS!=[02]) \ - or resume) -stop on runlevel [!2345] - -kill timeout 60 - -# "expect stop" must be enabled if "dbus2vdr --upstart" is used -# "expect stop" must not be enabled if "dbus2vdr --upstart" is not used -# The Upstart job will hang if you don't pay attention to this -#expect stop - -normal exit 0 -nice -10 - -pre-start script - -. /usr/lib/vdr/config-loader.sh -if [ "$ENABLED" = "0" ] ; then - echo "aborted (to enable the daemon, edit /etc/default/vdr)" - exit 2 -fi - -end script - -script - -. /usr/lib/vdr/config-loader.sh - -# Set shutdown command -test "$ENABLE_SHUTDOWN" = "1" && VDRSHUTDOWN="/usr/lib/vdr/vdr-shutdown.wrapper" \ - || VDRSHUTDOWN="" - -. /usr/lib/vdr/commands-loader.sh - -mergecommands "commands" -mergecommands "reccmds" - -VDR_APIVERSION=$(/usr/bin/vdr -V -L/usr/bin/vdr 2>/dev/null | sed 's/.*(\(.*\)).*/\1/' | sed 's:.*/::') -PLUGINS=$(/usr/lib/vdr/plugin-loader2 --apiversion=$VDR_APIVERSION --confdir=$PLUGIN_CFG_DIR --libdir=$PLUGIN_DIR) - - -if [ -n "$LIRC" ]; then - OPTIONS="--lirc=$LIRC $OPTIONS" -fi -if [ "$VFAT" = "1" ]; then - OPTIONS="--dirnames=,,1 $OPTIONS" -fi -if [ "$CACHE_DIR" != "" ]; then - OPTIONS="--cachedir=$CACHE_DIR $OPTIONS" -fi -if [ "$RES_DIR" != "" ]; then - OPTIONS="--resdir=$RES_DIR $OPTIONS" -fi - -# enable debug measures -if [ -f /etc/init/vdr-dbg.conf ]; then - ulimit -c unlimited - OPTIONS="$OPTIONS --userdump" - echo "/var/log/vdr/core.%p" > /proc/sys/kernel/core_pattern -fi - -# set language (default by environment, else by /etc/default/vdr) -LANG=$VDR_LANG -LC_ALL=$VDR_LANG -export LANG LC_ALL - -if [ -n "$VDR_CHARSET_OVERRIDE" ] ; then - export VDR_CHARSET_OVERRIDE=$VDR_CHARSET_OVERRIDE -fi - -export HOME=/var/lib/vdr - -eval exec /usr/bin/vdr -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 - -end script diff -Nru vdr-2.1.6/debian/watch vdr-2.1.6-297~3e4e445/debian/watch --- vdr-2.1.6/debian/watch 2014-03-23 15:35:16.000000000 +0000 +++ vdr-2.1.6-297~3e4e445/debian/watch 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -version=2 -ftp://ftp.tvdr.de/vdr/vdr-([\d\.]+)\.tar\.bz2 -#ftp://ftp.tvdr.de/vdr/Developer/vdr-([\d\.]+)\.tar\.bz2