Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Tvheadend can run isolated from other host processes in a Docker container. The official Tvheadend container can be pulled from the GitHub container repo:
There is also an established community container from the linuxserver.io team:
https://fleet.linuxserver.io/image?name=linuxserver/tvheadend
Community created and supported Tvheadend packages for Synology and QNAP users are available from community package repositories. See below for more information:
https://synocommunity.com/package/tvheadend
https://www.myqnap.org/product/tvheadend
Please note that General support issues with Tvheadend are welcome in our forum but installation issues with these packages are best directed to NAS vendor forums.
Tvheadend has physical and software considerations:
Intel compatible (i386/x86_64) or ARM (arm/aarch64) CPU
Minimum 1GB RAM
Minimum 1GB storage for app/configuration data
Large capacity storage for recordings
Tuner device(s) with suitable power and connectivity
Operating System that supports the tuners
Tvheadend is tested on Intel compatible i386/x86_64 CPUs and ARM SoC arm/aarch64 processors. It will need a minimum of 1GB disk space for application binaries and configuration data, although the total required will depend on the number and type of tuners you have, the number of channels received, the choice of programme guide data, etc.
Tvheadend is intended to be lightweight and will run in less than 1GB RAM on low-powered NAS and Single Board Computer devices. Many users run Tvheadend on older Raspberry Pi boards with 512MB physical RAM and perhaps only 256MB free memory: although more is sensible and will result in a better user experience. Note that transcoding is CPU intensive and this feature runs best on powerful multi-core systems.
Recordings consume large amounts of disk storage. SD quality MPEG2 video will typically use 1GB of disk per-hour, while higher-bitrate HD quality H264 will often consume 5GB+ per-hour. Most users who use Tvheadend to record will plan and provision their Tvheadend server with large capacity local HDD or remote-mounted NAS storage.
You will need one or more tuner devices to receive Cable, Satellite, or Terrestrial broadcast sources, or IP sources. Tuner options are discussed in more detail here.
Tvheadend is designed for use on Linux and we provide general purpose binary pacakges and Docker containers that can be used with a large range of Linux distributions and distro versions:
Debian derivatives (Debian, Raspberry Pi, Ubuntu, Mint, etc.)
RedHat derivatives (Fedora, RHEL)
Tvheadend is available as an installable add-on for the Kodi focussed distro LibreELEC
Users needing a more specific combination of Tvheadend capabilities can also compile their own binaries or build containers from our public source code.
Internet access is essential for installation and maintenance of Tvheadend, but is not essential during use. Tvheadend needs an accurate clock for EPG timers to work, but this can be synchronised from the broadcast signal if ntp
services are not available. Most broadcast services also provide some form of EPG data "over the air" alongside the broadcast signal.
Server hardware and perhaps tuner hardware will require power and physical access to a broadcast feed from aerial, dish, or cable; or via the LAN if you are using SAT>IP, network tuners, or IP sources.
Tvheadend can be run in a single-host configuration where the Tvheadend server runs on the same host as client software, e.g. Kodi, and with media recordings stored locally on the same disk. This is common with compact or lower-budget Tvheadend setups with a smaller number of tuners.
In a multi-host configuration Tvheadend runs on a dedicated server, with client software on a separate device. This allows a compact client device to sit alongside the TV while the Tvheadend server (usually a larger device with multiple tuners) is located somewhere else with convenient access to the physical aerial, dish or coax cables that provide input to your tuners
Tvheadend can be installed either as a VM (linux guest OS) or as an LXC container.
The TV tuner must be passed through to the VM/container
Host OS: Proxmox 8.3.1
Guest OS: Debian 12.8 (bookworm) amd64
Note: the TV tuner is passed through from the Host to Guest (PCI or USB pass through) - installation of the tuner is done on the VM/Guest OS
Install Debian as a VM with at least the minimum requirements - command-line only installs (without desktop environment) recommended to minimise resource usage
Update Debian to latest package versions with
Install Curl package to allow set up of Apt repository
Set up Apt repository - for DEB packages using Curl
Update Apt package list
Install Tvheadend
Passthrough TV tuner hardware to VM guest OS (this can be done through the proxmox web GUI)
Install the TV tuner on the VM guest OS
Access the Tvheadend web configuration interface at: https://<yourtvhserverip>:9981
Continue setup/configuration (in next section)
Host OS: Proxmox 8.3.1
Container Template (Guest OS): Debian 12 standard (12.2-1-amd64)
Note: the TV tuner is first installed on the Host OS (Proxmox) and then passed through to the LXC container (see below) - the pass through must be the whole enumerated device in /dev/dvb/adapter0/<files> and not /dev/usb or /dev/pci as the LXC does not have the kernel modules to install the device.
Set up an LXC container with at least the minimum requirements The Debian 12 standard LXC template can be downloaded from the Proxmox web GUI
Update Debian packages to latest version Note: a lot of packages will be updated as the Proxmox LXC template is quite old
Install Curl package to allow set up of Apt repository
Set up Apt repository - for DEB packages using Curl
Update Apt package list
Install Tvheadend
Passthrough TV tuner hardware to VM guest OS Passthrough all the devices files under /dev/dvb/adapter0/ Set UID=0 (root) and GID=44 (video) for all devices - GUI method: From web GUI, nagivate to container, resources, add, pass through - add the devices: /dev/dvb/adapter0/demux0 /dev/dvb/adapter0/dvr0 /dev/dvb/adapter0/frontend0 /dev/dvb/adapter0/net0 OR - Command-line method: Manually edit the LXC config file at: /etc/pve/lxc/<containerid>.conf Add in the following lines /dev/dvb/adapter0/demux0,gid=44,uid=0 /dev/dvb/adapter0/dvr0,gid=44,uid=0 /dev/dvb/adapter0/frontend0,gid=44,uid=0 /dev/dvb/adapter0/net0,gid=44,uid=0
Restart LXC container to allow passthrough
Access the Tvheadend web configuration interface at: https://<yourtvhserverip>:9981
Continue setup/configuration (in next section)
w_scan
is an external utility, not supplied with TVHeadEnd (TVH), that can scan for all available muxes and services.
If the default scan files provided with TVH are unable to locate the muxes or services that a user expects to see in their location, the output from w_scan
can also be used as a scan file for TVH.
The following command can be used to create a scan file called au-wscan
:
w_scan -f t -c AU -x > au-wscan
The explanation of every w_scan
parameter is beyond the scope of this document, however, the -x
parameter is required to produce the output format required by TVH.
Use w_scan -h
and w_scan -H
for a full list of parameters.
This file can be copied to the scan file location and once TVH has been restarted, used to scan for services.
Depending upon the exact installation of TVH, scan file can be found in various locations:
/usr/local/share/tvheadend/data/dvb-scan/
/usr/share/tvheadend/data/dvb-scan/
Please Note: depending upon the parameters used, w_scan
can take a very long time to perform a scan.
Tvheadend is operated primarily through a tabbed web interface. There are some basic navigation concepts that will help you use it effectively:
The web interface uses tabs with similar functions grouped together. Tabs for major configuration functions are located on the top row, with tabs for configuration items related to the currently selected major function located on the row below. In some cases a third row of config options will be shown.
Most tabs have display a menu bar with Add, Save, Edit, Undo functions and a spreadsheet-like grid below. Grid items are frequently editable.
Most configuration items are in this grid. However, some item-specific configuraiton is accessed through the Add and Edit dialog boxes. For example: the main network configuration tab grid covers parameters common to DVB-S, DVB-T, DVB-C and IPTV networks, but configuration like FEC rolloff or mux URL is only present in dialogs for networks that need these values.
Some columns are hidden. If you hover the mouse over a column heading a down-arrow will show, and when clicked a drop-down menu appears allowing you to select which columns are visible and which columns are hidden.
The drop-down menu also allows you to sort results. You can also sort columns by clicking on the column header: first click will sort ascending and a second click will reverse the sort (descending).
The same drop-down menu also allows you to filter results using basic string pattern matching.
Columns can be rearranged by dragging the column header to a new position.
Columns can be resized by dragging the edges of the column header to the width position required.
To edit a cell in the grid, double click on it and make changes. After a cell has been changed, a red flag or triangle appears in the top-left corner to indicate it has been changed. Changes can be kept (click Save) or discarded (click Undo).
To change a checkbox or radio button, click once.
To add a new entry press the Add button. The new (empty) entry will be shown in the interface but will not be stored in the server configuration until values are added, the configuration is marked as enabled, and then saved. Changes are applied when saved, not when edited.
Most grid views support ctrl+click to select multiple fields at the same time, and shift+click to select field ranges.
Tvheadend binary packages can be downloaded from https://apt.tvheadend.org or you can configure a local package repo to install and update from by running the following shell commands:
Run the following shell command to setup a local apt
repo:
Run the following shell command to setup a local dnf
or yum
repo:
Tvheadend aims to provide installable packages for as long as possible to extend the usable life of server and tuner hardware. In practice this means if we can still automate regular build testing for popular distributions and versions we will have binaries available.
Please refer to development documentation on compiling Tvheadend from source
Tvheadend documentation is authored and maintained by Tvheadend users. If you see something is incorrect or missing please click the GitBook link below to join our documentation team. The GitBook online app makes changing documentation simple, with changes sent directly to our documentation repo on GitHub as a pull-request that project staff can review and merge.
https://app.gitbook.com/invite/GUiJM9P5N3CkY42Hcs8P/7hmZSVRZkZqEIJarLFX5
* IMPORTANT *
Please do not be concerned about your English language skills when contributing changes to our documentation. It is easier for a native speaker to merge your content and then make corrections than to write everything themselves. And if there is no obvious place to put content (the current structure is sparse and incomplete) please create pages under the WIP section. It can be merged and moved later as the documentation structure evolves.
Tvheadend can generate a playlist of all your mapped services (channels). You can download it from the webui at http://<ip>:<port>/playlist
, e.g. http://192.168.0.2:9981/playlist
.
By default Tvheadend’s Play links are playlists, although not all players accept them (e.g. Media Player Classic Home Cinema). You can bypass this by removing the /play/
path from the url.
Yes, not all services are given a name by providers. These services are usually hidden for a reason and may be used for things like encrypted guide data for set-top boxes, interactive services, and so on. If you do not see any service names at all this may indicate an issue with your hardware or configuration.
This usually happens when Tvheadend is installed incorrectly. On Debian and Ubuntu systems check the web interface path /usr/share/tvheadend/src/webui/static/
exists and isn’t empty. On other distros the path may be different.
This is normally because they are not installed properly. Check syslog/dmesg (e.g. dmesg | grep dvb
) and see that you have startup messages that indicate whether or not the tuners have initialized properly. Similarly, check /dev/dvb
to see if the block device files used to communicate with the tuner have been created correctly?. The other major cause of this issue is when you run Tvheadend as a user that does not have permissions to access the tuners, e.g. not a member of the video group.
Tvheadend setup normally involves the following stages:
Ensure tuners are available for use
Install Tvheadend software
Create a network
Associate the network with tuners
Add manual muxes - if needed
Scan for services
Map services to channels
Watch TV channels!
If you use the packaged version of tvheadend, make sure that you use the debug version of tvheadend (with the debugging symbols). For debian/ubuntu these packages have -dbg suffix, for rpm packages, these symbols are in debuginfo rpm files.
If you're going to be regularly trying development versions of Tvheadend or need to report a crash or deadlock then you should really read this page!
If you are investigating problems within Tvheadend then its worth being familiar with tools such as gdb and valgrind or clang, although these are not covered here.
However one thing that can be useful in investigating crashes within Tvheadend is to ensure that coredumps are generated, this will allow post analysis in gdb without having to actual run Tvheadend within gdb.
You can enable temporarily by running:
To make this permanent put this somewhere in your shell environment setup (.bashrc, .profile, etc...) Firstly I'd recommend that if you're specifically trying to investigate an issue then you should consider running Tvheadend manually, rather than as a service, as documented below.
I'd strongly recommend that if you're specifically trying to investigate a crash or other problem in Tvheadend that you enable debugging:
-s will output debug info to syslog
--debug allows you to specify which subsystem to debug
--trace allows you to enable trace (more in-depth) logging on specific subsystems
You can also get Tvheadend to log to it's own file using:
You may also modify the debug settings using WEB GUI as admin - Configuration/Debugging. Note that the information is not saved, it is just set for run-time (current task).
Debug log path - filename to store log
Debug trace - enable traces
Debug subsystems - comma separated list of subsystems
Trace subsystems - comma separated list of subsystems
The traces must be compiled to the tvheadend binary (see below).
The following options can be passed to tvheadend to provide detailed debugging information while the application is running. Trace debugging has to be enabled at build time with--enable-debugging
and can be specified in a CLI command, e.g. tvheadend -u hts -g video --trace <module>
or in the web interface (Configuration -> Debugging).
Multiple options can be used, e.g. –-trace cwc,dvr,linuxdvb
In this case, the debug symbols are missing (look to the top of this page). Install the debug version of the tvheadend package.
You may run tvh in gdb directly using command:
Or attach gdb to the running process:
The 'continue' command will continue the execution of the program. If you need to break the execution and return to gdb, just use 'Ctrl-C'.
You may need to replace tvheadend with the full path to the binary and you will need to replace pid with the PID of the running process. To find that run:
Once you have gdb attached grab a stack trace from every thread using the following command:
Note: "set logging on" will cause GDB to write its output to a file, by default this will be gdb.txt in the current directory.
If you need to investigate some running problem you can always attach (see below) later and if you need to trap crashes, then you can configure your system to generate a core file and then retrospectively analyse this with gdb.
If you're running manually you should enable coredumps in your environment:
I'd recommend you enable this permanently by putting this command in your shell initialisation scripts (.bashrc etc..).
If you're running as a daemon then you should use the -D command line option, this will enable coredumps from the daemon. If you start using sysvinit, upstart etc... then you will need to put this in the configuration file, e.g.:
Finally it's probably worth changing the coredump file format, personally I use the following configuration:
Or put the following in /etc/sysctl.conf:
If you're using a system like Ubuntu that uses apport (and cripples the ability to change the core format) just set core_uses_pid=1 instead.
Note: coredumps are (by default) stored in the current working directory, to make it possible for the daemon to write files the current working directory is set to /tmp when using -D, so check there for core files.
To verify that you have everything configured properly you can use the -A option to force a crash on startup. Do this from the command line or add to /etc/default/tvheadend:
Note: remember to remove the option after you've tested it!
Once you have a core file you can start up gdb with that coredump, just as if you'd caught the crash while running under gdb:
You may need to replace tvheadend and core above with the proper paths.
For most crashes the most useful information is the back trace, this will provide a stack trace showing where the code crashed and the stack information at the time of the crash:
Note: "set logging on" will cause GDB to write its output to a file, by default this will be gdb.txt in the current directory.
However I'd strongly recommend that you keep a copy of tvheadend binary and core file in case further analysis is required.
If Tvheadend appears to die but the process is still running, then its quite possible that the process is deadlocked (or possibly live locked).
Use '--thrdebug 1' as the command line option. The deadlock will be printed to the tvheadend's configuration directory to file mutex-deadlock.txt and to the standard task error output (so you can see it through the systemctl service log for example).
The best way to help investigate such a problem is to get a full stack trace from every thread in the system.
First attach gdb to the running process:
The 'continue' command will continue the execution of the program. If you need to break the execution and return to gdb, just use 'Ctrl-C'.
You may need to replace tvheadend with the full path to the binary and you will need to replace pid with the PID of the running process. To find that run:
Once you have gdb attached grab a stack trace from every thread using the following command:
Note: "set logging on" will cause GDB to write its output to a file, by default this will be gdb.txt in the current directory.
It might also be useful to generate a core file for good measure:
This information may give an indication as to why things are locked, often 2 threads are stuck trying to lock a mutex (probably each holds the opposite lock).
If you're going to report a crash (or lockup) then please try to provide the above information, including a debug log (or whatever logging you have), a core file and the tvheadend binary and basic information about the platform (distribution, version and architecture) you're running on.
It may be really difficult to track these problems. There are basically two tools which may help to discover the memory leaks or memory corruptions.
It is very slow, but it may be useable for things which are triggered everytime:
There is address and leak sanitizer in the clang toolkit.
The clang / llvm tools are usually split to multiple packages, here is list of required packages for Fedora 26:
The binary must be rebuild using the clang compiler and libraries:
Example build script (build_with_clang.sh):
Make sure to make your script executable.
If you do not see resolved the function names like:
get the correct path for the llvm-symbolizer, i.e. with
then make sure that you set the external symbolizer like:
The error log should be like:
The code blocks are protected using mutexes. Tvheadend has the debug interface to show locks which took too much time now (latest 4.3 code). Use '--thrdebug 10020' where 20 means 20 millisecond threshold to show the problematic mutexes. The output is printed to standard error file descriptor (stderr) by default. If you run tvheadend using systemctl or initd, you may send those messages to a UDP port. Set the TVHEADEND_RTLOG_UDP_PORT environment variable like:
The result should look like:
Before you install Tvheadend software you need to have a working tuner device. There are four types of tuner hardware that Tvheadend can use:
Internal PCI/PCIe tuners
Internal i2s tuners
External USB tuners
Network tuners
IP sources can also be used. These are discussed elsewhere in our documentation.
Internal PCI/PCIe tuner cards require support for the tuner in the host OS. Most cards require a driver and separate firmware to work. Some cards will be supported through drivers and firmware available in the upstream Linux kernel and will be able to run on any current Linux distro and version. Other cards require downstream/vendor drivers and these may dictate which distro and version must be used to have support. How to install the right drivers and firmware for your hardware is beyond the scope of this guide so please follow the instructions of the tuner card manufacturer.
Tvheadend can do nothing if tuners are not installed working properly. If you have problems, most original card manufacturers (but not cheap clone-card manufacturers) have active forums where you can report issues and ask for assistance.
Internal i2s tuners are normally found in Android or Linux set-top box devices with the required drivers and firmware embedded in the OS image that runs on the device. In theory this means the box requires no hardware setup: which is appealing to users. In practice you may need to update the device to the lastest available firmware to ensure best performance, and client software options may be limited to specific pre-installed or embedded versions of popular apps.
Firmware update options for Android set-top boxes are often limited. If you have problems with internal i2s tuners the original box manufacturer must resolve them.
External USB tuners are often cheap, work well, and are well-matched to smaller boards and boxes that lack internal PCI slots. However, most USB tuners need more than 500mA so will need external direct power or an external USB hub that supports higher current loads to work properly. Bandwidth can also be a problem and even fast USB3 ports can experience bandwidth problems with mulitple USB devices chained from a single port (and USB bus).
Raspberry Pi 0/1/2/3/4 boards internally share USB bus bandwidth with Ethernet. Multiple USB tuner configs and higher-bandwidth HD streams often run into bandwidth issues.
External network tuners (SAT>IP devices and similar) cost more than internal PCI/PCIe cards and USB devices but are the firm recommendation of the project team: they are easier to configure and require no fiddling with Linux kernel drivers/firmware to create and maintain a working and reliable system.
The extra up-front cost is saved over time with easier maintenance, and the devices typically have excellent and long-term support from their manufacturers.
added comment field to addDvrEntry, updateDvrEntry, autorecEntryAdd, autorecEntryUpdate, timerecEntryAdd, timerecEntryUpdate
added full UUID to channelAdd, tagAdd and dvrEntryAdd
added ratingAuthority and ratingCountry to dvrEntryAdd and eventAdd
added DVR configuration UUID to dvrEntryAdd, dvrEntryUpdate, autorecEntryAdd, autorecEntryUpdate, timerecEntryAdd, timerecEntryUpdate
added broadcast type to autorec DVR entry
added service provider name to channelAdd -> services
added ratingLabel to EPG & DVR entries
added ratingIcon to EPG & DVR entries
added ageRating to DVR entries
TODO
added updateAutorecEntry and updateTimerecEntry
(and other changes not yet documented here)
added descrambleInfo (not yet documented here)
extended addDvrEntry, updateDvrEntry, dvrEntryAdd method
added enabled
extended getSysTime
added gmtoffset
extended updateDvrEntry method
added channelId
dvrEntry structures
added files msg (multiple files) to the files field
added dataSize field to show actual (last) file size in dvrEntry updates
epg events - added subtitle field
dvrEntry structures
added subscriptionError, streamErrors, dataErrors fields
added subtitle fields
autorecEntry structures
added dupDetect and fulltext fields
added errors fields to the stream status
added satpos to the subscription start
added subscriptionError field to subscriptionStatus server-to-client method
autorec/timerec structures
added directory field (forced output directory)
added enabled field
added addTimerecEntry, deleteTimerecEntry methods
added timerecEntryAdd, timerecEntryUpdate, timerecEntryDelete server-to-client methods
extended addAutorecEntry method
added start/startWindow/name fields
added owner/creator fields
obsoleted creator field
extended dvrEntryAdd, dvrEntryUpdate
added timerecId field
added owner/creator fields
extended addAutorecEntry, deleteAutorecEntry methods
added start/startWindow fields
obsoleted approxTime
added name/owner/creator fields
extended autorecEntryAdd, autorecEntryUpdate server-to-client methods
fields like for addAutorecEntry
extended getTag method
added tagIndex field
extended subscriptionStart server-to-client method
added meta field
changed H264 meta data handling (codec meta data are in the meta field only in start message)
VORBIS and AAC codecs have codec specific meta data in the meta field in start message
changed subscribe method
the normts is always active and the parameter is ignored
added getProfiles, getDvrConfigs methods
removed getCodecs methods
extended subscribe method
add profile field
extended channelAdd, channelUpdate server-to-client methods
the channelIcon URL can be relative 'imagecache/%d' or '/imagecache/%d'
extended getChannel method
the channelIcon URL can be relative 'imagecache/%d' or '/imagecache/%d'
added getChannel method
added addAutorecEntry method
added deleteAutorecEntry method
added autorecEntryAdd, autorecEntryUpdate, autorecEntryDelete server-to-client methods
extended channelAdd server-to-client method
added channelNumberMinor (for {major}.{minor} channel numbers)
extended dvrEntryAdd and dvrEntryUpdate server-to-client methods
added eventId, autorecId, startExtra, stopExtra, retention, priority, contentType fields
extended addDvrEntry method
added retention
extended updateDvrEntry method
added retention, priority
extended epgQuery method
added minduration, maxduration
added subscriptionGrace server-to-client method
added subscriptionFilterStream method
added getDvrCutpoints method
added audio_type in the subscriptionStart server-to-client method
added getCodecs method
It helps to understand the basic software concepts for Tvheadend:
Tuner is the chipset/hardware needed to interpret a digital television signal and extract from it the programme stream. Tuner hardware is also responsible for communicating with your satellite dish via the LNB when using DVB-S.
Driver is software the operating system uses to talk to the tuner hardware. It can be built into the operating system, or might be something you need install, or even compile, separately.
Firmware is binary microcode that the driver sends to the tuner on initialisation. Card firmware is closed-source software and can be a common cause of problems.
Network is a software definition of your carrier network that tells tuner hardware how and where to look for a signal, e.g. the network defines a such as DVB-T or DVB-S2, and how it is scanned, where the DVB-S satellite is in orbit, and similar.
Muxes are channel frequencies that transmit multiple digital channel signals in the radio frequency space of a single analogue channel. Digitial signals are multiplexed (muxed) together to allow more channels to be broadcast.
Services are the individual data streams on a Mux. They can be TV or Radio programmes, or they can provide data services such as digital teletext or catch-up IPTV services.
Channels are mapped against Services. Channels are what client software access when users think “I’d like to watch BBC One now, please”.
Each configuration component supports many-to-many relationships: meaning one component can be related to multiple components of the next type, and vice versa, e.g. one tuner can support multiple networks and one network can exist on multiple tuners.
The following diagram explains the relationship between these components:
Simply, because 'BBC One' probably exists in multiple different places. It has regional variations on multiple frequencies (different services on different muxes) and if often accessible through more than one piece of hardware (two satellite tuners, or one satellite and one terrestrial tuner). When you select a channel to watch or record, Tvheadend needs to know the mapped path to the right service on the right mux .. to ask the right tuner to get the signal for you.
This tab shows all finished recordings:
The following functions are available:
Delete
Delete the selected finished recording records and associated files. You will be prompted for confirmation.
Download
Download the selected finished recordings to local disk. You will be prompted to select the path for the saved file(s).
Help
Display this help page.
The main grid items have the following functions:
Details: Shows the status of the recording event:
The recording has completed
Click to display detailed information about the selected recording
The detailed information dialog is as follows:
The columns also provide the following details:
Play: Play the selected recording in your browser via the VLC Plugin or some other external player.
Title: The title of the recording.
Subtitle: Text…
Episode: The episode number of the record.
Scheduled Start Time: The date and time when the recording was started.
Scheduled Stop Time: The date and time when the recording was stopped.
Duration: The total duration of the recording.
File Size: The size of the recording file on disk.
Channel Name: The name of the channel from which the recording was made.
Owner: Text…
Creator: The name of the user who created the recording.
DVR Configuration : The DVR configuration to be used for this recording.
Schedule Status : The status of the recording (completed.
Errors : Text…
Data Errors : Text…
URL : The URL of the recording.
Comment : Text…
The date and time are shown in many places within the Web User Interface. In most places, the format used is based on the default setting of your Browser and Operating System.
If, for example, the date/time format in your 'Upcoming Recordings' looks something like, 'Fri, 02/08/2024 14:05:00' and you wish to shorten it to something like 'Fri, 02-Aug 14:05', you can do the following:
In the WebUI, navigate to Configuration -> General -> Base.
Ensure that your 'Default view level' is set to at least 'Advanced'.
In the 'Web Interface Settings' panel, the 'Custom date Format' field can be used to override the default date/time format by adding:
%ddd, %dd-%MMM %hh:%mm
Reload your bowser window for this change to be applied.
The following is a list of available formatting code options:
Scan files are used by TVHeadEnd (TVH) during the setup process to create muxes and scan for services available on those muxes. An excerpt from a scan file may look like this:
[CHANNEL]
DELIVERY_SYSTEM = DVBT
FREQUENCY = 226500000
BANDWIDTH_HZ = 7000000
CODE_RATE_HP = AUTO
CODE_RATE_LP = AUTO
MODULATION = QAM/64
TRANSMISSION_MODE = 8K
GUARD_INTERVAL = 1/16
HIERARCHY = NONE
INVERSION = AUTO
The location of the scan files may vary based upon the TVH version.
/usr/local/share/tvheadend/data/dvb-scan/
/usr/share/tvheadend/data/dvb-scan/
Depending on the value of the DELIVERY_SYSTEM
, TVH recognises the following parameters.
The following values are accepted for the parameter fields. Please note that an 'accepted' value may not always be processed.
NONE, DVB-C, DVBC/ANNEX_A, DVBC_ANNEX_A, ATSC-C, CableCARD, DVBC/ANNEX_B, DVBC_ANNEX_B, DVB-C/ANNEX-C, DVBC/ANNEX_C, DVBC_ANNEX_C, DVBC_ANNEX_AC, DVB-T, DVBT, DVB-T2, DVBT2, DVB-S, DVBS, DVB-S2, DVBS2, DVB-H, DVBH, ISDB-T, ISDBT, ISDB-S, ISDBS, ISDB-C, ISDBC, ATSC-T, ATSC, ATSCM-H, ATSCMH, DTMB, DMBTH, CMMB, DAB, DSS, TURBO.
Frequency in hertz.
(Bandwidth in hertz) 1700000, 5000000, 6000000, 7000000, 8000000, 10000000.
1/2, 1/3, 1/4, 1/5, 2/3, 2/5, 2/9, 3/4, 3/5, 4/5, 4/15, 5/6, 5/9, 6/7, 7/8, 7/9, 7/15, 8/9, 8/15, 9/10, 9/20, 11/15, 11/20, 11/45, 13/18, 13/45, 14/45, 23/36, 25/36, 26/45, 28/45, 29/45, 31/45, 32/45, 77/90.
NONE, AUTO, QPSK, QAM4NR, QAM/AUTO, QAM-AUTO, QAM/16, QAM16, QAM/32, QAM32, QAM/64, QAM64, QAM/128, QAM128, QAM/256, QAM256, QAM/1024, QAM1024, QAM/4096, QAM4096,VSB/8, 8VSB, VSB/16, 16VSB, PSK/8, 8PSK, DQPSK, BPSK, BPSK-S, 16APSK, 32APSK, 64APSK, 128APSK, 256APSK,8APSK-L, 16APSK-L, 32APSK-L, 64APSK-L, 128APSK-L, 256APSK-L.
NONE, AUTO, 1k, 2k, 8k, 4k, 16k, 32k, C1, C3780.
NONE, AUTO, 1/4, 1/8, 1/32, 1/16, 1/128, 19/128, 19/256, PN420, PN595, PN945.
NONE, AUTO, 1, 2, 4.
NONE, AUTO, ON, OFF.
5, 10, 15, 20, 25, 35.
NONE, AUTO, ON, OFF.
(Physical Layer Scrambling) ROOT, GOLD, COMBO.
V, H, L, R, O.
Message Structure
A message can be of either map or list type. In a map each field has a name, in a list the members do not have names, but the order should be preserved.
The field types are:
All in all the message structure is quite similar to JSON but most notably; no boolean nor null type exist and HTSMSG supports binary objects.
The binary format is designed to for back-to-back transmission of messages over a network (TCP) connection.
The root message must always be of type map.
The data is repeated HTSMSG-Fields exactly as the root body. Note the subtle difference in that for the root-message the length includes the 4 bytes of length field itself whereas in the field encoding the length written includes just the actual payload.
Integers are encoded using a very simple variable length encoding. All leading bytes that are 0 is discarded. So to encode the value 100, datalength should be 1 and the data itself should be just one byte [0x64]. To encode 1337; datalength=2, data=[0x39 0x05].
Note that there is no sign extension in this encoding scheme so if you need to encode -1 you need to set datalength=8 and data = [0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff]. This can certainly be thought of as a bug, but it is the way it is.
Datalength should be the length of the string (NOT including the null terminating character). Thus the null terminator should not be present in data either.
Datalength should be the length of the binary object. Data is the binary object itself.
This communication is currently implemented by using htsmsg's. All strings are encoded as UTF-8.
There are two distinct ways for communication within HTSP.
Apart from this there is a number of messages that needs to be exchanged during login, see the login section below.
There is a normal RPC way of doing things. I.e. the client sends a request and the server responds with a reply. All the RPC methods are listed below as the 'Client to Server' methods. Apart from all message fields listed within each message type the client can add an additional field:
RPC request extra fields:
The followings field should be used by the client to match the reply with the request. All replies are guaranteed to arrive in the same order as the requests. Even so, probably the best way to implement the request-reply client is by taking advantage of the 'seq' field.
RPC reply extra fields:
For streaming of live TV and various related messages the server will continuously push data to the client. These messages are referred to as asynchronous messages and always have the 'method' field set and never have the 'seq' field set. Also, the client can enable an additional asyncMetadata mode and by doing so it will be notified by the server when meta data changes. (EPG updates, creation of channels and tags, etc).
In Tvheadend, each method has an associated access restriction. Currently there is only one restriction (Streaming). However, this may change in the future.
Privileges for these restrictions may be granted in two ways: Username + Password and/or Source IP address. Therefore it is possible to gain permissions to the system without entering a username and password. While this is really useful it also complicates the authentication schema a bit. Upon connect the initial privileges will be raised based on the source address.
Before any username / password based authentication has taken place the client must have obtained a challenge (which stays fixed for the session). This is done via the 'hello' method.
In principle it's possible to use two different authentication idioms with HTSP. Depending on how your application works one or another may be more suitable. While they do not really differ from a protocol point of view it's worth mentioning a bit about them here:
The client performs all of its authentication using the 'login' method.
It may choose to send:
Username and password: Privileges will be raised based on these credentials.
Username only: Privileges will be based on just the source address. The username will be used for various logging purposes.
Nothing: Privileges will be based on just the source address.
If no privileges are granted after the login message has been received by the server (i.e. both network and username + password based) the server will reply with 'noaccess' set to 1. A client that only employs initial login should honor this flag and ask the user for a username + password and retry by using the 'authenticate' method. I.e. it should not send the 'login' method again.
The client performs all of its authentication when it needs to.
When using this method, the client will check every RPC reply for the 'noaccess' field. If it set to 1 it whould ask the user for username + password and retry the request but also add 'username' and 'digest' to the original message. (See RPC request extra fields above)
Typically it would not send a username or digest during login.
HTSP is a TCP based protocol primarily intended for streaming of live TV and related meta data such as channels, group of channels (called tags in HTSP) and electronic program guide (EPG) information.
The transmission and reception of a channel over HTSP is referred to as a subscription. A single HTSP session can handle as many concurrent subscriptions as the bandwidth and CPU permits.
The HTSP server in tvheadend has a payload-aware scheduler for prioritizing more important packets (such as I-frames) before less important ones (such as B-frames). This makes HTSP suitable for long-distance transmissions and/or paths with non-perfect delivery. (It has been tested with a server in Stockholm and the client in Berlin).
For information about the HTSP wire format please refer to the following page: .
If you're looking to develop a new client, there are several existing client implementations from which you might be able to gain knowledge:
(This is a demo client and is WIP, it has limited functionality).
If you prefer to build Tvheadend from source, tarballs and
A new channel has been created on the server.
Message fields:
Service fields:
Same as channelAdd, but all fields (except channelId) are optional.
A channel has been deleted on the server.
Message fields:
A new tag has been created on the server.
Message fields:
Same as tagAdd, but all fields (except tagId) are optional.
A tag has been deleted from the server.
Message fields:
(Added in version 4)
A new recording has been created on the server.
Message fields:
Valid values for state:
Valid values for subscriptionError:
Message fields:
(Added in version 4)
A recording has been deleted from the server.
Message fields:
(Added in version 13)
A new autorec recording has been created on the server.
Message fields:
(Added in version 13)
Message fields:
Message fields:
(Added in version 18)
A new autorec recording has been created on the server.
Message fields:
(Added in version 18)
Message fields:
(Added in version 18)
Message fields:
(Added in version 6)
Message fields:
*contentType previously had the major DVB category in the bottom 4 bits, however in v6 this has been changed to properly match DVB, so top 4 bits as major category and bottom 4 bits has sub-category. Clients requesting v5 or lower will get the old output.
(Added in version 6)
Message fields:
(Added in version 6)
Message fields:
(Added in version 2)
Sent after all the initial metadata has been sent when session has been set to async mode.
Message fields:
Asynchronous message output when a new subscription is successfully started.
Message fields:
Stream message fields:
Sourceinfo message fields:
Video Stream types:
Audio Stream types:
Subtitle Stream types:
Notifies client about the grace timeout (timeout for stream activation). It can be issues multiple times. For example a configuration with satellite rotors requires more than 120 seconds to tune, so users should be notified..
Message fields:
A subscription has been stopped.
Message fields:
Valid values for subscriptionError:
(Added in version 9)
A subscription has been skipped.
Message fields:
(Added in version 9)
A subscription's playback speed has changed.
This can happen even without a speed request, should playback reach either end of the buffer.
Message fields:
Subscription status update.
Message fields:
Valid values for subscriptionError:
The queueStatus message is sent every second during normal data delivery.
The transmit scheduler have different drop thresholds for different frame types.
If congestion occurs it will favor dropping B-frames before P-frames before I-frames. All audio is recognized as I-frames.
Message fields:
The signalStatus message is sent every second during normal data delivery.
The optional fields may not have been implemented or may not be supported by the active adapter.
Message fields:
Provide status every second about the timeshift buffer.
Message fields:
Streaming data.
Message fields:
Tvheadend has a built-in Electronic Program Guide (EPG). This is an in-memory database populated with information received over-the-air from DVB networks or from external XMLTV grabbers.
The EPG tab displays a filterable grid containing all events, sorted on start time:
The following functions are available:
The EPG tool bar shows five input fields which are used to filter/search events. The form uses implicit AND between input fields. This means all filters must match for an event to be displayed.
Title, Channel, Tag and Content Type are dependent on your configuration and on what your broadcaster sends. Options for the Duration are as follows:
For example: if you only want to see Movies from available HD channels you would select ‘HDTV’ in the [Filter tag…] field, and select ‘Movie / Drama’ in the [Filter content type…] field. You could then further limit the search to programmes between 1.5 - 3 hours by selecting ‘01:30:01 to 03:00:00’ in the [Filter duration…] field.
The grid updates dynamically as you change filters. You do not need to press a ‘Search’ button.
You can clear a filter by deleting its contents or by selecting ‘(Clear filter)’ on all filter fields except the Title filter. To clean all filters, press the [Reset All] button.
The following buttons are also available:
The main grid items have the following functions:
Details: Displays the current status of a recording event for the selected programme
Progress : A bar graph display of how far through a programme we currently are.
Title: The programme main title. You can automatically set a filter to the value of this field by clicking on it (e.g. click on ‘Daily News’ will automatically filter the whole grid to only show programmes with the same name).
SubTitle: The programme minor title or subtitle if included with EPG data. Some providers use this for a programme synopsis and not a true subtitle.
Episode: Episode number, if given by your EPG provider.
Start Time: The scheduled start time of the programme.
End Time: The scheduled end time of the programme.
Duration: The scheduled duration (i.e. start time to end time) of the programme.
Number: The channel number of the broadcasting channel, if defined.
Channel: The name of the broadcasting channel. You can automatically set a filter to the value of this field by clicking on it (e.g. click on ‘Channel 4 HD’ will automatically filter the whole grid to only show programmes from that channel).
Stars: Rating (in stars) of the programme.
Age: Age rating of the programme.
Content Type : Any content/genre information as provided by the EPG provider. You can automatically set a filter to the value of this field by clicking on it (e.g. click on ‘Movie/Drama’ will automatically filter the whole grid to only show programmes of the same type).
If you click on a single event, a popup displays detailed information. You can schedule the event for recording by clicking on the [Record program] button. If the EPG provider includes series-link data the [Record series] button allows you to schedule recording of all entries in the series.
For events without any series link information, an [Autorec] button will be provided to create a pseudo-series link using the autorec feature.
When scheduling recording you can choose the DVR profile used for the recording or autorec rule. This will normally show (default) but you can define different profiles in the Configuration -> Recording -> Digital Video Recorder tab. Profiles allow you to set, e.g. post-broadcast padding to accomodate a channel that always runs late, or a post-processing command to strip adverts from recordings made from a commercial channel.
The [Search IMDB] button runs a search against the programme title on on imdb.com, and [Play program] button. This downloads am XSPT or M3U playlist file (depending on startup options) and if your Operating System is correctly configured this will launch an appropriate player application. If not you will need to manually open (double-click) the playlist file to start watching.
Clock on the [X] window button (top-right) to close the popup. The popup is not modal and will remain open and visible. You can open multiple detailed information popups at the same time.
To record all events matching a specific search query, e.g. to record a favourite show every week, press the [Create AutoRec] button in the top toolbar. A popup with details on the to-be-created "autorec" rule will be shown. To enable the rule, confirm it by clicking the [Yes] button.
Autorec rules are listed in the Digital Video Recorder tab. Edit the rule list if you want to temporarily disable an autorecording or make adjustments to the channel, tag, or similar rule criteria.
Clicking the [Watch TV] button will open an HTML5 player pop-up where you can select the channel to open and stream profile to use. A transcoding stream profile is required to transcode the stream to a format that is supported by your browser, as browsers only support certain formats and codecs.
Used to identify the client toward the server and to get the session challenge used to hash passwords into digests. The client can request a different version of the HTSP protocol with this method. If no 'hello' message is sent the server assumes latest version is to be used.
Client/Server should select lowest common version, if this is not possible connection should be terminated.
Request message fields:
Reply message fields:
Note: possible values for servercapability[]:
This can be used to issue authentication without doing anything else. If no privileges are gained it will return with 'noaccess' set to 1.
Request message fields:
Reply message fields:
(Added in version 24)
This is a proxy to HTTP API.
Request message fields:
Reply message fields:
(Added in version 3)
Return diskspace status from Tvheadend's PVR storage
Request message fields:
Reply message fields:
(Added in version 3)
Return system time on the server.
Request message fields:
Reply message fields:
When this is enabled the client will get continuous updates from the server about added, update or deleted channels, tags, dvr and epg entries.
An interactive application that presents the user with information about these things should probably enable this and the implement the various server to client methods.
Request message fields:
Reply message fields:
Once the reply as been sent the initial data set will be provided, and then updates will arrive asynchronously after that. The initial data dump is sent using the following messages:
(Added in version 14)
Request information about the given channel.
Request message fields:
Reply message fields:
Request information about the given event. An event typically corresponds to a program on a channel.
The language field in the request allows preference for languages to be requested for the various string fields.
Request message fields:
Reply message fields:
(Added in version 4)
Request information about a set of events. If no options are specified the entire EPG database will be returned.
Request message fields:
Reply message fields:
(Added in version 4)
Query the EPG (event titles) and optionally restrict to channel/tag/content type.
Request message fields:
Reply message fields:
if full == 1
else
Get detailed EPG Object info.
Request message fields:
Reply message fields:
(Added in version 16)
Return a list of DVR configurations.
Reply message fields:
Message fields:
(Added in version 4)
Create a new DVR entry. Either eventId or channelId, start and stop must be specified.
Request message fields:
Reply message fields:
(Added in version 5)
Update an existing DVR entry.
Request message fields:
Reply message fields:
(Added in version 5)
Cancel an existing recording, but don't remove the entry from the database.
Request message fields:
Reply message fields:
(Added in version 4)
Delete an existing DVR entry from the database.
Request message fields:
Reply message fields:
(Added in version 12)
Get DVR cutpoints.
Request message fields:
Reply message fields:
Cutpoint fields:
(Added in version 13)
Create a new Autorec DVR entry. Title must be specified.
Request message fields:
Reply message fields:
(Added in version 25)
Update an existing Autorec DVR entry.
Request message fields:
Reply message fields:
(Added in version 13)
Delete an existing autorec DVR entry from the database.
Request message fields:
Reply message fields:
(Added in version 18)
Create a new Timerec DVR entry. Title must be specified.
Request message fields:
Reply message fields:
(Added in version 25)
Update an existing Timerec DVR entry.
Request message fields:
Reply message fields:
(Added in version 18)
Delete an existing timerec DVR entry from the database.
Request message fields:
Reply message fields:
(Added in version 5)
Get a ticket to allow access to a channel or recording via HTTP
Request message fields:
Reply message fields:
Request subscription to the given channel.
Request message fields:
Reply message fields:
Stop a subscription.
Request message fields:
Reply message fields:
(Added in version 5)
Change the weight of an existing subscription
Request message fields:
Reply message fields:
(Added in version 9)
Skip a timeshift enabled subscription. The response will be asynchronous subscriptionSkip().
Request message fields:
Reply message fields:
(Added in version 9)
Synonym for subscriptionSkip
(Added in version 9)
Set the playback speed for the subscription. The response will be asynchronous subscriptionSpeed().
Request message fields:
Reply message fields:
(Added in version 9)
Return a timeshifted session to live. Reply will be asynchronous subscriptionSkip().
Request message fields:
Reply message fields:
(Added in version 12)
Enable or disable specified streams by index.
Request message fields:
Reply message fields:
(Added in version 16)
Return a list of stream profiles (configurations).
Reply message fields:
Message fields:
(Added in version 11, Removed in version 16)
Return a list of encoders (codecs).
Reply message fields:
(Added in version 8)
Open a file within the Tvheadend file system. This is now the preferred method (in place of HTTP) for accessing recordings.
Accessing recordings via HTSP will overcome the limitations of standard HTTP streaming which cannot handle both skipping and growing files (i.e. in-progress recordings) at the same time.
Request message fields:
Valid file paths:
Reply message fields:
(Added in version 8)
Read data from a file.
Request message fields:
Reply message fields:
(Added in version 8)
Close an opened file.
Request message fields:
Reply message fields:
(Added in version 8)
Get status of a file.
Request message fields:
Reply message fields:
(Added in version 8)
Seek to position in a file.
Request message fields:
Note: valid values for whence
Reply message fields:
Also see: and .
Also see: .
Also see:
Also see:
Also see:
%d
Day without zero padding. eg: 1 or 31
%dd
Day with zero padding. eg: 01 or 31
%ddd
Language-specific abbreviated day name. eg: 'Wed' or 'Mi'.
%dddd
Language-specific full day name. eg: 'Wednesday' or 'Mittwoch'.
%M
Month without zero padding. eg: 1 or 12
%MM
Month with zero padding. eg: 01 or 12
%MMM
Language-specific abbreviated month name. eg: 'Dec' or 'déc.'.
%MMMM
Language-specific full month name. eg: 'December' or 'décembre'.
%yy
Two-digit year without the century. eg: 02 or 97.
%yyyy
Four-digit year with the century. eg: 2002 or 1997
%h
Hour without zero padding, eg: 1 or 23. (Always 24 hour clock)
%hh
Hour without zero padding, 12 hour clock. eg: 01 or 23. (Always 24 hour clock)
%m
Minute without zero padding. eg: 1 or 59.
%mm
Minute with zero padding. eg: 01 or 59.
%s
Seconds without zero padding. eg: 1 or 59.
%ss
Seconds with zero padding. eg: 01 or 59.
✓
✓
✓
✓
✓
✓
✓
✓
✓
✓
✓
✓
✓
✓
✓
✓
✓
✓
✓
✓
✓
✓
✓
✓
✓
✓
✓
STREAM_ID
✓
✓
✓
✓
✓
✓
✓
✓
SYMBOL_RATE
✓
✓
ISDBT_LAYERA_FEC
✓
ISDBT_LAYERB_FEC
✓
ISDBT_LAYERC_FEC
✓
ISDBT_LAYERA_MODULATION
✓
ISDBT_LAYERB_MODULATION
✓
ISDBT_LAYERC_MODULATION
✓
ISDBT_LAYERA_SEGMENT_COUNT
✓
ISDBT_LAYERB_SEGMENT_COUNT
✓
ISDBT_LAYERC_SEGMENT_COUNT
✓
ISDBT_LAYERA_TIME_INTERLEAVING
✓
ISDBT_LAYERB_TIME_INTERLEAVING
✓
ISDBT_LAYERC_TIME_INTERLEAVING
✓
Map
1
Sub message of type map
S64
2
Signed 64bit integer
Str
3
UTF-8 encoded string
Bin
4
Binary blob
List
5
Sub message of type list
Dbl
6
Double precision floating point
Bool
7
Boolean
UUID
8
64 bit UUID in binary format
Length
4 byte integer
Total length of message (not including this length field itself)
Body
HTSMSG-Field * N
Fields in the root body
Type
1 byte integer
Type of field (see field type IDs above)
Namelength
1 byte integer
Length of name of field. If a field is part of a list message this must be 0
Datalength
4 byte integer
Length of field data
Name
N bytes
Field name, length as specified by Namelength
Data
N bytes
Field payload, for details see below
Search Title
Display events that match the given title. The filter uses case-insensitive regular expressions. If you don’t know what a regular expression is, this simply means that you can type just parts of the title and filter on that - there’s no need for full, exact matching. If the fulltext checkbox is checked, the title text is matched against title, subtitle, summary and description.
Filter Channel
Display events from the selected channel. Channels in the drop down are ordered by name and can be filtered (by name) by typing in the box.
Filter Tag
Display events from channels which are included in the selected tag. Tags are used for grouping channels together - such as ‘Radio’ or ‘HDTV’ and are configured by the admin. Start typing a tag name to filter the list.
Filter Content Type
Display events that match the given content type tag. Most DVB networks classify their events into content groups. This field allows you to filter based on content type (e.g. “Sports” or “Game Show”). Supported tags are determined by your broadcaster. Again, simply start typing to filter the entries if you have a long list to choose from.
Filter Duration
Display events that fall between the given minimum and maximum durations. This allows you to filter for or against, say, a daily broadcast and a weekly omnibus edition of a programme, or only look for short news bulletins and not the 24-hour rolling broadcasts.
00:00:01 to 00:15:00
Very short news bulletins, children’s programmes, etc.
00:15:01 to 00:30:00
Short programmes, e.g. daily soap operas
00:30:01 to 01:30:00
Medium-length programmes, e.g. documentaries
01:30:01 to 03:00:00
Longer programmes, e.g. films
03:00:00 to no maximum
Very long programmes, e.g. major sporting events
Reset All
Clears all search filters
Watch TV
Launches Live TV via HTML5 video
Create Autorec
Creates an auto-recording rule based on the current filter criteria
Help
Display this help page
ADMIN privilege is required for all of these functions.
Lists the text strings, options and defaults used when configuring bouquets within TVH (ie Configuration -> Channel/EPG -> Bouquets).
Create a new bouquet.
conf
Object describing the new bouquet. An element ext_url
is required; presumably in the format of the source
element in bouquet/grid.
Removes the link from a channel to the bouquet that it is part of.
uuid
uuid(s) of channels to detach.
Lists details of bouquets. For details of the parameters and selection criteria which can be applied, see Common Parameters.
Lists names and bouquets. The list excerpted below is coded into tvheadend.
Scan (using an available tuner) one or more bouquets to find their channels. The channel list is NOT returned, just an empty JSON object.
uuid
uuid(s) of bouquet(s) to scan.
The HTSP api
method can be used as a proxy to access the HTTP/JSON API. This allows HTSP-only clients access to any JSON feature, including JSON-only features.
Data exchanged to and from the TVH server is achieved by encapsulating the required HTTP/JSON parameters within the HTSP message.
TVH expects to receive encapsulated JSON data and will respond with a HTSP map representing the JSON data returned.
Also see: JSON API.
API
Syntax SummaryRequest:
Reply:
To execute the HTTP API command:
http://TVH:9981/api/channel/grid
Set the path
field to channel/grid
and send the request. The args
field is not required.
The response will be a HTSP map
containing an element named response
. This element will be a map
containing the the JSON response presented as HTSP elements.
To execute the HTTP API command:
http://TVH:9981/api/channel/grid?sort=number&dir=desc
Set the path to channel/grid
as in the previous example.
The arg
field must be set to type map
, and in this example, contain two str
elements.
Map str
element named sort
should contain the value number
and map str
element named dir
should contain the value desc
.
To execute the HTTP API command:
http://TVH:9981/api/dvr/entry/create
Set the path to dvr/entry/create
.
As with the previous example, the args
field must be set to type map
.
Method 1 - JSON String
Create a JSON string containing the properties required to complete the request as detailed in the JSON API documentation. In this example, to create a new DVR entry.
Within that map
, create a str
element named conf
that contains the required JSON string.
Method 2 - HTSP Map
Instead of creating a JSON string, create a HTSP map
where each element name matches the name of the JSON property and contains the required property value.
args
should be a map
that contains another map
named conf
that contains another map
with the required JSON data represented as HTSP elements.
API calls related to Conditional Access. ADMIN privilege is necessary for all of these functions.
Lists the text strings, options and defaults used when configuring Conditional Access devices within TVH (ie Configuration -> CAs -> Add).
Lists the text strings, options and defaults used when configuring Conditional Access within TVH (ie Configuration -> CAs).
Create a new CA instance.
class
Name of the class to create, ie one of the classes listed by caclient/builders.
conf
A JSON object describing the new device.
List CA clients.
ADMIN privilege is required for all of these functions except codec_profile/list.
Lists available codecs and their properties. This is a very verbose list.
Lists the text strings, options and defaults used when configuring codec profiles.
Add a new codec profile.
class
The name of the codec profile.
conf
A JSON object describing the codec profile.
ADMIN privilege is required for all of these functions except config/capabilities.
Returns a list of some compile-time options which were used to build the software. Requires either 'Web Interface' or 'HTSP Interface' privilege.
Lists the details, descriptions, defaults and current values of the items in the GUI screen Configuration -> General -> Base. See Common Parameters for details of selection parameters.
Untested. Updates the server from an object in the format produced by config/load.
node
The JSON object.
Lists the details and descriptions of items in the TVH GUI screen Configuration -> Debugging -> Memory Information Entries.
Lists details of in-memory objects. See Common Parameters for details of selection parameters.
Lists all of the api functions supported by the server.
Lists information about the server including the software version number.
API calls which end in /grid
, with the exception of epg/events/grid, have a common set of parameters:
start
First entry to include. Default is the first (0).
limit
Number of entries to include. Default is 50 - use a large number to get all.
filter
A JSON object describing the filter(s) to be applied. See Grid Filters below for syntax.
sort
Name of the field to sort the records by. A case-sensitive sort is used.
dir
if sort
is specified then dir=desc
produces a reverse sort.
A filter can be applied to the output using a JSON object. The syntax is:
The "comparison" field is only used with numeric data. A "gt" comparison actually matches on greater-or-equal, and "lt" on less-or-equal.
Boolean values must be specified as "0" or "1" (NOT "true" or "false"). A (case-insensitive) regular expression match is used for strings.
The "intsplit" field is used for integer variables which are used to store a quotient and remainder, and defines how the bits of the variable are allocated.
Multiple filters can be applied to a query ONLY if they refer to different fields, so for example it is not possible to query for EPG events having start times between two values.
API calls which end in /load
, with the exception of epg/events/load, have a common set of parameters:
meta
If > 0 an extra data structure is output, mostly related to the format of the GUI screen where the information is presented. Default is 0.
list
This parameter selects which items in the params array are to be output, based on the value of the 'id' field. Multiple entries can be selected, separated by commas, colons or semicolons. A '-' in front of an entry deselects that item (and implicitly selects all others).
TVHeadend provides the API using the HTTP protocol, by default via port 9981 though this can be changed in the TVH config. API functions appear as pseudo-files under the /api/ root of the server filesystem, with parameters passed to the function via either the GET or POST methods.
The call must include a username and password with access permissions to carry out the requested task. The user must also have the ACCESS_WEB_INTERFACE privilege, either directly or inherited from an earlier '*' user. In other words the "Web interface" box must be ticked on the Access Entries screen; without this all calls will fail with a "403 Forbidden" error.
If TVHeadend has been started with the '--http_root' qualifier, the HTTP root must be included in the URL, thus eg
http://admin:admin@192.168.3.45:9981/myHttpRoot/api/serverinfo
The server does not check that all parameters supplied are valid in the context of the request; unexpected items are ignored. Parameters not in the expected format or not containing the expected data may also be ignored.
The response from TVH follows the HTTP protocol and includes an HTTP/1.1 header with status code. If an error occurs the response is in HTML, for example:
The error returned is generic and does not indicate the source of the problem. Authentication failures (incorrect user/pass) will return "401 Unauthorized", lack of privilege "403 Forbidden", non-existent API functions "404 Not Found", incorrect or missing parameters generally "400 Bad Request".
Data is usually returned as JSON, without any CR or LF characters - the examples given have been 'prettified' using json_pp or jq to make them easier to read. Functions which perform an action rather than return data will return an empty JSON object on successful completion.
This section provides information on the HTTP API for TvHeadend. It was written from the source code of the development version 4.3.
The examples shown were mostly generated from UK Freeview DVB-T / DVB-T2 and Freesat DVB-S / DVB-S2, using a single tuner in each case. Other sources and multiple input devices may give different results.
This API is an advanced feature of TVheadend, and the functionality is unstable and liable to change. The software does not completely validate its inputs and incorrect or unexpected calls may result in undesired behaviour.
Functions to query and manipulate the list of channels.
A TVH user can only see via the API those channels which have been enabled and to which access has been allowed. However a user with ADMIN privilege can use the parameter all=1
to see details of every channel, channeltag and category even if they do not have access to them.
Lists the text strings, options and defaults used when configuring channels within TVH (ie Configuration -> Channel/EPG -> Channel -> Add).
Creates a new channel. Requires ADMIN privilege.
conf
A JSON object containing details of the new channel.
Lists details of channels. For details of the parameters and selection criteria which can be applied, see Grid Parameters.
Lists the names and uuids of all known channels. For disabled channels the channel name is enclosed in braces.
These parameters were added at version 4.3-905:
numbers
If non-zero, the LCN appears before the channel name, separated by a space. Default is zero.
sources
If non-zero, the source appears after the channel name, in square brackets and separated by a space. Default is zero.
sort
Either name
to sort by channel name, or numname
to sort by LCN then by name (default). The name sort is case-sensitive.
Renames a channel. Only available from version 4.3.652. Requires ADMIN privilege.
from
The current name of the channel.
to
The new name of the channel.
Lists the text strings, options and defaults used when configuring channels within TVH (ie Configuration -> Channel/EPG -> Channel Tags -> Add).
Creates a new channel tag. Requires ADMIN privilege.
conf
A JSON object containing details of the new channel tag.
Lists details of channel tags. For details of the parameters and selection criteria which can be applied, see Grid Parameters.
Lists the names and uuids of all channel tags.
Untested. Return a list of the categories of events which appear in the current EPG and which the user is permitted to see. Used internally to populate the 'Category 1-3' drop-down boxes in DVR -> Autorecs -> Add (Expert view only). The function only works if the EPG is sourced from XMLTV.
This section includes functions to manipulate recorder objects; timers, autorecs and recordings. Unless noted otherwise, RECORDER privilege is required for all these functions - the 'Basic' tick-box in the 'Video Recorder' drop-down on the Access Entry screen. Other tick-boxes will be needed for some functions.
Lists the text strings, options and defaults used when configuring the DVR capability within TVH (ie Configuration -> Recording). Requires either RECORDER or ADMIN privilege.
Lists the configuration sets available for the TVH server together with their options. Configurations are identified by their name
parameter; the default config has the name blank. Requires either RECORDER or ADMIN privilege.
Creates a new configuration set. Requires ADMIN privilege.
name
configuration name. Must be supplied and cannot be blank
conf
parameter set, passed as a JSON object
Lists the text strings, options and defaults used when editing an upcoming recording.
Lists all of the recordings that TVH knows about, ie it combines the output of grid_upcoming
, grid_finished
, grid_failed
and grid_removed
. Use the status
parameter to tell them apart.
See Grid Parameters for parameter details, and note the default is to return only the first 50 items.
Lists all of the currently-scheduled recordings. See Grid Parameters for parameter details, and note the default is to return only the first 50 items.
duplicates
Set to 0 to exclude duplicate timers. Default is 1.
The data is derived from the EPG when the timer was scheduled. From version 4.3.1013 the item "disp_extratext" is included to deal with the inconsistent use of "subtitle" and "summary" fields by broadcasters.
The values of start_real
and stop_real
take into account the recorder padding and warm-up time currently set.
The value of rating_label_uuid
points to a current parental rating label record.
Lists recordings which have completed and which are still in the TVH logs. See Grid Parameters for parameter details, and note the default is to return only the first 50 items.
The values of start_real
and stop_real
take into account the recorder padding and warm-up time currently set - not the values which were set when the recording was made. If this is a segmented recording (a programme split into two or more parts with for example a news bulletin in between) the value of stop_real
is the end time of the final segment, while stop
is the end time of he first segment.
Because legislation can change over time, the value of rating_label_uuid
is blank for finished DVR entries, the 'saved' tags should be used instead.
Lists failed recordings. See Grid Parameters for parameter details.
If you merge the 'failed' and 'completed' recordings into a single list, the only way to tell which list the entries originally came from is by using the status
field.
Lists removed recordings. See Grid Parameters for parameter details.
Under some circumstances an unsuccessful recording may appear here rather than under failed recordings. For example when EIT-based accurate recording is being used and the 'running' status is never received.
If TVH is configured to delete the log record when a recording is deleted this function will not return them.
Creates a new timer from a JSON object.
conf
The JSON object describing the timer. Items not specified are derived from the default profile of the user. An example of the minimum useful JSON is shown below.
The function returns the uuid of the created timer on success.
It is also possible using this function to add a file created elsewhere into the TVH database as a completed recording. Items needed in the JSON are:
It is important that the start and stop times are in the past, otherwise TVH will try to create a timer to record the event. (Thanks to "ullix tv" for this information.) Also note that the ability to add a pre-recorded file is unintended behaviour - see Caution.
Creates a new timer using details from the EPG. Input parameters are:
config_uuid
this is the uuid
parameter from the output of dvr/config/grid
event_id
this is the eventId
parameter for the event, taken from epg/events/grid
These functions provide the same capability as the Re-record button in Digital Video Recorder -> Finished Recordings. "Allow" sets the recording to be re-done, "deny" cancels a scheduled rerecording, "toggle" reverses the rerecord state.
uuid
the uuid
of the finished or failed recording, or a JSON object containing an array of uuids.
Gracefully stops a running recording.
uuid
The uuid
value from the timer's entry in dvr/entry/grid.
Deletes a timer or aborts a running recording.
uuid
The uuid
value from the timer's entry in dvr/entry/grid.
If the timer is running, the recording is kept on disk but classified as a 'failed' recording.
NOTE To delete a series use idnode/delete, passing parameter uuid
from the entry in dvr/timerec/grid. As with the UI, deleting a series deletes all pending timers for that series.
These three functions affect the "previously recorded" status of a timer. If set, either directly or via a call to the toggle function, the timer is marked as completed and the file flagged as deleted. If unset, a new timer is created.
These functions provide the same capability as the Previously Recorded button in Digital Video Recorder -> Upcoming/Current Recordings. It can be used to 'hide' re-runs to prevent them being re-recorded.
Removes a completed recording from storage.
uuid
The recording's uuid
value from dvr/entry/grid_finished.
Informs TVH that a recording has been relocated (by external means) within the filesystem. Requires ADMIN privilege.
src
The original full path to the file
dst
The new full path to the file
Move a finished recording entry to the "Finished Recordings" category, presumably from "Failed Recordings". The actual file is not moved.
uuid
The uuid
of the entry, or an array of entries passed as a JSON object.
Move a finished recording entry to the "Failed Recordings" category, presumably from "Finished Recordings". The actual file is not moved.
uuid
The uuid
of the entry, or an array of entries passed as a JSON object.
Lists the text strings, options and defaults used when creating or editing a series timer.
Lists autorecs (series timers). See Grid Parameters for parameter details.
Create a new series timer by specifying search parameters. To create a timer using CRIDs use dvr/autorec/create_by_series.
conf
A JSON object specifying the selection parameters for the timer.
config_uuid
The uuid
parameter from the output of dvr/config/grid. Parameter config_name
may be passed instead.
Creates a new series timer using CRIDs. Input parameters are:
config_uuid
The uuid
parameter from the output of dvr/config/grid
event_id
The eventId
parameter for one event in the series, taken from epg/events/grid
NOTE To delete a series use idnode/delete, passing parameter uuid
from the entry in dvr/autorec/grid. As with the UI, deleting a series deletes all pending timers for that series.
Lists the text strings, options and defaults used when creating or editing a time-based recording.
Lists time-based recordings. See Grid Parameters for parameter details.
Create a new time-based timer.
conf
A JSON object specifying the selection parameters for the timer.
A JSON object is returned containing the UUID of the timerec.
Lists the available character sets.
ADMIN privilege is required to use these functions.
Lists the descriptions, options, defaults and current settings for configuring the SAT>IP server capability - see Configuration -> General -> SAT>IP server.
Untested. Updates the server from an object in the format produced by satips/config/load.
node
The JSON structure containing the updates.
The programme is scheduled for recording
The programme is currently recording
Click to call up more detailed information about an event
Google Chrome
Mozilla Firefox
Google Chrome
Mozilla Firefox
Google Chrome
Mozilla Firefox
List details of input devices. ADMIN privilege is required for these functions.
Lists the parameters, options and settings for input devices.
uuid
(Required). If set to 'root', the top-level details of the input device(s) are shown. If the uuid of a device (obtained from the top-level details) is submitted, full information is shown similar to Configuration -> DVB Inputs -> TV Adaptors.
root
Function obscure.
Triggers a discovery process for SAT>IP servers, as Configuration -> General -> SAT>IP Server -> Discover SAT>IP Servers in the GUI. This function is only available if SAT>IP client functionality has been compiled into TVHeadend.
Functions to report on and control Elementary Stream filters.
There are separate API functions to operate on the different types of filter, but they all work in the same way. In the descriptions below the XXX
in the function name can be replaced with video
, audio
, teletext
, subtit
(subtitle), ca
or other
as required.
Lists the descriptions, options and defaults for configuring the chosen type of filter, ie Configuration -> Stream -> Stream Filters -> {chosen type} -> Add.
Returns the parameters of the defined filters of the chosen type. The usual selection options are available, see
Creates a new filter of the chosen type. ADMIN privilege is required.
conf
A JSON object describing the filter.
Manipulate EPG grabbers. ADMIN privilege is required for these functions except for epggrab/channel/list.
Lists the EPG grabber channels, ie those appearing in Configuration -> Channel / EPG -> EPG Grabber Channels, together with the available option fields and the selections chosen.
Lists the parameters, descriptions, options and defaults for the GUI screen Configuration -> Channel/EPG -> EPG Grabber Channels.
List EPG Grabber Modules, as shown in the GUI screen Configuration -> Channel/EPG -> EPG Grabber Modules.
node
The JSON object.
Queues a run of the OTA EPG grabber.
trigger
Delay in seconds before the run starts. Minimum is one second, maximum is one week.
Run the internal EPG grabbers immediately.
rerun
Not used but must be an integer greater than zero.
Functions to query the Electronic Program(me) Guide.
Query the EPG and optionally apply filters.
lang
3-letter ISO639 language code. If not supplied, the language configured for the user is entered; otherwise the system default.
mode
If set to the string now
then only events currently playing are listed.
title
A (case-insensitive) string which must appear in the title to be listed.
fulltext
If set to 1 then the title
string must match exactly. Default is 0.
channel
The channel to show events from, specified either by channel name or uuid. Must be an exact match to the data from , otherwise all channels are returned.
channelTag
The (single) channel tag to show events from, specified either by name or uuid. Must be an exact match to the data from , otherwise all tags are returned.
durationMin
Shortest event to be listed (seconds).
durationMax
Longest event to be listed (seconds).
contentType
Integer representing the genre to be listed - see .
filter
A JSON object describing the filter(s) to be applied. See for the syntax. String filters can only be applied to the 'channelName', 'title', 'subtitle', 'summary', 'description' and 'extraText' fields.
sort
The key to be sorted by. Default is to sort by 'start'.
dir
If sort
is specified, setting 'dir' to 'desc' reverses the sort order
start
First record to be listed from the database, default is 0.
limit
Number of records to list. Default is 50 - use a very large number to get all.
new
If set to 1 then only events marked as 'new' will be included. Default is 0. The EPG source must identify 'new' events for this filter to work.
cat1, cat2, cat3
XMLTV provides more details of the event category than the OTA EPG, and these parameters can be used to filter by XMLTV category. See .
EPG sources differ in the information which they provide, and there are many more information items possible than are included in the example below. Any items which have no data available will be omitted.
If the event is scheduled to be recorded, these extra items will appear:
Other possible values for dvrState
are "recording", "completed", "completedError", "completedWarning" and "completedRerecord". The 'completed' values can only be present if the recording stopped before the scheduled stop time.
Lists alternative broadcasts of the same event.
lang
3-letter ISO639 language code. If not supplied, the language configured for the user is entered; otherwise the system default.
The function looks for broadcasts having the same eventId, rather than using event CRIDs. It does not work on UK DVB-T.
This function does not work on TVH versions older than 4.2.4-5 or 4.3-589.
Lists broadcasts related to the given event.
lang
3-letter ISO639 language code. If not supplied, the language configured for the user is entered; otherwise the system default.
The function looks for events having the same series link ID as the given event, ie part of the same series of broadcasts. It therefore relies on the EPG provider filling in these details.
Note that the series link ID is unique to an individual set of broadcasts; if the series is repeated on a different channel (or at a different time) the series link will be different.
This function does not work on TVH versions older than 4.2.4-5 or 4.3-589.
From version 4.3.1711, if the given event does not have a series link ID, events in the EPG having the same title are returned.
Lists details of specific event(s).
eventId
Identifier of the event, or a JSON array of event Ids.
The common parameters which apply to other 'load' functions do not work here.
A 'Brand' is a commonly-available show, eg "Simpsons". What constitutes a 'Brand' is up to the EPG provider.
This function was removed in version 4.3.1059.
full
If set to 0 (the default) only the broad categories defined by content_nibble_level_1
in the specification are listed. If set to 1 all categories are listed.
ADMIN privilege is required to use these functions except for profile/list.
Lists the available stream profiles (visible in the GUI at Configuration -> Stream -> Stream Profiles) together with their uuids.
all
A user with ADMIN privilege can use this parameter to see details of every profile even if the profile is disabled or they do not have access to them.
htsp
If set to 1, list only HTSP profiles. Default is 0 (list all).
Lists the options, defaults and descriptions of configuration parameters (Configuration -> Stream -> Stream Profiles) in the GUI.
Lists the options, defaults and descriptions of configuration parameters when adding a new stream profile (Configuration -> Stream -> Stream Profiles -> Add) in the GUI.
Create a new stream profile.
class
conf
A JSON object containing details of the new profile.
Functions relating to DVB networks, multiplexes and services. Further service functions can be found in the Service section. ADMIN privilege is required for all these functions.
Lists the network(s) associated with a given input device.
uuid
The uuid of the specific hardware device.
To find the input device uuid, use hardware/tree?uuid=root
, then take the id
value from the output and use it as the value of uuid
in another call to . From the output of this function select the id
corresponding to the specific front-end device required.
Lists available networks. The standard parameters listed in may be used. The items returned depend on the type of network - terrestrial, satellite, IPTV etc.
Lists the text strings, options and defaults used when configuring the DVB capability within TVH (ie Configuration -> DVB Inputs -> Networks).
Lists the text strings, options and defaults used when configuring the DVB capability within TVH (ie Configuration -> DVB Inputs -> Network -> Add).
Create a new network.
conf
Required. A JSON object containing the settings for this network.
Lists the text strings, options and defaults used when editing a multiplex using Configuration -> DVB Inputs -> Muxes -> Edit.
Create a mux for an existing network.
uuid
The uuid of the network containing this mux.
conf
A JSON object containing the settings for this mux. The contents will depend on the type of network.
A JSON object containing the UUID of the new mux is returned.
Triggers a scan of the requested network(s).
uuid
uuid(s) of the network(s) to scan. More than one may be given; they will be scanned in sequence.
hidemode
If set to all
, only enabled multiplexes are listed. The default is to show all multiplexes.
Lists the text strings, options and defaults used when configuring the DVB capability within TVH (ie Configuration -> DVB Inputs -> Muxes).
Lists available mpegts services. The standard parameters listed in Grid Parameters may be used.
hidemode
The default is to show only services where the multiplex is enabled and the service has been verified. Setting this parameter to all
also hides services which are not enabled, setting it to none
shows all services.
dvb_servicetype
can be used to determine what kind of service is being broadcast. The possibilities are:
Radio: 0x02
SD TV: 0x01, 0x16, 0x17, 0x18, 0x80, 0x96, 0xa8, 0xd3
HD TV: 0x11, 0x19 - 0x1e, 0x91, 0xa0, 0xa4, 0xa6
UHDTV: 0x1f
Lists the text strings, options and defaults used when configuring the DVB capability within TVH (ie Configuration -> DVB Inputs -> Services).
Lists the text strings, options and defaults used when configuring the DVB capability within TVH (ie Configuration -> DVB Inputs -> Mux Schedulers).
Lists orbital positions and the satellites occupying them. The list is distributed with tvheadend; satellite reception is not necessary to use this API.
Lists the available frequency scan tables.
type
One of 'dvb-s', 'dvb-t', 'dvb-c', 'atsc-t', 'atsc-c', 'isdb-t'.
satpos
For dvb-s, the satellite position in degrees multiplied by 10 with East positive (so 28.2E is written as 282). The position must be accurate within +/- 0.2 degrees.
This function requires the dvb-scan files to be present on the server. They are installed by default (in /usr/share/tvheadend/data/) but are omitted if configure argument '--disable-dvbscan' is used. Distributions may also choose to package them separately.
ADMIN privilege is required to use all of these functions.
Lists the descriptions, options, current values and defaults of the GUI screen Configuration -> DVB Inputs -> Services. -> Map Services.
Further API functions for manipulating DVB services are in the section.
Untested. Set the Service Mapper options.
node
Unknown, possibly the value of class
.
Stops a running service mapper operation.
Provides the same output as Status -> Service Mapper in the TVH GUI.
Lists available services. "Available" services includes those which are disabled or encrypted.
enum
If set to 1 (as an integer without quotes) a short-form list is output containing each service's uuid and name. If set to 0 (the default) a verbose list is generated.
list
If enum
is not 1 this parameter selects which items in the params
array are to be output, based on the value of the 'id' field. Multiple ids can be selected, separated by commas, colons or semicolons. A '-' in front of an id deselects that item (and implicitly selects all others).
raw/export?class=service
provides a simpler version of the same information (but including the streams data), however the API call is about 50% slower.
Lists the streams comprising the service.
uuid
uuid of the service. This parameter is mandatory; it is not possible to list all services.
Remove services which have not been seen recently. This call carries out the same action as Configuration -> DVB Inputs -> Services -> Maintenance in the TVH GUI.
days
The number of unseen days before deletion. The default is 7 days, the minimum is 5 days.
type
If set to pat
the action is the same as "Remove unseen services (PAT/SDT)" in the GUI. Otherwise the action is the same as "Remove all unseen services".
An empty JSON object is always returned.
Lists statistics of input sources and connections. ADMIN privilege is required for all these functions.
Lists currently-connected client devices.
Lists currently-active subscriptions.
Lists statistics of input devices.
For DVB-T and DVB-S tuners at least, the signal and SNR values are only non-zero while TVH is actively using the device. Some items may be missing if the device is idle.
The meaning of the statistics is below. Not all input sources provide all of the values.
For signal_scale and snr_scale, a value of 1 indicates that the corresponding signal or SNR reading is relative; 65535 = 100%. A value of 2 indicates the reading is absolute; 1000 = 1dB. A value of 0 indicates that the reading is not available or not valid.
The "pids" data is only present in TVH versions 4.3.1420 and later.
Resets the input counters to zero.
Disconnects one or more clients.
Although no special privilege is needed to use these functions, access control is applied at the inode database level.
Returns a list of all data classes together with readable titles. Requires version 4.3-406 or later.
class
One of the class names returned by .
uuid
A single uuid or JSON array of uuids.
Returns data about the selected object(s). The information is the same as returned by the corresponding grid
function (where available) but without the selection and filtering options provided by that function.
node
A JSON object or array of objects.
Objects being imported must have a uuid and must already exist in the database.
Functions to query and manipulate the list of parental rating labels ('G', 'M', 'PG', etc).
Lists the text strings, options and defaults used when configuring parental rating labels within TVH (ie Configuration -> Channel/EPG -> Rating Labels -> Add).
Creates a new parental rating label. Requires ADMIN privilege.
conf
A JSON object containing details of the new parental rating label.
Lists details of parental rating labels. For details of the parameters and selection criteria which can be applied, see .
Lists the names and uuids of all known parental rating labels.
Notes:
Parental rating labels were added to Tvheadend in December 2023.
Processing of parental rating labels is disabled by default and can be enabled via Configuration -> Channel/EPG -> EPG Grabber.
Tvheadend will automatically create a placeholder record as new labels are encountered.
Parental rating label fields will not appear in other modules, (DVR, EPG) if the processing of parental rating labels is disabled.
Produces a list of all known languages and their three-letter ISO639-3 codes. The list is hard-coded within the Tvheadend source.
Produces a similar list to language/list but also including the full RFC3066 locale reference for those locales which have been compiled into Tvheadend.
Produces a list in the same format as language/locale but containing only those locales which are supported by TVHeadend (ie have translations available).
ADMIN privilege is required for these functions.
Lists the details, descriptions, defaults and current values of the items in the GUI screen Configuration -> Debugging -> Configuration -> Settings. See for details of selection parameters.
Untested. Updates the server from an object in the format produced by .
node
The JSON object.
List the subsystems available for trace and debug operations.
Also see and .
id
- The internal enum for this subsystem. These values may change between systems depending upon the application version and the options used at compile-time but are otherwise constant.
subsystem
- The name of the subsystem. These values are to be used in the WebUI when enabling trace/debug operations.
description
- The locale-aware description of the subsystem.
trace
- True
if this subsystem is currently being traced.
debug
- True
if this subsystem is currently being debugged.
traceCount
- The number of subsystems with trace
currently set to true
.
debugCount
- The number of subsystems with debug
currently set to true
.
totalCount
- The total number of subsystems.
Note 1: Users may enter a special all
subsystem (not listed) instead of nominating each subsystem individually in the WebUI. This condition can be detected if traceCoount
and/or debugCount
is equal to totalCount
.
Note 2: As at April 2014, the id
field is informational only. It is provided to facilitate future API development.
This section describes other functions which can be accessed via HTTP. They are not part of the HTTP API and so are not preceded by 'api'.
Unless otherwise stated no special privilege is needed to use these functions.
Returns a JSON object containing data used by the Tvheadend UI, including the disk space utilisation.
The "freediskspace" and "totaldiskspace" figures relate to the disk partition holding the recorder Storage Path, "useddiskspace" is the total size of all files stored below that point. These figures may not give the actual storage situation if there are multiple storage devices and mount points.
Downloads a previously-recorded file. Called with the UUID of the recording. Requires appropriate privilege (DVR or streaming).
Flushes the contents of the EPG to disk.
Used by simple.html.
Downloads an icon file. The filename is hard-coded in the source; on installation it is usually placed at /usr/share/tvheadend/src/webui/static/img/logo.png
.
Outputs an image from the image cache. Requires streaming, recording or web interface privilege.
Used to download help files.
Available on version 4.3-2124 and later. Provides a simple way to check that the server is alive. No authentication is needed to use this function.
This function acts as a front-end to the dvrfile
and stream
functions. It is invoked using the following forms:
The function examines the 'User-Agent' string sent by the client. If the user-agent is on a preset list (or is not present), data transfer starts immediately; if not then a playlist is returned to the client.
The User-Agent list is "MPlayer", "curl/", "wget/", "TVHeadend", "Lavf" and any string containing "shoutcastsource".
If ticket
is added to the URL, for example:
the url in the returned playlist will contain an authentication ticket, removing any need to enter credentials in order to access the data. However the ticket is only valid for five minutes so the playlist cannot be re-used after that time.
When playing streams, the parameters for the underlying stream function can also be used.
This is a complex function which outputs lists of content available from the server, in various formats and filtered in several ways. The syntax for invoking the function depends on the required output and not all combinations of inputs are valid.
Note: The hostname portion of the URLs returned within the resulting playlist, for example m3u, will be the same as the hostname supplied with the http request.
See below for sample output.
The value of <x> in the URL specifies the format of the output. The options are e2
, m3u
or satip
, with m3u
the default if the item is omitted. For recordings only m3u
is available.
For channels, a parameter sort
can be added. This can take the value 'name' or 'numname', to sort the output by channel name or channel number respectively.
See below for notes including the values of <y> in the URL, and sample outputs.
The value of <x> in the URL specifies the format of the output. The options are e2
, m3u
or satip
, with m3u
the default if the item is omitted. For recordings only m3u
is available.
See below for notes including the values of <y> in the URL, and sample outputs.
The list of recordings includes all entries in the DVR logs, including failed and missed recordings and recordings to be made in the future (ie timers). Unplayable recordings have 'bandwidth=0' in the output.
The value of <y> in the URLs, if supplied, specifies whether the channel list or playlist should include authentication in the URL. If <y> is ticket
, each entry includes an access-control 'ticket' - these tickets are only valid for five minutes, they are different for each channel/recording listed, and calling the playlist again will output a different set of tickets.
Alternatively, if Persistent Authentication is in use (TVHeadend versions > 4.3.1485), the value of <y> may be set to auth
. The auth code must be appended to the URL as a parameter, eg.
$ curl http://192.168.0.1:9981/playlist/auth/tags?auth=8ef7aa08e516060ca4330730c60e00d5b5174920
Used internally for theme selection?
Outputs one of two files describing the SAT>IP server and the services available from it.
A rudimentary user interface to TVHeadend. It shows the contents of the recorder log (both completed and future recordings) and allows entries to be cancelled or deleted. A search box allows the EPG to be scanned for matching entries; clicking on an entry opens an information page which contains a button allowing the event to be recorded. Requires RECORDER privilege.
Outputs details of encrypted services. Each item contains:
Service ID
CA ID
CA provider ID
Service name
Service type
Service provider name
Outputs the TVHeadend version number and a (text) list of channels. This function requires Admin privilege.
The binary hash is only filled-in if the server runs on an x86 processor.
Outputs the current status of the server, including CPU load average, recordings in progress (or minutes to the next recording) and the number of active subscriptions. Needs 'Web interface' or 'Recorder' privilege.
Starts the streaming of live data from a channel, service or mux. The parameters which can be applied depend on the source:
profile
. The streaming profile to use. If the specified profile does not exist or can not be used the 'htsp' profile is used if available.
qsize
. Streaming buffer size. Default is 1500000 bytes.
User-Agent
. Use unknown.
profile
. The streaming profile to use. If the specified profile does not exist or can not be used the 'htsp' profile is used if available.
qsize
. Streaming buffer size. Default is 1500000 bytes.
descramble
. If set to 0 Tvheadend does not descramble the service.
emm
. Unknown. Default is 0, set to 1 to activate.
User-Agent
. Use unknown.
qsize
. Streaming buffer size. Default is 10000000 bytes.
pids
. A comma-separated list of pids to stream, or the word 'all' to stream the raw mux. The default is to stream all.
Controls the streaming of live data from a channel or service to a UDP address and port. This function requires Tvheadend version 4.3.2038 or later.
The following parameters are mandatory:
address
. The IP address of the device to receive the UDP stream.
port
. The destination port address.
The remaining parameters for the start
function depend on the source:
profile
. The streaming profile to use. If the specified profile does not exist or can not be used a 'Not Allowed' error is output.
qsize
. Streaming buffer size. Default is 1500000 bytes.
User-Agent
. Use unknown.
profile
. The streaming profile to use. If the specified profile does not exist or can not be used a 'Not Allowed' error is output.
qsize
. Streaming buffer size. Default is 1500000 bytes.
descramble
. If set to 0 Tvheadend does not descramble the service.
emm
. Default is 0, set to 1 to activate.
User-Agent
. Use unknown.
Outputs the EPG in XML format, filtered in various ways.
The final variation lists the complete EPG together with a channel list. Example:
If Persistent Authentication is in use (TVHeadend versions > 4.3.1485), the auth code must be appended to the URL as a parameter.
Translatable texts within TVH are divided into 3 areas:
Text used within the application to describe object properties and values, etc. Text used within the main web user interface (WebUI). Text used within the 'Help' system of the WebUI (Documentation).
All text is entered in English into the program/documentation source files. For successful translation, the English text also must be added to the master language translation files.
There are 3 master translation files.
intl/tvheadend.pot
intl/js/tvheadend.js.pot
intl/docs/tvheadend.doc.pot
These master translation .pot
files are converted into various language-specific po
files .
After translation, the language-specific .po
files are used to build TVH. For example (where XX represents the language code):
intl/tvheadend.XX.po
intl/js/tvheadend.js.XX.po
intl/docs/tvheadend.doc.XX.po
This system is very similar to where a msgid
tag contains the original English text and a msgstr
tag contains the translated text.
msgid "Yes"
msgstr "Oui
Within program code written in the 'C' programming language, the N_()
macro is used to identify English text that can be translated into another language. The translated text is returned at run time based on the user's linguistic preferences.
Within the WebUI code written in the 'JavaScript' programming language, the _()
function is used to indicate that translation is required.
All of the help system are converted from markdown text files into C static arrays that also eventually use the N_()
function before display.
If no translation is available, the original English text passed to N_()
or _()
will be returned.
Although there is a single unified build process, translations for each programming language or area referred to above are described separately for clarity.
The list of languages to be processed is determined by the LANGUAGES_ALL
variable set in Makefile.common
.
Called from the main Makefile, the script support/poc.py
processes the intl/tvheadend.XX.po
(main application) and intl/docs/tvheadend.doc.XX.po
(documentation) files and produces a consolidated tvh_locale_inc.c
file containing all of the text as static C char arrays plus an index array. This file will be compiled into the final application binary.
Called from Makefile.webui, the script, support/pojs.py
converts all of the individual intl/js/tvheadend.js.XX.po
files into individual webui/static/intl/tvh.XX.js.gz
files. These files are loaded dynamically at runtime by the WebUI based on the user's linguistic preferences.
TVHeadEnd only recognises a subset of the total XMLTV schema.
Multiple instances of some tags like 'actor' or 'category' or 'rating' may be present.
If you need to test with a system that you that you don't have access to, for example, testing ATSC functionality on a DVB system, you can use a TS recording to emulate the tuner type.
The TS file should contain the whole mux and not just one service.
A new 'network' will be created for the file as well as a number of 'mux', 'service' and 'channel' objects matching the services found within the TS file.
The contents of the TS file will be played on a continuous loop.
All configuration data within TVHeadEnd (TVH), is stored in object classes. A class may contain multiple objects representing a single configuration item each.
Examples include: channels, recordings, muxes, adapters, autorecs, etc.
Detailing every object class is beyond the scope of this document, however, a list of classes can be obtained via the JSON API as follows: http://[TVH_IP]:9981/api/classes
Any object within TVH can be addressed via its UUID ().
The UUID is represented in the JSON API as a 32 hexadecimal character string (128 bit). In the HTSP API, an object’s ID is normally represented as an unsigned 32 bit integer that corresponds to the first four bytes (eight hex characters) of the UUID.
Please note: EPG event data is not stored or addressed using UUIDs, however, EPG event entries can contain links to UUIDs of configuration objects.
Objects can be linked to other objects via their UUIDs.
For example: To record a programme, the EPG entry will be linked to a ‘Channel’ object. That channel object will be linked to one or more ‘Service’ objects. Each service object will be linked to a ‘Mux’ object. Each mux object will be linked to a ‘Network’ object. Finally a network object will be linked to one or more ‘Adaptor’ objects.
The following diagram is not exhaustive, but serves to illustrate the relationship between various common object classes.
Objects are stored on disk in JSON-formatted files. These files are located with the subdirectories representing their configuration function and are named to match their UUID.
It is recommended that these files not be edited directly.
Tvheadend uses English (en_GB) as the master langauge for the WebGUI and in-GUI help. Changes to source code that add new features and capabilities must also include updates to the master template .pot
files under the intl
directory if existing strings are reused or new strings added.
Merged changes to master template .pot
files are automatically replicated to Transifex where we manage the translation process. Our project is here:
If changes reuse existing strings local language files do not require translation. If they add new strings language contributors will be notified of the changes and can provide translations of the new strings in the language(s) they support. Once translated strings are saved, Transifex will automatically open a new pull-request against our GitHub repository with updates to the language .po
files. Transifex will continue to push updates and will combine updates to multiple languages into the same pull-request as long as the pull-request remains open.
Existing languages can be seen here:
Languages can be added by submitting a language request on Transifex. Once the overall translation state exceeds 80% completed Transifex will submit a pull-request to add new language .po
files to our GitHub repository. The final stage of addition (other than completing translations) is to edit the list of supported languages in Makefile
resources.
Do not submit requests for new languages on Transifex unless you are prepared to personally work on the translations. Translations require effort not magic!
Tvheadend has a WebSocket interface on port 9981. It is used by the UI to provide 'live' actions and updates, avoiding the need to refresh the screen.
The example below creates a WebSocket connection to the Tvheadend server and listens for updates.
Tvheadend transmits messages on the Websocket interface asynchronously, when either an event occurs or in some cases at scheduled intervals. The output format is JSON.
Each message contains a key "messages" whose value is an array of message objects. Each message object contains a key "notificationClass" which specifies the source of the message, and a series of message-specific key-value pairs.
The JSON API represents the unique identifier as a 32 byte character hexadecimal string. For example: 90e9361f38c156df654ecd27b92f398c
.
When proxied via the HTSP api
method, the unique identifier is encoded as a 16 byte binary field. When this field is represented as a hexadecimal string, it matches that used by the JSON API.
The HTSP API represents the unique identifier of an object using an unsigned 32 bit big-endian integer.
When represented as a hexadecimal string, the value matches the first 8 characters of the JSON unique identifier.
When evaluated as binary data, it matches the first 4 bytes of the proxied JSON value.
Mixing and Matching API Values The following table summarises UUID handling by API.
Additional Notes
The 32 bit ID may only contain 31 valid bits under certain circumstances. Based on how TVH creates 32 bit IDs, it is recommended to apply a 0x7fffffff
mask for comparison operations between long and short ID forms.
There appears to be no guarantee that the 32 bit ID will be unique among ALL object types.
Snippets of stuff that developers have learned that may be useful to other developers but is not yet sufficiently complete or structured for a dedicated page.
The WebUI is built on a 'single page application' framework called . The version used appears to be 3.4.1.1 which, is considerably outdated (released circa 2009-2011).
A link to the Ext JS documentation can be found here:
The WebUI appears to be heavily dependent upon the internal idnode
structures that not only supply the data to the WebUI via JSON, but also data type and formatting information. See the for more details.
Each page or group of pages in the WebUI has its own JavaScript file, however, these normally contain just some setup and housekeeping functions specific to that area, all of the heaving lifting is done in idnode.js
and tvheadend.js
based on the idnode(s) in question.
Internally, TVH stores many objects in Red-Black tree structures rather than arrays. There are a number of preprocessor macros to support this. All of these macros are named RB_fn
, for example, RB_FOREACH
.
Gives details of the EPG grabber channels, ie from Configuration -> Channel / EPG -> EPG Grabber Channels. See for parameter details.
Lists the parameters, options, defaults and current settings for the EPG grabber, ie Configuration -> Channel / EPG -> EPG Grabber. See for parameter details.
Updates the EPG Grabber configuration from an object in the same format as provided by .
eventId
Identifier of the event, eg taken from .
eventId
Identifier of the event, eg taken from .
Lists the Content Type IDs extracted from ETSI EN 300 468 together with their descriptions. The Content Type ID appears in the output of as "Genre". IDs described as 'Reserved' or 'User Defined' in the specification are given the description of the previous ID instead.
To get the contents of a stream profile use , passing it the stream profile's uuid.
class
Required. The class name matching the class
item obtained from a call to .
uuid
The value of network_uuid
from a call to .
Lists available multiplexes. The standard parameters listed in may be used.
List the entries as found under Configuration -> DVB Inputs -> Mux Schedulers. The standard parameters listed in may be used.
Untested. Create a mux schedule, presumably from a structure similar to that from .
uuid
The uuid of the input device from . More than one uuid can be specified - syntax?
id
ids of the connections, obtained from . If set to 'all' then all connections are cancelled (new in 4.3.1680).
See for a WebSocket interface to this function.
Used by .
ber
Bit Error Rate
bps
Bandwidth (bits/second)
cc
Continuity Errors
ec_bit
Bit Error Count
ec_block
Block Error Count
pids
List of pids present in the stream
signal
Signal Strength (see below)
signal_scale
See below
snr
Signal/Noise Ratio (see below)
snr_scale
See below
stream
Stream (multiplex) name
subs
Subscribers
tc_bit
Total Bit Error Count
tc_block
Total Block Error Count
te
Transport Errors
unc
Uncorrected Blocks
weight
Weight
JSON
90e9361f38c156df654ecd27b92f398c
String
Proxied JSON
0x90e9361f38c156df654ecd27b92f398c
Binary
HTSP
0x90e9361f
Binary
TVH accepts three episode numbering schemes via XMLTV.
onscreen
dd_progid
xmltv_ns
Set the 'episodeOnscreen' property of the EPG event to the value provided. TVH treats this value as free-form plain-text and no additional series or episode parsing is performed.
Note: If an 'episode-num' tag exists with a 'system' attribute set to 'onscreen', the tag's value will override the EPG event's 'episodeOnscreen' property regardless of the series or episode numbers parsed from other 'episode-num' tags. However, the other properties, for example 'seasonNumber' are set correctly. The 'onscreen' override occurs regardless of the sequence of the 'episode-num' tags.
Set the 'serieslinkUri' property to "ddprogid://xmltv/SH00012345.0000". No additional series or episode parsing is performed.
Set the 'episodeUri' property to "ddprogid://xmltv/EP00012345.0001". Set the 'serieslinkUri' property to "ddprogid://xmltv/EP00012345". Set the 'episodeNumber' property to 1. Set the 'episodeOnscreen' property to "e01".
Set the 'seasonNumber' property to 2. Set the 'seasonCount' property to 16. Set the 'episodeNumber' property to 4. Set the 'episodeCount' property to 25. Set the 'partNumber' property to 2. Set the 'partCount' property to 2. Set the 'episodeOnscreen' property to "s02.e04".
Note: In a number pair separated by a slash, the first number is zero-based and the second number is 1-based. Episode 8 of 12 is represented by '7/12'. Series/episode/part numbers are always zero-based when appearing alone.
Set the 'seasonNumber' property to 2. Set the 'seasonCount' property to 15. Set the 'episodeNumber' property to 4. Set the 'episodeCount' property to 24. Set the 'episodeOnscreen' property to "s02.e04".
Set the 'seasonNumber' property to 3. Set the 'episodeNumber' property to 5. Set the 'episodeOnscreen' property to "s03.e05".
Note: The property names in the above examples refer to the HTML/JSON API.
More details on the XMLTV format can be found here: https://wiki.xmltv.org/index.php/XMLTVFormat and here: https://github.com/XMLTV/xmltv/blob/master/xmltv.dtd.
These examples (and any other use of the API which passes username and password in the URL) will only work if TVheadend is configured to use 'basic' or 'basic and digest' authentication.
Parameters passed to TVH using the GET method must be URI-encoded:
curl 'http://user:pass@localhost:9981/api/epg/events/grid?limit=999&channel=BBC%20ONE'
Alternatively use the POST Method:
curl --data 'limit=999&channel=BBC ONE' 'http://user:pass@localhost:9981/api/epg/events/grid'
To make the output more human-readable, pipe it through json_pp (included in the perl package on many distributions) or jq.
This simple example lists some details about upcoming timers, sorted in date order. To work through a PHP-enabled web server, the PHP.INI setting "allow_url_fopen" must be ON.
For an example of what can be done with the API in PHP see https://github.com/dave-p/TVHadmin.
It is a 'feature' of Javascript that a script can only access remote content from the same source (IP and port number) as the script was loaded from. Hence to call the TVHeadend API from Javascript, the script must be hosted on TVHeadend's built-in web server. To do this, place your script in /usr/share/tvheadend/src/webui/static
; it can then be accessed from URL http://user:pass@your.server:9981/static/
. Note that this is unintended behaviour and may change in the future.
This example carries out the same task as the PHP example above. Your browser will prompt for the TVHeadend user and password.
This example produces the same output as the previous ones.
TVH can serve its own EPG in XMLTV format via HTTP.
http://[TVH_IP]:9981/xmltv/channels
When a user clicks on a Help
icon, the browser requests the following 2 URLs.
http://[TVH_IP]:9981/markdown/class/[TVH_CLASS]?_dc=[??TIMESTAMP??]
http://[TVH_IP]:9981/markdown/toc?_dc=[??TIMESTAMP??]
Both of these URLs return markdown content. The first URL consists of the md
file that matches the URL’s class as well as all of the contents of all of the <tvh_include>
files present in the main file followed by an Items
section containing a description of the properties of the URL’s class.
The second URL contains the static table-of-contents in md
format from /docs/markdown/toc.md
.
The markdown data is converted into HTML using the third party marked
library. This is called from the tvheadend.mdhelp()
method in src/webui/static/app/tvheadend.js
.
The script support/doc/md_to_c.py
is called from the Makefile
to create the C file src/docs_inc.c
. This script is called multiple times for multiple md
file locations with all being centralised into a single src/docs_inc.c
file.
Each md
file (including the toc
) is converted to a C const char
array. Each element of the array is a line from the source md
files and is wrapped in an i18n translation function. The file names from the <tvh_include>
lines are extracted and prefixed with the string \xff\x04
via a the MDINCLUDE
compiler preprocessor instruction and added to the array.
At the end of src/docs_inc.c
, all of the above arrays are then indexed in a structure called tvh_doc_page
.
In src/webui/webui.c’
the /markdown
URL path is configured to be handled by page_markdown()
in src/webui/doc_md.c
. There are various functions that are called within this module, however, the \xff\x04
sequence is interpreted by the function md_render()
where the <tvh_include>
text is inserted into the content to be returned.
Once the text from the md
files has been assembled, the md_props()
function in src/webui/doc_md.c
appends the Items
markdown to the content to be returned.
A typical finally assembled result may look like this:
[Content from first include file]
Some text or seperator.
[Content from second include file]
Main body of the md file
[Content from third include file]
[Content from the internal object class definition]
All text returned to the browser is passed through the C i18n process (JS has its own i18n process) and is capable of being rendered line-by-line into any language supported by TVH provided that a translation for that text exists.
It is possible to compile Tvheadend for Android but the current project team does not test or release Android binaries or .apk files. If you are the Android platform maintainer we are seeking? .. rsvp!
Replace deprecated channels/channel_layout (2024-08-04)
Fix function passed to avio_alloc_context() (ffmpeg 7) (2024-08-04)
Rework fullscreen request method detection (2024-07-13)
Add dependency for recent Fedora versions (2024-07-13)
Allow node16 for GitHub Actions (2024-07-13)
Refactor null value handling. (2024-06-27)
Replace deprecated interlaced_frame, top_field_first and key_frame (2024-06-25)
Replace deprecated av_init_packet() (2024-06-25)
Fix potential null-pointer dereference in muxer_mkv.c (2024-06-23)
XMLTV: Rating Labels: Use 'NONE' when 'system' attribute is missing (2024-06-15)
Release 12.34.1 (2024-08-04)
Replace deprecated channels/channel_layout (2024-08-04)
Fix function passed to avio_alloc_context() (ffmpeg 7) (2024-08-04)
Nightly build 4.3-2349 (2024-07-21)
Nightly build 4.3-2347 (2024-07-14)
Nightly build 4.3-2346 (2024-07-13)
Rework fullscreen request method detection (2024-07-13)
Add dependency for recent Fedora versions (2024-07-13)
Allow node16 for GitHub Actions (2024-07-13)
Nightly build 4.3-2344 (2024-06-27)
Nightly build 4.3-2343 (2024-06-27)
Refactor null value handling. (2024-06-27)
Nightly build 4.3-2342 (2024-06-25)
Replace deprecated interlaced_frame, top_field_first and key_frame (2024-06-25)
Replace deprecated av_init_packet() (2024-06-25)
Nightly build 4.3-2340 (2024-06-23)
Nightly build 4.3-2339 (2024-06-23)
Nightly build 4.3-2338 (2024-06-23)
Fix potential null-pointer dereference in muxer_mkv.c (2024-06-23)
Nightly build 4.3-2337 (2024-06-18)
Nightly build 4.3-2336 (2024-06-15)
XMLTV: Rating Labels: Use 'NONE' when 'system' attribute is missing (2024-06-15)
Release 12.34.2 (2024-06-07)
Nightly build 4.3-2334 (2024-06-06)
Nightly build 4.3-2327 (2024-06-06)
Nightly build 4.3-2326 (2024-06-06)
Release 12.34.3 (2024-06-06)
Always compile x265 as PIC (2024-06-06)
Update libogg and libfdkaac (2024-06-06)
Update libx264 (2024-06-06)
Update nasm (2024-06-06)
Add current pcloud cert (2024-06-06)
Update x265 to 3.6 (2024-06-06)
Make builds parallel and add bookworm and ubuntu 24.04 builds (2024-06-06)
Nightly build 4.3-2324 (2024-06-05)
Nightly build 4.3-2323 (2024-04-26)
Nightly build 4.3-2322 (2024-04-26)
Correct M3U playlist logo tag (2024-04-26)
Nightly build 4.3-2321 (2024-04-25)
Nightly build 4.3-2320 (2024-04-25)
Properly escape json in setup (2024-04-25)
Nightly build 4.3-2319 (2024-04-21)
Nightly build 4.3-2318 (2024-04-20)
Update WebUI to allow debug/trace subsystem selection from a list. (2024-04-20)
Nightly build 4.3-2317 (2024-04-13)
Add subsystems to JSON API. (2024-04-13)
Nightly build 4.3-2316 (2024-04-08)
Release 12.34.4 (2024-03-24)
Nightly build 4.3-2314 (2024-03-24)
Nightly build 4.3-2313 (2024-03-22)
Nightly build 4.3-2312 (2024-03-18)
Nightly build 4.3-2300 (2024-03-14)
Nightly build 4.3-2299 (2024-03-09)
CI: remove NODIRTY option as those builds may be dirty (2024-03-09)
Nightly build 4.3-2298 (2024-03-08)
Nightly build 4.3-2296 (2024-03-08)
Revert accidental package renaming (2024-03-08)
Improve armv6l-packages and remove various outdated references/commands (2024-03-08)
Release 12.34.5 (2024-03-07)
Nightly build 4.3-2292 (2024-03-03)
Nightly build 4.3-2291 (2024-03-01)
Nightly build 4.3-2290 (2024-03-01)
Nightly build 4.3-2289 (2024-03-01)
Improve autorec duplicate handling (2024-03-01)
ci: added more info logging to cloudsmith.sh (2024-03-01)
Nightly build 4.3-2286 (2024-02-24)
Release 12.34.6 (2024-02-23)
Replace broken links, update copyright year (2024-02-23)
Nightly build 4.3-2271 (2024-02-22)
Nightly build 4.3-2270 (2024-02-22)
Nightly build 4.3-2269 (2024-02-22)
Nightly build 4.3-2268 (2024-02-22)
Give comment-on-labels.yml permissions to write to PRs (2024-02-22)
Add OpenCollective donate link to Wizard (2024-02-22)
Nightly build 4.3-2267 (2024-02-21)
Nightly build 4.3-2266 (2024-02-21)
Release 12.34.7 (2024-02-21)
Nightly build 4.3-2264 (2024-02-21)
Release 12.34.8 (2024-02-21)
Run enforce-pr-rebase whenever a PR is updated (2024-02-21)
Fix Auto-PR comment on squash-label (2024-02-21)
ci: change CLOUDSMITH_OWNER from a var to a secret (2024-02-21)
Release 12.34.9 (2024-02-20)
Release 12.34.10 (2024-02-20)
Release 12.34.11 (2024-02-20)
Release 12.34.12 (2024-02-20)
Replace poison memset by memset_s to avoid compiler optimizing it out (2024-02-20)
Show SeriesLink for AutoRecs (2024-02-20)
Add some ERRNOs for DVR & Config (2024-02-20)
Release 12.34.13 (2024-02-19)
Release 12.34.14 (2024-02-19)
Release 12.34.15 (2024-02-19)
Shorten time for stale issues before a warning is applied (2024-02-19)
Add support for 12-hour custom date formats (2024-02-19)
Add missing htmsg_destroy() call in hdhomerun_server_discover (2024-02-19)
ci: Use correct version of merge commit block action (2024-02-18)
ci: Block merge or autosquash commits in PRs (2024-02-17)
docs: Fix broken Readme.md badge for builds (2024-02-17)
Add automatic labels to PRs (2024-02-17)
Remove broken codeball (2024-02-17)
ci: use CURL for cloudsmith.sh and enable RPM upload (2024-02-15)
Nightly build 4.3-2229 (2024-02-12)
Nightly build 4.3-2228 (2024-02-10)
Nightly build 4.3-2227 (2024-02-10)
Nightly build 4.3-2226 (2024-02-08)
Release 12.34.16 (2024-02-07)
Nightly build 4.3-2224 (2024-02-06)
Nightly build 4.3-2223 (2024-02-06)
Nightly build 4.3-2222 (2024-02-05)
descrambler: Fix Sky-UK descrambling (2024-02-05)
Release 12.34.17 (2024-02-04)
Nightly build 4.3-2214 (2024-02-04)
Nightly build 4.3-2213 (2024-02-04)
Nightly build 4.3-2212 (2024-02-04)
Nightly build 4.3-2211 (2024-02-04)
Nightly build 4.3-2210 (2024-02-03)
Remove sweep-ai again as it is not useful at all (2024-02-03)
Mark PRs needing squashing as stale after a while (2024-02-03)
Automatically comment on PRs needing squash (2024-02-03)
Fix audio-only timeshift memory usage (2024-02-03)
Sanitize filename in content-disposition header (2024-02-03)
Nightly build 4.3-2209 (2024-02-02)
Nightly build 4.3-2207 (2024-02-02)
Nightly build 4.3-2206 (2024-02-02)
Release 12.34.18 (2024-02-02)
Add stale-bot for issues/PRs needing more info (2024-02-02)
Nightly build 4.3-2204 (2024-02-01)
Nightly build 4.3-2203 (2024-01-31)
Nightly build 4.3-2202 (2024-01-31)
Add timeshift support for audio-only channels (2024-01-31)
Nightly build 4.3-2201 (2024-01-30)
Add missing Lithuanian string template (#1608) (2024-01-30)
Nightly build 4.3-2200 (2024-01-28)
ci: fix cloudsmith.sh & add to CI workflow (2024-01-28)
ci: fix broken cloudsmith python (2024-01-23)
ci: fix cloudsmith for python3.5 (2024-01-22)
Nightly build 4.3-2193 (2024-01-21)
Nightly build 4.3-2192 (2024-01-11)
Nightly build 4.3-2191 (2024-01-11)
descrambler: apply ICAM update from Chris230291 (2024-01-11)
descrambler: avoid dlopen() (2024-01-11)
Nightly build 4.3-2190 (2024-01-05)
Nightly build 4.3-2189 (2024-01-05)
linuxdvb: add DVB-S2X parameters (2024-01-05)
descrambler: support ICAM if detected in libdvbcsa (2024-01-04)
Nightly build 4.3-2188 (2024-01-01)
Nightly build 4.3-2187 (2023-12-26)
Nightly build 4.3-2186 (2023-12-18)
Release 12.34.19 (2023-12-13)
Nightly build 4.3-2184 (2023-12-13)
Remove references to Tvheadend Foundation. (2023-12-13)
Nightly build 4.3-2183 (2023-12-11)
Update copyright year and correct current surname (2023-12-09)
github: add FUNDING.yml with OpenCollective link (2023-12-09)
Release 12.34.20 (2023-12-06)
Nightly build 4.3-2174 (2023-12-06)
Nightly build 4.3-2173 (2023-12-06)
Nightly build 4.3-2172 (2023-12-06)
Nightly build 4.3-2171 (2023-12-06)
Nightly build 4.3-2169 (2023-12-06)
WebUI: Update donation string as a test to Transifex feed (2023-12-06)
Add Parental Rating Labels (2023-12-05)
Nightly build 4.3-2167 (2023-12-01)
Nightly build 4.3-2166 (2023-12-01)
gitignore: add debian/.debhelper folder (2023-12-01)
ci update build config (2023-12-01)
update libvpx to 1.13.1 (2023-11-29)
update x264 to c196240 (2023-11-29)
update ffmpeg to 6.0.1 (2023-11-29)
Nightly build 4.3-2162 (2023-11-28)
Fix builds on stretch (2023-11-28)
Nightly build 4.3-2161 (2023-11-21)
Add rpi-bookworm to targets (2023-11-21)
Nightly build 4.3-2160 (2023-11-20)
Update ffmpeg to 5.1.4 (2023-11-20)
Release 12.34.21 (2023-10-15)
Release 12.34.22 (2023-10-14)
6310 Set 'okay' default to True (2023-10-14)
Release 12.34.23 (2023-08-12)
Release 12.34.24 (2023-08-12)
Release 12.34.25 (2023-08-09)
Fix bug #6293 – Missing EIT EPG Content Type (2023-08-09)
Fix some build and add more targets (2023-08-08)
Nightly build 4.3-2149 (2023-08-06)
Nightly build 4.3-2144 (2023-08-02)
Add 'age rating' field to recording metadata (2023-08-02)
Nightly build 4.3-2143 (2023-07-30)
Nightly build 4.3-2142 (2023-07-30)
OTA Genre translation squashed v2 (2023-07-30)
Nightly build 4.3-2141 (2023-07-19)
Bug Fix: OTA EIT Parental Rating (2023-07-19)
Revert non-portable function to previous code (2023-06-25)
Nightly build 4.3-2139 (2023-06-23)
Fix spelling errors encountered during previous work (2023-06-23)
Fix Fedora CI build (2023-06-15)
Disable broken codeball (2023-06-12)
Add Fedora RPM build to Github Actions (2023-06-07)
Update config for Fedora 37/38 (2023-06-07)
Nightly build 4.3-2118 (2023-04-17)
Release 12.34.26 (2023-04-02)
Remove references to CLA which is no longer available (2023-04-02)
Remove deprecated get_best_effort_timestamp() call (2023-03-25)
fix for 64bit time_t on 32bit systems (2023-03-08)
Don't attempt to approve PRs automatically (2023-03-06)
Codeball should also label PRs that need review (2023-03-05)
Fix for DVB Grabber and IPTV Stream (2023-02-24)
RTSP redirect support fix and moved to http client (2023-02-24)
Use codeball for PRs (2023-02-21)
Unify names and order of Unicable-specific configuration fields (2023-01-24)
Add descriptions to the existing Unicable configuration fields (2023-01-24)
grammar: Replace "then" with "than" (2023-01-17)
remove libavresample from build scripts (2023-01-10)
Add amd64 jammy to builds (2023-01-04)
Fix a few more builds, add kinetic support (2022-12-21)
Allow old builds to pass (2022-12-21)
Build for kinetic instead of impish (2022-12-21)
Remove variable declaration from for-loop (2022-12-17)
Don't fail on strict aliasing violations (2022-12-17)
Remove always-true checks (2022-11-21)
Reduce ADTS header size for better compatibility (2022-11-21)
Don't call epg_broadcast_set_description twice (2022-11-21)
Serve static html files with mimetype text/html (2022-11-21)
Increase maximum ADTS packet size to match FFMPEG (2022-11-10)
Fix race condition/data corruption in imagecache (2022-10-27)
Fix bad mono2sec usage (2022-10-27)
Attempt to fix HBBTV memory leak (2022-10-26)
Fix typo (2022-10-26)
Close FDs even if no UDP connection is used (2022-10-26)
Fixed typo (2022-10-26)
Update regexps for the finnish EIT scraping (2022-10-16)
mpegts dvb: Add support for LCN for provider DigiTV (2022-10-14)
output: UDP streaming (2022-10-07)
Fix potential memory leak (2022-10-07)
Avoid leaking iptv fd's (2022-10-07)
Fix FTBFS introduced by 86f3617c8972c5362e51cee7d34cc2d69d799126 (2022-09-15)
Fix crash when mpegts_service_refresh tries to open the CAT again (2022-09-15)
extending the regexps for the italian EIT scraping (2022-07-08)
No longer use git-protocol (2022-06-17)
add Access-Control-Allow-Headers content-length (2022-04-22)
Update Copyright year (2022-04-14)
Travis CI is dead, use GitHub actions for badge (2022-04-11)
GitHub actions improvements (2022-04-11)
Use GitHubs CI for Building (2022-04-11)
Add HMF_UUID to htsmsg_binary_write (2022-04-11)
Prevent deadlock-detector leaking memory (2022-04-08)
Remove useless null-check on an array (2022-04-08)
Fix potential null-pointer-dereference (2022-04-08)
More doozer build fixes (2022-02-14)
Fix doozer CentOS build (2022-02-14)
Fix sid doozer build (2022-02-14)
Update Python shebangs to python3 (2022-02-14)
Update RPM to python3 (2022-02-13)
Doozer fixes (2022-02-13)
Fix doozer builds (2022-02-13)
Fix some failing builds (2022-02-13)
Add --nowerror to build for RPM packages (2022-02-13)
Fix failing builds again (2022-02-12)
doozer: Migrate to Fedora 34 and 35 (2022-02-12)
epg: ignore past events when matching on eid (2022-02-12)
Fix some issues introduced in #0165f365cd58bbcc3734e4ec9ce696b42870ff8e (2022-01-10)
Fix "as: invalid option" during libvpx compilation (2022-01-09)
Update Makefile.ffmpeg (2022-01-02)
Fixed parsing w_scan format (2021-11-15)
Expose RDS flag via HTSP. (2021-09-06)
Add support for SCT_RDS (2021-09-06)
Fix ffmpeg jessie build error (2021-07-24)
Attempt to fix jessie build (2021-07-23)
Attempt to fix jessie build (2021-07-23)
Attempt to fix trusty and centos builds (2021-07-23)
Doozer.io: Add build targets for Debian, Bullseye & Sid (2021-07-23)
Fix slow loading bandwidth monitor graph in status tab (2021-07-21)
As we no longer have access to #hts on freenode swap to using libera - see https://tvheadend.org/issues/6054 (2021-06-12)
Add NVIDIA Hardware accelerated decoding for transcoding (2021-06-09)
Fix EN50211 size for large messages (2021-05-31)
Update ffmpeg to 4.4 (2021-05-05)
Fix missing } from previous commit (2021-05-05)
SAT>IP-Client: Add option for 16, 24 and 32-channel DVB-C tuners (2021-05-04)
Update .gitignore (2021-05-01)
Delete .DS_Store (2021-05-01)
Delete .DS_Store (2021-05-01)
Delete .DS_Store (2021-05-01)
specified the value on each line (2021-05-01)
Improve Readme.md file with a more visual approach (2021-04-21)
Move travis builds from trusty to bionic (2021-04-20)
Update libssl-dependency information (2021-04-02)
Fix possible deadlock (2021-04-02)
remote timeshift: fix compilation with IPTV disabled (2021-03-19)
Try to fix error during compilation (2021-03-16)
Reset error counters for IPTV on start, issue #5760 (2021-03-16)
remote timeshift: fix crash on multiple subscriptions and cleanup (2021-03-16)
Fix possible NULL-Pointer-reference (2021-03-12)
Fix issues identified by coverity (2021-02-24)
Attempt to fix nvenc encoding (2021-02-21)
Rewrite scanfile.c for dynamic memory allocation (#1387) (2021-02-20)
Fix more issues identified by coverity (2021-02-18)
Fix crash when using matroska profile (2021-02-18)
More coverity fixes (2021-02-18)
Fix several issues discovered by coverity (2021-02-18)
Remove link to bintray as they will shutdown in 2 weeks (2021-02-18)
Move from travis-ci.org to travis-ci.com and update date (2021-02-18)
Silcense more x265 warnings (2021-02-18)
Enable LIBX265_DIFFS again (2021-02-18)
Add accidentally deleted line again (2021-02-18)
Fix too small memory allocation (2021-02-17)
Add ISDB-T in hdhomerun (2020-12-29)
Added ISDB-T SATIP Support (2020-12-29)
Sat>IP clear old signal info when opening new stream (2020-12-14)
Remove libva-x11 dependency (2020-12-06)
Correct Environment variable name. (2020-10-28)
Add removed checksum (2020-10-27)
Use https for downloading ffmpeg and update nv-codec-headers (2020-10-27)
Change no_sanitize("thread") attributes (2020-10-22)
Adding polish scraper for DVBC (2020-10-21)
Fix #5962 (2020-10-19)
Make focal use python3 for upload (2020-10-14)
Attempt to fix focal build in doozer (2020-10-14)
Fix vaapi patch (2020-10-12)
Fix cut & paste error in api/epg. (#1360) (2020-10-08)
Upgrade to libhdhomerun_20200521 (2020-09-13)
Fix TheTVDB Query (2020-07-13)
Attempt to fix doozer build/python2/3 detection (2020-07-07)
Additional sanity check (2020-07-06)
Report AAC and AAC-LATM correctly. Always raw stream AAC audio as audio/aac. (2020-07-06)
see https://tvheadend.org/issues/5722 (2020-07-06)
Replace long by int64_t in json parser, fixes #5844 (#1349) (2020-07-06)
Fix memory leak (2020-06-10)
Allocate space for buf on heap (modified PR #1324) (2020-06-08)
Allocate space for buf on heap (modified PR #1324) (2020-06-08)
xmltv: add program icon to exported xmltv. Fixes: #5685 (2020-06-08)
Fix infinite loop when parsing invalid EIT CRID data (2020-06-05)
Fix building with -fno-common (default from GCC 10) (2020-06-03)
Change nv-codec-headers path, fixes #5901 (2020-05-22)
Add python3 requests dependency (2020-05-22)
Changed default .pid path from /var/run/tvheadend.pid to /run/tvheadend.pid to follow "new" FSH 3 standard (2020-05-21)
dvbpsi: Fix build when DVB is not enabled at all (2020-05-21)
Update Copyright date on UI 'About' screen. (2020-05-21)
Drop focal i386 support (2020-05-19)
Fix doozer builds (2020-05-19)
Fix doozer builds (2020-05-19)
Use python3 if available (2020-05-18)
Deprecate python2, add support for python3 (#1338) (2020-05-17)
Use HTTPS for libhdhomerun download (2020-05-15)
Upgrade to libhdhomerun_20200225 (2020-05-15)
Move from cosmic to focal (#1337) (2020-05-15)
Update copyright and packages link (2020-05-15)
Use python3 on focal (2020-05-15)
Fix buffer overflow (2020-05-15)
Prevent buffer overflow, fixes #5896 (2020-05-15)
Move forward from cosmic to focal (2020-05-15)
HTSP v35: Add support for recording file size (2020-05-14)
Fix the query URL for IMDB website. (#1327) (2020-05-14)
Fix #5782 (2019-11-28)
esstream: fix NULL dereference in elementary_set_filter_build(), fixes #5787 (2019-11-28)
capmt: fix the input filter (2019-11-15)
mpegts service: fix the build without mpegts_dvb (see PR#1321) (2019-11-04)
service: fix the default return value for service_get_source() (2019-11-04)
docs: add hint on shell redirections (#5761) (2019-11-01)
satip client: try to the the missing poll file descriptor removal, issue #5496 (2019-11-01)
tvhpoll: add event helpers, code cleanups (2019-10-31)
htsstr: fix the wrong argument parsing, fixes #5761 (2019-10-31)
htsstr: add htsstr_argsplit() test (2019-10-31)
tvhpoll: add tvhpoll_set_trace() (2019-10-28)
xmltv: Fix xmltv_ns typo, fixes #5720 (2019-10-27)
webui: m3u playlist - mark tag playlists with type=playlist, fixes #5663 (2019-10-24)
tvhdhomerun: fix the cablecard access in tvhdhomerun_frontend_monitor_cb() (2019-10-21)
api: return EPERM for the empty arguments, fixes #5755 (2019-10-21)
satip client: allow to set the rolloff to all possible combinations (2019-10-21)
satip client: SATIP Kathrein & Triax: Avoid mandatory rolloff on DVBS2, fixes #5517 (2019-10-21)
dvr: fix the DVR limit per user condition (substract self) (2019-10-21)
access: allow to change/set xmltv/htsp output format per matched entry (2019-10-21)
access.h: reorder access_t (format members) (2019-10-21)
Fix division by 0, fixes #5754 (2019-10-20)
dvb psi: fix the removed MPEG2VIDEO assignment, fixes #5752 (2019-10-19)
mux grid: enable 'hide: parent disabled' (2019-10-18)
dvb psi: add 0x87 estype as EAC3 (ATSC), fixes #5684 (2019-10-17)
iptv: fix integer overflow on 32-bit platforms (2019-10-15)
linuxdvb: fix integer overflow on 32-bit platforms (2019-10-15)
packaging: add missing DEBHELPER placeholder to postrm script (2019-10-15)
Fixed bad quality for vaapi transcoding h264 and hevc with bitrate (2019-10-15)
Upgrade to libhdhomerun_20190621 (2019-10-15)
Mux scan: Log correction (2019-10-15)
tvhcsa: shift the standard headers to top (2019-10-15)
Added patch to HDHomerun library to allow cross-compilation (2019-10-15)
channels: Make const-correct. (2019-10-15)
autobuild: add build target for raspbian-buster (2019-10-15)
api: fix the wrong negative error codes, fixes #5743 (2019-10-14)
linuxdvb: take in account similar dmx for the exclusive tuner access, fixes #5744 (2019-10-14)
linuxdvb: compilation fix, fixes #5739 (2019-10-06)
man page: Correct default values for http and htsp port (2019-10-06)
service: correct fhdtv/uhdtv height checks (2019-10-06)
add FHD quality support (2019-10-06)
linuxdvb: do not mix DVBv3/v5 stats, it causes trouble to drivers, fixes #5625 (2019-10-06)
satip client: add ATSC- string parsing, issue #5728 (2019-10-06)
cclient: more ECM PID fixes, reorder code to be more readable, fixes #5659 (2019-08-02)
cclient: mark correctly ECM PID for close, fixes #5659 (2019-07-29)
cclient: fix the ECM PID flag for newcamd and cccam, fixes #5659 (2019-07-06)
mpegts: use 32-bit tsid/onid to define the NONE /unset/ state properly (2019-06-30)
linuxdvb: fix signal status monitor (2019-06-30)
capmt: another complation fix, fixes #5661 (2019-06-18)
capmt: fix compilation with recent gcc, fixes #5657 (2019-06-17)
dvbpsi: fix the freesat bouquet update (inverted condition), fixes #5572 (2019-03-24)
api: return an error when incomplete query is passed, fixes #5568 (2019-03-21)
linuxdvb: use the right configuration root for the slave tuners (loading), issue #5128 (2019-03-20)
linuxdvb: create the mux instances also for the slave tuners, issue #5128 (2019-03-20)
http server: fix digest MD5 authorization, fixes #5573 (2019-03-13)
Add sat longitude and usals angle as parameters to the rotor external command (2019-03-13)
utils: sbuf - use correct format character, fixes #5565 (2019-03-07)
freesat bouquet parser: fix endless loop (double list insert), fixes #4851 (2019-03-06)
utils: cosmetic fix for sbuf_alloc_fail (2019-03-06)
eit: fix the possible NULL dereference (2019-03-06)
SAT>IP: fix done - close sessions only when server is active (2019-03-06)
mpegts: fix the idle scan (use another idle scan queue - fixes #5548) (2019-03-02)
tvh thread: increase the default watchdog timeout to 15 seconds (2019-03-02)
tvh-json.py: the list is returned instead dictionary (2019-03-01)
Prevent rebinding when refreshing SAT-IP Server settings and not changing port, fixes #5539 (2019-03-01)
systemd: service/unit should not be started until after file-systems are mounted - this avoids "file missing" errors (2019-03-01)
iptv: another improvement in the thread exit procedure, fixes #5550 (2019-02-28)
iptv: improve the thread exit procedure - use pipe, fixes #5550 (2019-02-27)
iptv: improve the thread exit procedure, issue #5550 (2019-02-27)
satip client: initialize variable _w correctly for the PIDs split rewrite, fixes #5544, issue #5549 (2019-02-16)
satip client: fix the compilation, fixes #5547 (2019-02-16)
satip client: fix for the PIDs split - missing delpids, issue #5544 (2019-02-15)
Triax & Kathrein: Increase pid length, issue #5544 (2019-02-15)
satip client: improve the PIDs split for the PLAY RTSP command, fixes #5544 (2019-02-15)
Added compatibility mode for SAT-IP tuners that mess up tuner numbers, for example FritzBox 6490/6590 (2019-02-14)
Fix description of RTP/AVP/TCP Mode (2019-02-14)
satip client: workaround for FritzBox 6490/6590 (status string parsing), rewritten PR#1256 (2019-02-14)
http: digest - do not use EVP_sha512_256() for nonce, check openssl version (2019-02-14)
http: digest - return back MD5 as only digest hash (multiple login dialogs for firefox/chrome) (2019-02-14)
http: digest - show the SHA hash as an authentication alternative (tested with curl) (2019-02-14)
mpegts input: fix the compilation error, fixes #5492 (2019-02-14)
http server: fix the new digest hashes (appearently firefox nor chrome do support them) (2019-02-14)
mpegts: pid subscription - fix wrong mps_type mpegts_mps_cmp(), fixes #5492 (2019-02-14)
http server: add support for SHA-256 and SHA-512/256 digest hashes (2019-02-13)
esfilter: cosmetic fix (2019-02-12)
esfilter: fix the wrong other mask (hbbtv), fixes #5531 (2019-02-12)
descrambler: simplify some destroy sequences (2019-02-11)
channel: get number - select the lowest service number, fixes #5441 (2019-02-11)
dvb psi: fix hbbtv parsing, fixes #5531 (2019-02-09)
Corrected local_ip description text (2019-02-04)
Log an error message if the configured IP address is invalid (2019-02-04)
Move HDHomeRun config fields into their own group in the UI (2019-02-04)
Avoid caching HDHomeRun's IP address (2019-02-04)
Assign a different port number for each frontend thread (2019-02-04)
Changes to make tvheadend work in a container while talking to HDHomerun (2019-02-04)
dvr: Add {min,max}season and {min,max}year to autorec UI, fixes #5479 (2019-02-04)
Kathrein EXIP: Add default config (SATIP) (2019-02-04)
Update posix.mk (2019-02-04)
CSS: Fixes (2019-02-04)
WebUI: Update copyright year (2019-02-04)
m3u: fix the NULL dereference if the input string cannot be converted to utf-8, fixes #5525 (2019-02-04)
satip server: parse destination for RTP/AVP transfer (2019-01-24)
satip client: fix the network limit/group description (2019-01-23)
satip server: add icon files, fixes #5268 (2019-01-21)
eit: config - fix the json syntax error, fixes #5503 (2019-01-18)
eit: fix UK Cable Virgin configuration, fixes #5499 (2019-01-18)
mpegts dvb network: fix create mux - wrong class used for comparison (since commit dbee3d2049faa7d5e15374ddef37a91e86768b26), fixes #5486 (2019-01-17)
mpegts network: stop all running muxes when the network was disabled by the user, fixes #5497 (2019-01-15)
mpegts input: change mpegts_input_tuning_error() to more universal mpegts_input_error() (2019-01-15)
server.h: cleanups for TSS_ flags (2019-01-15)
iptv auto network: check the network enabled flag for the auto download (2019-01-14)
service: enlist - use also is_enabled callback to check the network/mux enable state (2019-01-14)
otamux: fix the 15 seconds delay for the initial scan (2019-01-14)
mpegts: add possibility to enable/disable network (2019-01-14)
http: CORS - small optimization (2019-01-14)
http: CORS - add Access-Control-Allow-Credentials header for cookies (2019-01-14)
parse_ac3: avoid the endless loop for the AC3/EAC3 auto-detection, issue #5353 (2019-01-13)
otamux: fix NULL dereference, fixes #5488 (2019-01-09)
doozer: remove OOL Fedora 27 (2019-01-09)
Makefile.ffmpeg: upgrade ffmpeg to 4.1, x264 to 20190108, x265 to 2.9 (2019-01-09)
avahi: try to fix double free, fixes #5484 (2019-01-08)
DVR: add utf8 validator for title/subtitle when cutted (2019-01-08)
epg: add auto-ota-module detection (2019-01-08)
epggrab: reimplement the OTA grabber selection per mux (2019-01-08)
Add missing !DOCTYPE html (2019-01-02)
CSS: Fix height % (2019-01-02)
eit: always prefer master rather than slave for the config, issue #5247 (2019-01-02)
eit config: fix the uk_freesat_eit description, issue #5247 (2019-01-01)
eit: another attempt to fix the freesat issue (slave eit), fixes #5247 (2019-01-01)
eit: try to fix the freesat issue, fixes #5247 (2019-01-01)
xmltv: add support for the lcn tag, fixes #5471 (2019-01-01)
satip client: remove the dual condition for Annex B (2019-01-01)
satip client: fix the ATSC-C (Annex B) parameters, fixes #5447 (2019-01-01)
cosmetic fixes and optimizations (2019-01-01)
xmltv export: add LCN to the display-name attribute, fixes #5471 (2019-01-01)
pass muxer: fix the incorrect section length for EIT table, fixes #5418, issue #5062 (2018-12-30)
teletext: fix the subtitle parser (wrong SCT_ type match), issue #5422 (2018-12-28)
htsp server: use HTTP image URLs for image cache for older clients (pvr.hts), fixes #5455 (2018-12-28)
imagecache: the timer function is already called inside imagecache_lock (sorry), fixes #5458 (2018-12-26)
hdhomerun: auto detect DVB_T devices (2018-12-26)
imagecache: fix the missing ref initialization, fixes #5458 (2018-12-26)
Fix mpegts packet length in descrambler_data_key_check (2018-12-25)
imagecache: do not use global lock, fixes #5453 (2018-12-25)
cclient: check keep-alive also when no poll event occurs, fixes #5445 (2018-12-22)
mpegts: fix mpegts_service_find_e2() for atsc-t (2018-12-22)
caclient: handle correctly connection close / read error, fixes #5445 (2018-12-22)
satip server: fix ATSC-T / Annex B cable frequency parsing, fixes #5447 (2018-12-20)
linuxdvb: satconf - cleanups for the rotor external command (2018-12-19)
added linudvb_rotor_external to control an actuator by spawning an external command (2018-12-19)
webui: status - drop all connections - use new id=all call, fixes #4937 (2018-12-19)
webui: add "drop all connections", fixes #4937 (original request only) (2018-12-19)
api: add id=all for the connections/cancel, issue #4937 (2018-12-19)
xmltv import: fix the wrong end-of-string mark (off-by-one), fixes #5443 (2018-12-17)
dvr: move dvr_notify() call to the global_lock using timers, fixes #5437 (2018-12-16)
dvb psi pmt: change the teletext subtitle handling for multiple teletext descriptors, issue #5422 (2018-12-15)
satip server: use strempty() function for the uuid check, fixes #5434 (2018-12-15)
tvh thread: do not crash when mutex==NULL (magic check failed), fixes #5435 (2018-12-15)
satip client: fix the double (and wrong) sf_last_data_tstamp update, fixes #5374 (2018-12-14)
dvr: fix the real_start variable misuse, fixes #5426 (2018-12-14)
tvh thread: remove wrong commit code (2018-12-14)
htsp server: fix the wrong htsmsg destroy introduced in the imagecache patch, fixes #5430, fixes #5431, fixes #5429 (2018-12-14)
iptv: remove double pcr: from traces (2018-12-14)
sbuf: add sbuf_replace() (2018-12-13)
mpegts input: add CC restart for tables, too (2018-12-13)
iptv http: call iptv_input_mux_started(), move recv_flush to http-header back (2018-12-13)
imagecache: increase the save access threshold again (2018-12-12)
profile: add more doc to the pass rewrite fields (2018-12-12)
imagecache: do not update the accessed field too much (2018-12-12)
remove debug code (added by mistake) (2018-12-12)
dvb psi lib: add dvb_table_parse_reinit functions (2018-12-12)
iptv http: remove the wrong si rewrite code, cleanup the free sequence (2018-12-12)
Makefile.ffmpeg: add crypto protocol for crypto+http (hls) (2018-12-11)
tvh thread: fix print other mutexes for abort (2018-12-11)
http: fix the wrong return value (previous patch) (2018-12-11)
http server: remove wrong aa_auth check from page_srvid2, fixes #5416 (2018-12-11)
http: add auth type detection (2018-12-11)
main: fix compilation without traces (2018-12-11)
mpegts: do not set wrong pls code for bouquet rescan (2018-12-11)
iptv: http - fix the compilation problem with the previous patch (2018-12-11)
iptv: http - do not clear the input sbuf in the kick callback (2018-12-11)
iptv: correction for the previous patch, fixes #5415, issue #5353 (2018-12-11)
iptv: add missing lock to the iptv_http_kick_cb, fixes #5415, issue #5353 (2018-12-11)
ui: Fix background image to not accept clicks (#5405). (2018-12-10)
profile: do init for all profile sharer members, issue #5409 (2018-12-10)
tvh_thread: print filename/lineno for the magic failure when appropriate (2018-12-10)
timers: little fixes (2018-12-10)
timers - change locking schema, fixes #5413, issue #5353 (2018-12-10)
tprofile: fix possible division by zero (2018-12-10)
iptv http input: play with the locking, issue #5353 (2018-12-09)
fix some problems detected by cppcheck, issue #5353 (2018-12-09)
Don't warn on packets with small/no payload. (2018-12-09)
htsp_server: init htsp_out_mutex (2018-12-09)
main: add gtimer/mtimer magic checks (2018-12-08)
tvh thread: add mutex magic check routines (2018-12-08)
tvhcsa: fix log offset type (2018-12-06)
tvh_thread: show also waiters (2018-12-06)
Reduce DESCRAMBLER_MAX_KEYS from 64 to 8, fixes #5400 (2018-12-06)
wizard: spruce it up a bit (2018-12-06)
Maximize use of libdvbcsa's batch processing. (2018-12-06)
freebsd: Fixup header files for socket definitions. Make thread owner conditional on Linux. (2018-12-06)
Prepend title to autorec comment when created from EPG. (2018-12-05)
Fix compilation error: 'saveptr' may be used uninitialized in this function [-Werror=maybe-uninitialized] (2018-12-05)
xmltv: split names in credits, fixes #5359 (2018-12-05)
htsmsg: check the field/key name length (max 255 characters), issue #5359 (2018-12-05)
satip client: activity timeout cleanups (2018-12-03)
pass muxer: correct SI length for trimed events (2018-12-03)
tvh_thread: do not use debug code when not activated, issue #5353, issue #5389 (2018-12-03)
atomic cleanups in tvh_thread, tvhlog (clang) (2018-12-02)
tvhlog: add missing lock (2018-12-02)
tvh_thread: another filename/lineno cleanups (2018-12-02)
tvh_thread: do not print sid for non glibc binaries, fixes #5385 (2018-12-02)
tvhthread: fix the cond wait routines (preserve correctly filename/lineno) (2018-12-02)
pass muxer: fix pass_muxer_nit_cb() - wrong private tag copy (2018-12-02)
xmltv: always change the module name after restart, fixes #5383 (2018-12-01)
http/webui: add special/srvid2 handling (2018-12-01)
dvb support: remove wrong characters bellow 0x20 (except 0x0a - newline), issue #5366 (2018-12-01)
linuxdvb: add DMX_SET_SOURCE settings at the probe, fixes #5379 (2018-12-01)
imagecache: tiny code reshuffle (2018-12-01)
imagecache: try to fix the state handling, fixes #5382 (2018-12-01)
opentv: add NULL check to the opentv_find_entry(), fixes #5381 (2018-12-01)
imagecache: another code reshuffle, add save for the accessed update, issue #4304 (2018-11-30)
imagecache: fix the build when caching code is deactivated, fixes #5372 (2018-11-30)
imagecache: move saving procedure outside global_lock, fix imagecache_id after start, issue #4304 (2018-11-30)
imagecache: fix 'accessed' field loading and the default value, issue #4304 (2018-11-30)
satip client: cosmetic (indent) (2018-11-30)
satip client: show the proper connection state in 'RTSP cmd error' log message (2018-11-30)
Add ATSC-T With 8VSB Modulation (for Korean User) (2018-11-30)
watchdog: rename tv_mutex_init to tvh_mutex_init (2018-11-29)
opentv: fix the wrong event cleanup in opentv_add_entry(), issue #5297 (2018-11-29)
tvhlog: fix tvhdbg() prototype when traces are not activated, fixes #5362 (2018-11-28)
watchdog: fix missing pthread_mutex_destroy -> tvh_mutex_destroy, issue #5361 (2018-11-28)
tvhlog: fix NULL dereference crash (2018-11-28)
tvh thread: print the deadlock text also to stderr (2018-11-28)
tvhlog: add tvhdbg() and send realtime mutex log lines to the UDP socket (if requested) (2018-11-28)
debian: remove db_reset lines - fixes #5358 (2018-11-28)
tvh thread: compile the debug thread code only when traces are enabled (2018-11-27)
tvh thread: fix gtimer_cond timedwait and tvh_cond_init() (2018-11-27)
update valgrind.supp (2018-11-27)
tvh thread: add mutex debug timing, fix the watchdog code (2018-11-27)
webui: remove Title0 typo (2018-11-27)
webui: streaming - fix the removed scoped lock, fixes #5356 (2018-11-27)
webui status: add user-agent (client) column (2018-11-27)
descrambler: remove unused code (2018-11-27)
docs: use a table for the program details dialog toolbar items (2018-11-27)
docs: another screenshot update (2018-11-27)
docs: update debugging (2018-11-27)
debian packaging: use db_purge on --purge (2018-11-27)
debian packaging: always reset superuser info on removal (2018-11-27)
cosmetic: TVHeadend|tvheadend -> Tvheadend, where needed for consistency (2018-11-27)
docs: update and add persistent auth info, refresh some screenshots and tweak a few bits (2018-11-27)
access: a little code reorganization for the latest tags exclude change (2018-11-27)
access: fix tag exclude (2018-11-27)
tvh_thread: remove restrict keyword (2018-11-27)
thread: add mutex watchdog (2018-11-27)
initial pthread mutex/cond wrappers to detect deadlocks (2018-11-27)
move htsstr.h to tvh_string.h (2018-11-27)
imagecache: fix the expire id, issue #4304 (2018-11-27)
satip client: fix activity timestamp for TCP data transfer mode, fixes #5348 (2018-11-27)
opentv: improve the splitted event merge logic, issue #5297 (2018-11-26)
imagecache: add 'expire' time for the cached files, fixes #4304 (2018-11-26)
tvh-json.py: add proper digest/plain authentication, fixes #5350 (2018-11-26)
satip client: add hard timeout for the incoming data (2018-11-25)
capmt: cosmetic - remove double 'in' from log (2018-11-25)
opentv epg: try to fix the incomplete grabbing (use the whole time window for all subscribed PIDs), issue #5297 (2018-11-25)
service: do not stop the raw service streaming when service is not enabled (2018-11-24)
pass muxer: check correct variable for MC_CAP_ANOTHER_SERVICE, issue #5344 (2018-11-24)
pass muxer: do not check for multiple active services (it might not be true), issue #5344 (2018-11-24)
pass muxer: add possibitity to continue streaming even if the service is changing, issue #5344 (2018-11-24)
webui debugging tab: typo fix (2018-11-23)
http/webui: return not found status when redirection is not possible, fixes #5342 (2018-11-23)
webui: Add 'query CSFD' in dvr broadcast info window (2018-11-23)
webui: Add 'grougRenderer' in all tabs (2018-11-23)
webui: Add group renderer capabilities, now when grouping the title don't care about copyright year (2018-11-23)
spawn: show permissions problem with kill, issue #4774 (2018-11-23)
main: Load OpenSSL engines (2018-11-21)
http: rewrite again the access verification routines, fixes #5339 (2018-11-20)
dvbpsi: move the cat decoder from descrambler to a common place and use it everywhere (2018-11-19)
descrambler: improve EMM handling - add provider id checks (2018-11-19)
linuxdvb: optimize the exlusive check code (previous change) (2018-11-19)
Fix typo (2018-11-19)
linuxdvb: fix the exclusive frontend access, fixes #5330 (2018-11-19)
dvb_mux_conf_init: set default pls_mode to GOLD, fixes #5328 (2018-11-14)
descrambler: reset 'changed' flag on cc_remove_card (2018-11-12)
cclient: fix crash on cc_remove_card (2018-11-12)
satip: rtp - improve udp_multisend_send() error / full buffer condition checking, fixes #5319 (2018-11-09)
htsmsg: add htsmsg_remove_string_from_list() function (2018-11-09)
webui: fixes #5320 (2018-11-09)
cclient: cc_remove_card - move state to ECM_INIT when active card is removed, issue #5314 (2018-11-09)
http: fix http_access_verify_channel(), fixes #5317 (2018-11-08)
mpegts mux: handle better mm_nicename updates (2018-11-07)
satip server: fix the weight handling for the scrambled slave subscriptions, fixes #5314 (2018-11-07)
satip server: fix pmt rewrite (wrong CC), use sbuf as the internal data buffer (2018-11-07)
satip server: fix memory leak for the slave service subscription, fixes #5314 (2018-11-07)
linuxdvb: do not call linuxdvb_satconf_power_save for non DVB-S frontents, fixes #5311 (2018-11-03)
iptv: add some more traces for pipe fds... (2018-11-03)
spawn: close pipe on fork() error path (2018-11-03)
satip client: do faster recovery when the server reboots (2018-11-01)
linuxdvb: try to improve the rotor logic (finish the movement), issue #5307 (2018-11-01)
linuxdvb: set volt - tiny optimization (2018-11-01)
scanfile: add support for PLS_CODE and PLS_MODE, fixes #5305 (2018-10-31)
linuxdvb rotor: improve satellite longtitude description (2018-10-31)
epg: play link - use temporary auth tickets again, fixes #5302 (2018-10-31)
doozer/autobuild: debian buster target (2018-10-31)
autobuild: remove Ubuntu Precise which is EOL (as of April 28, 2017) (2018-10-31)
doozer: sort targets, add Fedora 29 (2018-10-31)
htsp server: improve the htsp streaming connection limit check, issue #5290 (2018-10-30)
msg queue: wake thread on new message (2018-10-29)
intextra: support 12bit unsigned nrs (2018-10-29)
webui: m3u playlist - add auth tokens for logo, fixes #5291 (2018-10-27)
access: allow advanced streaming for the permanent tickets, fixes #5294 (2018-10-27)
access: set the temporary ticket lifetime between 30 and 3600 seconds (2018-10-27)
access: do not allocate always 50 bytes for aa_representative (2018-10-27)
Make authentication ticket lifetime configurable (2018-10-25)
webui: Fix #5292 (2018-10-25)
webui: more tooltips for help buttons! (2018-10-25)
tcp: fix wrong used variable initialization, issue #5290 (2018-10-24)
access: fix access_copy() for aa_auth, fixes #5285 (2018-10-23)
service mapper: fix locking, issue #5261 (2018-10-23)
service mapper: try to determine quickly services without A/V streams, issue #5261 (2018-10-22)
webui: fix http_m3u_playlist_add(), fixes #5274 (2018-10-22)
service mapper: fix mono2sec -> sec2mono thinko (2018-10-22)
dvr: fix the dvr_rec_subscribe cleanup (2018-10-22)
access: do not use + character for the auth code (HTTP deescaping), issue #5274 (2018-10-22)
dvr: cleanup the error path in dvr_rec_subscribe() (2018-10-22)
dvr_rec: fix early access_destroy (2018-10-22)
service mapper: implement time watchdog (cca 30 seconds) (2018-10-21)
htsp: Tidy serialization of category and keyword. (2018-10-21)
http: auth playlist, return unauthorized when the authcode is not present (2018-10-21)
doc: add authentication type for playlist in url.md (2018-10-21)
fixes for the pernament tickets, issue #5274 (2018-10-21)
http: terminate path correctly in http_resolve() (2018-10-21)
add pernament tickets for the authentization, fixes #5274 (2018-10-20)
dvb psi: fix for the previous commits - move pmt monitor change to mpegts_service_find() (2018-10-18)
dvb psi: fix for the previous commit - reinstall pmt monitor only when it's already installed (2018-10-18)
dvb psi: change PMT monitor when PMT PID changes for SID, issue #4942 (2018-10-18)
linuxdvb: fix again the PLS code skip when the default value is used (2018-10-18)
linuxdvb: set PLS code only when it differs from 1, fixes #5266 (2018-10-17)
bintray: disable uploads :-( (2018-10-17)
campt: fix the ct_multipid initialization, fixes #5097 (2018-10-17)
Automatically generated: 2024-08-11 03:05:13 UTC
Functions to list and manipulate access controls. With the exception of access/entry/userlist, ADMIN privilege is required to use these functions.
Lists the text strings, options and defaults used when configuring access controls within the TVH GUI (ie Configuration -> Users -> Access Entries).
Creates a new user from a JSON object.
conf
The JSON object describing the new user.
Lists users and their privileges. See Common Parameters for details of selection parameters.
Outputs a list of usernames. The "*" user and any users with a zero-length name are excluded.
The function is used internally to populate the "Owner" dropdown in Digital Video Recorder -> Finished Recordings -> Edit. It MUST be called by a user without ADMIN privileges, otherwise an empty list is returned.
Lists the text strings, options and defaults used when configuring access controls within the TVH GUI (ie Configuration -> Users -> IP Blocking Records).
Creates a new IP-based access record.
conf
The JSON object describing the access record.
Lists IP-block records. See Common Parameters for details of selection parameters.
Lists the text strings, options and defaults used when configuring access controls within the TVH GUI (ie Configuration -> Users -> Passwords).
Creates a new password record.
conf
The JSON object describing the record.
Lists passwords for users. Note that "password" is in clear-text while "password2" is base64-encoded with a static prefix. See Common Parameters for details of selection parameters.
If authentication for the user is by persistent token (requires TVHeadend > 4.3.1500) the entry has some extra fields:
These function provide direct access to the internal data structures of TVHeadend. Attempting to modify these internal structures may have unwanted effects including loss of data.
Information is held within TVHeadend in a key-value database. The key for each record is a random 128-bit value called a uuid. The value is a data structure which can be represented in JSON format. The record is called an idnode.
The content of each idnode depends on what it represents; this is indicated by the value of the class
parameter.
Although no special privilege is required to call these functions, access control is applied to the data items being referenced.
Read the value of one or more idnode records. One (and only one) of these parameters must be specified:
uuid
The uuid (or JSON-structured list of uuids) to read.
class
The class of records to read, ie one of the classes returned by .
If uuid
is given, the data to be returned may be qualified by setting one of these parameters to an integer greater than zero:
meta
Include meta-data (default values and descriptions of the data items).
grid
Return a brief summary of the records.
If class
is given, setting the parameter enum
to an integer value greater than zero returns only a set of key-value pairs.
In both cases the list
parameter can be used to select which items are to be output, based on the value of the 'id' field. Multiple entries can be selected, separated by commas, colons or semicolons. A '-' in front of an entry deselects that item (and implicitly selects all others).
Update an existing idnode.
node
The JSON object (or array of objects) containing the update.
Each update must contain the uuid
item. Other items supplied replace those in the idnode; they are not merged.
Read information held in a tree structure (eg for tuner devices).
uuid
The uuid of the starting point in the tree structure, or the special value 'root'.
root
The uuid of the head of the tree structure. Required if uuid
= 'root'.
List information about a specified class; mostly metadata used to configure the TVHeadend UI.
name
The name of the class, ie one of the values returned by classes.
Delete one or more records.
uuid
The uuid (or a JSON-formatted list) of the record(s) to be deleted.
Fields within an idnode may be read-only; for this reason it may not be possible to take the data from idnode/load and use it as input to idnode/save (thanks to Poul Kalff for this information). To check the read-only status of a field, use and check for a 'rdonly' flag.