mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
Compare commits
No commits in common. "master" and "1.5.3" have entirely different histories.
1779
CONTRIBUTORS
1779
CONTRIBUTORS
File diff suppressed because it is too large
Load Diff
@ -1,34 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
# Filter source files for use with Doxygen.
|
||||
#
|
||||
# Escapes special characters in comments marked with "///<".
|
||||
#
|
||||
# Usage: Doxyfile.filter filename
|
||||
#
|
||||
# See the main source file 'vdr.c' for copyright information and
|
||||
# how to reach the author.
|
||||
#
|
||||
# $Id: Doxyfile.filter 2.1 2013/02/17 10:54:05 kls Exp $
|
||||
|
||||
$TAG = "///<";
|
||||
|
||||
while (<>) {
|
||||
$t = $_;
|
||||
$p = index($t, $TAG);
|
||||
if ($p >= 0) {
|
||||
$p += length($TAG);
|
||||
print substr($t, 0, $p);
|
||||
$quote = 0;
|
||||
while (1) {
|
||||
$s = substr($t, $p++, 1);
|
||||
last if ($s eq "");
|
||||
$quote ^= 1 if ($s eq '"');
|
||||
print "\\" if (!$quote && $s =~ /[\\\@<>]/);
|
||||
print $s;
|
||||
}
|
||||
}
|
||||
else {
|
||||
print $t;
|
||||
}
|
||||
}
|
258
INSTALL
258
INSTALL
@ -1,7 +1,7 @@
|
||||
Installation of the Video Disk Recorder
|
||||
---------------------------------------
|
||||
|
||||
Version 2.7
|
||||
Version 1.5
|
||||
-----------
|
||||
|
||||
Compiling and running the program:
|
||||
@ -16,30 +16,27 @@ to Make.config and adjust the definition of DVBDIR in that file.
|
||||
|
||||
Refer to http://linuxtv.org for more information about the Linux-DVB driver.
|
||||
|
||||
VDR requires the Linux-DVB driver version that supports the S2API interface.
|
||||
VDR requires the Linux-DVB driver version dated 2003-08-23 or higher
|
||||
to work properly.
|
||||
|
||||
You will also need to install the following libraries, as well as their
|
||||
"devel" packages to get the necessary header files for compiling VDR:
|
||||
|
||||
fontconfig
|
||||
freetype2
|
||||
fribidi (see "BiDi support" below)
|
||||
gettext
|
||||
libcap
|
||||
libjpeg
|
||||
|
||||
If the "capability" module is not compiled into your kernel, you may
|
||||
need to do "modprobe capability" before running VDR.
|
||||
|
||||
When running VDR, the Freetype fonts must be installed in the directory
|
||||
/usr/share/fonts/truetype.
|
||||
|
||||
After extracting the package, change into the VDR directory
|
||||
and type 'make'. This should produce an executable file
|
||||
named 'vdr', which can be run after the DVB driver has been
|
||||
installed.
|
||||
|
||||
If you want to build a 32-bit version of VDR on a 64-bit machine, you can
|
||||
use 'make M32=1' to do so. Note that you also need to have a Make.config file
|
||||
(derived from Make.config.template) to make this work.
|
||||
|
||||
IMPORTANT: See "Configuration files" below for information on how
|
||||
========= to set up the configuration files at the proper location!
|
||||
|
||||
@ -47,41 +44,47 @@ By default the 'vdr' program can be controlled via the PC keyboard.
|
||||
If you want to disable control via the keyboard, you can add NO_KBD=1
|
||||
to the 'make' call, or use the '--no-kbd' option at runtime.
|
||||
|
||||
If you have a LIRC compatible infrared remote control receiver you can define
|
||||
the REMOTE macro to one of the following values in the 'make' call to make
|
||||
the respective control the default:
|
||||
If you have an infrared remote control unit you can define the REMOTE macro
|
||||
to one of the following values in the 'make' call to make the respective control
|
||||
the default:
|
||||
|
||||
REMOTE=RCU control via the "Remote Control Unit" receiver
|
||||
(see http://www.cadsoft.de/vdr/remote.htm)
|
||||
REMOTE=LIRC control via the "Linux Infrared Remote Control"
|
||||
(see http://www.lirc.org)
|
||||
|
||||
Alternatively you can use the '--lirc' option at runtime.
|
||||
This option accepts an optional path to the remote control device,
|
||||
the default of which can be set via the LIRC_DEVICE macro.
|
||||
Alternatively you can use the '--rcu' or '--lirc' options at runtime.
|
||||
These options accept an optional path to the remote control device,
|
||||
the defaults of which can be set via the RCU_DEVICE and LIRC_DEVICE macros,
|
||||
respectively.
|
||||
|
||||
If you want to make your video directory available to other machines that
|
||||
have limitations on directory name lengths and/or allowed characters in
|
||||
directory names, you can call VDR with the command line option '--dirnames'
|
||||
(see man vdr(1) for details).
|
||||
If your video directory will be on a VFAT partition, add the compile
|
||||
time switch
|
||||
|
||||
VFAT=1
|
||||
|
||||
to the 'make' command. Alternatively, you can call VDR with the command
|
||||
line option '--vfat'.
|
||||
|
||||
When running, the 'vdr' program writes status information into the
|
||||
system log file, which is usually /var/log/messages (or /var/log/user.log,
|
||||
depending on your syslog configuration). You may want to watch these
|
||||
messages (tail -f /var/log/messages) to see if there are any problems.
|
||||
system log file (/var/log/messages). You may want to watch these
|
||||
messages (tail -f /var/log/mesages) to see if there are any problems.
|
||||
|
||||
The program can be controlled via a network connection to its SVDRP
|
||||
port ("Simple Video Disk Recorder Protocol"). By default, it listens
|
||||
on port 6419 (use the --port=PORT option to change this). For details
|
||||
on port 2001 (use the --port=PORT option to change this). For details
|
||||
about the SVDRP syntax see the source file 'svdrp.c'.
|
||||
|
||||
WARNING: DUE TO THE OPEN SVDRP PORT THIS PROGRAM MAY CONSTITUTE A
|
||||
======= POTENTIAL SECURITY HAZARD! IF YOU ARE NOT RUNNING VDR IN
|
||||
A CONTROLLED ENVIRONMENT, YOU MAY WANT TO DISABLE SVDRP
|
||||
BY USING '--port=0'!
|
||||
|
||||
The file 'svdrphosts.conf' can be used to define which hosts are allowed
|
||||
to access the SVDRP port. By default only localhost (127.0.0.1) is granted
|
||||
access. If you want to give other hosts access to your SVDRP port you need to
|
||||
add their IP numbers to 'svdrphosts.conf'.
|
||||
|
||||
You can disable SVDRP access entirely by either running VDR with '--port=0',
|
||||
or by removing all entries (including 127.0.0.1 for the localhost) from
|
||||
'svdrphosts.conf'.
|
||||
|
||||
If the program shall run as a daemon, use the --daemon option. This
|
||||
will completely detach it from the terminal and will continue as a
|
||||
background process.
|
||||
@ -93,33 +96,6 @@ vdr:123:respawn:/usr/local/bin/vdr --terminal=/dev/tty8 -w 60
|
||||
|
||||
See the man page vdr(1) for complete information about all command line options.
|
||||
|
||||
Output devices
|
||||
--------------
|
||||
|
||||
VDR by itself doesn't produce any audio or video output. In order to watch
|
||||
live tv or recordings, you will need to use a plugin that supports the actual
|
||||
hardware in your system, for instance:
|
||||
|
||||
Plugin: Device:
|
||||
|
||||
dvbsddevice Full-Featured SD DVB cards (Fujitsu-Siemens Design)
|
||||
ftp://ftp.tvdr.de/vdr/Plugins
|
||||
dvbhddevice Full-featured HD DVB cards (Technotrend TT S2-6400)
|
||||
https://bitbucket.org/powARman/dvbhddevice
|
||||
rpihddevice Raspberry Pi
|
||||
https://projects.vdr-developer.org/git/vdr-plugin-rpihddevice.git
|
||||
|
||||
See https://linuxtv.org/vdrwiki/index.php/Output_devices for more.
|
||||
|
||||
Standard compliance
|
||||
-------------------
|
||||
|
||||
Basically VDR works according to the DVB standard, but there are countries/providers
|
||||
that use other standards, which in some details deviate from the DVB standard.
|
||||
This makes it necessary to handle things differently in some areas, depending on
|
||||
which standard is actually used. If this is the case in your area, you may need
|
||||
to adjust the option "DVB/Standard compliance" in the Setup menu accordingly.
|
||||
|
||||
Locale
|
||||
------
|
||||
|
||||
@ -138,35 +114,8 @@ in the log file, it is sufficient to just set
|
||||
which only influences the way strings are sorted and leaves error messages
|
||||
in English.
|
||||
|
||||
Note that for VDR's internationalized texts to work, the LANG environment
|
||||
variable must be set to a valid locale!
|
||||
|
||||
BiDi support
|
||||
------------
|
||||
|
||||
Some languages are written right-to-left. In order to display such languages
|
||||
correctly, you need to build VDR with BIDI=1. This will link to the "fribidi"
|
||||
library and implement a function that prepares bidirectional texts to be
|
||||
displayed correctly. Since BiDi support adds some runtime overhead by requiring
|
||||
additional memory allocation and copying, this feature is not compiled in
|
||||
by default, so that users that have no need for this don't get any overhead.
|
||||
|
||||
Workaround for providers not encoding their DVB SI table strings correctly
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
According to "ETSI EN 300 468" the default character set for SI data is
|
||||
ISO6937. But unfortunately some broadcasters actually use ISO-8859-9 or
|
||||
other encodings, but fail to correctly announce that.
|
||||
Users who want to set the default character set to something different can
|
||||
do this by using the command line option --chartab with something
|
||||
like ISO-8859-9.
|
||||
|
||||
Start script with automatic restart in case of hangups:
|
||||
-------------------------------------------------------
|
||||
|
||||
The VDR source directory contains a 'runvdr.template'. Just copy it as 'runvdr'
|
||||
into your /usr/bin or /usr/local/bin directory and adjust it to your particular
|
||||
requirements. (See the comments inside the script for more information.)
|
||||
Automatic restart in case of hangups:
|
||||
-------------------------------------
|
||||
|
||||
If you run VDR using the 'runvdr' shell script it will use the built-in
|
||||
watchdog timer to restart the program in case something happens that
|
||||
@ -175,6 +124,9 @@ call to the VDR program, be sure to NOT use the '-d' option! Otherwise
|
||||
VDR will go into 'daemon' mode and the initial program call will return
|
||||
immediately! 'runvdr' needs to be started as user 'root'. Use the '-u'
|
||||
option to run the actual 'vdr' program under a different user id.
|
||||
Note that the 'runvdr' script needs to be adjusted to your particular
|
||||
requirements before you can actually use it. See the comments inside
|
||||
the script for more information.
|
||||
|
||||
Setting the system time:
|
||||
------------------------
|
||||
@ -264,27 +216,19 @@ Executing commands before and after a recording:
|
||||
------------------------------------------------
|
||||
|
||||
You can use the '-r' option to define a program or script that gets called
|
||||
at various stages of handling recordings.
|
||||
before and after a recording is performed, and after an editing process
|
||||
has finished.
|
||||
|
||||
The program will be called with two or three string parameters.
|
||||
The first parameter is one of
|
||||
The program will be called with two string parameters. The first parameter
|
||||
is one of
|
||||
|
||||
before if this is *before* a recording starts
|
||||
started if this is after a recording has *started*
|
||||
after if this is *after* a recording has finished
|
||||
editing if this is before *editing* a recording
|
||||
edited if this is after a recording has been *edited*
|
||||
deleted if this is after a recording has been *deleted*
|
||||
copying if this is before *copying* a recording
|
||||
copied if this is after a recording has been *copied*
|
||||
renamed if this is after a recording has been *renamed*
|
||||
moved if this is after a recording has been *moved*
|
||||
(note that a move across file system borders triggers a sequence
|
||||
of "copying", "copied" and "deleted")
|
||||
|
||||
and the second and third parameter (if present) contain the full name of the recording's
|
||||
and the second parameter contains the full name of the recording's
|
||||
directory (which may not yet exists at that moment in the "before" case).
|
||||
See the example below for the exact meaning of these parameters.
|
||||
In the "edited" case it will be the name of the edited version.
|
||||
|
||||
Within this program you can do anything you would like to do before and/or
|
||||
after a recording or after an editing process. However, the program must return
|
||||
@ -300,38 +244,11 @@ case "$1" in
|
||||
before)
|
||||
echo "Before recording $2"
|
||||
;;
|
||||
started)
|
||||
echo "Started recording $2"
|
||||
;;
|
||||
after)
|
||||
echo "After recording $2"
|
||||
;;
|
||||
editing)
|
||||
echo "Editing recording $2"
|
||||
echo "Source recording $3"
|
||||
;;
|
||||
edited)
|
||||
echo "Edited recording $2"
|
||||
echo "Source recording $3"
|
||||
;;
|
||||
deleted)
|
||||
echo "Deleted recording $2"
|
||||
;;
|
||||
copying)
|
||||
echo "Destination recording $2"
|
||||
echo "Source recording $3"
|
||||
;;
|
||||
copied)
|
||||
echo "Destination recording $2"
|
||||
echo "Source recording $3"
|
||||
;;
|
||||
renamed)
|
||||
echo "New name of recording $2"
|
||||
echo "Old name of recording $3"
|
||||
;;
|
||||
moved)
|
||||
echo "New path of recording $2"
|
||||
echo "Old path of recording $3"
|
||||
;;
|
||||
*)
|
||||
echo "ERROR: unknown state: $1"
|
||||
@ -357,7 +274,7 @@ This program must be given to VDR with the '-a' option, as in
|
||||
The video data directory:
|
||||
-------------------------
|
||||
|
||||
All recordings are written into directories below "/srv/vdr/video". Please
|
||||
All recordings are written into directories below "/video". Please
|
||||
make sure this directory exists, and that the user who runs the 'vdr'
|
||||
program has read and write access to that directory.
|
||||
If you prefer a different location for your video files, you can use
|
||||
@ -368,22 +285,39 @@ multiple slashes).
|
||||
Note that the file system need not be 64-bit proof, since the 'vdr'
|
||||
program splits video files into chunks of about 2GB. You should use
|
||||
a disk with several gigabytes of free space. One GB can store roughly
|
||||
half an hour of SD video data, or 10 minutes of HD video.
|
||||
Either use one of today's large terabyte disks (preferably with a backup disk
|
||||
in a RAID-1 array), or use something like "mhddfs" to group several disks
|
||||
into one large volume.
|
||||
half an hour of video data.
|
||||
|
||||
Note that you should not copy any non-VDR files into the video directory,
|
||||
If you have more than one disk and don't want to combine them to form
|
||||
one large logical volume, you can set up several video directories as
|
||||
mount points for these disks. All of these directories must have the
|
||||
same basic name and must end with a numeric part, which starts at 0 for
|
||||
the main directory and has increasing values for the rest of the
|
||||
directories. For example
|
||||
|
||||
/video0
|
||||
/video1
|
||||
/video2
|
||||
|
||||
would be a setup with three directories. You can use more than one
|
||||
numeric digit, and the directories need not be directly under '/':
|
||||
|
||||
/mnt/MyVideos/vdr.00
|
||||
/mnt/MyVideos/vdr.01
|
||||
/mnt/MyVideos/vdr.02
|
||||
...
|
||||
/mnt/MyVideos/vdr.11
|
||||
|
||||
would set up twelve disks (wow, what a machine that would be!).
|
||||
|
||||
To use such a multi directory setup, you need to add the '-v' option
|
||||
with the name of the basic directory when running 'vdr':
|
||||
|
||||
vdr -v /video0
|
||||
|
||||
Note that you should not copy any non-VDR files into the /videoX directories,
|
||||
since this might cause a lot of unnecessary disk access when VDR cleans up those
|
||||
directories and there is a large number of files and/or subdirectories in
|
||||
there. If you have a large disk that you want to use for VDR's video data as
|
||||
well as other stuff, you may want to create a subdirectory for VDR, as in
|
||||
|
||||
/mydisk/video
|
||||
|
||||
and put your other stuff into, say,
|
||||
|
||||
/mydisk/otherstuff
|
||||
there.
|
||||
|
||||
If your video directory is mounted via a Samba share, and you are experiencing
|
||||
problems with replaying in fast forward mode, you can comment out the line
|
||||
@ -397,11 +331,9 @@ Configuration files:
|
||||
|
||||
There are several configuration files that hold information about
|
||||
channels, remote control keys, timers etc. By default these files are
|
||||
spread around the system according to the FHS ("File system Hierarchy Standard").
|
||||
If you prefer to have VDR built to run locally under the VDR source tree,
|
||||
you can copy the file Make.config.template to Make.config and set the parameter
|
||||
LCLBLD=1. If you also want to have all data files under one single directory,
|
||||
set ONEDIR=1 in Make.config.
|
||||
assumed to be located in the video directory, but a different directory
|
||||
can be used with the '-c' option. Plugins assume their configuration files
|
||||
in a subdirectory called "plugins" of this directory.
|
||||
|
||||
For starters just copy all *.conf files from the VDR directory into your
|
||||
video directory.
|
||||
@ -428,28 +360,6 @@ accessed using DiSEqC, you have to go to the "Setup" menu and set the "DiSEqC"
|
||||
parameter to "on". You also need to set up the file 'diseqc.conf' to properly
|
||||
access your DiSEqC equipment (see man vdr(5) for details).
|
||||
|
||||
A special form of DiSEqC is used to connect several receivers to one signal
|
||||
source using only a single cable. This method, known as "Satellite Channel Routing"
|
||||
according to EN50494 (aka "Unicable(TM)", "OLT(TM)", "SatCR", "Single Cable
|
||||
Distribution", "Channel Stacking System" or "Single Cable Interface") or
|
||||
EN50607 (aka "JESS") uses the file "scr.conf" to specify which SCR channels
|
||||
use which user band frequency.
|
||||
|
||||
If DVB-S devices need to be connected to the same satellite cable, but no
|
||||
"Satellite Channel Routing" is available, they can be set to be "bonded" in
|
||||
the Setup/LNB menu. Bonded devices can only be tuned to the same polarization
|
||||
and frequency band, which reduces the number of potentially receivable channels.
|
||||
|
||||
Note that it doesn't make sense to use "Satellite Channel Routing" and
|
||||
"Device Bonding" at the same time with the same devices. If you use either
|
||||
of these methods, it is necessary that your devices are always created in the
|
||||
same sequence when the drivers are loaded. You may need to configure some
|
||||
proper "udev" rules to make sure this happens.
|
||||
If you use "Device Bonding" and you add devices to your setup that don't
|
||||
provide DVB-S and take up a position in which there used to be a bonded DVB-S
|
||||
device, make sure you open, adjust (if necessary) and confirm the Setup/LNB
|
||||
menu to have the device bondings set correctly again.
|
||||
|
||||
Running VDR with DVB-C (cable) or DVB-T (terrestrial):
|
||||
------------------------------------------------------
|
||||
|
||||
@ -484,17 +394,19 @@ for a detailed description).
|
||||
|
||||
The recommended PC key assignments are:
|
||||
|
||||
Up, Down, Left, Right Cursor keys
|
||||
Menu 'Home'
|
||||
Up, Down, Left, Right Crsr keys in numeric block
|
||||
Menu 'Home' in numeric block
|
||||
Ok 'Enter'
|
||||
Back 'Backspace'
|
||||
Back 'End' in numeric block
|
||||
Red, Green, Yellow, Blue 'F1'..'F4'
|
||||
0..9 '0'..'9'
|
||||
Volume+/- 'PgUp', 'PgDn'
|
||||
Mute 'F10'
|
||||
0..9 '0'..'9' in top row
|
||||
Power 'P'
|
||||
Volume+/- '+', '-'
|
||||
Mute 'm'
|
||||
|
||||
If you want to change your key assignments later, simply delete the file
|
||||
'remote.conf' and restart 'vdr' to get into learning mode.
|
||||
If you prefer different key assignments, or if the default doesn't work for
|
||||
your keyboard, simply delete the file 'remote.conf' and restart 'vdr' to get
|
||||
into learning mode.
|
||||
|
||||
Generating source code documentation:
|
||||
-------------------------------------
|
||||
|
616
MANUAL
616
MANUAL
@ -1,7 +1,7 @@
|
||||
Video Disk Recorder User's Manual
|
||||
---------------------------------
|
||||
|
||||
Version 2.7
|
||||
Version 1.4
|
||||
-----------
|
||||
|
||||
* Remote Control Keys
|
||||
@ -24,7 +24,7 @@ Version 2.7
|
||||
Green - Audio New New Ins/Ovr Rewind Skip -60s -
|
||||
Yellow - Pause live Delete Delete Delete Delete Skip +60s -
|
||||
Blue - Stop/Resume Mark Info - Info Stop -
|
||||
0..9 Ch select - Sort(2) Day(3) Numeric inp. Sort/Exec cmd(1) Editing -
|
||||
0..9 Ch select - Sort(2) Day(3) Numeric inp. Exec cmd(1) Editing -
|
||||
|
||||
In a numerical input field (like the response to a CAM enquiry) the keys 0..9
|
||||
are used to enter the data, and the Left key can be used to delete the last
|
||||
@ -37,9 +37,7 @@ Version 2.7
|
||||
If your remote control provides additional keys, they can be used for the
|
||||
following functions:
|
||||
|
||||
Info display information on the currently viewed programme or recording,
|
||||
or on the current item in a menu
|
||||
Play/Pause combined key to resume or pause replay, or pause live video
|
||||
Info display information on the currently viewed programme or recording
|
||||
Play resume normal replay
|
||||
Pause pause replay or live video
|
||||
Stop stop replay
|
||||
@ -50,8 +48,8 @@ Version 2.7
|
||||
Next Next/previous channel group (in live tv mode)
|
||||
Prev or next/previous editing mark (in replay mode)
|
||||
|
||||
Channel+ channel up (live view), next error (replay)
|
||||
Channel- channel down (live view), previous error (replay)
|
||||
Channel+ channel up
|
||||
Channel- channel down
|
||||
PrevChannel previous channel
|
||||
|
||||
Power shutdown
|
||||
@ -61,7 +59,6 @@ Version 2.7
|
||||
Mute mute
|
||||
|
||||
Audio select audio track
|
||||
Subtitles select subtitles
|
||||
|
||||
Schedule \
|
||||
Channels |
|
||||
@ -82,7 +79,7 @@ Version 2.7
|
||||
Yellow Info
|
||||
Blue Timers menu
|
||||
|
||||
(1) See "Sort Recordings" and "Processing Recordings" below.
|
||||
(1) See "Processing Recordings" below.
|
||||
(2) In the "Channels" menu the '0' key switches the sort mode through "by number",
|
||||
"by name" and "by provider". Other numeric input positions the cursor to
|
||||
the channel with the number entered so far. If there is no channel with that
|
||||
@ -90,7 +87,7 @@ Version 2.7
|
||||
be treated as part of that number, not as a sort mode toggle. If no numeric
|
||||
key has been pressed for more than one second, the number is reset and '0'
|
||||
functions as sort mode toggle again.
|
||||
(3) In the "Edit timer" menu, when on the "Day" item, the '0' key toggles between
|
||||
(3) In the "Timers" menu, when on the "Day" item, the '0' key toggles between
|
||||
a single shot and a repeating timer. If "Day" indicates a repeating timer,
|
||||
the keys '1'...'7' can be used to toggle the individual days ('1' is Monday).
|
||||
|
||||
@ -264,7 +261,7 @@ Version 2.7
|
||||
|
||||
* Pausing live video
|
||||
|
||||
If you want to pause the live programme you are just watching, simply press
|
||||
If you want to pause the live programme you are just watching, simple press
|
||||
"Menu/Yellow" or "Pause" on your remote control. VDR will start an instant
|
||||
recording of the current channel (just as if you had pressed "Menu/Red" or
|
||||
"Record") and immediately begin replaying that recording. Replay will be
|
||||
@ -276,9 +273,6 @@ Version 2.7
|
||||
in the "Setup/Recording" menu. Recording time will be the same as for
|
||||
any other instant recording, so by default it will record 3 hours (which
|
||||
should be enough for any normal broadcast).
|
||||
Note that the timer that is created for recording the paused live video will
|
||||
always record on the local VDR, even if an "SVDRP default host" has been
|
||||
set for normal timer recordings.
|
||||
|
||||
* Replaying a Recording
|
||||
|
||||
@ -305,14 +299,6 @@ Version 2.7
|
||||
A previously stopped playback session can be resumed by pressing the "Blue"
|
||||
key in the "VDR" menu.
|
||||
|
||||
* Sort Recordings
|
||||
|
||||
Within the "Recordings" menu, pressing the '0' key toggles sorting between
|
||||
"by time" and "by name". The selected sort mode is stored separately for each
|
||||
folder (provided you have write access to that folder).
|
||||
If a folder is newly created by a repeating timer, the sort mode for that
|
||||
folder is initially set to "by time".
|
||||
|
||||
* Processing Recordings
|
||||
|
||||
The configuration file 'reccmds.conf' can be used to define system commands
|
||||
@ -366,35 +352,18 @@ Version 2.7
|
||||
- 0 Toggles an editing mark. If the mark indicator shows a red triangle,
|
||||
the current mark is deleted. Otherwise a new mark is set at the
|
||||
current position.
|
||||
- 1, 3 Move an editing mark back and forward in "adaptive" mode. Pressing
|
||||
either of these keys for the first time moves the mark 120 seconds
|
||||
in the given direction (configurable via "Setup/Replay/Initial
|
||||
duration for adaptive skipping"). Further presses of the same key
|
||||
keep moving the mark by the same value. Once the other key is
|
||||
pressed, the value is divided by 2 (hence the name "adaptive") with
|
||||
every further press of either key. Pressing '1' and '3'
|
||||
alternatingly divides the distance all the way down to a single
|
||||
I-frame. That way a particular place in a recording (for instance
|
||||
the beginning or end of a commercial break) can be found very
|
||||
quickly. If none of these two keys is pressed for a while
|
||||
(configurable via "Setup/Replay/Reset timeout for adaptive
|
||||
skipping") the distance falls back to the initial value.
|
||||
If replay is not in Pause mode, or if there is no mark at the
|
||||
current position, the skip is performed without moving any mark.
|
||||
- 4, 6 Move an editing mark back and forward by one I-frame. You need to
|
||||
first jump to an editing mark for this to work.
|
||||
- 4, 6 Move an editing mark back and forward. You need to first jump to
|
||||
an editing mark for this to work.
|
||||
- 7, 9 Jump back and forward between editing marks. Replay goes into still
|
||||
mode after jumping to a mark. If the current position is at the
|
||||
first or last mark, or if there are no marks at all, these keys
|
||||
jump to the very beginning or end, respectively, of the recording.
|
||||
mode after jumping to a mark.
|
||||
- 8 Positions replay at a point 3 seconds before the current or next
|
||||
"begin" mark and starts replay.
|
||||
- 2 Starts the actual cutting process.
|
||||
"start" mark and starts replay.
|
||||
- 2 Start the actual cutting process.
|
||||
|
||||
Editing marks are represented by black, vertical lines in the progress display.
|
||||
A small black triangle at the top of the mark means that this is a "begin"
|
||||
A small black triangle at the top of the mark means that this is a "start"
|
||||
mark, and a triangle at the bottom means that this is an "end" mark.
|
||||
The cutting process will save all video data between "begin" and "end" marks
|
||||
The cutting process will save all video data between "start" and "end" marks
|
||||
into a new file (the original recording remains untouched). The new file will
|
||||
have the same name as the original recording, preceded with a '%' character
|
||||
(imagine the '%' somehow looking like a pair of scissors ;-). Red bars in the
|
||||
@ -403,7 +372,7 @@ Version 2.7
|
||||
|
||||
The video sequences to be saved by the cutting process are determined by an
|
||||
"even/odd" algorithm. This means that every odd numbered editing mark (i.e.
|
||||
1, 3, 5,...) represents a "begin" mark, while every even numbered mark (2, 4,
|
||||
1, 3, 5,...) represents a "start" mark, while every even numbered mark (2, 4,
|
||||
6,...) is an "end" mark. Inserting or toggling a mark on or off automatically
|
||||
adjusts the sequence to the right side of that mark.
|
||||
|
||||
@ -416,13 +385,11 @@ Version 2.7
|
||||
version of the recording you can use the '8' key to jump to a point just
|
||||
before the next cut and have a look at the resulting sequence.
|
||||
|
||||
Currently editing marks can only be set at I-frames, which typically appear
|
||||
every half of a second to a second. A "begin" mark marks the first frame of
|
||||
a resulting video sequence, and an "end" mark marks the last frame of that
|
||||
sequence. Note that the actual frame indicated by the an "end" mark will
|
||||
not be included in the edited version of the recording. That's because every
|
||||
recording (and every sequence of an edited recording) begins with an I-frame
|
||||
and ends right before the next I-frame.
|
||||
Currently editing marks can only be set at I-frames, which typically is
|
||||
every 12th frame. So editing can be done with a resolution of roughly half
|
||||
a second. A "start" mark marks the first frame of a resulting video
|
||||
sequence, and an "end" mark marks the last frame of that sequence.
|
||||
|
||||
An edited recording (indicated by the '%' character) will never be deleted
|
||||
automatically in case the disk runs full (no matter what "lifetime" it has).
|
||||
|
||||
@ -480,8 +447,6 @@ Version 2.7
|
||||
"forever", and a value of 0 means that this recording can be
|
||||
deleted any time if a recording with a higher priority needs disk
|
||||
space.
|
||||
Pattern: The pattern to use for recordings matching events (only available
|
||||
for pattern timers). See section "Pattern timers" below.
|
||||
File: The name under which a recording created through this timer will
|
||||
be stored on disk (the actual name will also contain the date and
|
||||
time, so it is possible to have a "repeating timer" store all its
|
||||
@ -503,197 +468,10 @@ Version 2.7
|
||||
the name of the recording.
|
||||
First day: The date of the first day when this timer shall start recording
|
||||
(only available for repeating timers).
|
||||
Record on: The name of the remote VDR this timer shall record on (only available
|
||||
if there are any remote VDRs connected to this VDR). If this field
|
||||
is empty, the timer will record on the local VDR.
|
||||
|
||||
A timer can also be programmed by pressing the "Red" key on the "Schedule",
|
||||
"Now", "Next" or "Event" menus.
|
||||
|
||||
The "Red" key in the "Edit timer" menu opens a list of folders, which can be
|
||||
used to define the file name in which the recording will be stored.
|
||||
|
||||
The "Yellow" key in the "Edit timer" menu toggles the timer between "Pattern"
|
||||
and "Regular".
|
||||
|
||||
When editing the "File" field, the "Blue" key in can be used to insert useful
|
||||
macros.
|
||||
|
||||
* Pattern timers
|
||||
|
||||
There are cases where it would make sense to have a more flexible kind of
|
||||
recording timer. For instance, some channels that provide VPS don't always
|
||||
use the exact same VPS time for a series, which is extremely annoying.
|
||||
Or you might want to record all films that have a certain pattern in their
|
||||
title, no matter when they are broadcast. In such cases, "pattern timers"
|
||||
can help.
|
||||
|
||||
In the "Edit timer" menu press the Yellow button to turn a regular timer into
|
||||
a pattern timer. Pressing this button again switches back to regular.
|
||||
|
||||
The following rules apply to pattern timers:
|
||||
|
||||
- Pattern timers can only work for channels that provide EPG data.
|
||||
- When using pattern timers, there should always be at least one free device that
|
||||
can be used to regularly receive the EPG of the pattern timer's channel.
|
||||
- A pattern timer records every matching event on the given channel that overlaps
|
||||
with the given start/stop time. Overlapping events are recorded in full,
|
||||
even if they extend outside the given start/stop interval.
|
||||
- In order to actually record an event, a pattern timer "spawns" a separate timer
|
||||
that does the recording. If there are matching events that would start while
|
||||
the first spawned timer is still recording (due to the start/stop margins), timers
|
||||
for those events are also spawned.
|
||||
- Spawned timers are marked with the flag tfSpawned.
|
||||
- Spawned timers take the Priority, Lifetime and VPS settings from the pattern timer.
|
||||
- The special pattern "*" matches every event. So a timer with
|
||||
a start/stop time of 00:00/23:59 will record every event of that day
|
||||
into separate recordings. Note that when using this pattern there should
|
||||
be no other timers for the same channel, because these might interfere.
|
||||
- Once a timer has been spawned, it is treated like any other regular
|
||||
timer. Any changes made to the corresponding pattern timer thereafter will have
|
||||
no effect on spawned timers. Note that after deleting a spawned timer,
|
||||
the corresponding pattern timer may respawn it.
|
||||
- Recording is done according to the event's begin/end times, either
|
||||
by adding the start/stop margins (for non-VPS timers) or by using the
|
||||
event's running status (for VPS timers).
|
||||
- If the start/stop margins of a spawned timer are reduced because the event
|
||||
before and/or after that timer's event is shorter than the respective margin,
|
||||
the actual recording still uses the full margins.
|
||||
- If the times of the event change, a non-VPS pattern timer automatically adjusts
|
||||
itself to the new times. This also happens if the start/stop margins are changed
|
||||
in the setup.
|
||||
- The recording of a pattern timer is stored under the given file name, just like
|
||||
regular timers do. In addition to the "TITLE" and "EPISODE" macros the file
|
||||
name of a pattern timer can also use "{<}" and "{>}" to reference the part of the
|
||||
event's title before and after the pattern, respectively. For instance,
|
||||
if the event's title is "Abc def ghi" and the pattern is "def ", "{<}"
|
||||
would contain "Abc " and "{>}" would contain "ghi" (note the matching of the
|
||||
blanks). For completeness, "{=}" can be used to reference the matching
|
||||
pattern itself.
|
||||
- In the "Timers" menu pressing the Red button on a pattern timer only toggles the
|
||||
timer between "on" and "off", even if this is a repeating timer.
|
||||
- In the "Timers" menu pattern timers are sorted alphabetically to the end of the
|
||||
list of timers.
|
||||
- A regular timer that is currently recording can't be changed into a pattern timer.
|
||||
- In the "Edit timer" menu the file name and pattern are displayed as
|
||||
separate items. The Yellow button can be used to toggle between a regular
|
||||
timer and a pattern timer. When going from regular to pattern, the Pattern item will
|
||||
be initialized with the base part of the file name.
|
||||
- The characters '^' and '$' can be used at the very beginning and end of
|
||||
the pattern to anchor the pattern to the begin or end of the title.
|
||||
Using both of these will match only titles that consist of exactly the given pattern,
|
||||
with nothing before and nothing after it.
|
||||
- The Pattern field in the "Edit timer" menu allows blanks at the end of the string,
|
||||
which may help to separate the text after the matching pattern.
|
||||
- If the first character of the pattern is '@', an event that matches the
|
||||
rest of the pattern is only recorded if the resulting recording's file
|
||||
name (without any folders) is not contained in the donerecs.data file.
|
||||
This avoids duplicate recordings of the same programme. Timers spawned from
|
||||
such a pattern timer are marked with the flag tfAvoid.
|
||||
- When editing the "File" field of a timer, the Blue button can be pressed to
|
||||
insert one of the macros "TITLE", "EPISODE", "{<}", "{=}" or "{>}",
|
||||
respectively. Pressing the Blue button repeatedly loops through the available
|
||||
macros. The "{...}" macros are only available for pattern timers.
|
||||
- In the "Schedule" and "What's on...?" menus the events that will be recorded
|
||||
by a pattern timer are marked in the same way as regular timers.
|
||||
- The TIMERS column in the LCARS skin doesn't show the basic definitions of
|
||||
pattern timers, it only shows timers actually spawned from pattern timers.
|
||||
|
||||
If the pattern is prepended with '@', the name of the resulting recording (everything
|
||||
after the rightmost '~', or the entire file name, if there is no '~') will be stored
|
||||
in the file donerecs.data, so that multiple recordings of the same programme can be
|
||||
avoided. When using this feature, special care must be taken regarding the recording's
|
||||
file name. For instance, with a combination of
|
||||
|
||||
pattern file name
|
||||
@Columbo Movies~TITLE
|
||||
|
||||
if the event's title is just "Columbo", this pattern timer would only record once,
|
||||
and ignore any future events with that title, even if the episode would be different.
|
||||
So you may want to use the episode name, as in
|
||||
|
||||
pattern file name
|
||||
@Columbo Movies~TITLE - EPISODE
|
||||
|
||||
to make the file name unique. If you have several pattern timers for the same show on
|
||||
different channels, chances are that the broadcasters handle title and episode
|
||||
differently, as for example in
|
||||
|
||||
TITLE EPISODE pattern file name
|
||||
Columbo Blueprint for Murder @^Columbo$ TITLE - EPISODE
|
||||
Columbo - Blueprint for Murder @^Columbo TITLE
|
||||
Columbo: Blueprint for Murder @^Columbo:_ Columbo - {>}
|
||||
|
||||
(note the '_' in the pattern of the third example; this is just used to visualize
|
||||
the blank at the end of the pattern)
|
||||
|
||||
In order to have the same episode result in the same recording file name on all
|
||||
channels, the file name needs to be generated differently for each channel. First
|
||||
you need to decide on a proper combination of title and episode name, preferably
|
||||
one that is already used by one of your channels (let's say the second one).
|
||||
In the first case, title and episode name are correctly put in their respective
|
||||
places, and "TITLE - EPISODE" as file name will do. The second case is our common
|
||||
version, where everything is in the title, so TITLE is just fine. The third case
|
||||
poses a problem, because everything is in the title, but with a different separator.
|
||||
Here the special macro "{>}" can be used in the file name, which contains everything
|
||||
following the matching pattern. There are three macros that can be used here:
|
||||
|
||||
{<} everything before the matching pattern
|
||||
{>} everything after the matching pattern
|
||||
{=} the matching pattern itself (just for completeness)
|
||||
|
||||
As of VDR version 2.5.2, the characters ' ' (blank), ':' and '-' are ignored
|
||||
when checking whether a particular recording has already been made by a pattern
|
||||
timer, making "TITLE - EPISODE" and "TITLE: EPISODE" the same.
|
||||
VDR version 2.6.6 added '/' to this list.
|
||||
|
||||
* Managing folders
|
||||
|
||||
The "Select folder" menu, which can be accessed by pressing the "Red" key in
|
||||
the "Edit timer" menu, offers a list of folders that can be used for storing
|
||||
a recording. In this menu, the "Green" key allows you to define a new folder
|
||||
within the current one; if the "Sub folder" option is set to "yes", this will
|
||||
be a folder that contains other folders (indicated by "..." following the
|
||||
folder name in the list). The "Yellow" key deletes the current folder (note
|
||||
that this will merely delete the folder definition stored in 'folders.conf'
|
||||
and has no effect on existing timers or recordings). The "Blue" key can be
|
||||
used to edit an existing folder definition. The "Red" key opens a folder that
|
||||
contains sub folders, while pressing Ok selects the current folder. Once a
|
||||
folder has been selected, the entire path of the timer's file name will be
|
||||
replaced with the selected folder.
|
||||
|
||||
In the "Recordings" menu the folders of existing recordings can be renamed or
|
||||
moved by pressing the "Blue" key ("Edit") while the cursor is positioned on
|
||||
a folder. This will open a menu in which the folder's name and location (the
|
||||
"parent" folder) can be edited. If such an operation will result in moving
|
||||
more than one recording, you will be asked for confirmation.
|
||||
The name, folder, priority and lifetime of an individual recording can be
|
||||
changed by pressing the "Blue" key ("Info") while the cursor is positioned
|
||||
on a recording, and in the resulting Info menu pressing the "Blue" key again
|
||||
to bring up the "Edit recording" menu.
|
||||
In the "Edit recording" menu the Red button ("Folder") allows you to select one
|
||||
of your predefined folders. The Green button has multiple functions, depending
|
||||
on what is currently going on with the recording. It can either stop or cancel
|
||||
a cut, move or copy operation. If the button reads "Stop..." it means that the
|
||||
respective operation is already happening, while "Cancel..." means that the
|
||||
operation is still pending execution. If no operation is currently happening
|
||||
and the recording has editing marks, the Button will read "Cut" and triggers
|
||||
cutting the recording (same as pressing '2' while replaying the recording).
|
||||
The Yellow button ("Delete marks") allows you to delete all editing marks from
|
||||
the selected recording (if there are any and the recording is not currently
|
||||
being cut). To directly edit the folder or name of the recording, position the
|
||||
cursor to the respective line and press the Right key to start editing (press
|
||||
Ok to confirm the edit, or Back to return to the previous value). If you want
|
||||
to remove the name of the recording and make the folder name the actual
|
||||
recording's name, you can position the cursor to the "Name:" field and press
|
||||
the '0' key. This will take the last element of the recording's folder path
|
||||
and make it the actual name of the recording. You can do this in turn until
|
||||
the recording is moved all the way up to the root of the video directory.
|
||||
Note that, in case you inadvertently pressed the '0' key, you can leave the
|
||||
"Edit recording" menu with the "Back" key and any changes you have made so far
|
||||
will not be applied. Once you are finished with editing the recording
|
||||
properties, press Ok to confirm the changes.
|
||||
|
||||
* Parameters in the "Setup" menu
|
||||
|
||||
Select "Setup" from the "VDR" menu to enter the setup menu. From there you can
|
||||
@ -709,13 +487,12 @@ VDR version 2.6.6 added '/' to this list.
|
||||
|
||||
Theme = Default Defines the "theme" to use with the current skin.
|
||||
|
||||
Left = 8 The left and top offset of the OSD, in percent of the
|
||||
Top = 8 total video display width and height, respectively.
|
||||
The valid range is 0...50%.
|
||||
Left = 54 The top and left offset of the OSD.
|
||||
Top = 45 The valid ranges are left=0...672, top=0...567.
|
||||
|
||||
Width = 87 The width and height of the OSD, in percent of the
|
||||
Height = 84 total video display width and height, respectively.
|
||||
The valid range is 50...100%.
|
||||
Width = 624 The width and height of the OSD.
|
||||
Height = 486 The valid ranges are width=480...672, height=324...567.
|
||||
The Width must be a multiple of 8.
|
||||
|
||||
Message time = 1 The time (in seconds) how long an informational
|
||||
message shall be displayed on the OSD. The valid range
|
||||
@ -732,17 +509,16 @@ VDR version 2.6.6 added '/' to this list.
|
||||
utilize these. If either of these conditions is not met,
|
||||
rendering will be done without anti-aliasing.
|
||||
|
||||
Default font = Sans Serif:Bold
|
||||
Small font = Sans Serif
|
||||
Fixed font = Courier:Bold
|
||||
The names of the various fonts to use.
|
||||
OSD font name = arialbd.ttf
|
||||
Small font name = arial.ttf
|
||||
Fixed font name = courbd.ttf
|
||||
The file names of the various fonts to use.
|
||||
|
||||
Default font size = 3.8
|
||||
Small font size = 3.5
|
||||
Fixed font size = 3.1
|
||||
The sizes (in percent of the total video display height)
|
||||
of the various fonts. The valid range is 1...10%, at
|
||||
a resolution of 0.1%.
|
||||
OSD font size = 22
|
||||
Small font size = 18
|
||||
Fixed font size = 20
|
||||
The sizes (in pixel) of the various fonts. Valid range is
|
||||
10...64.
|
||||
|
||||
Channel info position = bottom
|
||||
The position of the channel info window in the OSD
|
||||
@ -787,40 +563,6 @@ VDR version 2.6.6 added '/' to this list.
|
||||
Turns displaying the Recordings menu as a hierarchical
|
||||
directory structure on or off.
|
||||
|
||||
Folders in timer menu = yes
|
||||
Controls whether the full folder path is shown in the
|
||||
"Timers" menu, or just the basic recording name.
|
||||
|
||||
Always sort folders first = yes
|
||||
In the "Recordings" menu folders are always listed before
|
||||
plain recordings. Set this option to "no" if you want folders
|
||||
to be interspersed with recordings when sorted alphabetically.
|
||||
|
||||
Default sort mode for recordings = by time
|
||||
Controls whether recordings are sorted by time or by name.
|
||||
If a particular sort mode has been selected for a folder by
|
||||
pressing '0', the default no longer applies to that folder.
|
||||
|
||||
Sorting direction for recordings = ascending
|
||||
When recordings are sorted "by time", they appear in ascending
|
||||
order (i.e. "oldest" to "newest"). If this parameter is set to
|
||||
"descending", they will be presented "newest" to "oldest.
|
||||
Note that in the latter case, if "Always sort folders first"
|
||||
is "yes", folders will appear in reverse alphabetical order.
|
||||
|
||||
Number keys for characters = yes
|
||||
Controls whether the number keys can be used to enter
|
||||
characters in a text input field. You may want to set this
|
||||
to "no" if you are using an actual keyboard to control VDR.
|
||||
|
||||
Color key 0 = 0 By default, VDR assumes that the sequence of the color
|
||||
Color key 1 = 1 keys on the remote control is red-green-yellow-blue. If
|
||||
Color key 2 = 2 your remote control has these keys in a different sequence,
|
||||
Color key 3 = 3 you can adjust these parameters to reorder the corresponding
|
||||
color buttons in the menus accordingly. Note that this does
|
||||
not change the functionality of the individual keys; it only
|
||||
changes the sequence in which the color buttons are displayed.
|
||||
|
||||
EPG:
|
||||
|
||||
EPG scan timeout = 5 The time (in hours) of user inactivity after which the
|
||||
@ -829,16 +571,6 @@ VDR version 2.6.6 added '/' to this list.
|
||||
A value of '0' completely turns off scanning on both single
|
||||
and multiple card systems.
|
||||
|
||||
EPG scan max. channel number = 0
|
||||
The EPG scan will only tune to transponders of channels with
|
||||
numbers below this limit. By default all transponders will
|
||||
be scanned.
|
||||
|
||||
EPG pause after scan = no
|
||||
After a complete scan of all transponders (optionally limited
|
||||
by "EPG scan max. channel number") the EPG scan pauses for
|
||||
"EPG scan timeout" hours if this option is set to "yes".
|
||||
|
||||
EPG bugfix level = 3 Some tv stations transmit weirdly formatted EPG data.
|
||||
VDR attempts to fix these bugs up to the given level:
|
||||
0 = no EPG fixing
|
||||
@ -912,33 +644,27 @@ VDR version 2.6.6 added '/' to this list.
|
||||
from the primary DVB interface, so that the viewer will
|
||||
be disturbed as little as possible.
|
||||
|
||||
Standard Compliance = 0
|
||||
Defines the standard compliance mode:
|
||||
0 = DVB
|
||||
1 = ANSI/SCTE
|
||||
2 = NORDIG
|
||||
|
||||
Video format = 4:3 The video format (or aspect ratio) of the tv set in use
|
||||
(4:3 or 16:9). Applies only to SD output devices.
|
||||
(4:3 or 16:9).
|
||||
|
||||
Video display format = letterbox
|
||||
The display format to use for playing wide screen video on
|
||||
a 4:3 tv set ("pan & scan", "letterbox" or "center cut out").
|
||||
This option is only available if "Video format" is set to
|
||||
4:3. Applies only to SD output devices.
|
||||
4:3.
|
||||
|
||||
Use Dolby Digital = yes
|
||||
Controls whether Dolby Digital tracks appear in the "Audio"
|
||||
menu. This is useful if you don't have the equipment to
|
||||
replay Dolby Digital audio.
|
||||
Turns recording of the Dolby Digital audio channels on
|
||||
or off. This may be useful if you don't have the equipment
|
||||
to replay Dolby Digital audio and want to save disk space.
|
||||
If turned off, Dolby Digital tracks also don't appear in the
|
||||
"Audio" menu.
|
||||
|
||||
Update channels = 5 Controls the automatic channel update function. '0' means
|
||||
no update, '1' will only update channel names, '2' will
|
||||
only update PIDs, '3' will update channel names and PIDs,
|
||||
'4' will perform all updates and also add newly found channels,
|
||||
and '5' will also add newly found transponders.
|
||||
Note that adding new transponders only works if the "EPG scan"
|
||||
is active.
|
||||
|
||||
Audio languages = 0 Some tv stations broadcast various audio tracks in different
|
||||
languages. This option allows you to define which language(s)
|
||||
@ -949,67 +675,14 @@ VDR version 2.6.6 added '/' to this list.
|
||||
many "Audio language" options which allow you to select the
|
||||
individual preferred languages.
|
||||
|
||||
Display subtitles = no If set to 'yes', the first available subtitles in the list
|
||||
of preferred subtitle languages will be turned on when
|
||||
switching to a channel that provides subtitles.
|
||||
|
||||
Subtitle languages = 0 Some tv stations broadcast various subtitle tracks in different
|
||||
languages. This option allows you to define which language(s)
|
||||
you prefer in such cases. By default, or if none of the
|
||||
preferred languages is broadcast, no subtitles will
|
||||
be selected when switching to such a channel. If this option
|
||||
is set to a non-zero value, the menu page will contain that
|
||||
many "Subtitle language" options which allow you to select the
|
||||
individual preferred languages.
|
||||
|
||||
Subtitle offset = 0 Allows you to shift the location of the subtitles in the
|
||||
vertical direction. The valid range is -100...100. This option
|
||||
is only available if "Display subtitles" is set to 'yes'.
|
||||
|
||||
Subtitle foreground transparency = 0
|
||||
Subtitle background transparency = 0
|
||||
These define an additional level of transparency for the
|
||||
foreground and background color of subtitles. Valid ranges
|
||||
are 0...9 for foreground transparency, and 0...10 for
|
||||
background transparency. By default the values as broadcast
|
||||
are used.
|
||||
|
||||
LNB:
|
||||
|
||||
Use DiSEqC = no Generally turns DiSEqC support on or off.
|
||||
|
||||
SLOF = 11700 The switching frequency (in MHz) between low and
|
||||
high LOF
|
||||
Low LNB frequency = 9750 The LNB's low and high local oscillator frequencies
|
||||
High LNB frequency = 10600 (in MHz, these have no meaning for DVB-C receivers)
|
||||
|
||||
Device n connected to sat cable = own
|
||||
Defines whether DVB-S device n has its own satellite cable,
|
||||
or is "bonded" with another device. All DVB-S devices that
|
||||
are connected to the same sat cable must be set to the same
|
||||
number here.
|
||||
|
||||
Use dish positioner = no
|
||||
By default, the 'P' command code in DiSEqC command sequences
|
||||
is ignored. Set this parameter to 'yes' if you are using a
|
||||
satellite dish positioner.
|
||||
|
||||
Site latitude (degrees) = 0
|
||||
Site longitude (degrees) = 0
|
||||
Set these to the latitude and longitude of your dish's
|
||||
location if you use a satellite dish positioner. Use the
|
||||
"Green" key to switch between north/south and east/west,
|
||||
respectively.
|
||||
|
||||
Max. positioner swing (degrees) = 65
|
||||
Defines the maximum angle by which the positioner can move
|
||||
the dish away from due south (or north) in either direction.
|
||||
The valid range is 0...90.
|
||||
|
||||
Positioner speed (degrees/s) = 1.5
|
||||
Defines the speed at which the positioner moves the dish.
|
||||
The valid range is 0.1...180. This value is used to calculate
|
||||
how long it takes the positioner to reach the target position.
|
||||
Use DiSEqC = no Generally turns DiSEqC support on or off.
|
||||
|
||||
CAM:
|
||||
|
||||
@ -1019,19 +692,7 @@ VDR version 2.6.6 added '/' to this list.
|
||||
if it is in the process of being reset, its current status
|
||||
is displayed. The "Red" key can be pressed to enter the CAM
|
||||
menu, and the "Green" key triggers a reset of the selected
|
||||
slot. The "Ok" key also opens the CAM menu. The "Yellow" key
|
||||
assigns the selected CAM to a device and switches it to the
|
||||
current channel. The CAM/device combination remains tuned to
|
||||
the current channel until the smart card in the CAM has been
|
||||
activated and thus starts to descramble, or until a recording
|
||||
needs this device. Pressing the "Yellow" key while a CAM is
|
||||
in activation mode cancels the activation. The activation mode
|
||||
remains in effect even if you switch to a different channel
|
||||
(provided there is more than one device in the system) or
|
||||
watch a recording. To activate your smart card simply switch
|
||||
to the channel you want to watch, open the "Setup/CAM" menu,
|
||||
select the CAM that contains the smart card (in case you
|
||||
have more than one CAM) and press the "Yellow" key.
|
||||
slot. The "Ok" key also opens the CAM menu.
|
||||
|
||||
Recording:
|
||||
|
||||
@ -1040,30 +701,21 @@ VDR version 2.6.6 added '/' to this list.
|
||||
after the official end time it shall stop recording.
|
||||
These margins are added automatically to timers that
|
||||
are created from the EPG data.
|
||||
Note that the actual margins used may be smaller than the
|
||||
given values, if the event before and/or after the event
|
||||
to be recorded is shorter than the respective margin.
|
||||
|
||||
Primary limit = 0 The minimum priority a timer must have to be allowed to
|
||||
use the primary DVB interface, or to force another timer
|
||||
with higher priority to use the primary DVB interface.
|
||||
This is mainly useful for recordings that should take
|
||||
place only when there is nothing else to do, but should
|
||||
never keep the user from viewing stuff on the primary
|
||||
interface. On systems with only one DVB card, timers
|
||||
with a priority below PrimaryLimit will never execute.
|
||||
|
||||
Default priority = 50 The default Priority and Lifetime values used when
|
||||
Default lifetime = 99 creating a new timer event. A Lifetime value of 99
|
||||
means that this recording will never be deleted
|
||||
automatically.
|
||||
|
||||
Record key handling = 2
|
||||
Defines what happens if the Record key on the remote control
|
||||
is pressed during live tv.
|
||||
0 = no instant recording
|
||||
1 = confirm instant recording
|
||||
2 = record instantly
|
||||
The default is 2.
|
||||
|
||||
Pause key handling = 2 Defines what happens if the Pause key on the remote control
|
||||
is pressed during live tv.
|
||||
0 = do not pause live video
|
||||
1 = confirm pause live video
|
||||
2 = pause live video
|
||||
The default is 2.
|
||||
|
||||
Pause priority = 10 The Priority and Lifetime values used when pausing live
|
||||
Pause lifetime = 1 video.
|
||||
|
||||
@ -1105,15 +757,10 @@ VDR version 2.6.6 added '/' to this list.
|
||||
Default is 180 minutes (3 hours). The stop time of an
|
||||
instant recording can be modified at any time by editing
|
||||
the respective timer in the "Timers" menu.
|
||||
If this parameter is set to 0 ("present event"), only the
|
||||
currently running event will be recorded, using the stop
|
||||
margin and VPS setting as configured.
|
||||
Note that this parameter is also used when pausing live
|
||||
video!
|
||||
|
||||
Max. video file size = 2000
|
||||
The maximum size of a single recorded video file in MB.
|
||||
The valid range is 100...1048570. Default is 2000, but
|
||||
The valid range is 100...2000. Default is 2000, but
|
||||
you may want to use smaller values if you are planning
|
||||
on archiving a recording to CD.
|
||||
|
||||
@ -1121,17 +768,9 @@ VDR version 2.6.6 added '/' to this list.
|
||||
During the actual editing process VDR writes the result
|
||||
into files that may grow up to MaxVideoFileSize. If you
|
||||
prefer to have each marked sequence stored in a separate
|
||||
file (named 00001.ts, 00002.ts, ...) you can set this
|
||||
file (named 001.vdr, 002.vdr, ...) you can set this
|
||||
option to 'yes'.
|
||||
|
||||
Delete timeshift recording = 0
|
||||
Controls whether a timeshift recording is deleted after
|
||||
viewing it.
|
||||
0 = no
|
||||
1 = confirm
|
||||
2 = yes
|
||||
The default is 0.
|
||||
|
||||
Replay:
|
||||
|
||||
Multi speed mode = no Defines the function of the "Left" and "Right" keys in
|
||||
@ -1141,88 +780,11 @@ VDR version 2.6.6 added '/' to this list.
|
||||
|
||||
Show replay mode = no Turns displaying the current replay mode on or off.
|
||||
|
||||
Show remaining time = no
|
||||
Defines whether the replay progress display shows the
|
||||
remaining time or the total length of the recording.
|
||||
|
||||
Progress display time (s) = 0
|
||||
Defines how long (in seconds) the progress display is shown
|
||||
when replay of a recording is started. The default value of 0
|
||||
means that it will not be shown.
|
||||
|
||||
Pause replay when setting mark = no
|
||||
Defines whether the player automatically goes into Pause
|
||||
mode when setting an editing mark.
|
||||
|
||||
Pause replay when jumping to a mark = yes
|
||||
By default replay is automatically paused whenever you jump
|
||||
to an editing mark with the '7' or '9' key in order to allow
|
||||
you to easily adjust those marks. If this option is set to
|
||||
'no', the '9' key will not pause if you are in Play mode and
|
||||
the mark you jump to is not within 3 seconds of the end of
|
||||
the recording.
|
||||
|
||||
Skip edited parts = no Defines whether the edited parts of a recording are
|
||||
automatically skipped during replay. This includes jumping
|
||||
to the first mark if replay starts at the beginning of the
|
||||
recording, and stopping at the last mark.
|
||||
|
||||
Pause replay at last mark = no
|
||||
If enabled, replay of a recording will go into Pause mode
|
||||
when it has reached the last "end" mark (if any). Note that
|
||||
the actual position at which the pause occurs may be a couple
|
||||
of frames before the last "end" mark, depending on how much
|
||||
data is buffered by your output device.
|
||||
|
||||
Initial duration for adaptive skipping (s) = 120
|
||||
Defines the number of seconds to jump from the current replay
|
||||
position in either direction, when pressing the '1' or '3'
|
||||
key for the first time after the "Reset timeout for adaptive
|
||||
skipping".
|
||||
The valid range is 10...600.
|
||||
|
||||
Reset timeout for adaptive skipping (s) = 3
|
||||
Defines the number of seconds after which pressing the
|
||||
'1' or '3' key falls back to the "Initial duration for adaptive
|
||||
skipping".
|
||||
The valid range is 0...10. Setting the timeout to 0 disables
|
||||
the adaptive mode and makes '1' and '3' always skip the number
|
||||
of seconds configured as the initial duration.
|
||||
|
||||
Alternate behavior for adaptive skipping = no
|
||||
When skipping in adaptive mode with the '1' and '3' keys, the
|
||||
distance of the skip is halved with every key press after the
|
||||
first change of direction. While this allows for locating a
|
||||
particular position in a recording very fast, once you make
|
||||
one step too many in the current direction you have no chance
|
||||
of ever reaching the desired point any more. You will have to
|
||||
wait for the timeout to occur and start adaptive skipping anew.
|
||||
If this option is set to 'yes', the skip distance will only be
|
||||
halved if the direction actually changes. That way, even if
|
||||
you missed the target point, you can still back up to it.
|
||||
|
||||
Use Prev/Next keys for adaptive skipping = no
|
||||
Normally the Prev/Next keys jump between editing marks (or
|
||||
the beginning/end of the recording). You can set this option
|
||||
to 'yes' if you want to use these keys for adaptive skipping
|
||||
instead.
|
||||
|
||||
Skip distance with Green/Yellow keys (s) = 60
|
||||
Defines the number of seconds to skip in either direction
|
||||
when pressing the "Green" or "Yellow" key, respectively.
|
||||
The valid range is 5...600.
|
||||
|
||||
Skip distance with Green/Yellow keys in repeat (s) = 60
|
||||
Defines the number of seconds to skip in either direction
|
||||
when pressing and holding the "Green" or "Yellow" key,
|
||||
respectively.
|
||||
The valid range is 5...600.
|
||||
|
||||
Resume ID = 0 Defines an additional ID that can be used in a multi user
|
||||
environment, so that every user has his/her own resume
|
||||
files for each recording. The valid range is 0...99, with
|
||||
0 resulting in a file named 'resume', and any other
|
||||
value resulting in 'resume.n'.
|
||||
0 resulting in a file named 'resume.vdr', and any other
|
||||
value resulting in 'resume.n.vdr'.
|
||||
|
||||
Miscellaneous:
|
||||
|
||||
@ -1241,23 +803,6 @@ VDR version 2.6.6 added '/' to this list.
|
||||
connection after which the connection is automatically
|
||||
closed. Default is 300, a value of 0 means no timeout.
|
||||
|
||||
SVDRP peering = off Activates automatic connections between VDRs in the same
|
||||
network. If set to "any hosts" this VDR will establish
|
||||
connections with any available hosts. If set to "only
|
||||
default host" this VDR will only connect to the VDR with
|
||||
the name defined in "SVDRP default host". If no default
|
||||
host has been defined, the behavior is the same as with
|
||||
"any hosts". To switch from "off" to "only default host",
|
||||
you may need to select "any hosts" first and confirm the
|
||||
dialog by pressing "Ok" in order to be able to select a
|
||||
default host.
|
||||
|
||||
SVDRP host name The name of this VDR, which is used when connecting VDRs
|
||||
via SVDRP. By default, the machine's host name is used.
|
||||
|
||||
SVDRP default host The name of the VDR to be used by default when creating a
|
||||
new timer.
|
||||
|
||||
Zap timeout = 3 The time (in seconds) until a channel counts as "previous"
|
||||
for switching with '0'
|
||||
|
||||
@ -1270,20 +815,8 @@ VDR version 2.6.6 added '/' to this list.
|
||||
key. Note that the total maximum is also limited by
|
||||
the "OSD/Channel info time" parameter.
|
||||
|
||||
Remote control repeat delay = 300
|
||||
The earliest time (in milliseconds) after which the repeat
|
||||
function of the remote control kicks in if a key is held
|
||||
pressed down for a while. If the remote control in use
|
||||
has a repeat delay that is longer than that given in this
|
||||
parameter, that longer delay will prevail.
|
||||
Remote control repeat delta = 100
|
||||
The time (in milliseconds) between two subsequent key
|
||||
presses generated by the remote control's repeat function.
|
||||
If the remote control in use has a repeat delta that is
|
||||
longer than that given in this parameter, that longer delta
|
||||
will prevail.
|
||||
Initial channel = The channel ID of the channel that shall be tuned to when
|
||||
VDR starts. Default is empty, which means that it will
|
||||
Initial channel = 0 The number of the channel that shall be tuned to when
|
||||
VDR starts. Default is 0, which means that it will
|
||||
tune to the channel that was on before VDR was stopped.
|
||||
|
||||
Initial volume = -1 The volume that shall be set when VDR starts. Default
|
||||
@ -1291,36 +824,6 @@ VDR version 2.6.6 added '/' to this list.
|
||||
VDR was stopped will be used. The valid range is from
|
||||
0 (silent) to 255 (loudest).
|
||||
|
||||
Volume steps = 51 The number of steps the volume will use when moving from
|
||||
the lowest to the highest value. The valid range is from
|
||||
5 to 255.
|
||||
|
||||
Volume linearize = 0 How to linearize the volume control. The valid range is
|
||||
from -20 to 20. A value of 0 results in no linearization.
|
||||
The higher this value is, the more fine grained the control
|
||||
of the volume is for low sound levels. Lower values do the
|
||||
same for high sound levels. This allows you to adjust the
|
||||
more or less linear volume control of your sound card.
|
||||
|
||||
Channels wrap = no During zapping with the "Up" and "Down" keys (or the
|
||||
"Channel+" and "Channel-" keys) the current channel will
|
||||
wrap around the beginning or end of the channel list if
|
||||
this parameter is set to 'yes'.
|
||||
|
||||
Show channel names with source = off
|
||||
If this option is turned on, channel names will be displayed
|
||||
with the source appended to them, as in "ZDF (S)" (if the
|
||||
option is set to "type), or "ZDF (S19.2E)" (if it is set to
|
||||
"full"), where 'S' stands for "Satellite".
|
||||
|
||||
Emergency exit = yes If, for some reason, a recording fails because the video
|
||||
data stream is broken, or the CAM doesn't decrypt etc.,
|
||||
VDR automatically exits in order to allow the surrounding
|
||||
wrapper script to reload the DVB drivers. If this option
|
||||
is set to 'no', the "emergency exit" will be ignored,
|
||||
hoping that the problem will go away by itself (as, for
|
||||
instance, with bad weather conditions).
|
||||
|
||||
* Executing system commands
|
||||
|
||||
The "VDR" menu option "Commands" allows you to execute any system commands
|
||||
@ -1344,3 +847,4 @@ VDR version 2.6.6 added '/' to this list.
|
||||
DEFINING THESE COMMANDS AND MAKE SURE THEY DON'T HARM YOUR SYSTEM,
|
||||
ESPECIALLY IF YOU ARE RUNNING VDR UNDER A HIGH PRIVILEGED USER ID
|
||||
(LIKE 'root').
|
||||
|
||||
|
@ -6,95 +6,41 @@
|
||||
# See the main source file 'vdr.c' for copyright information and
|
||||
# how to reach the author.
|
||||
#
|
||||
# $Id: Make.config.template 5.2 2024/10/11 14:21:04 kls Exp $
|
||||
# $Id: Make.config.template 1.10 2006/06/15 09:15:25 kls Exp $
|
||||
|
||||
### The C compiler and options:
|
||||
|
||||
CC = gcc
|
||||
CFLAGS = -g -O3 -Wall
|
||||
CFLAGS = -g -O2 -Wall
|
||||
|
||||
CXX = g++
|
||||
CXXFLAGS = -g -O3 -Wall -Werror=overloaded-virtual -Wno-parentheses
|
||||
CXXFLAGS = -g -O2 -Wall -Woverloaded-virtual
|
||||
|
||||
# Use 'make DEBUG=1 ...' to build a debug version of VDR and plugins:
|
||||
ifdef DEBUG
|
||||
CFLAGS += -O0
|
||||
CXXFLAGS += -O0
|
||||
endif
|
||||
|
||||
# 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/local
|
||||
#VDRROOT = $(PREFIX)
|
||||
#BINDIR = $(VDRROOT)/bin
|
||||
#INCDIR = $(VDRROOT)/include
|
||||
#LIBDIR = $(VDRROOT)/lib
|
||||
#LOCDIR = $(VDRROOT)/locale
|
||||
#MANDIR = $(VDRROOT)/man
|
||||
#PCDIR = $(VDRROOT)/pkgconfig
|
||||
#RESDIR = $(VDRROOT)/share
|
||||
#DVBDIR = /usr/include
|
||||
|
||||
#VIDEODIR = /srv/vdr/video
|
||||
#CONFDIR = /var/lib/vdr
|
||||
#ARGSDIR = /etc/vdr/conf.d
|
||||
#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)
|
||||
ARGSDIR = $(VIDEODIR)/conf.d
|
||||
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
|
||||
### Use this for kernel based driver:
|
||||
#LIRC_DEVICE = /dev/lirc0
|
||||
|
||||
### Define if you always want to use LIRC, independent of the --lirc option:
|
||||
#REMOTE=LIRC
|
||||
|
||||
### Define if you don't want keyboard remote control:
|
||||
#NO_KBD = 1
|
||||
|
||||
### Define if you want vdr to not run as root:
|
||||
#VDR_USER = vdr
|
||||
|
||||
### Define if you want to compile in 'bidi' support:
|
||||
#BIDI = 1
|
||||
|
||||
### Define if you want 'systemd' notification:
|
||||
#SDNOTIFY = 1
|
||||
|
||||
### Fallback for plugins with old makefiles:
|
||||
ifdef PLUGIN
|
||||
CFLAGS += -fPIC
|
||||
CXXFLAGS += -fPIC
|
||||
endif
|
||||
|
||||
### The directory environment:
|
||||
|
||||
#DVBDIR = /usr/src/v4l-dvb/linux
|
||||
MANDIR = /usr/local/man
|
||||
BINDIR = /usr/local/bin
|
||||
|
||||
PLUGINDIR= ./PLUGINS
|
||||
PLUGINLIBDIR= $(PLUGINDIR)/lib
|
||||
VIDEODIR = /video
|
||||
|
||||
### The remote control:
|
||||
|
||||
LIRC_DEVICE = /dev/lircd
|
||||
RCU_DEVICE = /dev/ttyS1
|
||||
|
||||
## Define if you want vdr to not run as root
|
||||
#VDR_USER = vdr
|
||||
|
||||
### You don't need to touch the following:
|
||||
|
||||
ifdef DVBDIR
|
||||
INCLUDES += -I$(DVBDIR)/include
|
||||
endif
|
||||
|
10
Make.global
10
Make.global
@ -1,10 +0,0 @@
|
||||
#
|
||||
# Strictly necessary Makefile options for the Video Disk Recorder
|
||||
#
|
||||
# See the main source file 'vdr.c' for copyright information and
|
||||
# how to reach the author.
|
||||
#
|
||||
# $Id: Make.global 1.2 2012/12/29 12:03:01 kls Exp $
|
||||
|
||||
# This is just a dummy file for plugins that use old style (version 1.7.33
|
||||
# or earlier) Makefiles.
|
312
Makefile
312
Makefile
@ -4,103 +4,41 @@
|
||||
# See the main source file 'vdr.c' for copyright information and
|
||||
# how to reach the author.
|
||||
#
|
||||
# $Id: Makefile 5.4 2024/10/21 19:01:16 kls Exp $
|
||||
# $Id: Makefile 1.100 2007/05/28 11:22:42 kls Exp $
|
||||
|
||||
.DELETE_ON_ERROR:
|
||||
|
||||
# Compiler flags:
|
||||
|
||||
PKG_CONFIG ?= pkg-config
|
||||
|
||||
CC ?= gcc
|
||||
CFLAGS ?= -g -O3 -Wall
|
||||
CFLAGS ?= -g -O2 -Wall
|
||||
|
||||
CXX ?= g++
|
||||
CXXFLAGS ?= -g -O3 -Wall -Werror=overloaded-virtual -Wno-parentheses
|
||||
CXXFLAGS += $(CPPFLAGS)
|
||||
CXXFLAGS ?= -g -O2 -Wall -Woverloaded-virtual
|
||||
|
||||
CDEFINES = -D_GNU_SOURCE
|
||||
CDEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
|
||||
LSIDIR = ./libsi
|
||||
MANDIR = /usr/local/man
|
||||
BINDIR = /usr/local/bin
|
||||
LIBS = -ljpeg -lpthread -ldl -lcap -lfreetype
|
||||
INCLUDES = -I/usr/include/freetype2
|
||||
|
||||
LIBS = -ljpeg -lpthread -ldl -lcap -lrt $(shell $(PKG_CONFIG) --libs freetype2 fontconfig)
|
||||
INCLUDES ?= $(shell $(PKG_CONFIG) --cflags freetype2 fontconfig)
|
||||
PLUGINDIR= ./PLUGINS
|
||||
PLUGINLIBDIR= $(PLUGINDIR)/lib
|
||||
|
||||
# Directories:
|
||||
VIDEODIR = /video
|
||||
|
||||
CWD ?= $(shell pwd)
|
||||
LSIDIR ?= $(CWD)/libsi
|
||||
PLUGINDIR ?= $(CWD)/PLUGINS
|
||||
|
||||
# Failsafe defaults for "make LCLBLD=1":
|
||||
ifdef LCLBLD
|
||||
DESTDIR ?= $(CWD)
|
||||
LOCDIR ?= $(CWD)/locale
|
||||
HDRDIR ?= $(CWD)/include
|
||||
LIBDIR ?= $(PLUGINDIR)/lib
|
||||
endif
|
||||
|
||||
DESTDIR ?=
|
||||
VIDEODIR ?= /srv/vdr/video
|
||||
CONFDIR ?= /var/lib/vdr
|
||||
ARGSDIR ?= /etc/vdr/conf.d
|
||||
CACHEDIR ?= /var/cache/vdr
|
||||
|
||||
PREFIX ?= /usr/local
|
||||
VDRROOT ?= $(PREFIX)
|
||||
BINDIR ?= $(VDRROOT)/bin
|
||||
INCDIR ?= $(VDRROOT)/include
|
||||
LIBDIR ?= $(VDRROOT)/lib/vdr
|
||||
LOCDIR ?= $(VDRROOT)/share/locale
|
||||
MANDIR ?= $(VDRROOT)/share/man
|
||||
PCDIR ?= $(VDRROOT)/lib/pkgconfig
|
||||
RESDIR ?= $(VDRROOT)/share/vdr
|
||||
|
||||
# Source documentation
|
||||
|
||||
DOXYGEN ?= /usr/bin/doxygen
|
||||
DOXYGEN = /usr/bin/doxygen
|
||||
DOXYFILE = Doxyfile
|
||||
|
||||
# User configuration
|
||||
|
||||
-include Make.config
|
||||
|
||||
# Output control
|
||||
|
||||
ifdef VERBOSE
|
||||
Q =
|
||||
else
|
||||
Q = @
|
||||
endif
|
||||
export Q
|
||||
|
||||
# Mandatory compiler flags:
|
||||
|
||||
CFLAGS += -fPIC
|
||||
CXXFLAGS += -fPIC
|
||||
|
||||
# Common include files:
|
||||
|
||||
ifdef DVBDIR
|
||||
CINCLUDES += -I$(DVBDIR)
|
||||
endif
|
||||
|
||||
# Object files
|
||||
|
||||
SILIB = $(LSIDIR)/libsi.a
|
||||
|
||||
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 mtd.o nit.o osdbase.o osd.o pat.o player.o plugin.o positioner.o\
|
||||
OBJS = audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o dvbci.o dvbosd.o\
|
||||
dvbplayer.o dvbspu.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 rcu.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\
|
||||
skinclassic.o skins.o skinsttng.o sources.o spu.o status.o svdrp.o themes.o thread.o\
|
||||
timers.o tools.o transfer.o vdr.o videodir.o
|
||||
|
||||
DEFINES += $(CDEFINES)
|
||||
INCLUDES += $(CINCLUDES)
|
||||
|
||||
ifdef HDRDIR
|
||||
HDRDIR := -I$(HDRDIR)
|
||||
endif
|
||||
ifndef NO_KBD
|
||||
DEFINES += -DREMOTE_KBD
|
||||
endif
|
||||
@ -110,40 +48,33 @@ endif
|
||||
ifdef VDR_USER
|
||||
DEFINES += -DVDR_USER=\"$(VDR_USER)\"
|
||||
endif
|
||||
ifdef BIDI
|
||||
INCLUDES += $(shell $(PKG_CONFIG) --cflags fribidi)
|
||||
DEFINES += -DBIDI
|
||||
LIBS += $(shell $(PKG_CONFIG) --libs fribidi)
|
||||
endif
|
||||
ifdef SDNOTIFY
|
||||
INCLUDES += $(shell $(PKG_CONFIG) --silence-errors --cflags libsystemd-daemon || $(PKG_CONFIG) --cflags libsystemd)
|
||||
DEFINES += -DSDNOTIFY
|
||||
LIBS += $(shell $(PKG_CONFIG) --silence-errors --libs libsystemd-daemon || $(PKG_CONFIG) --libs libsystemd)
|
||||
endif
|
||||
|
||||
LIRC_DEVICE ?= /var/run/lirc/lircd
|
||||
LIRC_DEVICE ?= /dev/lircd
|
||||
RCU_DEVICE ?= /dev/ttyS1
|
||||
|
||||
DEFINES += -DLIRC_DEVICE=\"$(LIRC_DEVICE)\" -DRCU_DEVICE=\"$(RCU_DEVICE)\"
|
||||
|
||||
DEFINES += -D_GNU_SOURCE
|
||||
|
||||
DEFINES += -DLIRC_DEVICE=\"$(LIRC_DEVICE)\"
|
||||
DEFINES += -DVIDEODIR=\"$(VIDEODIR)\"
|
||||
DEFINES += -DCONFDIR=\"$(CONFDIR)\"
|
||||
DEFINES += -DARGSDIR=\"$(ARGSDIR)\"
|
||||
DEFINES += -DCACHEDIR=\"$(CACHEDIR)\"
|
||||
DEFINES += -DRESDIR=\"$(RESDIR)\"
|
||||
DEFINES += -DPLUGINDIR=\"$(LIBDIR)\"
|
||||
DEFINES += -DLOCDIR=\"$(LOCDIR)\"
|
||||
DEFINES += -DPLUGINDIR=\"$(PLUGINLIBDIR)\"
|
||||
|
||||
# The version numbers of VDR and the plugin API (taken from VDR's "config.h"):
|
||||
|
||||
VDRVERSION = $(shell sed -ne '/define VDRVERSION/s/^.*"\(.*\)".*$$/\1/p' config.h)
|
||||
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' config.h)
|
||||
|
||||
all: vdr i18n plugins
|
||||
ifdef VFAT
|
||||
# for people who want their video directory on a VFAT partition
|
||||
DEFINES += -DVFAT
|
||||
endif
|
||||
|
||||
all: vdr
|
||||
|
||||
# Implicit rules:
|
||||
|
||||
%.o: %.c
|
||||
@echo CC $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||
|
||||
# Dependencies:
|
||||
|
||||
@ -157,73 +88,12 @@ $(DEPFILE): Makefile
|
||||
# The main program:
|
||||
|
||||
vdr: $(OBJS) $(SILIB)
|
||||
@echo LD $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) -rdynamic $(LDFLAGS) $(OBJS) $(LIBS) $(SILIB) -o vdr
|
||||
$(CXX) $(CXXFLAGS) -rdynamic $(OBJS) $(NCURSESLIB) $(LIBS) $(LIBDIRS) $(SILIB) -o vdr
|
||||
|
||||
# The libsi library:
|
||||
|
||||
$(SILIB): make-libsi
|
||||
@$(MAKE) --no-print-directory -C $(LSIDIR) CXXFLAGS="$(CXXFLAGS)" DEFINES="$(CDEFINES)" all
|
||||
make-libsi: # empty rule makes sure the sub-make for libsi is always called
|
||||
|
||||
# pkg-config file:
|
||||
|
||||
.PHONY: vdr.pc
|
||||
vdr.pc:
|
||||
@echo "vdrrootdir=$(VDRROOT)" > $@
|
||||
@echo "bindir=$(BINDIR)" >> $@
|
||||
@echo "incdir=$(INCDIR)" >> $@
|
||||
@echo "mandir=$(MANDIR)" >> $@
|
||||
@echo "videodir=$(VIDEODIR)" >> $@
|
||||
@echo "configdir=$(CONFDIR)" >> $@
|
||||
@echo "argsdir=$(ARGSDIR)" >> $@
|
||||
@echo "cachedir=$(CACHEDIR)" >> $@
|
||||
@echo "resdir=$(RESDIR)" >> $@
|
||||
@echo "libdir=$(LIBDIR)" >> $@
|
||||
@echo "locdir=$(LOCDIR)" >> $@
|
||||
@echo "plgcfg=$(PLGCFG)" >> $@
|
||||
@echo "apiversion=$(APIVERSION)" >> $@
|
||||
@echo "cflags=$(CFLAGS) $(CDEFINES) $(CINCLUDES) $(HDRDIR)" >> $@
|
||||
@echo "cxxflags=$(CXXFLAGS) $(CDEFINES) $(CINCLUDES) $(HDRDIR)" >> $@
|
||||
@echo "" >> $@
|
||||
@echo "Name: VDR" >> $@
|
||||
@echo "Description: Video Disk Recorder" >> $@
|
||||
@echo "URL: https://www.tvdr.de/" >> $@
|
||||
@echo "Version: $(VDRVERSION)" >> $@
|
||||
@echo "Cflags: \$${cflags}" >> $@
|
||||
|
||||
# Internationalization (I18N):
|
||||
|
||||
PODIR = po
|
||||
LOCALEDIR = locale
|
||||
I18Npo = $(wildcard $(PODIR)/*.po)
|
||||
I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
|
||||
I18Nmsgs = $(addprefix $(LOCALEDIR)/, $(addsuffix /LC_MESSAGES/vdr.mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
|
||||
I18Npot = $(PODIR)/vdr.pot
|
||||
|
||||
%.mo: %.po
|
||||
@echo MO $@
|
||||
$(Q)msgfmt -c -o $@ $<
|
||||
|
||||
$(I18Npot): $(wildcard *.c)
|
||||
@echo GT $@
|
||||
$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=VDR --package-version=$(VDRVERSION) --msgid-bugs-address='<vdr-bugs@tvdr.de>' -o $@ `ls $^`
|
||||
|
||||
%.po: $(I18Npot)
|
||||
@echo PO $@
|
||||
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
|
||||
@touch $@
|
||||
|
||||
$(I18Nmsgs): $(LOCALEDIR)/%/LC_MESSAGES/vdr.mo: $(PODIR)/%.mo
|
||||
@echo IN $@
|
||||
$(Q)install -D -m644 $< $@
|
||||
|
||||
.PHONY: i18n
|
||||
i18n: $(I18Nmsgs)
|
||||
|
||||
install-i18n: i18n
|
||||
@mkdir -p $(DESTDIR)$(LOCDIR)
|
||||
cp -r $(LOCALEDIR)/* $(DESTDIR)$(LOCDIR)
|
||||
$(SILIB):
|
||||
$(MAKE) -C $(LSIDIR) all
|
||||
|
||||
# The 'include' directory (for plugins):
|
||||
|
||||
@ -235,133 +105,71 @@ include-dir:
|
||||
|
||||
# Plugins:
|
||||
|
||||
plugins: include-dir vdr.pc
|
||||
plugins: include-dir
|
||||
@failed="";\
|
||||
noapiv="";\
|
||||
oldmakefile="";\
|
||||
for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do\
|
||||
echo; echo "*** Plugin $$i:";\
|
||||
# No APIVERSION: Skip\
|
||||
echo "Plugin $$i:";\
|
||||
if ! grep -q "\$$(LIBDIR)/.*\$$(APIVERSION)" "$(PLUGINDIR)/src/$$i/Makefile" ; then\
|
||||
echo "ERROR: plugin $$i doesn't honor APIVERSION - not compiled!";\
|
||||
noapiv="$$noapiv $$i";\
|
||||
continue;\
|
||||
fi;\
|
||||
# Old Makefile\
|
||||
if ! grep -q "PKGCFG" "$(PLUGINDIR)/src/$$i/Makefile" ; then\
|
||||
echo "WARNING: plugin $$i is using an old Makefile!";\
|
||||
oldmakefile="$$oldmakefile $$i";\
|
||||
$(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" CFLAGS="$(CFLAGS) $(CDEFINES) $(CINCLUDES)" CXXFLAGS="$(CXXFLAGS) $(CDEFINES) $(CINCLUDES)" LIBDIR="$(PLUGINDIR)/lib" VDRDIR="$(CWD)" all || failed="$$failed $$i";\
|
||||
continue;\
|
||||
fi;\
|
||||
# New Makefile\
|
||||
INCLUDES="-I$(CWD)/include"\
|
||||
$(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" VDRDIR="$(CWD)" || failed="$$failed $$i";\
|
||||
if [ -n "$(LCLBLD)" ] ; then\
|
||||
(cd $(PLUGINDIR)/src/$$i; for l in `find -name "libvdr-*.so" -o -name "lib$$i-*.so"`; do install -D $$l $(LIBDIR)/`basename $$l`.$(APIVERSION); done);\
|
||||
if [ -d $(PLUGINDIR)/src/$$i/po ]; then\
|
||||
for l in `ls $(PLUGINDIR)/src/$$i/po/*.mo`; do\
|
||||
install -D -m644 $$l $(LOCDIR)/`basename $$l | cut -d. -f1`/LC_MESSAGES/vdr-$$i.mo;\
|
||||
$(MAKE) -C "$(PLUGINDIR)/src/$$i" all || failed="$$failed $$i";\
|
||||
done;\
|
||||
fi;\
|
||||
fi;\
|
||||
done;\
|
||||
# Conclusion\
|
||||
if [ -n "$$noapiv" ] ; then echo; echo "*** plugins without APIVERSION:$$noapiv"; echo; fi;\
|
||||
if [ -n "$$oldmakefile" ] ; then\
|
||||
echo; echo "*** plugins with old Makefile:$$oldmakefile"; echo;\
|
||||
echo "**********************************************************************";\
|
||||
echo "*** While this currently still works, it is strongly recommended";\
|
||||
echo "*** that you convert old Makefiles to the new style used since";\
|
||||
echo "*** VDR version 1.7.36. Support for old style Makefiles may be dropped";\
|
||||
echo "*** in future versions of VDR.";\
|
||||
echo "**********************************************************************";\
|
||||
fi;\
|
||||
if [ -n "$$failed" ] ; then echo; echo "*** failed plugins:$$failed"; echo; exit 1; fi
|
||||
if [ -n "$$failed" ] ; then echo; echo "*** failed plugins:$$failed"; echo; fi
|
||||
|
||||
clean-plugins: vdr.pc
|
||||
@for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do $(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" VDRDIR="$(CWD)" clean; done
|
||||
clean-plugins:
|
||||
@for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do $(MAKE) -C "$(PLUGINDIR)/src/$$i" clean; done
|
||||
@-rm -f $(PLUGINDIR)/lib/lib*-*.so.$(APIVERSION)
|
||||
|
||||
# Install the files (note that 'install-pc' must be first!):
|
||||
# Install the files:
|
||||
|
||||
install: install-pc install-bin install-conf install-doc install-plugins install-i18n install-includes
|
||||
install: install-bin install-conf install-doc install-plugins
|
||||
|
||||
# VDR binary:
|
||||
|
||||
install-bin: vdr
|
||||
@mkdir -p $(DESTDIR)$(BINDIR)
|
||||
@cp --remove-destination vdr svdrpsend $(DESTDIR)$(BINDIR)
|
||||
@mkdir -p $(BINDIR)
|
||||
@cp --remove-destination vdr runvdr $(BINDIR)
|
||||
|
||||
# Configuration files:
|
||||
|
||||
install-dirs:
|
||||
@mkdir -p $(DESTDIR)$(VIDEODIR)
|
||||
@mkdir -p $(DESTDIR)$(CONFDIR)
|
||||
@mkdir -p $(DESTDIR)$(ARGSDIR)
|
||||
@mkdir -p $(DESTDIR)$(CACHEDIR)
|
||||
@mkdir -p $(DESTDIR)$(RESDIR)
|
||||
|
||||
install-conf: install-dirs
|
||||
# 'cp -n' may be broken, so let's do it the hard way
|
||||
@for i in *.conf; do\
|
||||
if ! [ -e $(DESTDIR)$(CONFDIR)/$$i ] ; then\
|
||||
cp -p $$i $(DESTDIR)$(CONFDIR);\
|
||||
fi\
|
||||
done
|
||||
install-conf:
|
||||
@if [ ! -d $(VIDEODIR) ]; then\
|
||||
mkdir -p $(VIDEODIR);\
|
||||
cp *.conf $(VIDEODIR);\
|
||||
fi
|
||||
|
||||
# Documentation:
|
||||
|
||||
install-doc:
|
||||
@mkdir -p $(DESTDIR)$(MANDIR)/man1
|
||||
@mkdir -p $(DESTDIR)$(MANDIR)/man5
|
||||
@gzip -c vdr.1 > $(DESTDIR)$(MANDIR)/man1/vdr.1.gz
|
||||
@gzip -c vdr.5 > $(DESTDIR)$(MANDIR)/man5/vdr.5.gz
|
||||
@gzip -c svdrpsend.1 > $(DESTDIR)$(MANDIR)/man1/svdrpsend.1.gz
|
||||
@mkdir -p $(MANDIR)/man1
|
||||
@mkdir -p $(MANDIR)/man5
|
||||
@gzip -c vdr.1 > $(MANDIR)/man1/vdr.1.gz
|
||||
@gzip -c vdr.5 > $(MANDIR)/man5/vdr.5.gz
|
||||
|
||||
# Plugins:
|
||||
|
||||
install-plugins: plugins
|
||||
@-for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do\
|
||||
echo; echo "*** Plugin $$i:";\
|
||||
$(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" VDRDIR=$(CWD) DESTDIR=$(DESTDIR) install;\
|
||||
done
|
||||
@if [ -d $(PLUGINDIR)/lib ] ; then\
|
||||
for i in `find $(PLUGINDIR)/lib -name 'lib*-*.so.$(APIVERSION)'`; do\
|
||||
install -D $$i $(DESTDIR)$(LIBDIR);\
|
||||
done;\
|
||||
fi
|
||||
|
||||
# Includes:
|
||||
|
||||
install-includes: include-dir
|
||||
@mkdir -p $(DESTDIR)$(INCDIR)
|
||||
@cp -pLR include/vdr include/libsi $(DESTDIR)$(INCDIR)
|
||||
|
||||
# pkg-config file:
|
||||
|
||||
install-pc: vdr.pc
|
||||
if [ -n "$(PCDIR)" ] ; then\
|
||||
mkdir -p $(DESTDIR)$(PCDIR) ;\
|
||||
cp vdr.pc $(DESTDIR)$(PCDIR) ;\
|
||||
fi
|
||||
@mkdir -p $(PLUGINLIBDIR)
|
||||
@cp --remove-destination $(PLUGINDIR)/lib/lib*-*.so.$(APIVERSION) $(PLUGINLIBDIR)
|
||||
|
||||
# Source documentation:
|
||||
|
||||
srcdoc:
|
||||
@cat $(DOXYFILE) > $(DOXYFILE).tmp
|
||||
@cp $(DOXYFILE) $(DOXYFILE).tmp
|
||||
@echo PROJECT_NUMBER = $(VDRVERSION) >> $(DOXYFILE).tmp
|
||||
@chmod +x $(DOXYFILE).filter
|
||||
$(DOXYGEN) $(DOXYFILE).tmp
|
||||
@rm $(DOXYFILE).tmp
|
||||
|
||||
# Housekeeping:
|
||||
|
||||
clean:
|
||||
@$(MAKE) --no-print-directory -C $(LSIDIR) clean
|
||||
@-rm -f $(OBJS) $(DEPFILE) vdr vdr.pc core* *~
|
||||
@-rm -rf $(LOCALEDIR) $(PODIR)/*~ $(PODIR)/*.mo $(PODIR)/*.pot
|
||||
@-rm -rf include
|
||||
@-rm -rf srcdoc
|
||||
$(MAKE) -C $(LSIDIR) clean
|
||||
-rm -f $(OBJS) $(DEPFILE) vdr core* *~
|
||||
-rm -rf include
|
||||
-rm -rf srcdoc
|
||||
CLEAN: clean
|
||||
distclean: clean-plugins clean
|
||||
|
||||
|
902
PLUGINS.html
902
PLUGINS.html
File diff suppressed because it is too large
Load Diff
@ -1,34 +0,0 @@
|
||||
VDR Plugin 'epgtableid0' Revision History
|
||||
-----------------------------------------
|
||||
|
||||
2012-03-10: Version 0.0.1
|
||||
|
||||
- Initial revision.
|
||||
|
||||
2012-12-27: Version 0.0.2
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-01-12: Version 0.0.3
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-03-31: Version 2.0.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2014-01-01: Version 2.1.1
|
||||
|
||||
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
||||
|
||||
2015-02-19: Version 2.2.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2018-04-15: Version 2.4.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2021-12-27: Version 2.6.0
|
||||
|
||||
- Official release.
|
@ -1,97 +0,0 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
# By default the main source file also carries this name.
|
||||
|
||||
PLUGIN = epgtableid0
|
||||
|
||||
### The version number of this plugin (taken from the main source file):
|
||||
|
||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||
|
||||
### The directory environment:
|
||||
|
||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||
PKG_CONFIG ?= pkg-config
|
||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
||||
LIBDIR = $(call PKGCFG,libdir)
|
||||
PLGCFG = $(call PKGCFG,plgcfg)
|
||||
#
|
||||
TMPDIR ?= /tmp
|
||||
|
||||
### The compiler options:
|
||||
|
||||
export CFLAGS = $(call PKGCFG,cflags)
|
||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
||||
|
||||
### The version number of VDR's plugin API:
|
||||
|
||||
APIVERSION = $(call PKGCFG,apiversion)
|
||||
|
||||
### Allow user defined options to overwrite defaults:
|
||||
|
||||
-include $(PLGCFG)
|
||||
|
||||
### The name of the distribution archive:
|
||||
|
||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||
PACKAGE = vdr-$(ARCHIVE)
|
||||
|
||||
### The name of the shared object file:
|
||||
|
||||
SOFILE = libvdr-$(PLUGIN).so
|
||||
|
||||
### Includes and Defines (add further entries here):
|
||||
|
||||
INCLUDES +=
|
||||
|
||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
|
||||
### The object files (add further files here):
|
||||
|
||||
OBJS = $(PLUGIN).o
|
||||
|
||||
### The main target:
|
||||
|
||||
all: $(SOFILE)
|
||||
|
||||
### Implicit rules:
|
||||
|
||||
%.o: %.c
|
||||
@echo CC $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||
|
||||
### Dependencies:
|
||||
|
||||
MAKEDEP = $(CXX) -MM -MG
|
||||
DEPFILE = .dependencies
|
||||
$(DEPFILE): Makefile
|
||||
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
|
||||
-include $(DEPFILE)
|
||||
|
||||
### Targets:
|
||||
|
||||
$(SOFILE): $(OBJS)
|
||||
@echo LD $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
||||
|
||||
install-lib: $(SOFILE)
|
||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
||||
|
||||
install: install-lib
|
||||
|
||||
dist: clean
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
||||
@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE)
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
@echo Distribution package created as $(PACKAGE).tgz
|
||||
|
||||
clean:
|
||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
@ -1,19 +0,0 @@
|
||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||
|
||||
Written by: Klaus Schmidinger <vdr@tvdr.de>
|
||||
|
||||
Project's homepage: https://www.tvdr.de
|
||||
|
||||
Latest version available at: https://www.tvdr.de
|
||||
|
||||
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.
|
||||
See the file COPYING for more information.
|
||||
|
||||
Description:
|
||||
|
||||
The special handling of EPG events with table id 0x00 has been dropped
|
||||
in VDR version 1.7.26, and replaced by a more felxible "EPG Handler"
|
||||
concept. You can use this plugin to get the previous functionality back.
|
@ -1,98 +0,0 @@
|
||||
/*
|
||||
* epgtableid0.c: A plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: epgtableid0.c 4.1 2018/04/10 13:00:18 kls Exp $
|
||||
*/
|
||||
|
||||
#include <vdr/epg.h>
|
||||
#include <vdr/plugin.h>
|
||||
|
||||
static const char *VERSION = "2.4.0";
|
||||
static const char *DESCRIPTION = "EPG handler for events with table id 0x00";
|
||||
|
||||
// --- cTable0Handler --------------------------------------------------------
|
||||
|
||||
class cTable0Handler : public cEpgHandler {
|
||||
private:
|
||||
bool Ignore(cEvent *Event) { return Event->TableID() == 0x00; }
|
||||
public:
|
||||
virtual bool SetEventID(cEvent *Event, tEventID EventID);
|
||||
virtual bool SetStartTime(cEvent *Event, time_t StartTime);
|
||||
virtual bool SetDuration(cEvent *Event, int Duration);
|
||||
virtual bool SetTitle(cEvent *Event, const char *Title);
|
||||
virtual bool SetShortText(cEvent *Event, const char *ShortText);
|
||||
virtual bool SetDescription(cEvent *Event, const char *Description);
|
||||
virtual bool SetContents(cEvent *Event, uchar *Contents);
|
||||
virtual bool SetParentalRating(cEvent *Event, int ParentalRating);
|
||||
virtual bool SetVps(cEvent *Event, time_t Vps);
|
||||
virtual bool FixEpgBugs(cEvent *Event);
|
||||
};
|
||||
|
||||
bool cTable0Handler::SetEventID(cEvent *Event, tEventID EventID)
|
||||
{
|
||||
return Ignore(Event);
|
||||
}
|
||||
|
||||
bool cTable0Handler::SetStartTime(cEvent *Event, time_t StartTime)
|
||||
{
|
||||
return Ignore(Event);
|
||||
}
|
||||
|
||||
bool cTable0Handler::SetDuration(cEvent *Event, int Duration)
|
||||
{
|
||||
return Ignore(Event);
|
||||
}
|
||||
|
||||
bool cTable0Handler::SetTitle(cEvent *Event, const char *Title)
|
||||
{
|
||||
return Ignore(Event);
|
||||
}
|
||||
|
||||
bool cTable0Handler::SetShortText(cEvent *Event, const char *ShortText)
|
||||
{
|
||||
return Ignore(Event);
|
||||
}
|
||||
|
||||
bool cTable0Handler::SetDescription(cEvent *Event, const char *Description)
|
||||
{
|
||||
return Ignore(Event);
|
||||
}
|
||||
|
||||
bool cTable0Handler::SetContents(cEvent *Event, uchar *Contents)
|
||||
{
|
||||
return Ignore(Event);
|
||||
}
|
||||
|
||||
bool cTable0Handler::SetParentalRating(cEvent *Event, int ParentalRating)
|
||||
{
|
||||
return Ignore(Event);
|
||||
}
|
||||
|
||||
bool cTable0Handler::SetVps(cEvent *Event, time_t Vps)
|
||||
{
|
||||
return Ignore(Event);
|
||||
}
|
||||
|
||||
bool cTable0Handler::FixEpgBugs(cEvent *Event)
|
||||
{
|
||||
return Ignore(Event);
|
||||
}
|
||||
|
||||
// --- cPluginEpgtableid0 ----------------------------------------------------
|
||||
|
||||
class cPluginEpgtableid0 : public cPlugin {
|
||||
public:
|
||||
virtual const char *Version(void) { return VERSION; }
|
||||
virtual const char *Description(void) { return DESCRIPTION; }
|
||||
virtual bool Initialize(void);
|
||||
};
|
||||
|
||||
bool cPluginEpgtableid0::Initialize(void)
|
||||
{
|
||||
new cTable0Handler;
|
||||
return true;
|
||||
}
|
||||
|
||||
VDRPLUGINCREATOR(cPluginEpgtableid0); // Don't touch this!
|
@ -49,57 +49,3 @@ VDR Plugin 'hello' Revision History
|
||||
2006-04-22: Version 0.1.1
|
||||
|
||||
- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
|
||||
|
||||
2007-08-11: Version 0.2.0
|
||||
|
||||
- Switched to 'gettext' internationalization.
|
||||
|
||||
2007-08-15: Version 0.2.1
|
||||
|
||||
- Moved the "all" target in the Makefile before the "Implicit rules",
|
||||
so that a plain "make" will compile everything.
|
||||
|
||||
2008-03-18: Version 0.2.2
|
||||
|
||||
- Updated the Croatian language texts (thanks to Adrian Caval).
|
||||
|
||||
2008-09-06: Version 0.2.3
|
||||
|
||||
- Updated the Turkish language texts (thanks to Oktay Yolgeçen).
|
||||
|
||||
2009-12-06: Version 0.2.4
|
||||
|
||||
- Several code modifications to avoid compiler warnings (thanks to Winfried Köhler).
|
||||
|
||||
2010-02-28: Version 0.2.5
|
||||
|
||||
- Added Lithuanian language translations (thanks to Valdemaras Pipiras).
|
||||
|
||||
2012-12-27: Version 0.2.6
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-01-12: Version 0.2.7
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-03-31: Version 2.0.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2014-01-01: Version 2.1.1
|
||||
|
||||
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
||||
|
||||
2015-02-19: Version 2.2.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2018-04-15: Version 2.4.0
|
||||
|
||||
- Updated the French OSD texts (thanks to Bernard Jaulin).
|
||||
- Official release.
|
||||
|
||||
2021-12-27: Version 2.6.0
|
||||
|
||||
- Official release.
|
||||
|
@ -1,121 +1,75 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||
# $Id: Makefile 1.15 2006/09/09 12:38:35 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
# By default the main source file also carries this name.
|
||||
|
||||
#
|
||||
PLUGIN = hello
|
||||
|
||||
### The version number of this plugin (taken from the main source file):
|
||||
|
||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||
|
||||
### The C++ compiler and options:
|
||||
|
||||
CXX ?= g++
|
||||
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual
|
||||
|
||||
### The directory environment:
|
||||
|
||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||
PKG_CONFIG ?= pkg-config
|
||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
||||
LIBDIR = $(call PKGCFG,libdir)
|
||||
LOCDIR = $(call PKGCFG,locdir)
|
||||
PLGCFG = $(call PKGCFG,plgcfg)
|
||||
#
|
||||
TMPDIR ?= /tmp
|
||||
|
||||
### The compiler options:
|
||||
|
||||
export CFLAGS = $(call PKGCFG,cflags)
|
||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
||||
|
||||
### The version number of VDR's plugin API:
|
||||
|
||||
APIVERSION = $(call PKGCFG,apiversion)
|
||||
VDRDIR = ../../..
|
||||
LIBDIR = ../../lib
|
||||
TMPDIR = /tmp
|
||||
|
||||
### Allow user defined options to overwrite defaults:
|
||||
|
||||
-include $(PLGCFG)
|
||||
-include $(VDRDIR)/Make.config
|
||||
|
||||
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||
|
||||
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||
|
||||
### The name of the distribution archive:
|
||||
|
||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||
PACKAGE = vdr-$(ARCHIVE)
|
||||
|
||||
### The name of the shared object file:
|
||||
|
||||
SOFILE = libvdr-$(PLUGIN).so
|
||||
|
||||
### Includes and Defines (add further entries here):
|
||||
|
||||
INCLUDES +=
|
||||
INCLUDES += -I$(VDRDIR)/include
|
||||
|
||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
|
||||
### The object files (add further files here):
|
||||
|
||||
OBJS = $(PLUGIN).o
|
||||
|
||||
### The main target:
|
||||
|
||||
all: $(SOFILE) i18n
|
||||
OBJS = $(PLUGIN).o i18n.o
|
||||
|
||||
### Implicit rules:
|
||||
|
||||
%.o: %.c
|
||||
@echo CC $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||
|
||||
### Dependencies:
|
||||
# Dependencies:
|
||||
|
||||
MAKEDEP = $(CXX) -MM -MG
|
||||
MAKEDEP = g++ -MM -MG
|
||||
DEPFILE = .dependencies
|
||||
$(DEPFILE): Makefile
|
||||
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
|
||||
-include $(DEPFILE)
|
||||
|
||||
### Internationalization (I18N):
|
||||
|
||||
PODIR = po
|
||||
I18Npo = $(wildcard $(PODIR)/*.po)
|
||||
I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
|
||||
I18Nmsgs = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
|
||||
I18Npot = $(PODIR)/$(PLUGIN).pot
|
||||
|
||||
%.mo: %.po
|
||||
@echo MO $@
|
||||
$(Q)msgfmt -c -o $@ $<
|
||||
|
||||
$(I18Npot): $(wildcard *.c)
|
||||
@echo GT $@
|
||||
$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
|
||||
|
||||
%.po: $(I18Npot)
|
||||
@echo PO $@
|
||||
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
|
||||
@touch $@
|
||||
|
||||
$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
|
||||
install -D -m644 $< $@
|
||||
|
||||
.PHONY: i18n
|
||||
i18n: $(I18Nmo) $(I18Npot)
|
||||
|
||||
install-i18n: $(I18Nmsgs)
|
||||
|
||||
### Targets:
|
||||
|
||||
$(SOFILE): $(OBJS)
|
||||
@echo LD $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
||||
all: libvdr-$(PLUGIN).so
|
||||
|
||||
install-lib: $(SOFILE)
|
||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
||||
libvdr-$(PLUGIN).so: $(OBJS)
|
||||
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
|
||||
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||
|
||||
install: install-lib install-i18n
|
||||
|
||||
dist: $(I18Npo) clean
|
||||
dist: clean
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
||||
@ -124,5 +78,4 @@ dist: $(I18Npo) clean
|
||||
@echo Distribution package created as $(PACKAGE).tgz
|
||||
|
||||
clean:
|
||||
@-rm -f $(PODIR)/*.mo $(PODIR)/*.pot
|
||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
||||
|
@ -1,15 +1,11 @@
|
||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||
|
||||
Written by: Klaus Schmidinger <vdr@tvdr.de>
|
||||
Written by: Klaus Schmidinger <kls@cadsoft.de>
|
||||
|
||||
Project's homepage: https://www.tvdr.de
|
||||
Project's homepage: www.cadsoft.de/people/kls/vdr
|
||||
|
||||
Latest version available at: https://www.tvdr.de
|
||||
Latest version available at: www.cadsoft.de/people/kls/vdr/software.htm
|
||||
|
||||
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.
|
||||
See the file COPYING for more information.
|
||||
See the file COPYING for license information.
|
||||
|
||||
Description: This is a small demo of the VDR plugin interface.
|
||||
|
@ -3,18 +3,18 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: hello.c 4.1 2018/04/10 13:00:22 kls Exp $
|
||||
* $Id: hello.c 1.12 2006/04/22 09:31:52 kls Exp $
|
||||
*/
|
||||
|
||||
#include <getopt.h>
|
||||
#include <stdlib.h>
|
||||
#include <vdr/i18n.h>
|
||||
#include <vdr/interface.h>
|
||||
#include <vdr/plugin.h>
|
||||
#include "i18n.h"
|
||||
|
||||
static const char *VERSION = "2.4.0";
|
||||
static const char *DESCRIPTION = trNOOP("A friendly greeting");
|
||||
static const char *MAINMENUENTRY = trNOOP("Hello");
|
||||
static const char *VERSION = "0.1.1";
|
||||
static const char *DESCRIPTION = "A friendly greeting";
|
||||
static const char *MAINMENUENTRY = "Hello";
|
||||
|
||||
class cPluginHello : public cPlugin {
|
||||
private:
|
||||
@ -96,7 +96,7 @@ bool cPluginHello::ProcessArgs(int argc, char *argv[])
|
||||
static struct option long_options[] = {
|
||||
{ "aaa", required_argument, NULL, 'a' },
|
||||
{ "bbb", no_argument, NULL, 'b' },
|
||||
{ NULL, no_argument, NULL, 0 }
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
int c;
|
||||
@ -115,6 +115,7 @@ bool cPluginHello::ProcessArgs(int argc, char *argv[])
|
||||
bool cPluginHello::Start(void)
|
||||
{
|
||||
// Start any background activities the plugin shall perform.
|
||||
RegisterI18n(Phrases);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
145
PLUGINS/src/hello/i18n.c
Normal file
145
PLUGINS/src/hello/i18n.c
Normal file
@ -0,0 +1,145 @@
|
||||
/*
|
||||
* i18n.c: Internationalization
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: i18n.c 1.6 2006/04/22 09:30:57 kls Exp $
|
||||
*/
|
||||
|
||||
#include "i18n.h"
|
||||
|
||||
const tI18nPhrase Phrases[] = {
|
||||
{ "Hello",
|
||||
"Hallo",
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"Hei",
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"¿àØÒÕâ!",
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"Ahoj",
|
||||
},
|
||||
{ "Hello world!",
|
||||
"Hallo Welt!",
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"Hei maailma!",
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"·ÔàÐÒáâÒãÙ ÜØà!",
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"Ahoj svìte!",
|
||||
},
|
||||
{ "Howdy folks!",
|
||||
"Tach zusammen!",
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"Mitä kuuluu?",
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"ºÐÚ ßÞÖØÒÐÕâÕ?",
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"Nazdar vespolek!",
|
||||
},
|
||||
{ "A friendly greeting",
|
||||
"Ein freundlicher Gruß",
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"Ystävällisin terveisin",
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"´àãÖÕáÚÞÕ ßàØÒÕâáâÒØÕ",
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"Pøátelský pozdrav",
|
||||
},
|
||||
{ "Greeting time (s)",
|
||||
"Dauer des Grußes (s)",
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"Tervehdysaika (s)",
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"¿àÞÔÞÛÖØâÕÛìÝÞáâì ßàØÒÕâáâÒØï",
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"Èas pozdravu (s)",
|
||||
},
|
||||
{ "Use alternate greeting",
|
||||
"Alternativen Gruß verwenden",
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"Käytä vaihtoehtoista tervehdystä",
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"°ÛìâÕàÝÐâØÒÝÞÕ ßàØÒÕâáâÒØÕ",
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"Pou¾ít alternativní pozdrav",
|
||||
},
|
||||
{ NULL }
|
||||
};
|
16
PLUGINS/src/hello/i18n.h
Normal file
16
PLUGINS/src/hello/i18n.h
Normal file
@ -0,0 +1,16 @@
|
||||
/*
|
||||
* i18n.h: Internationalization
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: i18n.h 1.2 2002/05/11 14:48:16 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef _I18N__H
|
||||
#define _I18N__H
|
||||
|
||||
#include <vdr/i18n.h>
|
||||
|
||||
extern const tI18nPhrase Phrases[];
|
||||
|
||||
#endif //_I18N__H
|
@ -1,37 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Marc Rovira Vall <tm05462@salleURL.edu>, 2003
|
||||
# Ramon Roca <ramon.roca@xcombo.com>, 2003
|
||||
# Jordi Vilà <jvila@tinet.org>, 2003
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Jordi Vilà <jvila@tinet.org>\n"
|
||||
"Language-Team: Catalan <vdr@linuxtv.org>\n"
|
||||
"Language: ca\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
@ -1,35 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Vladimír Bárta <vladimir.barta@k2atmitec.cz>, 2006
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Vladimír Bárta <vladimir.barta@k2atmitec.cz>\n"
|
||||
"Language-Team: Czech <vdr@linuxtv.org>\n"
|
||||
"Language: cs\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr "Pøátelský pozdrav"
|
||||
|
||||
msgid "Hello"
|
||||
msgstr "Ahoj"
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr "Èas pozdravu (s)"
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr "Pou¾ít alternativní pozdrav"
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr "Nazdar vespolek!"
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr "Ahoj svìte!"
|
@ -1,35 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Mogens Elneff <mogens@elneff.dk>, 2004
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Mogens Elneff <mogens@elneff.dk>\n"
|
||||
"Language-Team: Danish <vdr@linuxtv.org>\n"
|
||||
"Language: da\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
@ -1,35 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Klaus Schmidinger <vdr@tvdr.de>, 2000
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Klaus Schmidinger <vdr@tvdr.de>\n"
|
||||
"Language-Team: German <vdr@linuxtv.org>\n"
|
||||
"Language: de\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr "Ein freundlicher Gruß"
|
||||
|
||||
msgid "Hello"
|
||||
msgstr "Hallo"
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr "Dauer des Grußes (s)"
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr "Alternativen Gruß verwenden"
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr "Tach zusammen!"
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr "Hallo Welt!"
|
@ -1,35 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Dimitrios Dimitrakos <mail@dimitrios.de>, 2002
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Dimitrios Dimitrakos <mail@dimitrios.de>\n"
|
||||
"Language-Team: Greek <vdr@linuxtv.org>\n"
|
||||
"Language: el\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-7\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
@ -1,35 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Ruben Nunez Francisco <ruben.nunez@tang-it.com>, 2002
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Ruben Nunez Francisco <ruben.nunez@tang-it.com>\n"
|
||||
"Language-Team: Spanish <vdr@linuxtv.org>\n"
|
||||
"Language: es\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
@ -1,35 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Arthur Konovalov <artlov@gmail.com>, 2004, 2015
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Arthur Konovalov <artlov@gmail.com>\n"
|
||||
"Language-Team: Estonian <vdr@linuxtv.org>\n"
|
||||
"Language: et\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr "Sõbralik tervitus"
|
||||
|
||||
msgid "Hello"
|
||||
msgstr "Tere"
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr "Tervituse kestus (s)"
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr "Vahelduv tervitus"
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr "Kuidas käsi käib?"
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr "Tere, maailm!"
|
@ -1,38 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Hannu Savolainen <hannu@opensound.com>, 2002
|
||||
# Jaakko Hyvätti <jaakko@hyvatti.iki.fi>, 2002
|
||||
# Niko Tarnanen <niko.tarnanen@hut.fi>, 2003
|
||||
# Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>, 2003
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>\n"
|
||||
"Language-Team: Finnish <vdr@linuxtv.org>\n"
|
||||
"Language: fi\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr "Ystävällisin terveisin"
|
||||
|
||||
msgid "Hello"
|
||||
msgstr "Hei"
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr "Tervehdysaika (s)"
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr "Käytä vaihtoehtoista tervehdystä"
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr "Mitä kuuluu?"
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr "Hei maailma!"
|
@ -1,39 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Jean-Claude Repetto <jc@repetto.org>, 2001
|
||||
# Olivier Jacques <jacquesolivier@hotmail.com>, 2003
|
||||
# Gregoire Favre <greg@magma.unil.ch>, 2003
|
||||
# Nicolas Huillard <nhuillard@e-dition.fr>, 2005
|
||||
# Bernard Jaulin <bernard.jaulin@gmail.com>, 2018
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2018-04-14 8:34+0200\n"
|
||||
"Last-Translator: Bernard Jaulin <bernard.jaulin@gmail.com>\n"
|
||||
"Language-Team: French <vdr@linuxtv.org>\n"
|
||||
"Language: fr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr "Bien le bonjour"
|
||||
|
||||
msgid "Hello"
|
||||
msgstr "Hello"
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr "Durée pour le salut (s)"
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr "Changer de salutation"
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr "Bonjour à tous !"
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr "Bonjour le monde !"
|
@ -1,35 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Adrian Caval <anrxc@sysphere.org>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2008-03-17 19:52+0100\n"
|
||||
"Last-Translator: Adrian Caval <anrxc@sysphere.org>\n"
|
||||
"Language-Team: Croatian <vdr@linuxtv.org>\n"
|
||||
"Language: hr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr "Prijateljska dobrodo¹lica"
|
||||
|
||||
msgid "Hello"
|
||||
msgstr "Pozdrav"
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr "Trajanje dobrodo¹lice (s)"
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr "Koristi alternativni pozdrav"
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr "Pozdrav ljudi!"
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr "Pozdrav svijete!"
|
@ -1,36 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Istvan Koenigsberger <istvnko@hotmail.com>, 2002
|
||||
# Guido Josten <guido.josten@t-online.de>, 2002
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Istvan Koenigsberger <istvnko@hotmail.com>, Guido Josten <guido.josten@t-online.de>\n"
|
||||
"Language-Team: Hungarian <vdr@linuxtv.org>\n"
|
||||
"Language: hu\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
@ -1,35 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Diego Pierotto <vdr-italian@tiscali.it>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2008-01-27 20:11+0100\n"
|
||||
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
|
||||
"Language-Team: Italian <vdr@linuxtv.org>\n"
|
||||
"Language: it\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr "Un saluto cordiale"
|
||||
|
||||
msgid "Hello"
|
||||
msgstr "Ciao"
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr "Tempo saluto (s)"
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr "Utilizza saluto alternativo"
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr "Come state gente!"
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr "Ciao mondo!"
|
@ -1,35 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Valdemaras Pipiras <varas@ambernet.lt>, 2009
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2009-12-08 12:18+0200\n"
|
||||
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n"
|
||||
"Language-Team: Lithuanian <vdr@linuxtv.org>\n"
|
||||
"Language: lt\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr "Draugiškas labas"
|
||||
|
||||
msgid "Hello"
|
||||
msgstr "Labas!"
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr "Pasveikinomo laikas (s)"
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr "Naudoti alternatyvų pasveikinimą"
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr "Kaip yr chebryte?"
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr "Labas pasauli!"
|
@ -1,37 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Arnold Niessen <niessen@iae.nl> <arnold.niessen@philips.com>, 2001
|
||||
# Hans Dingemans <hans.dingemans@tacticalops.nl>, 2003
|
||||
# Maarten Wisse <Maarten.Wisse@urz.uni-hd.de>, 2005
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Maarten Wisse <Maarten.Wisse@urz.uni-hd.de>\n"
|
||||
"Language-Team: Dutch <vdr@linuxtv.org>\n"
|
||||
"Language: nl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
@ -1,36 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Jørgen Tvedt <pjtvedt@online.no>, 2001
|
||||
# Truls Slevigen <truls@slevigen.no>, 2002
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Truls Slevigen <truls@slevigen.no>\n"
|
||||
"Language-Team: Norwegian Nynorsk <vdr@linuxtv.org>\n"
|
||||
"Language: nn\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
@ -1,38 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Michael Rakowski <mrak@gmx.de>, 2002
|
||||
# Tomasz Maciej Nowak <tmn505@gmail.com>, 2018
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2018-02-19 00:41+0100\n"
|
||||
"Last-Translator: Tomasz Maciej Nowak <tmn505@gmail.com>\n"
|
||||
"Language-Team: Polish <vdr@linuxtv.org>\n"
|
||||
"Language: pl_PL\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
"X-Generator: Poedit 2.0.6\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr "Przyjazne pozdrowienie"
|
||||
|
||||
msgid "Hello"
|
||||
msgstr "Witaj"
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr "Czas pozdrowienia (s)"
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr "Użyj alternatywnego pozdrowienia"
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr "Siema ziomy!"
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr "Witaj świecie!"
|
@ -1,35 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Paulo Lopes <pmml@netvita.pt>, 2001
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Paulo Lopes <pmml@netvita.pt>\n"
|
||||
"Language-Team: Portuguese <vdr@linuxtv.org>\n"
|
||||
"Language: pt\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
@ -1,36 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Paul Lacatus <paul@campina.iiruc.ro>, 2002
|
||||
# Lucian Muresan <lucianm@users.sourceforge.net>, 2004
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Lucian Muresan <lucianm@users.sourceforge.net>\n"
|
||||
"Language-Team: Romanian <vdr@linuxtv.org>\n"
|
||||
"Language: ro\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
@ -1,35 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Vyacheslav Dikonov <sdiconov@mail.ru>, 2004
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Vyacheslav Dikonov <sdiconov@mail.ru>\n"
|
||||
"Language-Team: Russian <vdr@linuxtv.org>\n"
|
||||
"Language: ru\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-5\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr "´àãÖÕáÚÞÕ ßàØÒÕâáâÒØÕ"
|
||||
|
||||
msgid "Hello"
|
||||
msgstr "¿àØÒÕâ!"
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr "¿àÞÔÞÛÖØâÕÛìÝÞáâì ßàØÒÕâáâÒØï"
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr "°ÛìâÕàÝÐâØÒÝÞÕ ßàØÒÕâáâÒØÕ"
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr "ºÐÚ ßÞÖØÒÐÕâÕ?"
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr "·ÔàÐÒáâÒãÙ ÜØà!"
|
@ -1,35 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Vladimír Bárta <vladimir.barta@k2atmitec.cz>, 2006
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2009-09-30 09:48+0100\n"
|
||||
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
|
||||
"Language-Team: Slovak <vdr@linuxtv.org>\n"
|
||||
"Language: sk\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr "Priateµský pozdrav"
|
||||
|
||||
msgid "Hello"
|
||||
msgstr "Ahoj"
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr "Èas pozdravu (s)"
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr "Pou¾i» náhradný pozdrav"
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr "Ahojte v¹etci!"
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr "Ahoj svet!"
|
@ -1,36 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Miha Setina <mihasetina@softhome.net>, 2000
|
||||
# Matjaz Thaler <matjaz.thaler@guest.arnes.si>, 2003
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Matjaz Thaler <matjaz.thaler@guest.arnes.si>\n"
|
||||
"Language-Team: Slovenian <vdr@linuxtv.org>\n"
|
||||
"Language: sl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
@ -1,36 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Tomas Prybil <tomas@prybil.se>, 2002
|
||||
# Jan Ekholm <chakie@infa.abo.fi>, 2003
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Tomas Prybil <tomas@prybil.se>\n"
|
||||
"Language-Team: Swedish <vdr@linuxtv.org>\n"
|
||||
"Language: sv\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
@ -1,35 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Oktay Yolgeçen <oktay_73@yahoo.de>, 2007
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2008-05-12 22:34:4800\n"
|
||||
"Last-Translator: Oktay Yolgeçen <oktay_73@yahoo.de>\n"
|
||||
"Language-Team: Turkish <vdr@linuxtv.org>\n"
|
||||
"Language: tr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-9\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr "Dostça selam"
|
||||
|
||||
msgid "Hello"
|
||||
msgstr "Merhaba"
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr "Selam vakiti (s)"
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr "Alternatif selam kullan"
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr "Selam dostlar!"
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr "Merhaba dünya!"
|
@ -1,38 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Marc Rovira Vall <tm05462@salleURL.edu>, 2003
|
||||
# Ramon Roca <ramon.roca@xcombo.com>, 2003
|
||||
# Jordi Vilà <jvila@tinet.org>, 2003
|
||||
# Nan Feng VDR <nfgx@21cn.com>, 2009
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2009-01-23 09:48+0800\n"
|
||||
"Last-Translator: senin\n"
|
||||
"Language-Team: Chinese (simplified) <vdr@linuxtv.org>\n"
|
||||
"Language: zh_CN\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr "友好的问候"
|
||||
|
||||
msgid "Hello"
|
||||
msgstr "你好"
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr "问候时间 (s)"
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr "使用替代贺卡"
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr "你好人!"
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr "世界您好!"
|
@ -12,82 +12,3 @@ VDR Plugin 'osddemo' Revision History
|
||||
2004-04-30: Version 0.1.1
|
||||
|
||||
- New OSD handling.
|
||||
|
||||
2007-08-15: Version 0.1.2
|
||||
|
||||
- Moved the "all" target in the Makefile before the "Implicit rules",
|
||||
so that a plain "make" will compile everything.
|
||||
|
||||
2008-04-13: Version 0.1.3
|
||||
|
||||
- Fixed setting the OSD level (thanks to Wolfgang Rohdewald).
|
||||
|
||||
2011-02-20: Version 0.2.0
|
||||
|
||||
- Added support for TrueColor OSD.
|
||||
|
||||
2011-03-28: Version 0.2.1
|
||||
|
||||
- Added Cancel(3) to ~cTrueColorDemo() (thanks to Reinhard Nissl).
|
||||
- Added a missing font deletion in cTrueColorDemo::Action() (thanks to Reinhard Nissl).
|
||||
|
||||
2011-04-17: Version 0.2.2
|
||||
|
||||
- Fixed a possible NULL pointer dereference in osddemo.c (reported by Paul Menzel).
|
||||
|
||||
2012-03-13: Version 0.2.3
|
||||
|
||||
- No longer using GetFont() (which is not thread safe) in the 'osddemo' plugin,
|
||||
|
||||
2012-12-27: Version 0.2.4
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-01-12: Version 0.2.5
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-02-13: Version 0.3.0
|
||||
|
||||
- Added demos of the DrawEllipse() and DrawSlope() function (press '1' or '2',
|
||||
respectively).
|
||||
|
||||
2013-02-19: Version 0.3.1
|
||||
|
||||
- The demos can now also be ended with the "Back" key.
|
||||
|
||||
2013-03-31: Version 2.0.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2014-01-01: Version 2.1.1
|
||||
|
||||
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
||||
|
||||
2014-02-06: Version 2.1.2
|
||||
|
||||
- Fixed flickering if subtitles are active while the OSD demo is running.
|
||||
- Fixed a possible crash in the OSD demo (reported by Christopher Reimer).
|
||||
|
||||
2015-02-19: Version 2.2.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2015-03-08: Version 2.3.1
|
||||
|
||||
- Now using cOsd::MaxPixmapSize().
|
||||
- Fixed a vertical black line in the "TiledPixmaps" area on the rpihddevice OSD with
|
||||
1280x800 pixel (thanks to Thomas Reufer).
|
||||
- Added a demo case for storing images (thanks to Thomas Reufer).
|
||||
|
||||
2018-04-15: Version 2.4.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2020-10-12: Version 2.4.1
|
||||
|
||||
- Added test cases for alignment of semi-circles (press key '4').
|
||||
|
||||
2021-12-27: Version 2.6.0
|
||||
|
||||
- Official release.
|
||||
|
@ -1,89 +1,73 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||
# $Id: Makefile 1.9 2006/09/09 12:38:35 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
# By default the main source file also carries this name.
|
||||
|
||||
#
|
||||
PLUGIN = osddemo
|
||||
|
||||
### The version number of this plugin (taken from the main source file):
|
||||
|
||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||
|
||||
### The C++ compiler and options:
|
||||
|
||||
CXX ?= g++
|
||||
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual
|
||||
|
||||
### The directory environment:
|
||||
|
||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||
PKG_CONFIG ?= pkg-config
|
||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
||||
LIBDIR = $(call PKGCFG,libdir)
|
||||
PLGCFG = $(call PKGCFG,plgcfg)
|
||||
#
|
||||
TMPDIR ?= /tmp
|
||||
|
||||
### The compiler options:
|
||||
|
||||
export CFLAGS = $(call PKGCFG,cflags)
|
||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
||||
|
||||
### The version number of VDR's plugin API:
|
||||
|
||||
APIVERSION = $(call PKGCFG,apiversion)
|
||||
VDRDIR = ../../..
|
||||
LIBDIR = ../../lib
|
||||
TMPDIR = /tmp
|
||||
|
||||
### Allow user defined options to overwrite defaults:
|
||||
|
||||
-include $(PLGCFG)
|
||||
-include $(VDRDIR)/Make.config
|
||||
|
||||
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||
|
||||
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||
|
||||
### The name of the distribution archive:
|
||||
|
||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||
PACKAGE = vdr-$(ARCHIVE)
|
||||
|
||||
### The name of the shared object file:
|
||||
|
||||
SOFILE = libvdr-$(PLUGIN).so
|
||||
|
||||
### Includes and Defines (add further entries here):
|
||||
|
||||
INCLUDES +=
|
||||
INCLUDES += -I$(VDRDIR)/include
|
||||
|
||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
|
||||
### The object files (add further files here):
|
||||
|
||||
OBJS = $(PLUGIN).o
|
||||
|
||||
### The main target:
|
||||
|
||||
all: $(SOFILE)
|
||||
|
||||
### Implicit rules:
|
||||
|
||||
%.o: %.c
|
||||
@echo CC $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||
|
||||
### Dependencies:
|
||||
# Dependencies:
|
||||
|
||||
MAKEDEP = $(CXX) -MM -MG
|
||||
MAKEDEP = g++ -MM -MG
|
||||
DEPFILE = .dependencies
|
||||
$(DEPFILE): Makefile
|
||||
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
|
||||
-include $(DEPFILE)
|
||||
|
||||
### Targets:
|
||||
|
||||
$(SOFILE): $(OBJS)
|
||||
@echo LD $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
||||
all: libvdr-$(PLUGIN).so
|
||||
|
||||
install-lib: $(SOFILE)
|
||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
||||
|
||||
install: install-lib
|
||||
libvdr-$(PLUGIN).so: $(OBJS)
|
||||
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
|
||||
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||
|
||||
dist: clean
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
|
@ -1,16 +1,12 @@
|
||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||
|
||||
Written by: Klaus Schmidinger <vdr@tvdr.de>
|
||||
Written by: Klaus Schmidinger <kls@cadsoft.de>
|
||||
|
||||
Project's homepage: https://www.tvdr.de
|
||||
Project's homepage: http://www.cadsoft.de/vdr
|
||||
|
||||
Latest version available at: https://www.tvdr.de
|
||||
Latest version available at: http://www.cadsoft.de/vdr
|
||||
|
||||
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.
|
||||
See the file COPYING for more information.
|
||||
See the file COPYING for license information.
|
||||
|
||||
Description:
|
||||
|
||||
@ -19,16 +15,4 @@ Demonstration of how a plugin can have its very own OSD setup.
|
||||
It's a very primitive game that opens a small window in which the
|
||||
user can draw lines with the Up, Down, Left and Right buttons.
|
||||
The color buttons are used to switch color.
|
||||
|
||||
On a VDR system with TrueColor support it displays some of the
|
||||
possibilities available with the TrueColor OSD. Once the "Animation"
|
||||
pixmap is displayed, it can be moved around with the Up, Down, Left
|
||||
and Right buttons. The Red button turns off the "Tiled Pixmaps"
|
||||
display, and the Green button toggles the color display.
|
||||
|
||||
In both variants of the demo, pressing the '1' key displays all
|
||||
possible ellipses that can be drawn with the DrawEllipse() function,
|
||||
while pressing the '2' key shows all possible slopes the DrawSlope()
|
||||
function can draw.
|
||||
|
||||
Press Ok to close the window.
|
||||
|
@ -3,224 +3,15 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: osddemo.c 4.5 2020/10/14 20:32:41 kls Exp $
|
||||
* $Id: osddemo.c 1.3 2004/05/16 09:28:51 kls Exp $
|
||||
*/
|
||||
|
||||
#include <vdr/osd.h>
|
||||
#include <vdr/plugin.h>
|
||||
|
||||
static const char *VERSION = "2.4.1";
|
||||
static const char *VERSION = "0.1.1";
|
||||
static const char *DESCRIPTION = "Demo of arbitrary OSD setup";
|
||||
static const char *MAINMENUENTRY = "Osd Demo";
|
||||
|
||||
// --- DrawEllipses ----------------------------------------------------------
|
||||
|
||||
void DrawEllipse(cOsd *Osd, int x1, int y1, int x2, int y2, int Quadrants)
|
||||
{
|
||||
Osd->DrawRectangle(x1 + 2, y1 + 2, x2 - 2, y2 - 2, clrGreen);
|
||||
Osd->DrawEllipse(x1 + 3, y1 + 3, x2 - 3, y2 - 3, clrRed, Quadrants);
|
||||
}
|
||||
|
||||
void DrawEllipses(cOsd *Osd)
|
||||
{
|
||||
int xa = 0;
|
||||
int ya = 0;
|
||||
int xb = Osd->Width() - 1;
|
||||
int yb = Osd->Height() - 1;
|
||||
int x0 = xa;
|
||||
int x5 = xb;
|
||||
int x1 = x0 + (xb - xa) / 5;
|
||||
int x2 = x0 + (xb - xa) * 2 / 5;
|
||||
int x3 = x0 + (xb - xa) * 3 / 5;
|
||||
int x4 = x0 + (xb - xa) * 4 / 5;
|
||||
int y0 = ya;
|
||||
int y4 = yb;
|
||||
int y2 = (y0 + y4) / 2;
|
||||
int y1 = (y0 + y2) / 2;
|
||||
int y3 = (y2 + y4) / 2;
|
||||
Osd->DrawRectangle(xa, ya, xb, yb, clrGray50);
|
||||
DrawEllipse(Osd, x4, y0, x5, y4, 0);
|
||||
DrawEllipse(Osd, x2, y1, x3, y2, 1);
|
||||
DrawEllipse(Osd, x1, y1, x2, y2, 2);
|
||||
DrawEllipse(Osd, x1, y2, x2, y3, 3);
|
||||
DrawEllipse(Osd, x2, y2, x3, y3, 4);
|
||||
DrawEllipse(Osd, x3, y1, x4, y3, 5);
|
||||
DrawEllipse(Osd, x1, y0, x3, y1, 6);
|
||||
DrawEllipse(Osd, x0, y1, x1, y3, 7);
|
||||
DrawEllipse(Osd, x1, y3, x3, y4, 8);
|
||||
DrawEllipse(Osd, x3, y0, x4, y1, -1);
|
||||
DrawEllipse(Osd, x0, y0, x1, y1, -2);
|
||||
DrawEllipse(Osd, x0, y3, x1, y4, -3);
|
||||
DrawEllipse(Osd, x3, y3, x4, y4, -4);
|
||||
Osd->Flush();
|
||||
}
|
||||
|
||||
// --- DrawSlopes ------------------------------------------------------------
|
||||
|
||||
void DrawSlope(cOsd *Osd, int x1, int y1, int x2, int y2, int Type)
|
||||
{
|
||||
Osd->DrawRectangle(x1 + 2, y1 + 2, x2 - 2, y2 - 2, clrGreen);
|
||||
Osd->DrawSlope(x1 + 3, y1 + 3, x2 - 3, y2 - 3, clrRed, Type);
|
||||
}
|
||||
|
||||
void DrawSlopes(cOsd *Osd)
|
||||
{
|
||||
int xa = 0;
|
||||
int ya = 0;
|
||||
int xb = Osd->Width() - 1;
|
||||
int yb = Osd->Height() - 1;
|
||||
int x0 = xa;
|
||||
int x4 = xb;
|
||||
int x2 = (x0 + x4) / 2;
|
||||
int x1 = (x0 + x2) / 2;
|
||||
int x3 = (x2 + x4) / 2;
|
||||
int y0 = ya;
|
||||
int y3 = yb;
|
||||
int y2 = (y0 + y3) / 2;
|
||||
int y1 = (y0 + y2) / 2;
|
||||
Osd->DrawRectangle(xa, ya, xb, yb, clrGray50);
|
||||
DrawSlope(Osd, x0, y0, x2, y1, 0);
|
||||
DrawSlope(Osd, x2, y0, x4, y1, 1);
|
||||
DrawSlope(Osd, x0, y1, x2, y2, 2);
|
||||
DrawSlope(Osd, x2, y1, x4, y2, 3);
|
||||
DrawSlope(Osd, x0, y2, x1, y3, 4);
|
||||
DrawSlope(Osd, x1, y2, x2, y3, 5);
|
||||
DrawSlope(Osd, x2, y2, x3, y3, 6);
|
||||
DrawSlope(Osd, x3, y2, x4, y3, 7);
|
||||
Osd->Flush();
|
||||
}
|
||||
|
||||
// --- DrawImages ------------------------------------------------------------
|
||||
|
||||
struct tOsdImageRef {
|
||||
int image;
|
||||
cSize size;
|
||||
};
|
||||
|
||||
#define NUMOSDIMAGES 16
|
||||
#define NUMOSDIMAGEVARIANTS 8
|
||||
|
||||
void DrawImages(cOsd *Osd)
|
||||
{
|
||||
// Create images:
|
||||
cImage *images[NUMOSDIMAGEVARIANTS];
|
||||
for (int i = 0; i < NUMOSDIMAGEVARIANTS; i++) {
|
||||
images[i] = new cImage(cSize(
|
||||
i == 0 || i == 1 ? Osd->MaxPixmapSize().Width() + 1 : rand() % Osd->Width(),
|
||||
i == 0 || i == 2 ? Osd->MaxPixmapSize().Height() + 1 : rand() % Osd->Height()));
|
||||
for (int x = 0; x < images[i]->Width(); x++) {
|
||||
for (int y = 0; y < images[i]->Height(); y++) {
|
||||
images[i]->SetPixel(cPoint(x, y),
|
||||
(!x || !y || x == images[i]->Width() - 1 || y == images[i]->Height() - 1) ? clrWhite :
|
||||
(x > images[i]->Width() / 2 ?
|
||||
(y > images[i]->Height() / 2 ? clrBlue : clrGreen) :
|
||||
(y > images[i]->Height() / 2 ? clrRed : clrYellow)));
|
||||
}
|
||||
}
|
||||
}
|
||||
// Store images:
|
||||
tOsdImageRef osdImages[NUMOSDIMAGES];
|
||||
for (int i = 0; i < NUMOSDIMAGES; i++) {
|
||||
osdImages[i].image = cOsdProvider::StoreImage(*images[i % NUMOSDIMAGEVARIANTS]);
|
||||
osdImages[i].size.Set(images[i % NUMOSDIMAGEVARIANTS]->Size());
|
||||
}
|
||||
// Delete images:
|
||||
for (int i = 0; i < NUMOSDIMAGEVARIANTS; i++)
|
||||
delete images[i];
|
||||
// Draw images:
|
||||
for (int i = 0; i < NUMOSDIMAGES; i++)
|
||||
Osd->DrawImage(cPoint(rand() % (Osd->Width() + osdImages[i].size.Width()), rand() % (Osd->Height() + osdImages[i].size.Height())).Shifted(-osdImages[i].size.Width(), -osdImages[i].size.Height()), osdImages[i].image);
|
||||
// Drop image references:
|
||||
for (int i = 0; i < NUMOSDIMAGES; i++)
|
||||
cOsdProvider::DropImage(osdImages[i].image);
|
||||
Osd->Flush();
|
||||
}
|
||||
|
||||
// --- DrawEllipseAlignments -------------------------------------------------
|
||||
|
||||
void DrawEllipseAlignments(cOsd *Osd)
|
||||
{
|
||||
cFont *Font = cFont::CreateFont(Setup.FontOsd, 20);
|
||||
int xa = 0;
|
||||
int ya = 0;
|
||||
int xb = Osd->Width() - 1;
|
||||
int yb = Osd->Height() - 1;
|
||||
Osd->DrawRectangle(xa, ya, xb, yb, clrBlack);
|
||||
int d = 50;
|
||||
int a = d / 2 + 1;
|
||||
int t = a * 2;
|
||||
int n = 30;
|
||||
for (int i = 0; i < n; i++) {
|
||||
Osd->DrawRectangle(a, t, a + d - 1, t + d - 1, clrGreen);
|
||||
Osd->DrawEllipse(a, t - d / 2, a + d - 1, t, clrGreen, 6);
|
||||
Osd->DrawEllipse(a, t + d, a + d - 1, t + d + d / 2, clrGreen, 8);
|
||||
Osd->DrawText(a + d / 3, t + d / 3, itoa(d), clrRed, clrGreen, Font);
|
||||
a += d + 5;
|
||||
d++;
|
||||
}
|
||||
d = 50;
|
||||
a = d * 3;
|
||||
n = 20;
|
||||
for (int i = 0; i < n; i++) {
|
||||
Osd->DrawRectangle(t, a, t + d - 1, a + d - 1, clrGreen);
|
||||
Osd->DrawEllipse(t - d / 2, a, t, a + d - 1, clrGreen, 7);
|
||||
Osd->DrawEllipse(t + d, a, t + d + d / 2, a + d - 1, clrGreen, 5);
|
||||
Osd->DrawText(t + d / 3, a + d / 3, itoa(d), clrRed, clrGreen, Font);
|
||||
a += d + 5;
|
||||
d++;
|
||||
}
|
||||
d = 50;
|
||||
a = d * 3;
|
||||
t = d * 5;
|
||||
n = 30;
|
||||
for (int i = 0; i < n; i++) {
|
||||
Osd->DrawRectangle(a, t, a + d - 1, t + d - 1, clrGreen);
|
||||
Osd->DrawEllipse(a, t - d, a + d - 1, t, clrGreen, 2);
|
||||
Osd->DrawEllipse(a, t + d, a + d - 1, t + d + d, clrGreen, 3);
|
||||
Osd->DrawText(a + d / 3, t + d / 3, itoa(d), clrRed, clrGreen, Font);
|
||||
a += d + 5;
|
||||
d++;
|
||||
}
|
||||
d = 50;
|
||||
a = d * 3;
|
||||
t = d * 9;
|
||||
n = 30;
|
||||
for (int i = 0; i < n; i++) {
|
||||
Osd->DrawRectangle(a, t, a + d - 1, t + d - 1, clrGreen);
|
||||
Osd->DrawEllipse(a, t - d, a + d - 1, t, clrGreen, 1);
|
||||
Osd->DrawEllipse(a, t + d, a + d - 1, t + d + d, clrGreen, 4);
|
||||
Osd->DrawText(a + d / 3, t + d / 3, itoa(d), clrRed, clrGreen, Font);
|
||||
a += d + 5;
|
||||
d++;
|
||||
}
|
||||
d = 50;
|
||||
a = d * 12;
|
||||
t = d * 5;
|
||||
n = 20;
|
||||
for (int i = 0; i < n; i++) {
|
||||
Osd->DrawRectangle(t, a, t + d - 1, a + d - 1, clrGreen);
|
||||
Osd->DrawEllipse(t - d, a, t, a + d - 1, clrGreen, 2);
|
||||
Osd->DrawEllipse(t + d, a, t + d + d, a + d - 1, clrGreen, 1);
|
||||
Osd->DrawText(t + d / 3, a + d / 3, itoa(d), clrRed, clrGreen, Font);
|
||||
a += d + 5;
|
||||
d++;
|
||||
}
|
||||
d = 50;
|
||||
a = d * 12;
|
||||
t = d * 9;
|
||||
n = 20;
|
||||
for (int i = 0; i < n; i++) {
|
||||
Osd->DrawRectangle(t, a, t + d - 1, a + d - 1, clrGreen);
|
||||
Osd->DrawEllipse(t - d, a, t, a + d - 1, clrGreen, 3);
|
||||
Osd->DrawEllipse(t + d, a, t + d + d, a + d - 1, clrGreen, 4);
|
||||
Osd->DrawText(t + d / 3, a + d / 3, itoa(d), clrRed, clrGreen, Font);
|
||||
a += d + 5;
|
||||
d++;
|
||||
}
|
||||
Osd->Flush();
|
||||
delete Font;
|
||||
}
|
||||
|
||||
// --- cLineGame -------------------------------------------------------------
|
||||
|
||||
class cLineGame : public cOsdObject {
|
||||
@ -231,7 +22,7 @@ private:
|
||||
tColor color;
|
||||
public:
|
||||
cLineGame(void);
|
||||
virtual ~cLineGame();
|
||||
~cLineGame();
|
||||
virtual void Show(void);
|
||||
virtual eOSState ProcessKey(eKeys Key);
|
||||
};
|
||||
@ -239,7 +30,7 @@ public:
|
||||
cLineGame::cLineGame(void)
|
||||
{
|
||||
osd = NULL;
|
||||
x = y = 0;
|
||||
x = y = 50;
|
||||
color = clrRed;
|
||||
}
|
||||
|
||||
@ -250,23 +41,12 @@ cLineGame::~cLineGame()
|
||||
|
||||
void cLineGame::Show(void)
|
||||
{
|
||||
osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop());
|
||||
osd = cOsdProvider::NewOsd(100, 50);
|
||||
if (osd) {
|
||||
int x1 = cOsd::OsdWidth() - 1;
|
||||
int y1 = cOsd::OsdHeight() - 1;
|
||||
while (x1 > 0 && y1 > 0) {
|
||||
tArea Area = { 0, 0, x1, y1, 4 };
|
||||
if (osd->CanHandleAreas(&Area, 1) == oeOk) {
|
||||
tArea Area = { 0, 0, 99, 199, 4 };
|
||||
osd->SetAreas(&Area, 1);
|
||||
osd->DrawRectangle(0, 0, osd->Width() - 1, osd->Height() - 1, clrGray50);
|
||||
osd->DrawRectangle(0, 0, 99, 199, clrGray50);
|
||||
osd->Flush();
|
||||
x = osd->Width() / 2;
|
||||
y = osd->Height() / 2;
|
||||
break;
|
||||
}
|
||||
x1 = x1 * 9 / 10;
|
||||
y1 = y1 * 9 / 10;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -274,420 +54,25 @@ eOSState cLineGame::ProcessKey(eKeys Key)
|
||||
{
|
||||
eOSState state = cOsdObject::ProcessKey(Key);
|
||||
if (state == osUnknown) {
|
||||
const int d = 4;
|
||||
switch (Key & ~k_Repeat) {
|
||||
case kUp: y = max(0, y - d); break;
|
||||
case kDown: y = min(osd->Height() - d, y + d); break;
|
||||
case kLeft: x = max(0, x - d); break;
|
||||
case kRight: x = min(osd->Width() - d, x + d); break;
|
||||
case kUp: if (y > 0) y--; break;
|
||||
case kDown: if (y < 196) y++; break;
|
||||
case kLeft: if (x > 0) x--; break;
|
||||
case kRight: if (x < 96) x++; break;
|
||||
case kRed: color = clrRed; break;
|
||||
case kGreen: color = clrGreen; break;
|
||||
case kYellow: color = clrYellow; break;
|
||||
case kBlue: color = clrBlue; break;
|
||||
case k1: DrawEllipses(osd);
|
||||
return osContinue;
|
||||
case k2: DrawSlopes(osd);
|
||||
return osContinue;
|
||||
case kBack:
|
||||
case kOk: return osEnd;
|
||||
default: return state;
|
||||
}
|
||||
osd->DrawRectangle(x, y, x + d - 1, y + d - 1, color);
|
||||
osd->DrawRectangle(x, y, x + 3, y + 3, color);
|
||||
osd->Flush();
|
||||
state = osContinue;
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
// --- cTrueColorDemo --------------------------------------------------------
|
||||
|
||||
class cTrueColorDemo : public cOsdObject, public cThread {
|
||||
private:
|
||||
cOsd *osd;
|
||||
cPoint cursor;
|
||||
cRect cursorLimits;
|
||||
bool clockwise;
|
||||
cPixmap *destroyablePixmap;
|
||||
cPixmap *toggleablePixmap;
|
||||
bool SetArea(void);
|
||||
virtual void Action(void);
|
||||
cPixmap *CreateTextPixmap(const char *s, int Line, int Layer, tColor ColorFg, tColor ColorBg, const cFont *Font);
|
||||
public:
|
||||
cTrueColorDemo(void);
|
||||
virtual ~cTrueColorDemo();
|
||||
virtual void Show(void);
|
||||
virtual eOSState ProcessKey(eKeys Key);
|
||||
};
|
||||
|
||||
cTrueColorDemo::cTrueColorDemo(void)
|
||||
{
|
||||
osd = NULL;
|
||||
clockwise = true;
|
||||
destroyablePixmap = NULL;
|
||||
toggleablePixmap = NULL;
|
||||
}
|
||||
|
||||
cTrueColorDemo::~cTrueColorDemo()
|
||||
{
|
||||
Cancel(3);
|
||||
delete osd;
|
||||
}
|
||||
|
||||
cPixmap *cTrueColorDemo::CreateTextPixmap(const char *s, int Line, int Layer, tColor ColorFg, tColor ColorBg, const cFont *Font)
|
||||
{
|
||||
const int h = Font->Height(s);
|
||||
int w = Font->Width(s);
|
||||
cPixmap *Pixmap = osd->CreatePixmap(Layer, cRect((osd->Width() - w) / 2, Line, w, h));
|
||||
if (Pixmap) {
|
||||
Pixmap->Clear();
|
||||
Pixmap->SetAlpha(0);
|
||||
Pixmap->DrawText(cPoint(0, 0), s, ColorFg, ColorBg, Font, w);
|
||||
}
|
||||
return Pixmap;
|
||||
}
|
||||
|
||||
void cTrueColorDemo::Action(void)
|
||||
{
|
||||
cPixmap *FadeInPixmap = NULL;
|
||||
cPixmap *FadeOutPixmap = NULL;
|
||||
cPixmap *MovePixmap = NULL;
|
||||
cPixmap *NextPixmap = NULL;
|
||||
cPixmap *TilePixmap = NULL;
|
||||
cPixmap *ScrollPixmap = NULL;
|
||||
cPixmap *AnimPixmap = NULL;
|
||||
cFont *OsdFont = cFont::CreateFont(Setup.FontOsd, Setup.FontOsdSize);
|
||||
cFont *SmlFont = cFont::CreateFont(Setup.FontSml, Setup.FontSmlSize);
|
||||
cFont *LrgFont = cFont::CreateFont(Setup.FontOsd, osd->Height() / 10);
|
||||
int FrameTime = 40; // ms
|
||||
int FadeTime = 1000; // ms
|
||||
int MoveTime = 4000; // ms
|
||||
int TileTime = 6000; // ms
|
||||
int ScrollWaitTime = 1000; // ms
|
||||
int ScrollLineTime = 200; // ms
|
||||
int ScrollTotalTime = 8000; // ms
|
||||
uint64_t Start = 0;
|
||||
uint64_t ScrollStartTime = 0;
|
||||
int ScrollLineNumber = 0;
|
||||
cPoint MoveStart, MoveEnd;
|
||||
cPoint TileStart, TileEnd;
|
||||
cPoint ScrollStart, ScrollEnd;
|
||||
int Line = osd->Height() / 20;
|
||||
int StartLine = Line;
|
||||
cPoint OldCursor;
|
||||
int State = 0;
|
||||
while (Running()) {
|
||||
cPixmap::Lock();
|
||||
bool Animated = false;
|
||||
uint64_t Now = cTimeMs::Now();
|
||||
if (FadeInPixmap) {
|
||||
double t = min(double(Now - Start) / FadeTime, 1.0);
|
||||
int Alpha = t * ALPHA_OPAQUE;
|
||||
FadeInPixmap->SetAlpha(Alpha);
|
||||
if (t >= 1)
|
||||
FadeInPixmap = NULL;
|
||||
Animated = true;
|
||||
}
|
||||
if (FadeOutPixmap) {
|
||||
double t = min(double(Now - Start) / FadeTime, 1.0);
|
||||
int Alpha = ALPHA_OPAQUE - t * ALPHA_OPAQUE;
|
||||
FadeOutPixmap->SetAlpha(Alpha);
|
||||
if (t >= 1)
|
||||
FadeOutPixmap = NULL;
|
||||
Animated = true;
|
||||
}
|
||||
if (MovePixmap) {
|
||||
double t = min(double(Now - Start) / MoveTime, 1.0);
|
||||
int x = MoveStart.X() + t * (MoveEnd.X() - MoveStart.X());
|
||||
int y = MoveStart.Y() + t * (MoveEnd.Y() - MoveStart.Y());
|
||||
cRect r = MovePixmap->ViewPort();
|
||||
r.SetPoint(x, y);
|
||||
MovePixmap->SetViewPort(r);
|
||||
if (t >= 1)
|
||||
MovePixmap = NULL;
|
||||
Animated = true;
|
||||
}
|
||||
if (TilePixmap) {
|
||||
double t = min(double(Now - Start) / TileTime, 1.0);
|
||||
int x = TileStart.X() + t * (TileEnd.X() - TileStart.X());
|
||||
int y = TileStart.Y() + t * (TileEnd.Y() - TileStart.Y());
|
||||
TilePixmap->SetDrawPortPoint(cPoint(x, y));
|
||||
if (t >= 1) {
|
||||
destroyablePixmap = TilePixmap;
|
||||
TilePixmap = NULL;
|
||||
}
|
||||
Animated = true;
|
||||
}
|
||||
if (ScrollPixmap) {
|
||||
if (int(Now - Start) > ScrollWaitTime) {
|
||||
if (ScrollStartTime) {
|
||||
double t = min(double(Now - ScrollStartTime) / ScrollLineTime, 1.0);
|
||||
int x = ScrollStart.X() + t * (ScrollEnd.X() - ScrollStart.X());
|
||||
int y = ScrollStart.Y() + t * (ScrollEnd.Y() - ScrollStart.Y());
|
||||
ScrollPixmap->SetDrawPortPoint(cPoint(x, y));
|
||||
if (t >= 1) {
|
||||
if (int(Now - Start) < ScrollTotalTime) {
|
||||
cRect r = ScrollPixmap->DrawPort();
|
||||
r.SetPoint(-r.X(), -r.Y());
|
||||
ScrollPixmap->Pan(cPoint(0, 0), r);
|
||||
cString s = cString::sprintf("Line %d", ++ScrollLineNumber);
|
||||
ScrollPixmap->DrawRectangle(cRect(0, ScrollPixmap->ViewPort().Height(), ScrollPixmap->DrawPort().Width(), ScrollPixmap->DrawPort().Height()), clrTransparent);
|
||||
ScrollPixmap->DrawText(cPoint(0, ScrollPixmap->ViewPort().Height()), s, clrYellow, clrTransparent, OsdFont);
|
||||
ScrollStartTime = Now;
|
||||
}
|
||||
else {
|
||||
FadeOutPixmap = ScrollPixmap;
|
||||
ScrollPixmap = NULL;
|
||||
Start = cTimeMs::Now();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
ScrollStartTime = Now;
|
||||
}
|
||||
Animated = true;
|
||||
}
|
||||
if (AnimPixmap) {
|
||||
int d = AnimPixmap->ViewPort().Height();
|
||||
if (clockwise)
|
||||
d = -d;
|
||||
cPoint p = AnimPixmap->DrawPort().Point().Shifted(0, d);
|
||||
if (clockwise && p.Y() <= -AnimPixmap->DrawPort().Height())
|
||||
p.SetY(0);
|
||||
else if (!clockwise && p.Y() > 0)
|
||||
p.SetY(-(AnimPixmap->DrawPort().Height() - AnimPixmap->ViewPort().Height()));
|
||||
AnimPixmap->SetDrawPortPoint(p);
|
||||
}
|
||||
if (!Animated) {
|
||||
switch (State) {
|
||||
case 0: {
|
||||
FadeInPixmap = CreateTextPixmap("VDR", Line, 1, clrYellow, clrTransparent, LrgFont);
|
||||
if (FadeInPixmap)
|
||||
Line += FadeInPixmap->DrawPort().Height();
|
||||
Start = cTimeMs::Now();
|
||||
State++;
|
||||
}
|
||||
break;
|
||||
case 1: {
|
||||
FadeInPixmap = CreateTextPixmap("Video Disk Recorder", Line, 3, clrYellow, clrTransparent, OsdFont);
|
||||
if (FadeInPixmap)
|
||||
Line += FadeInPixmap->DrawPort().Height();
|
||||
Start = cTimeMs::Now();
|
||||
State++;
|
||||
}
|
||||
break;
|
||||
case 2: {
|
||||
FadeInPixmap = CreateTextPixmap("True Color OSD Demo", Line, 1, clrYellow, clrTransparent, OsdFont);
|
||||
if (FadeInPixmap)
|
||||
Line += FadeInPixmap->DrawPort().Height();
|
||||
Start = cTimeMs::Now();
|
||||
State++;
|
||||
}
|
||||
break;
|
||||
case 3: {
|
||||
NextPixmap = CreateTextPixmap("Millions of colors", Line, 1, clrYellow, clrTransparent, LrgFont);
|
||||
if (NextPixmap) {
|
||||
FadeInPixmap = NextPixmap;
|
||||
Start = cTimeMs::Now();
|
||||
StartLine = Line;
|
||||
Line += NextPixmap->DrawPort().Height();
|
||||
}
|
||||
State++;
|
||||
}
|
||||
break;
|
||||
case 4: {
|
||||
Line += osd->Height() / 10;
|
||||
int w = osd->Width() / 2;
|
||||
int h = osd->Height() - Line - osd->Height() / 10;
|
||||
cImage Image(cSize(w, h));
|
||||
for (int y = 0; y < h; y++) {
|
||||
for (int x = 0; x < w; x++)
|
||||
Image.SetPixel(cPoint(x, y), HsvToColor(360 * double(x) / w, 1 - double(y) / h, 1) | 0xDF000000);
|
||||
}
|
||||
if (cPixmap *Pixmap = osd->CreatePixmap(2, cRect((osd->Width() - w) / 2, Line, w, h))) {
|
||||
Pixmap->DrawImage(cPoint(0, 0), Image);
|
||||
toggleablePixmap = Pixmap;
|
||||
}
|
||||
State++;
|
||||
}
|
||||
break;
|
||||
case 5: {
|
||||
if (NextPixmap) {
|
||||
MovePixmap = NextPixmap;
|
||||
MoveStart = MovePixmap->ViewPort().Point();
|
||||
MoveEnd.Set(osd->Width() - MovePixmap->ViewPort().Width(), osd->Height() - MovePixmap->ViewPort().Height());
|
||||
Start = cTimeMs::Now();
|
||||
}
|
||||
State++;
|
||||
}
|
||||
break;
|
||||
case 6: {
|
||||
TilePixmap = CreateTextPixmap("Tiled Pixmaps", StartLine, 1, clrRed, clrWhite, OsdFont);
|
||||
if (TilePixmap) {
|
||||
TilePixmap->SetViewPort(TilePixmap->ViewPort().Grown(TilePixmap->DrawPort().Width(), TilePixmap->DrawPort().Height()));
|
||||
TilePixmap->SetAlpha(200);
|
||||
TilePixmap->SetTile(true);
|
||||
TileStart = TilePixmap->DrawPort().Point();
|
||||
TileEnd = TileStart.Shifted(TilePixmap->ViewPort().Width(), TilePixmap->ViewPort().Height());
|
||||
MovePixmap = TilePixmap;
|
||||
MoveStart = MovePixmap->ViewPort().Point();
|
||||
MoveEnd.Set(10, osd->Height() - MovePixmap->ViewPort().Height() - 10);
|
||||
Start = cTimeMs::Now();
|
||||
}
|
||||
State++;
|
||||
}
|
||||
break;
|
||||
case 7: {
|
||||
const char *Text = "Scrolling Pixmaps";
|
||||
int w = OsdFont->Width(Text);
|
||||
int h = OsdFont->Height();
|
||||
if (cPixmap *Pixmap = osd->CreatePixmap(2, cRect((osd->Width() - w) / 2, StartLine, w, 2 * h), cRect(0, 0, w, 3 * h))) {
|
||||
Pixmap->Clear();
|
||||
Pixmap->DrawText(cPoint(0, 0), Text, clrYellow, clrTransparent, OsdFont);
|
||||
cString s = cString::sprintf("Line %d", ++ScrollLineNumber);
|
||||
Pixmap->DrawText(cPoint(0, Pixmap->ViewPort().Height()), s, clrYellow, clrTransparent, OsdFont);
|
||||
ScrollPixmap = Pixmap;
|
||||
ScrollStart.Set(0, 0);
|
||||
ScrollEnd.Set(0, -h);
|
||||
Start = cTimeMs::Now();
|
||||
}
|
||||
State++;
|
||||
}
|
||||
break;
|
||||
case 8: {
|
||||
const char *Text = "Animation";
|
||||
const int Size = SmlFont->Width(Text) + 10;
|
||||
const int NumDots = 12;
|
||||
const int AnimFrames = NumDots;
|
||||
int Rows = min(osd->MaxPixmapSize().Height() / Size, AnimFrames);
|
||||
int Cols = (AnimFrames + Rows - 1) / Rows;
|
||||
// Temporarily using pixmap layer 0 to have the text alpha blended:
|
||||
AnimPixmap = osd->CreatePixmap(0, cRect((osd->Width() - Size) / 2, StartLine, Size, Size), cRect(0, 0, Size * Cols, Size * Rows));
|
||||
if (AnimPixmap) {
|
||||
AnimPixmap->SetAlpha(0);
|
||||
AnimPixmap->Clear();
|
||||
const int Diameter = Size / 5;
|
||||
for (int Frame = 0; Frame < AnimFrames; Frame++) {
|
||||
int x0 = Frame / Rows * Size;
|
||||
int y0 = Frame % Rows * Size;
|
||||
AnimPixmap->DrawEllipse(cRect(x0, y0, Size, Size), 0xDDFFFFFF);
|
||||
int xc = x0 + Size / 2 - Diameter / 2;
|
||||
int yc = y0 + Size / 2 - Diameter / 2;
|
||||
int Color = 0xFF;
|
||||
int Delta = Color / NumDots / 3;
|
||||
for (int a = 0; a < NumDots; a++) {
|
||||
double t = 2 * M_PI * (Frame + a) / NumDots;
|
||||
int x = xc + ((Size - Diameter) / 2 - 5) * cos(t);
|
||||
int y = yc + ((Size - Diameter) / 2 - 5) * sin(t);
|
||||
AnimPixmap->DrawEllipse(cRect(x, y, Diameter, Diameter), ArgbToColor(0xFF, Color, Color, Color));
|
||||
Color -= Delta;
|
||||
}
|
||||
AnimPixmap->DrawText(cPoint(x0, y0), Text, clrBlack, clrTransparent, SmlFont, Size, Size, taCenter);
|
||||
}
|
||||
AnimPixmap->SetLayer(3); // now setting the actual pixmap layer
|
||||
FadeInPixmap = AnimPixmap;
|
||||
LOCK_THREAD;
|
||||
OldCursor = cursor = AnimPixmap->ViewPort().Point();
|
||||
cursorLimits.Set(0, 0, osd->Width(), osd->Height());
|
||||
cursorLimits.SetRight(cursorLimits.Right() - Size);
|
||||
cursorLimits.SetBottom(cursorLimits.Bottom() - Size);
|
||||
cursorLimits.Grow(-10, -10);
|
||||
Start = cTimeMs::Now();
|
||||
}
|
||||
State++;
|
||||
}
|
||||
break;
|
||||
case 9: {
|
||||
LOCK_THREAD;
|
||||
if (cursor != OldCursor) {
|
||||
MovePixmap = AnimPixmap;
|
||||
MoveStart = MovePixmap->ViewPort().Point();
|
||||
MoveEnd = OldCursor = cursor;
|
||||
MoveTime = 500;
|
||||
Start = cTimeMs::Now();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
osd->Flush();
|
||||
cPixmap::Unlock();
|
||||
int Delta = cTimeMs::Now() - Now;
|
||||
if (Delta < FrameTime)
|
||||
cCondWait::SleepMs(FrameTime - Delta);
|
||||
}
|
||||
destroyablePixmap = NULL;
|
||||
toggleablePixmap = NULL;
|
||||
delete OsdFont;
|
||||
delete SmlFont;
|
||||
delete LrgFont;
|
||||
}
|
||||
|
||||
bool cTrueColorDemo::SetArea(void)
|
||||
{
|
||||
if (osd) {
|
||||
tArea Area = { 0, 0, cOsd::OsdWidth() - 1, cOsd::OsdHeight() - 1, 32 };
|
||||
return osd->SetAreas(&Area, 1) == oeOk;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void cTrueColorDemo::Show(void)
|
||||
{
|
||||
osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop());
|
||||
if (osd) {
|
||||
if (SetArea()) {
|
||||
osd->DrawRectangle(0, 0, osd->Width() - 1, osd->Height() - 1, clrGray50);
|
||||
osd->Flush();
|
||||
Start();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
eOSState cTrueColorDemo::ProcessKey(eKeys Key)
|
||||
{
|
||||
eOSState state = cOsdObject::ProcessKey(Key);
|
||||
if (state == osUnknown) {
|
||||
LOCK_PIXMAPS;
|
||||
LOCK_THREAD;
|
||||
const int d = 80;
|
||||
switch (Key & ~k_Repeat) {
|
||||
case kUp: cursor.SetY(max(cursorLimits.Top(), cursor.Y() - d)); clockwise = false; break;
|
||||
case kDown: cursor.SetY(min(cursorLimits.Bottom(), cursor.Y() + d)); clockwise = true; break;
|
||||
case kLeft: cursor.SetX(max(cursorLimits.Left(), cursor.X() - d)); clockwise = false; break;
|
||||
case kRight: cursor.SetX(min(cursorLimits.Right(), cursor.X() + d)); clockwise = true; break;
|
||||
case kRed: if (destroyablePixmap) {
|
||||
osd->DestroyPixmap(destroyablePixmap);
|
||||
destroyablePixmap = NULL;
|
||||
}
|
||||
break;
|
||||
case kGreen: if (toggleablePixmap)
|
||||
toggleablePixmap->SetLayer(-toggleablePixmap->Layer());
|
||||
break;
|
||||
case k1: Cancel(3);
|
||||
SetArea();
|
||||
DrawEllipses(osd);
|
||||
break;
|
||||
case k2: Cancel(3);
|
||||
SetArea();
|
||||
DrawSlopes(osd);
|
||||
break;
|
||||
case k3: Cancel(3);
|
||||
SetArea();
|
||||
DrawImages(osd);
|
||||
break;
|
||||
case k4: Cancel(3);
|
||||
SetArea();
|
||||
DrawEllipseAlignments(osd);
|
||||
return osContinue;
|
||||
case kBack:
|
||||
case kOk: return osEnd;
|
||||
default: return state;
|
||||
}
|
||||
state = osContinue;
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
// --- cPluginOsddemo --------------------------------------------------------
|
||||
|
||||
class cPluginOsddemo : public cPlugin {
|
||||
@ -746,8 +131,6 @@ void cPluginOsddemo::Housekeeping(void)
|
||||
cOsdObject *cPluginOsddemo::MainMenuAction(void)
|
||||
{
|
||||
// Perform the action when selected from the main VDR menu.
|
||||
if (cOsdProvider::SupportsTrueColor())
|
||||
return new cTrueColorDemo;
|
||||
return new cLineGame;
|
||||
}
|
||||
|
||||
|
@ -1,340 +0,0 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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
|
||||
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
@ -1,122 +0,0 @@
|
||||
VDR Plugin 'pictures' Revision History
|
||||
--------------------------------------
|
||||
|
||||
2008-01-13: Version 0.0.1
|
||||
|
||||
- Initial revision.
|
||||
|
||||
2008-01-19: Version 0.0.2
|
||||
|
||||
- Fixed the Play function (when used from a directory in the pictures menu
|
||||
it always started with the next directory).
|
||||
- Added Finnish texts (thanks to Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>).
|
||||
|
||||
2008-01-27: Version 0.0.3
|
||||
|
||||
- Added French texts (thanks to Patrice Staudt <patrice.staudt@laposte.net>).
|
||||
|
||||
2008-02-02: Version 0.0.4
|
||||
|
||||
- Added option -i to pic2mpg to ignore unknown file types.
|
||||
|
||||
2008-02-17: Version 0.0.5
|
||||
|
||||
- Fixed setting the OSD area.
|
||||
- Introduced 'operator const void * ()' in cString to catch cases where operator*()
|
||||
should be used.
|
||||
|
||||
2008-02-29: Version 0.0.6
|
||||
|
||||
- Made the 'pic2mpg' script of the 'pictures' plugin work with uppercase filename
|
||||
extensions and relative paths (reported by Stefan Wagner <stefanwag@gmx.at>).
|
||||
|
||||
2008-03-14: Version 0.0.7
|
||||
|
||||
- Added Russian translations (thanks to Alexander Gross).
|
||||
|
||||
2009-12-06: Version 0.0.8
|
||||
|
||||
- Several code modifications to avoid compiler warnings (thanks to Winfried Köhler).
|
||||
|
||||
2010-02-28: Version 0.0.9
|
||||
|
||||
- Added Lithuanian language translations (thanks to Valdemaras Pipiras).
|
||||
|
||||
2011-02-20: Version 0.1.0
|
||||
|
||||
- Fixed reallocating memory (reported by Paul Menzel).
|
||||
|
||||
2011-07-23:
|
||||
|
||||
- Now rotating images according to the EXIF 'Orientation' parameter.
|
||||
|
||||
2011-08-14:
|
||||
|
||||
- The pic2mpg script now generates HD images (thanks to Andre Weidemann for his
|
||||
support in using convert/ffmpeg). The old SD version is still available as
|
||||
pic2mpg-sd.
|
||||
|
||||
2011-11-02:
|
||||
|
||||
- Fixed handling images that are rotated by 180 degrees in pic2mpg.
|
||||
|
||||
2012-01-08:
|
||||
|
||||
- Added option -o to pic2mpg.
|
||||
|
||||
2012-02-17:
|
||||
|
||||
- cReadDir::Next() now skips directory entries "." and "..".
|
||||
|
||||
2012-02-27: Version 0.1.2
|
||||
|
||||
- Removed an obsolete command line option.
|
||||
|
||||
2012-04-28: Version 0.1.3
|
||||
|
||||
- Added cPictureControl::GetHeader().
|
||||
|
||||
2012-12-27: Version 0.1.4
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-01-12: Version 0.1.5
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-03-31: Version 2.0.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2013-07-01:
|
||||
|
||||
- Added option -x to pic2mpg.
|
||||
|
||||
2014-01-01: Version 2.1.1
|
||||
|
||||
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
||||
|
||||
2015-02-19: Version 2.2.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2015-07-23: Version 2.3.1
|
||||
|
||||
- Added a missing 'const'.
|
||||
|
||||
2017-10-06: Version 2.3.2
|
||||
|
||||
- Adapted the pic2mpg script to new ffmpeg options.
|
||||
- No longer using 'convert' to scale/rotate the pictures.
|
||||
|
||||
2018-04-15: Version 2.4.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2021-12-27: Version 2.6.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2022-12-05: Version 2.6.1
|
||||
|
||||
Fixed initializing cPictureControl.
|
@ -1,128 +0,0 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
# By default the main source file also carries this name.
|
||||
|
||||
PLUGIN = pictures
|
||||
|
||||
### The version number of this plugin (taken from the main source file):
|
||||
|
||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||
|
||||
### The directory environment:
|
||||
|
||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||
PKG_CONFIG ?= pkg-config
|
||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
||||
LIBDIR = $(call PKGCFG,libdir)
|
||||
LOCDIR = $(call PKGCFG,locdir)
|
||||
PLGCFG = $(call PKGCFG,plgcfg)
|
||||
#
|
||||
TMPDIR ?= /tmp
|
||||
|
||||
### The compiler options:
|
||||
|
||||
export CFLAGS = $(call PKGCFG,cflags)
|
||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
||||
|
||||
### The version number of VDR's plugin API:
|
||||
|
||||
APIVERSION = $(call PKGCFG,apiversion)
|
||||
|
||||
### Allow user defined options to overwrite defaults:
|
||||
|
||||
-include $(PLGCFG)
|
||||
|
||||
### The name of the distribution archive:
|
||||
|
||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||
PACKAGE = vdr-$(ARCHIVE)
|
||||
|
||||
### The name of the shared object file:
|
||||
|
||||
SOFILE = libvdr-$(PLUGIN).so
|
||||
|
||||
### Includes and Defines (add further entries here):
|
||||
|
||||
INCLUDES +=
|
||||
|
||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
|
||||
### The object files (add further files here):
|
||||
|
||||
OBJS = $(PLUGIN).o entry.o menu.o player.o
|
||||
|
||||
### The main target:
|
||||
|
||||
all: $(SOFILE) i18n
|
||||
|
||||
### Implicit rules:
|
||||
|
||||
%.o: %.c
|
||||
@echo CC $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||
|
||||
### Dependencies:
|
||||
|
||||
MAKEDEP = $(CXX) -MM -MG
|
||||
DEPFILE = .dependencies
|
||||
$(DEPFILE): Makefile
|
||||
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
|
||||
-include $(DEPFILE)
|
||||
|
||||
### Internationalization (I18N):
|
||||
|
||||
PODIR = po
|
||||
I18Npo = $(wildcard $(PODIR)/*.po)
|
||||
I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
|
||||
I18Nmsgs = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
|
||||
I18Npot = $(PODIR)/$(PLUGIN).pot
|
||||
|
||||
%.mo: %.po
|
||||
@echo MO $@
|
||||
$(Q)msgfmt -c -o $@ $<
|
||||
|
||||
$(I18Npot): $(wildcard *.c)
|
||||
@echo GT $@
|
||||
$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
|
||||
|
||||
%.po: $(I18Npot)
|
||||
@echo PO $@
|
||||
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
|
||||
@touch $@
|
||||
|
||||
$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
|
||||
install -D -m644 $< $@
|
||||
|
||||
.PHONY: i18n
|
||||
i18n: $(I18Nmo) $(I18Npot)
|
||||
|
||||
install-i18n: $(I18Nmsgs)
|
||||
|
||||
### Targets:
|
||||
|
||||
$(SOFILE): $(OBJS)
|
||||
@echo LD $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
||||
|
||||
install-lib: $(SOFILE)
|
||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
||||
|
||||
install: install-lib install-i18n
|
||||
|
||||
dist: $(I18Npo) clean
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
||||
@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE)
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
@echo Distribution package created as $(PACKAGE).tgz
|
||||
|
||||
clean:
|
||||
@-rm -f $(PODIR)/*.mo $(PODIR)/*.pot
|
||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
@ -1,119 +0,0 @@
|
||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||
|
||||
Written by: Klaus Schmidinger <vdr@tvdr.de>
|
||||
|
||||
Project's homepage: https://www.tvdr.de
|
||||
|
||||
Latest version available at: https://www.tvdr.de
|
||||
|
||||
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.
|
||||
See the file COPYING for more information.
|
||||
|
||||
Description:
|
||||
============
|
||||
|
||||
The 'pictures' plugin implements a simple picture viewer.
|
||||
|
||||
There is already an 'image' plugin out there which has a lot more
|
||||
functionality than this one, but it's way too complex for my taste,
|
||||
and also converts the image files on-the-fly, which makes it slow
|
||||
on slow hardware.
|
||||
|
||||
This plugin assumes that the pictures have already been converted to
|
||||
MPEG frames (with the 'pic2mpg' script that comes with this archive),
|
||||
and doesn't implement any fancy features like zooming, panning or
|
||||
tiled previews. It's just a very simple viewer.
|
||||
|
||||
It also assumes a rather particular directory structure (see below),
|
||||
which I have found to fit well for my needs. If you use a different
|
||||
structure, the plugin should still work, but the information displayed
|
||||
in the caption may not be as expected.
|
||||
|
||||
Remote control key functions while in the Pictures menu:
|
||||
========================================================
|
||||
|
||||
- Left/right/Up/Down: navigate in the menu as usual.
|
||||
- Ok: opens a directory or displays the selected
|
||||
picture.
|
||||
- Red/Play: start a slide show at the first picture in the
|
||||
selected directory (or at the selected picture).
|
||||
|
||||
Remote control key functions while displaying pictures:
|
||||
=======================================================
|
||||
|
||||
- Left/Right: advances to the previous/next picture. At the end of a directory
|
||||
it automatically advances to the first picture of the next
|
||||
directory and displays the caption.
|
||||
- Up/Play: start the slide show.
|
||||
- Down/Pause: stop the slide show.
|
||||
- Blue/Stop: exit from the picture viewer.
|
||||
- Green/Prev: skip to the first picture in the previous directory.
|
||||
- Yellow/Next: skip to the first picture in the next directory.
|
||||
- Ok: toggle the caption display.
|
||||
- Back: return to the picture selection menu.
|
||||
|
||||
The slide show starts with the picture immediately following the one that
|
||||
is currently visible, and continues until the last available picture,
|
||||
automatically crossing directories as necessary.
|
||||
|
||||
Pressing any of the Left/Right, Green/Prev, Yellow/Next or Back keys
|
||||
automatically stops an ongoing slide show.
|
||||
|
||||
Directory structure:
|
||||
====================
|
||||
|
||||
The 'pictures' plugin requires a particular directory structure in order to
|
||||
work properly. Starting at some base directory (e.g. "/path/to/pictures"),
|
||||
there is one directory level marking the year in which the pictures were
|
||||
taken, followed by a level with a properly sortable combination of month
|
||||
and description, and finally the plain picture files, as in
|
||||
|
||||
/path/to/pictures/YEAR/MONTH_DESCRIPTION/*.jpg
|
||||
|
||||
For example
|
||||
|
||||
/path/to/pictures/2007/06a_Vacation_in_Colorado/dsc01234.jpg
|
||||
/path/to/pictures/2007/06a_Vacation_in_Colorado/dsc01235.jpg
|
||||
/path/to/pictures/2007/06b_Our_cat/dsc01236.jpg
|
||||
|
||||
The MONTH is "01" for January through "12" for December. If there is more
|
||||
than one entry for one month, it should be followed by a letter to make them
|
||||
sort correctly. Note that this is just a suggestion on how to make the
|
||||
directories sort in the correct chronological order. Instead of the two digit
|
||||
month number, optionally followed by a letter, you can use anything else you
|
||||
like. There must be an underscore between the MONTH and the DESCRIPTION part,
|
||||
and any underscores within the DESCRIPTION will be converted to blanks when
|
||||
displaying the description (this is done so that blanks can be avoided in
|
||||
the directory names).
|
||||
|
||||
Preparing the files:
|
||||
====================
|
||||
|
||||
In order to display the pictures as "still pictures" on the DVB device, they
|
||||
need to be converted into MPEG frames. This procedure takes some time, and
|
||||
would make viewing pictures sluggish, especially on slow hardware. Therefore
|
||||
the script "pic2mpg" must be used to convert all picture files before
|
||||
using this plugin, as in
|
||||
|
||||
pic2mpg /path/to/pictures /path/to/pictures.MPG
|
||||
|
||||
This will recursively walk through all pictures in the source directory and
|
||||
convert them into MPEG frames, stored in the destination directory. The
|
||||
extension ".MPG" is just a suggestion, you can name the directory anything
|
||||
you like, and it doesn't have to start with the same path as the source
|
||||
directory. Just don't make the destination directory a subdirectory of
|
||||
the source directory, because this would surely lead to problems.
|
||||
See "pic2mpg -h" for a list of available options.
|
||||
The pic2mpg conversion can be run any time, even if converted pictures
|
||||
already exist. It will only convert pictures that haven't been converted
|
||||
yet. Any changes to the source directory will be reflected in the destination
|
||||
directory accordingly after pic2mpg has finished (note that this especially
|
||||
means that any files or directories in the destination tree that have no
|
||||
corresponding entry in the source tree will be deleted!). So you can run
|
||||
pic2mpg, for instance, after copying new pictures into your picture
|
||||
directory, or after making any other kind of changes to your existing
|
||||
pictures. It might even be a good idea to run pic2mpg in a (nightly)
|
||||
cron job.
|
@ -1,147 +0,0 @@
|
||||
/*
|
||||
* entry.c: Data structure to handle still pictures
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: entry.c 2.1 2012/02/17 14:00:28 kls Exp $
|
||||
*/
|
||||
|
||||
#include "entry.h"
|
||||
|
||||
cPictureEntry::cPictureEntry(const char *Name, const cPictureEntry *Parent, bool IsDirectory)
|
||||
{
|
||||
name = strdup(Name);
|
||||
parent = Parent;
|
||||
isDirectory = IsDirectory;
|
||||
entries = NULL;
|
||||
}
|
||||
|
||||
cPictureEntry::~cPictureEntry()
|
||||
{
|
||||
free(name);
|
||||
delete entries;
|
||||
}
|
||||
|
||||
int cPictureEntry::Compare(const cListObject &ListObject) const
|
||||
{
|
||||
cPictureEntry *p = (cPictureEntry *)&ListObject;
|
||||
if (IsDirectory() && !p->IsDirectory())
|
||||
return -1;
|
||||
if (!IsDirectory() && p->IsDirectory())
|
||||
return +1;
|
||||
if (IsDirectory())
|
||||
return strcoll(name, p->name);
|
||||
else
|
||||
return strcmp(name, p->name); // correctly sorts dsc01234.jpg and dsc01234a.jpg in case pictures have been "squeezed in"
|
||||
}
|
||||
|
||||
cString cPictureEntry::Path(void) const
|
||||
{
|
||||
return parent ? *AddDirectory(parent->Path(), name) : name;
|
||||
}
|
||||
|
||||
void cPictureEntry::Load(void) const
|
||||
{
|
||||
if (isDirectory && !entries) {
|
||||
cString Directory = Path();
|
||||
cReadDir d(Directory);
|
||||
if (d.Ok()) {
|
||||
struct dirent *e;
|
||||
while ((e = d.Next()) != NULL) {
|
||||
struct stat ds;
|
||||
if (stat(AddDirectory(Directory, e->d_name), &ds) == 0) {
|
||||
if (!entries)
|
||||
entries = new cList<cPictureEntry>;
|
||||
entries->Add(new cPictureEntry(e->d_name, this, S_ISDIR(ds.st_mode)));
|
||||
}
|
||||
}
|
||||
if (entries)
|
||||
entries->Sort();
|
||||
}
|
||||
else
|
||||
LOG_ERROR_STR(*Directory);
|
||||
}
|
||||
}
|
||||
|
||||
const cList<cPictureEntry> *cPictureEntry::Entries(void) const
|
||||
{
|
||||
Load();
|
||||
return entries;
|
||||
}
|
||||
|
||||
const cPictureEntry *cPictureEntry::FirstPicture(void) const
|
||||
{
|
||||
Load();
|
||||
if (entries) {
|
||||
for (cPictureEntry *pe = entries->First(); pe; pe = entries->Next(pe)) {
|
||||
if (pe->IsDirectory()) {
|
||||
const cPictureEntry *p = pe->FirstPicture();
|
||||
if (p)
|
||||
return p;
|
||||
}
|
||||
else
|
||||
return pe;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const cPictureEntry *cPictureEntry::LastPicture(void) const
|
||||
{
|
||||
Load();
|
||||
if (entries) {
|
||||
for (cPictureEntry *pe = entries->Last(); pe; pe = entries->Prev(pe)) {
|
||||
if (pe->IsDirectory()) {
|
||||
const cPictureEntry *p = pe->LastPicture();
|
||||
if (p)
|
||||
return p;
|
||||
}
|
||||
else
|
||||
return pe;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const cPictureEntry *cPictureEntry::PrevPicture(const cPictureEntry *This) const
|
||||
{
|
||||
if (This) {
|
||||
const cPictureEntry *pe = (cPictureEntry *)entries->Prev(This);
|
||||
if (pe) {
|
||||
if (pe->IsDirectory()) {
|
||||
const cPictureEntry *p = pe->LastPicture();
|
||||
if (p)
|
||||
return p;
|
||||
return PrevPicture(pe);
|
||||
}
|
||||
return pe;
|
||||
}
|
||||
}
|
||||
if (parent)
|
||||
return parent->PrevPicture(this);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const cPictureEntry *cPictureEntry::NextPicture(const cPictureEntry *This) const
|
||||
{
|
||||
if (This) {
|
||||
cPictureEntry *pe = (cPictureEntry *)entries->Next(This);
|
||||
if (pe) {
|
||||
if (pe->IsDirectory()) {
|
||||
const cPictureEntry *p = pe->FirstPicture();
|
||||
if (p)
|
||||
return p;
|
||||
return NextPicture(pe);
|
||||
}
|
||||
return pe;
|
||||
}
|
||||
}
|
||||
else if (IsDirectory()) {
|
||||
const cPictureEntry *p = FirstPicture();
|
||||
if (p)
|
||||
return p;
|
||||
}
|
||||
if (parent)
|
||||
return parent->NextPicture(this);
|
||||
return NULL;
|
||||
}
|
@ -1,36 +0,0 @@
|
||||
/*
|
||||
* entry.h: Data structure to handle still pictures
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: entry.h 1.1 2008/01/13 11:29:27 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef _ENTRY_H
|
||||
#define _ENTRY_H
|
||||
|
||||
#include <vdr/tools.h>
|
||||
|
||||
class cPictureEntry : public cListObject {
|
||||
private:
|
||||
char *name;
|
||||
const cPictureEntry *parent;
|
||||
bool isDirectory;
|
||||
mutable cList<cPictureEntry> *entries;
|
||||
void Load(void) const;
|
||||
public:
|
||||
cPictureEntry(const char *Name, const cPictureEntry *Parent, bool IsDirectory);
|
||||
virtual ~cPictureEntry();
|
||||
virtual int Compare(const cListObject &ListObject) const;
|
||||
const char *Name(void) const { return name; }
|
||||
const cPictureEntry *Parent(void) const { return parent; }
|
||||
bool IsDirectory(void) const { return isDirectory; }
|
||||
cString Path(void) const;
|
||||
const cList<cPictureEntry> *Entries(void) const;
|
||||
const cPictureEntry *FirstPicture(void) const;
|
||||
const cPictureEntry *LastPicture(void) const;
|
||||
const cPictureEntry *PrevPicture(const cPictureEntry *This = NULL) const;
|
||||
const cPictureEntry *NextPicture(const cPictureEntry *This = NULL) const;
|
||||
};
|
||||
|
||||
#endif //_ENTRY_H
|
@ -1,129 +0,0 @@
|
||||
/*
|
||||
* menu.c: A menu for still pictures
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: menu.c 4.1 2015/07/17 10:13:56 kls Exp $
|
||||
*/
|
||||
|
||||
#include "menu.h"
|
||||
#include <vdr/tools.h>
|
||||
#include "entry.h"
|
||||
#include "player.h"
|
||||
|
||||
char PictureDirectory[PATH_MAX] = "";
|
||||
|
||||
static bool PathStartsWith(const char *Path, const char *Name)
|
||||
{
|
||||
if (Path && Name) {
|
||||
while (*Name) {
|
||||
if (*Path++ != *Name++)
|
||||
return false;
|
||||
}
|
||||
if (*Path && *Path != '/')
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static const char *NextLevel(const char *Path)
|
||||
{
|
||||
if (Path) {
|
||||
const char *p = strchr(Path, '/');
|
||||
return p ? p + 1 : NULL;
|
||||
}
|
||||
return Path;
|
||||
}
|
||||
|
||||
cPictureEntry *cPictureMenu::pictures = NULL;
|
||||
|
||||
cPictureMenu::cPictureMenu(const cPictureEntry *PictureEntry, const char *Path)
|
||||
:cOsdMenu(tr("Pictures"))
|
||||
{
|
||||
pictureEntry = PictureEntry;
|
||||
if (!pictureEntry)
|
||||
pictureEntry = pictures = new cPictureEntry(PictureDirectory, NULL, true);
|
||||
if (pictureEntry->Parent()) {
|
||||
if (!pictureEntry->Parent()->Parent())
|
||||
SetTitle(pictureEntry->Name()); // Year
|
||||
else
|
||||
SetTitle(cString::sprintf("%s: %s", pictureEntry->Parent()->Name(), *HandleUnderscores(pictureEntry->Name()))); // Year/Description
|
||||
}
|
||||
Set(Path);
|
||||
}
|
||||
|
||||
cPictureMenu::~cPictureMenu()
|
||||
{
|
||||
if (pictures && pictureEntry && !pictureEntry->Parent())
|
||||
DELETENULL(pictures);
|
||||
}
|
||||
|
||||
void cPictureMenu::Set(const char *Path)
|
||||
{
|
||||
Clear();
|
||||
const cList<cPictureEntry> *l = pictureEntry->Entries();
|
||||
if (l) {
|
||||
for (const cPictureEntry *e = l->First(); e; e = l->Next(e)) {
|
||||
cString Name = HandleUnderscores(e->Name());
|
||||
if (!e->IsDirectory())
|
||||
Name.Truncate(-4); // don't display the ".mpg" extension
|
||||
Add(new cOsdItem(HandleUnderscores(Name)), PathStartsWith(Path, e->Name()));
|
||||
}
|
||||
}
|
||||
SetHelp(Count() ? trVDR("Button$Play") : NULL, NULL, NULL, cPictureControl::Active() ? trVDR("Button$Stop") : NULL);
|
||||
if (Current() >= 0) {
|
||||
const char *p = NextLevel(Path);
|
||||
if (p)
|
||||
SelectItem(p);
|
||||
}
|
||||
}
|
||||
|
||||
eOSState cPictureMenu::SelectItem(const char *Path, bool SlideShow)
|
||||
{
|
||||
cOsdItem *Item = Get(Current());
|
||||
if (Item) {
|
||||
const cList<cPictureEntry> *l = pictureEntry->Entries();
|
||||
if (l) {
|
||||
const cPictureEntry *pe = l->Get(Current());
|
||||
if (pe) {
|
||||
if (SlideShow) {
|
||||
cControl::Launch(new cPictureControl(pictures, pe, true));
|
||||
pictures = NULL; // cPictureControl takes ownership
|
||||
return osEnd;
|
||||
}
|
||||
if (pe->IsDirectory())
|
||||
return AddSubMenu(new cPictureMenu(pe, Path));
|
||||
else if (!Path) {
|
||||
cControl::Launch(new cPictureControl(pictures, pe));
|
||||
pictures = NULL; // cPictureControl takes ownership
|
||||
return osEnd;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return osContinue;
|
||||
}
|
||||
|
||||
eOSState cPictureMenu::ProcessKey(eKeys Key)
|
||||
{
|
||||
eOSState state = cOsdMenu::ProcessKey(Key);
|
||||
if (state == osUnknown) {
|
||||
switch (Key) {
|
||||
case kRed:
|
||||
case kPlay: return SelectItem(NULL, true);
|
||||
case kBlue:
|
||||
case kStop: if (cPictureControl::Active())
|
||||
return osStopReplay;
|
||||
break;
|
||||
case kOk: return SelectItem();
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
cPictureMenu *cPictureMenu::CreatePictureMenu(void)
|
||||
{
|
||||
return new cPictureMenu(NULL, cPictureControl::LastDisplayed());
|
||||
}
|
@ -1,31 +0,0 @@
|
||||
/*
|
||||
* menu.h: A menu for still pictures
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: menu.h 1.1 2008/01/13 11:32:52 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef _MENU_H
|
||||
#define _MENU_H
|
||||
|
||||
#include <vdr/osdbase.h>
|
||||
#include <vdr/tools.h>
|
||||
#include "entry.h"
|
||||
|
||||
extern char PictureDirectory[PATH_MAX];
|
||||
|
||||
class cPictureMenu : public cOsdMenu {
|
||||
private:
|
||||
static cPictureEntry *pictures;
|
||||
const cPictureEntry *pictureEntry;
|
||||
void Set(const char *Path);
|
||||
eOSState SelectItem(const char *Path = NULL, bool SlideShow = false);
|
||||
public:
|
||||
cPictureMenu(const cPictureEntry *PictureEntry, const char *Path = NULL);
|
||||
~cPictureMenu();
|
||||
virtual eOSState ProcessKey(eKeys Key);
|
||||
static cPictureMenu *CreatePictureMenu(void);
|
||||
};
|
||||
|
||||
#endif //_MENU_H
|
@ -1,172 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
# pic2mpg: Convert picture files to MPEG still frames
|
||||
#
|
||||
# Converts either a single picture file or all files in a
|
||||
# given directory (recursively) to MPEG still frames.
|
||||
#
|
||||
# See the README file for copyright information and how to reach the author.
|
||||
#
|
||||
# $Id: pic2mpg 4.1 2017/10/06 14:42:18 kls Exp $
|
||||
|
||||
use File::Path;
|
||||
use File::Spec;
|
||||
use Getopt::Std;
|
||||
use Image::ExifTool qw(:Public);
|
||||
|
||||
$Usage = qq{
|
||||
Usage: $0 [options] picture-dir mpeg-dir
|
||||
$0 [options] picture-file mpeg-file
|
||||
|
||||
Options: -f Force conversion
|
||||
-h print Help
|
||||
-o percent overscan in percent
|
||||
-s size Screen size (WIDTHxHEIGHT, default is 1920x1080)
|
||||
-v num Verbose (0=none, 1=list files, 2=detailed)
|
||||
-x dir[,...] eXclude the given directories
|
||||
};
|
||||
|
||||
getopts("fho:s:v:x:") || die $Usage;
|
||||
|
||||
die $Usage if $opt_h;
|
||||
|
||||
$Force = $opt_f;
|
||||
$Overscan = $opt_o || 0;
|
||||
$Size = $opt_s || "1920x1080";
|
||||
$Verbose = $opt_v;
|
||||
@Exclude = split(',', $opt_x || "");
|
||||
|
||||
$ListFiles = $Verbose >= 1;
|
||||
$Detailed = $Verbose >= 2;
|
||||
|
||||
# Supported picture types:
|
||||
|
||||
%PICTYPES = (
|
||||
bmp => 1,
|
||||
gif => 1,
|
||||
jpeg => 1,
|
||||
jpg => 1,
|
||||
png => 1,
|
||||
pnm => 1,
|
||||
tif => 1,
|
||||
tiff => 1,
|
||||
);
|
||||
|
||||
# Command options:
|
||||
|
||||
die "$0: missing parameter\n" unless $ARGV[0] && $ARGV[1];
|
||||
die "$0: file or directory not found: $ARGV[0]\n" unless -e $ARGV[0];
|
||||
die "$0: source and destination must be different\n" if $ARGV[0] eq $ARGV[1];
|
||||
|
||||
$Extent = $Size;
|
||||
if ($Overscan > 0) {
|
||||
my ($x, $y) = $Size =~ /(.*)x(.*)/;
|
||||
my $r = (100 + $Overscan) / 100;
|
||||
$x = int($x * $r + 0.5);
|
||||
$y = int($y * $r + 0.5);
|
||||
$Extent = "${x}x$y";
|
||||
}
|
||||
|
||||
# Convert a single file:
|
||||
|
||||
if (-f $ARGV[0]) {
|
||||
die "$0: mixed file and directory ('$ARGV[0]' <-> '$ARGV[1]')\n" unless !-e $ARGV[1] || -f $ARGV[1];
|
||||
ConvertFile($ARGV[0], $ARGV[1]);
|
||||
exit;
|
||||
}
|
||||
|
||||
die "$0: mixed directory and file ('$ARGV[0]' <-> '$ARGV[1]')\n" unless !-e $ARGV[1] || -d $ARGV[1];
|
||||
|
||||
$PICDIR = File::Spec->rel2abs($ARGV[0]);
|
||||
$MPGDIR = File::Spec->rel2abs($ARGV[1]);
|
||||
|
||||
# Convert pictures to mpegs:
|
||||
|
||||
chdir($PICDIR) || die "$PICDIR: $!\n";
|
||||
|
||||
@Pictures = `find -type f | sort`;
|
||||
chomp(@Pictures);
|
||||
|
||||
PIC:
|
||||
for $pic (@Pictures) {
|
||||
for (@Exclude) {
|
||||
next PIC if ($pic =~ /\/$_\//);
|
||||
}
|
||||
my $mpg = "$MPGDIR/$pic.mpg";
|
||||
if ($Force || !-e $mpg || -M $mpg > -M $pic) {
|
||||
(my $dir = $mpg) =~ s/\/[^\/]*$//;
|
||||
mkpath($dir);
|
||||
ConvertFile($pic, $mpg);
|
||||
}
|
||||
}
|
||||
|
||||
# Remove mpegs without pictures:
|
||||
|
||||
chdir($MPGDIR) || die "$MPGDIR: $!\n";
|
||||
|
||||
@Mpegs = `find -type f`;
|
||||
chomp(@Mpegs);
|
||||
|
||||
for $mpg (@Mpegs) {
|
||||
my $pic = "$PICDIR/$mpg";
|
||||
$pic =~ s/\.mpg$//;
|
||||
if (!-e $pic) {
|
||||
print "removing $mpg\n";
|
||||
unlink($mpg);
|
||||
}
|
||||
}
|
||||
|
||||
# Remove empty directories:
|
||||
|
||||
chdir($MPGDIR) || die "$MPGDIR: $!\n";
|
||||
|
||||
for ($i = 0; $i < 10; $i++) { # dirs might become empty when removing empty subdirs
|
||||
@Dirs = `find -type d -empty`;
|
||||
chomp(@Dirs);
|
||||
last unless @Dirs;
|
||||
|
||||
for $dir (@Dirs) {
|
||||
$dir = EscapeMeta($dir);
|
||||
print "removing $dir\n";
|
||||
Exec("rm -rf $dir");
|
||||
}
|
||||
}
|
||||
|
||||
# Actual file conversion:
|
||||
|
||||
sub ConvertFile
|
||||
{
|
||||
my ($Pict, $Mpeg) = @_;
|
||||
(my $Type) = lc($Pict) =~ /\.([^\.]*)$/;
|
||||
return if (!defined $PICTYPES{$Type});
|
||||
my $Exif = ImageInfo($Pict);
|
||||
my $Orientation = $$Exif{"Orientation"};
|
||||
my ($Degrees) = $Orientation =~ /Rotate ([0-9]+)/;
|
||||
my $Rotate = ($Degrees == 90) ? "transpose=clock" : ($Degrees == 180) ? "hflip,vflip" : ($Degrees == 270) ? "transpose=cclock" : "";
|
||||
$Rotate .= ',' if ($Rotate);
|
||||
my $Background = '#000000@1';
|
||||
print "orientation = '$Orientation' -> rotation = $Rotate\n" if ($Detailed);
|
||||
$Pict = EscapeMeta($Pict);
|
||||
$Mpeg = EscapeMeta($Mpeg);
|
||||
print "$Pict -> $Mpeg $Rotate\n" if $ListFiles;
|
||||
my $Cmd = "ffmpeg -i $Pict -vf '${Rotate}scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:$Background' -c:v libx264 -pix_fmt yuv420p -f mpegts -y $Mpeg "
|
||||
. ($Detailed ? "" : "2>/dev/null");
|
||||
Exec($Cmd);
|
||||
$Cmd = "touch -r $Pict $Mpeg";
|
||||
Exec($Cmd);
|
||||
}
|
||||
|
||||
sub EscapeMeta
|
||||
{
|
||||
my $META = ' !"#$%&\'()*;<>?[\\]`{|}~';
|
||||
my $s = shift;
|
||||
$s =~ s/([$META])/\\$1/g;
|
||||
return $s;
|
||||
}
|
||||
|
||||
sub Exec
|
||||
{
|
||||
my $Cmd = shift;
|
||||
print "==> '$Cmd'\n" if ($Verbose);
|
||||
!system($Cmd) || die "$Cmd: $!\n";
|
||||
}
|
@ -1,193 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
# pic2mpg: Convert picture files to MPEG still frames
|
||||
#
|
||||
# Converts either a single picture file or all files in a
|
||||
# given directory (recursively) to MPEG still frames.
|
||||
#
|
||||
# See the README file for copyright information and how to reach the author.
|
||||
#
|
||||
# $Id: pic2mpg-sd 2.1 2011/07/23 14:23:59 kls Exp $
|
||||
|
||||
## TODO implement HDTV (1920 x 1080)
|
||||
|
||||
use File::Path;
|
||||
use File::Spec;
|
||||
use Getopt::Std;
|
||||
use Image::ExifTool qw(:Public);
|
||||
use Image::Size;
|
||||
|
||||
$Usage = qq{
|
||||
Usage: $0 [options] picture-dir mpeg-dir
|
||||
$0 [options] picture-file mpeg-file
|
||||
|
||||
Options: -a Aspect ratio 4:3 (default is 16:9)
|
||||
-f Force conversion
|
||||
-h print Help
|
||||
-i Ignore unknown file types
|
||||
-n NTSC (default is PAL)
|
||||
-v num Verbose (0=none, 1=list files, 2=detailed)
|
||||
-x percent X overscan in percent
|
||||
-y percent Y overscan in percent
|
||||
};
|
||||
|
||||
getopts("afhinv:x:y:") || die $Usage;
|
||||
|
||||
die $Usage if $opt_h;
|
||||
|
||||
$Aspect = $opt_a;
|
||||
$Force = $opt_f;
|
||||
$Ignore = $opt_i;
|
||||
$NTSC = $opt_n;
|
||||
$Verbose = $opt_v;
|
||||
$OverscanX = $opt_x;
|
||||
$OverscanY = $opt_y;
|
||||
|
||||
$ListFiles = $Verbose >= 1;
|
||||
$Detailed = $Verbose >= 2;
|
||||
|
||||
# Screen size:
|
||||
|
||||
$SW = $NTSC ? 720 : 720;
|
||||
$SH = $NTSC ? 480 : 576;
|
||||
|
||||
$ScreenRatio = $Aspect ? 4 / 3 : 16 / 9;
|
||||
|
||||
# Converter programs:
|
||||
|
||||
%PNMCONV = (
|
||||
bmp => "bmptopnm",
|
||||
gif => "giftopnm",
|
||||
jpeg => "jpegtopnm",
|
||||
jpg => "jpegtopnm",
|
||||
png => "pngtopnm",
|
||||
pnm => "cat",
|
||||
tif => "tifftopnm",
|
||||
tiff => "tifftopnm",
|
||||
);
|
||||
|
||||
# Command options:
|
||||
|
||||
die "$0: missing parameter\n" unless $ARGV[0] && $ARGV[1];
|
||||
die "$0: file or directory not found: $ARGV[0]\n" unless -e $ARGV[0];
|
||||
die "$0: source and destination must be different\n" if $ARGV[0] eq $ARGV[1];
|
||||
|
||||
$verbose1 = $Detailed ? "--verbose" : "";
|
||||
$verbose2 = $Detailed ? "-v 2" : "-v 0";
|
||||
$system1 = $NTSC ? "" : "--pal";
|
||||
$system2 = $NTSC ? "n" : "p";
|
||||
$framerate = $NTSC ? "30000:1001" : "25:1";
|
||||
$aspect = $Aspect ? "2" : "3";
|
||||
|
||||
# Convert a single file:
|
||||
|
||||
if (-f $ARGV[0]) {
|
||||
die "$0: mixed file and directory ('$ARGV[0]' <-> '$ARGV[1]')\n" unless !-e $ARGV[1] || -f $ARGV[1];
|
||||
ConvertFile($ARGV[0], $ARGV[1]);
|
||||
exit;
|
||||
}
|
||||
|
||||
die "$0: mixed directory and file ('$ARGV[0]' <-> '$ARGV[1]')\n" unless !-e $ARGV[1] || -d $ARGV[1];
|
||||
|
||||
$PICDIR = File::Spec->rel2abs($ARGV[0]);
|
||||
$MPGDIR = File::Spec->rel2abs($ARGV[1]);
|
||||
|
||||
# Convert pictures to mpegs:
|
||||
|
||||
chdir($PICDIR) || die "$PICDIR: $!\n";
|
||||
|
||||
@Pictures = `find -type f`;
|
||||
chomp(@Pictures);
|
||||
|
||||
for $pic (@Pictures) {
|
||||
my $mpg = "$MPGDIR/$pic.mpg";
|
||||
if ($Force || !-e $mpg || -M $mpg > -M $pic) {
|
||||
(my $dir = $mpg) =~ s/\/[^\/]*$//;
|
||||
mkpath($dir);
|
||||
ConvertFile($pic, $mpg);
|
||||
}
|
||||
}
|
||||
|
||||
# Remove mpegs without pictures:
|
||||
|
||||
chdir($MPGDIR) || die "$MPGDIR: $!\n";
|
||||
|
||||
@Mpegs = `find -type f`;
|
||||
chomp(@Mpegs);
|
||||
|
||||
for $mpg (@Mpegs) {
|
||||
my $pic = "$PICDIR/$mpg";
|
||||
$pic =~ s/\.mpg$//;
|
||||
if (!-e $pic) {
|
||||
print "removing $mpg\n";
|
||||
unlink($mpg);
|
||||
}
|
||||
}
|
||||
|
||||
# Remove empty directories:
|
||||
|
||||
chdir($MPGDIR) || die "$MPGDIR: $!\n";
|
||||
|
||||
for ($i = 0; $i < 10; $i++) { # dirs might become empty when removing empty subdirs
|
||||
@Dirs = `find -type d -empty`;
|
||||
chomp(@Dirs);
|
||||
last unless @Dirs;
|
||||
|
||||
for $dir (@Dirs) {
|
||||
$dir = EscapeMeta($dir);
|
||||
print "removing $dir\n";
|
||||
!system("rm -rf $dir") || die "$dir: $!\n";
|
||||
}
|
||||
}
|
||||
|
||||
# Actual file conversion:
|
||||
|
||||
sub ConvertFile
|
||||
{
|
||||
my ($Pict, $Mpeg) = @_;
|
||||
(my $Type) = lc($Pict) =~ /\.([^\.]*)$/;
|
||||
if (!defined $PNMCONV{$Type}) {
|
||||
return if ($Ignore);
|
||||
die "unknown file type '$Type': '$Pict'\n";
|
||||
}
|
||||
my ($w, $h) = imgsize($Pict);
|
||||
print "image size is $w x $h\n" if ($Detailed);
|
||||
my $Exif = ImageInfo($Pict);
|
||||
my $Orientation = $$Exif{"Orientation"};
|
||||
my ($Degrees) = $Orientation =~ /Rotate ([0-9]+) /;
|
||||
my $Rotate = "-null";
|
||||
$Rotate = "-cw" if $Degrees eq "90";
|
||||
$Rotate = "-ccw" if $Degrees eq "270";
|
||||
$Rotate = "-r180" if $Degrees eq "180";
|
||||
print "orientation = '$Orientation' -> rotation = $Rotate\n" if ($Detailed);
|
||||
($w, $h) = ($h, $w) if ($Degrees eq "90" || $Degrees eq "270");
|
||||
if ($w / $h <= $ScreenRatio) {
|
||||
$w = $h * $ScreenRatio;
|
||||
}
|
||||
else {
|
||||
$h = $w / $ScreenRatio;
|
||||
}
|
||||
my $ScaleW = $SW / $w * (100 - 2 * $OverscanX) / 100;
|
||||
my $ScaleH = $SH / $h * (100 - 2 * $OverscanY) / 100;
|
||||
$Pict = EscapeMeta($Pict);
|
||||
$Mpeg = EscapeMeta($Mpeg);
|
||||
print "$Pict -> $Mpeg $Rotate\n" if $ListFiles;
|
||||
my $Cmd = "$PNMCONV{$Type} $Pict 2> /dev/null |"
|
||||
. "pamflip $verbose1 $Rotate |"
|
||||
. "pnmscale $verbose1 --xscale=$ScaleW --yscale=$ScaleH |"
|
||||
. "pnmpad $verbose1 --black --width $SW --height $SH |"
|
||||
. "ppmntsc $verbose1 $system1 |"
|
||||
. "ppmtoy4m $verbose2 -F $framerate -I p -S 420mpeg2 |"
|
||||
. "mpeg2enc $verbose2 -f 3 -b 12500 -a $aspect -q 1 -n $system2 -o $Mpeg";
|
||||
!system($Cmd) || die "$Cmd: $!\n";
|
||||
$Cmd = "touch -r $Pict $Mpeg";
|
||||
!system($Cmd) || die "$Cmd: $!\n";
|
||||
}
|
||||
|
||||
sub EscapeMeta
|
||||
{
|
||||
my $META = ' !"#$%&\'()*;<>?[\\]`{|}~';
|
||||
my $s = shift;
|
||||
$s =~ s/([$META])/\\$1/g;
|
||||
return $s;
|
||||
}
|
@ -1,124 +0,0 @@
|
||||
/*
|
||||
* pictures.c: A plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: pictures.c 5.1 2022/12/05 15:26:23 kls Exp $
|
||||
*/
|
||||
|
||||
#include <getopt.h>
|
||||
#include <vdr/plugin.h>
|
||||
#include "menu.h"
|
||||
#include "player.h"
|
||||
|
||||
static const char *VERSION = "2.6.1";
|
||||
static const char *DESCRIPTION = trNOOP("A simple picture viewer");
|
||||
static const char *MAINMENUENTRY = trNOOP("Pictures");
|
||||
|
||||
// --- cMenuSetupPictures ----------------------------------------------------
|
||||
|
||||
class cMenuSetupPictures : public cMenuSetupPage {
|
||||
private:
|
||||
char newPictureDirectory[PATH_MAX];
|
||||
int newSlideShowDelay;
|
||||
protected:
|
||||
virtual void Store(void);
|
||||
public:
|
||||
cMenuSetupPictures(void);
|
||||
};
|
||||
|
||||
cMenuSetupPictures::cMenuSetupPictures(void)
|
||||
{
|
||||
strn0cpy(newPictureDirectory, PictureDirectory, sizeof(newPictureDirectory));
|
||||
newSlideShowDelay = SlideShowDelay;
|
||||
Add(new cMenuEditStrItem(tr("Picture directory"), newPictureDirectory, sizeof(newPictureDirectory)));
|
||||
Add(new cMenuEditIntItem(tr("Slide show delay (s)"), &newSlideShowDelay));
|
||||
}
|
||||
|
||||
void cMenuSetupPictures::Store(void)
|
||||
{
|
||||
SetupStore("PictureDirectory", strn0cpy(PictureDirectory, newPictureDirectory, sizeof(PictureDirectory)));
|
||||
SetupStore("SlideShowDelay", SlideShowDelay = newSlideShowDelay);
|
||||
}
|
||||
|
||||
// --- cPluginPictures -------------------------------------------------------
|
||||
|
||||
class cPluginPictures : public cPlugin {
|
||||
private:
|
||||
// Add any member variables or functions you may need here.
|
||||
public:
|
||||
cPluginPictures(void);
|
||||
virtual ~cPluginPictures();
|
||||
virtual const char *Version(void) { return VERSION; }
|
||||
virtual const char *Description(void) { return tr(DESCRIPTION); }
|
||||
virtual const char *CommandLineHelp(void);
|
||||
virtual bool ProcessArgs(int argc, char *argv[]);
|
||||
virtual const char *MainMenuEntry(void) { return tr(MAINMENUENTRY); }
|
||||
virtual cOsdObject *MainMenuAction(void);
|
||||
virtual cMenuSetupPage *SetupMenu(void);
|
||||
virtual bool SetupParse(const char *Name, const char *Value);
|
||||
};
|
||||
|
||||
cPluginPictures::cPluginPictures(void)
|
||||
{
|
||||
// Initialize any member variables here.
|
||||
// DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL
|
||||
// VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT!
|
||||
}
|
||||
|
||||
cPluginPictures::~cPluginPictures()
|
||||
{
|
||||
// Clean up after yourself!
|
||||
}
|
||||
|
||||
const char *cPluginPictures::CommandLineHelp(void)
|
||||
{
|
||||
// Return a string that describes all known command line options.
|
||||
return " -d DIR, --dir=DIR set the picture directory to DIR\n";
|
||||
}
|
||||
|
||||
bool cPluginPictures::ProcessArgs(int argc, char *argv[])
|
||||
{
|
||||
// Implement command line argument processing here if applicable.
|
||||
static struct option long_options[] = {
|
||||
{ "dir", required_argument, NULL, 'd' },
|
||||
{ NULL, no_argument, NULL, 0 }
|
||||
};
|
||||
|
||||
int c;
|
||||
while ((c = getopt_long(argc, argv, "d:", long_options, NULL)) != -1) {
|
||||
switch (c) {
|
||||
case 'd': strn0cpy(PictureDirectory, optarg, sizeof(PictureDirectory));
|
||||
break;
|
||||
default: return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
cOsdObject *cPluginPictures::MainMenuAction(void)
|
||||
{
|
||||
// Perform the action when selected from the main VDR menu.
|
||||
if (*PictureDirectory)
|
||||
return cPictureMenu::CreatePictureMenu();
|
||||
Skins.Message(mtWarning, tr("No picture directory has been defined!"));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cMenuSetupPage *cPluginPictures::SetupMenu(void)
|
||||
{
|
||||
// Return a setup menu in case the plugin supports one.
|
||||
return new cMenuSetupPictures;
|
||||
}
|
||||
|
||||
bool cPluginPictures::SetupParse(const char *Name, const char *Value)
|
||||
{
|
||||
// Parse your own setup parameters and store their values.
|
||||
if (!strcasecmp(Name, "PictureDirectory")) strn0cpy(PictureDirectory, Value, sizeof(PictureDirectory));
|
||||
else if (!strcasecmp(Name, "SlideShowDelay")) SlideShowDelay = atoi(Value);
|
||||
else
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
VDRPLUGINCREATOR(cPluginPictures); // Don't touch this!
|
@ -1,264 +0,0 @@
|
||||
/*
|
||||
* player.c: A player for still pictures
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: player.c 5.1 2022/12/05 15:26:23 kls Exp $
|
||||
*/
|
||||
|
||||
#include "player.h"
|
||||
#include <vdr/remote.h>
|
||||
#include <vdr/tools.h>
|
||||
|
||||
int SlideShowDelay = 3; // seconds
|
||||
|
||||
cString HandleUnderscores(const char *s)
|
||||
{
|
||||
// Skip anything before and including the first '_' and replace
|
||||
// any remaining '_' with blanks:
|
||||
const char *p = strchr(s, '_');
|
||||
if (p) {
|
||||
p++;
|
||||
char buf[strlen(p) + 1];
|
||||
strcpy(buf, p);
|
||||
return strreplace(buf, '_', ' ');
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
// --- cPicturePlayer --------------------------------------------------------
|
||||
|
||||
class cPicturePlayer : public cPlayer {
|
||||
private:
|
||||
int size;
|
||||
int length;
|
||||
uchar *buffer;
|
||||
virtual void Activate(bool On);
|
||||
public:
|
||||
cPicturePlayer(void);
|
||||
~cPicturePlayer();
|
||||
void SetPicture(const char *FileName);
|
||||
};
|
||||
|
||||
cPicturePlayer::cPicturePlayer(void)
|
||||
{
|
||||
size = KILOBYTE(100); // will be adjusted automatically if files are larger
|
||||
length = 0;
|
||||
buffer = MALLOC(uchar, size);
|
||||
}
|
||||
|
||||
cPicturePlayer::~cPicturePlayer()
|
||||
{
|
||||
free(buffer);
|
||||
}
|
||||
|
||||
void cPicturePlayer::Activate(bool On)
|
||||
{
|
||||
if (length > 0)
|
||||
DeviceStillPicture(buffer, length);
|
||||
}
|
||||
|
||||
void cPicturePlayer::SetPicture(const char *FileName)
|
||||
{
|
||||
int f = open(FileName, O_RDONLY);
|
||||
if (f >= 0) {
|
||||
for (;;) {
|
||||
length = read(f, buffer, size);
|
||||
if (length > 0) {
|
||||
if (length >= size) {
|
||||
int NewSize = size * 3 / 2;
|
||||
if (uchar *NewBuffer = (uchar *)realloc(buffer, NewSize)) {
|
||||
buffer = NewBuffer;
|
||||
size = NewSize;
|
||||
}
|
||||
else {
|
||||
LOG_ERROR_STR("out of memory");
|
||||
break;
|
||||
}
|
||||
lseek(f, 0, SEEK_SET);
|
||||
continue;
|
||||
}
|
||||
DeviceStillPicture(buffer, length);
|
||||
}
|
||||
else
|
||||
LOG_ERROR_STR(FileName);
|
||||
break;
|
||||
}
|
||||
close(f);
|
||||
}
|
||||
else
|
||||
LOG_ERROR_STR(FileName);
|
||||
}
|
||||
|
||||
// --- cPictureControl -------------------------------------------------------
|
||||
|
||||
int cPictureControl::active = 0;
|
||||
cString cPictureControl::lastDisplayed;
|
||||
|
||||
cPictureControl::cPictureControl(cPictureEntry *Pictures, const cPictureEntry *PictureEntry, bool SlideShow)
|
||||
:cControl(NULL)
|
||||
{
|
||||
player = new cPicturePlayer;
|
||||
SetPlayer(player);
|
||||
pictures = Pictures;
|
||||
pictureEntry = PictureEntry;
|
||||
osd = NULL;
|
||||
lastPath = "/";
|
||||
slideShowDelay.Set(SlideShowDelay * 1000);
|
||||
slideShow = SlideShow;
|
||||
alwaysDisplayCaption = false;
|
||||
NextPicture(slideShow && pictureEntry->IsDirectory() ? 1 : 0);
|
||||
active++;
|
||||
}
|
||||
|
||||
cPictureControl::~cPictureControl()
|
||||
{
|
||||
active--;
|
||||
delete osd;
|
||||
delete player;
|
||||
delete pictures;
|
||||
}
|
||||
|
||||
void cPictureControl::NextPicture(int Direction)
|
||||
{
|
||||
if (Direction) {
|
||||
const cPictureEntry *pe = Direction > 0 ? pictureEntry->NextPicture() : pictureEntry->PrevPicture();
|
||||
if (pe)
|
||||
pictureEntry = pe;
|
||||
}
|
||||
if (pictureEntry) {
|
||||
player->SetPicture(pictureEntry->Path());
|
||||
DisplayCaption();
|
||||
}
|
||||
}
|
||||
|
||||
void cPictureControl::NextDirectory(int Direction)
|
||||
{
|
||||
// This only works reliable if a directory contains only subdirectories or pictures, not both!
|
||||
if (Direction) {
|
||||
const cPictureEntry *pe = Direction > 0 ? pictureEntry->Parent()->Entries()->Last()->NextPicture() : pictureEntry->Parent()->Entries()->First()->PrevPicture();
|
||||
if (pe && Direction < 0)
|
||||
pe = pe->Parent()->Entries()->First();
|
||||
if (pe && pe != pictureEntry) {
|
||||
pictureEntry = pe;
|
||||
player->SetPicture(pictureEntry->Path());
|
||||
DisplayCaption();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void DrawTextOutlined(cOsd *Osd, int x, int y, const char *s, tColor ColorFg, tColor ColorBg, const cFont *Font)
|
||||
{
|
||||
for (int dx = -1; dx <= 1; dx++) {
|
||||
for (int dy = -1; dy <= 1; dy++) {
|
||||
if (dx || dy)
|
||||
Osd->DrawText(x + dx, y + dy, s, ColorBg, clrTransparent, Font);
|
||||
}
|
||||
}
|
||||
Osd->DrawText(x, y, s, ColorFg, clrTransparent, Font);
|
||||
}
|
||||
|
||||
void cPictureControl::DisplayCaption(void)
|
||||
{
|
||||
bool Force = false;
|
||||
cString Path = pictureEntry->Path();
|
||||
lastDisplayed = Path + strlen(pictures->Name()) + 1;
|
||||
const char *p = strrchr(Path, '/');
|
||||
const char *q = strrchr(lastPath, '/');
|
||||
if (p && q) {
|
||||
int lp = p - Path;
|
||||
int lq = q - lastPath;
|
||||
if (lp != lq || strncmp(lastPath, Path, lp)) {
|
||||
lastPath = Path;
|
||||
Force = true;
|
||||
}
|
||||
}
|
||||
if (!alwaysDisplayCaption && !Force) {
|
||||
DELETENULL(osd);
|
||||
return;
|
||||
}
|
||||
const cFont *Font = cFont::GetFont(fontOsd);
|
||||
int w = cOsd::OsdWidth();
|
||||
int h = 2 * Font->Height();
|
||||
if (!osd) {
|
||||
osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop() + cOsd::OsdHeight() - h, OSD_LEVEL_SUBTITLES);
|
||||
tArea Areas[] = { { 0, 0, w - 1, h - 1, 8 } };
|
||||
if (Setup.AntiAlias && osd->CanHandleAreas(Areas, sizeof(Areas) / sizeof(tArea)) == oeOk)
|
||||
osd->SetAreas(Areas, sizeof(Areas) / sizeof(tArea));
|
||||
else {
|
||||
tArea Areas[] = { { 0, 0, w - 1, h - 1, 4 } };
|
||||
osd->SetAreas(Areas, sizeof(Areas) / sizeof(tArea));
|
||||
}
|
||||
}
|
||||
const char *Year = pictureEntry->Parent()->Parent() ? pictureEntry->Parent()->Parent()->Name() : "";
|
||||
cString Description = HandleUnderscores(pictureEntry->Parent()->Name());
|
||||
osd->DrawRectangle(0, 0, w - 1, h - 1, clrTransparent);
|
||||
DrawTextOutlined(osd, 0, 0, Description, clrWhite, clrBlack, Font);
|
||||
DrawTextOutlined(osd, 0, h / 2, Year, clrWhite, clrBlack, Font);
|
||||
struct stat sb;
|
||||
if (stat(Path, &sb) == 0) {
|
||||
cString Time = DayDateTime(sb.st_mtime);
|
||||
DrawTextOutlined(osd, w - Font->Width(Time), h / 2, Time, clrWhite, clrBlack, Font);
|
||||
}
|
||||
p++;
|
||||
Path.Truncate(-4); // don't display the ".mpg" extension
|
||||
DrawTextOutlined(osd, w - Font->Width(p), 0, p, clrWhite, clrBlack, Font);
|
||||
osd->Flush();
|
||||
}
|
||||
|
||||
cString cPictureControl::GetHeader(void)
|
||||
{
|
||||
return tr("Pictures");
|
||||
}
|
||||
|
||||
eOSState cPictureControl::ProcessKey(eKeys Key)
|
||||
{
|
||||
switch (int(Key)) {
|
||||
case kUp:
|
||||
case kPlay: slideShowDelay.Set();
|
||||
slideShow = true;
|
||||
break;
|
||||
case kDown:
|
||||
case kPause: slideShow = false;
|
||||
break;
|
||||
case kLeft|k_Repeat:
|
||||
case kLeft: NextPicture(-1);
|
||||
slideShow = false;
|
||||
break;
|
||||
case kRight|k_Repeat:
|
||||
case kRight: NextPicture(+1);
|
||||
slideShow = false;
|
||||
break;
|
||||
case kOk: if (osd && !alwaysDisplayCaption)
|
||||
DELETENULL(osd);
|
||||
else {
|
||||
alwaysDisplayCaption = !alwaysDisplayCaption;
|
||||
DisplayCaption();
|
||||
}
|
||||
break;
|
||||
case kGreen:
|
||||
case kPrev: NextDirectory(-1);
|
||||
slideShow = false;
|
||||
break;
|
||||
case kYellow:
|
||||
case kNext: NextDirectory(+1);
|
||||
slideShow = false;
|
||||
break;
|
||||
case kBlue:
|
||||
case kStop: return osEnd;
|
||||
case kBack: slideShow = false;
|
||||
cRemote::CallPlugin(PLUGIN_NAME_I18N);
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
if (slideShow && slideShowDelay.TimedOut()) {
|
||||
NextPicture(+1);
|
||||
slideShowDelay.Set(SlideShowDelay * 1000);
|
||||
}
|
||||
return osContinue;
|
||||
}
|
||||
|
||||
const char *cPictureControl::LastDisplayed(void)
|
||||
{
|
||||
return lastDisplayed;
|
||||
}
|
@ -1,48 +0,0 @@
|
||||
/*
|
||||
* player.h: A player for still pictures
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: player.h 2.1 2012/04/28 11:56:01 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef _PLAYER_H
|
||||
#define _PLAYER_H
|
||||
|
||||
#include <vdr/osd.h>
|
||||
#include <vdr/player.h>
|
||||
#include <vdr/tools.h>
|
||||
#include "entry.h"
|
||||
|
||||
extern int SlideShowDelay;
|
||||
|
||||
cString HandleUnderscores(const char *s);
|
||||
|
||||
class cPicturePlayer;
|
||||
|
||||
class cPictureControl : public cControl {
|
||||
private:
|
||||
static int active;
|
||||
static cString lastDisplayed;
|
||||
cPictureEntry *pictures;
|
||||
const cPictureEntry *pictureEntry;
|
||||
cPicturePlayer *player;
|
||||
cOsd *osd;
|
||||
cString lastPath;
|
||||
cTimeMs slideShowDelay;
|
||||
bool slideShow;
|
||||
bool alwaysDisplayCaption;
|
||||
void NextPicture(int Direction);
|
||||
void NextDirectory(int Direction);
|
||||
void DisplayCaption(void);
|
||||
virtual void Hide(void) {}
|
||||
public:
|
||||
cPictureControl(cPictureEntry *Pictures, const cPictureEntry *PictureEntry, bool SlideShow = false);
|
||||
virtual ~cPictureControl();
|
||||
virtual cString GetHeader(void);
|
||||
virtual eOSState ProcessKey(eKeys Key);
|
||||
static bool Active(void) { return active > 0; }
|
||||
static const char *LastDisplayed(void);
|
||||
};
|
||||
|
||||
#endif //_PLAYER_H
|
@ -1,33 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Klaus Schmidinger <vdr@tvdr.de>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||
"PO-Revision-Date: 2008-01-12 17:41+0100\n"
|
||||
"Last-Translator: Klaus Schmidinger <vdr@tvdr.de>\n"
|
||||
"Language-Team: German <vdr@linuxtv.org>\n"
|
||||
"Language: de\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
msgid "Pictures"
|
||||
msgstr "Bilder"
|
||||
|
||||
msgid "A simple picture viewer"
|
||||
msgstr "Ein einfacher Bildbetrachter"
|
||||
|
||||
msgid "Picture directory"
|
||||
msgstr "Bilder-Verzeichnis"
|
||||
|
||||
msgid "Slide show delay (s)"
|
||||
msgstr "Dia-Schau Wartezeit"
|
||||
|
||||
msgid "No picture directory has been defined!"
|
||||
msgstr "Es wurde kein Bilder-Verzeichnis angegeben!"
|
@ -1,33 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Arthur Konovalov <artlov@gmail.com>, 2015
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||
"PO-Revision-Date: 2008-01-12 17:41+0100\n"
|
||||
"Last-Translator: Arthur Konovalov <artlov@gmail.com>\n"
|
||||
"Language-Team: Estonian <vdr@linuxtv.org>\n"
|
||||
"Language: et\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
msgid "Pictures"
|
||||
msgstr "Pildid"
|
||||
|
||||
msgid "A simple picture viewer"
|
||||
msgstr "Lihtne pildivaatur"
|
||||
|
||||
msgid "Picture directory"
|
||||
msgstr "Pildikaust"
|
||||
|
||||
msgid "Slide show delay (s)"
|
||||
msgstr "Slaidiseanssi viide (s)"
|
||||
|
||||
msgid "No picture directory has been defined!"
|
||||
msgstr "Pildikaust on määramata!"
|
@ -1,33 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||
"PO-Revision-Date: 2008-01-12 17:41+0100\n"
|
||||
"Last-Translator: Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>\n"
|
||||
"Language-Team: Finnish <vdr@linuxtv.org>\n"
|
||||
"Language: fi\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
msgid "Pictures"
|
||||
msgstr "Kuvat"
|
||||
|
||||
msgid "A simple picture viewer"
|
||||
msgstr "Yksinkertainen kuvaselain"
|
||||
|
||||
msgid "Picture directory"
|
||||
msgstr "Kuvahakemisto"
|
||||
|
||||
msgid "Slide show delay (s)"
|
||||
msgstr "Diaesityksen viive (s)"
|
||||
|
||||
msgid "No picture directory has been defined!"
|
||||
msgstr "Kuvahakemistoa ei ole määritelty!"
|
@ -1,33 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Patrice Staudt <patrice.staudt@laposte.net>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||
"PO-Revision-Date: 2008-01-12 17:41+0100\n"
|
||||
"Last-Translator: Patrice Staudt <patrice.staudt@laposte.net>\n"
|
||||
"Language-Team: French <vdr@linuxtv.org>\n"
|
||||
"Language: fr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
msgid "Pictures"
|
||||
msgstr "Images"
|
||||
|
||||
msgid "A simple picture viewer"
|
||||
msgstr "Un simple visualiseur d'images"
|
||||
|
||||
msgid "Picture directory"
|
||||
msgstr "Dossier des images"
|
||||
|
||||
msgid "Slide show delay (s)"
|
||||
msgstr "Pause entre deux images (s)"
|
||||
|
||||
msgid "No picture directory has been defined!"
|
||||
msgstr "Aucun dossier n'est définit!"
|
@ -1,33 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Diego Pierotto <vdr-italian@tiscali.it>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||
"PO-Revision-Date: 2008-01-27 20:22+0100\n"
|
||||
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
|
||||
"Language-Team: Italian <vdr@linuxtv.org>\n"
|
||||
"Language: it\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
msgid "Pictures"
|
||||
msgstr "Immagini"
|
||||
|
||||
msgid "A simple picture viewer"
|
||||
msgstr "Un semplice visualizzatore immagini"
|
||||
|
||||
msgid "Picture directory"
|
||||
msgstr "Directory immagini"
|
||||
|
||||
msgid "Slide show delay (s)"
|
||||
msgstr "Ritardo diapositive (s)"
|
||||
|
||||
msgid "No picture directory has been defined!"
|
||||
msgstr "Nessuna directory immagini impostata!"
|
@ -1,33 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Valdemaras Pipiras <varas@ambernet.lt>, 2009
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||
"PO-Revision-Date: 2009-12-08 12:41+0100\n"
|
||||
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>, 2009\n"
|
||||
"Language-Team: Lithuanian <vdr@linuxtv.org>\n"
|
||||
"Language: lt\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
msgid "Pictures"
|
||||
msgstr "Nuotraukos"
|
||||
|
||||
msgid "A simple picture viewer"
|
||||
msgstr "Paprasta nuotraukų naršyklė"
|
||||
|
||||
msgid "Picture directory"
|
||||
msgstr "Nuotraukų katalogas"
|
||||
|
||||
msgid "Slide show delay (s)"
|
||||
msgstr "Skaidrių peržiūros užlaikymas (s)"
|
||||
|
||||
msgid "No picture directory has been defined!"
|
||||
msgstr "Nenustatytas nuotraukų katalogas!"
|
@ -1,34 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Tomasz Maciej Nowak <tmn505@gmail.com>, 2018
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2018-02-19 00:48+0100\n"
|
||||
"PO-Revision-Date: 2018-02-19 00:53+0100\n"
|
||||
"Last-Translator: Tomasz Maciej Nowak <tmn505@gmail.com>\n"
|
||||
"Language-Team: Polish <vdr@linuxtv.org>\n"
|
||||
"Language: pl_PL\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
"X-Generator: Poedit 2.0.6\n"
|
||||
|
||||
msgid "Pictures"
|
||||
msgstr "Zdjęcia"
|
||||
|
||||
msgid "A simple picture viewer"
|
||||
msgstr "Prosta przeglądarka zdjęć"
|
||||
|
||||
msgid "Picture directory"
|
||||
msgstr "Katalog ze zdjęciami"
|
||||
|
||||
msgid "Slide show delay (s)"
|
||||
msgstr "Pokaz slajdów opóźnienie (s)"
|
||||
|
||||
msgid "No picture directory has been defined!"
|
||||
msgstr "Nie zdefiniowano katalogu ze zdjęciami!"
|
@ -1,34 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Alexander Gross <Bikalexander@gmail.com>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||
"PO-Revision-Date: 2008-03-14 00:45+0100\n"
|
||||
"Last-Translator: Alexander Gross <Bikalexander@gmail.com>\n"
|
||||
"Language-Team: Russian <vdr@linuxtv.org>\n"
|
||||
"Language: ru\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-5\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: KBabel 1.11.4\n"
|
||||
|
||||
msgid "Pictures"
|
||||
msgstr "¸×ÞÑàÐÖÕÝØï"
|
||||
|
||||
msgid "A simple picture viewer"
|
||||
msgstr "¿àÞáâÐï ßàÞÓàÐÜÜÐ ßàÞáÜÞâàÐ Ø×ÞÑàÐÖÕÝØÙ"
|
||||
|
||||
msgid "Picture directory"
|
||||
msgstr "ºÐâÐÛÞÓ Ø×ÞÑàÐÖÕÝØÙ"
|
||||
|
||||
msgid "Slide show delay (s)"
|
||||
msgstr "·ÐÔÕàÖÚÐ áÛÐÙÔ-èÞã (áÕÚ)"
|
||||
|
||||
msgid "No picture directory has been defined!"
|
||||
msgstr "½Õ ÞßàÕÔÕÛñÝ ÚÐâÐÛÞÓ Ø×ÞÑàÐÖÕÝØÙ!"
|
@ -1,32 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Klaus Schmidinger <vdr@tvdr.de>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||
"PO-Revision-Date: 2009-09-30 12:54+0100\n"
|
||||
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
|
||||
"Language-Team: Slovak <vdr@linuxtv.org>\n"
|
||||
"Language: sk\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=iso-8859-2\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "Pictures"
|
||||
msgstr "Obrázky"
|
||||
|
||||
msgid "A simple picture viewer"
|
||||
msgstr "Jednoduchý prehliadaè obrázkov"
|
||||
|
||||
msgid "Picture directory"
|
||||
msgstr "Umiestnenie obrázkov"
|
||||
|
||||
msgid "Slide show delay (s)"
|
||||
msgstr "Oneskorenie prezentácia (s)"
|
||||
|
||||
msgid "No picture directory has been defined!"
|
||||
msgstr "Neboli preukázané ¾iadne fotky v adresári!"
|
@ -4,36 +4,3 @@ VDR Plugin 'servicedemo' Revision History
|
||||
2005-08-21: Version 0.1.1
|
||||
|
||||
- Initial revision.
|
||||
|
||||
2007-08-15: Version 0.1.2
|
||||
|
||||
- Moved the "all" target in the Makefile before the "Implicit rules",
|
||||
so that a plain "make" will compile everything.
|
||||
|
||||
2012-12-27: Version 0.1.3
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-01-12: Version 0.1.4
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-03-31: Version 2.0.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2014-01-01: Version 2.1.1
|
||||
|
||||
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
||||
|
||||
2015-02-19: Version 2.2.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2018-04-15: Version 2.4.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2021-12-27: Version 2.6.0
|
||||
|
||||
- Official release.
|
||||
|
@ -1,12 +1,13 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||
# $Id: Makefile 1.8 2006/09/09 12:38:35 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
# By default the main source file also carries this name.
|
||||
|
||||
#
|
||||
PLUGIN = servicedemo # dummy name for Make.config
|
||||
PLUGIN1 = svccli
|
||||
PLUGIN2 = svcsvr
|
||||
|
||||
@ -14,28 +15,24 @@ PLUGIN2 = svcsvr
|
||||
|
||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN1).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||
|
||||
### The C++ compiler and options:
|
||||
|
||||
CXX ?= g++
|
||||
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual
|
||||
|
||||
### The directory environment:
|
||||
|
||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||
PKG_CONFIG ?= pkg-config
|
||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
||||
LIBDIR = $(call PKGCFG,libdir)
|
||||
PLGCFG = $(call PKGCFG,plgcfg)
|
||||
#
|
||||
TMPDIR ?= /tmp
|
||||
|
||||
### The compiler options:
|
||||
|
||||
export CFLAGS = $(call PKGCFG,cflags)
|
||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
||||
|
||||
### The version number of VDR's plugin API:
|
||||
|
||||
APIVERSION = $(call PKGCFG,apiversion)
|
||||
VDRDIR = ../../..
|
||||
LIBDIR = ../../lib
|
||||
TMPDIR = /tmp
|
||||
|
||||
### Allow user defined options to overwrite defaults:
|
||||
|
||||
-include $(PLGCFG)
|
||||
-include $(VDRDIR)/Make.config
|
||||
|
||||
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||
|
||||
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||
|
||||
### The name of the distribution archive:
|
||||
|
||||
@ -44,48 +41,39 @@ PACKAGE = vdr-$(ARCHIVE)
|
||||
|
||||
### Includes and Defines (add further entries here):
|
||||
|
||||
INCLUDES +=
|
||||
INCLUDES += -I$(VDRDIR)/include
|
||||
|
||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
|
||||
### The object files (add further files here):
|
||||
|
||||
OBJS = $(PLUGIN1).o $(PLUGIN2).o
|
||||
|
||||
### The main target:
|
||||
|
||||
all: libvdr-$(PLUGIN1).so libvdr-$(PLUGIN2).so
|
||||
|
||||
### Implicit rules:
|
||||
|
||||
%.o: %.c
|
||||
@echo CC $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||
|
||||
### Dependencies:
|
||||
# Dependencies:
|
||||
|
||||
MAKEDEP = $(CXX) -MM -MG
|
||||
MAKEDEP = g++ -MM -MG
|
||||
DEPFILE = .dependencies
|
||||
$(DEPFILE): Makefile
|
||||
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
|
||||
-include $(DEPFILE)
|
||||
|
||||
### Targets:
|
||||
|
||||
all: libvdr-$(PLUGIN1).so libvdr-$(PLUGIN2).so
|
||||
|
||||
libvdr-$(PLUGIN1).so: $(PLUGIN1).o
|
||||
@echo LD $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(PLUGIN1).o -o $@
|
||||
$(CXX) $(CXXFLAGS) -shared $(PLUGIN1).o -o $@
|
||||
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||
|
||||
libvdr-$(PLUGIN2).so: $(PLUGIN2).o
|
||||
@echo LD $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(PLUGIN2).o -o $@
|
||||
|
||||
install-lib: libvdr-$(PLUGIN1).so libvdr-$(PLUGIN2).so
|
||||
install -D libvdr-$(PLUGIN1).so $(DESTDIR)$(LIBDIR)/libvdr-$(PLUGIN1).so.$(APIVERSION)
|
||||
install -D libvdr-$(PLUGIN2).so $(DESTDIR)$(LIBDIR)/libvdr-$(PLUGIN2).so.$(APIVERSION)
|
||||
|
||||
install: install-lib
|
||||
$(CXX) $(CXXFLAGS) -shared $(PLUGIN2).o -o $@
|
||||
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||
|
||||
dist: clean
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
|
@ -2,15 +2,11 @@ This is a "plugin" for the Video Disk Recorder (VDR).
|
||||
|
||||
Written by: Udo Richter <udo_richter@gmx.de>
|
||||
|
||||
Project's homepage: https://www.tvdr.de
|
||||
Project's homepage: www.cadsoft.de/vdr
|
||||
|
||||
Latest version available at: https://www.tvdr.de
|
||||
Latest version available at: www.cadsoft.de/vdr
|
||||
|
||||
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.
|
||||
See the file COPYING for more information.
|
||||
See the file COPYING for license information.
|
||||
|
||||
Description:
|
||||
|
||||
|
@ -3,14 +3,14 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: svccli.c 4.1 2018/04/10 13:00:53 kls Exp $
|
||||
* $Id: svccli.c 1.1 2005/08/21 10:44:29 kls Exp $
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <vdr/interface.h>
|
||||
#include <vdr/plugin.h>
|
||||
|
||||
static const char *VERSION = "2.4.0";
|
||||
static const char *VERSION = "0.1.1";
|
||||
static const char *DESCRIPTION = "Service demo client";
|
||||
static const char *MAINMENUENTRY = "Service demo";
|
||||
|
||||
@ -32,7 +32,7 @@ struct AddService_v1_0 {
|
||||
int sum;
|
||||
};
|
||||
|
||||
// --- cPluginSvcCli ---------------------------------------------------------
|
||||
// --- cPluginSvcCli ----------------------------------------------------------
|
||||
|
||||
cOsdObject *cPluginSvcCli::MainMenuAction(void)
|
||||
{
|
||||
|
@ -3,14 +3,14 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: svcsvr.c 4.1 2018/04/10 13:00:57 kls Exp $
|
||||
* $Id: svcsvr.c 1.1 2005/08/21 10:44:24 kls Exp $
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <vdr/interface.h>
|
||||
#include <vdr/plugin.h>
|
||||
|
||||
static const char *VERSION = "2.4.0";
|
||||
static const char *VERSION = "0.1.1";
|
||||
static const char *DESCRIPTION = "Service demo server";
|
||||
|
||||
class cPluginSvcSvr : public cPlugin {
|
||||
@ -29,7 +29,7 @@ struct AddService_v1_0 {
|
||||
int sum;
|
||||
};
|
||||
|
||||
// --- cPluginSvcSvr ---------------------------------------------------------
|
||||
// --- cPluginSvcSvr ----------------------------------------------------------
|
||||
|
||||
bool cPluginSvcSvr::Service(const char *Id, void *Data)
|
||||
{
|
||||
|
@ -39,125 +39,3 @@ VDR Plugin 'skincurses' Revision History
|
||||
2006-09-10: Version 0.0.8
|
||||
|
||||
- The size of the OSD is now adjusted to the size of the console window.
|
||||
|
||||
2007-06-15: Version 0.1.0
|
||||
|
||||
- Implemented UTF-8 handling.
|
||||
|
||||
2007-06-23: Version 0.1.1
|
||||
|
||||
- Fixed a name clash with the new cOsd position functions.
|
||||
|
||||
2007-07-20: Version 0.1.2
|
||||
|
||||
- Fixed clearing color buttons.
|
||||
|
||||
2007-08-15: Version 0.1.3
|
||||
|
||||
- Moved the "all" target in the Makefile before the "Implicit rules",
|
||||
so that a plain "make" will compile everything.
|
||||
- Added internationalization.
|
||||
|
||||
2007-08-26: Version 0.1.4
|
||||
|
||||
- Adapted to the new Level parameter of cOsd.
|
||||
|
||||
2008-01-19:
|
||||
|
||||
- Updated the Makefile of the skincurses plugin (thanks to Rolf Ahrenberg).
|
||||
|
||||
2008-02-15: Version 0.1.5
|
||||
|
||||
- Using cString::sprintf() instead of asprintf().
|
||||
- Implemented cSkinCursesDisplayMenu::SetScrollbar().
|
||||
|
||||
2008-02-23: Version 0.1.6
|
||||
|
||||
- Revised the fix of calculating the scrollbar height in the skins. The scrollbar
|
||||
handle now always has a height that is at least the width of the scrollbar.
|
||||
|
||||
2008-03-14: Version 0.1.7
|
||||
|
||||
- Added Russian translations (thanks to Alexander Gross).
|
||||
|
||||
2010-01-03: Version 0.1.8
|
||||
|
||||
- Displaying "genre" in event descriptions.
|
||||
- Displaying "parental rating" in event descriptions.
|
||||
|
||||
2010-02-28: Version 0.1.9
|
||||
|
||||
- Added Lithuanian language translations (thanks to Valdemaras Pipiras).
|
||||
|
||||
2011-05-15: Version 0.1.10
|
||||
|
||||
- Avoiding a gcc 4.6 compiler error (thanks to Tobias Grimm).
|
||||
|
||||
2012-03-11: Version 0.1.11
|
||||
|
||||
- Adapted menu column widths of 'skincurses' to the wider HD OSD sizes.
|
||||
|
||||
2012-04-23: Version 0.1.12
|
||||
|
||||
- Now displaying disk usage in the title of the main and "Recordings" menu,
|
||||
which is no longer done by the VDR core.
|
||||
|
||||
2012-12-27: Version 0.1.13
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-01-12: Version 0.1.14
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-03-03: Version 0.1.15
|
||||
|
||||
- The "Recording info" page now displays the name of the channel (if available)
|
||||
from which this recording was taken.
|
||||
|
||||
2013-03-31: Version 2.0.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2014-01-01: Version 2.1.1
|
||||
|
||||
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
||||
|
||||
2015-02-08: Version 2.1.2
|
||||
|
||||
- Added a missing trailing blank in some translations.
|
||||
|
||||
2015-02-19: Version 2.2.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2016-12-22: Version 2.3.2
|
||||
|
||||
- Added cFont::Width(void) to get the default character width and allow stretched
|
||||
font drawing in high level OSDs (dummy for skincurses).
|
||||
- Fixed truncated date/time strings in the skins on multi-byte UTF-8 systems
|
||||
(reported by Sergey Chernyavskiy).
|
||||
|
||||
2018-04-15: Version 2.4.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2019-03-12: Version 2.4.1
|
||||
|
||||
- Changes for ncurses version 6 (thanks to Ulrick Eckhardt).
|
||||
|
||||
2020-05-11: Version 2.4.2
|
||||
|
||||
- Fixed 'Changes for ncurses version 6'.
|
||||
- Reacting to changes in screen size.
|
||||
- Simplified color handling.
|
||||
- Using 'stdscr' directly instead of an additional window.
|
||||
|
||||
2021-07-01: Version 2.4.3
|
||||
|
||||
- The number of errors (if any) of a recording is now displayed in the recording's
|
||||
Info menu.
|
||||
|
||||
2021-12-27: Version 2.6.0
|
||||
|
||||
- Official release.
|
||||
|
@ -1,121 +1,75 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||
# $Id: Makefile 1.7 2006/09/09 12:38:35 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
# By default the main source file also carries this name.
|
||||
|
||||
#
|
||||
PLUGIN = skincurses
|
||||
|
||||
### The version number of this plugin (taken from the main source file):
|
||||
|
||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||
|
||||
### The C++ compiler and options:
|
||||
|
||||
CXX ?= g++
|
||||
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual
|
||||
|
||||
### The directory environment:
|
||||
|
||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||
PKG_CONFIG ?= pkg-config
|
||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
||||
LIBDIR = $(call PKGCFG,libdir)
|
||||
LOCDIR = $(call PKGCFG,locdir)
|
||||
PLGCFG = $(call PKGCFG,plgcfg)
|
||||
#
|
||||
TMPDIR ?= /tmp
|
||||
|
||||
### The compiler options:
|
||||
|
||||
export CFLAGS = $(call PKGCFG,cflags)
|
||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
||||
|
||||
### The version number of VDR's plugin API:
|
||||
|
||||
APIVERSION = $(call PKGCFG,apiversion)
|
||||
VDRDIR = ../../..
|
||||
LIBDIR = ../../lib
|
||||
TMPDIR = /tmp
|
||||
|
||||
### Allow user defined options to overwrite defaults:
|
||||
|
||||
-include $(PLGCFG)
|
||||
-include $(VDRDIR)/Make.config
|
||||
|
||||
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||
|
||||
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||
|
||||
### The name of the distribution archive:
|
||||
|
||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||
PACKAGE = vdr-$(ARCHIVE)
|
||||
|
||||
### The name of the shared object file:
|
||||
|
||||
SOFILE = libvdr-$(PLUGIN).so
|
||||
|
||||
### Includes and Defines (add further entries here):
|
||||
|
||||
INCLUDES +=
|
||||
INCLUDES += -I$(VDRDIR)/include
|
||||
|
||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
|
||||
### The object files (add further files here):
|
||||
|
||||
OBJS = $(PLUGIN).o
|
||||
|
||||
### The main target:
|
||||
|
||||
all: $(SOFILE) i18n
|
||||
|
||||
### Implicit rules:
|
||||
|
||||
%.o: %.c
|
||||
@echo CC $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||
|
||||
### Dependencies:
|
||||
# Dependencies:
|
||||
|
||||
MAKEDEP = $(CXX) -MM -MG
|
||||
MAKEDEP = g++ -MM -MG
|
||||
DEPFILE = .dependencies
|
||||
$(DEPFILE): Makefile
|
||||
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
|
||||
-include $(DEPFILE)
|
||||
|
||||
### Internationalization (I18N):
|
||||
|
||||
PODIR = po
|
||||
I18Npo = $(wildcard $(PODIR)/*.po)
|
||||
I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
|
||||
I18Nmsgs = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
|
||||
I18Npot = $(PODIR)/$(PLUGIN).pot
|
||||
|
||||
%.mo: %.po
|
||||
@echo MO $@
|
||||
$(Q)msgfmt -c -o $@ $<
|
||||
|
||||
$(I18Npot): $(wildcard *.c)
|
||||
@echo GT $@
|
||||
$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
|
||||
|
||||
%.po: $(I18Npot)
|
||||
@echo PO $@
|
||||
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
|
||||
@touch $@
|
||||
|
||||
$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
|
||||
install -D -m644 $< $@
|
||||
|
||||
.PHONY: i18n
|
||||
i18n: $(I18Nmo) $(I18Npot)
|
||||
|
||||
install-i18n: $(I18Nmsgs)
|
||||
|
||||
### Targets:
|
||||
|
||||
$(SOFILE): $(OBJS)
|
||||
@echo LD $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -lncursesw -o $@
|
||||
all: libvdr-$(PLUGIN).so
|
||||
|
||||
install-lib: $(SOFILE)
|
||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
||||
libvdr-$(PLUGIN).so: $(OBJS)
|
||||
$(CXX) $(CXXFLAGS) -shared $(OBJS) -lncurses -o $@
|
||||
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||
|
||||
install: install-lib install-i18n
|
||||
|
||||
dist: $(I18Npo) clean
|
||||
dist: clean
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
||||
@ -124,5 +78,4 @@ dist: $(I18Npo) clean
|
||||
@echo Distribution package created as $(PACKAGE).tgz
|
||||
|
||||
clean:
|
||||
@-rm -f $(PODIR)/*.mo $(PODIR)/*.pot
|
||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
||||
|
@ -1,16 +1,12 @@
|
||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||
|
||||
Written by: Klaus Schmidinger <vdr@tvdr.de>
|
||||
Written by: Klaus Schmidinger <kls@cadsoft.de>
|
||||
|
||||
Project's homepage: https://www.tvdr.de
|
||||
Project's homepage: www.cadsoft.de/vdr
|
||||
|
||||
Latest version available at: https://www.tvdr.de
|
||||
Latest version available at: www.cadsoft.de/vdr
|
||||
|
||||
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.
|
||||
See the file COPYING for more information.
|
||||
See the file COPYING for license information.
|
||||
|
||||
Description:
|
||||
|
||||
|
@ -1,33 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Klaus Schmidinger <vdr@tvdr.de>, 2007
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||
"PO-Revision-Date: 2007-08-15 16:07+0200\n"
|
||||
"Last-Translator: Klaus Schmidinger <vdr@tvdr.de>\n"
|
||||
"Language-Team: German <vdr@linuxtv.org>\n"
|
||||
"Language: de\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A text only skin"
|
||||
msgstr "Eine reine Text-Oberfläche"
|
||||
|
||||
msgid "errors"
|
||||
msgstr "Fehler"
|
||||
|
||||
msgid "Key$Mute"
|
||||
msgstr "Stumm"
|
||||
|
||||
#. TRANSLATORS: note the trailing blank!
|
||||
msgid "Volume "
|
||||
msgstr "Lautstärke "
|
||||
|
||||
msgid "Text mode"
|
||||
msgstr "Text-Modus"
|
@ -1,33 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Arthur Konovalov <artlov@gmail.com>, 2015
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||
"PO-Revision-Date: 2007-08-14 20:48+0300\n"
|
||||
"Last-Translator: Arthur Konovalov <artlov@gmail.com>\n"
|
||||
"Language-Team: Estonian <vdr@linuxtv.org>\n"
|
||||
"Language: et\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A text only skin"
|
||||
msgstr "Tekstipõhine kest"
|
||||
|
||||
msgid "errors"
|
||||
msgstr ""
|
||||
|
||||
msgid "Key$Mute"
|
||||
msgstr "Hääletu"
|
||||
|
||||
#. TRANSLATORS: note the trailing blank!
|
||||
msgid "Volume "
|
||||
msgstr "Helitugevus "
|
||||
|
||||
msgid "Text mode"
|
||||
msgstr "Tekst"
|
@ -1,33 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>, 2007
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||
"PO-Revision-Date: 2007-08-14 20:48+0300\n"
|
||||
"Last-Translator: Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>\n"
|
||||
"Language-Team: Finnish <vdr@linuxtv.org>\n"
|
||||
"Language: fi\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A text only skin"
|
||||
msgstr "Tekstipohjainen ulkoasu"
|
||||
|
||||
msgid "errors"
|
||||
msgstr ""
|
||||
|
||||
msgid "Key$Mute"
|
||||
msgstr "Mykistys"
|
||||
|
||||
#. TRANSLATORS: note the trailing blank!
|
||||
msgid "Volume "
|
||||
msgstr "Äänenvoimakkuus "
|
||||
|
||||
msgid "Text mode"
|
||||
msgstr "Teksti"
|
@ -1,33 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Diego Pierotto <vdr-italian@tiscali.it>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||
"PO-Revision-Date: 2008-01-27 20:35+0100\n"
|
||||
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
|
||||
"Language-Team: Italian <vdr@linuxtv.org>\n"
|
||||
"Language: it\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A text only skin"
|
||||
msgstr "Una interfaccia solo testo"
|
||||
|
||||
msgid "errors"
|
||||
msgstr ""
|
||||
|
||||
msgid "Key$Mute"
|
||||
msgstr "Muto"
|
||||
|
||||
#. TRANSLATORS: note the trailing blank!
|
||||
msgid "Volume "
|
||||
msgstr "Volume "
|
||||
|
||||
msgid "Text mode"
|
||||
msgstr "Modalità testo"
|
@ -1,33 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Valdemaras Pipiras <varas@ambernet.lt>, 2010
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||
"PO-Revision-Date: 2010-02-22 18:18+0200\n"
|
||||
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n"
|
||||
"Language-Team: Lithuanian <vdr@linuxtv.org>\n"
|
||||
"Language: lt\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A text only skin"
|
||||
msgstr "Tekstinis apvalkalas"
|
||||
|
||||
msgid "errors"
|
||||
msgstr ""
|
||||
|
||||
msgid "Key$Mute"
|
||||
msgstr "Išjungti garsą"
|
||||
|
||||
#. TRANSLATORS: note the trailing blank!
|
||||
msgid "Volume "
|
||||
msgstr "Garsas "
|
||||
|
||||
msgid "Text mode"
|
||||
msgstr "Tekstinis ręžimas"
|
@ -1,35 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Tomasz Maciej Nowak <tmn505@gmail.com>, 2018
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||
"PO-Revision-Date: 2018-02-19 01:02+0100\n"
|
||||
"Last-Translator: Tomasz Maciej Nowak <tmn505@gmail.com>\n"
|
||||
"Language-Team: Polish <vdr@linuxtv.org>\n"
|
||||
"Language: pl_PL\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
"X-Generator: Poedit 2.0.6\n"
|
||||
|
||||
msgid "A text only skin"
|
||||
msgstr "Skóra tekstowa"
|
||||
|
||||
msgid "errors"
|
||||
msgstr ""
|
||||
|
||||
msgid "Key$Mute"
|
||||
msgstr "Wycisz"
|
||||
|
||||
#. TRANSLATORS: note the trailing blank!
|
||||
msgid "Volume "
|
||||
msgstr "Głośność "
|
||||
|
||||
msgid "Text mode"
|
||||
msgstr "Tryb tekstowy"
|
@ -1,34 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Alexander Gross <Bikalexander@gmail.com>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||
"PO-Revision-Date: 2008-03-14 00:21+0100\n"
|
||||
"Last-Translator: Alexander Gross <Bikalexander@gmail.com>\n"
|
||||
"Language-Team: Russian <vdr@linuxtv.org>\n"
|
||||
"Language: ru\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-5\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: KBabel 1.11.4\n"
|
||||
|
||||
msgid "A text only skin"
|
||||
msgstr "¿àÞáâÞ âÕÚáâÞÒëÙ ØÝâÕàäÕÙá"
|
||||
|
||||
msgid "errors"
|
||||
msgstr ""
|
||||
|
||||
msgid "Key$Mute"
|
||||
msgstr "²ëÚÛ. ÓàÞÜÚÞáâì"
|
||||
|
||||
#. TRANSLATORS: note the trailing blank!
|
||||
msgid "Volume "
|
||||
msgstr "³àÞÜÚÞáâì "
|
||||
|
||||
msgid "Text mode"
|
||||
msgstr "ÀÕÖØÜ âÕÚáâÐ"
|
@ -1,33 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Klaus Schmidinger <vdr@tvdr.de>, 2007
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||
"PO-Revision-Date: 2009-09-30 12:52+0100\n"
|
||||
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
|
||||
"Language-Team: Slovak <vdr@linuxtv.org>\n"
|
||||
"Language: sk\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=iso-8859-2\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A text only skin"
|
||||
msgstr "Iba text vzhµadu"
|
||||
|
||||
msgid "errors"
|
||||
msgstr ""
|
||||
|
||||
msgid "Key$Mute"
|
||||
msgstr "Stlmi» zvuk"
|
||||
|
||||
#. TRANSLATORS: note the trailing blank!
|
||||
msgid "Volume "
|
||||
msgstr "Hlasitos» "
|
||||
|
||||
msgid "Text mode"
|
||||
msgstr "Textový re¾im"
|
@ -3,32 +3,31 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: skincurses.c 5.1 2021/07/01 15:40:46 kls Exp $
|
||||
* $Id: skincurses.c 1.11 2006/09/10 14:23:55 kls Exp $
|
||||
*/
|
||||
|
||||
#include <ncurses.h>
|
||||
#include <vdr/osd.h>
|
||||
#include <vdr/plugin.h>
|
||||
#include <vdr/skins.h>
|
||||
#include <vdr/videodir.h>
|
||||
|
||||
static const char *VERSION = "2.4.3";
|
||||
static const char *DESCRIPTION = trNOOP("A text only skin");
|
||||
static const char *VERSION = "0.0.8";
|
||||
static const char *DESCRIPTION = "A text only skin";
|
||||
static const char *MAINMENUENTRY = NULL;
|
||||
|
||||
// --- cCursesFont -----------------------------------------------------------
|
||||
|
||||
class cCursesFont : public cFont {
|
||||
public:
|
||||
virtual int Width(void) const { return 1; }
|
||||
virtual int Width(uint c) const { return 1; }
|
||||
virtual int Width(const char *s) const { return s ? Utf8StrLen(s) : 0; }
|
||||
cCursesFont(void): cFont(NULL) {}
|
||||
virtual int Width(unsigned char c) const { return 1; }
|
||||
virtual int Width(const char *s) const { return s ? strlen(s) : 0; }
|
||||
virtual int Height(unsigned char c) const { return 1; }
|
||||
virtual int Height(const char *s) const { return 1; }
|
||||
virtual int Height(void) const { return 1; }
|
||||
virtual void DrawText(cBitmap *Bitmap, int x, int y, const char *s, tColor ColorFg, tColor ColorBg, int Width) const {}
|
||||
virtual void DrawText(cPixmap *Pixmap, int x, int y, const char *s, tColor ColorFg, tColor ColorBg, int Width) const {}
|
||||
};
|
||||
|
||||
static const cCursesFont Font = cCursesFont(); // w/o the '= cCursesFont()' gcc 4.6 complains - can anybody explain why this is necessary?
|
||||
static const cCursesFont Font;
|
||||
|
||||
// --- cCursesOsd ------------------------------------------------------------
|
||||
|
||||
@ -54,13 +53,15 @@ static int clrMessage[] = {
|
||||
clrRed
|
||||
};
|
||||
|
||||
static int ScOsdWidth = 50;
|
||||
static int ScOsdHeight = 20;
|
||||
static int OsdWidth = 50;
|
||||
static int OsdHeight = 20;
|
||||
|
||||
class cCursesOsd : public cOsd {
|
||||
private:
|
||||
WINDOW *savedRegion;
|
||||
cVector<int> colorPairs;
|
||||
WINDOW *window;
|
||||
enum { MaxColorPairs = 16 };
|
||||
int colorPairs[MaxColorPairs];
|
||||
void SetColor(int colorFg, int colorBg = clrBackground);
|
||||
public:
|
||||
cCursesOsd(int Left, int Top);
|
||||
@ -73,38 +74,44 @@ public:
|
||||
};
|
||||
|
||||
cCursesOsd::cCursesOsd(int Left, int Top)
|
||||
:cOsd(Left, Top, 0)
|
||||
:cOsd(Left, Top)
|
||||
{
|
||||
savedRegion = NULL;
|
||||
|
||||
memset(colorPairs, 0x00, sizeof(colorPairs));
|
||||
start_color();
|
||||
leaveok(stdscr, true);
|
||||
refresh(); // to react on changes to screen size
|
||||
|
||||
int begy, begx;
|
||||
int maxy, maxx;
|
||||
getmaxyx(stdscr, maxy, maxx);
|
||||
getbegyx(stdscr, begy, begx);
|
||||
ScOsdWidth = maxx - begx;
|
||||
ScOsdHeight = maxy - begy;
|
||||
window = subwin(stdscr, OsdHeight, OsdWidth, 0, 0);
|
||||
syncok(window, true);
|
||||
}
|
||||
|
||||
cCursesOsd::~cCursesOsd()
|
||||
{
|
||||
erase();
|
||||
if (window) {
|
||||
werase(window);
|
||||
Flush();
|
||||
delwin(window);
|
||||
window = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void cCursesOsd::SetColor(int colorFg, int colorBg)
|
||||
{
|
||||
int color = (colorBg << 16) | colorFg | 0x80000000;
|
||||
int i = colorPairs.IndexOf(color);
|
||||
if (i < 0) {
|
||||
colorPairs.Append(color);
|
||||
i = colorPairs.Size() - 1;
|
||||
for (int i = 0; i < MaxColorPairs; i++) {
|
||||
if (!colorPairs[i]) {
|
||||
colorPairs[i] = color;
|
||||
init_pair(i + 1, colorFg, colorBg);
|
||||
//XXX??? attron(COLOR_PAIR(WHITE_ON_BLUE));
|
||||
wattrset(window, COLOR_PAIR(i + 1));
|
||||
break;
|
||||
}
|
||||
else if (color == colorPairs[i]) {
|
||||
wattrset(window, COLOR_PAIR(i + 1));
|
||||
break;
|
||||
}
|
||||
}
|
||||
attrset(COLOR_PAIR(i + 1));
|
||||
}
|
||||
|
||||
void cCursesOsd::SaveRegion(int x1, int y1, int x2, int y2)
|
||||
@ -114,14 +121,13 @@ void cCursesOsd::SaveRegion(int x1, int y1, int x2, int y2)
|
||||
savedRegion = NULL;
|
||||
}
|
||||
savedRegion = newwin(y2 - y1 + 1, x2 - x1 + 1, y1, x1);
|
||||
if (savedRegion)
|
||||
copywin(stdscr, savedRegion, y1, x1, 0, 0, y2 - y1, x2 - x1, false);
|
||||
copywin(window, savedRegion, y1, x1, 0, 0, y2 - y1, x2 - x1, false);
|
||||
}
|
||||
|
||||
void cCursesOsd::RestoreRegion(void)
|
||||
{
|
||||
if (savedRegion) {
|
||||
overwrite(savedRegion, stdscr);
|
||||
copywin(savedRegion, window, 0, 0, savedRegion->_begy, savedRegion->_begx, savedRegion->_maxy - savedRegion->_begy, savedRegion->_maxx - savedRegion->_begx, false);
|
||||
delwin(savedRegion);
|
||||
savedRegion = NULL;
|
||||
}
|
||||
@ -161,22 +167,18 @@ void cCursesOsd::DrawText(int x, int y, const char *s, tColor ColorFg, tColor Co
|
||||
}
|
||||
}
|
||||
SetColor(ColorFg, ColorBg);
|
||||
mvaddnstr(y, x, s, Width ? Width : ScOsdWidth - x);
|
||||
wmove(window, y, x); // ncurses wants 'y' before 'x'!
|
||||
waddnstr(window, s, OsdWidth - x);
|
||||
}
|
||||
|
||||
void cCursesOsd::DrawRectangle(int x1, int y1, int x2, int y2, tColor Color)
|
||||
{
|
||||
SetColor(Color, Color);
|
||||
int dx = x2 - x1;
|
||||
int dy = y2 - y1;
|
||||
if (dx >= dy) {
|
||||
for (int y = y1; y <= y2; y++)
|
||||
mvhline(y, x1, ' ', dx + 1);
|
||||
}
|
||||
else {
|
||||
for (int x = x1; x <= x2; x++)
|
||||
mvvline(y1, x, ' ', dy + 1);
|
||||
for (int y = y1; y <= y2; y++) {
|
||||
wmove(window, y, x1); // ncurses wants 'y' before 'x'!
|
||||
whline(window, ' ', x2 - x1 + 1);
|
||||
}
|
||||
wsyncup(window); // shouldn't be necessary because of 'syncok()', but w/o it doesn't work
|
||||
}
|
||||
|
||||
void cCursesOsd::Flush(void)
|
||||
@ -204,9 +206,9 @@ cSkinCursesDisplayChannel::cSkinCursesDisplayChannel(bool WithInfo)
|
||||
{
|
||||
int Lines = WithInfo ? 5 : 1;
|
||||
message = false;
|
||||
osd = new cCursesOsd(0, Setup.ChannelInfoPos ? 0 : ScOsdHeight - Lines);
|
||||
osd = new cCursesOsd(0, Setup.ChannelInfoPos ? 0 : OsdHeight - Lines);
|
||||
timeWidth = strlen("00:00");
|
||||
osd->DrawRectangle(0, 0, ScOsdWidth - 1, Lines - 1, clrBackground);
|
||||
osd->DrawRectangle(0, 0, OsdWidth - 1, Lines - 1, clrBackground);
|
||||
}
|
||||
|
||||
cSkinCursesDisplayChannel::~cSkinCursesDisplayChannel()
|
||||
@ -216,14 +218,14 @@ cSkinCursesDisplayChannel::~cSkinCursesDisplayChannel()
|
||||
|
||||
void cSkinCursesDisplayChannel::SetChannel(const cChannel *Channel, int Number)
|
||||
{
|
||||
osd->DrawRectangle(0, 0, ScOsdWidth - 1, 0, clrBackground);
|
||||
osd->DrawRectangle(0, 0, OsdWidth - 1, 0, clrBackground);
|
||||
osd->DrawText(0, 0, ChannelString(Channel, Number), clrWhite, clrBackground, &Font);
|
||||
}
|
||||
|
||||
void cSkinCursesDisplayChannel::SetEvents(const cEvent *Present, const cEvent *Following)
|
||||
{
|
||||
osd->DrawRectangle(0, 1, timeWidth - 1, 4, clrRed);
|
||||
osd->DrawRectangle(timeWidth, 1, ScOsdWidth - 1, 4, clrBackground);
|
||||
osd->DrawRectangle(timeWidth, 1, OsdWidth - 1, 4, clrBackground);
|
||||
for (int i = 0; i < 2; i++) {
|
||||
const cEvent *e = !i ? Present : Following;
|
||||
if (e) {
|
||||
@ -237,8 +239,8 @@ void cSkinCursesDisplayChannel::SetEvents(const cEvent *Present, const cEvent *F
|
||||
void cSkinCursesDisplayChannel::SetMessage(eMessageType Type, const char *Text)
|
||||
{
|
||||
if (Text) {
|
||||
osd->SaveRegion(0, 0, ScOsdWidth - 1, 0);
|
||||
osd->DrawText(0, 0, Text, clrMessage[2 * Type], clrMessage[2 * Type + 1], &Font, ScOsdWidth, 0, taCenter);
|
||||
osd->SaveRegion(0, 0, OsdWidth - 1, 0);
|
||||
osd->DrawText(0, 0, Text, clrMessage[2 * Type], clrMessage[2 * Type + 1], &Font, OsdWidth, 0, taCenter);
|
||||
message = true;
|
||||
}
|
||||
else {
|
||||
@ -251,7 +253,7 @@ void cSkinCursesDisplayChannel::Flush(void)
|
||||
{
|
||||
if (!message) {
|
||||
cString date = DayDateTime();
|
||||
osd->DrawText(ScOsdWidth - Utf8StrLen(date), 0, date, clrWhite, clrBackground, &Font);
|
||||
osd->DrawText(OsdWidth - strlen(date), 0, date, clrWhite, clrBackground, &Font);
|
||||
}
|
||||
osd->Flush();
|
||||
}
|
||||
@ -261,11 +263,7 @@ void cSkinCursesDisplayChannel::Flush(void)
|
||||
class cSkinCursesDisplayMenu : public cSkinDisplayMenu {
|
||||
private:
|
||||
cOsd *osd;
|
||||
cString title;
|
||||
int lastDiskUsageState;
|
||||
void DrawTitle(void);
|
||||
void DrawScrollbar(int Total, int Offset, int Shown, int Top, int Height, bool CanScrollUp, bool CanScrollDown);
|
||||
void SetTextScrollbar(void);
|
||||
void SetScrollbar(void);
|
||||
public:
|
||||
cSkinCursesDisplayMenu(void);
|
||||
virtual ~cSkinCursesDisplayMenu();
|
||||
@ -276,7 +274,6 @@ public:
|
||||
virtual void SetButtons(const char *Red, const char *Green = NULL, const char *Yellow = NULL, const char *Blue = NULL);
|
||||
virtual void SetMessage(eMessageType Type, const char *Text);
|
||||
virtual void SetItem(const char *Text, int Index, bool Current, bool Selectable);
|
||||
virtual void SetScrollbar(int Total, int Offset);
|
||||
virtual void SetEvent(const cEvent *Event);
|
||||
virtual void SetRecording(const cRecording *Recording);
|
||||
virtual void SetText(const char *Text, bool FixedFont);
|
||||
@ -287,8 +284,7 @@ public:
|
||||
cSkinCursesDisplayMenu::cSkinCursesDisplayMenu(void)
|
||||
{
|
||||
osd = new cCursesOsd(0, 0);
|
||||
lastDiskUsageState = -1;
|
||||
osd->DrawRectangle(0, 0, ScOsdWidth - 1, ScOsdHeight - 1, clrBackground);
|
||||
osd->DrawRectangle(0, 0, OsdWidth - 1, OsdHeight - 1, clrBackground);
|
||||
}
|
||||
|
||||
cSkinCursesDisplayMenu::~cSkinCursesDisplayMenu()
|
||||
@ -296,66 +292,52 @@ cSkinCursesDisplayMenu::~cSkinCursesDisplayMenu()
|
||||
delete osd;
|
||||
}
|
||||
|
||||
void cSkinCursesDisplayMenu::DrawScrollbar(int Total, int Offset, int Shown, int Top, int Height, bool CanScrollUp, bool CanScrollDown)
|
||||
void cSkinCursesDisplayMenu::SetScrollbar(void)
|
||||
{
|
||||
if (Total > 0 && Total > Shown) {
|
||||
int yt = Top;
|
||||
int yb = yt + Height;
|
||||
if (textScroller.CanScroll()) {
|
||||
int yt = textScroller.Top();
|
||||
int yb = yt + textScroller.Height() - 1;
|
||||
int st = yt;
|
||||
int sb = yb;
|
||||
int th = max(int((sb - st) * double(Shown) / Total + 0.5), 1);
|
||||
int tt = min(int(st + (sb - st) * double(Offset) / Total + 0.5), sb - th);
|
||||
int tb = min(tt + th, sb);
|
||||
int xl = ScOsdWidth - 1;
|
||||
osd->DrawRectangle(xl, st, xl, sb - 1, clrWhite);
|
||||
osd->DrawRectangle(xl, tt, xl, tb - 1, clrCyan);
|
||||
int tt = st + (sb - st) * textScroller.Offset() / textScroller.Total();
|
||||
int tb = tt + (sb - st) * textScroller.Shown() / textScroller.Total();
|
||||
int xl = OsdWidth - 1;
|
||||
osd->DrawRectangle(xl, st, xl, sb, clrCyan);
|
||||
osd->DrawRectangle(xl, tt, xl, tb, clrWhite);
|
||||
}
|
||||
}
|
||||
|
||||
void cSkinCursesDisplayMenu::SetTextScrollbar(void)
|
||||
{
|
||||
if (textScroller.CanScroll())
|
||||
DrawScrollbar(textScroller.Total(), textScroller.Offset(), textScroller.Shown(), textScroller.Top(), textScroller.Height(), textScroller.CanScrollUp(), textScroller.CanScrollDown());
|
||||
}
|
||||
|
||||
void cSkinCursesDisplayMenu::Scroll(bool Up, bool Page)
|
||||
{
|
||||
cSkinDisplayMenu::Scroll(Up, Page);
|
||||
SetTextScrollbar();
|
||||
SetScrollbar();
|
||||
}
|
||||
|
||||
int cSkinCursesDisplayMenu::MaxItems(void)
|
||||
{
|
||||
return ScOsdHeight - 4;
|
||||
return OsdHeight - 4;
|
||||
}
|
||||
|
||||
void cSkinCursesDisplayMenu::Clear(void)
|
||||
{
|
||||
osd->DrawRectangle(0, 1, ScOsdWidth - 1, ScOsdHeight - 2, clrBackground);
|
||||
osd->DrawRectangle(0, 1, OsdWidth - 1, OsdHeight - 2, clrBackground);
|
||||
textScroller.Reset();
|
||||
}
|
||||
|
||||
void cSkinCursesDisplayMenu::DrawTitle(void)
|
||||
{
|
||||
bool WithDisk = MenuCategory() == mcMain || MenuCategory() == mcRecording;
|
||||
osd->DrawText(0, 0, WithDisk ? cString::sprintf("%s - %s", *title, *cVideoDiskUsage::String()) : title, clrBlack, clrCyan, &Font, ScOsdWidth);
|
||||
}
|
||||
|
||||
void cSkinCursesDisplayMenu::SetTitle(const char *Title)
|
||||
{
|
||||
title = Title;
|
||||
DrawTitle();
|
||||
osd->DrawText(0, 0, Title, clrBlack, clrCyan, &Font, OsdWidth);
|
||||
}
|
||||
|
||||
void cSkinCursesDisplayMenu::SetButtons(const char *Red, const char *Green, const char *Yellow, const char *Blue)
|
||||
{
|
||||
int w = ScOsdWidth;
|
||||
int w = OsdWidth;
|
||||
int t0 = 0;
|
||||
int t1 = 0 + w / 4;
|
||||
int t2 = 0 + w / 2;
|
||||
int t3 = w - w / 4;
|
||||
int t4 = w;
|
||||
int y = ScOsdHeight - 1;
|
||||
int y = OsdHeight - 1;
|
||||
osd->DrawText(t0, y, Red, clrWhite, Red ? clrRed : clrBackground, &Font, t1 - t0, 0, taCenter);
|
||||
osd->DrawText(t1, y, Green, clrBlack, Green ? clrGreen : clrBackground, &Font, t2 - t1, 0, taCenter);
|
||||
osd->DrawText(t2, y, Yellow, clrBlack, Yellow ? clrYellow : clrBackground, &Font, t3 - t2, 0, taCenter);
|
||||
@ -365,9 +347,9 @@ void cSkinCursesDisplayMenu::SetButtons(const char *Red, const char *Green, cons
|
||||
void cSkinCursesDisplayMenu::SetMessage(eMessageType Type, const char *Text)
|
||||
{
|
||||
if (Text)
|
||||
osd->DrawText(0, ScOsdHeight - 2, Text, clrMessage[2 * Type], clrMessage[2 * Type + 1], &Font, ScOsdWidth, 0, taCenter);
|
||||
osd->DrawText(0, OsdHeight - 2, Text, clrMessage[2 * Type], clrMessage[2 * Type + 1], &Font, OsdWidth, 0, taCenter);
|
||||
else
|
||||
osd->DrawRectangle(0, ScOsdHeight - 2, ScOsdWidth - 1, ScOsdHeight - 2, clrBackground);
|
||||
osd->DrawRectangle(0, OsdHeight - 2, OsdWidth - 1, OsdHeight - 2, clrBackground);
|
||||
}
|
||||
|
||||
void cSkinCursesDisplayMenu::SetItem(const char *Text, int Index, bool Current, bool Selectable)
|
||||
@ -385,18 +367,13 @@ void cSkinCursesDisplayMenu::SetItem(const char *Text, int Index, bool Current,
|
||||
for (int i = 0; i < MaxTabs; i++) {
|
||||
const char *s = GetTabbedText(Text, i);
|
||||
if (s) {
|
||||
int xt = Tab(i) / AvgCharWidth();// Tab() is in "pixel" - see also skins.c!!!
|
||||
osd->DrawText(xt, y, s, ColorFg, ColorBg, &Font, ScOsdWidth - 2 - xt);
|
||||
int xt = Tab(i) / 12;// Tab() is in "pixel" - see also skins.c!!!
|
||||
osd->DrawText(xt, y, s, ColorFg, ColorBg, &Font, OsdWidth - xt);
|
||||
}
|
||||
if (!Tab(i + 1))
|
||||
break;
|
||||
}
|
||||
SetEditableWidth(ScOsdWidth - 2 - Tab(1) / AvgCharWidth()); // Tab() is in "pixel" - see also skins.c!!!
|
||||
}
|
||||
|
||||
void cSkinCursesDisplayMenu::SetScrollbar(int Total, int Offset)
|
||||
{
|
||||
DrawScrollbar(Total, Offset, MaxItems(), 2, MaxItems(), Offset > 0, Offset + MaxItems() < Total);
|
||||
SetEditableWidth(OsdWidth - Tab(1) / 12); // Tab() is in "pixel" - see also skins.c!!!
|
||||
}
|
||||
|
||||
void cSkinCursesDisplayMenu::SetEvent(const cEvent *Event)
|
||||
@ -405,35 +382,27 @@ void cSkinCursesDisplayMenu::SetEvent(const cEvent *Event)
|
||||
return;
|
||||
int y = 2;
|
||||
cTextScroller ts;
|
||||
cString t = cString::sprintf("%s %s - %s", *Event->GetDateString(), *Event->GetTimeString(), *Event->GetEndTimeString());
|
||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, t, &Font, clrYellow, clrBackground);
|
||||
char t[32];
|
||||
snprintf(t, sizeof(t), "%s %s - %s", *Event->GetDateString(), *Event->GetTimeString(), *Event->GetEndTimeString());
|
||||
ts.Set(osd, 0, y, OsdWidth, OsdHeight - y - 2, t, &Font, clrYellow, clrBackground);
|
||||
if (Event->Vps() && Event->Vps() != Event->StartTime()) {
|
||||
cString buffer = cString::sprintf(" VPS: %s", *Event->GetVpsString());
|
||||
osd->DrawText(ScOsdWidth - Utf8StrLen(buffer), y, buffer, clrBlack, clrYellow, &Font);
|
||||
char *buffer;
|
||||
asprintf(&buffer, " VPS: %s", *Event->GetVpsString());
|
||||
osd->DrawText(OsdWidth - strlen(buffer), y, buffer, clrBlack, clrYellow, &Font);
|
||||
free(buffer);
|
||||
}
|
||||
y += ts.Height();
|
||||
if (Event->ParentalRating()) {
|
||||
cString buffer = cString::sprintf(" %s ", *Event->GetParentalRatingString());
|
||||
osd->DrawText(ScOsdWidth - Utf8StrLen(buffer), y, buffer, clrBlack, clrYellow, &Font);
|
||||
}
|
||||
y += 1;
|
||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, Event->Title(), &Font, clrCyan, clrBackground);
|
||||
ts.Set(osd, 0, y, OsdWidth, OsdHeight - y - 2, Event->Title(), &Font, clrCyan, clrBackground);
|
||||
y += ts.Height();
|
||||
if (!isempty(Event->ShortText())) {
|
||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, Event->ShortText(), &Font, clrYellow, clrBackground);
|
||||
ts.Set(osd, 0, y, OsdWidth, OsdHeight - y - 2, Event->ShortText(), &Font, clrYellow, clrBackground);
|
||||
y += ts.Height();
|
||||
}
|
||||
for (int i = 0; Event->Contents(i); i++) {
|
||||
const char *s = Event->ContentToString(Event->Contents(i));
|
||||
if (!isempty(s)) {
|
||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, s, &Font, clrYellow, clrBackground);
|
||||
y += 1;
|
||||
}
|
||||
}
|
||||
y += 1;
|
||||
if (!isempty(Event->Description())) {
|
||||
textScroller.Set(osd, 0, y, ScOsdWidth - 2, ScOsdHeight - y - 2, Event->Description(), &Font, clrCyan, clrBackground);
|
||||
SetTextScrollbar();
|
||||
textScroller.Set(osd, 0, y, OsdWidth - 2, OsdHeight - y - 2, Event->Description(), &Font, clrCyan, clrBackground);
|
||||
SetScrollbar();
|
||||
}
|
||||
}
|
||||
|
||||
@ -444,58 +413,37 @@ void cSkinCursesDisplayMenu::SetRecording(const cRecording *Recording)
|
||||
const cRecordingInfo *Info = Recording->Info();
|
||||
int y = 2;
|
||||
cTextScroller ts;
|
||||
cString t = cString::sprintf("%s %s %s", *DateString(Recording->Start()), *TimeString(Recording->Start()), Info->ChannelName() ? Info->ChannelName() : "");
|
||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, t, &Font, clrYellow, clrBackground);
|
||||
char t[32];
|
||||
snprintf(t, sizeof(t), "%s %s", *DateString(Recording->start), *TimeString(Recording->start));
|
||||
ts.Set(osd, 0, y, OsdWidth, OsdHeight - y - 2, t, &Font, clrYellow, clrBackground);
|
||||
y += ts.Height();
|
||||
int xt = ScOsdWidth;
|
||||
if (Info->GetEvent()->ParentalRating()) {
|
||||
cString buffer = cString::sprintf(" %s ", *Info->GetEvent()->GetParentalRatingString());
|
||||
int w = Utf8StrLen(buffer);
|
||||
osd->DrawText(xt - w, y, buffer, clrBlack, clrYellow, &Font);
|
||||
xt -= w + 1;
|
||||
}
|
||||
if (Info->Errors() > 0) {
|
||||
cString buffer = cString::sprintf(" %d %s ", Info->Errors(), tr("errors"));
|
||||
int w = Utf8StrLen(buffer);
|
||||
osd->DrawText(xt - w, y, buffer, clrBlack, clrYellow, &Font);
|
||||
xt -= w + 1;
|
||||
}
|
||||
y += 1;
|
||||
const char *Title = Info->Title();
|
||||
if (isempty(Title))
|
||||
Title = Recording->Name();
|
||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, Title, &Font, clrCyan, clrBackground);
|
||||
ts.Set(osd, 0, y, OsdWidth, OsdHeight - y - 2, Title, &Font, clrCyan, clrBackground);
|
||||
y += ts.Height();
|
||||
if (!isempty(Info->ShortText())) {
|
||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, Info->ShortText(), &Font, clrYellow, clrBackground);
|
||||
ts.Set(osd, 0, y, OsdWidth, OsdHeight - y - 2, Info->ShortText(), &Font, clrYellow, clrBackground);
|
||||
y += ts.Height();
|
||||
}
|
||||
for (int i = 0; Info->GetEvent()->Contents(i); i++) {
|
||||
const char *s = Info->GetEvent()->ContentToString(Info->GetEvent()->Contents(i));
|
||||
if (!isempty(s)) {
|
||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, s, &Font, clrYellow, clrBackground);
|
||||
y += 1;
|
||||
}
|
||||
}
|
||||
y += 1;
|
||||
if (!isempty(Info->Description())) {
|
||||
textScroller.Set(osd, 0, y, ScOsdWidth - 2, ScOsdHeight - y - 2, Info->Description(), &Font, clrCyan, clrBackground);
|
||||
SetTextScrollbar();
|
||||
textScroller.Set(osd, 0, y, OsdWidth - 2, OsdHeight - y - 2, Info->Description(), &Font, clrCyan, clrBackground);
|
||||
SetScrollbar();
|
||||
}
|
||||
}
|
||||
|
||||
void cSkinCursesDisplayMenu::SetText(const char *Text, bool FixedFont)
|
||||
{
|
||||
textScroller.Set(osd, 0, 2, ScOsdWidth - 2, ScOsdHeight - 4, Text, &Font, clrWhite, clrBackground);
|
||||
SetTextScrollbar();
|
||||
textScroller.Set(osd, 0, 2, OsdWidth - 2, OsdHeight - 4, Text, &Font, clrWhite, clrBackground);
|
||||
SetScrollbar();
|
||||
}
|
||||
|
||||
void cSkinCursesDisplayMenu::Flush(void)
|
||||
{
|
||||
if (cVideoDiskUsage::HasChanged(lastDiskUsageState))
|
||||
DrawTitle();
|
||||
cString date = DayDateTime();
|
||||
osd->DrawText(ScOsdWidth - Utf8StrLen(date) - 2, 0, date, clrBlack, clrCyan, &Font);
|
||||
osd->DrawText(OsdWidth - strlen(date) - 2, 0, date, clrBlack, clrCyan, &Font);
|
||||
osd->Flush();
|
||||
}
|
||||
|
||||
@ -521,8 +469,8 @@ public:
|
||||
cSkinCursesDisplayReplay::cSkinCursesDisplayReplay(bool ModeOnly)
|
||||
{
|
||||
message = false;
|
||||
osd = new cCursesOsd(0, ScOsdHeight - 3);
|
||||
osd->DrawRectangle(0, 0, ScOsdWidth - 1, 2, ModeOnly ? clrTransparent : clrBackground);
|
||||
osd = new cCursesOsd(0, OsdHeight - 3);
|
||||
osd->DrawRectangle(0, 0, OsdWidth - 1, 2, ModeOnly ? clrTransparent : clrBackground);
|
||||
}
|
||||
|
||||
cSkinCursesDisplayReplay::~cSkinCursesDisplayReplay()
|
||||
@ -532,7 +480,7 @@ cSkinCursesDisplayReplay::~cSkinCursesDisplayReplay()
|
||||
|
||||
void cSkinCursesDisplayReplay::SetTitle(const char *Title)
|
||||
{
|
||||
osd->DrawText(0, 0, Title, clrWhite, clrBackground, &Font, ScOsdWidth);
|
||||
osd->DrawText(0, 0, Title, clrWhite, clrBackground, &Font, OsdWidth);
|
||||
}
|
||||
|
||||
void cSkinCursesDisplayReplay::SetMode(bool Play, bool Forward, int Speed)
|
||||
@ -553,31 +501,31 @@ void cSkinCursesDisplayReplay::SetMode(bool Play, bool Forward, int Speed)
|
||||
|
||||
void cSkinCursesDisplayReplay::SetProgress(int Current, int Total)
|
||||
{
|
||||
int p = Total > 0 ? ScOsdWidth * Current / Total : 0;
|
||||
int p = Total > 0 ? OsdWidth * Current / Total : 0;
|
||||
osd->DrawRectangle(0, 1, p, 1, clrGreen);
|
||||
osd->DrawRectangle(p, 1, ScOsdWidth, 1, clrWhite);
|
||||
osd->DrawRectangle(p, 1, OsdWidth, 1, clrWhite);
|
||||
}
|
||||
|
||||
void cSkinCursesDisplayReplay::SetCurrent(const char *Current)
|
||||
{
|
||||
osd->DrawText(0, 2, Current, clrWhite, clrBackground, &Font, Utf8StrLen(Current) + 3);
|
||||
osd->DrawText(0, 2, Current, clrWhite, clrBackground, &Font, strlen(Current) + 3);
|
||||
}
|
||||
|
||||
void cSkinCursesDisplayReplay::SetTotal(const char *Total)
|
||||
{
|
||||
osd->DrawText(ScOsdWidth - Utf8StrLen(Total), 2, Total, clrWhite, clrBackground, &Font);
|
||||
osd->DrawText(OsdWidth - strlen(Total), 2, Total, clrWhite, clrBackground, &Font);
|
||||
}
|
||||
|
||||
void cSkinCursesDisplayReplay::SetJump(const char *Jump)
|
||||
{
|
||||
osd->DrawText(ScOsdWidth / 4, 2, Jump, clrWhite, clrBackground, &Font, ScOsdWidth / 2, 0, taCenter);
|
||||
osd->DrawText(OsdWidth / 4, 2, Jump, clrWhite, clrBackground, &Font, OsdWidth / 2, 0, taCenter);
|
||||
}
|
||||
|
||||
void cSkinCursesDisplayReplay::SetMessage(eMessageType Type, const char *Text)
|
||||
{
|
||||
if (Text) {
|
||||
osd->SaveRegion(0, 2, ScOsdWidth - 1, 2);
|
||||
osd->DrawText(0, 2, Text, clrMessage[2 * Type], clrMessage[2 * Type + 1], &Font, ScOsdWidth, 0, taCenter);
|
||||
osd->SaveRegion(0, 2, OsdWidth - 1, 2);
|
||||
osd->DrawText(0, 2, Text, clrMessage[2 * Type], clrMessage[2 * Type + 1], &Font, OsdWidth, 0, taCenter);
|
||||
message = true;
|
||||
}
|
||||
else {
|
||||
@ -605,7 +553,7 @@ public:
|
||||
|
||||
cSkinCursesDisplayVolume::cSkinCursesDisplayVolume(void)
|
||||
{
|
||||
osd = new cCursesOsd(0, ScOsdHeight - 1);
|
||||
osd = new cCursesOsd(0, OsdHeight - 1);
|
||||
}
|
||||
|
||||
cSkinCursesDisplayVolume::~cSkinCursesDisplayVolume()
|
||||
@ -616,17 +564,16 @@ cSkinCursesDisplayVolume::~cSkinCursesDisplayVolume()
|
||||
void cSkinCursesDisplayVolume::SetVolume(int Current, int Total, bool Mute)
|
||||
{
|
||||
if (Mute) {
|
||||
osd->DrawRectangle(0, 0, ScOsdWidth - 1, 0, clrTransparent);
|
||||
osd->DrawRectangle(0, 0, OsdWidth - 1, 0, clrTransparent);
|
||||
osd->DrawText(0, 0, tr("Key$Mute"), clrGreen, clrBackground, &Font);
|
||||
}
|
||||
else {
|
||||
// TRANSLATORS: note the trailing blank!
|
||||
const char *Prompt = tr("Volume ");
|
||||
int l = Utf8StrLen(Prompt);
|
||||
int p = (ScOsdWidth - l) * Current / Total;
|
||||
int l = strlen(Prompt);
|
||||
int p = (OsdWidth - l) * Current / Total;
|
||||
osd->DrawText(0, 0, Prompt, clrGreen, clrBackground, &Font);
|
||||
osd->DrawRectangle(l, 0, l + p - 1, 0, clrGreen);
|
||||
osd->DrawRectangle(l + p, 0, ScOsdWidth - 1, 0, clrWhite);
|
||||
osd->DrawRectangle(l + p, 0, OsdWidth - 1, 0, clrWhite);
|
||||
}
|
||||
}
|
||||
|
||||
@ -657,9 +604,9 @@ cSkinCursesDisplayTracks::cSkinCursesDisplayTracks(const char *Title, int NumTra
|
||||
itemsWidth = Font.Width(Title);
|
||||
for (int i = 0; i < NumTracks; i++)
|
||||
itemsWidth = max(itemsWidth, Font.Width(Tracks[i]));
|
||||
itemsWidth = min(itemsWidth, ScOsdWidth);
|
||||
itemsWidth = min(itemsWidth, OsdWidth);
|
||||
osd = new cCursesOsd(0, 0);
|
||||
osd->DrawRectangle(0, 0, ScOsdWidth - 1, ScOsdHeight - 1, clrBackground);
|
||||
osd->DrawRectangle(0, 0, OsdWidth - 1, OsdHeight - 1, clrBackground);
|
||||
osd->DrawText(0, 0, Title, clrBlack, clrCyan, &Font, itemsWidth);
|
||||
for (int i = 0; i < NumTracks; i++)
|
||||
SetItem(Tracks[i], i, false);
|
||||
@ -712,7 +659,7 @@ public:
|
||||
|
||||
cSkinCursesDisplayMessage::cSkinCursesDisplayMessage(void)
|
||||
{
|
||||
osd = new cCursesOsd(0, ScOsdHeight - 1);
|
||||
osd = new cCursesOsd(0, OsdHeight - 1);
|
||||
}
|
||||
|
||||
cSkinCursesDisplayMessage::~cSkinCursesDisplayMessage()
|
||||
@ -722,7 +669,7 @@ cSkinCursesDisplayMessage::~cSkinCursesDisplayMessage()
|
||||
|
||||
void cSkinCursesDisplayMessage::SetMessage(eMessageType Type, const char *Text)
|
||||
{
|
||||
osd->DrawText(0, 0, Text, clrMessage[2 * Type], clrMessage[2 * Type + 1], &Font, ScOsdWidth, 0, taCenter);
|
||||
osd->DrawText(0, 0, Text, clrMessage[2 * Type], clrMessage[2 * Type + 1], &Font, OsdWidth, 0, taCenter);
|
||||
}
|
||||
|
||||
void cSkinCursesDisplayMessage::Flush(void)
|
||||
@ -793,13 +740,13 @@ public:
|
||||
cPluginSkinCurses(void);
|
||||
virtual ~cPluginSkinCurses();
|
||||
virtual const char *Version(void) { return VERSION; }
|
||||
virtual const char *Description(void) { return tr(DESCRIPTION); }
|
||||
virtual const char *Description(void) { return DESCRIPTION; }
|
||||
virtual const char *CommandLineHelp(void);
|
||||
virtual bool ProcessArgs(int argc, char *argv[]);
|
||||
virtual bool Initialize(void);
|
||||
virtual bool Start(void);
|
||||
virtual void Housekeeping(void);
|
||||
virtual const char *MainMenuEntry(void) { return tr(MAINMENUENTRY); }
|
||||
virtual const char *MainMenuEntry(void) { return MAINMENUENTRY; }
|
||||
virtual cOsdObject *MainMenuAction(void);
|
||||
virtual cMenuSetupPage *SetupMenu(void);
|
||||
virtual bool SetupParse(const char *Name, const char *Value);
|
||||
@ -833,8 +780,12 @@ bool cPluginSkinCurses::ProcessArgs(int argc, char *argv[])
|
||||
bool cPluginSkinCurses::Initialize(void)
|
||||
{
|
||||
// Initialize any background activities the plugin shall perform.
|
||||
if (initscr())
|
||||
WINDOW *w = initscr();
|
||||
if (w) {
|
||||
OsdWidth = w->_maxx - w->_begx + 1;
|
||||
OsdHeight = w->_maxy - w->_begy + 1;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
56
PLUGINS/src/sky/HISTORY
Normal file
56
PLUGINS/src/sky/HISTORY
Normal file
@ -0,0 +1,56 @@
|
||||
VDR Plugin 'sky' Revision History
|
||||
---------------------------------
|
||||
|
||||
2002-12-01: Version 0.0.1
|
||||
|
||||
- Initial revision.
|
||||
|
||||
2002-12-13: Version 0.1.0
|
||||
|
||||
- Changed setting of CXX and CXXFLAGS variables in Makefile.
|
||||
|
||||
2003-05-09: Version 0.1.1
|
||||
|
||||
- Changed Start() to Initialize().
|
||||
|
||||
2004-01-04: Version 0.2.0
|
||||
|
||||
- Implemented automatic PID switching and channel detection
|
||||
|
||||
2004-02-15: Version 0.3.0
|
||||
|
||||
- Now using the actual channel IDs a derived from the data stream.
|
||||
- Switched EPG data retrieval to http://www.bleb.org.
|
||||
- Added automatic DST detection to getskyepg.pl.
|
||||
- Fixed handling receivers, so that a recording on the same channel
|
||||
won't interrupt an ongoing Transfer mode.
|
||||
|
||||
2004-10-16: Version 0.3.1
|
||||
|
||||
- Improved buffer handling.
|
||||
|
||||
2004-12-12: Version 0.3.2
|
||||
|
||||
- Changed Apid access in cChannel.
|
||||
|
||||
2004-12-19: Version 0.3.3
|
||||
|
||||
- Made several functions threadsafe.
|
||||
- Removed delay_ms(), using cCondWait::SleepMs() instead.
|
||||
|
||||
2005-09-17: Version 0.3.4
|
||||
|
||||
- Added a missing include statement.
|
||||
|
||||
2006-03-26: Version 0.3.5
|
||||
|
||||
- Fixed format string handling.
|
||||
|
||||
2006-12-02: Version 0.3.5 (version number not increased)
|
||||
|
||||
- Made the getskyepg.pl script send a user agent message to
|
||||
the server, according to the rules at http://bleb.org/tv/data/listings.
|
||||
If your version of 'wget' doesn't support the -U option to set the user agent,
|
||||
use the new option -U of getskyepg.pl to have the information added to the URL
|
||||
as a query string.
|
||||
- The getskyepg.pl script now replaces "&" with "&".
|
81
PLUGINS/src/sky/Makefile
Normal file
81
PLUGINS/src/sky/Makefile
Normal file
@ -0,0 +1,81 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 1.9 2006/09/09 12:38:35 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
# By default the main source file also carries this name.
|
||||
#
|
||||
PLUGIN = sky
|
||||
|
||||
### The version number of this plugin (taken from the main source file):
|
||||
|
||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||
|
||||
### The C++ compiler and options:
|
||||
|
||||
CXX ?= g++
|
||||
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual
|
||||
|
||||
### The directory environment:
|
||||
|
||||
VDRDIR = ../../..
|
||||
LIBDIR = ../../lib
|
||||
TMPDIR = /tmp
|
||||
|
||||
### Allow user defined options to overwrite defaults:
|
||||
|
||||
-include $(VDRDIR)/Make.config
|
||||
|
||||
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||
|
||||
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||
|
||||
### The name of the distribution archive:
|
||||
|
||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||
PACKAGE = vdr-$(ARCHIVE)
|
||||
|
||||
### Includes and Defines (add further entries here):
|
||||
|
||||
INCLUDES += -I$(VDRDIR)/include
|
||||
|
||||
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
|
||||
### The object files (add further files here):
|
||||
|
||||
OBJS = $(PLUGIN).o
|
||||
|
||||
### Implicit rules:
|
||||
|
||||
%.o: %.c
|
||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||
|
||||
# Dependencies:
|
||||
|
||||
MAKEDEP = g++ -MM -MG
|
||||
DEPFILE = .dependencies
|
||||
$(DEPFILE): Makefile
|
||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
|
||||
-include $(DEPFILE)
|
||||
|
||||
### Targets:
|
||||
|
||||
all: libvdr-$(PLUGIN).so
|
||||
|
||||
libvdr-$(PLUGIN).so: $(OBJS)
|
||||
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
|
||||
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||
|
||||
dist: clean
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
||||
@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE)
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
@echo Distribution package created as $(PACKAGE).tgz
|
||||
|
||||
clean:
|
||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
45
PLUGINS/src/sky/README
Normal file
45
PLUGINS/src/sky/README
Normal file
@ -0,0 +1,45 @@
|
||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||
|
||||
Written by: Klaus Schmidinger <kls@cadsoft.de>
|
||||
|
||||
Project's homepage: www.cadsoft.de/vdr
|
||||
|
||||
Latest version available at: www.cadsoft.de/vdr
|
||||
|
||||
See the file COPYING for license information.
|
||||
|
||||
Description:
|
||||
|
||||
The 'sky' plugin implements a new device for VDR, which is based on the
|
||||
MPEG2 encoder card described at linuxtv.org/mpeg2/kfir.xml. It
|
||||
allows you to connect the analog a/v output of your Sky Digibox to VDR,
|
||||
so that you can enjoy the full recording flexibility of VDR with your
|
||||
Sky subscription. Note that this is NOT something that does anything
|
||||
illegal, like decrypting the Sky programme without a subscription. You
|
||||
will need a Sky Digibox and a valid subscription in order to use this
|
||||
plugin.
|
||||
|
||||
The 'kfir' module must be loaded with the option 'streamtype=4' to make it
|
||||
produce a Transport Stream.
|
||||
|
||||
The Digibox is remotely controlled through VDR via LIRC (see lirc.org).
|
||||
The file lircd.conf.sky contains the remote control codes necessary to
|
||||
control the Digibox.
|
||||
|
||||
In order to access the Sky channels VDR needs to know the channel number
|
||||
under which each channel is stored in the Sky Digibox. These numbers are
|
||||
stored in the file 'channels.conf.sky', together with the channel IDs as
|
||||
derived from the actual channel data and the names under which the EPG
|
||||
data for each channel can be found (see below). Copy this file to your
|
||||
plugins config directory, in a subdirectory named 'sky', as in
|
||||
|
||||
/video/plugins/sky/channels.conf.sky
|
||||
|
||||
The Sky EPG is available on the Internet at http://www.bleb.org.
|
||||
The Perl script getskyepg.pl extracts the EPG data from these pages
|
||||
and sends it to VDR via an SVDRP connection. The channel names as
|
||||
used on the bleb.org pages are defined in the channels.conf.sky file.
|
||||
You can keep your EPG data up-to-date by entering a call to getskyepg.pl
|
||||
into your /etc/crontab. Call 'getskyepg.pl -h' for a list of options.
|
||||
The getskyepg.pl script requires the programs /usr/bin/wget and /usr/bin/logger
|
||||
to be installed on your system.
|
34
PLUGINS/src/sky/channels.conf.sky
Normal file
34
PLUGINS/src/sky/channels.conf.sky
Normal file
@ -0,0 +1,34 @@
|
||||
# Sky channel definitions
|
||||
#
|
||||
# Syntax:
|
||||
#
|
||||
# ChannelID:ChannelNumber:EPGname
|
||||
#
|
||||
# where
|
||||
#
|
||||
# ChannelID is the channel ID as derived from the actual channel
|
||||
# data as broadcast in the data stream (see man vdr(5)).
|
||||
#
|
||||
# ChannelNumber is the number of this channel as you have to
|
||||
# enter it on the DigiBox remote control.
|
||||
#
|
||||
# EPGname is the name of the page at www.bleb.org that has EPG
|
||||
# data for this channel (without the '.xml'). If no such
|
||||
# page exists, 'x' is entered.
|
||||
#
|
||||
S28.2E-2-2027-4705:106:sky_one
|
||||
S28.2E-2-2027-5104:107:sky_two
|
||||
S28.2E-2-2044-10070:118:itv2
|
||||
S28.2E-2-2023-4905:130:scifi
|
||||
S28.2E-2-2025-5904:127:paramount
|
||||
S28.2E-2-2009-6201:551:discovery
|
||||
S28.2E-2-2030-4809:310:sky_cinema
|
||||
S28.2E-2-2007-4303:301:sky_movies1
|
||||
S28.2E-2-2007-4302:302:sky_movies2
|
||||
S28.2E-2-2007-4403:303:sky_movies3
|
||||
S28.2E-2-2011-4402:304:sky_movies4
|
||||
S28.2E-2-2011-4503:305:sky_movies5
|
||||
S28.2E-2-2011-4502:306:sky_movies6
|
||||
S28.2E-2-2030-4603:307:sky_movies7
|
||||
S28.2E-2-2007-5502:308:sky_movies8
|
||||
S28.2E-2-2030-4602:309:sky_movies9
|
260
PLUGINS/src/sky/getskyepg.pl
Executable file
260
PLUGINS/src/sky/getskyepg.pl
Executable file
@ -0,0 +1,260 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
# getskyepg.pl: Get EPG data for Sky channels from the Internet
|
||||
#
|
||||
# Connects to a running VDR instance via SVDRP, gets the channel data
|
||||
# for the Sky channels and connects to Internet web pages to extract the
|
||||
# EPG data for these channels. The result is sent to VDR via SVDRP.
|
||||
#
|
||||
# See the README file for copyright information and how to reach the author.
|
||||
#
|
||||
# $Id: getskyepg.pl 1.6 2006/12/02 09:52:49 kls Exp $
|
||||
|
||||
use Getopt::Std;
|
||||
use Time::Local;
|
||||
|
||||
$Usage = qq{
|
||||
Usage: $0 [options]
|
||||
|
||||
Options: -c filename channel config file name (default: channels.conf.sky)
|
||||
-d hostname destination hostname (default: localhost)
|
||||
-p port SVDRP port number (default: 2001)
|
||||
-S source channel source (default: S28.2E)
|
||||
-D days days to get EPG for (1..7, default: 2)
|
||||
-U use this if your version of 'wget' doesn't support -U
|
||||
};
|
||||
|
||||
die $Usage if (!getopts("c:d:D:hp:S:U") || $opt_h);
|
||||
|
||||
$Conf = $opt_c || "channels.conf.sky";
|
||||
$Dest = $opt_d || "localhost";
|
||||
$Port = $opt_p || 2001;
|
||||
$Source = $opt_S || "S28.2E";
|
||||
$Days = $opt_D || 2;
|
||||
$User = $opt_U;
|
||||
|
||||
# See "Rules for using this data" on http://bleb.org/tv/data/listings.
|
||||
# In case you modify this script in a way that changes its behavior
|
||||
# towards the www.bleb.org website, please replace 'vdrbugs@cadsoft.de'
|
||||
# with your own email address! That way Andrew Flegg <andrew@bleb.org>,
|
||||
# who runs that web site, can contact you in case of problems.
|
||||
$IDENT = "VDR::getskyepg.pl, http://www.cadsoft.de/vdr - vdrbugs\@cadsoft.de";
|
||||
$GAP = 2;
|
||||
|
||||
$SkyWebPage = "www.bleb.org/tv/data/listings";
|
||||
$WGET = "/usr/bin/wget -q -O-";
|
||||
$WGET .= " -U '$IDENT'" unless $User;
|
||||
$LOGGER = "/usr/bin/logger -t SKYEPG";
|
||||
|
||||
$DST = -3600; # Daylight Saving Time offset
|
||||
$SecsInDay = 86400;
|
||||
|
||||
@Channels = ();
|
||||
|
||||
$idxSource = 0;
|
||||
$idxNumber = 1;
|
||||
$idxName = 2;
|
||||
|
||||
Error("days out of range: $Days") unless (1 <= $Days && $Days <= 7);
|
||||
|
||||
sub Log
|
||||
{
|
||||
system("$LOGGER '@_'");
|
||||
}
|
||||
|
||||
sub Error
|
||||
{
|
||||
Log(@_);
|
||||
die "$0: @_\n";
|
||||
}
|
||||
|
||||
sub GetChannels
|
||||
{
|
||||
open(CHANNELS, $Conf) || Error("$Conf: $!");
|
||||
while (<CHANNELS>) {
|
||||
chomp;
|
||||
next if (/^#/);
|
||||
my @a = split(":");
|
||||
push(@Channels, [@a]) unless ($a[$idxName] eq "x");
|
||||
}
|
||||
close(CHANNELS);
|
||||
}
|
||||
|
||||
GetChannels();
|
||||
|
||||
sub GetPage
|
||||
{
|
||||
my $channel = shift;
|
||||
my $day = shift;
|
||||
$day--;
|
||||
my $url = "http://$SkyWebPage/$day/$channel.xml";
|
||||
$url .= "?$IDENT" if $User;
|
||||
Log("reading $url");
|
||||
my @page = split("\n", `$WGET '$url'`);
|
||||
Log("received " . ($#page + 1) . " lines");
|
||||
return @page;
|
||||
}
|
||||
|
||||
sub ReplaceTags
|
||||
{
|
||||
my $s = shift;
|
||||
$s =~ s/&/&/g;
|
||||
return $s;
|
||||
}
|
||||
|
||||
sub StripWhitespace
|
||||
{
|
||||
my $s = shift;
|
||||
$s =~ s/\s*(.*)\s*/$1/;
|
||||
$s =~ s/\s+/ /g;
|
||||
return $s;
|
||||
}
|
||||
|
||||
sub Extract
|
||||
{
|
||||
my $s = shift;
|
||||
my $t = shift;
|
||||
$s =~ /<$t>([^<]*)<\/$t>/;
|
||||
return ReplaceTags(StripWhitespace($1));
|
||||
}
|
||||
|
||||
# In order to get the duration we need to buffer the last event:
|
||||
$Id = "";
|
||||
$Time = 0;
|
||||
$Title = "";
|
||||
$Subtitle = "";
|
||||
$Desc = "";
|
||||
|
||||
sub GetEpgData
|
||||
{
|
||||
my ($channel, $channelID) = @_;
|
||||
my $numEvents = 0;
|
||||
SVDRPsend("C $channelID");
|
||||
$Time = 0;
|
||||
for $day (1 .. $Days) {
|
||||
my $dt = 0;
|
||||
my @page = GetPage($channel, $day);
|
||||
my $data = "";
|
||||
for $line (@page) {
|
||||
chomp($line);
|
||||
if ($line =~ /<programme>/) {
|
||||
$data = "";
|
||||
}
|
||||
elsif ($line =~ /<\/programme>/) {
|
||||
my $title = Extract($data, "title");
|
||||
my $subtitle = Extract($data, "subtitle");
|
||||
my $desc = Extract($data, "desc");
|
||||
my $start = Extract($data, "start");
|
||||
# 'end' is useless, because it is sometimes missing :-(
|
||||
# my $end = Extract($data, "end");
|
||||
if (!$subtitle) {
|
||||
# They sometimes write all info into the description, as in
|
||||
# Episode: some description.
|
||||
# Why don't they just fill in the data correctly?
|
||||
my ($s, $d) = ($desc =~ /([^:]*)[:](.*)/);
|
||||
if ($s && $d) {
|
||||
$subtitle = $s;
|
||||
$desc = $d;
|
||||
}
|
||||
}
|
||||
# 'start' and 'end' as time of day isn't of much use here, since
|
||||
# the page for one day contains data that actually belongs to the
|
||||
# next day (after midnight). Oh well, lets reconstruct the missing
|
||||
# information:
|
||||
$start = "0" . $start if (length($start) < 4);
|
||||
my ($h, $m) = ($start =~ /(..)(..)/);
|
||||
$dt = $SecsInDay if ($h > 12);
|
||||
# convert to time_t:
|
||||
my @gmt = gmtime;
|
||||
$gmt[0] = 0; # seconds
|
||||
$gmt[1] = $m; # minutes
|
||||
$gmt[2] = $h; # hours
|
||||
$time = timegm(@gmt) + ($day - 1) * $SecsInDay + ($h < 12 ? $dt : 0);
|
||||
# compensate for DST:
|
||||
$time += $DST if (localtime($time))[8];
|
||||
# create EPG data:
|
||||
if ($Time) {
|
||||
$duration = $time - $Time;
|
||||
SVDRPsend("E $Id $Time $duration");
|
||||
SVDRPsend("T $Title");
|
||||
SVDRPsend("S $Subtitle");
|
||||
SVDRPsend("D $Desc");
|
||||
SVDRPsend("e");
|
||||
$numEvents++;
|
||||
}
|
||||
# buffer the last event:
|
||||
$Id = $time / 60 % 0xFFFF; # this gives us unique ids for every minute of over 6 weeks
|
||||
$Time = $time;
|
||||
$Title = $title;
|
||||
$Subtitle = $subtitle;
|
||||
$Desc = $desc;
|
||||
}
|
||||
else {
|
||||
$data .= $line;
|
||||
}
|
||||
}
|
||||
sleep($GAP);
|
||||
}
|
||||
SVDRPsend("c");
|
||||
Log("generated $numEvents EPG events");
|
||||
}
|
||||
|
||||
sub ProcessEpg
|
||||
{
|
||||
for (@Channels) {
|
||||
my $channel = @$_[$idxName];
|
||||
my $channelID = @$_[$idxSource];
|
||||
Log("processing channel $channel - $channelID");
|
||||
SVDRPsend("PUTE");
|
||||
SVDRPreceive(354);
|
||||
GetEpgData($channel, $channelID);
|
||||
SVDRPsend(".");
|
||||
SVDRPreceive(250);
|
||||
}
|
||||
Log("done");
|
||||
}
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# TODO: make this a Perl module??? What about Error()???
|
||||
|
||||
use Socket;
|
||||
|
||||
$Timeout = 300; # max. seconds to wait for response
|
||||
|
||||
$SIG{ALRM} = sub { Error("timeout"); };
|
||||
alarm($Timeout);
|
||||
|
||||
$iaddr = inet_aton($Dest) || Error("no host: $Dest");
|
||||
$paddr = sockaddr_in($Port, $iaddr);
|
||||
|
||||
$proto = getprotobyname('tcp');
|
||||
socket(SOCK, PF_INET, SOCK_STREAM, $proto) || Error("socket: $!");
|
||||
connect(SOCK, $paddr) || Error("connect: $!");
|
||||
select(SOCK); $| = 1;
|
||||
SVDRPreceive(220);
|
||||
ProcessEpg();
|
||||
SVDRPsend("QUIT");
|
||||
|
||||
sub SVDRPsend
|
||||
{
|
||||
my $s = shift;
|
||||
print SOCK "$s\r\n";
|
||||
}
|
||||
|
||||
sub SVDRPreceive
|
||||
{
|
||||
my $expect = shift | 0;
|
||||
my @a = ();
|
||||
while (<SOCK>) {
|
||||
s/\s*$//; # 'chomp' wouldn't work with "\r\n"
|
||||
push(@a, $_);
|
||||
if (substr($_, 3, 1) ne "-") {
|
||||
my $code = substr($_, 0, 3);
|
||||
Error("expected SVDRP code $expect, but received $code") if ($code != $expect);
|
||||
last;
|
||||
}
|
||||
}
|
||||
return @a;
|
||||
}
|
||||
|
||||
#---------------------------------------------------------------------------
|
299
PLUGINS/src/sky/lircd.conf.sky
Normal file
299
PLUGINS/src/sky/lircd.conf.sky
Normal file
@ -0,0 +1,299 @@
|
||||
# Copyright (C) 1999 Christoph Bartelmus
|
||||
#
|
||||
# You may only use this file if you make it available to others,
|
||||
# i.e. if you send it to <lirc@bartelmus.de>
|
||||
#
|
||||
# this config file was automatically generated
|
||||
# using lirc-0.6.4-CVS(serial) on Mon Jul 9 08:14:04 2001
|
||||
#
|
||||
# contributed by Steve Davies <steve@daviesfam.org>
|
||||
#
|
||||
# brand: sky
|
||||
# model no. of remote control:
|
||||
# supported devices: 34000 20
|
||||
#
|
||||
#
|
||||
|
||||
begin remote
|
||||
|
||||
name SKY
|
||||
flags CONST_LENGTH|RAW_CODES
|
||||
eps 30
|
||||
aeps 100
|
||||
ptrail 0
|
||||
repeat 0 0
|
||||
gap 149692
|
||||
frequency 36000
|
||||
duty_cycle 50
|
||||
|
||||
begin raw_codes
|
||||
|
||||
name 0
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444
|
||||
|
||||
name 1
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
888
|
||||
|
||||
name 2
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 888 888
|
||||
444
|
||||
|
||||
name 3
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 888 444
|
||||
444
|
||||
|
||||
name 4
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 888 888 444 444
|
||||
444
|
||||
|
||||
name 5
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 888 888 888
|
||||
|
||||
name 6
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 888 444 444 888
|
||||
444
|
||||
|
||||
name 7
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 888 444 444 444
|
||||
444
|
||||
|
||||
name 8
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 888 888 444 444 444 444
|
||||
444
|
||||
|
||||
name 9
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 888 888 444 444 888
|
||||
|
||||
name RED
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 888 444 444 888 888 444 444 888 888
|
||||
|
||||
name GREEN
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 888 444 444 888 888 444 444 444 444 888 444
|
||||
|
||||
name YELLOW
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 888 444 444 888 888 444 444 444 444 444 444
|
||||
|
||||
name BLUE
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 888 444 444 444 444 888 444 444 444 444 444 444
|
||||
444
|
||||
|
||||
name TEXT
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 888 444 444 444 444 444 444 888 444 444
|
||||
444
|
||||
|
||||
name BACKUP
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 888 888 444 444 444 444 444 444 444 444 888 444 444
|
||||
|
||||
name HELP
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 888 888 444 444 444 444 444 444 444 444 444 444 888
|
||||
|
||||
name CURSOR-LEFT
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 888 888 888 444 444 888 888 888 444
|
||||
|
||||
name CURSOR-DOWN
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 888 888 888 444 444 888 444 444 888
|
||||
|
||||
name CURSOR-RIGHT
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 888 888 888 444 444 888 888 444 444
|
||||
|
||||
name CURSOR-UP
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 888 888 888 444 444 888 444 444 444 444 444
|
||||
|
||||
name SELECT
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 888 888 888 444 444 444 444 888 444 444 444
|
||||
|
||||
name CHANNEL-DOWN
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 888 888 444 444 444 444 444 444 888
|
||||
|
||||
name CHANNEL-UP
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 888 888 444 444 444 444 444 444 444 444
|
||||
444
|
||||
|
||||
name I
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 888 444 444 888 444 444 888 888 888 444 444
|
||||
|
||||
name ONOFF
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 888 444 444 888 444 444
|
||||
444
|
||||
|
||||
name SKY
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 888 888 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444
|
||||
|
||||
name TV
|
||||
2830 724 583 333 553 339
|
||||
548 791 543 795 977 357
|
||||
527 364 524 367 524 368
|
||||
522 369 521 370 520 371
|
||||
519 372 519 372 519 372
|
||||
518 372 518 374 963 818
|
||||
516 376 510 381 509 382
|
||||
954 828 508 407 481
|
||||
|
||||
name SKY
|
||||
2829 726 580 336 551 340
|
||||
547 791 540 798 977 366
|
||||
519 364 523 367 521 370
|
||||
521 370 520 371 520 371
|
||||
520 371 519 372 518 373
|
||||
517 374 517 374 957 825
|
||||
512 379 512 380 513 377
|
||||
511 381 506 410 477 413
|
||||
483
|
||||
|
||||
name MUTE
|
||||
2567 429 751 447 743 456
|
||||
1335 464 734 466 1325 496
|
||||
697 504 693 506 1284 513
|
||||
681 518 681 517 679 520
|
||||
678 26288 2533 462 734 489
|
||||
705 470 1323 501 695 503
|
||||
1287 511 683 516 683 518
|
||||
1277 522 676 521 678 521
|
||||
675 523 675 26286 2533 465
|
||||
731 491 702 499 1293 504
|
||||
692 507 1280 518 683 516
|
||||
679 524 1272 522 675 529
|
||||
670 523 682 517 675 26286
|
||||
2532 465 729 493 702 473
|
||||
1318 506 688 509 1282 517
|
||||
680 519 677 524 1274 523
|
||||
676
|
||||
|
||||
name VOLUME-UP
|
||||
2568 430 766 433 1342 456
|
||||
734 489 708 466 1326 497
|
||||
699 505 686 508 1286 512
|
||||
688 510 683 516 682 516
|
||||
681 26284 2540 481 711 488
|
||||
1301 498 703 495 695 504
|
||||
1284 516 682 516 684 515
|
||||
1276 522 675 523 675 524
|
||||
674 524 675 26286 2532 490
|
||||
709 489 1300 500 689 509
|
||||
695 517 1270 516 683 520
|
||||
675 519 1274 529 668 525
|
||||
675 524 673 526 672 26288
|
||||
2532 466 731 491 1300 499
|
||||
695 503 692 509 1277 520
|
||||
681 518 679 519 1278 520
|
||||
675
|
||||
|
||||
name VOLUME-DOWN
|
||||
2562 434 1348 451 1332 465
|
||||
733 489 704 496 1296 504
|
||||
690 507 694 511 1281 511
|
||||
683 523 677 515 679 520
|
||||
680 25687 2533 464 1330 491
|
||||
1295 505 693 506 689 510
|
||||
1293 505 684 516 678 520
|
||||
1276 523 677 520 675 524
|
||||
673 526 674 25686 2531 467
|
||||
1324 498 1292 506 691 509
|
||||
683 515 1280 518 678 521
|
||||
675 523 1273 525 674 527
|
||||
672 525 673 527 671 25685
|
||||
2531 467 1320 501 1288 511
|
||||
687 511 688 512 1282 516
|
||||
678 521 675 524 1273
|
||||
|
||||
name TVGUIDE
|
||||
2834 720 586 330 554 338
|
||||
548 794 539 796 975 360
|
||||
528 363 521 371 519 371
|
||||
520 371 519 375 514 374
|
||||
517 374 516 375 513 379
|
||||
511 380 510 381 949 387
|
||||
500 836 505 387 945 391
|
||||
493 868 469 422 468
|
||||
|
||||
name BOXOFFICE
|
||||
2833 745 564 329 555 338
|
||||
548 790 545 793 982 352
|
||||
529 362 526 365 522 370
|
||||
519 371 519 372 519 372
|
||||
518 373 517 374 513 378
|
||||
515 376 507 384 506 385
|
||||
945 390 496 396 498 392
|
||||
496 419 468 847 936
|
||||
|
||||
name SERVICES
|
||||
2829 725 585 330 555 338
|
||||
548 798 537 794 979 356
|
||||
528 368 522 363 523 369
|
||||
521 370 521 370 520 370
|
||||
520 371 520 371 520 371
|
||||
519 372 519 372 518 373
|
||||
964 371 517 375 513 377
|
||||
511 404 489 402 485 828
|
||||
514
|
||||
|
||||
name INTERACTIVE
|
||||
2829 726 591 324 553 340
|
||||
550 788 542 796 981 354
|
||||
532 359 522 369 522 369
|
||||
520 372 518 373 518 373
|
||||
516 375 515 375 513 379
|
||||
515 375 510 381 948 389
|
||||
498 392 504 412 470 867
|
||||
916 866 913
|
||||
|
||||
end raw_codes
|
||||
|
||||
end remote
|
303
PLUGINS/src/sky/sky.c
Normal file
303
PLUGINS/src/sky/sky.c
Normal file
@ -0,0 +1,303 @@
|
||||
/*
|
||||
* sky.c: A plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: sky.c 1.13 2006/03/26 09:21:10 kls Exp $
|
||||
*/
|
||||
|
||||
#include <sys/socket.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/un.h>
|
||||
#include <unistd.h>
|
||||
#include <vdr/device.h>
|
||||
#include <vdr/plugin.h>
|
||||
#include <vdr/sources.h>
|
||||
|
||||
static const char *VERSION = "0.3.5";
|
||||
static const char *DESCRIPTION = "Sky Digibox interface";
|
||||
|
||||
// --- cDigiboxDevice --------------------------------------------------------
|
||||
|
||||
#define DUMMYAPID 80
|
||||
#define DUMMYVPID 160
|
||||
|
||||
class cSkyChannel : public cListObject {
|
||||
public:
|
||||
tChannelID channelID;
|
||||
int digiboxChannelNumber;
|
||||
bool Parse(const char *s);
|
||||
};
|
||||
|
||||
bool cSkyChannel::Parse(const char *s)
|
||||
{
|
||||
char *id = NULL;
|
||||
if (2 == sscanf(s, "%a[^:]:%d", &id, &digiboxChannelNumber))
|
||||
channelID = tChannelID::FromString(id);
|
||||
free(id);
|
||||
return digiboxChannelNumber && channelID.Valid();
|
||||
}
|
||||
|
||||
class cSkyChannels : public cConfig<cSkyChannel> {
|
||||
public:
|
||||
cSkyChannel *GetSkyChannel(const cChannel *Channel);
|
||||
};
|
||||
|
||||
cSkyChannel *cSkyChannels::GetSkyChannel(const cChannel *Channel)
|
||||
{
|
||||
tChannelID ChannelID = Channel->GetChannelID();
|
||||
for (cSkyChannel *sc = First(); sc; sc = Next(sc)) {
|
||||
if (ChannelID == sc->channelID)
|
||||
return sc;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cSkyChannels SkyChannels;
|
||||
|
||||
class cDigiboxDevice : public cDevice {
|
||||
private:
|
||||
int source;
|
||||
int digiboxChannelNumber;
|
||||
int fd_dvr;
|
||||
int apid, vpid;
|
||||
cTSBuffer *tsBuffer;
|
||||
int fd_lirc;
|
||||
void LircSend(const char *s);
|
||||
void LircSend(int n);
|
||||
protected:
|
||||
virtual bool SetPid(cPidHandle *Handle, int Type, bool On);
|
||||
virtual bool OpenDvr(void);
|
||||
virtual void CloseDvr(void);
|
||||
virtual bool GetTSPacket(uchar *&Data);
|
||||
public:
|
||||
cDigiboxDevice(void);
|
||||
virtual ~cDigiboxDevice();
|
||||
virtual bool ProvidesSource(int Source) const;
|
||||
virtual bool ProvidesTransponder(const cChannel *Channel) const;
|
||||
virtual bool ProvidesChannel(const cChannel *Channel, int Priority = -1, bool *NeedsSetChannel = NULL) const;
|
||||
virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView);
|
||||
};
|
||||
|
||||
cDigiboxDevice::cDigiboxDevice(void)
|
||||
{
|
||||
source = cSource::FromString("S28.2E");//XXX parameter???
|
||||
digiboxChannelNumber = 0;
|
||||
fd_dvr = -1;
|
||||
apid = vpid = 0;
|
||||
struct sockaddr_un addr;
|
||||
addr.sun_family = AF_UNIX;
|
||||
strn0cpy(addr.sun_path, "/dev/lircd", sizeof(addr.sun_path));//XXX parameter???
|
||||
fd_lirc = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
if (fd_lirc >= 0) {
|
||||
if (connect(fd_lirc, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
|
||||
LOG_ERROR;
|
||||
close(fd_lirc);
|
||||
}
|
||||
}
|
||||
else
|
||||
LOG_ERROR;
|
||||
}
|
||||
|
||||
cDigiboxDevice::~cDigiboxDevice()
|
||||
{
|
||||
if (fd_lirc >= 0)
|
||||
close(fd_lirc);
|
||||
}
|
||||
|
||||
void cDigiboxDevice::LircSend(const char *s)
|
||||
{
|
||||
char buf[100];
|
||||
snprintf(buf, sizeof(buf), "SEND_ONCE SKY %s\n", s);
|
||||
dsyslog(buf);//XXX
|
||||
if (write(fd_lirc, buf, strlen(buf)) < 0)
|
||||
LOG_ERROR;//XXX _STR
|
||||
cCondWait::SleepMs(200);
|
||||
}
|
||||
|
||||
void cDigiboxDevice::LircSend(int n)
|
||||
{
|
||||
char buf[10];
|
||||
snprintf(buf, sizeof(buf), "%d", n);
|
||||
char *p = buf;
|
||||
while (*p) {
|
||||
char q[10];
|
||||
sprintf(q, "%c", *p);
|
||||
LircSend(q);
|
||||
p++;
|
||||
}
|
||||
}
|
||||
|
||||
bool cDigiboxDevice::SetPid(cPidHandle *Handle, int Type, bool On)
|
||||
{
|
||||
//dsyslog("SetPid %d %d", Handle->pid, On);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cDigiboxDevice::OpenDvr(void)
|
||||
{
|
||||
CloseDvr();
|
||||
fd_dvr = open("/dev/video2", O_RDONLY | O_NONBLOCK);//XXX parameter???
|
||||
if (fd_dvr >= 0)
|
||||
tsBuffer = new cTSBuffer(fd_dvr, MEGABYTE(2), CardIndex() + 1);
|
||||
return fd_dvr >= 0;
|
||||
}
|
||||
|
||||
void cDigiboxDevice::CloseDvr(void)
|
||||
{
|
||||
if (fd_dvr >= 0) {
|
||||
close(fd_dvr);
|
||||
fd_dvr = -1;
|
||||
delete tsBuffer;
|
||||
tsBuffer = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
bool cDigiboxDevice::GetTSPacket(uchar *&Data)
|
||||
{
|
||||
if (tsBuffer) {
|
||||
Data = tsBuffer->Get();
|
||||
if (Data) {
|
||||
// insert the actual PIDs:
|
||||
int Pid = (((uint16_t)Data[1] & PID_MASK_HI) << 8) | Data[2];
|
||||
if (Pid == DUMMYAPID)
|
||||
Pid = apid;
|
||||
else if (Pid == DUMMYVPID)
|
||||
Pid = vpid;
|
||||
Data[1] = ((Pid >> 8) & 0xFF) | (Data[1] & ~PID_MASK_HI);
|
||||
Data[2] = Pid & 0xFF;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool cDigiboxDevice::ProvidesSource(int Source) const
|
||||
{
|
||||
return source == Source;
|
||||
}
|
||||
|
||||
bool cDigiboxDevice::ProvidesTransponder(const cChannel *Channel) const
|
||||
{
|
||||
return false; // can't provide any actual transponder
|
||||
}
|
||||
|
||||
bool cDigiboxDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers) const
|
||||
{
|
||||
bool result = false;
|
||||
bool hasPriority = Priority < 0 || Priority > this->Priority();
|
||||
bool needsDetachReceivers = true;
|
||||
|
||||
cSkyChannel *SkyChannel = SkyChannels.GetSkyChannel(Channel);
|
||||
if (SkyChannel) {
|
||||
if (Receiving(true)) {
|
||||
if (digiboxChannelNumber == SkyChannel->digiboxChannelNumber) {
|
||||
needsDetachReceivers = false;
|
||||
result = true;
|
||||
}
|
||||
else
|
||||
result = hasPriority;
|
||||
}
|
||||
else
|
||||
result = hasPriority;
|
||||
}
|
||||
if (NeedsDetachReceivers)
|
||||
*NeedsDetachReceivers = needsDetachReceivers;
|
||||
return result;
|
||||
}
|
||||
|
||||
bool cDigiboxDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
|
||||
{
|
||||
if (fd_lirc >= 0 && !Receiving(true)) { // if we are receiving the channel is already set!
|
||||
cSkyChannel *SkyChannel = SkyChannels.GetSkyChannel(Channel);
|
||||
if (SkyChannel) {
|
||||
digiboxChannelNumber = SkyChannel->digiboxChannelNumber;
|
||||
apid = Channel->Apid(0);
|
||||
vpid = Channel->Vpid();
|
||||
//XXX only when recording??? -> faster channel switching!
|
||||
LircSend("SKY"); // makes sure the Digibox is "on"
|
||||
//XXX lircprint(fd_lirc, "BACKUP");
|
||||
//XXX lircprint(fd_lirc, "BACKUP");
|
||||
//XXX lircprint(fd_lirc, "BACKUP");
|
||||
LircSend(digiboxChannelNumber);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// --- cPluginSky ------------------------------------------------------------
|
||||
|
||||
class cPluginSky : public cPlugin {
|
||||
private:
|
||||
// Add any member variables or functions you may need here.
|
||||
public:
|
||||
cPluginSky(void);
|
||||
virtual ~cPluginSky();
|
||||
virtual const char *Version(void) { return VERSION; }
|
||||
virtual const char *Description(void) { return DESCRIPTION; }
|
||||
virtual const char *CommandLineHelp(void);
|
||||
virtual bool ProcessArgs(int argc, char *argv[]);
|
||||
virtual bool Initialize(void);
|
||||
virtual void Housekeeping(void);
|
||||
virtual cMenuSetupPage *SetupMenu(void);
|
||||
virtual bool SetupParse(const char *Name, const char *Value);
|
||||
};
|
||||
|
||||
cPluginSky::cPluginSky(void)
|
||||
{
|
||||
// Initialize any member variables here.
|
||||
// DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL
|
||||
// VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT!
|
||||
}
|
||||
|
||||
cPluginSky::~cPluginSky()
|
||||
{
|
||||
// Clean up after yourself!
|
||||
}
|
||||
|
||||
const char *cPluginSky::CommandLineHelp(void)
|
||||
{
|
||||
// Return a string that describes all known command line options.
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool cPluginSky::ProcessArgs(int argc, char *argv[])
|
||||
{
|
||||
// Implement command line argument processing here if applicable.
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cPluginSky::Initialize(void)
|
||||
{
|
||||
// Initialize any background activities the plugin shall perform.
|
||||
const char *ConfigDir = ConfigDirectory(Name());
|
||||
if (ConfigDir) {
|
||||
if (SkyChannels.Load(AddDirectory(ConfigDir, "channels.conf.sky"), true)) {
|
||||
new cDigiboxDevice;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else
|
||||
esyslog("ERROR: can't get config directory");
|
||||
return false;
|
||||
}
|
||||
|
||||
void cPluginSky::Housekeeping(void)
|
||||
{
|
||||
// Perform any cleanup or other regular tasks.
|
||||
}
|
||||
|
||||
cMenuSetupPage *cPluginSky::SetupMenu(void)
|
||||
{
|
||||
// Return a setup menu in case the plugin supports one.
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool cPluginSky::SetupParse(const char *Name, const char *Value)
|
||||
{
|
||||
// Parse your own setup parameters and store their values.
|
||||
return false;
|
||||
}
|
||||
|
||||
VDRPLUGINCREATOR(cPluginSky); // Don't touch this!
|
@ -35,51 +35,3 @@ VDR Plugin 'status' Revision History
|
||||
2005-12-31: Version 0.2.0
|
||||
|
||||
- API change in cStatus.
|
||||
|
||||
2007-08-15: Version 0.2.1
|
||||
|
||||
- Moved the "all" target in the Makefile before the "Implicit rules",
|
||||
so that a plain "make" will compile everything.
|
||||
|
||||
2008-02-16: Version 0.3.0
|
||||
|
||||
- Added new cStatus functions.
|
||||
|
||||
2012-03-11: Version 0.3.1
|
||||
|
||||
- Added new parameter LiveView to ChannelSwitch() (reported by Udo Richter).
|
||||
|
||||
2012-12-27: Version 0.3.2
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-01-12: Version 0.3.3
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-03-31: Version 2.0.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2014-01-01: Version 2.1.1
|
||||
|
||||
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
||||
|
||||
2015-02-19: Version 2.2.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2018-04-15: Version 2.4.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2021-12-27: Version 2.6.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2025-02-10: Version 2.6.1
|
||||
|
||||
- Added cStatus::OsdItem2().
|
||||
- Activated logging of OsdItem2().
|
||||
- Added cStatus::OsdCurrentItem2().
|
||||
- Added cStatus::OsdStatusMessage2().
|
||||
|
@ -1,89 +1,73 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||
# $Id: Makefile 1.13 2006/09/09 12:38:35 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
# By default the main source file also carries this name.
|
||||
|
||||
#
|
||||
PLUGIN = status
|
||||
|
||||
### The version number of this plugin (taken from the main source file):
|
||||
|
||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||
|
||||
### The C++ compiler and options:
|
||||
|
||||
CXX ?= g++
|
||||
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual
|
||||
|
||||
### The directory environment:
|
||||
|
||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||
PKG_CONFIG ?= pkg-config
|
||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
||||
LIBDIR = $(call PKGCFG,libdir)
|
||||
PLGCFG = $(call PKGCFG,plgcfg)
|
||||
#
|
||||
TMPDIR ?= /tmp
|
||||
|
||||
### The compiler options:
|
||||
|
||||
export CFLAGS = $(call PKGCFG,cflags)
|
||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
||||
|
||||
### The version number of VDR's plugin API:
|
||||
|
||||
APIVERSION = $(call PKGCFG,apiversion)
|
||||
VDRDIR = ../../..
|
||||
LIBDIR = ../../lib
|
||||
TMPDIR = /tmp
|
||||
|
||||
### Allow user defined options to overwrite defaults:
|
||||
|
||||
-include $(PLGCFG)
|
||||
-include $(VDRDIR)/Make.config
|
||||
|
||||
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||
|
||||
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||
|
||||
### The name of the distribution archive:
|
||||
|
||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||
PACKAGE = vdr-$(ARCHIVE)
|
||||
|
||||
### The name of the shared object file:
|
||||
|
||||
SOFILE = libvdr-$(PLUGIN).so
|
||||
|
||||
### Includes and Defines (add further entries here):
|
||||
|
||||
INCLUDES +=
|
||||
INCLUDES += -I$(VDRDIR)/include
|
||||
|
||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
|
||||
### The object files (add further files here):
|
||||
|
||||
OBJS = $(PLUGIN).o
|
||||
|
||||
### The main target:
|
||||
|
||||
all: $(SOFILE)
|
||||
|
||||
### Implicit rules:
|
||||
|
||||
%.o: %.c
|
||||
@echo CC $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||
|
||||
### Dependencies:
|
||||
# Dependencies:
|
||||
|
||||
MAKEDEP = $(CXX) -MM -MG
|
||||
MAKEDEP = g++ -MM -MG
|
||||
DEPFILE = .dependencies
|
||||
$(DEPFILE): Makefile
|
||||
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
|
||||
-include $(DEPFILE)
|
||||
|
||||
### Targets:
|
||||
|
||||
$(SOFILE): $(OBJS)
|
||||
@echo LD $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
||||
all: libvdr-$(PLUGIN).so
|
||||
|
||||
install-lib: $(SOFILE)
|
||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
||||
|
||||
install: install-lib
|
||||
libvdr-$(PLUGIN).so: $(OBJS)
|
||||
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
|
||||
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||
|
||||
dist: clean
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
|
@ -1,15 +1,11 @@
|
||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||
|
||||
Written by: Klaus Schmidinger <vdr@tvdr.de>
|
||||
Written by: Klaus Schmidinger <kls@cadsoft.de>
|
||||
|
||||
Project's homepage: https://www.tvdr.de
|
||||
Project's homepage: www.cadsoft.de/people/kls/vdr
|
||||
|
||||
Latest version available at: https://www.tvdr.de
|
||||
Latest version available at: www.cadsoft.de/people/kls/vdr/software.htm
|
||||
|
||||
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.
|
||||
See the file COPYING for more information.
|
||||
See the file COPYING for license information.
|
||||
|
||||
Description: This is an example that shows the use of cStatus.
|
||||
|
@ -3,13 +3,13 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: status.c 5.4 2025/02/12 21:18:53 kls Exp $
|
||||
* $Id: status.c 1.8 2005/12/31 15:19:45 kls Exp $
|
||||
*/
|
||||
|
||||
#include <vdr/plugin.h>
|
||||
#include <vdr/status.h>
|
||||
|
||||
static const char *VERSION = "2.6.1";
|
||||
static const char *VERSION = "0.2.0";
|
||||
static const char *DESCRIPTION = "Status monitor test";
|
||||
static const char *MAINMENUENTRY = NULL;
|
||||
|
||||
@ -17,33 +17,23 @@ static const char *MAINMENUENTRY = NULL;
|
||||
|
||||
class cStatusTest : public cStatus {
|
||||
protected:
|
||||
virtual void TimerChange(const cTimer *Timer, eTimerChange Change);
|
||||
virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber, bool LiveView);
|
||||
virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber);
|
||||
virtual void Recording(const cDevice *Device, const char *Name, const char *FileName, bool On);
|
||||
virtual void Replaying(const cControl *Control, const char *Name, const char *FileName, bool On);
|
||||
virtual void SetVolume(int Volume, bool Absolute);
|
||||
virtual void SetAudioTrack(int Index, const char * const *Tracks);
|
||||
virtual void SetAudioChannel(int AudioChannel);
|
||||
virtual void SetSubtitleTrack(int Index, const char * const *Tracks);
|
||||
virtual void OsdClear(void);
|
||||
virtual void OsdTitle(const char *Title);
|
||||
virtual void OsdStatusMessage2(eMessageType Type, const char *Message);
|
||||
virtual void OsdStatusMessage(const char *Message);
|
||||
virtual void OsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue);
|
||||
virtual void OsdItem2(const char *Text, int Index, bool Selectable);
|
||||
virtual void OsdCurrentItem2(const char *Text, int Index);
|
||||
virtual void OsdCurrentItem(const char *Text);
|
||||
virtual void OsdTextItem(const char *Text, bool Scroll);
|
||||
virtual void OsdChannel(const char *Text);
|
||||
virtual void OsdProgramme(time_t PresentTime, const char *PresentTitle, const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, const char *FollowingSubtitle);
|
||||
};
|
||||
|
||||
void cStatusTest::TimerChange(const cTimer *Timer, eTimerChange Change)
|
||||
void cStatusTest::ChannelSwitch(const cDevice *Device, int ChannelNumber)
|
||||
{
|
||||
dsyslog("status: cStatusTest::TimerChange %s %d", Timer ? *Timer->ToText(true) : "-", Change);
|
||||
}
|
||||
|
||||
void cStatusTest::ChannelSwitch(const cDevice *Device, int ChannelNumber, bool LiveView)
|
||||
{
|
||||
dsyslog("status: cStatusTest::ChannelSwitch %d %d %d", Device->CardIndex(), ChannelNumber, LiveView);
|
||||
dsyslog("status: cStatusTest::ChannelSwitch %d %d", Device->CardIndex(), ChannelNumber);
|
||||
}
|
||||
|
||||
void cStatusTest::Recording(const cDevice *Device, const char *Name, const char *FileName, bool On)
|
||||
@ -61,21 +51,6 @@ void cStatusTest::SetVolume(int Volume, bool Absolute)
|
||||
dsyslog("status: cStatusTest::SetVolume %d %d", Volume, Absolute);
|
||||
}
|
||||
|
||||
void cStatusTest::SetAudioTrack(int Index, const char * const *Tracks)
|
||||
{
|
||||
dsyslog("status: cStatusTest::SetAudioTrack %d %s", Index, Tracks[Index]);
|
||||
}
|
||||
|
||||
void cStatusTest::SetAudioChannel(int AudioChannel)
|
||||
{
|
||||
dsyslog("status: cStatusTest::SetAudioChannel %d", AudioChannel);
|
||||
}
|
||||
|
||||
void cStatusTest::SetSubtitleTrack(int Index, const char * const *Tracks)
|
||||
{
|
||||
dsyslog("status: cStatusTest::SetSubtitleTrack %d %s", Index, Tracks[Index]);
|
||||
}
|
||||
|
||||
void cStatusTest::OsdClear(void)
|
||||
{
|
||||
dsyslog("status: cStatusTest::OsdClear");
|
||||
@ -86,9 +61,9 @@ void cStatusTest::OsdTitle(const char *Title)
|
||||
dsyslog("status: cStatusTest::OsdTitle '%s'", Title);
|
||||
}
|
||||
|
||||
void cStatusTest::OsdStatusMessage2(eMessageType Type, const char *Message)
|
||||
void cStatusTest::OsdStatusMessage(const char *Message)
|
||||
{
|
||||
dsyslog("status: cStatusTest::OsdStatusMessage2 %d '%s'", Type, Message);
|
||||
dsyslog("status: cStatusTest::OsdStatusMessage '%s'", Message);
|
||||
}
|
||||
|
||||
void cStatusTest::OsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue)
|
||||
@ -96,14 +71,9 @@ void cStatusTest::OsdHelpKeys(const char *Red, const char *Green, const char *Ye
|
||||
dsyslog("status: cStatusTest::OsdHelpKeys %s - %s - %s - %s", Red, Green, Yellow, Blue);
|
||||
}
|
||||
|
||||
void cStatusTest::OsdItem2(const char *Text, int Index, bool Selected)
|
||||
void cStatusTest::OsdCurrentItem(const char *Text)
|
||||
{
|
||||
dsyslog("status: cStatusTest::OsdItem2 %s %d %d", Text, Index, Selected);
|
||||
}
|
||||
|
||||
void cStatusTest::OsdCurrentItem2(const char *Text, int Index)
|
||||
{
|
||||
dsyslog("status: cStatusTest::OsdCurrentItem %s %d", Text, Index);
|
||||
dsyslog("status: cStatusTest::OsdCurrentItem %s", Text);
|
||||
}
|
||||
|
||||
void cStatusTest::OsdTextItem(const char *Text, bool Scroll)
|
||||
|
@ -8,36 +8,3 @@ VDR Plugin 'svdrpdemo' Revision History
|
||||
2005-08-28: Version 0.0.2
|
||||
|
||||
- Removed unused MAINMENUENTRY.
|
||||
|
||||
2007-08-15: Version 0.0.3
|
||||
|
||||
- Moved the "all" target in the Makefile before the "Implicit rules",
|
||||
so that a plain "make" will compile everything.
|
||||
|
||||
2012-12-27: Version 0.0.4
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-01-12: Version 0.0.5
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-03-31: Version 2.0.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2014-01-01: Version 2.1.1
|
||||
|
||||
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
||||
|
||||
2015-02-19: Version 2.2.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2018-04-15: Version 2.4.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2021-12-27: Version 2.6.0
|
||||
|
||||
- Official release.
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user