arrow-left

Only this pageAll pages
gitbookPowered by GitBook
1 of 92

Tvheadend

Introduction

Loading...

Loading...

Installation

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

SETUP

Loading...

Loading...

Loading...

Loading...

Loading...

CONFIGURATION

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

APPENDICES

Loading...

Loading...

Loading...

Development

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...

WIP

Loading...

Loading...

Loading...

Loading...

About

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/7hmZSVRZkZqEIJarLFX5arrow-up-right

circle-info

English language skills are not important for contributions! - It is easier for a native speaker to merge changes and then make edits/corrections than to write everything themselves. If you are unsure where to place content in the current documentation structure please use the WIP section - we will move it later.

Android

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!

Muxes/Scan Files

Web User Interface Customisation

Docker

Tvheadend can run isolated from other host processes in a Docker container. The official Tvheadend container can be pulled from the GitHub container repo:

$ docker pull ghcr.io/tvheadend/tvheadend:master-debian

There is also an established community container from the linuxserver.io team:

https://fleet.linuxserver.io/image?name=linuxserver/tvheadendarrow-up-right

NAS

Community created and supported Tvheadend packages for Synology and QNAP users are available from community package repositories. See below for more information:

hashtag
Synology

https://synocommunity.com/package/tvheadendarrow-up-right

hashtag
QNAP

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.

Using w_scan Scan Files

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.

hashtag
Example

The following command can be used to create a scan file called au-wscan: w_scan -f t -c AU -x > au-wscan

Linux

Tvheadend binary packages can be downloaded from or you can configure a local package repo to install and update from by running the following shell commands:

hashtag
DEB Packages (Debian, Ubuntu, RaspiOS)

Run the following shell command to setup a local apt repo:

Tuners

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

Concepts

It helps to understand the basic software concepts for Tvheadend:

hashtag
Hardware & Software

  • 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.

Stages

Tvheadend setup normally involves the following stages:

  1. Ensure tuners are available for use

  2. Install Tvheadend software

  3. Create a network

  • Network tuners

  • IP sources can also be used. These are discussed elsewhere in our documentation.

    hashtag
    PCI/PCIe Tuners

    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.

    hashtag
    i2s Tuners

    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.

    hashtag
    USB Tuners

    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.

    hashtag
    Network Tuners

    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.

    Associate the network with tuners

  • Add manual muxes - if needed

  • Scan for services

  • Map services to channels

  • Watch TV channels!

  • https://www.myqnap.org/product/tvheadendarrow-up-right
    The explanation of every
    w_scan
    parameter is beyond the scope of this document, however, the
    -f t
    parameter is for scanning DVB-T, the
    -c AU
    parameter sets to country to Australia and 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.

    More details about w_scan can be found here: https://github.com/stefantalpalaru/w_scan2arrow-up-right

    hashtag
    RPM Packages (Fedora, RedHat)

    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.

    hashtag
    Source Code

    Please refer to development documentation on compiling Tvheadend from source

    curl -1sLf 'https://dl.cloudsmith.io/public/tvheadend/tvheadend/setup.deb.sh' | sudo -E bash
    https://apt.tvheadend.orgarrow-up-right
    #------------------------------------------------------------------------------
    # file automatically generated by w_scan
    # (http://wirbel.htpc-forum.de/w_scan/index2.html)
    #! <w_scan> 20170107 1 0 TERRESTRIAL AU </w_scan>
    #------------------------------------------------------------------------------
    # location and provider: <add description here>
    # date (yyyy-mm-dd)    : 2024-06-26
    # provided by (opt)    : <your name or email here>
    #
    # T[2] <freq> <bw> <fec_hi> <fec_lo> <mod> <tm> <guard> <hi> [plp_id] [# comment]
    #------------------------------------------------------------------------------
    T 177500000 7MHz  3/4 NONE    QAM64   8k 1/16 NONE	# Seven Network
    T 184500000 7MHz  3/4 NONE    QAM64   8k 1/16 NONE	# SBS Sydney
    T 191625000 7MHz  3/4 NONE    QAM64   8k 1/16 NONE	# Nine Network Australia
    T 219500000 7MHz  3/4 NONE    QAM64   8k 1/16 NONE	# Network TEN
    T 226500000 7MHz  3/4 NONE    QAM64   8k 1/16 NONE	# ABC Sydney
    curl -1sLf 'https://dl.cloudsmith.io/public/tvheadend/tvheadend/setup.rpm.sh' | sudo -E bash

    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.

  • hashtag
    Tvheadend

    • 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. Digital 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:

    Tvheadend Adapter > Network > Mux > Service > Channel architecture

    hashtag
    Why The Complexity?

    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.

    Digital Video Recorder

    This tab shows all finished recordings:

    'Finished Recordings' Tab

    hashtag
    Menu Bar

    The following functions are available:

    Button
    Function

    hashtag
    Grid Items

    The main grid items have the following functions:

    • Details: Shows the status of the recording event:

    Icon
    Description

    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…

    Concepts

    Tvheadend is operated primarily through a tabbed web interface. There are some basic navigation concepts that will help you use it effectively:

    hashtag
    Page Structure

    • 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 configuration 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.

    hashtag
    Displaying & Manipulating Columns

    • 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.

    hashtag
    Editing Fields

    • 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.

    Requirements

    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

    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.

  • Most grid views support ctrl+click to select multiple fields at the same time, and shift+click to select field ranges.

    Large capacity storage for recordings

  • Tuner device(s) with suitable power and connectivity

  • Operating System that supports the tuners

  • hashtag
    Server Hardware

    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.

    hashtag
    Server Software

    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.

    hashtag
    Connectivity

    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.

    hashtag
    Architecture

    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

    Level 2

    intlconv/charsets

    Lists the available character sets.

    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…

  • 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 recording has completed

    Click to display detailed information about the selected recording

    Finished Recording Detail

    Virtualisation - Proxmox

    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

    hashtag
    Proxmox VM - Debian

    • 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

    1. Install Debian as a VM with at least the minimum requirements - command-line only installs (without desktop environment) recommended to minimise resource usage

    2. Update Debian to latest package versions with

    1. Install Curl package to allow set up of Apt repository

    1. Set up Apt repository - for DEB packages using Curl

    1. Update Apt package list

    1. Install Tvheadend

    1. Passthrough TV tuner hardware to VM guest OS (this can be done through the proxmox web GUI)

    2. Install the TV tuner on the VM guest OS

    3. Access the Tvheadend web configuration interface at: https://<yourtvhserverip>:9981

    hashtag
    Proxmox LXC - Debian

    • 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.

    1. 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

    2. Update Debian packages to latest version Note: a lot of packages will be updated as the Proxmox LXC template is quite old

    1. Install Curl package to allow set up of Apt repository

    1. Set up Apt repository - for DEB packages using Curl

    1. Update Apt package list

    1. Install Tvheadend

    1. 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

    2. Restart LXC container to allow passthrough

    3. Access the Tvheadend web configuration interface at: https://<yourtvhserverip>:9981

    Compiling TVH with VAAPI Support

    for

    for

    Theme

    There are three themes that can be used with the TVH Web User Interface.

    From Configuration -> General -> Base, in the 'Web Interface Settings' panel, select one of the following themes from the drop‑down list.

    hashtag
    Blue (Default)

    Timeshift

    ADMIN privilege is required for these functions.

    hashtag
    timeshift/config/load

    Lists the descriptions, options and defaults for configuring the timeshift capability - see Configuration -> Recording -> timeshift.

    hashtag
    timeshift/config/save

    Untested. Set the timeshift configuration.

    • node Unknown.

    Lubuntu 24.04
    Lubuntu 22.04

    Compiling

    If you prefer to build Tvheadend from source, tarballs and instructions are on GitHubarrow-up-right

    Output

    TVH can serve its own EPG in XMLTV format via HTTP.

    http://[TVH_IP]:9981/xmltv/channels

    Further details with examples can be found here.

    HTTPS access via Reverse Proxy

    In order to access Tvheadend behind a reverse proxy server and still be able to stream services or recordings, it is necessary for the reverse proxy server to add or modify some headers in the HTTP request forwarded to TVH.

    hashtag
    X-Forwarded-Proto:

    Tvheadend currently (as at April 2025) only supports the HTTP protocol natively. To access TVH via HTTPS, an external reverse proxy server is required to convert the incoming HTTPS request to HTTP and forward it to TVH.

    In order for TVH to recognise that it is operating behind a HTTPS reverse proxy server, the proxy server must be configured to add the X-Forwarded-Proto: https header to the request forwarded to TVH.

    Adding this header will ensure that documents that contain a TVH URL, such as M3U files, will be prefixed with correct protocol identifier.

    hashtag
    Host: / X-Forwarded-Host:

    The public-facing host name, port number and path returned by TVH within documents such as an M3U can also be modified. As TVH only recognises the X-Forwarded-Host:header when the Host:header is not present, it is recommended that only the Host:header be modified by the proxy in for following format:

    Host: <External host>[:<External port>][/<External path>]

    Input

    JSON API

    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.

    hashtag
    CAUTION

    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.

    XMLTV

    HTSP

    Continue setup/configuration (in next section)

    Continue setup/configuration (in next section)

    # apt update
    # apt upgrade
    # apt install curl
    # curl -1sLf 'https://dl.cloudsmith.io/public/tvheadend/tvheadend/setup.deb.sh' | sudo -E bash
    # apt update
    # apt install tvheadend
    # apt update
    # apt upgrade
    # apt install curl
    # curl -1sLf 'https://dl.cloudsmith.io/public/tvheadend/tvheadend/setup.deb.sh' | sudo -E bash
    # apt update
     # apt install tvheadend
    hashtag
    Grey
    Sample 'Grey' Theme

    hashtag
    Access

    Sample 'Access' Theme
    Sample 'Blue' Theme

    Common Parameters

    hashtag
    Grid parameters

    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.

    hashtag
    Grid filters

    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.

    hashtag
    Load parameters

    API calls which end in /load, with the exception of , 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).

    HTTP Proxy Examples

    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.

    hashtag
    HTSP API Syntax Summary

    Request:

    Reply:

    hashtag
    Simple Request

    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 JSON response presented as HTSP elements.

    hashtag
    Intermediate Request

    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.

    hashtag
    Advanced Request

    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 . 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

    Input

    List details of input devices. ADMIN privilege is required for these functions.

    hashtag
    hardware/tree

    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.

    hashtag
    hardware/satip/discover

    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.

    The op parameter must be set to all.

    Example: /api/hardware/satip/discover?op=all

    Raw

    Although no special privilege is needed to use these functions, access control is applied at the inode database level.

    hashtag
    classes

    Returns a list of all data classes together with readable titles. Requires version 4.3-406 or later.

    hashtag
    raw/export

    • 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.

    hashtag
    raw/import

    • node A JSON object or array of objects.

    Objects being imported must have a uuid and must already exist in the database.

    Caclient

    API calls related to Conditional Access. ADMIN privilege is necessary for all of these functions.

    hashtag
    caclient/builders

    Lists the text strings, options and defaults used when configuring Conditional Access devices within TVH (ie Configuration -> CAs -> Add).

    hashtag
    caclient/class

    Lists the text strings, options and defaults used when configuring Conditional Access within TVH (ie Configuration -> CAs).

    hashtag
    caclient/create

    Create a new CA instance.

    • class Name of the class to create, ie one of the classes listed by .

    • conf A JSON object describing the new device.

    hashtag
    caclient/list

    List CA clients.

    Date/Time Format

    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

    idnode

    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.

    API Description

    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:[email protected]: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.

    Communication

    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.

    hashtag
    RPC Communication

    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:

    RatingLabel

    Functions to query and manipulate the list of parental rating labels ('G', 'M', 'PG', etc).

    hashtag
    ratinglabel/class

    Lists the text strings, options and defaults used when configuring parental rating labels within TVH (ie Configuration -> Channel/EPG -> Rating Labels -> Add).

    CLI Commands

    Usage: tvheadend [OPTIONS]

    hashtag
    Generic Options

    hashtag

    Language

    hashtag
    language/list

    Produces a list of all known languages and their three-letter ISO639-3 codes. The list is hard-coded within the Tvheadend source.

    hashtag
    language/locale

    Translations

    hashtag
    Main Application Language

    Although, individual WebUI users can select their own display language, the core application takes its language configuration from the operating system.

    When TVH loads, it inspects, in sequence, the following environmental variables: LC_ALL, LANG and LANGUAGE for a recognised language. Should no language information be present, or the language present is not recognised, TVH will default to

    Codec

    ADMIN privilege is required for all of these functions except codec_profile/list.

    hashtag
    codec/list

    Lists available codecs and their properties. This is a very verbose list.

    hashtag

    Random Notes

    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.

    hashtag
    WebUI

    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

    Episode Numbering

    TVH accepts three episode numbering schemes via XMLTV.

    • onscreen

    • dd_progid

    • xmltv_ns

    Recognised Tags/Attributes

    TVHeadEnd only recognises a subset of the total XMLTV schema.

    Multiple instances of some tags like 'actor' or 'category' or 'rating' may be present.

    Bouquet

    ADMIN privilege is required for all of these functions.

    hashtag
    bouquet/class

    Lists the text strings, options and defaults used when configuring bouquets within TVH (ie Configuration -> Channel/EPG -> Bouquets).

    Release / Change Log Mockup

    hashtag
    (yyyy-mm-dd)

    Title of the PR ( yyyy-mm-dd)

    Title of another PR ( yyyy-mm-dd)

    Testing Tuners Using Files

    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.

    See the instructions for creating for more information.

    ESfilter

    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.

    Satip

    ADMIN privilege is required to use these functions.

    hashtag
    satips/config/load

    Lists the descriptions, options, defaults and current settings for configuring the SAT>IP server capability - see Configuration -> General -> SAT>IP server.

    {
       "linuxdvb_rotor_gotox" : "TV Adapters - SatConfig - GOTOX Rotor",
       "dvb_mux" : "DVB multiplex",
       "profile-libav-mpegts" : "MPEG-TS/av-lib",
       "epggrab_mod" : "EPG Grabber",
       "esfilter" : "Elementary stream filter",
       "mpegts_network" : "DVB Inputs - Networks",
       "caclient_capmt" : "CAPMT (Linux Network DVBAPI)",
       "channeltag" : "Channel Tags",
       "codec_profile_libopus" : "libopus",
       "linuxdvb_frontend_isdb_t" : "TV Adapters - Linux ISDB-T Frontend",
       ...
    }
    hashtag
    idnode/load

    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 classes.

    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).

    hashtag
    idnode/save

    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.

    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 idnode/class and check for a 'rdonly' flag.

    hashtag
    idnode/tree

    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'.

    hashtag
    idnode/class

    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.

    hashtag
    idnode/delete

    Delete one or more records.

    • uuid The uuid (or a JSON-formatted list) of the record(s) to be deleted.

    hashtag
    idnode/moveup

    hashtag
    idnode/movedown

    en_US
    .

    hashtag
    Workflow

    Tvheadend uses English (en_US) 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 .potfiles under the intl directory if existing strings are reused or new strings added.

    Merged changes to master template .potfiles are automatically replicated to Transifex where we manage the translation process. Our project is here: https://www.transifex.com/projects/p/tvheadend/arrow-up-right

    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 .pofiles. 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.

    hashtag
    Languages

    Existing languages can be seen here: https://app.transifex.com/tvheadend/tvheadend/languages/arrow-up-right

    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 .pofiles 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!

    hashtag
    esfilter/XXX/class

    Lists the descriptions, options and defaults for configuring the chosen type of filter, ie Configuration -> Stream -> Stream Filters -> {chosen type} -> Add.

    hashtag
    esfilter/XXX/grid

    Returns the parameters of the defined filters of the chosen type. The usual selection options are available, see Grid Parameters

    hashtag
    esfilter/XXX/create

    Creates a new filter of the chosen type. ADMIN privilege is required.

    • conf A JSON object describing the filter.

    hashtag
    satips/config/save

    Untested. Updates the server from an object in the format produced by satips/config/load.

    • node The JSON structure containing the updates.

    classes
    hashtag
    Release 2.3.4567arrow-up-right (yyyy-mm-dd)

    Title of PR (PR 3456arrow-up-right yyyy-mm-dd)

    Yet another PR title (PR 4567arrow-up-right yyyy-mm-dd)

    Release 1.2.3456arrow-up-right
    PR 1234arrow-up-right
    PR 2345arrow-up-right

    WebUI Help Content Workflow

    hashtag
    Front End

    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.

    hashtag
    Build Process

    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 separator. [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.

    FAQ

    hashtag
    Q: How do I get a playlist for all my channels?

    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.

    hashtag
    Q: Why am I getting a playlist when trying to view/stream a channel?

    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.

    hashtag
    Q: Tvheadend has scanned for services but some rows in the Service Name column are blank, is that normal?

    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.

    hashtag
    Q: I get a blank page when trying to view the web interface!

    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.

    hashtag
    Q: Why can’t I see my tuners in Tvheadend’s interface?

    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.

    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.

    hashtag
    Red Black Trees

    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. https://github.com/tvheadend/tvheadend/blob/master/src/redblack.harrow-up-right https://en.wikipedia.org/wiki/Red%E2%80%93black_treearrow-up-right

    Ext JSarrow-up-right
    https://cdn.sencha.com/ext/gpl/3.4.1.1/docs/arrow-up-right
    JSON Documentation
    epg/events/load
    that contains another
    map
    named
    conf
    that contains another
    map
    with the required JSON data represented as HTSP elements.
    JSON API documentation
    caclient/builders
    <programme start="YYYYMMDDhhmmss +0000" stop="YYYYMMDDhhmmss +0000" channel="3">
    	<title lang="en">Event title to display</title>
    	<sub-title lang="en">Event sub-title to display</sub-title>
    	<desc lang="en">Extended event description</desc>
    	<summary lang="en">Event summary</summary>
    	<category lang="en">Category name</category>
    	<keyword lang="en">Keyword name</keyword>
    	<credits>
    		<actor>Actor's name</actor>
    		<director>Director's name</director>
    		<guest>Guest's name</guest>
    		<presenter>Presenter's name</presenter>
    		<writer>Writer's name</writer>
    	</credits>
    	<video>
    		<colour>NO</colour>
    		<aspect>Width:Height</aspect>
    		<quality>HD|FHD|UHD|488|576|720|1080|1716|2160</quality>
    	</video>
    	<subtitles type="teletext|deaf-signed"/>
    	<audio-described />
    	<previously-shown start="2008-10-11"/>
    	<premiere />
    	<new />
    	<episode-num system="onscreen|xmltv_ns|dd_progid">Episode number text</episode-num>
    	<star-rating>
    		<value>X/Y</value>
    	</star-rating>
    	<date>YYYY</date>
    	<rating system="Name">
    		<value>Rating displey text</value>
    	</rating>
    	<icon src="Icon URL" />
    </programme>
    ./tvheadend --tsfile_tuners 1 --tsfile test.ts
    Mux Dump Files

    Imagecache

    Functions controlling the configuration of the Image Cache. ADMIN privilege is required for all of these functions.

    Before version 4.3.1660, these functions were only available if Image Cache support was included at compile time.

    hashtag
    imagecache/config/load

    Lists the current values, defaults and descriptions of the parameters used to configure the image cache.

    hashtag
    imagecache/config/save

    TODO

    hashtag
    imagecache/config/clean

    Delete all files from the image cache and re-load, in the same way as Configuration -> General -> Image Cache -> Clean Image (icon) Cache in the GUI.

    • clean Required parameter, must be 1 - the value is not used.

    hashtag
    imagecache/config/trigger

    Trigger a re-load of the image cache, in the same way as Configuration -> General -> Image Cache -> Re-fetch Images in the GUI.

    • trigger Required parameter, must be 1 - the value is not used.

    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.

    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <HTML><HEAD>
    <TITLE>404 Not Found</TITLE>
    </HEAD><BODY>
    <H1>404 Not Found</H1>
    </BODY></HTML>

    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:

    hashtag
    Streaming Communication

    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).

    hashtag
    Authentication

    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:

    hashtag
    Initial Login Authentication

    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.

    hashtag
    On-Demand Authentication

    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.

    hashtag
    ratinglabel/create

    Creates a new parental rating label. Requires ADMIN privilege.

    • conf A JSON object containing details of the new parental rating label.

    hashtag
    ratinglabel/grid

    Lists details of parental rating labels. For details of the parameters and selection criteria which can be applied, see Grid Parameters.

    hashtag
    ratinglabel/list

    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.

    Service Configuration

    hashtag
    Server Connectivity

    hashtag
    Debug Options

    hashtag
    Testing Options

    -h, --help                  Show this page
    -v, --version               Show version infomation
    Produces a similar list to language/list but also including the full RFC3066 locale reference for those locales which have been compiled into Tvheadend.

    hashtag
    language/ui_locale

    Produces a list in the same format as language/locale but containing only those locales which are supported by TVHeadend (ie have translations available).

    {
       "entries" : [
          {
             "val" : "Undetermined",
             "key" : "und"
          },
          {
             "key" : "aar",
             "val" : "Afar"
          },
          {
             "val" : "Abkhazian",
             "key" : "abk"
          }, ...
       ]
    }
    codec_profile/class

    Lists the text strings, options and defaults used when configuring codec profiles.

    hashtag
    codec_profile/create

    Add a new codec profile.

    • class The name of the codec profile.

    • conf A JSON object describing the codec profile.

    hashtag
    codec_profile/list

    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/XMLTVFormatarrow-up-right and here: https://github.com/XMLTV/xmltv/blob/master/xmltv.dtdarrow-up-right.

    <episode-num system="onscreen">S01E01</episode-num>
    hashtag
    bouquet/create

    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.

    hashtag
    bouquet/detach

    Removes the link from a channel to the bouquet that it is part of.

    • uuid uuid(s) of channels to detach.

    hashtag
    bouquet/grid

    Lists details of bouquets. For details of the parameters and selection criteria which can be applied, see Common Parameters.

    hashtag
    bouquet/list

    Lists names and bouquets. The list excerpted below is coded into tvheadend.

    hashtag
    bouquet/scan

    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.

    filter=[
                {
                    "field" : "<fieldname>",
                    "type"  : "string|numeric|boolean",
                    "value" : "<value>",
                    "comparison" : "gt|lt|eq",
                    "intsplit" : <intsplit>
                 }, ...
            ]
    args               msg[] optional   HTTP arguments
    path               str   required   HTTP path
    response           msg[] required   JSON response 
    [
       {
          "leaf" : 0,
          "uuid" : "efe25f71ce456f99bb5a1b600b2e8143",
          "class" : "linuxdvb_adapter",
          "params" : [
             {
                "nosave" : true,
                "caption" : "Active",
                "id" : "active",
                "default" : false,
                "rdonly" : true,
                "noui" : true,
                "value" : true,
                "type" : "bool"
             },
             {
                "caption" : "Device path",
                "type" : "str",
                "id" : "rootpath",
                "rdonly" : true,
                "default" : "",
                "value" : "/dev/dvb/adapter0",
                "description" : "Path used by the device."
             }
          ],
          "text" : "/dev/dvb/adapter0 [Montage Technology M88DS3103 #0]",
          "caption" : "LinuxDVB adapter",
          "id" : "efe25f71ce456f99bb5a1b600b2e8143",
          "event" : "linuxdvb_adapter"
       }
    ]
    {
       "entries" : [
          {
             "title" : "Linux DVB CAM (CI/CI+)",
             "status" : "caclientNone",
             "uuid" : "7f435a73b190419cc6e69e3956c50549"
          }
       ]
    }
    {
       "entries" : [
          {
             "caption" : "Configuration - Image Cache",
             "params" : [
                {
                   "caption" : "Enabled",
                   "description" : "Select whether or not to enable caching. Note, even with this disabled you can still specify local (file://) icons and these will be served by the built-in webserver.",
                   "id" : "enabled",
                   "default" : false,
                   "type" : "bool",
                   "value" : false
                },
                {
                   "default" : false,
                   "id" : "ignore_sslcert",
                   "type" : "bool",
                   "value" : false,
                   "description" : "Ignore invalid/unverifiable (expired, self-certified, etc.) certificates",
                   "caption" : "Ignore invalid SSL certificate"
                },
                {
                   "caption" : "Expire time",
                   "description" : "The time in days after the cached URL will be removed. The time starts when the URL was lastly requested. Zero means unlimited cache (not recommended).",
                   "type" : "u32",
                   "value" : 7,
                   "id" : "expire",
                   "default" : 0
                },
                {
                   "description" : "How frequently the upstream provider is checked for changes.",
                   "caption" : "Re-fetch period (hours)",
                   "id" : "ok_period",
                   "default" : 0,
                   "type" : "u32",
                   "value" : 168
                },
                {
                   "description" : "How frequently a failed image fetch is retried.",
                   "caption" : "Re-try period (hours)",
                   "value" : 24,
                   "type" : "u32",
                   "id" : "fail_period",
                   "default" : 0
                }
             ],
             "class" : "imagecache",
             "text" : "00000000000000000000000000000000",
             "event" : "imagecache"
          }
       ]
    }
    seq              int  optional   Sequence number. This field will be echoed back by the server in the reply.
    username         str  optional   Username, in combination with 'digest' this can be used to raise the privileges
                                     for the session in combination with invocation of a method. 
    digest           bin  optional   Used to raise privileges.
    seq              int  optional   Sequence number. Same as in the request.
    error            str  optional   If present an error has occurred and the text describes the error.
    noaccess         int  optional   If present and set to '1' the user is prohibited from invoking the method due to 
                                     access restrictions. 
    {
       "entries" : [
          {
             "uuid : "a82438515ecc857dbf2509517ff3fe40",
             "enabled" : true,
             "country" : "AUS",
             "age" : 8,
             "display_age" : 11,
             "display_label" : "PG",
             "label" : "PG",
             "authority" : "ACMA",
             "icon" : "file:///my/file/location/acma-pg.png",
             "icon_public_url" : "imagecache/37"
          }, ...
       ],
       "total" : 9
    }
    {
       "entries" : [
          {
             "val" : "AUS",
             "key" : "7b1f8773747155ed7341c8328a037f28"
          }, ...
       ]
    }
    -c, --config                Alternate configuration path
    -B, --nobackup              Don't backup configuration tree at upgrade
    -f, --fork                  Fork and run as daemon
    -u, --user                  Run as user
    -g, --group                 Run as group
    -p, --pid                   Alternate PID path
    -C, --firstrun              If no user account exists then create one with
                                no username and no password. Use with care as
                                it will allow world-wide administrative access
                                to your Tvheadend installation until you create or edit
                                the access control from within the Tvheadend web interface.
    -U, --dbus                  Enable DBus
    -e, --dbus_session          DBus - use the session message bus instead of the system one
    -a, --adapters              Only use specified DVB adapters (comma-separated, -1 = none)
        --satip_bindaddr        Specify bind address for SAT>IP server
        --satip_rtsp            SAT>IP RTSP port number for server
                                (default: -1 = disable, 0 = webconfig, standard port is 554)
        --nosatip               Disable SAT>IP client (deprecated flag, use nosatipcli)
        --nosatipcli            Disable SAT>IP client
        --satip_xml             URL with the SAT>IP server XML location
    -6, --ipv6                  Listen on IPv6
    -b, --bindaddr              Specify bind address
        --http_port             Specify alternative http port
        --http_root             Specify alternative http webroot
        --htsp_port             Specify alternative htsp port
        --htsp_port2            Specify extra htsp port
        --useragent             Specify User-Agent header for the http client
        --xspf                  Use xspf playlist instead M3U
    -d, --stderr                Enable debug on stderr
    -n, --nostderr              Disable debug on stderr
    -s, --syslog                Enable debug to syslog
    -S, --nosyslog              Disable syslog (all messages)
    -l, --logfile               Enable debug to file
        --debug                 Enable debug subsystems
        --trace                 Enable trace subsystems
        --subsystems            List subsystems
        --fileline              Add file and line numbers to debug
        --threadid              Add the thread ID to debug
        --libav                 More verbose libav log
        --uidebug               Enable web UI debug (non-minified JS)
    -A, --abort                 Immediately abort
    -D, --dump                  Enable coredumps for daemon
        --noacl                 Disable all access control checks
        --nobat                 Disable DVB bouquets
    -j, --join                  Subscribe to a service permanently
    --tsfile_tuners         Number of tsfile tuners
    --tsfile                tsfile input (mux file)
    --tprofile              Gather timing statistics for the code
    --thrdebug              Thread debugging
    {
      "entries" : [
      ...
        {
          "key": "elx",
          "val": "Elamite"
        },
        {
          "key": "eng",
          "val": "English"
        },
        {
          "key": "eng_US",
          "val": "English (US)"
        },
        {
          "key": "eng_GB",
          "val": "English (GB)"
        },
        {
          "key": "epo",
          "val": "Esperanto"
        }, ...
      ]
    }
    {
       "entries" : [
          {
             "uuid" : "d3f76d002a895f5c65dd57715d169399",
             "title" : "webtv-vorbis (WEBTV codec Vorbis)",
             "status" : "codecEnabled"
          },
          {
             "status" : "codecEnabled",
             "title" : "webtv-aac (WEBTV codec AAC)",
             "uuid" : "77e7184d6ade386137f553de0687254d"
          },
          {
             "title" : "webtv-h264 (WEBTV codec H264)",
             "status" : "codecEnabled",
             "uuid" : "eb7281ade724c77d23add9223bc2a480"
          }
       ]
    }
    <episode-num system="dd_progid">SH00012345.0000</episode-num>
    <episode-num system="dd_progid">EP00012345.0001</episode-num>
    <episode-num system="xmltv_ns">1/16.3/25.1/2</episode-num>
    <episode-num system="xmltv_ns">1/15.3/24</episode-num>
    <episode-num system="xmltv_ns">2.4</episode-num>
    {
       "entries" : [
          "uuid": "0d5677d5c370705f3cd3fb53665bc62c",
          "enabled": false,
          "maptoch": false,
          "mapopt": [],
          "chtag": [],
          "chtag_ref": "",
          "name": "Scotland G2: Scotland/BorderSco",
          "ssl_peer_verify": false,
          "ext_url_period": 60,
          "source": "dvb-freesat://dvbs,28.2E,0119,62",
          "services": {},
          "services_seen": 63,
          "services_count": 0,
          "comment": "11428H in Freesat",
          "lcn_off": 0
        }, ...
      ],
      "total": 303
    }
    {
       "entries" : [
          {
             "key" : "e7ddb611669a6a612846415946272f89",
             "val" : "Canal Digitaal SD"
          }, ...
       ]
    }
    Reload your bowser window for this change to be applied.

    The following is a list of available formatting code options:

    Format Code
    Description

    %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

    Programmers Translation Workflow

    hashtag
    Background

    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

    hashtag
    Programmer Usage

    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.

    _() is used to return translated text at runtime based on the core application's language setting (from the OS).

    tvh_gettext_lang() can be used at runtime to translate a string to any TVH language, not just the current language.

    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.

    hashtag
    Building the .pot Files

    The 3 .pot files are updated by running the make intl command which searches the source files for translatable strings and updates the 3 .pot files accordingly.

    hashtag
    Build Process

    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.

    hashtag
    Build Process - Main Application (C code) and WebUI Help (Markdown)

    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.

    hashtag
    Build Process - WebUI (JavaScript)

    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.

    Creating a Mux Dump

    hashtag
    Introduction

    A 'Mux Dump' is a special recording where Tvheadend records the entire transmission of a single broadcaster rather than just a specific channel. Mux dumps can be useful for development and debugging purposes.

    For most purposes, a mux dump lasting between 1 and 2 minutes should be suitable, however, if you are requested to provide a mux dump, ask the requester to indicate how long the mux dump should be for their purposes.

    hashtag
    Performing a Mux Dump

    In order to perform a mux dump, you first have to obtain the UUID of the mux that you wish to dump. The is a block of text, 32 characters long, containing only numbers and lower case letters.

    hashtag
    Finding the UUID

    hashtag
    WebUI Methods

    There are many ways to do this, however, one of the easiest is to use the WebUI to navigate to 'Configuration - DVB Inputs - Muxes'. For each mux listed, there will be a 'Play' icon, on the left side of each row.

    The process will be different between specific browsers, however, the 'Play' icon will always point to a link that contains the UUID of the mux somewhere.

    • Simply moving your mouse cursor over this icon should show the link destination, containing the mux UUID, somewhere in the browser window.

    • Right-clicking on the icon and selection 'Copy link' (or similar) should place some text into your clipboard that contains the UUID. For example: http://<TVH_IP>:9981/play/ticket/stream/mux/176838fd011c233adfa42d8a07f9ddba?title=177.5MHz%20%2F%20DVB-T%20Network Using this method, the UUID '176838fd011c233adfa42d8a07f9ddba' can be located between '/mux/' and the question mark.

    • Also, right-clicking on the icon and selecting 'Save link as' (or similar) should provide you with a prompt for a file name. The default file name provided by your browser should contain the UUID of the mux. For example:

    hashtag
    API Direct Method

    A list (in JSON format) of all muxes known to the system can be obtained by issuing the following command:

    http://<TVH_IP>:9981/api/mpegts/mux/grid

    This list will contain all muxes, enabled and disabled, successfully tuned or not. Each JSON object will represent one mux. You will need to search through this list for the mux on the frequency that you seek and then take note of the UUID associate with that frequency.

    hashtag
    Creating the Mux Dump

    hashtag
    VLC

    If you already have VLC configured as your default m3u application, simply click on the 'Play' icon described above and once VLC starts, press the 'Record' icon in VLC. Manually stop the recording after the required duration has elapsed.

    Even if VLC is not your default m3u application, you can still use VLC by opening the 'Media - Open Network Stream' and pasting the link to the mux that you wish to dump as follows:

    http://<TVH_IP>:9981/stream/mux/<MUX_UUID>

    Hint: If you used the 'Copy link' method described above, you can simply paste that link directly into the 'Network URL' requested by VLC.

    hashtag
    Linux Command Line - curl

    The following curl command will dump 90 seconds of the specified mux.

    curl -m 90 http://<TVH_IP>:9981/stream/mux/<MUX_UUID> > sample_file.ts

    hashtag
    Linux Command Line - wget

    The following wget command initiate a dump of the specified mux. However, the dump will have to be manually stopped using CTRL-C when the required time has elapsed.

    wget http://<TVH_IP>:9981/stream/mux/<MUX_UUID> -O sample_file.ts

    hashtag
    Transferring the Mux Dump

    A mux dump file is normally too large to email or post to the forum. It is up to the requester and user to agree a method for transferring the file. There are, however, several free peer-to-peer file transfer options to choose from.

    Object ID Representation

    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.

    API Used
    UUID Value Returned
    Encoding

    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.

    Tvhlog

    ADMIN privilege is required for these functions.

    hashtag
    tvhlog/config/load

    Lists the details, descriptions, defaults and current values of the items in the GUI screen Configuration -> Debugging -> Configuration -> Settings. See Common Parameters for details of selection parameters.

    hashtag
    tvhlog/config/save

    Untested. Updates the server from an object in the format produced by .

    • node The JSON object.

    hashtag
    tvhlog/subsystem/grid

    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

    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 2024, the id field is informational only. It is provided to facilitate future API development.

    General

    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: HTSMSG Binary Format.

    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).

    Profile

    ADMIN privilege is required to use these functions except for profile/list.

    hashtag
    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).

    To get the contents of a stream profile use , passing it the stream profile's uuid.

    hashtag
    profile/class

    Lists the options, defaults and descriptions of configuration parameters (Configuration -> Stream -> Stream Profiles) in the GUI.

    hashtag
    profile/builders

    Lists the options, defaults and descriptions of configuration parameters when adding a new stream profile (Configuration -> Stream -> Stream Profiles -> Add) in the GUI.

    hashtag
    profile/create

    Create a new stream profile.

    • class

    • conf A JSON object containing details of the new profile.

    Object Class Relationships

    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 (Universally unique identifierarrow-up-right).

    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.

    WebSocket

    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.

    hashtag
    Example Code

    The example below creates a WebSocket connection to the Tvheadend server and listens for updates.

    JSON

    90e9361f38c156df654ecd27b92f398c

    String

    Proxied JSON

    0x90e9361f38c156df654ecd27b92f398c

    Binary

    HTSP

    0x90e9361f

    Binary

    as described here
    GNU tettextarrow-up-right
    documentation files
    d32ef9ef9c67e0552465f6a86caf1d77.m3u
    Using this method, the UUID is 'd32ef9ef9c67e0552465f6a86caf1d77' and consists of all of the characters before the '.m3u' in the file name.
  • If you already receiving functioning services from the mux in question, you can navigate to 'Configuration - DVB Inputs - Services', select one of those functioning services and press the 'Edit' button. Within the edit window, press the 'Read-only Info' drop-down button and copy the value shown in the 'Mux UUID' text box. Press 'Cancel' to close the edit window.

  • UUID
    API
    Kodiarrow-up-right
    Showtimearrow-up-right
    TVHGuidearrow-up-right
    PyHTSParrow-up-right
    file-download
    43KB
    TVH Object Relationships.odg
    arrow-up-right-from-squareOpen
    LibreOffice diagram source

    Pathname Substitution Strings and Command Script Variables

    TVH has the ability to build a recording file and path name using predefined substitution strings. For example, using $t will include the EPG Title in the file name. Likewise, %t will pass the EPG Title as a command line argument to one of the DVR Profile command scripts.

    This feature is implemented in src/dvr/dvr_rec.c.

    A number of htsstr_substitute_t arrays contain a list of substitution identifiers and the functions required to perform the required substitution.

    The actual substitution is performed by htsstr_substitute (src/htsstr.c) which is passed a substitution array and a substitution key ($ or %) as well as an output variable.

    Pathname substitution strings can be applied equally to the file name and to directories in the hierarchy under the base directory specified in the DVR Profile. It should be noted, however, that objects that can provide their own directories, such as AutoRec and Timer DVR objects, must have their directory prefixed with $$ for substitutions to take place. The $$ prefix will be omitted from the final directory name.

    - 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.

  • tvhlog/config/load
    Debugging / Trace options
    CLI / Debug Options
    raw/export
    hashtag
    Output

    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.

    hashtag
    Object Changes

    Some "notificationClass" messages may optionally contain one or more of the following arrays: "create", "change" and "delete". When present, these arrays will contain lists of UUIDs that have been created, modified or deleted as part of the scope of the current notification.

    When a "notificationClass" is "epg", the arrays described above will contain EventIds rather than UUIDs and the 'update" array will be present rather than "change". Two additional arrays ('dvr_delete' and 'dvr_update') may also be present to indicate a change in recording status of the EPG event.

    With regards to "create" and "change"/"update" notifications, the UUID/EventID will need to be explicitly fetched to obtain the new object property values.

    {
        'messages': [{
                'change': [
                     '3b0c29363b43ebd73f37c54dc18d2b0e',
                     '9651da654aa7d2f620946fcbae7500a6' 
                    ],
                'notificationClass': 'channel' 
            }
         ] 
    }
    {
        "entries": [
            {
                "id": 1,
                "subsystem": "START",
                "description": "START",
                "trace": true,
                "debug": false
            },
             . . . . . . .
            {
                "id": 103,
                "subsystem": "ratinglabels",
                "description": "Rating Labels",
                "trace": false,
                "debug": true
            }
        ],
        "traceCount": 12,
        "debugCount": 42,
        "totalCount": 103
    }
    {
       "entries" : [
          {
             "val" : "webtv-h264-vorbis-mp4",
             "key" : "1c1f404622fbe9e6133eec69b7c7da6e"
          },
          {
             "val" : "matroska",
             "key" : "03663b00383b34a6ce2a621733388bf5"
          },
          {
             "val" : "webtv-h264-aac-mpegts",
             "key" : "b90da9e0bc0633515b261714a966910d"
          },
          {
             "val" : "webtv-vp8-vorbis-webm",
             "key" : "b171e3a1d2b576e61b8df418e13c5f4a"
          },
          {
             "key" : "8405e0911b97b795d4cd2cddc322dd7f",
             "val" : "webtv-h264-aac-matroska"
          },
          {
             "key" : "b436b4d6bf606fc9954a1fd3dcebe6a8",
             "val" : "audio"
          },
          {
             "val" : "pass",
             "key" : "af143f0b83fd4e919e3fbf05c5561984"
          }
       ]
    }
    <!DOCTYPE html>
    <html lang="">
      <head>
        <meta charset="utf-8">
        <title>Websocket Test</title>
        <script>
          let socket = new WebSocket("ws://192.168.0.1:9981/comet/ws");
          socket.onmessage = function(event) {
            let message = event.data;
            let messageElem = document.createElement('div');
            messageElem.textContent = message;
            document.getElementById('messages').prepend(messageElem);
          }
        </script>
      </head>
      <body>
        <header></header>
        <main>
          <div id="messages"></div>
        </main>
        <footer></footer>
      </body>
    </html>
    {
      "messages": [
        {
          "freediskspace": 607828439040,
          "useddiskspace": 135628398200,
          "totaldiskspace": 861450428416,
          "notificationClass": "diskspaceUpdate"
        },
        {
          "notificationClass": "logmessage",
          "logtxt": "2024-03-06 11:06:14.444 subscription: 00D5: \"HTTP\" subscribing on channel \"DMAX\", weight: 100, adapter: \"DVB-T #0\", network: \"Sandy\", mux: \"690MHz\", service: \"DMAX\", profile=\"pass\", hostname=\"192.168.1.2\", client=\"VLC/3.0.20 LibVLC/3.0.20\""
        },
        {
          "id": 213,
          "start": 1709723174,
          "errors": 0,
          "state": "Running",
          "hostname": "192.168.1.2",
          "client": "VLC/3.0.20 LibVLC/3.0.20",
          "title": "HTTP",
          "channel": "DMAX",
          "service": "DVB-T #0/Sandy/690MHz/DMAX",
          "pids": [
            1011,
            2401,
            2402,
            2403,
            2404
          ],
          "profile": "pass",
          "in": 57716,
          "out": 57716,
          "total_in": 57716,
          "total_out": 57716,
          "updateEntry": 1,
          "notificationClass": "subscriptions"
        }
      ]
    }

    %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.

    Channel

    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.

    hashtag
    channel/class

    Lists the text strings, options and defaults used when configuring channels within TVH (ie Configuration -> Channel/EPG -> Channel -> Add).

    hashtag
    channel/create

    Creates a new channel. Requires ADMIN privilege.

    • conf A JSON object containing details of the new channel.

    hashtag
    channel/grid

    Lists details of channels. For details of the parameters and selection criteria which can be applied, see .

    hashtag
    channel/list

    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

    hashtag
    channel/rename

    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.

    hashtag
    channeltag/class

    Lists the text strings, options and defaults used when configuring channels within TVH (ie Configuration -> Channel/EPG -> Channel Tags -> Add).

    hashtag
    channeltag/create

    Creates a new channel tag. Requires ADMIN privilege.

    • conf A JSON object containing details of the new channel tag.

    hashtag
    channeltag/grid

    Lists details of channel tags. For details of the parameters and selection criteria which can be applied, see .

    hashtag
    channeltag/list

    Lists the names and uuids of all channel tags.

    hashtag
    channelcategory/list

    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.

    Access

    Functions to list and manipulate access controls. With the exception of access/entry/userlist, ADMIN privilege is required to use these functions.

    hashtag
    access/entry/class

    Lists the text strings, options and defaults used when configuring access controls within the TVH GUI (ie Configuration -> Users -> Access Entries).

    hashtag
    access/entry/create

    Creates a new user from a JSON object.

    • conf The JSON object describing the new user.

    hashtag
    access/entry/grid

    Lists users and their privileges. See for details of selection parameters.

    hashtag
    access/entry/userlist

    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.

    hashtag
    ipblock/entry/class

    Lists the text strings, options and defaults used when configuring access controls within the TVH GUI (ie Configuration -> Users -> IP Blocking Records).

    hashtag
    ipblock/entry/create

    Creates a new IP-based access record.

    • conf The JSON object describing the access record.

    hashtag
    ipblock/entry/grid

    Lists IP-block records. See for details of selection parameters.

    hashtag
    passwd/entry/class

    Lists the text strings, options and defaults used when configuring access controls within the TVH GUI (ie Configuration -> Users -> Passwords).

    hashtag
    passwd/entry/create

    Creates a new password record.

    • conf The JSON object describing the record.

    hashtag
    passwd/entry/grid

    Lists passwords for users. Note that "password" is in clear-text while "password2" is base64-encoded with a static prefix. See 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:

    HTSMSG Binary Format

    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:

    Name
    ID
    Description

    Map

    1

    Sub message of type map

    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.

    hashtag
    HTSMSG Binary Format

    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.

    hashtag
    Root body

    hashtag
    HTSMSG-Field

    hashtag
    Field encoding for type: map and list

    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.

    hashtag
    Field encoding for type: s64

    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.

    hashtag
    Field encoding for type: str

    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.

    hashtag
    Field encoding for type: bin

    Datalength should be the length of the binary object. Data is the binary object itself.

    Config

    ADMIN privilege is required for all of these functions except config/capabilities and serverinfo.

    hashtag
    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.

    hashtag
    config/load

    Lists the details, descriptions, defaults and current values of the items in the GUI screen Configuration -> General -> Base. See for details of selection parameters.

    hashtag
    config/save

    Untested. Updates the server from an object in the format produced by .

    • node The JSON object.

    hashtag
    memoryinfo/class

    Lists the details and descriptions of items in the TVH GUI screen Configuration -> Debugging -> Memory Information Entries.

    hashtag
    memoryinfo/grid

    Lists details of in-memory objects. See for details of selection parameters.

    hashtag
    pathlist

    Lists all of the api functions supported by the server.

    hashtag
    serverinfo

    Lists information about the server including the software version number.

    Electronic Program Guide

    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:

    hashtag
    Menu Bar

    The following functions are available:

    [
       "caclient",
       "tvadapters",
       "imagecache",
       "timeshift",
       "trace",
       "libav"
    ]

    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

    name
    to sort by channel name, or
    numname
    to sort by LCN then by name (default). The name sort is case-sensitive.
    Grid Parameters
    Grid Parameters
    Common Parameters
    Common Parameters
    Common Parameters
    Common Parameters
    config/load
    Common Parameters
    {
       "entries" : [
          {
             "dvr_pst_time" : 0,
             "enabled" : true,
             "epgauto" : true,
             "autoname" : true,
             "name" : "BBC RB 1",
             "number" : 601,
             "tags" : [
                "21d5fe751062c4d99997d6cb48f43c55",
                "1a2a61c4374cedb1fc29417f1a517446"
             ],
             "services" : [
                "9b0e2e103a373350f5e99cda6dd3f055"
             ],
             "epg_running" : -1,
             "epggrab" : [],
             "uuid" : "ae63d3b40fbfab610f49290abc189472",
             "bouquet" : "",
             "dvr_pre_time" : 0
          }, ...
       ],
       "total" : 104
    }
    {
       "entries" : [
          {
             "val" : "Channel 5+1",
             "key" : "7e7b77801531c803f5ce8f4d5003f44c"
          }, ...
       ]
    }
    {
       "total" : 5,
       "entries" : [
          {
             "index" : 0,
             "private" : false,
             "icon_public_url" : "",
             "internal" : false,
             "name" : "Radio",
             "titled_icon" : false,
             "enabled" : true,
             "uuid" : "3479ac5a48d6680fc37d8b411cf0e2e8",
             "icon" : "",
             "comment" : ""
          }, ...
       ]
    }
    {
       "entries" : [
          {
             "key" : "3479ac5a48d6680fc37d8b411cf0e2e8",
             "val" : "Radio"
          }, ...
       ]
    }
    {
      "entries": [
        {
          "uuid": "59c300295cbf01e53f096242fd5b8ffc",
          "index": 1,
          "enabled": true,
          "username": "*",
          "prefix": "192.168.1.0/24,127.0.0.1/32",
          "change": [
            "change_rights",
            "change_chrange",
            "change_chtags",
            "change_dvr_configs",
            "change_profiles",
            "change_conn_limit",
            "change_lang",
            "change_lang_ui",
            "change_theme",
            "change_uilevel"
          ],
          "uilevel": -1,
          "uilevel_nochange": -1,
          "lang": "eng_GB",
          "langui": "eng_GB",
          "themeui": "blue",
          "streaming": [
            "basic",
            "advanced",
            "htsp"
          ],
          "profile": [],
          "dvr": [
            "basic",
            "htsp",
            "all",
            "all_rw",
            "failed"
          ],
          "htsp_anonymize": false,
          "dvr_config": [
            "4e3a1e13acd2d5a9c129e7b00f6c986e"
          ],
          "webui": true,
          "admin": false,
          "conn_limit_type": 0,
          "conn_limit": 0,
          "channel_min": 0,
          "channel_max": 0,
          "channel_tag_exclude": false,
          "channel_tag": [],
          "comment": "Wildcard",
          "wizard": false
        },
      ]
    }
    {
       "entries" : [
          {
             "key" : "myUserName",
             "val" : "myUserName"
          }, ...
       ]
    }
    {
       "entries" : [
          {
             "prefix" : "10.0.0.0/8",
             "enabled" : true,
             "comment" : "Don't allow guests",
             "uuid" : "95a81ed085a1d1a9d8647400a878594d"
          }
       ],
       "total" : 1
    }
    {
       "total" : 1,
       "entries" : [
          {
             "password" : "XxXxXxXx",
             "uuid" : "2fa9ebf7e421a537ac032a6905134137",
             "username" : "xxxxxx",
             "enabled" : true,
             "wizard" : true,
             "password2" : "Base64EncodedPassword"
          }, ...
       ]
    }
    {
       "total" : 1,
       "entries" : [
          {
             "password" : "",
             "uuid" : "2fa9ebf7e421a537ac032a6905134137",
             "username" : "xxxxxx",
             "enabled" : true,
             "wizard" : true,
             "password2" : "Base64EncodedPassword"
             "auth": [
                "enable"
             ],
             "authcode": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
          }
       ]
    }
    {
       "entries" : [
          {
             "peak_count" : 17154,
             "name" : "EPG Broadcasts",
             "uuid" : "a1af1bc4f29ba28104e71a540465f250",
             "count" : 17154,
             "peak_size" : 6235792,
             "size" : 6235792
          },
          {
             "peak_count" : 3285,
             "peak_size" : 369303,
             "count" : 3285,
             "size" : 369303,
             "name" : "EPG Series Links",
             "uuid" : "823a78a3bcd05b688c59871455da6399"
          },
          {
             "count" : 11514,
             "peak_size" : 5015593,
             "size" : 5015593,
             "name" : "EPG Episodes",
             "uuid" : "5c666eea1ec3de4bbb9a11f60116b258",
             "peak_count" : 11514
          }, ...
       ],
       "total" : 19
    }
    [
       "access/entry/class",
       "access/entry/create",
       "access/entry/grid",
       "access/entry/userlist", ...
    ]
    {
       "api_version" : 19,
       "webroot" : "/testserver",
       "name" : "Tvheadend",
       "capabilities" : [
          "caclient",
          "tvadapters",
          "trace",
          "libav"
       ],
       "sw_version" : "4.3-943~g9b85e7b7c-dirty"
    }
    hashtag
    Filtering / Searching

    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.

    Filter
    Function

    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.

    Title, Channel, Tag and Content Type are dependent on your configuration and on what your broadcaster sends. Options for the Duration are as follows:

    Filter Range
    Example Purpose

    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

    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.

    hashtag
    Buttons

    The following buttons are also available:

    Button
    Function

    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

    hashtag
    Grid Items

    The main grid items have the following functions:

    • Details: Displays the current status of a recording event for the selected programme

    Icon
    Description

    The programme is scheduled for recording

    The programme is currently recording

    Click to call up more detailed information about an event

    • 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).

    hashtag
    Event Details & Recording

    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.

    EPG Detail 1

    For events without any series link information, an [Autorec] button will be provided to create a pseudo-series link using the autorec feature.

    EPG Detail 2

    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 accommodate 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 imdb.com, and [Play program] button. This downloads an 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.

    hashtag
    Autorecordings

    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 Dialogue Box

    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.

    hashtag
    Watch TV

    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.

    hashtag
    Supported Container Formats

    Browser
    MPEG-TS
    MPEG-PS
    Matroska
    WebM

    Google Chrome

    Mozilla Firefox

    hashtag
    Supported Video Codecs

    Browser
    MPEG2
    H.264
    VP8

    Google Chrome

    Mozilla Firefox

    hashtag
    Supported Audio Codecs

    Browser
    MPEG2
    DD (AC3)
    AAC
    Vorbis

    Google Chrome

    Mozilla Firefox

    'Electronic Program Guide' Tab

    EPG

    Functions to query the Electronic Program(me) Guide.

    hashtag
    epg/events/grid

    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.

    hashtag
    epg/events/alternative

    Lists alternative broadcasts of the same event.

    • eventId Identifier of the event, eg taken from .

    • 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.

    hashtag
    epg/events/related

    Lists broadcasts related to the given event.

    • eventId Identifier of the event, eg taken from .

    • 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.

    hashtag
    epg/events/load

    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.

    hashtag
    epg/brand/list

    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.

    hashtag
    epg/content_type/list

    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.

    • 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.

    Protocol Changes

    hashtag
    This information may be outdated. If you have some spare time, please to through the commit History and add the changes to the documentation.

    hashtag
    v43

    • added isNew field to eventAdd

    hashtag
    v42

    • added comment field to addDvrEntry, updateDvrEntry, autorecEntryAdd, autorecEntryUpdate, timerecEntryAdd, timerecEntryUpdate

    hashtag
    v41

    • added full UUID to channelAdd, tagAdd and dvrEntryAdd

    • added ratingAuthority and ratingCountry to dvrEntryAdd and eventAdd

    hashtag
    v40

    • added DVR configuration UUID to dvrEntryAdd, dvrEntryUpdate, autorecEntryAdd, autorecEntryUpdate, timerecEntryAdd, timerecEntryUpdate

    hashtag
    v39

    • added broadcast type to autorec DVR entry

    hashtag
    v38

    • added service provider name to channelAdd -> services

    hashtag
    v37

    • added ratingLabel to EPG & DVR entries

    • added ratingIcon to EPG & DVR entries

    hashtag
    v36

    • added ageRating to DVR entries

    hashtag
    v26..35

    TODO

    hashtag
    v25

    • added updateAutorecEntry and updateTimerecEntry

    • (and other changes not yet documented here)

    hashtag
    v23..24

    • added descrambleInfo (not yet documented here)

    hashtag
    v22..23

    • extended addDvrEntry, updateDvrEntry, dvrEntryAdd method

      • added enabled

    • extended getSysTime

    hashtag
    v21..22

    • extended updateDvrEntry method

      • added channelId

    hashtag
    v20..v21

    • dvrEntry structures

      • added files msg (multiple files) to the files field

      • added dataSize field to show actual (last) file size in dvrEntry updates

    hashtag
    v19..v20

    • dvrEntry structures

      • added subscriptionError, streamErrors, dataErrors fields

      • added subtitle fields

    hashtag
    v18..v19

    • autorec/timerec structures

      • added directory field (forced output directory)

      • added enabled field

    hashtag
    v17..v18

    • added addTimerecEntry, deleteTimerecEntry methods

    • added timerecEntryAdd, timerecEntryUpdate, timerecEntryDelete server-to-client methods

    • extended addAutorecEntry method

    hashtag
    v16..v17

    • 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)

    hashtag
    v15..v16

    • added getProfiles, getDvrConfigs methods

    • removed getCodecs methods

    • extended subscribe method

    hashtag
    v14..v15

    • extended channelAdd, channelUpdate server-to-client methods

      • the channelIcon URL can be relative 'imagecache/%d' or '/imagecache/%d'

    • extended getChannel method

    hashtag
    v13..v14

    • added getChannel method

    hashtag
    v12..v13

    • added addAutorecEntry method

    • added deleteAutorecEntry method

    • added autorecEntryAdd, autorecEntryUpdate, autorecEntryDelete server-to-client methods

    hashtag
    v11..v12

    • added subscriptionFilterStream method

    • added getDvrCutpoints method

    hashtag
    v10..v11

    • added audio_type in the subscriptionStart server-to-client method

    • added getCodecs method

    Scan Files

    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.

    added gmtoffset
    epg events - added subtitle field
    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

  • 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

  • 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

  • add profile field

    the channelIcon URL can be relative 'imagecache/%d' or '/imagecache/%d'

    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

  • channel/list
    channeltag/list
    epg/content_type/list
    Grid Filters
    Channel-Category
    epg/events/grid
    epg/events/grid
    epg/events/grid
    {
       "totalCount" : 18575,
       "entries" : [
          {
             "eventId": 5229882,
             "episodeUri": "crid://www.itv.com/1002485413",
             "serieslinkUri": "crid://www.itv.com/ebshd48582",
             "channelName": "ITV HD",
             "channelUuid": "fd22bbade9093bd1fedf6ce87d75f9a0",
             "channelNumber": "3",
             "start": 1747148400,
             "stop": 1747152000,
             "title": "Tipping Point",
             "summary": "Ben Shephard hosts the quiz show in which three players take on an extraordinary machine in the hope of winning a cash jackpot. [S,HD]",
             "widescreen": 1,
             "subtitled": 1,
             "hd": 1,
             "genre": [
               48
             ],
             "nextEventId": 5229883
             "ageRating" : 9,
             "ratingLabel" : "PG,
             "ratingLabelIcon" : "imagecache/37"
          }, ...
       ]
    }
          "dvrUuid": "f01433995f76d60f3b32d38fb18f541a",
          "dvrState": "scheduled",
    {
       "entries" : [
          {
             "eventId": 5229882,
             "episodeUri": "crid://www.itv.com/1002485413",
             "serieslinkUri": "crid://www.itv.com/ebshd48582",
             "channelName": "ITV HD",
             "channelUuid": "fd22bbade9093bd1fedf6ce87d75f9a0",
             "channelNumber": "3",
             "start": 1747148400,
             "stop": 1747152000,
             "title": "Tipping Point",
             "summary": "Ben Shephard hosts the quiz show in which three players take on an extraordinary machine in the hope of winning a cash jackpot. [S,HD]",
             "widescreen": 1,
             "subtitled": 1,
             "hd": 1,
             "genre": [
               48
             ],
             "nextEventId": 5229883
             "ageRating" : 9,
             "ratingLabel" : "PG,
             "ratingLabelIcon" : "imagecache/37"
          }
       ],
       "totalCount" : 1
    }
    
    {
       "entries" : [
          {
             "val" : "",
             "key" : 0
          },
          {
             "val" : "Movie / Drama",
             "key" : 16
          },
          {
             "key" : 17,
             "val" : "Detective / Thriller"
          }, ...
       ]
    }
    Parameter
    DVB-T/2
    DVB-S/2
    DVB-C
    ATSC
    ISDB-T

    ✓

    ✓

    ✓

    ✓

    ✓

    ✓

    ✓

    ✓

    hashtag
    Accepted values

    The following values are accepted for the parameter fields. Please note that an 'accepted' value may not always be processed.

    hashtag
    DELIVERY_SYSTEM

    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.

    hashtag
    FREQUENCY

    Frequency in hertz.

    hashtag
    BANDWIDTH_HZ

    (Bandwidth in hertz) 1700000, 5000000, 6000000, 7000000, 8000000, 10000000.

    hashtag
    CODE_RATE_HP / CODE_RATE_LP / INNER_FEC

    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.

    hashtag
    MODULATION

    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.

    hashtag
    TRANSMISSION_MODE

    NONE, AUTO, 1k, 2k, 8k, 4k, 16k, 32k, C1, C3780.

    hashtag
    GUARD_INTERVAL

    NONE, AUTO, 1/4, 1/8, 1/32, 1/16, 1/128, 19/128, 19/256, PN420, PN595, PN945.

    hashtag
    HIERARCHY

    NONE, AUTO, 1, 2, 4.

    hashtag
    INVERSION

    NONE, AUTO, ON, OFF.

    hashtag
    ROLLOFF

    5, 10, 15, 20, 25, 35.

    hashtag
    PILOT

    NONE, AUTO, ON, OFF.

    hashtag
    PLS_CODE

    (Physical Layer Scrambling) ROOT, GOLD, COMBO.

    hashtag
    POLARIZATION

    V, H, L, R, O.

    hashtag
    References

    https://github.com/tvheadend/tvheadend/blob/master/src/input/mpegts/scanfile.carrow-up-right https://github.com/tvheadend/tvheadend/blob/master/src/input/mpegts/dvb_support.carrow-up-right https://en.wikipedia.org/wiki/DVBarrow-up-right https://en.wikipedia.org/wiki/ISDBarrow-up-right https://en.wikipedia.org/wiki/ATSC_standardsarrow-up-right

    Service

    ADMIN privilege is required to use all of these functions.

    hashtag
    service/mapper/load

    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 MPEGts section.

    hashtag
    service/mapper/save

    Untested. Set the Service Mapper options.

    • node Unknown, possibly the value of class.

    hashtag
    service/mapper/stop

    Stops a running service mapper operation.

    hashtag
    service/mapper/status

    Provides the same output as Status -> Service Mapper in the TVH GUI.

    hashtag
    service/list

    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.

    hashtag
    service/streams

    Lists the streams comprising the service.

    • uuid uuid of the service. This parameter is mandatory; it is not possible to list all services.

    hashtag
    service/removeunseen

    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.

    Status

    Lists statistics of input sources and connections. ADMIN privilege is required for all these functions.

    hashtag
    status/connections

    Lists currently-connected client devices.

    hashtag
    status/subscriptions

    Lists currently-active subscriptions.

    hashtag
    status/inputs

    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.

    hashtag
    status/inputclrstats

    Resets the input counters to zero.

    • uuid The uuid of the input device from . More than one uuid can be specified - syntax?

    hashtag
    connections/cancel

    Disconnects one or more clients.

    • id ids of the connections, obtained from . If set to 'all' then all connections are cancelled (new in 4.3.1680).

    hashtag
    status/activity

    Provide information required for assessing the suitability for entering low-power mode and a suitable time for reawakening. For example, then TVH is used as part of an appliance configuration.

    For finer analysis and control, the 'activities' property contains individual scheduling times for the following activities:

    • DVR Recordings

    • OTA EPG Grabber

    • Internal EPG Grabber

    • Mux Scheduler

    Times are presented as standard Unix epoch values. A value of zero indicates that nothing for that activity type is currently scheduled.

    It should be noted that the times provided are strictly from the point of view of TVH internal activities and that the calling program must take into account operating system and hardware boot times when determining the precise time to reawaken the system.

    Times are only reported for the EPG grabbers if there are enabled grabbers of that type. Likewise, only enabled mux schedulers are reported.

    DVR recordings in progress are also included, therefore, the reported DVR time may be in the past.

    The connection and subscription counts are duplications of the summaries provided by the ‘status/connections’ and ‘status/subscriptions’ API calls and are included here in order to provide a single consolidated API call for assessing the suitability for entering low-power mode.

    Requires v4.3-2405.

    Examples

    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.

    hashtag
    curl

    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.

    hashtag
    PHP

    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.

    hashtag
    Javascript

    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:[email protected]: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.

    hashtag
    Python

    This example produces the same output as the previous ones.

    tvheadend/src/webui/static/app/tvheadend.js at 9ac57a0c1a4551012260008cfca6bfc2386f6dcf · tvheadend/tvheadendGitHubchevron-right
    Source code reference

    EPGgrab

    Manipulate EPG grabbers. ADMIN privilege is required for these functions except for epggrab/channel/list.

    hashtag
    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.

    {
       "totalCount" : 1,
       "entries" : [
          {
             "id" : 1,
             "started" : 1508668447,
             "server_port" : 9982,
             "server" : "x.x.x.x",
             "type" : "HTSP",
             "peer" : "x.x.x.y",
             "user" : "xxxxxx",
             "peer_port" : 57496
          }
       ]
    }

    ✓

    ✓

    BANDWIDTH_HZ

    ✓

    ✓

    CODE_RATE_HP

    ✓

    CODE_RATE_LP

    ✓

    MODULATION

    ✓

    ✓

    ✓

    ✓

    TRANSMISSION_MODE

    ✓

    GUARD_INTERVAL

    ✓

    ✓

    HIERARCHY

    ✓

    INVERSION

    ✓

    ✓

    ✓

    ✓

    ✓

    STREAM_ID

    ✓

    ✓

    INNER_FEC

    ✓

    ✓

    ROLLOFF

    ✓

    PILOT

    ✓

    PLS_CODE

    ✓

    POLARIZATION

    ✓

    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

    ✓

    DELIVERY_SYSTEM
    FREQUENCY
    Tick icon
    Information icon

    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

    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)

    status/inputs
    status/connections

    signal_scale

    hashtag
    epggrab/channel/class

    Lists the parameters, descriptions, options and defaults for the GUI screen Configuration -> Channel/EPG -> EPG Grabber Channels.

    hashtag
    epggrab/channel/grid

    Gives details of the EPG grabber channels, ie from Configuration -> Channel / EPG -> EPG Grabber Channels. See Grid Parameters for parameter details.

    hashtag
    epggrab/module/list

    List EPG Grabber Modules, as shown in the GUI screen Configuration -> Channel/EPG -> EPG Grabber Modules.

    hashtag
    epggrab/config/load

    Lists the parameters, options, defaults and current settings for the EPG grabber, ie Configuration -> Channel / EPG -> EPG Grabber. See Load Parameters for parameter details.

    hashtag
    epggrab/config/save

    Updates the EPG Grabber configuration from an object in the same format as provided by epggrab/config/load.

    • node The JSON object.

    hashtag
    epggrab/ota/trigger

    Queues a run of the OTA EPG grabber.

    • trigger Delay in seconds before the run starts. Minimum is one second, maximum is one week.

    hashtag
    epggrab/internal/rerun

    Run the internal EPG grabbers immediately.

    • rerun Not used but must be an integer greater than zero.

    {
       "ignore" : 0,
       "ok" : 0,
       "fail" : 0,
       "total" : 0
    }
    curl http://192.168.0.1:9981/api/service/list?enum=1 | jq
    {
      "entries": [
        {
          "key": "0172dacd8860f567057a3a2a4ae5533b",
          "val": "Sandy/522MHz/BBC Radio London"
        },
        {
          "key": "01badd8ba1b947976237a5310ad46c75",
          "val": "Sandy/746MHz/5USA+1"
        }, ...
      ]
    }
    {
    curl http://192.168.0.1:9981/api/service/list?list=enabled,encrypted | jq
      "entries": [
        {
          "uuid": "0172dacd8860f567057a3a2a4ae5533b",
          "id": "0172dacd8860f567057a3a2a4ae5533b",
          "text": "Sandy/522MHz/BBC Radio London",
          "caption": "DVB Inputs - Services",
          "class": "mpegts_service",
          "event": "service",
          "params": [
            {
              "id": "enabled",
              "type": "bool",
              "caption": "Enabled",
              "description": "Enable/Disable service.",
              "default": false,
              "value": false
            },
            {
              "id": "encrypted",
              "type": "bool",
              "caption": "Encrypted",
              "description": "The service's encryption status.",
              "default": false,
              "rdonly": true,
              "nosave": true,
              "value": false
            }
          ]
        }, ...
      ]
    }
    curl  "http://192.168.0.1:9981/api/raw/export?class=service"|jq
    [
      {
        "sid": 8258,
        "lcn": 3,
        "lcn_minor": 0,
        "lcn2": 0,
        "srcid": 0,
        "svcname": "ITV1",
        "cridauth": "www.itv.com",
        "dvb_servicetype": 1,
        "dvb_ignore_eit": false,
        "prefcapid": 0,
        "prefcapid_lock": 0,
        "force_caid": 0,
        "pts_shift": 0,
        "created": 1473842950,
        "last_seen": 1683534676,
        "enabled": false,
        "auto": 0,
        "priority": 0,
        "s_type_user": -1,
        "verified": 1,
        "pcr": 1701,
        "pmt": 1700,
        "stream": [
          {
            "pid": 1701,
            "type": "MPEG2VIDEO",
            "position": 0
          },
          {
            "pid": 1702,
            "type": "MPEG2AUDIO",
            "position": 0,
            "language": "eng",
            "audio_type": 0,
            "audio_version": 2
          },
          {
            "pid": 1703,
            "type": "MPEG2AUDIO",
            "position": 0,
            "language": "eng",
            "audio_type": 3,
            "audio_version": 2
          },
          {
            "pid": 1731,
            "type": "DVBSUB",
            "position": 0,
            "language": "eng",
            "compositionid": 2,
            "ancillartyid": 2
          }
        ],
        "uuid": "ff05eed5b10a3b072356158688252f03"
      },
    ...
    ]
    curl http://192.168.0.1:9981/api/service/streams?uuid=01badd8ba1b947976237a5310ad46c75 | jq
    {
      "name": "Sandy/746MHz/5USA+1",
      "streams": [
        {
          "pid": 2121,
          "type": "PCR"
        },
        {
          "pid": 1025,
          "type": "PMT"
        },
        {
          "index": 1,
          "pid": 2121,
          "type": "H264",
          "language": "",
          "width": 0,
          "height": 0,
          "duration": 0,
          "aspect_num": 0,
          "aspect_den": 0
        },
        {
          "index": 2,
          "pid": 2122,
          "type": "AAC",
          "language": "eng",
          "audio_type": 0
        },
        {
          "index": 3,
          "pid": 2124,
          "type": "AAC",
          "language": "eng",
          "audio_type": 3
        },
        {
          "index": 4,
          "pid": 2123,
          "type": "DVBSUB",
          "language": "eng",
          "composition_id": 2,
          "ancillary_id": 2
        }
      ],
      "fstreams": [
        {
          "index": 1,
          "pid": 2121,
          "type": "H264",
          "language": "",
          "width": 0,
          "height": 0,
          "duration": 0,
          "aspect_num": 0,
          "aspect_den": 0
        },
        {
          "index": 2,
          "pid": 2122,
          "type": "AAC",
          "language": "eng",
          "audio_type": 0
        },
        {
          "index": 3,
          "pid": 2124,
          "type": "AAC",
          "language": "eng",
          "audio_type": 3
        },
        {
          "index": 4,
          "pid": 2123,
          "type": "DVBSUB",
          "language": "eng",
          "composition_id": 2,
          "ancillary_id": 2
        }
      ]
    }
    {
       "entries" : [
          {
             "errors" : 0,
             "title" : "epggrab",
             "in" : 85222,
             "total_in" : 25162474,
             "total_out" : 25162474,
             "id" : 75,
             "out" : 85222,
             "service" : "Silicon Labs Si2168 : DVB-T #0/Sandy/690MHz/Raw PID Subscription",
             "state" : "Running",
             "start" : 1508763840
          }
       ],
       "totalCount" : 1
    }
    {
       "entries" : [
          {
             "ec_block" : 0,
             "uuid" : "20f11bcaaf93afb5fc13cce31278494e",
             "signal_scale" : 2,
             "weight" : 100,
             "cc" : 1,
             "ber" : 0,
             "tc_block" : 0,
             "input" : "Montage Technology M88DS3103 #0 : DVB-S #0",
             "tc_bit" : 0,
             "unc" : 0,
             "te" : 0,
             "bps" : 2257504,
             "subs" : 1,
             "ec_bit" : 0,
             "pids" : [
                0,
                1,
                16,
                17,
                18,
                269,
                5700,
                5701,
                5703,
                5704
             ],
             "stream" : "10773H in DVB-S Network",
             "snr" : 14149,
             "signal" : -75649,
             "snr_scale" : 2
          }
       ],
       "totalCount" : 1
    }
    {
      "current_time": 1748659324,
      "next_activity": 1748659500,
      "activities": {
        "dvr": 1748764623,
        "ota_grabber": 1748659500,
        "int_grabber": 0,
        "mux_scheduler": 1748725200
      },
      "subscription_count": 1,
      "connection_count": 2
    }
    <!DOCTYPE html>
    <html>
     <head>
      <title>TVH PHP test</title>
      <meta http-equiv="content-type" content="text/html; charset=utf-8">
      <style>
        table, th, td {
          border: 1px solid black;
        }
      </style>
     </head>
     <body>
      <table>
       <tr><th>Date</th><th>Start</th><th>End</th><th>Title</th></tr>
    <?php
            $timers = get_timers();
            foreach($timers as $t) {
              $start = strftime("%H:%M", $t["start"]);
              $stop = strftime("%H:%M", $t["stop"]);
              $date = strftime("%a %e/%m", $t["start"]);
              echo "<tr><td>$date</td><td>$start</td><td>$stop</td><td>{$t['disp_title']}</td></tr>";
            }
    
            function get_timers() {
              $url = "http://admin:[email protected]:9981/api/dvr/entry/grid_upcoming?sort=start";
              $json = file_get_contents($url);
              $j = json_decode($json, true);
              $ret = &$j["entries"];
              return $ret;
            }
    ?>
      </table>
     </body>
    </html>
    
    <!DOCTYPE html>
    <html>
    <head>
      <title>TVH Javascript test</title>
      <meta http-equiv="content-type" content="text/html; charset=utf-8">
      <style>
        table, th, td {
          border: 1px solid black;
        }
      </style>
      <script>
        async function getTimers() {
          const url = "http://192.168.0.1:9981/api/dvr/entry/grid_upcoming?sort=start";
          const response = await fetch(url);
          const timers = await response.json();
          return timers.entries;
        }
    
        async function main() { 
          const timers = await getTimers(); 
          const table = document.getElementById("result");
          timers.forEach(function(entry) {
            const start = new Date(entry.start * 1000);
            const stop = new Date(entry.stop * 1000);
            const row = table.insertRow();
            const html = "<td>" + start.toLocaleDateString() +
                 "</td><td>" + start.toLocaleTimeString() +
                 "</td><td>" + stop.toLocaleTimeString() +
                 "</td><td>" + entry.disp_title + "</td>";
            row.innerHTML = html;
          });
        } 
        main(); 
      </script>
    </head>
    <body>
      <table>
        <thead>
          <tr>
            <th>Date</th>
            <th>Start</th>
            <th>End</th>
            <th>Title</th>
          </tr>
        </thead>
        <tbody id="result"></tbody>
      </table>
    </body>
    </html>
    #!/usr/bin/env python3
    
    import json
    import time
    import requests
    
    def get_timers():
        ts_server = 'http://192.168.0.1:9981'
        ts_url = 'api/dvr/entry/grid_upcoming?sort=start'
        ts_user = 'admin'
        ts_pass = 'admin'
        ts_query = '%s/%s' % (
            ts_server,
            ts_url,
        )
        ts_response = requests.get(ts_query, auth=(ts_user, ts_pass))
        if ts_response.status_code != 200:
            print('<pre>Error code %d\n%s</pre>' % (ts_response.status_code, ts_response.content, ))
            return {}
    
        ts_json = json.loads(ts_response.text, strict=False)
        return ts_json['entries']
    
    def main():
        print('''
    <!DOCTYPE html>
    <html>
     <head>
      <title>TVH Python test</title>
      <meta http-equiv="content-type" content="text/html; charset=utf-8">
      <style>
        table, th, td {
          border: 1px solid black;
        }
      </style>
     </head>
     <body>
      <table>
       <tr><th>Date</th><th>Start</th><th>End</th><th>Title</th></tr>
    ''')
    
        timers = get_timers()
        if len(timers):
            for timer in timers:
                start = time.localtime(timer['start'])
                print('<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>'
                    % (time.strftime("%a %e/%m",start),
                       time.strftime("%H:%M",start),
                       time.strftime("%H:%M",time.localtime(timer['stop'])),
                       timer['disp_title'],
                    ))
                    
        print('''
      </table>
     </body>
    </html>
    ''')
    
    
    main()
    {
       "entries" : [
        {
          "uuid": "fffe86fe9b43bdc58b607f811ee44fad",
          "id": "fffe86fe9b43bdc58b607f811ee44fad",
          "text": "opentv-skyuk-3618: opentv-skyuk-3618 (OpenTV: Sky UK)",
          "caption": "Channels / EPG - EPG Grabber Channels",
          "class": "epggrab_channel",
          "event": "epggrab_channel",
          "params": [
            {
              "id": "enabled",
              "type": "bool",
              "caption": "Enabled",
              "description": "Enable/disable EPG data for the entry.",
              "default": false,
              "group": 1,
              "value": true
            },
            {
              "id": "modid",
              "type": "str",
              "caption": "Module ID",
              "description": "Module ID used to grab EPG data.",
              "default": "",
              "rdonly": true,
              "hidden": true,
              "group": 1,
              "value": "opentv-skyuk"
            },
            {
              "id": "module",
              "type": "str",
              "caption": "Module",
              "description": "Name of the module used to grab EPG data.",
              "default": "",
              "rdonly": true,
              "nosave": true,
              "group": 1,
              "value": "OpenTV: Sky UK"
            },
            {
              "id": "path",
              "type": "str",
              "caption": "Path",
              "description": "Data path (if applicable).",
              "default": "",
              "rdonly": true,
              "nosave": true,
              "group": 1,
              "value": ""
            },
            {
              "id": "updated",
              "type": "time",
              "caption": "Updated",
              "description": "Date the EPG data was last updated (not set for OTA grabbers).",
              "default": 0,
              "rdonly": true,
              "nosave": true,
              "group": 1,
              "value": 0
            },
            {
              "id": "id",
              "type": "str",
              "caption": "ID",
              "description": "EPG data ID.",
              "default": "",
              "group": 1,
              "value": "opentv-skyuk-3618"
            },
            {
              "id": "name",
              "type": "str",
              "caption": "Name",
              "description": "Service name found in EPG data.",
              "default": "",
              "group": 1
            },
            {
              "id": "names",
              "type": "str",
              "caption": "Names",
              "description": "Additional service names found in EPG data.",
              "default": "",
              "group": 1,
              "value": ""
            },
            {
              "id": "number",
              "type": "s64",
              "caption": "Number",
              "description": "Channel number as defined in EPG data.",
              "default": 0,
              "group": 1,
              "intsplit": 1000000,
              "value": 172
            },
            {
              "id": "icon",
              "type": "str",
              "caption": "Icon",
              "description": "Channel icon as defined in EPG data.",
              "default": "",
              "group": 1
            },
            {
              "id": "channels",
              "type": "str",
              "caption": "Channels",
              "description": "Channels EPG data is used by.",
              "list": 1,
              "enum": {
                "type": "api",
                "uri": "channel/list",
                "event": "channel",
                "params": {
                  "all": 1,
                  "numbers": 1
                }
              },
              "group": 1,
              "value": [
                "2aae489c6a59abc9b0584c96b8300adb"
              ]
            },
            {
              "id": "only_one",
              "type": "bool",
              "caption": "Once per auto channel",
              "description": "Only use this EPG data once when automatically determining what EPG data to set for a channel.",
              "default": false,
              "group": 1,
              "value": false
            },
            {
              "id": "update",
              "type": "int",
              "caption": "Channel update options",
              "description": "Options used when updating channels.",
              "list": 1,
              "advanced": true,
              "enum": [
                {
                  "key": "update_icon",
                  "val": "Icon"
                },
                {
                  "key": "update_chnum",
                  "val": "Number"
                },
                {
                  "key": "update_chname",
                  "val": "Name"
                }
              ],
              "value": []
            },
            {
              "id": "comment",
              "type": "str",
              "caption": "Comment",
              "description": "Free-form text field, enter whatever you like.",
              "default": "",
              "group": 1
            }
          ]
        }
      ]
    }
    {
      "entries": [
        {
          "uuid": "280f57f849ce2360f3cc413223cc28a4",
          "enabled": true,
          "modid": "opentv-skyuk",
          "module": "OpenTV: Sky UK",
          "path": "",
          "updated": 0,
          "id": "opentv-skyuk-5602",
          "names": "",
          "number": 506,
          "channels": [
            "4e523d1471e66f64a2837b2cbb3e9c5f"
          ],
          "only_one": false,
          "update": []
        },
        ...
      ],
      "total": 279
    }
    {
       "entries" : [
          {
             "uuid" : "13ba822c654b492183fbd462cd2700f6",
             "title" : "External: XMLTV",
             "status" : "epggrabmodNone"
          }, ...
       ]
    }

    MPEGts

    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.

    hashtag
    mpegts/input/network_list

    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.

    hashtag
    mpegts/network/grid

    Lists available networks. The standard parameters listed in may be used. The items returned depend on the type of network - terrestrial, satellite, IPTV etc.

    hashtag
    mpegts/network/class

    Lists the text strings, options and defaults used when configuring the DVB capability within TVH (ie Configuration -> DVB Inputs -> Networks).

    hashtag
    mpegts/network/builders

    Lists the text strings, options and defaults used when configuring the DVB capability within TVH (ie Configuration -> DVB Inputs -> Network -> Add).

    hashtag
    mpegts/network/create

    Create a new network.

    • class Required. The class name matching the class item obtained from a call to .

    • conf Required. A JSON object containing the settings for this network.

    hashtag
    mpegts/network/mux_class

    Lists the text strings, options and defaults used when editing a multiplex using Configuration -> DVB Inputs -> Muxes -> Edit.

    • uuid The value of network_uuid from a call to .

    hashtag
    mpegts/network/mux_create

    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.

    hashtag
    mpegts/network/scan

    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.

    hashtag
    mpegts/mux/grid

    Lists available multiplexes. The standard parameters listed in may be used.

    • hidemode If set to all, only enabled multiplexes are listed. The default is to show all multiplexes.

    hashtag
    mpegts/mux/class

    Lists the text strings, options and defaults used when configuring the DVB capability within TVH (ie Configuration -> DVB Inputs -> Muxes).

    hashtag
    mpegts/service/grid

    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

    hashtag
    mpegts/service/class

    Lists the text strings, options and defaults used when configuring the DVB capability within TVH (ie Configuration -> DVB Inputs -> Services).

    hashtag
    mpegts/mux_sched/class

    Lists the text strings, options and defaults used when configuring the DVB capability within TVH (ie Configuration -> DVB Inputs -> Mux Schedulers).

    hashtag
    mpegts/mux_sched/grid

    List the entries as found under Configuration -> DVB Inputs -> Mux Schedulers. The standard parameters listed in may be used.

    hashtag
    mpegts/mux_sched/create

    Untested. Create a mux schedule, presumably from a structure similar to that from .

    hashtag
    dvb/orbitalpos/list

    Lists orbital positions and the satellites occupying them. The list is distributed with tvheadend; satellite reception is not necessary to use this API.

    hashtag
    dvb/scanfile/list

    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.

    UHDTV: 0x1f
    hardware/tree
    Grid Parameters
    mpegts/network/builders
    mpegts/mux/grid
    Grid Parameters
    Grid Parameters
    mpegts/mux_sched/grid
    {
       "entries" : [
          {
             "key" : "c70bb0e55db15cf44c72a8acb49d5ed7",
             "val" : "Sandy"
          }
       ]
    }
    curl http://192.168.1.1:9981/api/mpegts/network/grid |jq 
    {
      "entries": [
        {
          "uuid": "546f654e5e9abe67386f9ea3516987a3",
          "url": "file:///home/hts/iptvlist.m3u8",
          "channel_number": 0,
          "refetch_period": 60,
          "ssl_peer_verify": false,
          "tsid_zero": false,
          "remove_args": "",
          "ignore_path": 0,
          "scan_create": false,
          "service_sid": 1,
          "priority": 0,
          "spriority": 0,
          "max_streams": 0,
          "max_bandwidth": 0,
          "max_timeout": 15,
          "remove_scrambled": true,
          "enabled": true,
          "networkname": "iptv",
          "pnetworkname": "iptvlist",
          "nid": 0,
          "autodiscovery": 0,
          "bouquet": false,
          "skipinitscan": true,
          "idlescan": false,
          "sid_chnum": false,
          "ignore_chnum": false,
          "charset": "AUTO",
          "localtime": 0,
          "num_mux": 100,
          "num_svc": 100,
          "num_chn": 0,
          "scanq_length": 0,
          "wizard": false
        },
        {
          "uuid": "c9a4516fa61feef914de797a799f11d2",
          "orbital_pos": "28.2E",
          "enabled": true,
          "networkname": "Freesat",
          "pnetworkname": "ASTRA",
          "nid": 0,
          "autodiscovery": 2,
          "bouquet": false,
          "skipinitscan": false,
          "idlescan": false,
          "sid_chnum": false,
          "ignore_chnum": false,
          "charset": "AUTO",
          "localtime": 0,
          "num_mux": 79,
          "num_svc": 602,
          "num_chn": 193,
          "scanq_length": 0,
          "wizard": true
        }
      ],
      "total": 2
    }
    
    curl -d uuid=62d279b29fff2de0ff1245dad5154500 -d 'conf={"enabled":1,"epg":0,"epg_module_id":"","delsys":"DVBS","frequency":12440000,"symbolrate":29500000,"polarisation":"V","modulation":"QPSK","fec":"8/9","scan_state":0,"charset":"","rolloff":"AUTO","pilot":"AUTO","dvb_satip_dvbc_freq":0,"dvb_satip_dvbt_freq":0,"tsid_zero":false,"pmt_06_ac3":0,"eit_tsid_nocheck":false,"sid_filter":0,"stream_id":-1,"pls_mode":"ROOT","pls_code":1}'
     "http://192.168.0.1:9981/api/mpegts/network/mux_create"
    {
       "total" : 9,
       "entries" : [
          {
             "created" : 1508497835,
             "delsys" : "DVB-T",
             "scan_state" : 0,
             "tsid" : 24640,
             "scan_first" : 1508761027,
             "name" : "690MHz",
             "pnetwork_name" : "Cambs & Beds",
             "transmission_mode" : "8k",
             "sid_filter" : 0,
             "network_uuid" : "c70bb0e55db15cf44c72a8acb49d5ed7",
             "onid" : 9018,
             "num_svc" : 35,
             "eit_tsid_nocheck" : false,
             "num_chn" : 29,
             "hierarchy" : "NONE",
             "tsid_zero" : false,
             "pmt_06_ac3" : 0,
             "network" : "Sandy",
             "scan_last" : 1509267382,
             "bandwidth" : "8MHz",
             "fec_lo" : "NONE",
             "frequency" : 690000000,
             "constellation" : "QAM/64",
             "fec_hi" : "3/4",
             "epg" : 1,
             "guard_interval" : "1/32",
             "scan_result" : 1,
             "enabled" : 1,
             "uuid" : "0245c791efc3fa448c19db2f000d0d8f",
             "plp_id" : -1
          }, ...
       ]
    }
    curl http://192.168.1.1:9981/api/mpegts/service/grid | jq
    {
       "entries" : [
          {
             "uuid": "105984f18272f0e05107b296a1ea9d2a",
             "network": "Freesat",
             "multiplex": "11914.5H",
             "multiplex_uuid": "bb4aaf3f77880e60bdfc6fd33fc4efc1",
             "sid": 5229,
             "lcn": 0,
             "lcn_minor": 0,
             "lcn2": 0,
             "srcid": 0,
             "svcname": "Sky Arts",
             "provider": "BSkyB",
             "dvb_servicetype": 1,
             "dvb_ignore_eit": false,
             "prefcapid": 0,
             "prefcapid_lock": 0,
             "force_caid": 0,
             "pts_shift": 0,
             "created": 1623526273,
             "last_seen": 1662095234,
             "enabled": true,
             "auto": 0,
             "channel": [
                "4e3dacb42fa6aff571ff2ce2d143d70d"
             ],
             "priority": 0,
             "encrypted": false,
             "caid": "",
             "s_type_user": -1
          }, ...
       ]
      "total": 908
    }
    {
       "entries" : [
          {
             "mux" : "93b544d663e5313b12991fe9926ae4af",
             "restart" : false,
             "enabled" : true,
             "uuid" : "feab6167cd0596388382441987f33678",
             "timeout" : 600,
             "cron" : "30 3 * * *"
          }
       ],
       "total" : 1
    }
    {
       "entries" : [
          {
             "key" : "177W",
             "val" : "177W : NSS 9"
          }, ...
       ]
    }
    {
       "entries" : [
          {
             "val" : "> 28.2E:Astra",
             "key" : "dvb-s/geo/dvb-s_> 28.2E:Astra"
          }
       ]
    }

    for Lubuntu 22.04

    Setup Intel VAAPI on x86 (64 bits) system from scratch using Lubuntu 22.04

    Legend:

    • <command>— this is a command that should be copied to terminal.

    • ukn@ukn-lenovo:~$ uname -a — this is the output I got; you should get something similar (except username). Is intended for verification purpose.

    • rest of the text is informational.

    Hardware used in the process:

    Lenovo ThinkCentre M720q element with i5-9500T

    download ISO LUBUNTU 22.04:

    flash ISO to USB 32G using rufus-3.21

    Note:

    • make sure you plug the USB in USB2.0 socket (black).

    • HDD information will be lost when you install Lubuntu 22.04; make sure you back up any information.

    Install Lubuntu to PC with default settings; connect also to internet.

    Update some settings:

    Preference / LXQt setting / Power Management: Idle --> uncheck Enable Idleness Watcher

    Press button Close

    Preference / LXQt setting / Monitor Settings: 1280 x 720

    Press button Save and Yes

    Preference / LXQt setting / LXQt Configuration Center : Openbox Settings --> Desktops : Number of desktops : 1

    Preference / Screen Saver : Mode : Disable screen saver

    Install SSH

    open: System Tools / QTerminal

    sudo apt update

    sudo apt install ssh

    check status

    systemctl status ssh

    if is not working

    sudo systemctl enable ssh

    and

    sudo systemctl start ssh

    connect over SSH using Putty or terminal to continue the setup (from this point you should not need the keyboard, mouse and display for the server):

    Update to latest software

    sudo apt update

    sudo apt upgrade

    sudo reboot

    sudo apt autoremove --purge

    ukn@ukn-lenovo:$ uname -a

    Linux ukn-lenovo 6.8.0-52-generic #53~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jan 15 19:18:46 UTC 2 x86_64 x86_64 x86_64 GNU/Linux

    install OneVPL

    Before you start let's check that GPU is supported in MSDK or OneVPL.

    sudo lspci -nn | grep -e VGA

    ukn@ukn-lenovo:~$ sudo lspci -nn | grep -e VGA

    00:02.0 VGA compatible controller [0300]: Intel Corporation CoffeeLake-S GT2 [UHD Graphics 630] [8086:3e92]

    you can go on: and search for: "3e92" (check after [8086:****]). and see is: Intel® UHD Graphics 630 --> Gen 9 --> Coffee Lake

    install vainfo to check what profiles are available

    sudo apt install vainfo

    sudo vainfo

    $################### log output ####################

    ukn@ukn-lenovo:~$ sudo vainfo Trying display: wayland error: XDG_RUNTIME_DIR not set in the environment. Trying display: x11 error: can't connect to X server! Trying display: drm libva info: VA-API version 1.14.0 libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so libva info: Found init function __vaDriverInit_1_14 libva info: va_openDriver() returns 0 vainfo: VA-API version: 1.14 (libva 2.12.0) vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 22.3.1 () vainfo: Supported profile and entrypoints VAProfileMPEG2Simple : VAEntrypointVLD VAProfileMPEG2Main : VAEntrypointVLD VAProfileH264Main : VAEntrypointVLD VAProfileH264Main : VAEntrypointEncSliceLP VAProfileH264High : VAEntrypointVLD VAProfileJPEGBaseline : VAEntrypointVLD VAProfileJPEGBaseline : VAEntrypointEncPicture VAProfileH264ConstrainedBaseline: VAEntrypointVLD VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP VAProfileVP8Version0_3 : VAEntrypointVLD VAProfileHEVCMain : VAEntrypointVLD VAProfileHEVCMain10 : VAEntrypointVLD VAProfileVP9Profile0 : VAEntrypointVLD VAProfileVP9Profile2 : VAEntrypointVLD

    $########################################################

    Instructions:

    Install gpu driver

    Install the Intel graphics GPG public key

    wget -qO - https://repositories.intel.com/gpu/intel-graphics.key | sudo gpg --yes --dearmor --output /usr/share/keyrings/intel-graphics.gpg

    Configure the repositories.intel.com package repository

    echo "deb [arch=amd64,i386 signed-by=/usr/share/keyrings/intel-graphics.gpg] https://repositories.intel.com/gpu/ubuntu jammy unified" | sudo tee /etc/apt/sources.list.d/intel-gpu-jammy.list

    Update the package repository meta-data

    sudo apt update

    Install the compute-related packages

    sudo apt-get install -y libze-intel-gpu1 libze1 intel-opencl-icd clinfo

    Install the media-related packages

    sudo apt-get install -y intel-media-va-driver-non-free libmfx1 libmfx-gen1 libvpl2 libvpl-tools libva-glx2 va-driver-all

    Update to latest software:

    sudo apt update

    sudo apt upgrade

    sudo reboot

    sudo apt autoremove --purge

    sudo vainfo

    $################### log output ####################

    ukn@ukn-lenovo:~$ sudo vainfo Trying display: wayland error: XDG_RUNTIME_DIR not set in the environment. Trying display: x11 error: can't connect to X server! Trying display: drm libva info: VA-API version 1.22.0 libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so libva info: Found init function __vaDriverInit_1_22 libva info: va_openDriver() returns 0 vainfo: VA-API version: 1.22 (libva 2.22.0) vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 24.4.4 () vainfo: Supported profile and entrypoints VAProfileNone : VAEntrypointVideoProc VAProfileNone : VAEntrypointStats VAProfileMPEG2Simple : VAEntrypointVLD VAProfileMPEG2Simple : VAEntrypointEncSlice VAProfileMPEG2Main : VAEntrypointVLD VAProfileMPEG2Main : VAEntrypointEncSlice VAProfileH264Main : VAEntrypointVLD VAProfileH264Main : VAEntrypointEncSlice VAProfileH264Main : VAEntrypointFEI VAProfileH264Main : VAEntrypointEncSliceLP VAProfileH264High : VAEntrypointVLD VAProfileH264High : VAEntrypointEncSlice VAProfileH264High : VAEntrypointFEI VAProfileH264High : VAEntrypointEncSliceLP VAProfileVC1Simple : VAEntrypointVLD VAProfileVC1Main : VAEntrypointVLD VAProfileVC1Advanced : VAEntrypointVLD VAProfileJPEGBaseline : VAEntrypointVLD VAProfileJPEGBaseline : VAEntrypointEncPicture VAProfileH264ConstrainedBaseline: VAEntrypointVLD VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice VAProfileH264ConstrainedBaseline: VAEntrypointFEI VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP VAProfileVP8Version0_3 : VAEntrypointVLD VAProfileVP8Version0_3 : VAEntrypointEncSlice VAProfileHEVCMain : VAEntrypointVLD VAProfileHEVCMain : VAEntrypointEncSlice VAProfileHEVCMain : VAEntrypointFEI VAProfileHEVCMain10 : VAEntrypointVLD VAProfileHEVCMain10 : VAEntrypointEncSlice VAProfileVP9Profile0 : VAEntrypointVLD VAProfileVP9Profile2 : VAEntrypointVLD

    $########################################################

    Install developer packages:

    sudo apt-get install -y libigc-dev intel-igc-cm libigdfcl-dev libigfxcmrt-dev level-zero-dev

    Configuring permissions for render:

    To access GPU capabilities, a user needs to have the correct permissions. The following will list the group assigned ownership of the render nodes, and list the groups the active user is a member of:

    stat -c "%G" /dev/dri/render*

    --> render

    ukn@ukn-lenovo:~$ stat -c "%G" /dev/dri/render*

    render

    groups ${USER}

    ukn@ukn-lenovo:~$ groups ${USER}

    ukn : ukn adm cdrom sudo dip plugdev lpadmin sambashare

    My user doesn't have access because is not art of 'render' Now we add my user (ukn) to group (render)

    sudo gpasswd -a ${USER} render

    ukn@ukn-lenovo:~$ sudo gpasswd -a ${USER} render

    Adding user ukn to group render

    newgrp render

    verify:

    groups ${USER}

    ukn@ukn-lenovo:~$ groups ${USER}

    ukn : ukn adm cdrom sudo dip plugdev render lpadmin sambashare

    Now we see user is part of render.

    sudo vainfo

    $################### log output ####################

    ukn@ukn-lenovo:~$ sudo vainfo Trying display: wayland error: XDG_RUNTIME_DIR not set in the environment. Trying display: x11 error: can't connect to X server! Trying display: drm libva info: VA-API version 1.22.0 libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so libva info: Found init function __vaDriverInit_1_22 libva info: va_openDriver() returns 0 vainfo: VA-API version: 1.22 (libva 2.22.0) vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 24.4.4 () vainfo: Supported profile and entrypoints VAProfileNone : VAEntrypointVideoProc VAProfileNone : VAEntrypointStats VAProfileMPEG2Simple : VAEntrypointVLD VAProfileMPEG2Simple : VAEntrypointEncSlice VAProfileMPEG2Main : VAEntrypointVLD VAProfileMPEG2Main : VAEntrypointEncSlice VAProfileH264Main : VAEntrypointVLD VAProfileH264Main : VAEntrypointEncSlice VAProfileH264Main : VAEntrypointFEI VAProfileH264Main : VAEntrypointEncSliceLP VAProfileH264High : VAEntrypointVLD VAProfileH264High : VAEntrypointEncSlice VAProfileH264High : VAEntrypointFEI VAProfileH264High : VAEntrypointEncSliceLP VAProfileVC1Simple : VAEntrypointVLD VAProfileVC1Main : VAEntrypointVLD VAProfileVC1Advanced : VAEntrypointVLD VAProfileJPEGBaseline : VAEntrypointVLD VAProfileJPEGBaseline : VAEntrypointEncPicture VAProfileH264ConstrainedBaseline: VAEntrypointVLD VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice VAProfileH264ConstrainedBaseline: VAEntrypointFEI VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP VAProfileVP8Version0_3 : VAEntrypointVLD VAProfileVP8Version0_3 : VAEntrypointEncSlice VAProfileHEVCMain : VAEntrypointVLD VAProfileHEVCMain : VAEntrypointEncSlice VAProfileHEVCMain : VAEntrypointFEI VAProfileHEVCMain10 : VAEntrypointVLD VAProfileHEVCMain10 : VAEntrypointEncSlice VAProfileVP9Profile0 : VAEntrypointVLD VAProfileVP9Profile2 : VAEntrypointVLD

    $########################################################

    the data format is: CODEC/profile : Encoder/Decoder

    VAProfileH264High : VAEntrypointVLD VAProfileH264High : VAEntrypointEncSlice VAProfileH264High : VAEntrypointFEI VAProfileH264High : VAEntrypointEncSliceLP

    This is: H264, Profile high with decoder (VAEntrypointVLD) , Encoder (VAEntrypointEncSlice) and LowPower encoder (VAEntrypointEncSliceLP) Is important to identify if your GPU has this low power (LP) codecs available. In my case I have low power for: H264 profiles Main, High and Constrained

    sudo apt update

    sudo apt upgrade

    Install gpu tools (required to check the work load on GPU):

    sudo apt install intel-gpu-tools

    Intel GPU:

    sudo apt install i965-va-driver-shaders

    Enable GUC/HuC firmware (this is a must for encoding with low power codec):

    we need to generate a file: /etc/modprobe.d/i915.conf

    with the text (only one line) "options i915 enable_guc=1"

    echo -e "options i915 enable_guc=1" | sudo tee -a /etc/modprobe.d/i915.conf

    sudo update-initramfs -k all -u

    sudo update-grub

    sudo reboot

    Verify GuC was enabled:

    sudo dmesg | grep guc

    ukn@ukn-lenovo:~$ sudo dmesg | grep guc

    [ 4.331207] Setting dangerous option enable_guc - tainting kernel

    [ 4.343052] i915 0000:00:02.0: [drm] GT0: Incompatible option enable_guc=1 - GuC submission is N/A

    [ 4.726395] i915 0000:00:02.0: [drm] GT0: GuC firmware i915/kbl_guc_70.1.1.bin version 70.1.1

    In this case we see that GuC is not available (so bit 1 is not useful).

    delete the old file:

    sudo rm /etc/modprobe.d/i915.conf

    echo -e "options i915 enable_guc=2" | sudo tee -a /etc/modprobe.d/i915.conf

    sudo update-initramfs -k all -u

    sudo update-grub

    sudo reboot

    Verify GuC was enabled:

    sudo dmesg | grep guc

    ukn@ukn-lenovo:~$ sudo dmesg | grep guc

    [ 2.142048] Setting dangerous option enable_guc - tainting kernel

    [ 2.502650] i915 0000:00:02.0: [drm] GT0: GuC firmware i915/kbl_guc_70.1.1.bin version 70.1.1

    This setting was accepted; bit 2 was able to enable GuC

    Note:

    For system with Intel gen 11+ most likely you might want to check enable_guc=3

    -> it sounds scary 'dangerous option' ... but is fine.

    this is required to scan channels later on:

    sudo apt update

    sudo apt install w-scan

    sudo apt upgrade

    clean up:

    sudo apt autoremove --purge

    hashtag
    Compile tvheadend

    cd ~

    git clone https://github.com/tvheadend/tvheadend.git

    sudo apt update

    sudo apt install cmake gettext libssl-dev liburiparser-dev libavahi-client-dev libdvbcsa-dev libva-dev debhelper zlib1g-dev libpcre3-dev

    sudo apt install python-is-python3

    sudo apt install python3-requests

    cd tvheadend

    ./configure

    $################### log output ####################

    ukn@ukn-lenovo:~/tvheadend$ ./configure Checking support/features checking for cc execinfo.h ... ok checking for cc -mmmx ... ok checking for cc -msse2 ... ok checking for cc -Wunused-result ... ok checking for cc -fstack-protector ... ok checking for cc -fstack-protector-strong ... ok checking for cc -fstack-check ... ok checking for cc -fPIE ... ok checking for cc strlcat ... fail checking for cc strlcpy ... fail checking for cc fdatasync ... ok checking for cc getloadavg ... ok checking for cc atomic32 ... ok checking for cc atomic64 ... ok checking for cc atomic_time_t ... ok checking for cc atomic_ptr ... ok checking for cc bitops64 ... ok checking for cc lockowner ... ok checking for cc qsort_r ... ok checking for cc time_ld ... ok checking for cc time_lld ... fail ^ using time_t format 'ld' checking for cc stime ... fail checking for cc gmtoff ... ok checking for cc recvmmsg ... ok checking for cc sendmmsg ... ok checking for cc gnu_libiconv ... fail checking for cc libiconv ... fail ^ using build-in glibc iconv routines checking for cc ifnames ... ok checking for cc cclang_threadsan ... fail checking for py module gzip ... ok checking for pkg-config ... ok checking for xgettext ... ok checking for msgmerge ... ok checking for gzip ... ok checking for bzip2 ... ok checking for pkg openssl ... ok (detected 3.0.2) checking for cc linux/dvb/version.h ... ok checking for pkg zlib ... fail (detected ) checking for pkg libpcre2-8 ... fail (detected ) checking for pkg libpcre ... fail (detected ) checking for pkg liburiparser ... ok (detected 0.9.6) checking for pkg avahi-client ... ok (detected 0.8) checking for cmake ... ok checking for cc -lstdc++ ... ok checking for pkg libva >=0.38.0 ... ok (detected 1.22.0) checking for pkg libva-drm >=0.38.0 ... ok (detected 1.22.0) checking for cc sys/inotify.h ... ok checking for cc inotify_init1 ... ok checking for cc dvbcsa/dvbcsa.h ... ok checking for cc -ldvbcsa ... ok fetching dvb-scan files ... ok checking for cc epoll_create1 ... ok checking for pkg dbus-1 ... ok (detected 1.12.20)

    Compiler: Using C compiler: cc Using LD flags: -ldvbcsa Build for arch: x86_64

    Binaries: Using PYTHON: python Using GZIP: gzip Using BZIP2: bzip2

    Options: pie yes ccdebug no cardclient yes cwc yes cccam yes capmt yes constcw yes linuxdvb yes satip_server yes satip_client yes hdhomerun_client yes hdhomerun_server yes hdhomerun_static yes iptv yes tsfile yes dvbscan yes timeshift yes trace yes avahi yes zlib no libav yes ffmpeg_static yes libx264 yes libx264_static yes libx265 yes libx265_static yes libvpx yes libvpx_static yes libtheora yes libtheora_static yes libvorbis yes libvorbis_static yes libfdkaac no libfdkaac_static no libopus yes libopus_static yes nvenc no vaapi yes mmal no omx no inotify yes epoll yes pcre no pcre2 no uriparser yes ccache no tvhcsa yes bundle no pngquant no kqueue no dbus_1 yes android no gtimer_check no slow_memoryinfo no libsystemd_daemon no pcloud_cache yes ddci yes cclang_threadsan no gperftools no execinfo yes mmx yes sse2 yes W_unused_result yes f_stack_protector yes f_stack_protector_strong yes f_stack_check yes f_PIE yes fdatasync yes getloadavg yes atomic32 yes atomic64 yes atomic_time_t yes atomic_ptr yes bitops64 yes lockowner yes qsort_r yes time_ld yes gmtoff yes recvmmsg yes sendmmsg yes ifnames yes py_gzip yes bin_pkg_config yes bin_xgettext yes bin_msgmerge yes bin_gzip yes bin_bzip2 yes ssl yes linuxdvbapi yes linuxdvb_ca yes upnp yes bin_cmake yes stdcpp yes libogg_static yes hwaccels yes inotify_h yes inotify_init1 yes dvbcsa yes epoll_create1 yes mpegts yes mpegts_dvb yes

    Packages: openssl 3.0.2 liburiparser 0.9.6 avahi-client 0.8 libva 1.22.0 libva-drm 1.22.0 dbus-1 1.12.20

    Installation paths: Prefix: /usr/local Binaries: ${prefix}/bin Libraries: ${prefix}/lib Data files: ${prefix}/share Man pages: ${datadir}/man

    Final Binary: /home/ukn/tvheadend/build.linux/tvheadend

    Tvheadend Data Directory: /usr/local/share/tvheadend

    $################### log output end ####################

    Build tvheadend:

    ./Autobuild.sh

    $################### log output ####################

    ....................................................................................

    dpkg-deb: building package 'tvheadend-dbg' in '../tvheadend-dbg_4.3-2375~g653bd0400~jammy_amd64.deb'. dpkg-deb: building package 'tvheadend' in '../tvheadend_4.3-2375~g653bd0400~jammy_amd64.deb'. make[1]: Leaving directory '/home/ukn/tvheadend' dpkg-genbuildinfo --build=binary -O../tvheadend_4.3-2375~g653bd0400~jammy_amd64.buildinfo dpkg-genchanges --build=binary -O../tvheadend_4.3-2375~g653bd0400~jammy_amd64.changes dpkg-genchanges: info: binary-only upload (no source code included) dpkg-source --after-build . dpkg-buildpackage: info: binary-only upload (no source included)

    $################### log output end ####################

    From this last log you need to copy the file name starting "'tvheadend' in '../tvheadend_4.3..." (in your case will have a different number after '4.3-') In my case is: tvheadend-dbg_4.3-2375~g653bd0400~jammy_amd64.deb

    cd ..

    Install tvheadend:

    sudo dpkg -i tvheadend_4.3-2375~g653bd0400~jammy_amd64.deb

    We have to add also user hts to render (or your group that has access to GPU):

    sudo gpasswd -a hts render

    newgrp render

    verify:

    groups hts

    ukn@ukn-lenovo:~$ groups hts

    hts : hts render

    Now we see user is part of render.

    restart:

    sudo reboot

    Setup VAAPI profile:

    in browser

    http://[IP_NUMBER]:9981

    Setup GPU transcoding:

    --> make sure you have Expert settings selected Configure / General / Base / Web Interface Settings / Default View Level

    Add codec profile:

    Configuration / Stream / Codec Profiles --> Add

    Codec: h264_vaapi

    Name: h264_vaapi

    Description: ....

    Deinterlace: checked (very important)

    Height: 0

    Hardware acceleration: checked (very important)

    Device name: i915 v.1.6.0 (/dev/dri/renderD128) (very important)

    Bitrate: 0

    Buffer factor: 3 Rate

    control: 1 (CQP)

    Constant QP: 27

    Ignore B-Frames: 0

    Quality: 1

    Press Create button.

    Add stream profile:

    Configuration / Stream / Stream Profiles --> Add

    Type: Transcode/av-lib

    Profile name: h264

    Enabled: checked

    Default: checked

    Comment: ...

    Data timeout: 5

    Default priority: Normal

    Force priority: 0

    Restart on error: checked

    Continue if descrambling fails: checked

    Descrambling timeout: 2000

    Switch to another service: checked

    Preferred services vide type: None

    Container: Matroska

    Video codec profile: h264_vaapi (very important)

    Source video codec: EMPTY

    Audio codec profile: web-aac

    Source audio codec: EMPTY

    Subtitle codec profile: Copy

    Source subtitle codec: EMPTY

    Press Create button.

    Note: all 'very important' are required.

    Now you are ready to test: open one stream with tvh server and check the Tvheadend log:

    2022-12-09 10:53:37.821 transcode: 0001: 01:MPEG2VIDEO: ==> Using profile h264_vaapi 2022-12-09 10:53:37.822 transcode: 0001: 02:AC3: ==> Using profile webtv-aac

    To confirm you are using GPU for trancoding you need to send:

    sudo intel_gpu_top

    When you don't have any streams open you will see all numbers: 0; after you open streams you should see values non-zero in: Render/3D , Video and VideoEnhance.

    for Lubuntu 24.04

    Setup Intel VAAPI on x86 (64 bits) system from scratch using Lubuntu 24.04

    Legend:

    • <command>— this is a command that should be copied to terminal.

    • ukn@ukn-lenovo:~$ uname -a — this is the output I got; you should get something similar (except username). Is intended for verification purpose.

    • rest of the text is informational.

    Hardware used in the process:

    Lenovo ThinkCentre M720q element with i5-9500T

    download ISO LUBUNTU 24.04:

    flash ISO to USB 32G using rufus-3.21

    Note:

    • make sure you plug the USB in USB2.0 socket (black).

    • HDD information will be lost when you install Lubuntu 24.04; make sure you back up any information.

    Install Lubuntu to PC with default settings; connect also to internet.

    Update some settings:

    Preference / LXQt setting / Power Management: Idle --> uncheck Enable Idleness Watcher

    Press button Close

    Preference / LXQt setting / Monitor Settings: 1280 x 720

    Press button Save and Yes

    Preference / LXQt setting / LXQt Configuration Center : Openbox Settings --> Desktops : Number of desktops : 1

    Preference / Screen Saver : Mode : Disable screen saver

    Install SSH

    open: System Tools / QTerminal

    sudo apt update

    sudo apt install ssh

    check status

    systemctl status ssh

    if is not working

    sudo systemctl enable ssh

    and

    sudo systemctl start ssh

    connect over SSH using Putty or terminal to continue the setup (from this point you should not need the keyboard, mouse and display for the server):

    Update to latest software

    sudo apt update

    sudo apt upgrade

    sudo reboot

    sudo apt autoremove --purge

    ukn@ukn-lenovo:~$ uname -a

    Linux ukn-lenovo 6.8.0-52-generic #53-Ubuntu SMP PREEMPT_DYNAMIC Sat Jan 11 00:06:25 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux

    install OneVPL

    Before you start let's check that GPU is supported in MSDK or OneVPL.

    sudo lspci -nn | grep -e VGA

    ukn@ukn-lenovo:~$ sudo lspci -nn | grep -e VGA

    00:02.0 VGA compatible controller [0300]: Intel Corporation CoffeeLake-S GT2 [UHD Graphics 630] [8086:3e92]

    you can go on: and search for: "3e92" (check after [8086:****]). and see is: Intel® UHD Graphics 630 --> Gen 9 --> Coffee Lake

    install vainfo to check what profiles are available

    sudo apt install vainfo

    sudo vainfo

    $################### log output ####################

    ukn@ukn-lenovo:~$ sudo vainfo Trying display: wayland error: XDG_RUNTIME_DIR not set in the environment. Trying display: x11 error: can't connect to X server! Trying display: drm libva info: VA-API version 1.20.0 libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so libva info: Found init function __vaDriverInit_1_20 libva info: va_openDriver() returns 0 vainfo: VA-API version: 1.20 (libva 2.12.0) vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 24.1.0 () vainfo: Supported profile and entrypoints VAProfileMPEG2Simple : VAEntrypointVLD VAProfileMPEG2Main : VAEntrypointVLD VAProfileH264Main : VAEntrypointVLD VAProfileH264Main : VAEntrypointEncSliceLP VAProfileH264High : VAEntrypointVLD VAProfileJPEGBaseline : VAEntrypointVLD VAProfileJPEGBaseline : VAEntrypointEncPicture VAProfileH264ConstrainedBaseline: VAEntrypointVLD VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP VAProfileVP8Version0_3 : VAEntrypointVLD VAProfileHEVCMain : VAEntrypointVLD VAProfileHEVCMain10 : VAEntrypointVLD VAProfileVP9Profile0 : VAEntrypointVLD VAProfileVP9Profile2 : VAEntrypointVLD

    $########################################################

    Instructions:

    Install gpu driver

    Install the Intel graphics GPG public key

    wget -qO - https://repositories.intel.com/gpu/intel-graphics.key | sudo gpg --yes --dearmor --output /usr/share/keyrings/intel-graphics.gpg

    Configure the repositories.intel.com package repository

    echo "deb [arch=amd64,i386 signed-by=/usr/share/keyrings/intel-graphics.gpg] https://repositories.intel.com/gpu/ubuntu noble client" | sudo tee /etc/apt/sources.list.d/intel-gpu-noble.list

    Update the package repository meta-data

    sudo apt update

    Install the compute-related packages

    sudo apt-get install -y libze-intel-gpu1 libze1 intel-opencl-icd clinfo intel-gsc

    Install the media-related packages

    sudo apt-get install -y intel-media-va-driver-non-free libmfx1 libmfx-gen1 libvpl2 libvpl-tools libva-glx2 va-driver-all

    Update to latest software:

    sudo apt update

    sudo apt upgrade

    sudo reboot

    sudo apt autoremove --purge

    sudo vainfo

    $################### log output ####################

    ukn@ukn-lenovo:~$ sudo vainfo Trying display: wayland error: XDG_RUNTIME_DIR not set in the environment. Trying display: x11 error: can't connect to X server! Trying display: drm libva info: VA-API version 1.22.0 libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so libva info: Found init function __vaDriverInit_1_22 libva info: va_openDriver() returns 0 vainfo: VA-API version: 1.22 (libva 2.22.0) vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 24.3.4 () vainfo: Supported profile and entrypoints VAProfileNone : VAEntrypointVideoProc VAProfileNone : VAEntrypointStats VAProfileMPEG2Simple : VAEntrypointVLD VAProfileMPEG2Simple : VAEntrypointEncSlice VAProfileMPEG2Main : VAEntrypointVLD VAProfileMPEG2Main : VAEntrypointEncSlice VAProfileH264Main : VAEntrypointVLD VAProfileH264Main : VAEntrypointEncSlice VAProfileH264Main : VAEntrypointFEI VAProfileH264Main : VAEntrypointEncSliceLP VAProfileH264High : VAEntrypointVLD VAProfileH264High : VAEntrypointEncSlice VAProfileH264High : VAEntrypointFEI VAProfileH264High : VAEntrypointEncSliceLP VAProfileVC1Simple : VAEntrypointVLD VAProfileVC1Main : VAEntrypointVLD VAProfileVC1Advanced : VAEntrypointVLD VAProfileJPEGBaseline : VAEntrypointVLD VAProfileJPEGBaseline : VAEntrypointEncPicture VAProfileH264ConstrainedBaseline: VAEntrypointVLD VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice VAProfileH264ConstrainedBaseline: VAEntrypointFEI VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP VAProfileVP8Version0_3 : VAEntrypointVLD VAProfileVP8Version0_3 : VAEntrypointEncSlice VAProfileHEVCMain : VAEntrypointVLD VAProfileHEVCMain : VAEntrypointEncSlice VAProfileHEVCMain : VAEntrypointFEI VAProfileHEVCMain10 : VAEntrypointVLD VAProfileHEVCMain10 : VAEntrypointEncSlice VAProfileVP9Profile0 : VAEntrypointVLD VAProfileVP9Profile2 : VAEntrypointVLD

    $########################################################

    Install developer packages:

    sudo apt-get install -y libigc-dev intel-igc-cm libigdfcl-dev libigfxcmrt-dev level-zero-dev

    Configuring permissions for render:

    To access GPU capabilities, a user needs to have the correct permissions. The following will list the group assigned ownership of the render nodes, and list the groups the active user is a member of:

    stat -c "%G" /dev/dri/render*

    --> render

    ukn@ukn-lenovo:~$ stat -c "%G" /dev/dri/render*

    render

    groups ${USER}

    ukn@ukn-lenovo:~$ groups ${USER}

    ukn : ukn adm cdrom sudo dip plugdev lpadmin sambashare

    My user doesn't have access because is not art of 'render' Now we add my user (ukn) to group (render)

    sudo gpasswd -a ${USER} render

    ukn@ukn-lenovo:~$ sudo gpasswd -a ${USER} render

    Adding user ukn to group render

    newgrp render

    verify:

    groups ${USER}

    ukn@ukn-lenovo:~$ groups ${USER}

    ukn : ukn adm cdrom sudo dip plugdev render lpadmin sambashare

    Now we see user is part of render.

    sudo vainfo

    $################### log output ####################

    ukn@ukn-lenovo:~$ sudo vainfo Trying display: wayland error: XDG_RUNTIME_DIR not set in the environment. Trying display: x11 error: can't connect to X server! Trying display: drm libva info: VA-API version 1.22.0 libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so libva info: Found init function __vaDriverInit_1_22 libva info: va_openDriver() returns 0 vainfo: VA-API version: 1.22 (libva 2.22.0) vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 24.3.4 () vainfo: Supported profile and entrypoints VAProfileNone : VAEntrypointVideoProc VAProfileNone : VAEntrypointStats VAProfileMPEG2Simple : VAEntrypointVLD VAProfileMPEG2Simple : VAEntrypointEncSlice VAProfileMPEG2Main : VAEntrypointVLD VAProfileMPEG2Main : VAEntrypointEncSlice VAProfileH264Main : VAEntrypointVLD VAProfileH264Main : VAEntrypointEncSlice VAProfileH264Main : VAEntrypointFEI VAProfileH264Main : VAEntrypointEncSliceLP VAProfileH264High : VAEntrypointVLD VAProfileH264High : VAEntrypointEncSlice VAProfileH264High : VAEntrypointFEI VAProfileH264High : VAEntrypointEncSliceLP VAProfileVC1Simple : VAEntrypointVLD VAProfileVC1Main : VAEntrypointVLD VAProfileVC1Advanced : VAEntrypointVLD VAProfileJPEGBaseline : VAEntrypointVLD VAProfileJPEGBaseline : VAEntrypointEncPicture VAProfileH264ConstrainedBaseline: VAEntrypointVLD VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice VAProfileH264ConstrainedBaseline: VAEntrypointFEI VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP VAProfileVP8Version0_3 : VAEntrypointVLD VAProfileVP8Version0_3 : VAEntrypointEncSlice VAProfileHEVCMain : VAEntrypointVLD VAProfileHEVCMain : VAEntrypointEncSlice VAProfileHEVCMain : VAEntrypointFEI VAProfileHEVCMain10 : VAEntrypointVLD VAProfileHEVCMain10 : VAEntrypointEncSlice VAProfileVP9Profile0 : VAEntrypointVLD VAProfileVP9Profile2 : VAEntrypointVLD

    $########################################################

    the data format is: CODEC/profile : Encoder/Decoder

    VAProfileH264High : VAEntrypointVLD VAProfileH264High : VAEntrypointEncSlice VAProfileH264High : VAEntrypointFEI VAProfileH264High : VAEntrypointEncSliceLP

    This is: H264, Profile high with decoder (VAEntrypointVLD) , Encoder (VAEntrypointEncSlice) and LowPower encoder (VAEntrypointEncSliceLP) Is important to identify if your GPU has this low power (LP) codecs available. In my case I have low power for: H264 profiles Main, High and Constrained

    sudo apt update

    sudo apt upgrade

    Install gpu tools (required to check the work load on GPU):

    sudo apt install intel-gpu-tools

    Intel GPU:

    sudo apt install i965-va-driver-shaders

    Enable GUC/HuC firmware (this is a must for encoding with low power codec):

    we need to generate a file: /etc/modprobe.d/i915.conf

    with the text (only one line) "options i915 enable_guc=1"

    echo -e "options i915 enable_guc=1" | sudo tee -a /etc/modprobe.d/i915.conf

    sudo update-initramfs -k all -u

    sudo update-grub

    sudo reboot

    Verify GuC was enabled:

    sudo dmesg | grep guc

    ukn@ukn-lenovo:~$ sudo dmesg | grep guc

    [ 4.331207] Setting dangerous option enable_guc - tainting kernel

    [ 4.343052] i915 0000:00:02.0: [drm] GT0: Incompatible option enable_guc=1 - GuC submission is N/A

    [ 4.726395] i915 0000:00:02.0: [drm] GT0: GuC firmware i915/kbl_guc_70.1.1.bin version 70.1.1

    In this case we see that GuC is not available (so bit 1 is not useful).

    delete the old file:

    sudo rm /etc/modprobe.d/i915.conf

    echo -e "options i915 enable_guc=2" | sudo tee -a /etc/modprobe.d/i915.conf

    sudo update-initramfs -k all -u

    sudo update-grub

    sudo reboot

    Verify GuC was enabled:

    sudo dmesg | grep guc

    ukn@ukn-lenovo:~$ sudo dmesg | grep guc

    [ 2.142048] Setting dangerous option enable_guc - tainting kernel

    [ 2.502650] i915 0000:00:02.0: [drm] GT0: GuC firmware i915/kbl_guc_70.1.1.bin version 70.1.1

    This setting was accepted; bit 2 was able to enable GuC

    Note:

    For system with Intel gen 11+ most likely you might want to check enable_guc=3

    -> it sounds scary 'dangerous option' ... but is fine.

    this is required to scan channels later on:

    sudo apt update

    sudo apt install w-scan

    sudo apt upgrade

    clean up:

    sudo apt autoremove --purge

    hashtag
    Compile tvheadend

    cd ~

    git clone https://github.com/tvheadend/tvheadend.git

    sudo apt update

    sudo apt install cmake gettext libssl-dev liburiparser-dev libavahi-client-dev libdvbcsa-dev libva-dev debhelper

    sudo apt install python-is-python3

    cd tvheadend

    ./configure

    $################### log output ####################

    ukn@ukn-lenovo:~/tvheadend$ ./configure Checking support/features checking for cc execinfo.h ... ok checking for cc -mmmx ... ok checking for cc -msse2 ... ok checking for cc -Wunused-result ... ok checking for cc -fstack-protector ... ok checking for cc -fstack-protector-strong ... ok checking for cc -fstack-check ... ok checking for cc -fPIE ... ok checking for cc strlcat ... ok checking for cc strlcpy ... ok checking for cc fdatasync ... ok checking for cc getloadavg ... ok checking for cc atomic32 ... ok checking for cc atomic64 ... ok checking for cc atomic_time_t ... ok checking for cc atomic_ptr ... ok checking for cc bitops64 ... ok checking for cc lockowner ... ok checking for cc qsort_r ... ok checking for cc time_ld ... ok checking for cc time_lld ... fail ^ using time_t format 'ld' checking for cc stime ... fail checking for cc gmtoff ... ok checking for cc recvmmsg ... ok checking for cc sendmmsg ... ok checking for cc gnu_libiconv ... fail checking for cc libiconv ... fail ^ using build-in glibc iconv routines checking for cc ifnames ... ok checking for cc cclang_threadsan ... fail checking for py module gzip ... ok checking for pkg-config ... ok checking for xgettext ... ok checking for msgmerge ... ok checking for gzip ... ok checking for bzip2 ... ok checking for pkg openssl ... ok (detected 3.0.13) checking for cc linux/dvb/version.h ... ok checking for pkg zlib ... ok (detected 1.3) checking for pkg libpcre2-8 ... ok (detected 10.42) checking for pkg liburiparser ... ok (detected 0.9.7) checking for pkg avahi-client ... ok (detected 0.8) checking for cmake ... ok checking for cc -lstdc++ ... ok checking for pkg libva >=0.38.0 ... ok (detected 1.22.0) checking for pkg libva-drm >=0.38.0 ... ok (detected 1.22.0) checking for cc sys/inotify.h ... ok checking for cc inotify_init1 ... ok checking for cc dvbcsa/dvbcsa.h ... ok checking for cc -ldvbcsa ... ok fetching dvb-scan files ... ok checking for cc epoll_create1 ... ok checking for pkg dbus-1 ... ok (detected 1.14.10)

    Compiler: Using C compiler: cc Using LD flags: -ldvbcsa Build for arch: x86_64

    Binaries: Using PYTHON: python Using GZIP: gzip Using BZIP2: bzip2

    Options: pie yes ccdebug no cardclient yes cwc yes cccam yes capmt yes constcw yes linuxdvb yes satip_server yes satip_client yes hdhomerun_client yes hdhomerun_server yes hdhomerun_static yes iptv yes tsfile yes dvbscan yes timeshift yes trace yes avahi yes zlib yes libav yes ffmpeg_static yes libx264 yes libx264_static yes libx265 yes libx265_static yes libvpx yes libvpx_static yes libtheora yes libtheora_static yes libvorbis yes libvorbis_static yes libfdkaac no libfdkaac_static no libopus yes libopus_static yes nvenc no vaapi yes mmal no omx no inotify yes epoll yes pcre no pcre2 yes uriparser yes ccache no tvhcsa yes bundle no pngquant no kqueue no dbus_1 yes android no gtimer_check no slow_memoryinfo no libsystemd_daemon no pcloud_cache yes ddci yes cclang_threadsan no gperftools no execinfo yes mmx yes sse2 yes W_unused_result yes f_stack_protector yes f_stack_protector_strong yes f_stack_check yes f_PIE yes strlcat yes strlcpy yes fdatasync yes getloadavg yes atomic32 yes atomic64 yes atomic_time_t yes atomic_ptr yes bitops64 yes lockowner yes qsort_r yes time_ld yes gmtoff yes recvmmsg yes sendmmsg yes ifnames yes py_gzip yes bin_pkg_config yes bin_xgettext yes bin_msgmerge yes bin_gzip yes bin_bzip2 yes ssl yes linuxdvbapi yes linuxdvb_ca yes upnp yes bin_cmake yes stdcpp yes libogg_static yes hwaccels yes inotify_h yes inotify_init1 yes dvbcsa yes epoll_create1 yes mpegts yes mpegts_dvb yes

    Packages: openssl 3.0.13 zlib 1.3 libpcre2-8 10.42 liburiparser 0.9.7 avahi-client 0.8 libva 1.22.0 libva-drm 1.22.0 dbus-1 1.14.10

    Installation paths: Prefix: /usr/local Binaries: ${prefix}/bin Libraries: ${prefix}/lib Data files: ${prefix}/share Man pages: ${datadir}/man

    Final Binary: /home/ukn/tvheadend/build.linux/tvheadend

    Tvheadend Data Directory: /usr/local/share/tvheadend

    $################### log output end ####################

    Build tvheadend:

    ./Autobuild.sh

    $################### log output ####################

    ....................................................................................

    dpkg-deb: building package 'tvheadend-dbg' in '../tvheadend-dbg_4.3-2375g653bd0400noble_amd64.deb'. dpkg-deb: building package 'tvheadend' in '../tvheadend_4.3-2375g653bd0400noble_amd64.deb'. make[1]: Leaving directory '/home/ukn/tvheadend' dpkg-genbuildinfo --build=binary -O../tvheadend_4.3-2375g653bd0400noble_amd64.buildinfo dpkg-genchanges --build=binary -O../tvheadend_4.3-2375g653bd0400noble_amd64.changes dpkg-genchanges: info: binary-only upload (no source code included) dpkg-source --after-build . dpkg-buildpackage: info: binary-only upload (no source included)

    $################### log output end ####################

    From this last log you need to copy the file name starting "'tvheadend' in '../tvheadend_4.3..." (in your case will have a different number after '4.3-') In my case is: tvheadend_4.3-2375~g653bd0400~noble_amd64.deb

    cd ..

    Install tvheadend:

    sudo dpkg -i tvheadend_4.3-2375~g653bd0400~noble_amd64.deb

    We have to add also user hts to render (or your group that has access to GPU):

    sudo gpasswd -a hts render

    newgrp render

    verify:

    groups hts

    ukn@ukn-lenovo:~$ groups hts

    hts : hts render

    Now we see user is part of render.

    restart:

    sudo reboot

    Setup VAAPI profile:

    in browser

    http://[IP_NUMBER]:9981

    Setup GPU transcoding:

    --> make sure you have Expert settings selected Configure / General / Base / Web Interface Settings / Default View Level

    Add codec profile:

    Configuration / Stream / Codec Profiles --> Add

    Codec: h264_vaapi

    Name: h264_vaapi

    Description: ....

    Deinterlace: checked (very important)

    Height: 0

    Hardware acceleration: checked (very important)

    Device name: i915 v.1.6.0 (/dev/dri/renderD128) (very important)

    Bitrate: 0

    Buffer factor: 3 Rate

    control: 1 (CQP)

    Constant QP: 27

    Ignore B-Frames: 0

    Quality: 1

    Press Create button.

    Add stream profile:

    Configuration / Stream / Stream Profiles --> Add

    Type: Transcode/av-lib

    Profile name: h264

    Enabled: checked

    Default: checked

    Comment: ...

    Data timeout: 5

    Default priority: Normal

    Force priority: 0

    Restart on error: checked

    Continue if descrambling fails: checked

    Descrambling timeout: 2000

    Switch to another service: checked

    Preferred services vide type: None

    Container: Matroska

    Video codec profile: h264_vaapi (very important)

    Source video codec: EMPTY

    Audio codec profile: web-aac

    Source audio codec: EMPTY

    Subtitle codec profile: Copy

    Source subtitle codec: EMPTY

    Press Create button.

    Note: all 'very important' are required.

    Now you are ready to test: open one stream with tvh server and check the Tvheadend log:

    2022-12-09 10:53:37.821 transcode: 0001: 01:MPEG2VIDEO: ==> Using profile h264_vaapi 2022-12-09 10:53:37.822 transcode: 0001: 02:AC3: ==> Using profile webtv-aac

    To confirm you are using GPU for trancoding you need to send:

    sudo intel_gpu_top

    When you don't have any streams open you will see all numbers: 0; after you open streams you should see values non-zero in: Render/3D , Video and VideoEnhance.

    Debugging

    hashtag
    General

    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.

    https://cdimage.ubuntu.com/lubuntu/releases/22.04/release/lubuntu-22.04.5-desktop-amd64.isoarrow-up-right
    https://dgpu-docs.intel.com/devices/hardware-table.htmlarrow-up-right
    https://dgpu-docs.intel.com/driver/client/overview.html#installing-client-gpus-on-ubuntu-desktop-22-04-ltsarrow-up-right
    https://cdimage.ubuntu.com/lubuntu/releases/noble/release/lubuntu-24.04.2-desktop-amd64.isoarrow-up-right
    https://dgpu-docs.intel.com/devices/hardware-table.htmlarrow-up-right
    https://dgpu-docs.intel.com/driver/client/overview.html#installing-client-gpus-on-ubuntu-desktop-24-04-ltsarrow-up-right
    Logo
    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.

    hashtag
    Logging

    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).

    hashtag
    Trace Options

    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

    hashtag
    Crash reports

    hashtag
    Incorrect (not useable) crash reports

    In this case, the debug symbols are missing (look to the top of this page). Install the debug version of the tvheadend package.

    hashtag
    Correct crash reports

    hashtag
    Basic crash debug

    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.

    hashtag
    Enabling coredumps

    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!

    hashtag
    Processing core file.

    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.

    hashtag
    Dead or Live Lock

    If Tvheadend appears to die but the process is still running, then its quite possible that the process is deadlocked (or possibly live locked).

    hashtag
    Buildin deadlock mutex checker (since latest 4.3 version)

    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).

    hashtag
    GDB

    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).

    hashtag
    Reporting crash (or 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.

    hashtag
    Memory leaks or corruption

    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.

    hashtag
    Valgrind

    It is very slow, but it may be useable for things which are triggered every time:

    hashtag
    clang

    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:

    hashtag
    Mutex profiling

    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:

    ulimit -c unlimited
    -l FILE
    START
    STOP
    CRASH
    main
    tprof
    qprof
    CPU
    thread
    tvhpoll
    time
    spawn
    fsmonitor
    lock
    uuid
    idnode
    url
    tcp
    rtsp
    upnp
    settings
    config
    access
    cron
    dbus
    avahi
    bonjour
    api
    http
    httpc
    htsp
    htsp-sub
    htsp-req
    htsp-ans
    imagecache
    tbl
    tbl-base
    tbl-csa
    tbl-eit
    tbl-time
    tbl-atsc
    tbl-pass
    tbl-satip
    fastscan
    pcr
    parser
    TS
    globalheaders
    tsfix
    hevc
    muxer
    pass
    audioes
    mkv
    service
    channel
    subscription
    service-mapper
    bouquet
    esfilter
    profile
    descrambler
    descrambler-emm
    caclient
    csa
    capmt
    cwc
    cccam
    dvbcam
    dvr
    dvr-inotify
    epg
    epgdb
    epggrab
    charset
    dvb
    mpegts
    muxsched
    libav
    transcode
    iptv
    iptv-pcr
    iptv-sub
    linuxdvb
    diseqc
    en50221
    en50494
    satip
    satips
    tvhdhomerun
    psip
    opentv
    pyepg
    xmltv
    webui
    timeshift
    scanfile
    tsfile
    tsdebug
    codec
    vaapi
    ddci
    udp
    ratinglabels
    Jun  6 15:01:08 srv tvheadend[10808]: CRASH: Signal: 11 in PRG: /usr/bin/tvheadend (4.3-193~ga4ff519) [15a15a895adaf9c5760b80707f582c2d60cfab01] CWD: /
    Jun  6 15:01:08 srv tvheadend[10808]: CRASH: Fault address 0x90 (Address not mapped)
    Jun  6 15:01:08 srv tvheadend[10808]: CRASH: STACKTRACE
    Jun  6 15:01:08 srv tvheadend[10808]: CRASH: ??:0 0x555558549eba 0x555558350000
    Jun  6 15:01:08 srv tvheadend[10808]: CRASH: ??:0 0x7f3d97c0c0c0 0x7f3d97bfb000
    Jun  6 15:01:08 srv tvheadend[10808]: CRASH: ??:0 0x555558525620 0x555558350000
    Jun  6 15:01:08 srv tvheadend[10808]: CRASH: ??:0 0x5555585257a8 0x555558350000
    Jun  6 15:01:08 srv tvheadend[10808]: CRASH: ??:? 0x5555585db371 0x555558350000
    Jun  6 15:01:08 srv tvheadend[10808]: CRASH: ??:? 0x5555585dc1f2 0x555558350000
    Jun  6 15:01:08 srv tvheadend[10808]: CRASH: ??:? 0x5555585c3212 0x555558350000
    Jun  6 15:01:08 srv tvheadend[10808]: CRASH: ??:? 0x5555585bb71d 0x555558350000
    Jun  6 15:01:08 srv tvheadend[10808]: CRASH: ??:? 0x5555585bb8d1 0x555558350000
    Jun  6 15:01:08 srv tvheadend[10808]: CRASH: ??:0 0x5555585b4589 0x555558350000
    Jun  6 15:01:08 srv tvheadend[10808]: CRASH: ??:0 0x5555585b4796 0x555558350000
    Jun  6 15:01:09 srv tvheadend[10808]: CRASH: ??:0 0x555558511e44 0x555558350000
    Jun  6 15:01:09 srv tvheadend[10808]: CRASH: ??:0 0x7f3d97c02494 0x7f3d97bfb000
    Jun  6 15:01:09 srv kernel: [2320412.837462] tvh:mi-table[11208]: segfault at 90 ip 0000555558525620 sp 00007f3d85ff0b98 error 4 in tvheadend[555558350000+10d1000]
    2017-06-06 17:36:53.626 [  ALERT] CRASH: Signal: 6 in PRG: ./build.linux/tvheadend (4.3-195~gf476b37-dirty) [d761557cdfcd10940d79f8758376fadda7e49e8c] CWD: /home/tvheadend/git/tvheadend  
    2017-06-06 17:36:53.626 [  ALERT] CRASH: Fault address 0x311100002adf (N/A)
    2017-06-06 17:36:53.626 [  ALERT] CRASH: STACKTRACE
    2017-06-06 17:36:53.626 [  ALERT] CRASH: backtrace+0x41  (./build.linux/tvheadend)
    2017-06-06 17:36:53.643 [  ALERT] CRASH: /home/tvheadend/git/tvheadend/src/trap.c:148 0x5584f45ad4ef 0x5584f3d72000
    2017-06-06 17:36:53.666 [  ALERT] CRASH: ??:0 0x7f1afde155c0 0x7f1afde04000
    2017-06-06 17:36:53.666 [  ALERT] CRASH: gsignal+0x9f  (/lib64/libc.so.6)
    2017-06-06 17:36:53.666 [  ALERT] CRASH: abort+0x16a  (/lib64/libc.so.6)
    2017-06-06 17:36:53.690 [  ALERT] CRASH: /home/tvheadend/git/tvheadend/src/main.c:1267 0x5584f4462996 0x5584f3d72000
    2017-06-06 17:36:53.690 [  ALERT] CRASH: __libc_start_main+0xf1  (/lib64/libc.so.6)
    gdb --args /the standard tvh command line/
    
    (gdb) run
    gdb tvheadend pid
    
    (gdb) continue
    ps -C tvheadend
    (gdb) set logging on
    (gdb) set pagination off
    (gdb) bt full
    ulimit -c unlimited
    TVH_ARGS="-D" 
    echo core.%h.%e.%t | sudo tee /proc/sys/kernel/core_pattern
    echo 0 | sudo tee /proc/sys/kernel/core_uses_pid
    kernel.core_pattern = core.%h.%e.%t
    kernel.core_uses_pid = 0
    TVH_ARGS="-D -A" 
    gdb tvheadend core
    (gdb) set logging on
    (gdb) set pagination off
    (gdb) bt full
    #0  0x00007f5b10cc1425 in __GI_raise (sig=<optimised out>)
        at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
            resultvar = 0
            pid = <optimised out>
            selftid = 7517
    #1  0x00007f5b10cc4b10 in __GI_abort () at abort.c:120
            act = {__sigaction_handler = {sa_handler = 0, sa_sigaction = 0}, 
              sa_mask = {__val = {18446744073709551615 <repeats 16 times>}}, 
              sa_flags = 0, sa_restorer = 0}
            sigs = {__val = {32, 0 <repeats 15 times>}}
    #2  0x000000000040744e in main (argc=<optimised out>, argv=<optimised out>)
        at src/main.c:810
            i = <optimised out>
            set = {__val = {16386, 0 <repeats 15 times>}}
            adapter_mask = <optimised out>
            log_level = <optimised out>
            log_options = <optimised out>
            log_debug = <optimised out>
            log_trace = <optimised out>
            buf = "/tmp\000\000\000\000\360\350\364\023[\177\000\000\000\320\365\023[\177\000\000t\n\327\023[\177\000\000\370\271\311\020[\177\000\000\017\000\000\000\000\000\000\000:\000\000\000\000\000\000\000h\344\364\023[\177\000\000.N=\366\000\000\000\000\236\022\327\023[\177\000\000\300\304S\205\377\177\000\000.\000\000\000\000\000\000\000 \305S\205\377\177\000\000\377\377\377\377\000\000\000\000\264\352\310\020[\177\000\000\250\354\310\020[\177\000\000\360\304S\205\377\177\000\000\360\350\364\023[\177\000\000@\256\311\020[\177", '\000' <repeats 18 times>"\340, \346\364\023[\177\000\000\000\320\365\023[\177\000\000\231,@\000\000\000\000\000\370\271\311\020[\177\000\000\340\033@\000\000\000\000\000\000\000\000\000\001\000\000\000\021\b\000\000\001", '\000' <repeats 11 times>, " \266\370\023[\177\000\000`\305S\205\377\177\000\000.N=\366\000\000\000\000\340\346\364\023[\177\000\000\200\305S\205\377\177\000\000"...
            opt_help = 0
            opt_version = 0
            opt_fork = 1
            opt_firstrun = 0
            opt_stderr = 0
            opt_syslog = 0
            opt_uidebug = 0
    gdb tvheadend pid
    
    (gdb) continue
    ps -C tvheadend
    (gdb) set logging on
    (gdb) set pagination off
    (gdb) thread apply all bt full
    (gdb) generate-core-file
    valgrind --suppressions=support/valgrind.supp --leak-check=full --show-reachable=yes /tvh_command_line/
    llvm
    clang
    libasan
    liblsan
    ARGS="/your_configure_arguments/" 
    SANITIZER=leak # or address
    export CFLAGS="-fsanitize=$SANITIZER" 
    export LDFLAGS="-fsanitize=$SANITIZER" 
    ./configure $ARGS --disable-pie --enable-ccdebug python=python3 cc=clang ld=clang nowerror
    make -j4
    #!/bin/sh
    make distclean
    ARGS="--enable-libffmpeg_static --disable-hdhomerun_static" 
    SANITIZER=leak # or address
    export CFLAGS="-fsanitize=$SANITIZER" 
    export LDFLAGS="-fsanitize=$SANITIZER" 
    ./configure $ARGS --disable-pie --enable-ccdebug python=python3 cc=clang ld=clang nowerror
    make -j4
    ==16673==WARNING: Trying to symbolize code, but external symbolizer is not initialized!
        #0 0x7fcda9407680 (/home/tvh/src/tvheadend/build.linux/tvheadend+0x65b680)
        #1 0x7fcda943b115 (/home/tvh/src/tvheadend/build.linux/tvheadend+0x68f115)
    whereis llvm-symbolizer
    ASAN_OPTIONS=symbolize=1 ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer /home/ts/workspace/tvheadend/build.linux/tvheadend -l thv.log
    ==27911==ERROR: AddressSanitizer: heap-use-after-free on address 0x60700000d928 at pc 0x56409f916af4 bp 0x7ffc463d6670 sp 0x7ffc463d6668
    READ of size 8 at 0x60700000d928 thread T0
        #0 0x56409f916af3 in idnode_unlink /home/tvh/git/tvheadend/src/idnode.c:164:94
        #1 0x56409f9c9f8a in memoryinfo_unregister /home/tvh/git/tvheadend/src/memoryinfo.h:52:3
        #2 0x56409f9c9de2 in streaming_done /home/tvh/git/tvheadend/src/streaming.c:597:3
    ... console 1
    $ export TVHEADEND_RTLOG_UDP_PORT=7777
    $ ./build.linux/tvheadend --thrdebug 10020 <more-options>
    ... console 2
    $ nc -lu -p 7777
    thread: mutex 0x5562f9f859e0 at src/api/api_idnode.c:134 took 43ms
    thread: mutex 0x5562f9f859e0 at src/api/api_idnode.c:134 took 31ms

    Other Functions

    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.

    hashtag
    comet/poll

    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.

    See for a WebSocket interface to this function.

    hashtag
    dvrfile

    Downloads a previously-recorded file. Called with the UUID of the recording. Requires appropriate privilege (DVR or streaming).

    hashtag
    epgsave

    Flushes the contents of the EPG to disk.

    hashtag
    eventinfo

    Used by simple.html.

    hashtag
    favicon.ico

    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.

    hashtag
    HDHomeRun

    These functions are only available if HDHomeRun Server has been compiled into Tvheadend. The first two are documented in , the others are required by Plex.

    • discover.json

    • lineup.json

    • lineup_status.json

    • lineup.post

    hashtag
    imagecache

    Outputs an image from the image cache. Requires streaming, recording or web interface privilege.

    hashtag
    markdown

    Used to download help files.

    hashtag
    ping

    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.

    hashtag
    play

    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.

    hashtag
    playlist

    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.

    hashtag
    List all tags

    See below for sample output.

    hashtag
    List all channels or recordings

    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.

    hashtag
    List filtered channels or recordings

    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.

    hashtag
    Notes

    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

    hashtag
    Sample outputs

    hashtag
    pvrinfo

    Used by .

    hashtag
    redir

    Used internally for theme selection?

    hashtag
    satip_server

    Outputs one of two files describing the SAT>IP server and the services available from it. SAT>IP server must be compiled into Tvheadend.

    hashtag
    simple.html

    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.

    hashtag
    special/srvid2

    Outputs details of encrypted services. Each item contains:

    • Service ID

    • CA ID

    • CA provider ID

    • Service name

    hashtag
    state

    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.

    hashtag
    status.xml

    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.

    hashtag
    stream

    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.

    • 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.

    hashtag
    udpstream

    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.

    hashtag
    xmltv

    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.

    Server to Client methods

    hashtag
    channelAdd

    A new channel has been created on the server.

    Message fields:\

    Service fields:\

    device.xml

    Service type

  • Service provider name

  • emm. Unknown. Default is 0, set to 1 to activate.

  • User-Agent. Use unknown.

  • emm. Default is 0, set to 1 to activate.

  • User-Agent. Use unknown.

  • WebSocket
    https://info.hdhomerun.com/info/http_apiarrow-up-right
    simple.html
    hashtag
    channelUpdate

    Same as channelAdd, but all fields (except channelId) are optional.

    hashtag
    channelDelete

    A channel has been deleted on the server.

    Message fields:\


    hashtag
    tagAdd

    A new tag has been created on the server.

    Message fields:\

    hashtag
    tagUpdate

    Same as tagAdd, but all fields (except tagId) are optional.

    hashtag
    tagDelete

    A tag has been deleted from the server.

    Message fields:\


    hashtag
    dvrEntryAdd

    (Added in version 4)

    A new recording has been created on the server.

    Message fields:\

    Valid values for state:\

    Valid values for subscriptionError:\

    hashtag
    dvrEntryUpdate

    Message fields:\

    hashtag
    dvrEntryDelete

    (Added in version 4)

    A recording has been deleted from the server.

    Message fields:\


    hashtag
    autorecEntryAdd

    (Added in version 13)

    A new autorec recording has been created on the server.

    Message fields:\

    hashtag
    autorecEntryUpdate

    (Added in version 13)

    Message fields:\

    hashtag
    autorecEntryDelete (Added in version 13)

    Message fields:\


    hashtag
    timerecEntryAdd

    (Added in version 18)

    A new autorec recording has been created on the server.

    Message fields:\

    hashtag
    timerecEntryUpdate

    (Added in version 18)

    Message fields:\

    hashtag
    timerecEntryDelete

    (Added in version 18)

    Message fields:\


    hashtag
    eventAdd

    (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.

    hashtag
    eventUpdate

    (Added in version 6)

    Message fields:\

    hashtag
    eventDelete

    (Added in version 6)

    Message fields:\


    hashtag
    initialSyncCompleted

    (Added in version 2)

    Sent after all the initial metadata has been sent when session has been set to async mode.

    Message fields:\


    hashtag
    subscriptionStart

    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:\

    hashtag
    subscriptionGrace

    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:\

    hashtag
    subscriptionStop

    A subscription has been stopped.

    Message fields:\

    Valid values for subscriptionError:\

    hashtag
    subscriptionSkip

    (Added in version 9)

    A subscription has been skipped.

    Message fields:\

    hashtag
    subscriptionSpeed

    (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:\

    hashtag
    subscriptionStatus

    Subscription status update.

    Message fields:\

    Valid values for subscriptionError:\

    hashtag
    queueStatus

    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 favour dropping B-frames before P-frames before I-frames. All audio is recognized as I-frames.

    Message fields:\

    hashtag
    signalStatus

    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:\

    hashtag
    timeshiftStatus

    Provide status every second about the timeshift buffer.

    Message fields:\

    hashtag
    muxpkt

    Streaming data.

    Message fields:\

    curl  "http://192.168.0.1:9981/comet/poll" | jq
    
    {
      "boxid": "1cee949b52c05872fdb24c8bc2dccc0a41fdb33b",
      "messages": [
        {
          "notificationClass": "accessUpdate",
          "uilevel": "expert",
          "theme": "blue",
          "quicktips": 1,
          "chname_num": 0,
          "chname_src": 0,
          "date_mask": "",
          "label_formatting": 0,
          "username": "",
          "address": "192.168.0.1",
          "dvr": 1,
          "admin": 1,
          "time": 1709799071,
          "cookie_expires": 2047,
          "ticket_expires": 300,
          "info_area": "login,storage,time",
          "freediskspace": 608234205184,
          "useddiskspace": 135222628776,
          "totaldiskspace": 861450428416
        },
        {
          "notificationClass": "setServerIpPort",
          "ip": "192.168.0.1",
          "port": 9981
        }
      ]
    }
    http://192.168.0.1:9981/dvrfile/968ecf2073e4ec2e45c0ad534acdd4bf
    $ curl  http://192.168.0.1:9981/imagecache/<image-number>
    curl http://192.168.0.1:9981/ping
    PONG
    http://192.168.0.1:9981/play/stream/channelnumber/<channelnumber>
    http://192.168.0.1:9981/play/stream/mux/cc23a085f4ff2cb41a8f58ad85570fde
    http://192.168.0.1:9981/play/dvrfile/968ecf2073e4ec2e45c0ad534acdd4bf
    http://192.168.0.1:9981/play/ticket/stream/channelnumber/<channelnumber>
    $ curl http://192.168.0.1:9981/playlist/tags
    $ curl http://192.168.0.1:9981/playlist/y/x/channels
    $ curl http://192.168.0.1:9981/playlist/y/recordings
    $ curl http://192.168.0.1:9981/playlist/y/x/channelid/<channelid>
    $ curl http://192.168.0.1:9981/playlist/y/x/channelnumber/<channelnumber>
    $ curl http://192.168.0.1:9981/playlist/y/x/channelname/<channelname>
    $ curl http://192.168.0.1:9981/playlist/y/x/channel/<channelUUID>
    $ curl http://192.168.0.1:9981/playlist/y/x/tagid/<tagid>
    $ curl http://192.168.0.1:9981/playlist/y/x/tagname/<tagname>
    $ curl http://192.168.0.1:9981/playlist/y/x/tag/<tagUUID>
    
    $ curl http://192.168.0.1:9981/playlist/y/dvrid/<dvr_id>
    $ curl  http://192.168.0.1:9981/playlist/tags
    #EXTM3U
    #EXTINF:-1 logo="",HDTV
    http://192.168.0.1:9981/playlist/tagid/1267929608?profile=pass
    #EXTINF:-1 logo="",Radio channels
    http://192.168.0.1:9981/playlist/tagid/1970563711?profile=pass
    ...
    
    $ curl  http://192.168.0.1:9981/playlist/channels
    #EXTINF:-1 tvg-id="90a325df8d683eb014cf0abf56943e8d" tvg-chno="1005",CNN
    http://192.168.0.1:9981/stream/channelid/1596302224?profile=pass
    #EXTINF:-1 tvg-id="c44d3390a7b5ecb59a074fff73a6b532" tvg-chno="2000",BBC R4 FM
    http://192.168.0.1:9981/stream/channelid/271797700?profile=pass
    ...
    
    $ curl  http://user:[email protected]:9981/playlist/ticket/channels
    #EXTINF:-1 tvg-id="4d422960b4d45e8e007eaa8b3bf58190" tvg-chno="69",QUEST+1
    http://192.168.0.1:9981/stream/channelid/1613316685?ticket=5609a7022c1a7b5f8ac8b22aff2638a3efd78cdc&profile=pass
    #EXTINF:-1 tvg-id="85f9c040b03cd5496a2d950b2380d793" tvg-chno="70",Quest Red+1
    http://192.168.0.1:9981/stream/channelid/1086388613?ticket=d89df723230fa791e11b1e17cc1962e55fe73230&profile=pass
    ...
    
    $ curl  http://192.168.0.1:9981/playlist/e2/channelname/QUEST
    #NAME QUEST
    #SERVICE 1:0:0:0:0:0:0:0:0:0:http://192.168.1.1:9981/stream/channelid/344789476&profile=pass:QUEST
    #DESCRIPTION QUEST
    
    $ curl  http://192.168.0.1:9981/playlist/satip/channelname/QUEST
    #EXTINF:-1,QUEST
    http://192.168.1.1:9981/stream/channelid/344789476?profile=pass
    
    $ curl  http://192.168.1.0:9981/playlist/recordings
    #EXTM3U
    #EXTINF:1800,The Repair Shop
    #EXT-X-TARGETDURATION:1800
    #EXT-X-STREAM-INF:PROGRAM-ID=da01a7de69dfd8d09241c045d6fbaeb6,BANDWIDTH=5115
    #EXT-X-PROGRAM-DATE-TIME:2018-03-23T18:30:00+0000
    http://192.168.0.1:9981/dvrfile/da01a7de69dfd8d09241c045d6fbaeb6
    #EXTINF:1800,The Hitchhiker's Guide to the...
    #EXT-X-TARGETDURATION:1800
    #EXT-X-STREAM-INF:PROGRAM-ID=74cb4b64f55afca54725d8ab0a3d3e00,BANDWIDTH=0
    #EXT-X-PROGRAM-DATE-TIME:2018-04-05T18:30:00+0100
    http://192.168.0.1:9981/dvrfile/74cb4b64f55afca54725d8ab0a3d3e00
    $ curl  http://192.168.0.1:9981/satip_server/desc.xml
    $ curl  http://192.168.0.1:9981/satip_server/satip.m3u
    2968:0B00|TRP 1|TV||ASTRA
    177B:0963,0961,0960|Crime+Inv+1|TV||ASTRA
    0E1F:0963,0961,0960|Virgin Two|TV||ASTRA
    13FB:0963,0961,0960|VICE|TV||ASTRA
    2584:0963,0961,0960|Virgin One+1|TV||ASTRA
    1789:0963,0961,0960|Real Lives+1|TV||ASTRA
    15AE:0963,0961,0960|History+1|TV||ASTRA
    15AF:0963,0961,0960|History2|TV||ASTRA
    15AD:0963,0961,0960|History|TV||ASTRA
    15B3:0963,0961,0960|Nat Geo Wild|TV||ASTRA
    15B1:0963,0961,0960|Nat Geo+1|TV||ASTRA
    15B0:0963,0961,0960|Nat Geo|TV||ASTRA
    $ curl  'http://user:[email protected]:9981/state'
    
    Tvheadend 4.3-1215~g5782d8c14-dirty  Binary SHA1: 0000000000000000000000000000000000000000
    
    Channels
    ----------------------------------------------
    tru TV (13183175)
      refcount = 0
      number = 156
      icon = <none set>
    
    ITV3 (54665543)
      refcount = 0
      number = 114
      icon = <none set>
    ...
    <?xml version="1.0"?>
     <currentload>
      <systemload>0.000000,0.000000,0.000000</systemload>
      <recordings>
       <recording>
        <next>465</next>
       </recording>
      </recordings>
      <subscriptions>0</subscriptions>
     </currentload>
    <?xml version="1.0"?>
    <currentload>
     <systemload>0.390000,0.090000,0.030000</systemload>
     <recordings>
      <recording>
       <start>
        <date>2020/05/24</date>
        <time>09:00</time>
        <unixtime>1590307200</unixtime>
        <extra_start>60</extra_start>
       </start>
       <stop>
        <date>2020/05/24</date>
        <time>13:00</time>
        <unixtime>1590321600</unixtime>
        <extra_stop>300</extra_stop>
       </stop>
       <title>Soft Rock Classics! 1980-1989</title>
       <status>Recording</status>
      </recording>
     </recordings>
     <subscriptions>1</subscriptions>
    </currentload>
     http://192.168.0.1:9981/stream/channelid/<chid>
     http://192.168.0.1:9981/stream/channel/<uuid>
     http://192.168.0.1:9981/stream/channelnumber/<channelnumber>
     http://192.168.0.1:9981/stream/channelname/<channelname>
     http://192.168.0.1:9981/stream/service/<uuid>
     http://192.168.0.1:9981/stream/mux/<muxid>
     http://192.168.0.1:9981/udpstream/<start|stop>/channelid/<chid>
     http://192.168.0.1:9981/udpstream/<start|stop>/channel/<uuid>
     http://192.168.0.1:9981/udpstream/<start|stop>/channelnumber/<channelnumber>
     http://192.168.0.1:9981/udpstream/<start|stop>/channelname/<channelname>
     http://192.168.0.1:9981/udpstream/<start|stop>/service/<uuid>
    $ curl http://192.168.0.1:9981/xmltv/channelid/<channelid>
    $ curl http://192.168.0.1:9981/xmltv/channelnumber/<channelnumber>
    $ curl http://192.168.0.1:9981/xmltv/channelname/<channelname>
    $ curl http://192.168.0.1:9981/xmltv/channel/<channelUUID>
    $ curl http://192.168.0.1:9981/xmltv/tagid/<tagid>
    $ curl http://192.168.0.1:9981/xmltv/tagname/<tagname>
    $ curl http://192.168.0.1:9981/xmltv/tag/<tagUUID>
    $ curl  http://192.168.0.1:9981/xmltv/channels
    
    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE tv SYSTEM "xmltv.dtd">
    <tv generator-info-name="TVHeadend-4.3-1670~ge37c696de-dirty" source-info-name="tvh-Tvheadend">
    <channel id="7e7b77801531c803f5ce8f4d5003f44c">
      <display-name>Channel 5+1</display-name>
    </channel>
    ...
    <programme start="20181231151500 +0000" stop="20181231161500 +0000" channel="7e7b77801531c803f5ce8f4d5003f44c">
      <title lang="eng">Dirty Dancing</title>
      <desc lang="eng">Classic starring Patrick Swayze and Jennifer Grey. A spoiled 17-year-old learns a lot about life from the hotel dance instructor during a family summer holiday. (1987)[S]</desc>
      <category lang="en">Movie / Drama</category>
    </programme>
    ...
    </tv>
    channelId          u32   required   ID of channel.
    channelIdStr       str   required   Full UUID of channel (Added in version 41).
    channelNumber      u32   required   Channel number, 0 means unconfigured.
    channelNumberMinor u32   optional   Minor channel number (Added in version 13).
    channelName        str   required   Name of channel.
    channelIcon        str   optional   URL to an icon representative for the channel
                                        (For v8+ clients this could be a relative /imagecache/ID URL
                                         intended to be fed to fileOpen() or HTTP server)
                                        (For v15+ clients this could be a relative imagecache/ID URL
                                         intended to be fed to fileOpen() or HTTP server)
    eventId            u32   optional   ID of the current event on this channel.
    nextEventId        u32   optional   ID of the next event on the channel.
    tags               u32[] optional   Tags this channel is mapped to.
    services           msg[] optional   List of available services (Added in version 5)
    name               str   required   Service name
    type               str   required   Service type
    caid               u32   optional   Encryption CA ID
    caname             str   optional   Encryption CA name
    providername       str   optional   Service provider (Added in version 38)
    channelId          u32   required   ID of channel.
    tagId              u32   required   ID of tag.
    tagIdStr           str   required   Full UUID of tag (Added in version 41).
    tagName            str   required   Name of tag.
    tagIndex           u32   optional   Index value for sorting (default by from min to max) (Added in version 18).
    tagIcon            str   optional   URL to an icon representative for the channel.
    tagTitledIcon      u32   optional   Icon includes a title
    members            u32[] optional   Channel IDs of those that belong to the tag
    tagId              u32   required   ID of tag.
    id                 u32   required   ID of dvrEntry.
    idStr              str   required   Full UUID of dvrEntry (Added in version 41).
    channel            u32   optional   Channel of dvrEntry.
    start              s64   required   Time of when this entry was scheduled to start recording.
    stop               s64   required   Time of when this entry was scheduled to stop recording.
    startExtra         s64   required   Extra start time (pre-time) in minutes (Added in version 13).
    stopExtra          s64   required   Extra stop time (post-time) in minutes (Added in version 13).
    retention          s64   required   DVR Entry retention time in days (Added in version 13).
    priority           u32   required   Priority (0 = Important, 1 = High, 2 = Normal, 3 = Low, 4 = Unimportant, 5 = Not set) (Added in version 13).
    eventId            u32   optional   Associated EPG Event ID (Added in version 13).
    autorecId          str   optional   Associated Autorec UUID (Added in version 13).
    timerecId          str   optional   Associated Timerec UUID (Added in version 18).
    contentType        u32   optional   Content Type (like in the DVB standard) (Added in version 13).
    title              str   optional   Title of recording
    subtitle           str   optional   Subtitle of recording (Added in version 20).
    summary            str   optional   Short description of the recording (Added in version 6).
    description        str   optional   Long description of the recording.
    state              str   required   Recording state
    error              str   optional   Plain english error description (e.g. "Aborted by user").
    owner              str   optional   Name of the entry owner (Added in version 18).
    creator            str   optional   Name of the entry creator (Added in version 18).
    subscriptionError  str   optional   Subscription error string (Added in version 20).
    streamErrors       str   optional   Number of recording errors (Added in version 20).
    dataErrors         str   optional   Number of stream data errors (Added in version 20).
    path               str   optional   Recording path for playback.
    files              msg   optional   All recorded files for playback (Added in version 21).
     filename          str   optional   File name.
     fsid              ???   unknown    TBA. (Maybe the inode.)
     size              s64   unknown    TBA. (Probably file size in bytes.)
     info              msg   unknown    Information about the streams in this file.
      type             str   unknown    Stream type name.
      width            u32   unknown    Video stream width.
      height           u32   unknown    Video stream height.
      duration         u32   unknown    Duration (Units TBA).
      aspect_num       u32   unknown    Aspect ration numerator.
      aspect_den       u32   unknown    Aspect ration denominatorTBA.
      language         str   unknown    3 byte language code.
      audio_type       u32   optional   Only present for audio streams.
      audio_version    u32   unknown    TBA.
      composition_id   u32   unknown    TBA.
      ancillary_id     u32   unknown    TBA.
     start             s64   unknown    TBA.
     stop              s64   unknown    TBA.
    dataSize           s64   optional   Actual file size of the last recordings (Added in version 21).
    enabled            u32   optional   Enabled flag (Added in version 23).
    ageRating          u32   optional   Minimum age rating (Added in version 36).
    ratingLabel        str   optional   Parental rating label text (Added in version 37).
    ratingIcon         str   optional   Parental rating label icon (Added in version 37).
    ratingCountry      str   optional   Parental rating label country (Added in version 41).
    ratingAuthority    str   optional   Parental rating label authority (Added in version 41).
    configId           str   optional   DVR Configuration UUID (Added in version 40).
    comment            str   optional   User Comment (Added in version 42).
    channelName        str   optional   Name of the channel.
    removal            u32   optional   TBA. (Something to do with retention.)
    playcount          u32   optional   TBA. (Probably the number of times the recording has been played.)
    playposition       u32   optional   TBA. (Probably the last played position.
    image              str   optional   Path to artwork.
    fanartImage        str   optional   TBA. (Probably path to fan art.)
    copyrightYear      u32   optional   TBA. (Probably the year produced.)
    duplicate          u32   optional   TBA.
    seasonNumber       u32   optional   Season number.
    seasonCount        u32   optional   Season count.
    episodeNumber      u32   optional   Episode number.
    episodeCount       u32   optional   Episode count.
    partNumber         u32   optional   Part number.
    partCount          u32   optional   Part count.
    episodeOnscreen    str   optional   Textual representation of the season/episode number suitable for display.
    TODO
    noFreeAdapter            No free adapter for this service.
    scrambled                Service is scrambled.
    badSignal                Bad signal status.
    tuningFailed             Tuning of this service failed.
    subscriptionOverridden   Subscription overridden by another one.
    muxNotEnabled            No mux enabled for this service.
    invalidTarget            Recording/livestream cannot be saved to filesystem or recording/streaming configuration is incorrect.
    userAccess               User does not have access rights for this service.
    userLimit                Maximum number of streaming connections set in user's profile reached.
    Same as dvrEntryAdd, but all fields (except id) are optional.
    id                 u32   required   ID of recording to delete.
    id                 str   required   ID (string!) of dvrAutorecEntry.
    enabled            u32   required   If autorec entry is enabled (activated).
    name               str   required   Name of the autorec entry (Added in version 18).
    minDuration        u32   required   Minimal duration in seconds (0 = Any).
    maxDuration        u32   required   Maximal duration in seconds (0 = Any).
    retention          u32   required   Retention time (in days).
    daysOfWeek         u32   required   Bitmask - Days of week (0x01 = Monday, 0x40 = Sunday, 0x7f = Whole Week, 0 = Not set).
    priority           u32   required   Priority (0 = Important, 1 = High, 2 = Normal, 3 = Low, 4 = Unimportant, 5 = Not set).
    approxTime         u32   required   Minutes from midnight (up to 24*60).
    start              s32   required   Exact start time (minutes from midnight) (Added in version 18).
    startWindow        s32   required   Exact stop time (minutes from midnight) (Added in version 18).
    startExtra         s64   required   Extra start minutes (pre-time).
    stopExtra          s64   required   Extra stop minutes (post-time).
    title              str   optional   Title.
    fulltext           u32   optional   Fulltext flag (Added in version 20).
    directory          str   optional   Forced directory name (Added in version 19).
    channel            u32   optional   Channel ID.
    owner              str   optional   Owner of this autorec entry (Added in version 18).
    creator            str   optional   Creator of this autorec entry (Added in version 18).
    dupDetect          u32   optional   Duplicate detection (see addAutorecEntry) (Added in version 20).
    broadcastType      u32   optional   Broadcast type (0 = any, 1 = new/premiere/unknown, 2 = repeated, 3 = new/premiere) (Added in version 39).
    configId           str   optional   DVR Configuration UUID (Added in version 40).
    comment            str   optional   User Comment (Added in version 42).
    Same as autorecEntryAdd but all fields (except id) are optional.
    id                 str   required   Autorec Entry ID (string!)
    title              str   required   Title for the recordings.
    directory          str   optional   Forced directory name (Added in version 19).
    enabled            u32   required   Title for the recordings.
    name               str   required   Name for this timerec entry.
    channel            u32   required   Channel ID.
    daysOfWeek         u32   optional   Bitmask - Days of week (0x01 = Monday, 0x40 = Sunday, 0x7f = Whole Week, 0 = Not set).
    priority           u32   optional   Priority (0 = Important, 1 = High, 2 = Normal, 3 = Low, 4 = Unimportant, 5 = Not set).
    start              u32   required   Minutes from midnight (up to 24*60) for the start of the time window (including)
    stop               u32   required   Minutes from modnight (up to 24*60) for the end of the time window (including, cross-noon allowed)
    retention          u32   optional   Retention in days.
    owner              str   optional   Owner of this timerec entry.
    creator            str   optional   Creator of this timerec entry.
    configId           str   optional   DVR Configuration UUID (Added in version 40).
    comment            str   optional   User Comment (Added in version 42).
    Same as timerecEntryAdd but all fields (except id) are optional.
    id                 str   required   Timerec Entry ID (string!)
    eventId            u32   required   Event ID
    channelId          u32   required   The channel this event is related to.
    start              u64   required   Start time of event, UNIX time.
    stop               u64   required   Ending time of event, UNIX time.
    title              str   optional   Title of event.
    summary            str   optional   Short description of the event (Added in version 6).
    description        str   optional   Long description of the event.
    serieslinkId       u32   optional   Series Link ID (Added in version 6).
    episodeId          u32   optional   Episode ID (Added in version 6).
    seasonId           u32   optional   Season ID (Added in version 6).
    brandId            u32   optional   Brand ID (Added in version 6).
    contentType        u32   optional   DVB content code (Added in version 4, Modified in version 6*).
    ageRating          u32   optional   Minimum age rating (Added in version 6).
    starRating         u32   optional   Star rating (1-5) (Added in version 6).
    firstAired         s64   optional   Original broadcast time, UNIX time (Added in version 6).
    seasonNumber       u32   optional   Season number (Added in version 6).
    seasonCount        u32   optional   Show season count (Added in version 6).
    episodeNumber      u32   optional   Episode number (Added in version 6).
    episodeCount       u32   optional   Season episode count (Added in version 6).
    partNumber         u32   optional   Multi-part episode part number (Added in version 6).
    partCount          u32   optional   Multi-part episode part count (Added in version 6).
    episodeOnscreen    str   optional   Textual representation of episode number (Added in version 6).
    image              str   optional   URL to a still capture from the episode (Added in version 6).
    dvrId              u32   optional   ID of a recording (Added in version 5).
    nextEventId        u32   optional   ID of next event on the same channel.
    ratingLabel        str   optional   Parental rating label text (Added in version 37).
    ratingIcon         str   optional   Parental rating label icon (Added in version 37).
    ratingCountry      str   optional   Parental rating label country (Added in version 41).
    ratingAuthority    str   optional   Parental rating label authority (Added in version 41).
    isNew              str   optional   Flag to indicate whether the programme is new to air (Added in version 43).
    Same as eventAdd but all fields (except eventId) are optional.
    eventId            u32   required   Event ID
    subscriptionId     u32   required   Subscription ID.
    streams            msg[] required   Array of messages with stream information
    sourceinfo         msg   optional   Source information.
    index              u32   required   Index for this stream
    type               str   required   Type of stream
    meta               bin   optional   Codec metadata (private data, libav - extradata) (Added in version 17)
    language           str   optional   Language for stream
    Video components only:
    width              u32   optional   Width of video in pixels
    height             u32   optional   Height of video in pixels
    aspect_num         u32   optional   Aspect ratio numerator (Added in version 5) *Can be incorrect and should not be relied upon*
    aspect_den         u32   optional   Aspect ratio denominator (Added in version 5) *Can be incorrect and should not be relied upon*
    Audio components only:
    audio_type         u32   optional   Audio type - 0=Normal; 1=Clean effects; 2=Hearing impaired; 3=Visually impaired commentary; 4-255=Reserved (Added in version 11)
    channels           u32   optional   Number of audio channels (Added in version 5)
    rate               u32   optional   Audio bitrate (Added in version 5)
    Subtitle components only:
    composition_id     u32   optional   ??? (Added in version 5)
    ancillary_id       u32   optional   ??? (Added in version 5)
    adapter            str   optional   Adapter name
    mux                str   optional   Transponder name
    network            str   optional   Network name
    provider           str   optional   Provide name (like 'Sky UK')
    service            str   optional   Service name
    satpos             str   optional   Satellite position name (Added in version 20).
    MPEG2VIDEO                    MPEG2 video, meta field is present (configuration blocks)
    H264                          H264 video, meta field is present (configuration blocks)
    HEVC                          HEVC video, meta field is present (configuration blocks)
    MPEG2AUDIO                    MPEG2 audio (MP2)
    AC3                           AC3 audio
    AAC                           ADTS framed AAC (one AAC packet per ADTS frame), meta field is present (MPEG4 config)
    EAC3                          Enhanced AC3 audio
    VORBIS                        Vorbis audio, meta field is present with the main vorbis header
    TELETEXT                      ???
    DVBSUB                        ???
    subscriptionId     u32   required   Subscription ID.
    graceTimeout       u32   required   Grace timeout in seconds.
    subscriptionId     u32   required   Subscription ID.
    status             str   optional   Error message if subscription stopped unexpectedly.
    subscriptionError  str   optional   Subscription error code (Added in version 20).
    see dvrEntryAdd
    subscriptionId     u32   required   Subscription ID.
    error              u32   optional   The last skip command caused an error.
    absolute           u32   optional   Indicates the output is absolute (Note: should always be 1 at the moment)
    time               u64   optional   The time the subscription has skipped to.
    size               u64   optional   The position in the file we've skipped to (Note: not currently used).
    subscriptionId     u32   required   Subscription ID.
    speed              u32   required   The new speed of the subscription
    subscriptionId     u32   required   Subscription ID.
    status             str   optional   English clear text of error status. Absence of this field means that the status is OK. 
    subscriptionError  str   optional   Subscription error code (Added in version 20).
    see dvrEntryAdd
    subscriptionId     u32   required   Subscription ID.
    packets            u32   required   Number of data packets in queue.
    bytes              u32   required   Number of bytes in queue.
    delay              u32   optional   Estimated delay of queue (in µs).
    Bdrops             u32   required   Number of B-frames dropped
    Pdrops             u32   required   Number of P-frames dropped
    Idrops             u32   required   Number of I-frames dropped
    delay              s64   required   Delta between first and last DTS (Added in version 9)
    subscriptionId     u32   required   Subscription ID.
    feStatus           str   required   Frontend status.
    feSNR              u32   optional   Signal to noise ratio.
    feSignal           u32   optional   Signal status percentage.
    feBER              u32   optional   Bit error rate.
    feUNC              u32   optional   Uncorrected blocks.
    subscriptionId     u32   required   Subscription ID.
    full               u32   required   Indicates whether the buffer is full
    shift              s64   required   Current position relative to live
    start              s64   optional   PTS of the first frame in the buffer
    end                s64   optional   PTS of the last frame in the buffer
    subscriptionId     u32   required   Subscription ID.
    frametype          u32   required   Type of frame as ASCII value: 'I', 'P', 'B'
    stream             u32   required   Stream index. Corresponds to the streams reported in the subscriptionStart message.
    dts                s64   optional   Decode Time Stamp in µs.
    pts                s64   optional   Presentation Time Stamp in µs.
    duration           u32   required   Duration of frame in µs.
    payload            bin   required   Actual frame data.

    Client to Server (RPC) methods

    hashtag
    hello

    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[]:

    hashtag
    authenticate

    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:


    hashtag
    api

    (Added in version 24)

    This is a proxy to HTTP API.

    Request message fields:

    Reply message fields:

    Also see: and .


    hashtag
    getDiskSpace

    (Added in version 3)

    Return diskspace status from Tvheadend's PVR storage

    Request message fields:

    Reply message fields:

    Also see: .

    hashtag
    getSysTime

    (Added in version 3)

    Return system time on the server.

    Request message fields:

    Reply message fields:


    hashtag
    enableAsyncMetadata

    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:


    hashtag
    getChannel

    (Added in version 14)

    Request information about the given channel.

    Request message fields:

    Reply message fields:

    Also see:


    hashtag
    getEvent

    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:

    Also see:

    hashtag
    getEvents

    (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:

    hashtag
    epgQuery

    (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

    hashtag
    getEpgObject

    Get detailed EPG Object info.

    Request message fields:

    Reply message fields:


    hashtag
    getDvrConfigs

    (Added in version 16)

    Return a list of DVR configurations.

    Reply message fields:

    Message fields:

    Also see:

    hashtag
    addDvrEntry

    (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:

    hashtag
    updateDvrEntry

    (Added in version 5)

    Update an existing DVR entry.

    Request message fields:

    Reply message fields:

    hashtag
    cancelDvrEntry

    (Added in version 5)

    Cancel an existing recording, but don't remove the entry from the database.

    Request message fields:

    Reply message fields:

    hashtag
    deleteDvrEntry

    (Added in version 4)

    Delete an existing DVR entry from the database.

    Request message fields:

    Reply message fields:

    hashtag
    getDvrCutpoints

    (Added in version 12)

    Get DVR cutpoints.

    Request message fields:

    Reply message fields:

    Cutpoint fields:


    hashtag
    addAutorecEntry

    (Added in version 13)

    Create a new Autorec DVR entry. Title must be specified.

    Request message fields:

    Reply message fields:

    hashtag
    updateAutorecEntry

    (Added in version 25)

    Update an existing Autorec DVR entry.

    Request message fields:

    Reply message fields:

    hashtag
    deleteAutorecEntry

    (Added in version 13)

    Delete an existing autorec DVR entry from the database.

    Request message fields:

    Reply message fields:


    hashtag
    addTimerecEntry

    (Added in version 18)

    Create a new Timerec DVR entry. Title must be specified.

    Request message fields:

    Reply message fields:

    hashtag
    updateTimerecEntry

    (Added in version 25)

    Update an existing Timerec DVR entry.

    Request message fields:

    Reply message fields:

    hashtag
    deleteTimerecEntry

    (Added in version 18)

    Delete an existing timerec DVR entry from the database.

    Request message fields:

    Reply message fields:


    hashtag
    getTicket

    (Added in version 5)

    Get a ticket to allow access to a channel or recording via HTTP

    Request message fields:

    Reply message fields:

    hashtag
    subscribe

    Request subscription to the given channel.

    Request message fields:

    Reply message fields:

    hashtag
    unsubscribe

    Stop a subscription.

    Request message fields:

    Reply message fields:

    hashtag
    subscriptionChangeWeight

    (Added in version 5)

    Change the weight of an existing subscription

    Request message fields:

    Reply message fields:

    hashtag
    subscriptionSkip

    (Added in version 9)

    Skip a timeshift enabled subscription. The response will be asynchronous subscriptionSkip().

    Request message fields:

    Reply message fields:

    hashtag
    subscriptionSeek

    (Added in version 9)

    Synonym for subscriptionSkip

    hashtag
    subscriptionSpeed

    (Added in version 9)

    Set the playback speed for the subscription. The response will be asynchronous subscriptionSpeed().

    Request message fields:

    Reply message fields:

    hashtag
    subscriptionLive

    (Added in version 9)

    Return a timeshifted session to live. Reply will be asynchronous subscriptionSkip().

    Request message fields:

    Reply message fields:

    hashtag
    subscriptionFilterStream

    (Added in version 12)

    Enable or disable specified streams by index.

    Request message fields:

    Reply message fields:


    hashtag
    getProfiles

    (Added in version 16)

    Return a list of stream profiles (configurations).

    Reply message fields:

    Message fields:

    hashtag
    getCodecs

    (Added in version 11, Removed in version 16)

    Return a list of encoders (codecs).

    Reply message fields:

    hashtag
    fileOpen

    (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:

    hashtag
    fileRead

    (Added in version 8)

    Read data from a file.

    Request message fields:

    Reply message fields:

    hashtag
    fileClose

    (Added in version 8)

    Close an opened file.

    Request message fields:

    Reply message fields:

    hashtag
    fileStat

    (Added in version 8)

    Get status of a file.

    Request message fields:

    Reply message fields:

    hashtag
    fileSeek

    (Added in version 8)

    Seek to position in a file.

    Request message fields:

    Note: valid values for whence

    Reply message fields:

    htspversion        u32   required   Client preferred HTSP version.
    clientname         str   required   Client software name.
    clientversion      str   required   Client software version.
    JSON API
    Proxy Examples
    JSON API 'comet/poll'
    JSON API Channel
    JSON API EPG
    JSON API DVR
    htspversion        u32   required   The server supports all versions of the protocol up to and including this number.
    servername         str   required   Server software name.
    serverversion      str   required   Server software version.
    servercapability   str[] required   Server capabilities (Added in version 6)
    challenge          bin   required   32 bytes randomized data used to generate authentication digests
    webroot            str   optional   Server HTTP webroot (Added in version 8)
                                        Note: any access to TVH webserver should include this at start of URL path
    cwc                Descrambling available
    v4l                Analogue TV available
    linuxdvb           Linux DVB API available
    imagecache         Image caching available
    timeshift          Timeshifting available (Added in version 9).
    None   
    noaccess           u32   optional   If set to 1, no privileges were granted.
    args               msg[] optional   HTTP arguments
    path               str   required   HTTP path
    response           msg[] required   Structured response (like in JSON HTTP replies)
    None
    freediskspace      s64   required   Bytes available.
    totaldiskspace     s64   required   Total capacity.
    None
    time               s64  required   UNIX time.
    timezone           s32  required   Hours west of GMT. (deprecated, does not work reliable, use gmtoffset instead)
    gmtoffset          s32  optional   Minutes east of GMT.
    epg                u32   optional   Set to 1, to include EPG data in async, implied by epgMaxTime (Added in version 6).
    lastUpdate         s64   optional   Only provide metadata that has changed since this time (Added in version 6).
    epgMaxTime         s64   optional   Maximum time to return EPG data up to (Added in version 6)
    language           str   optional   RFC 2616 compatible language list (Added in version 6)
    None
    tagAdd                   optional
    channelAdd               optional
    tagUpdate                optional
    dvrEntryAdd              optional
    eventAdd                 optional   (Added in version 6)
    initialSyncComplete      required
    channelId          u32   required   Channel ID.
    see channelAdd
    eventId            u32   required   Event ID.
    language           str   optional   RFC 2616 compatible language list (Added in version 6)
    see eventAdd
    eventId            u32   optional   Event ID to begin from (Optional since version 6)
    channelId          u32   optional   Channel ID to get data for (Added in version 6)
    numFollowing       u32   optional   Number of events to add (Optional since version 6)
    maxTime            u64   optional   Maximum time to return data up to (Added in version 6)
    language           str   optional   RFC 2616 compatible language list (Added in version 6)
    events             msg[] required   List of events, using response message fields from eventAdd
    query              str   required  Title regular expression to search for
    channelId          u32   optional  [[ChannelId]] to restrict search to
    tagId              u32   optional  [[TagId]] to restrict search to
    contentType        u32   optional  DVB content type to restrict search to
    minduration        u32   optional  Minimal duration in seconds (Added in version 13)
    maxduration        u32   optional  Maximal duration in seconds (Added in version 13)
    language           str   optional  RFC 2616 compatible language list for title (Added in version 6)
    full               u32   optional  Output full event list rather than just IDs
    events             msg[] optional   List of events, using response message fields from eventAdd
    eventIds           u32[] optional  List of eventIds that match the query
    id                 u32   required  Object ID
    type               u32   optional  Object type
    TODO
    dvrconfigs         msg[]      optional   Supported DVR configurations.
    uuid               str        required   DVR configuration ID
    name               str        required   DVR configuration Name
    comment            str        required   DVR configuration Comment
    eventId            u32   optional   Event ID (Optional since version 5).
    channelId          u32   optional   Channel ID (Added in version 5)
    start              s64   optional   Time to start recording (Added in version 5)
    stop               s64   optional   Time to stop recording (Added in version 5)
    retention          u32   optional   Retention time in days (Added in version 13)
    creator            str   optional   Name of the event creator (Added in version 5, obsoleted in version 18 - applications are not allowed to change credential)
    priority           u32   optional   Recording priority (Added in version 5)
    startExtra         s64   optional   Pre-recording buffer in minutes (Added in version 5)
    stopExtra          s64   optional   Post-recording buffer in minutes (Added in version 5)
    title              str   optional   Recording title, if no eventId (Added in version 6)
    subtitle           str   optional   Recording subtitle, if no eventId (Added in version 20)
    description        str   optional   Recording description, if no eventId (Added in version 5)
    configName         str   optional   DVR configuration name or UUID
    enabled            u32   optional   Enabled flag (Added in version 23).
    ageRating          u32   optional   Minimum age rating (Added in version 36).
    comment            str   optional   User Comment (Added in version 42).
    success            u32   required   1 if entry was added, 0 otherwise
    id                 u32   optional   ID of created DVR entry
    error              str   optional   English clear text of error message
    id                 u32   required   DVR Entry ID
    channelId          u32   optional   New channel ID (Added in version 22)
    start              s64   optional   New start time
    stop               s64   optional   New stop time
    title              str   optional   New entry title
    subtitle           str   optional   New entry subtitle (Added in version 21)
    description        str   optional   New entry description (Added in version 6)
    startExtra         s64   optional   New pre-record buffer (Added in version 6)
    stopExtra          s64   optional   New post-record buffer (Added in version 6)
    configName         str   optional   New DVR configuration name or UUID
    retention          u32   optional   Retention in days (Added in version 13)
    priority           u32   optional   Recording priority (Added in version 13)
    enabled            u32   optional   Enabled flag (Added in version 23).
    comment            str   optional   User Comment (Added in version 42).
    success            u32   required   1 if update as successful, otherwise 0
    error              str   optional   Error message if update failed
    id                 u32   required   dvrEnryId to delete
    success            int   required   1 if entry was cancelled
    error              str   optional   Error message if cancellation failed
    id                 u32   required   DVR Entry ID
    success            u32   required   1 if entry was removed
    error              str   optional   Error message if the delete fails
    id                 u32   required   DVR Entry ID
    cutpoints          msg[] optional   List of cutpoint entries, if a file is found and has some valid data.
    start              u32   required   Cut start time in ms.
    end                u32   required   Cut end time in ms.
    type               u32   required   Action type: 
                                          0=Cut, 1=Mute, 2=Scene, 
                                          3=Commercial break.
    enabled            u32   optional   Enabled flag (Added in version 19).
    title              str   required   Title for the recordings.
    fulltext           u32   optional   Full text flag (Added in version 20).
    directory          str   optional   Forced directory name - missing or empty = auto (Added in version 19).
    name               str   optional   Name of this autorec entry (Added in version 18).
    configName         str   optional   DVR Configuration Name / UUID.
    channelId          u32   optional   Channel ID.
    minDuration        u32   optional   Minimal duration in seconds (0 = Any).
    maxDuration        u32   optional   Maximal duration in seconds (0 = Any).
    daysOfWeek         u32   optional   Bitmask - Days of week (0x01 = Monday, 0x40 = Sunday, 0x7f = Whole Week, 0 = Not set).
    priority           u32   optional   Priority (0 = Important, 1 = High, 2 = Normal, 3 = Low, 4 = Unimportant, 5 = Not set).
    approxTime         u32   optional   Minutes from midnight (up to 24*60) (window +- 15 mintes) (Obsoleted from version 18).
    start              s32   optional   Minutes from midnight (up to 24*60) for the start of the time window (including) (Added in version 18).
    startWindow        s32   optional   Minutes from modnight (up to 24*60) for the end of the time window (including, cross-noon allowed) (Added in version 18).
    startExtra         s64   optional   Extra start minutes (pre-time).
    stopExtra          s64   optional   Extra stop minutes (post-time).
    dupDetect          u32   optional   Dup Detect (0 = all, 1 = diff episode, 2 = diff subtitle, 3 = diff description, 4 = once per week, 5 = once per day) (Added in version 20).
    comment            str   optional   User Comment.
    broadcastType      u32   optional   Broadcast type (0 = any, 1 = new/premiere/unknown, 2 = repeated, 3 = new/premiere) (Added in version 39).
    success            u32   required   1 if entry was added, 0 otherwise
    id                 str   optional   ID (string!) of created autorec DVR entry
    error              str   optional   English clear text of error message
    id                 str   required   Autorec DVR Entry ID (string!)
    title              str   optional   Title for the recordings
    (Rest same as for addAutorecEntry)
    None (errors only propagated via HTTP status code)
    id                 str   required   Autorec DVR Entry ID (string!)
    success            u32   required   1 if entry was removed
    error              str   optional   Error message if the delete fails
    enabled            u32   optional   Enabled flag (Added in version 19).
    title              str   required   Title for the recordings.
    directory          str   optional   Forced output directory name (Added in version 19).
    name               str   optional   Name for this timerec entry.
    configName         str   optional   DVR Configuration Name / UUID.
    channelId          u32   optional   Channel ID.
    daysOfWeek         u32   optional   Bitmask - Days of week (0x01 = Monday, 0x40 = Sunday, 0x7f = Whole Week, 0 = Not set).
    priority           u32   optional   Priority (0 = Important, 1 = High, 2 = Normal, 3 = Low, 4 = Unimportant, 5 = Not set).
    start              u32   optional   Minutes from midnight (up to 24*60) for the start of the time window (including)
    stop               u32   optional   Minutes from modnight (up to 24*60) for the end of the time window (including, cross-noon allowed)
    retention          u32   optional   Retention in days. 
    comment            str   optional   User Comment.
    success            u32   required   1 if entry was added, 0 otherwise
    id                 str   optional   ID (string!) of created timerec DVR entry
    error              str   optional   English clear text of error message
    id                 str   required   Timerec DVR Entry ID (string!)
    title              str   optional   Title for the recordings
    (Rest same as for addTimerecEntry)
    None (errors only propagated via HTTP status code)
    id                 str   required   Timerec DVR Entry ID (string!)
    success            u32   required   1 if entry was removed
    error              str   optional   Error message if the delete fails
    channelId          u32  optional   Channel to gain access for
    dvrId              u32  optional   DVR file to gain access for
    path               str  required   The full path for access URL (no scheme, host or port)
    ticket             str  required   The ticket to pass in the URL query string
    channelId          u32   required   ID for channel. 
    subscriptionId     u32   required   Subscription ID. Selected by client. This value is not interpreted by the server in any form. 
                                        The value is used from now on in all messages related to the subscription.
    weight             u32   optional   Weighting of this subscription (same as recording priority).
    90khz              u32   optional   Request PTS/DTS in default 90kHz timebase, default is 1MHz (Added in version 7)
    normts             u32   optional   Request PTS/DTS normalisation (Added in version 7)
                                        Note: this will mean missing timestamps are added, first packet should be ~0 and will always be an i-frame.
                                        Note: this is implied if timeshiftPeriod is enabled
                                        Note: from version 17, this is always enabled and this parameter is ignored.
    queueDepth         u32   optional   Change the default packet queue lengths, default 500000 bytes (Added in version 7)
                                        Note: I-frame depth is 3*queueDepth, P-frame is 2*queueDepth and B-frame is queueDepth
    timeshiftPeriod    u32   optional   The number of seconds to keep in the timeshift buffer (Added in version 9)
                                        Note: this may be bounded by server configuration settings
    profile            str   optional   Select stream profile (Added in version 16).
    90khz              u32   optional   Indicates 90khz timestamps will be used
    normts             u32   optional   Indicates timestamps will be normalised (and fixed)
    timeshiftPeriod    u32   optional   The actual timeshiftPeriod to be used
    subscriptionId     u32   required   Subscription ID.
    None
    subscriptionId     u32   required   Subscription ID.
    weight             u32   optional   The new subscription weight.
    None
    subscriptionId     u32   required   Subscription ID.
    absolute           u32   optional   The skip request is absolute
    time               u64   optional   Specify skip using time (units are as for PTS)
    size               u64   optional   Specify skip using size (Not currently used)
    None
    subscriptionId     u32   required   Subscription ID.
    speed              u32   required   Specify speed (0=pause, 100=1x fwd, -100=1x backward)
    None
    subscriptionId     u32   required   Subscription ID.
    None
    subscriptionId     u32        required   Subscription ID.
    enable             list[u32]  optional   Enable stream indexes
    disable            list[u32]  optional   Disable (filter out) stream indexes
    None
    profiles           msg[]      optional   Supported profiles
    uuid               str        required   Profile ID
    name               str        required   Profile Name
    comment            str        required   Profile Comment
    encoders           list[str]  optional   Supported encoders
    file               str   required   File path to open
    /dvrfile/ID        will open the file associated with DVR entry ID
    /imagecache/ID     will open the file associated with imagecache entry ID (Note: only works for HTSPv10+)
    id                 u32   required   The file handle used for further file operations
    size               u64   optional   The size of the file in bytes
    mtime              u64   optional   The last time the file was modified
    id                 u32   required   The file handle used for further file operations
    size               u64   required   The amount of data to read
    offset             u64   optional   Offset into the file to read (default is current position)
    data               bin   required   The data read from the file (size may be less than requested)
    id                 u32   required   The file handle to be closed
    None
    id                 u32   required   The file handle to be stat'd
    size               u64   optional   The size of the file in bytes
    mtime              u64   optional   The last time the file was modified
    id                 u32   required   The file handle to be stat'd
    offset             u64   required   The position to seek in the file
    whence             str   required   Where to seek relative to (default=SEEK_SET)
    SEEK_SET           Seek relative to start of file
    SEEK_CUR           Seek relative to current position in file
    SEEK_END           Seek relative (backwards) to end of file
    offset             u64   optional   The new absolute position within the file
    Clock icon

    DVR

    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.

    hashtag
    dvr/config/class

    Lists the text strings, options and defaults used when configuring the DVR capability within TVH (ie Configuration -> Recording). Requires either RECORDER or ADMIN privilege.

    hashtag
    dvr/config/grid

    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.

    hashtag
    dvr/config/create

    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

    hashtag
    dvr/entry/class

    Lists the text strings, options and defaults used when editing an upcoming recording.

    hashtag
    dvr/entry/grid

    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 for parameter details, and note the default is to return only the first 50 items.

    hashtag
    dvr/entry/grid_upcoming

    Lists all of the currently-scheduled recordings. See 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.

    hashtag
    dvr/entry/grid_finished

    Lists recordings which have completed and which are still in the TVH logs. See 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.

    hashtag
    dvr/entry/grid_failed

    Lists failed recordings. See 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.

    hashtag
    dvr/entry/grid_removed

    Lists removed recordings. See 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.

    hashtag
    dvr/entry/create

    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 .

    hashtag
    dvr/entry/create_by_event

    Creates a new timer using details from the EPG. Input parameters are:

    • config_uuid this is the uuid parameter from the output of

    • event_id this is the eventId parameter for the event, taken from

    hashtag
    dvr/entry/rerecord/toggle, dvr/entry/rerecord/deny, dvr/entry/rerecord/allow

    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.

    hashtag
    dvr/entry/stop

    Gracefully stops a running recording.

    • uuid The uuid value from the timer's entry in dvr/entry/grid.

    hashtag
    dvr/entry/cancel

    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 , passing parameter uuid from the entry in . As with the UI, deleting a series deletes all pending timers for that series.

    hashtag
    dvr/entry/prevrec/toggle, dvr/entry/prevrec/set, dvr/entry/prevrec/unset

    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.

    hashtag
    dvr/entry/remove

    Removes a completed recording from storage.

    • uuid The recording's uuid value from .

    hashtag
    dvr/entry/filemoved

    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

    hashtag
    dvr/entry/move/finished

    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.

    hashtag
    dvr/entry/move/failed

    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.

    hashtag
    dvr/autorec/class

    Lists the text strings, options and defaults used when creating or editing a series timer.

    hashtag
    dvr/autorec/grid

    Lists autorecs (series timers). See for parameter details.

    hashtag
    dvr/autorec/create

    Create a new series timer by specifying search parameters. To create a timer using CRIDs use .

    • conf A JSON object specifying the selection parameters for the timer.

    • config_uuid The uuid parameter from the output of . Parameter config_name may be passed instead.

    hashtag
    dvr/autorec/create_by_series

    Creates a new series timer using CRIDs. Input parameters are:

    • config_uuid The uuid parameter from the output of

    • event_id The eventId parameter for one event in the series, taken from

    NOTE To delete a series use , passing parameter uuid from the entry in . As with the UI, deleting a series deletes all pending timers for that series.

    hashtag
    dvr/timerec/class

    Lists the text strings, options and defaults used when creating or editing a time-based recording.

    hashtag
    dvr/timerec/grid

    Lists time-based recordings. See for parameter details.

    hashtag
    dvr/timerec/create

    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.

    Grid Parameters
    Grid Parameters
    Grid Parameters
    Grid Parameters
    Grid Parameters
    Caution
    dvr/config/grid
    epg/events/grid
    idnode/delete
    dvr/timerec/grid
    dvr/entry/grid_finished
    Grid Parameters
    dvr/autorec/create_by_series
    dvr/config/grid
    dvr/config/grid
    epg/events/grid
    idnode/delete
    dvr/autorec/grid
    Grid Parameters
    {
       "total" : 1,
       "entries" : [
          {
             "cache" : 2,
             "storage-mfree" : 1000,
             "autorec-maxsched" : 0,
             "whitespace-in-title" : false,
             "time-in-title" : false,
             "channel-dir" : false,
             "epg-running" : true,
             "name" : "",
             "episode-in-title" : false,
             "profile" : "af143f0983fd4e91953fb859c5561984",
             "clean-title" : false,
             "pre-extra-time" : 0,
             "uuid" : "4e3a1e1cacd2d559c129e7b90f6c986e",
             "day-dir" : false,
             "subtitle-in-title" : false,
             "epg-update-window" : 86400,
             "title-dir" : false,
             "warm-time" : 30,
             "windows-compatible-filenames" : false,
             "autorec-maxcount" : 0,
             "removal-days" : 2147483647,
             "storage-mused" : 0,
             "tag-files" : true,
             "clone" : true,
             "omit-title" : false,
             "enabled" : true,
             "storage" : "/mnt/tvheadend",
             "date-in-title" : false,
             "channel-in-title" : false,
             "post-extra-time" : 0,
             "skip-commercials" : false,
             "rerecord-errors" : 0,
             "file-permissions" : "0664",
             "retention-days" : 2147483646,
             "charset" : "ASCII",
             "pri" : 2,
             "directory-permissions" : "0775",
             "pathname" : "$t$n.$x"
          }
       ]
    }
    {
      "entries": [
        {
          "uuid": "bc85208b236701a63568cb62d5506e08",
          "enabled": true,
          "create": 1561451356,
          "watched": 0,
          "start": 1562099400,
          "start_extra": 0,
          "start_real": 1562099340,
          "stop": 1562103000,
          "stop_extra": 0,
          "stop_real": 1562103000,
          "duration": 3600,
          "channel": "9a20ebf5ec10a3c49c2c021cc2698ecc",
          "channelname": "BBC TWO HD",
          "image": "",
          "fanart_image": "",
          "title": {
            "eng": "Inside the Bank of England"
          },
          "disp_title": "Inside the Bank of England",
          "disp_subtitle": "",
          "summary": {
            "eng": "1/2. Filmed with unprecedented access, this episode goes inside the Bank to show how it prints our cash, ensures our money holds its value and sets the UKs interest rate. [S,AD] [HD]"
          },
          "disp_summary": "1/2. Filmed with unprecedented access, this episode goes inside the Bank to show how it prints our cash, ensures our money holds its value and sets the UKs interest rate. [S,AD] [HD]",
          "description": {
            "eng": "1/2. Filmed with unprecedented access, this episode goes inside the Bank to show how it prints our cash, ensures our money holds its value and sets the UKs interest rate. [S,AD] [HD]"
          },
          "disp_description": "1/2. Filmed with unprecedented access, this episode goes inside the Bank to show how it prints our cash, ensures our money holds its value and sets the UKs interest rate. [S,AD] [HD]",
          "disp_extratext": "1/2. Filmed with unprecedented access, this episode goes inside the Bank to show how it prints our cash, ensures our money holds its value and sets the UKs interest rate. [S,AD] [HD]",
          "pri": 6,
          "retention": 0,
          "removal": 0,
          "playposition": 0,
          "playcount": 0,
          "config_name": "4e3a1e13acd2d5a9c129e7b00f6c986e",
          "owner": "tvheadend",
          "creator": "tvheadend",
          "filename": "",
          "errorcode": 0,
          "errors": 0,
          "data_errors": 0,
          "dvb_eid": 3842,
          "noresched": false,
          "norerecord": false,
          "fileremoved": 0,
          "uri": "crid://fp.bbc.co.uk/m/4586",
          "autorec": "24fcfd056fc32b86f0abd9fc6a57d17d",
          "autorec_caption": "Inside the Bank of England (Inside the Bank of England - Created from EPG query)",
          "timerec": "",
          "timerec_caption": "",
          "parent": "",
          "child": "",
          "content_type": 2,
          "copyright_year": 0,
          "broadcast": 295634,
          "episode_disp": "",
          "url": "",
          "filesize": 0,
          "status": "Scheduled for recording",
          "sched_status": "scheduled",
          "duplicate": 0,
          "first_aired": 0,
          "comment": "Auto recording: Inside the Bank of England - Created from EPG query",
          "category": [],
          "credits": {},
          "keyword": [],
          "genre": [
            32
          ],
          "age_rating": 11,
          "rating_label_saved": "PG,
          "rating_icon_saved": "file:///my/file/location/acma-pg.png",
          "rating_country_saved": "AUS",
          "rating_authority_saved": "ACMA",
          "rating_label_uuid": "a82438515ecc857dbf2509517ff3fe40",
          "rating_icon": "imagecache/37",
          "rating_label": "PG"
        }, ...
      ],
      "total": 4
    }
    {
      "entries": [
        {
          "uuid": "07ac8ed6d7d8744a4217c7b7005d5d7a",
          "enabled": true,
          "create": 1581300276,
          "watched": 0,
          "start": 1581937200,
          "start_extra": 0,
          "start_real": 1581937110,
          "stop": 1581940800,
          "stop_extra": 0,
          "stop_real": 1581940800,
          "duration": 3600,
          "channel": "16460c1b17ee679e0fc3cdb851edd294",
          "channel_icon": "imagecache/223",
          "channelname": "YESTERDAY",
          "image": "",
          "fanart_image": "",
          "title": {
            "eng": "Abandoned Engineering"
          },
          "disp_title": "Abandoned Engineering",
          "disp_subtitle": "",
          "disp_summary": "",
          "description": {
            "eng": "Pyramiden Norway: A town with a supernatural atmosphere, a collection of imposing buildings in southern Australia, and the remains of curious-looking basins emerging from the waves. [AD,S]"
          },
          "disp_description": "Pyramiden Norway: A town with a supernatural atmosphere, a collection of imposing buildings in southern Australia, and the remains of curious-looking basins emerging from the waves. [AD,S]",
          "disp_extratext": "Pyramiden Norway: A town with a supernatural atmosphere, a collection of imposing buildings in southern Australia, and the remains of curious-looking basins emerging from the waves. [AD,S]",
          "pri": 6,
          "retention": 0,
          "removal": 0,
          "playposition": 0,
          "playcount": 0,
          "config_name": "1ccca1a328ecdcab3f88640dda5b6209",
          "owner": "linvdr",
          "creator": "linvdr",
          "filename": "/video/tvheadend/Abandoned Engineering-4.ts",
          "errorcode": 0,
          "errors": 0,
          "data_errors": 0,
          "dvb_eid": 0,
          "noresched": true,
          "norerecord": false,
          "fileremoved": 0,
          "uri": "crid://onid-2/QQK596",
          "autorec": "",
          "autorec_caption": "",
          "timerec": "",
          "timerec_caption": "",
          "parent": "",
          "child": "",
          "content_type": 2,
          "copyright_year": 0,
          "broadcast": 0,
          "episode_disp": "",
          "url": "dvrfile/07ac8ed6d7d8744a4217c7b7005d5d7a",
          "filesize": 997310108,
          "status": "Completed OK",
          "sched_status": "completed",
          "duplicate": 0,
          "first_aired": 0,
          "comment": "Auto recording: New: Abandoned Engineering - Created from EPG query",
          "category": [],
          "credits": {},
          "keyword": [],
          "genre": [],
          "age_rating": 13,
          "rating_label_saved": "M",
          "rating_icon_saved": "file:///my/file/location/acma-m.png",
          "rating_country_saved": "AUS",
          "rating_authority_saved": "ACMA",
          "rating_label_uuid": "",
          "rating_icon": "imagecache/35",
          "rating_label": "M"
        }, ...
      "total": 101
    }
       "total" : 1,
       "entries" : [
          {
             "parent" : "",
             "channelname" : "BBC Four HD",
             "start" : 1513112400,
             "stop_real" : 1513116000,
             "description" : {
                "eng" : "2/3. Series in which Sam Willis reveals stories of invasion in Britain, including the Barbary Corsaire pirates and the tale of King Louis the Lion, who invaded in the 13th century. [HD] [S]"
             },
             "comment" : "Auto recording: Created from EPG query",
             "disp_title" : "New: Invasion! with Sam Willis",
             "child" : "",
             "uri" : "crid://fp.bbc.co.uk/247LP4",
             "image" : "",
             "dvb_eid" : 62795,
             "autorec_caption" : " (Created from EPG query)",
             "removal" : 0,
             "url" : "dvrfile/22d9847b550b8fe9e39e01bda2e41777",
             "owner" : "tvheadend",
             "copyright_year" : 0,
             "playposition" : 0,
             "filename" : "/video/tvheadend/New: Invasion! with Sam Willis.ts",
             "start_real" : 1513112355,
             "start_extra" : 0,
             "duration" : 3600,
             "category" : [],
             "creator" : "tvheadend",
             "playcount" : 0,
             "sched_status" : "completed",
             "status" : "Too many data errors",
             "autorec" : "5cf012bf5c78e23d3c89c59c172414cb",
             "errors" : 0,
             "norerecord" : false,
             "broadcast" : 0,
             "noresched" : true,
             "keyword" : [],
             "config_name" : "ffb7136480e16dac47c8e71bd7686537",
             "disp_subtitle" : "2/3. Series in which Sam Willis reveals stories of invasion in Britain, including the Barbary Corsaire pirates and the tale of King Louis the Lion, who invaded in the 13th century. [HD] [S]",
             "enabled" : true,
             "stop_extra" : 0,
             "pri" : 6,
             "retention" : 0,
             "subtitle" : {
                "eng" : "2/3. Series in which Sam Willis reveals stories of invasion in Britain, including the Barbary Corsaire pirates and the tale of King Louis the Lion, who invaded in the 13th century. [HD] [S]"
             },
             "disp_description" : "2/3. Series in which Sam Willis reveals stories of invasion in Britain, including the Barbary Corsaire pirates and the tale of King Louis the Lion, who invaded in the 13th century. [HD] [S]",
             "fileremoved" : 0,
             "filesize" : 2171129092,
             "credits" : {},
             "title" : {
                "eng" : "New: Invasion! with Sam Willis"
             },
             "content_type" : 2,
             "genre" : [],
             "errorcode" : 0,
             "stop" : 1513116000,
             "channel_icon" : "",
             "data_errors" : 510410,
             "timerec" : "",
             "channel" : "7bd448424af369b19f22511b1ece023c",
             "uuid" : "22d9847b550b8fe9e39e01bda2e41777",
             "timerec_caption" : "",
             "first_aired" : 0,
             "duplicate" : 0
          }
       ]
    }
    {
       "start":1509397200,
       "stop":1509400800,
       "channelname":"Channel 5",
       "title":{
          "eng":"Paddington Station 24/7"
       },
       "subtitle":{"eng":"More real-life dramas..."}
    }
    {
        "enabled": true,
        "start": 1509000000,
        "stop":  1509003600,
        "channelname": "local file",
        "title": {
            "eng": "my title"
        },
        "subtitle": {
            "eng": "filename: my video"
        },
        "description": {
            "eng": "my description"
        },
        "comment": "added by tvh_addfile.py",
        "files": [
            {
                "filename": "/full/path/to/videofile.ts"
            }
        ]
    }
    {
       "entries" : [
          {
             "record" : 0,
             "pri" : 6,
             "channel" : "a931256950c3f8aa5c5416cd36175e13",
             "content_type" : 0,
             "retention" : 0,
             "fulltext" : false,
             "start_window" : "Any",
             "serieslink" : "crid://www.five.tv/R5HP0",
             "config_name" : "4e3a1e13acd2d5a9c129e7b00f6c986e",
             "maxduration" : 0,
             "removal" : 0,
             "start_extra" : 0,
             "stop_extra" : 0,
             "maxcount" : 0,
             "owner" : "tvheadend",
             "weekdays" : [
                1,
                2,
                3,
                4,
                5,
                6,
                7
             ],
             "uuid" : "f2c30b9757e66567bf2d8ec6de60314c",
             "creator" : "tvheadend",
             "tag" : "",
             "maxsched" : 0,
             "comment" : "Created from EPG query",
             "start" : "Any",
             "btype" : 0,
             "brand" : "",
             "enabled" : true,
             "season" : "",
             "minduration" : 0,
             "title" : "New: Paddington Station 24/7"
          }, ...
       ],
       "total" : 9
    }
    {
       "total" : 1,
       "entries" : [
          {
             "name" : "My Timerec",
             "title" : "Time-%F_%R",
             "enabled" : true,
             "channel" : "7bd448424af369b19f22511b1ece023c",
             "retention" : 0,
             "config_name" : "ffb7136480e16dac47c8e71bd7686537",
             "creator" : "tvheadend",
             "uuid" : "458251fe1963a9967e5b83e8f2a680e6",
             "weekdays" : [
                2,
                4
             ],
             "pri" : 6,
             "owner" : "tvheadend",
             "stop" : "19:30",
             "start" : "19:00",
             "removal" : 0
          }
       ]
    }
    no
    no
    no
    no
    no
    no
    no
    no
    yes
    yes
    yes
    yes
    yes
    yes
    yes
    no
    yes
    Broadcast details icon
    no
    yes

    Rolling Release Change Log

    hashtag
    Release: 4.3-2432~g0af87f13farrow-up-right (2025-07-21)

    transcode: add advanced options for deinterlacing

    This patch exposes additional configuration options for the deinterlace_vaapi (hardware) and yadif (software) deinterlace filters:

    • Deinterlace rate type (rate): frame or field

    • Deinterlace fields only (auto): only deinterlace interlaced fields

    • VAAPI Deinterlace mode (mode): Bob, Weave, MADI, MCDI (for VAAPI only)

    These options allow the transcode deinterlace configuration to be fine-tuned. Most notably, the deinterlace filters can now be configured with field-rate deinterlacing, which causes (for example) 25fps interlaced input at a 90kHz timebase to produce 50fps output with a 180kHz timebase.

    To maintain MPEG-TS compliance, the output timebase is fixed at 90kHz, and both the adjusted output frame rate (e.g. 50fps) and frame timestamps are rescaled accordingly before encoding. For accuracy, this rescaling is performed dynamically using libav functions such as av_rescale_q(), based on the timebase of the final filter in the AVFilterContext chain and the timebase of the output AVCodecContext. This approach supports fractional frame rates and remains robust against future changes to the filter configuration, including various combinations of deinterlace options.

    When field-rate deinterlacing is selected, this produces frames with (for example) correct timing of 50fps playback in a 90kHz container, ensuring that the transcoded output stream preserves the intended cadence and temporal fidelity of the original interlaced source.

    (2025-07-21)


    hashtag
    Release: (2025-07-20)

    move filter_hw_denoise and filter_hw_sharpness to tvh_codec_profile_video

    fixes: https://github.com/tvheadend/tvheadend/issues/1818 also fixes a logical define bug: filter_denoise and filter_sharpness should be transferred for all HW accels (not only for VAAPI)

    (2025-07-20)


    hashtag
    Release: (2025-07-18)

    Add Season number and Episode number to file name formatting strings.

    (2025-07-18)


    hashtag
    Release: (2025-07-17)

    Implement age ratings on XMLTV

    Update xmltv.c

    Apply suggestion from @Copilot

    Test for epgdb_processparentallabels to avoid false positives

    Add branch in case rating_label exists but system is null

    Fallback to rl_display_age before rl_age

    Co-Authored-By: Copilot

    (2025-07-16)


    hashtag
    Release: (2025-07-17)

    Add Scene Markers to recordings at scheduled EPG event start/stop times.

    (2025-07-17)


    hashtag
    Release: (2025-07-16)

    Fix builds on debian buster

    (2025-07-16)


    hashtag
    Release: (2025-07-12)

    Fix broken squash-autocomment

    (2025-07-11)


    hashtag
    Release: (2025-07-05)

    Add 'sudo make install' to the Linux build notes.

    (2025-07-05)


    hashtag
    Release: (2025-07-03)

    Cloudsmith supports fedora 42 now

    (2025-07-03)


    hashtag
    Release: (2025-06-27)

    Update coverity secret check to new ENV file

    (2025-06-27)


    hashtag
    Release: (2025-06-21)

    Update online help text

    Format Strings used in DVR Profiles cannot be used when creating Autorecs. See Forum issue 9160.

    (2025-06-21)


    hashtag
    Release: (2025-06-12)

    fix memory leak 3 - transcoding

    • fix memory leak 3 - transcoding

    (2025-06-12)


    hashtag
    Release: (2025-06-10)

    Recognise checkbox for feature proposals properly

    (2025-06-10)


    hashtag
    Release: (2025-06-10)

    User's DVR Configuration profile not used when scheduling recordings via HTSP

    (2025-06-10)


    hashtag
    Release: (2025-06-10)

    remove coded_width and coded_height from encoding

    according to AVCodecContext documentation this is only used for decoding, oavctx is used for encoding

    (2025-06-10)


    hashtag
    Release: (2025-06-09)

    Add missing coverity env

    (2025-06-09)


    hashtag
    Release: (2025-06-09)

    Fix coverity builds

    (2025-06-09)


    hashtag
    Release: (2025-06-06)

    repo: cleanup CONTRIBUTING.md

    Signed-off-by: Christian Hewitt

    (2025-06-06)


    hashtag
    Release: (2025-06-06)

    intl: js: change freenode to Libera.Chat

    Signed-off-by: Christian Hewitt

    (2025-06-06)


    hashtag
    Release: (2025-06-06)

    ci: disable coverity on forks

    Signed-off-by: Christian Hewitt

    (2025-06-06)


    hashtag
    Release: (2025-06-04)

    HTSP: Expose is_new flag in EPG event data

    This commit adds the is_new flag to the EPG event data sent to HTSP clients. By including this property, clients such as Kodi (with the pvr.hts addon) can now detect whether a broadcast is marked as new and set corresponding flags (e.g. EPG_TAG_FLAG_IS_NEW in Kodi).

    This enhances the metadata available to clients and supports improved EPG event handling and display.

    A corresponding pull request will also be submitted to the pvr.hts project to make use of this flag when obtaining EPG event guide data from Tvheadend.

    (2025-06-04)


    hashtag
    Release: (2025-06-04)

    Coverity CID 552897

    (2025-06-04)


    hashtag
    Release: (2025-06-02)

    Add API call 'status/activity'.

    (2025-06-02)


    hashtag
    Release: (2025-06-02)

    transcode: gracefully handle common hardware decoder errors

    When using VAAPI hardware decoding, certain malformed or corrupt frames at the start of the stream may cause the ffmpeg h/w decoder to emit AVERROR(EIO) or AVERROR(EINVAL) early in the picture decoding phase.

    In these cases, libav will log errors such as:

    [ ERROR]:libav: AVCodecContext: Failed to upload decode parameters: 18 (invalid parameter). [ ERROR]:libav: AVCodecContext: Failed to end picture decode after error: 18 (invalid parameter). [ ERROR]:libav: AVCodecContext: hardware accelerator failed to decode picture

    Currently, Tvheadend treats these errors as fatal, resulting in the transcoder stream being torn down via tvh_stream_stop() and interrupting client playback, typically leaving only audio and a black screen.

    (2025-06-02)


    hashtag
    Release: (2025-06-02)

    fix for video stream detection

    PR https://github.com/tvheadend/tvheadend/pull/1772 is not covering all video streams. The proper implementation is to use the macro SCT_ISVIDEO()

    (2025-06-02)


    hashtag
    Release: (2025-05-27)

    fix memory leak 2 - transcoding

    fix memory leak 2 - transcoding

    (2025-05-27)


    hashtag
    Release: (2025-05-27)

    fix dead error condition

    Fixes coverity scan issues: 462150

    (2025-05-27)


    hashtag
    Release: (2025-05-26)

    add mpegts parameters from input stream

    • add service_name, service_provider, mpegts_transport_id, mpegts_service_type, mpegts_pmt_start_pid, mpegts_start_pid, mpegts_service_id, mpegts_original_service_id

    • allow user to select mpeg ts sid (same like pass profile)

    (2025-05-25)


    hashtag
    Release: (2025-05-25)

    fix memory leak - transcoding

    Fixes coverity scan issues: 551230, 551229, 507422 and 507421

    (2025-05-25)


    hashtag
    Release: (2025-05-25)

    Fix recording thread freeze when unable to create unique file name.

    (2025-05-25)


    hashtag
    Release: (2025-05-23)

    MKV Tags - Change rating label. Add Sub-title and Comment.

    (2025-05-23)


    hashtag
    Release: (2025-05-22)

    fix memory leak

    Fixes: https://github.com/tvheadend/tvheadend/issues/1749

    (2025-05-22)


    hashtag
    Release: (2025-05-20)

    video hw accel should only be applied for video streams

    Fixes: https://github.com/tvheadend/tvheadend/issues/1827

    (2025-05-20)


    hashtag
    Release: (2025-05-19)

    Update VAAPI transcoding as recommended by ffmpeg 6.1.1/doc/examples/… (#1792)

    Update VAAPI transcoding as recommended by ffmpeg 6.1.1/doc/examples/vaapi_*.c

    (2025-05-19)


    hashtag
    Release: (2025-05-19)

    Add Sub-Title Processing Options for DVB OTA EPG

    (2025-05-19)


    hashtag
    Release: (2025-05-18)

    update audio abuffersink from deprecated channel_layouts to ch_layouts and deprecated FF_PROFILE_* --> AV_PROFILE_*

    update audio abuffersink from deprecated channel_layouts to ch_layouts and deprecated FF_PROFILE_* --> AV_PROFILE_*

    (2025-05-18)


    hashtag
    Release: (2025-05-17)

    iptv: handle relative key URL

    (2025-05-17)


    hashtag
    Release: (2025-05-15)

    [Docker]: Tag alpine master as latest

    (2025-05-15)


    hashtag
    Release: (2025-05-14)

    allow NVENC, VAAPI and MMAL to coexist in the same build

    • allow NVENC, VAAPI and MMAL to coexist in the same build.

    • give the user the capability for prioritise hw decoder or to match the hw decoder with hw encoder

    • refactor source code: remove duplicate source code in codec.js

    (2025-05-14)


    hashtag
    Release: (2025-05-14)

    wizard: increase buffer size to silence -Wformat-truncation on GCC 15

    GCC 15.1 introduces stricter checks around snprintf-like functions under -Wformat-truncation, even when the format string itself is under developer control. This triggers a false positive in hello_changed() when building with -Werror=format-truncation:

    error: ‘__builtin___snprintf_chk’ output may be truncated before the last format character [-Werror=format-truncation=]

    note: output between 1 and 33 bytes into a destination of size 32

    This warning is triggered due to a theoretical edge case in tvh_strlcatf()

    (2025-05-13)


    hashtag
    Release: (2025-05-14)

    fix read/write of PT_DYN_INT

    PT_DYN_INT should be read and write as int (32 bits)

    (2025-05-14)


    hashtag
    Release: (2025-05-14)

    Show recording file name

    (2025-05-14)


    hashtag
    Release: (2025-05-13)

    Fix crash when updating 'disp_summary'

    (2025-05-13)


    hashtag
    Release: (2025-05-13)

    Global setting for 'Items per page'

    (2025-05-13)


    hashtag
    Release: (2025-05-13)

    lovcombo-all.js: Fix autorec create/edit TypeError with Firefox 134 (#1786)

    Firefox 134 added the RegExp.escape() method (https://tc39.es/proposal-regex-escaping/#sec-regexp.escape) with a standards-compliant implementation that throws TypeError if any value other than a String is passed in. This differs from the existing polyfill that simply returns the argument unmodified if it isn't a String. In TVHeadend, the day-of-the-week selector (as used in the Autorec and Timer configuration) uses Integers as keys for options, causing an Integer to get passed to RegExp.escape() on line 300 of lovcombo-all.js. Because of the non-standards- compliant permissive behaviour of the polyfill, this previously didn't cause an issue. However, with Firefox 134 (and an upcoming version of Safari), the added standards-compliant method causes a TypeError to be thrown on every attempt to create or edit a timer or autorec, causing the edit window to not be shown. To solve the issue, pass the response from r.get(this.valueField) through the String() constructor to ensure anything that gets passed in is a String. This has been tested with Firefox and Chrome with both Integer and String keys.

    (2025-05-13)


    hashtag
    Release: (2025-05-13)

    Translation for 'en_US' updated. intl: Translate tvheadend.doc.pot in en_US

    100% translated source file: 'tvheadend.doc.pot' on 'en_US'.

    (2025-05-13)


    hashtag
    Release: (2025-05-13)

    Fix Cloudsmith uploads

    (2025-05-12)


    hashtag
    Release: (2025-05-13)

    httpc.c: Fix HTTPS with OpenSSL 3.5 (#1813)

    The TLS Client Hello message is larger in OpenSSL 3.5 and will not fit in the previous hc_io_size of 1024 bytes. This causes the TLS Client Hello message to be truncated, resulting in HTTPS requests stalling and eventually timing out. To fix this, increase hc_io_size to 2048 bytes.

    (2025-05-13)


    hashtag
    Release: (2025-05-13)

    Remove links to old Wiki (#1793)

    • Remove links to old Wiki. Fixes #1660 Also remove references to CIC and CLA, and other content where a more recent version exists on the documentation site.

    • Remove more obsolete links.

    (2025-05-13)


    hashtag
    Release: (2024-11-13)

    Check for hidden fields before reading them. Fixes #1782.

    (2024-11-12)


    hashtag
    Release: (2024-10-08)

    iptv: allow to limit UDP ports for unicast inputs

    (2024-10-08)


    hashtag
    Release: (2024-10-08)

    Translation for 'en_US' updated. intl: Translate intl/tvheadend.pot in en_US

    100% translated source file: 'intl/tvheadend.pot' on 'en_US'.

    (2024-10-08)


    hashtag
    Release: (2024-10-05)

    update libvpx v.1.14.1

    update libvpx v.1.14.1 remove previous patch (from 1.14.0)

    (2024-10-05)


    hashtag
    Release: (2024-09-28)

    Fix - Audio transcoding not working #1663

    src/transcoding/transcode/helpers.c : pktbuf_len(self->input_gh)) will be 0 (empty) so will return error -11 (AVERROR(EAGAIN) for audio streams.

    (2024-09-28)


    hashtag
    Release: (2024-09-28)

    Add start timeout to streaming profile

    This allows overriding the hardcoded grace period of 20 seconds. It should address the problems described in [1][2].

    In addition, timeout code has been slightly refactored for readability and more debug logging.

    [1] https://tvheadend.org/d/8330-increase-timeout-when-tuning-iptv-mux/2 [2] https://tvheadend.org/d/8158-several-problems-questions-about-using-tvheadend-starting-with-not-waiting-long-enoough-for-stream-to-begin

    (2024-09-28)


    hashtag
    Release: (2024-09-23)

    fixes #1733

    (2024-09-23)


    hashtag
    Release: (2024-09-23)

    Remove HTSP client version test for rating labels and string UUIDs

    (2024-09-23)


    hashtag
    Release: (2024-09-06)

    bouquet: fix overzealous channel removals in merged multi-network setup

    (2024-09-06)


    hashtag
    Release: (2024-09-06)

    HTSP: deliver 'comment' with autorecEntry(Add|Update), timerecEntry(Add|Update). Allow setting 'comment' with 'updateDvrEntry'.

    (2024-09-06)


    hashtag
    Release: (2024-09-06)

    Fixup updating comment in _dvr_entry_update. Only overwrite existing title if comment is not NULL. Follows the same logic now as other updates done in this function.

    (2024-09-06)


    hashtag
    Release: (2024-09-06)

    Add country and authority to HTPS messages containing rating labels.

    (2024-09-06)


    hashtag
    Release: (2024-08-28)

    HTSP: Expose DVR configuration id in 'dvrEntryAdd', 'dvrEntryUpdate', 'autorecEntryAdd', 'autorecEntryUpdate', 'timerecEntryAdd', 'timerecEntryUpdate'.

    (2024-08-28)


    hashtag
    Release: (2024-08-25)

    HTSP: Expose broadcast type in 'autorecEntryAdd' and 'autorecEntryUpdate'. Handle broadcast type in 'addAutorecEntry' and 'updateAutorecEntry'.

    (2024-08-25)


    hashtag
    Release: (2024-08-25)

    Fix mapping HTSP field 'broadcastType' to internal field. Must be 'btype'.

    (2024-08-25)


    hashtag
    Release: (2024-08-24)

    Fix FTBFS introduced by 76d8fc8bc5455322558c764c84755ebbba254ad5

    Older versions of GCC don't like declaring a variable in the middle of a switch/case and will fail with "error: a label can only be part of a statement and a declaration is not a statement".

    (2024-08-24)


    hashtag
    Release: (2024-08-23)

    fix bug in AAC channel layout configuration tab

    fix bug in AAC channel layout configuration tab There are few issues:

    1. first entry in combo should be AUTO (with value 0) - in original code was set to 1 (and overwritten later)

    2. l->nb_channel is not the best way to cycle though layouts available. At the end I think is accessing some region outside of the struct (because I see is lopped also after 7.1). The way I knew how to fix was to add the filter (l->nb_channels < 32). Maybe changing the while to for will be a better option.

    (2024-08-23)


    hashtag
    Release: (2024-08-23)

    HTSP: Expose service provider name with channel information.

    (2024-08-22)


    hashtag
    Release: (2024-08-22)

    Update Fedora versions for cloudsmith uploads

    (2024-08-22)


    hashtag
    Release: (2024-08-12)

    Update linuxdvb_satconf.c - lnb poweroff requires power save

    Extend description to make it clear that lnb_poweroff also requires "power save" setting.

    (2024-08-12)


    hashtag
    Release: (2024-08-12)

    update vaapi - vainfo

    • add enable vainfo detection checkbox in config

    • defined PT_DYN_INT to load integer field from function

    • PT_DYN_INT must be paired with dyn_i

    (2024-08-12)


    hashtag
    Release: (2024-08-10)

    Enforce issue templates on GitHub

    (2024-08-10)


    hashtag
    Release: (2024-08-04)

    Replace deprecated channels/channel_layout

    (2024-08-04)


    hashtag
    Release: (2024-07-21)

    Translation for 'en_US' updated. intl: Translate intl/js/tvheadend.js.pot in en_US

    100% translated source file: 'intl/js/tvheadend.js.pot' on 'en_US'.

    (2024-07-21)


    hashtag
    Release: (2024-07-14)

    Rework fullscreen request method detection

    (2024-07-13)


    hashtag
    Release: (2024-07-13)

    Add dependency for recent Fedora versions

    (2024-07-13)


    hashtag
    Release: (2024-06-27)

    Remove tvheadend user on purge

    This fixes #1722 on my test system.

    (2024-06-27)


    hashtag
    Release: (2024-06-27)

    Refactor null value handling.

    (2024-06-27)


    hashtag
    Release: (2024-06-25)

    Replace deprecated interlaced_frame, top_field_first and key_frame

    (2024-06-25)


    hashtag
    Release: (2024-06-23)

    Remove useless NULL-assignment in http.c

    Found by coverity

    (2024-06-23)


    hashtag
    Release: (2024-06-23)

    Fix potential null-pointer dereference in muxer_mkv.c

    (2024-06-23)


    hashtag
    Release: (2024-06-23)

    Remove useless NULL-check in ratinglabels.c

    Found by coverity

    (2024-06-23)


    hashtag
    Release: (2024-06-18)

    Use safer htsmsg_add_str2 when copying de->de_directory

    de->de_directory may be null. htsmsg_add_str passes str unchecked to underlying strlen function. __strlen_avx2 will segfault if str is null.

    htsmsg_add_str2 checks the value of args before passing them to htsmsg_add_str, which should prevent this.

    Fixes #1712

    (2024-06-18)


    hashtag
    Release: (2024-06-15)

    XMLTV: Rating Labels: Use 'NONE' when 'system' attribute is missing

    (2024-06-15)


    hashtag
    Release: (2024-06-07)

    Allow setting a custom grace period for LinuxDVB adapters

    When using Astrometa to tune to DVB-T2 muxes in Poland, the scans are reported as complete but the found services have zero elementary services due to the scan period being too short in order to fetch PMTs.

    This change allows overriding the default grace period of 5 seconds with a custom value. I successfully scanned all services with this setting changed to 15 for this particular adapter/mux combination.

    (2024-06-06)


    hashtag
    Release: (2024-06-06)

    Extend CORS origin help/hover message

    Clarify that the value should be a URL, prefixed with http:// or https://, and not "bare" domains, which currently silently fail to save. Fixes (partially) #1700.

    (2024-06-06)


    hashtag
    Release: (2024-06-06)

    dvr: Added missing directory to rerecord-entry

    Previously if you had a directory set on a recording and this recording needed to be rerecorded, the directory was not kept in the new entry.

    (2024-06-06)


    hashtag
    Release: (2024-06-06)

    Always compile x265 as PIC

    (2024-06-06)


    hashtag
    Release: (2024-06-06)

    tvhdhomerun: Add ISDB to type check in tvhdhomerun_device_create

    This commit adds support for ISDB in the type check of the tvhdhomerun_device_create function in tvhdhomerun.c. This allows the function to handle ISDB type devices, which previously would have been changed to a DVB device on startup every time despite overrides.

    (2024-06-05)


    hashtag
    Release: (2024-06-05)

    Docker/Alpine: Remove USB group

    The USB group has been removed from upstream alpine in commit bb00d0e4f345 ("main/alpine-baselayout: remove mem and usb group") which was a fixup on commit f16d0754d601 ("main/alpine-baselayout: remove unused/moved users and groups")

    Lets remove it here as well as we cannot join the group any longer.

    Besides, device access is probably better managed with host specific udev rules.

    Signed-off-by: Olliver Schinagl

    (2024-06-05)


    hashtag
    Release: (2024-04-26)

    Correct M3U playlist logo tag

    (2024-04-26)


    hashtag
    Release: (2024-04-26)

    Fix echo target for superuser file in Debian postinst

    aba5e60792177d6a2a867445559f4806973b3258 was causing the username and password to get printed to the console instead of being put in the correct file. Also, use the modern $() syntax instead of `` and quote all variable assignments.

    (2024-04-26)


    hashtag
    Release: (2024-04-25)

    Properly escape json in setup

    (2024-04-25)


    hashtag
    Release: (2024-04-25)

    satip: Ignore additional parameters

    Instead or erroring, ignore additional parameters, as required by the specs in 3.5.11 where it says "Unknown attributes shall be ignored by the server"

    (2024-04-24)


    hashtag
    Release: (2024-04-21)

    configure: fix parsing args if values contain "="

    Currently, when the value of an option passed to the configure script as argument contains an equal sign "=", the part of the string up to the second equal sign is used as option. This commit changes how the string is split, so that always only the part up to the first equal sign is interpreted as option.

    "${var%=}" removes everything from the last equal sign, "${var%%=}" removes everything from the first equal sign.

    This allows to pass CFLAGS, which usually contain equal signs, like "--cflags=-march=armv6 -mfloat-abi=hard -mfpu=vfp"

    For reference: https://github.com/tvheadend/tvheadend/issues/1665

    Signed-off-by: MichaIng

    (2024-04-20)


    hashtag
    Release: (2024-04-20)

    Update WebUI to allow debug/trace subsystem selection from a list.

    (2024-04-20)


    hashtag
    Release: (2024-04-13)

    Add subsystems to JSON API.

    (2024-04-13)


    hashtag
    Release: (2024-04-08)

    Fix detection of unknown version numbers in support/version

    Fixes: #1683

    (2024-04-08)


    hashtag
    Release: (2024-03-24)

    webui: Fix year being replaced incorrectly when using custom date format

    fixes regression in 2ca8a19

    (2024-03-24)


    hashtag
    Release: (2024-03-24)

    Update manpage

    • Replace freenode with libera

    • Change copyright info

    (2024-03-24)


    hashtag
    Release: (2024-03-22)

    Translation for 'pl' updated. intl: Translate intl/docs/tvheadend.doc.pot in pl

    100% translated source file: 'intl/docs/tvheadend.doc.pot' on 'pl'.

    (2024-03-22)


    hashtag
    Release: (2024-03-18)

    Translation for 'pl' updated. intl: Translate intl/docs/tvheadend.doc.pot in pl

    98% of minimum 80% translated source file: 'intl/docs/tvheadend.doc.pot' on 'pl'.

    Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

    (2024-03-18)


    hashtag
    Release: (2024-03-14)

    Update README.md

    Existing (page not found) : https://cloudsmith.io/tvheadend/tvheadend

    New: https://cloudsmith.io/~tvheadend/repos/tvheadend/packages/

    (2024-03-14)


    hashtag
    Release: (2024-03-09)

    CI: remove NODIRTY option as those builds may be dirty

    (2024-03-09)


    hashtag
    Release: (2024-03-08)

    Revert accidental package renaming

    (2024-03-08)


    hashtag
    Release: (2024-03-08)

    Create special tvheadend-armv6l and tvheadend-dbg-armv6l packages

    Fixes: #1665

    (2024-03-08)


    hashtag
    Release: (2024-03-07)

    Translation for 'pl' updated. intl: Translate intl/tvheadend.pot in pl

    100% translated source file: 'intl/tvheadend.pot' on 'pl'.

    (2024-03-07)


    hashtag
    Release: (2024-03-03)

    update to libvpx 1.14.0-patch

    added patch

    (2024-03-03)


    hashtag
    Release: (2024-03-01)

    ci: added more info logging to cloudsmith.sh

    (2024-03-01)


    hashtag
    Release: (2024-03-01)

    Improve autorec duplicate handling

    (2024-03-01)


    hashtag
    Release: (2024-03-01)

    Translation for 'pl' updated. intl: Translate intl/js/tvheadend.js.pot in pl

    100% translated source file: 'intl/js/tvheadend.js.pot' on 'pl'.

    (2024-03-01)


    hashtag
    Release: (2024-02-24)

    Replace broken links, update copyright year

    (2024-02-23)


    hashtag
    Release: (2024-02-23)

    Translation for 'pl' updated. intl: Translate intl/tvheadend.pot in pl

    100% translated source file: 'intl/tvheadend.pot' on 'pl'.

    (2024-02-23)


    hashtag
    Release: (2024-02-22)

    Run enforce-pr-rebase whenever a PR is updated

    (2024-02-21)


    hashtag
    Release: (2024-02-22)

    Translation for '(#1655)' updated. transifex: Updates for project Tvheadend and language pl (#1655)

    • intl: Translate intl/js/tvheadend.js.pot in pl

    100% translated source file: 'intl/js/tvheadend.js.pot' on 'pl'.

    • intl: Translate intl/tvheadend.pot in pl

    100% translated source file: 'intl/tvheadend.pot' on 'pl'.

    (2024-02-22)


    hashtag
    Release: (2024-02-22)

    Give comment-on-labels.yml permissions to write to PRs

    (2024-02-22)


    hashtag
    Release: (2024-02-22)

    Add OpenCollective donate link to Wizard

    (2024-02-22)


    hashtag
    Release: (2024-02-21)

    Make sure we spawn the best matching executable and not the first match

    Fixes: #1632

    (2024-02-21)


    hashtag
    Release: (2024-02-21)

    Replace poison memset by memset_s to avoid compiler optimising it out

    (2024-02-20)


    hashtag
    Release: (2024-02-21)

    Translation for 'pl' updated. intl: Translate intl/tvheadend.pot in pl

    100% translated source file: 'intl/tvheadend.pot' on 'pl'.

    (2024-02-20)


    hashtag
    Release: (2024-02-21)

    ci: change CLOUDSMITH_OWNER from a var to a secret

    (2024-02-21)


    hashtag
    Release: (2024-02-21)

    Fix Auto-PR comment on squash-label

    (2024-02-21)


    hashtag
    Release: (2024-02-20)

    Add some ERRNOs for DVR & Config

    (2024-02-20)


    hashtag
    Release: (2024-02-20)

    Add missing tvheadend-prefix in JS file

    Fixes 2ca8a19e4c8761af1a6653fed09af658e9cd5b67

    (2024-02-19)


    hashtag
    Release: (2024-02-20)

    Show SeriesLink for AutoRecs

    (2024-02-20)


    hashtag
    Release: (2024-02-20)

    Shorten time for stale issues before a warning is applied

    (2024-02-19)


    hashtag
    Release: (2024-02-19)

    Add missing htmsg_destroy() call in hdhomerun_server_discover

    (2024-02-19)


    hashtag
    Release: (2024-02-19)

    Add support for 12-hour custom date formats

    (2024-02-19)


    hashtag
    Release: (2024-02-19)

    Replace single-bit signed integers with unsigned integers

    Single bit signed integers contain a single sign-byte and zero value bytes according to the C99 standard. This is not intended here.

    (2024-02-19)


    hashtag
    Release: (2024-02-12)

    CI: Ensure we clone the whole repo

    We have to make sure we clone the whole repo, so that git describe works as expected. Without it, we get version 0.0.0, not what we want.

    Signed-off-by: Olliver Schinagl

    (2024-02-11)


    hashtag
    Release: (2024-02-10)

    container: Add container support

    This commit adds support for containerisation of TVHeadend. It adds the actual technology agnostic container file, an entry point and healthcheck for it and a github workflow component to publish it.

    TODO: Healthcheck script is not yet working. TODO: Add decent documentation

    Signed-off-by: Olliver Schinagl

    (2024-02-10)


    hashtag
    Release: (2024-02-10)

    transcoding: access the codec name only when codec pointer is valid

    this fixes #1635

    (2024-02-09)


    hashtag
    Release: (2024-02-08)

    dvr: Fix incorrect usage of strerror

    strerror takes the errno directly as its argument, negating it will result in an "Unknown error".

    Signed-off-by: Tianyi Liu

    (2024-02-08)


    hashtag
    Release: (2024-02-07)

    Add "recordings" to the backup exclude list

    Since https://github.com/tvheadend/tvheadend/pull/1540, enabled by https://github.com/tvheadend/tvheadend/pull/1535 and https://github.com/tvheadend/tvheadend/pull/1538, we have been storing the recordings in a subdirectory of the configuration directory by default. Because of this, the recordings are getting stored in the configuration backup. This causes the backups to take forever and fill the disk (see https://github.com/tvheadend/tvheadend/issues/1625). Instead, exclude the "recordings" directory from the backup to prevent this.

    (2024-02-07)


    hashtag
    Release: (2024-02-06)

    descrambler: Fix Sky-UK descrambling

    (2024-02-05)


    hashtag
    Release: (2024-02-06)

    Correct description of Change Parameters flag

    The Change Parameters flag on the Access Entries screen for a user determines whether that user's settings will override any previously-set parameters (for example from a wildcard user) - it does not affect the ability of subsequent users to override settings in turn. The exception is the 'Rights' settings where all matched users with the Change flag set are ORed together.

    (2024-02-06)


    hashtag
    Release: (2024-02-05)

    Translation for 'en_US' updated. transifex: Translate tvheadend.js.pot in en_US

    100% translated source file: 'tvheadend.js.pot' on 'en_US'.

    (2024-02-05)


    hashtag
    Release: (2024-02-04)

    Mark PRs needing squashing as stale after a while

    (2024-02-03)


    hashtag
    Release: (2024-02-04)

    Automatically comment on PRs needing squash

    (2024-02-03)


    hashtag
    Release: (2024-02-04)

    satipcli: Rename flag to include client reference

    We have both a satip client and server. However the nosatip flag, is for the client. Make this more clear by renaming it to the internal variable nosatipcli. Since we do not want to break the user facing API, we keep the commandline argument nosatip, but add an alias for the future.

    We can do better in the future with the rest of the satip reference, but lets keep this to a minimum for now.

    Signed-off-by: Olliver Schinagl

    (2024-02-04)


    hashtag
    Release: (2024-02-04)

    Fix audio-only timeshift memory usage

    (2024-02-03)


    hashtag
    Release: (2024-02-04)

    Remove sweep-ai again as it is not useful at all

    (2024-02-03)


    hashtag
    Release: (2024-02-03)

    Sanitise filename in content-disposition header

    (2024-02-03)


    hashtag
    Release: (2024-02-02)

    Configure Sweep (#1612)

    Co-authored-by: sweep-ai[bot] <128439645+sweep-ai[bot]@users.noreply.github.com>

    (2024-02-02)


    hashtag
    Release: (2024-02-02)

    Clean up Debian postinst and postrm scripts

    • Fix indentation

    • Remove unnecessary {} around variables

    • Double-quote all variables when assigned or used as arguments

    (2024-02-02)


    hashtag
    Release: (2024-02-02)

    Add stale-bot for issues/PRs needing more info

    (2024-02-02)


    hashtag
    Release: (2024-02-02)

    main: Warn about unexpected configuration location

    When using the --fork flag, and no user or config arguments are supplied, the configuration folder will end up with whatever the default daemon user has set, which is often /sbin set as the homedir.

    This is weird, but not 'wrong' per say. Lets warn the user that forking can have an unexpected side effect.

    Signed-off-by: Olliver Schinagl

    (2024-02-02)


    hashtag
    Release: (2024-02-01)

    Use sigaction() instead of signal()

    The behaviour of signal() is not consistent or defined when using it to set signal handlers (see "Portability" in https://man7.org/linux/man-pages/man2/signal.2.html). Previously we got away with this, but starting with GCC 14, using signal() apparently causes certain syscalls to be restarted after the signal is caught. One of these is the read() currently on line 63 of fsmonitor.c. The result is that read() doesn't return when the fsmonitor thread receives a signal, resulting in the thread never shutting down, resulting in TVHeadend hanging on any attempt to terminate it.

    Instead, use sigaction(), which has defined behaviour when setting signal handlers. Since invoking sigaction() requires several lines, a helper was added to tvh_thread.c to avoid code duplication.

    (2024-02-01)


    hashtag
    Release: (2024-01-31)

    Add timeshift support for audio-only channels

    (2024-01-31)


    hashtag
    Release: (2024-01-31)

    templates: add log section to bug_report.yml

    Signed-off-by: Christian Hewitt

    (2024-01-31)


    hashtag
    Release: (2024-01-30)

    Add missing Lithuanian string template (#1608)

    (2024-01-30)


    hashtag
    Release: (2024-01-28)

    ci: fix cloudsmith.sh & add to CI workflow

    (2024-01-28)


    hashtag
    Release: (2024-01-21)

    update to ffmpeg 6.1.1

    update to ffmpeg 6.1.1

    (2024-01-21)


    hashtag
    Release: (2024-01-11)

    descrambler: apply ICAM update from Chris230291

    (2024-01-11)


    hashtag
    Release: (2024-01-11)

    descrambler: avoid dlopen()

    (2024-01-11)


    hashtag
    Release: (2024-01-05)

    descrambler: support ICAM if detected in libdvbcsa

    (2024-01-04)


    hashtag
    Release: (2024-01-05)

    linuxdvb: add DVB-S2X parameters

    (2024-01-05)


    hashtag
    Release: (2024-01-01)

    ci: fix raspios detection in cloudsmith.sh

    Signed-off-by: Christian Hewitt

    (2024-01-01)


    hashtag
    Release: (2023-12-26)

    ci: rename build.yml to reduce confusion

    Signed-off-by: Christian Hewitt

    (2023-12-26)


    hashtag
    Release: (2023-12-18)

    Makefile.ffmpeg nvenc update

    FFNVCODEC_VER = 11.1.5.0 -> 12.1.14.0

    (2023-12-18)


    hashtag
    Release: (2023-12-13)

    Remove references to Tvheadend Foundation.

    (2023-12-13)


    hashtag
    Release: (2023-12-13)

    Transifex updates for project Tvheadend (#1587)

    • transifex: Translate tvheadend.js.pot in es

    100% translated source file: 'tvheadend.js.pot' on 'es'.

    • transifex: Translate tvheadend.js.pot in en_GB

    100% translated source file: 'tvheadend.js.pot' on 'en_GB'.

    (2023-12-13)


    hashtag
    Release: (2023-12-11)

    tfx: fix URLs in tvheadend/js files

    Signed-off-by: Christian Hewitt

    (2023-12-11)


    hashtag
    Release: (2023-12-06)

    ci: remove references to doozer

    Signed-off-by: Christian Hewitt

    (2023-12-06)


    hashtag
    Release: (2023-12-06)

    WebUI: Update donation string as a test to Transifex feed

    (2023-12-06)


    hashtag
    Release: (2023-12-06)

    ci: schedule weekly coverity scans

    Signed-off-by: Christian Hewitt

    (2023-12-06)


    hashtag
    Release: (2023-12-06)

    ci: add concurrency to the main CI workflows

    Signed-off-by: Christian Hewitt

    (2023-12-06)


    hashtag
    Release: (2023-12-06)

    ci: remove the test-compile workflow

    Signed-off-by: Christian Hewitt

    (2023-12-06)


    hashtag
    Release: (2023-12-06)

    ci: don't trigger cloudsmith on .github changes

    Signed-off-by: Christian Hewitt

    (2023-12-06)


    hashtag
    Release: (2023-12-01)

    ci update build config

    (2023-12-01)


    hashtag
    Release: (2023-12-01)

    gitignore: add debian/.debhelper folder

    (2023-12-01)


    hashtag
    Release: (2023-11-28)

    Fix builds on stretch

    (2023-11-28)


    hashtag
    Release: (2023-11-21)

    Add rpi-bookworm to targets

    (2023-11-21)


    hashtag
    Release: (2023-11-20)

    Update ffmpeg to 5.1.4

    (2023-11-20)


    hashtag
    Release: (2023-10-15)

    6310 Set 'okay' default to True

    (2023-10-14)


    hashtag
    Release: (2023-10-14)

    Removed nested function 'appendPidRange' from within function 'tvhdhomerun_frontend_update_pids' and converted it to a normal function 'tvhdhomerun_frontend_update_pids_appendPidRange'.

    Nested functions are a non-standard extension to C that may only be supported by the gcc compiler.

    (2023-10-14)


    hashtag
    Release: (2023-08-12)

    support/mkbundle: switch from distutils to setuptools

    Fixes build error with python-3.12:

    Traceback (most recent call last): File "support/mkbundle", line 48, in import distutils.spawn ModuleNotFoundError: No module named 'distutils'

    Signed-off-by: Bernd Kuhls

    (2023-08-11)


    hashtag
    Release: (2023-08-12)

    webui/dvr: Add age_rating in recording details dialogs

    The details dialogs in the various recording tabs do not open anymore with the error Uncaught TypeError: params[25] is undefined in the JS console as the age_rating wasn't requested for those, only for the overview columns.

    While we are at it lets also display the value in the same way the similar looking (but completely different implemented…) EPG dialog does.

    Regression-of: d501059995 Fixes: https://tvheadend.org/issues/6297

    (2023-08-11)


    hashtag
    Release: (2023-08-09)

    Fix bug #6293 – Missing EIT EPG Content Type

    (2023-08-09)


    hashtag
    Release: (2023-08-06)

    otamux: Make sure we use PRItime_t

    As %li isn't supported equally, we must ensure we always use PRItime_t.

    Signed-off-by: Olliver Schinagl

    (2023-08-06)


    hashtag
    Release: (2023-08-02)

    Add 'age rating' field to recording metadata

    (2023-08-02)


    hashtag
    Release: (2023-07-30)

    Fix time for 32bit systems again

    In issue #6257 an issue mentioning that time_t isn't properly supported when printing on 32-bit systems, specifically on FreeBSD. However, intel 32-bit systems suffer from a similar fate:

    src/rtsp.c:333:30: error: format '%ld' expects argument of type 'long int', but argument 4 has type 'time_t' {aka 'long long int'} [-Werror=format=] 333 | snprintf(buf, sizeof(buf), "npt=%" PRItime_t "-", position); | ^~~~~~~ ~~~~~~~~ | | | time_t {aka long long int}

    In commit 76a6263f1be4 ("fix for 64bit time_t on 32bit systems") was attempted to be fixed by turning it into a PRId64, which was reverted again in commit 9e1eb89be731 ("Revert "fix for 64bit time_t on 32bit systems""), sadly without a reason as to why in the commit message.

    We should however, migrate to 64bit timestamps on all platforms anyway, due to the Y2038 problem. Debian is heavily working on this issue too.

    This commit is just the first step, in that we ensure our time_t is always 64bits.

    (2023-07-30)


    hashtag
    Release: (2023-07-30)

    OTA Genre translation squashed v2

    (2023-07-30)


    hashtag
    Release: (2023-07-19)

    Bug Fix: OTA EIT Parental Rating

    (2023-07-19)


    hashtag
    Release: (2023-06-23)

    Fix spelling errors encountered during previous work

    (2023-06-23)


    hashtag
    Release: (2023-04-17)

    update to ffmpeg 5.1.3

    update to ffmpeg 5.1.3

    (2023-04-17)


    hashtag
    Release: (2023-04-02)

    tvhmeta: Fix tvhmeta authentication to the tvheadend API.

    Construct and add an Authorisation header to the request, when a username and password are provided to tvhmeta.

    This fixes #6260.

    (2023-04-02)


    While this behaviour is somewhat tolerable during live TV viewing—where the user can manually resolve the issue by changing channels—it is significantly more disruptive in recording scenarios, as it results in recordings containing only audio and no video.

    However, when the same streams are run directly through FFmpeg’s CLI, FFmpeg does not abort on these errors — it logs them and continues transcoding. This makes FFmpeg's failure handling more robust than Tvheadend's.

    To identify which errors should be considered recoverable, the transcoder was instrumented to log the exact AVERROR codes encountered during decoding failures. A stress test was then run using a channel-hopping script that switched channels every 5 seconds over several hours. The failure rate was approximately 1%, and in all cases, the decoding failures were either AVERROR(EIO) or AVERROR(EINVAL). Allowing the stream to continue after these specific errors proved effective — playback resumed, and only a minor picture glitch was visible at the affected frame, with no need to tear down the video stream.

    This patch updates tvh_context_decode() to include AVERROR(EIO) and AVERROR(EINVAL) in the list of tolerated decode errors, aligning Tvheadend's behaviour with FFmpeg’s more forgiving approach.

    FFmpeg’s internal decoder logic in vaapi_h264.c and decode.c supports this tolerance model. For example, in decode_simple_internal() and submit_frame(), errors like EIO may occur during av_hwframe_transfer_data() or vaEndPicture(), but are not considered fatal. Instead, FFmpeg logs the issue and decoding continues on the next frame.

    where combining strings like
    "en,fr,de"
    could approach the buffer limit of 32 bytes. While truncation is unlikely in practice, the warning is still emitted aggressively by the new FORTIFY logic.

    Increase the buffer from 32 to 64 bytes to silence the warning and ensure headroom. This avoids having to disable the diagnostic, while still keeping the logic and usage intact. This is a defensive fix with no behavioural change, and aligns with similar mitigations used in other projects facing the same issue with GCC >= 13 and especially 15+.

    Tested with GCC 15.1.1, built cleanly.

    Refs:

    • https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108231

    • https://gcc.gnu.org/onlinedocs/gcc-15.1.0/gcc/Warning-Options.html#index-Wformat-truncation

    av_channel_layout() is returning the length of the string ... we should use l_buf only when retuned value > 0 ... when is < 0 l_buf was not updated.

    show only VAAPI codecs advertised by vainfo

  • defined two invisible fields: ui and uilp used for UI enable/disable features

  • check if bitrate is greater than max_bitrate (fix to avoid tvh crash)

  • vp8, vp9 separate Global Quality from Quality

  • load quality and max B frames filters from vainfo

  • UI has several constrains or warnings implemented using vainfo

  • separated 'b_depth' from 'bf'

  • intl: Translate intl/js/tvheadend.js.pot in pl

  • 100% translated source file: 'intl/js/tvheadend.js.pot' on 'pl'.

    • intl: Translate intl/js/tvheadend.js.pot in pl

    100% translated source file: 'intl/js/tvheadend.js.pot' on 'pl'.

    • intl: Translate intl/tvheadend.pot in pl

    100% translated source file: 'intl/tvheadend.pot' on 'pl'.

    • intl: Translate intl/js/tvheadend.js.pot in pl

    100% translated source file: 'intl/js/tvheadend.js.pot' on 'pl'.

    • intl: Translate intl/tvheadend.pot in pl

    100% translated source file: 'intl/tvheadend.pot' on 'pl'.


    Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>

    Simplify quotes and escaping in creation of the superuser file

  • Remove needless variable assignments

  • Use $() for command substitution instead of ``

  • transifex: Translate tvheadend.js.pot in de

  • 100% translated source file: 'tvheadend.js.pot' on 'de'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate intl/tvheadend.pot in pl

    100% translated source file: 'intl/tvheadend.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate intl/tvheadend.pot in pl

    100% translated source file: 'intl/tvheadend.pot' on 'pl'.

    • transifex: Translate intl/tvheadend.pot in pl

    100% translated source file: 'intl/tvheadend.pot' on 'pl'.

    • transifex: Translate intl/tvheadend.pot in pl

    100% translated source file: 'intl/tvheadend.pot' on 'pl'.

    • transifex: Translate intl/tvheadend.pot in pl

    100% translated source file: 'intl/tvheadend.pot' on 'pl'.

    • transifex: Translate intl/tvheadend.pot in pl

    100% translated source file: 'intl/tvheadend.pot' on 'pl'.

    • transifex: Translate intl/tvheadend.pot in pl

    100% translated source file: 'intl/tvheadend.pot' on 'pl'.

    • transifex: Translate intl/tvheadend.pot in pl

    100% translated source file: 'intl/tvheadend.pot' on 'pl'.

    • transifex: Translate intl/tvheadend.pot in pl

    100% translated source file: 'intl/tvheadend.pot' on 'pl'.

    • transifex: Translate intl/tvheadend.pot in pl

    100% translated source file: 'intl/tvheadend.pot' on 'pl'.

    • transifex: Translate intl/tvheadend.pot in pl

    100% translated source file: 'intl/tvheadend.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.

    • transifex: Translate tvheadend.js.pot in pl

    100% translated source file: 'tvheadend.js.pot' on 'pl'.


    Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>

    The next steps would be to use difftime where possible instead of subtractions, and ensure all stored timestamps have room for 64bit time_t (htsmsg_get_u32_or_default for example breaks this presumption already).

    To keep this issue small, and tackle one problem at a time, lets just fix time_t first. We do still have 15 years to fix the other issues.

    Note, that this patch leaves out FreeBSD specifics, as it is unclear what is specific about 32bit FreeBSD. It should be using the same glibc headers after all. If not, we can always add if needed, but adding useless code doesn't help anyone generally.

    Signed-off-by: Olliver Schinagl [email protected]envelope

    GitHub commit details...arrow-up-right
    4.3-2431~gb9d34f913arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2430~gda9fa6032arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2428~ge065d661aarrow-up-right
    [email protected]envelope
    GitHub commit details...arrow-up-right
    4.3-2429~g5ff6128c7arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2427~gaaf31d964arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2426~gd1fb6da0aarrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2425~gd431956ccarrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2424~gbfcc00142arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2423~gea3d32791arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2422~g61d728e1aarrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2421~g730718c28arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2418~gf7edaf48carrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2419~g7bbbe57e9arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2420~g19026f320arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2417~g42ed6affcarrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2416~g09a06f11aarrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2414~gc4ce95ab9arrow-up-right
    [email protected]envelope
    GitHub commit details...arrow-up-right
    4.3-2412~gaadcc3a8darrow-up-right
    [email protected]envelope
    GitHub commit details...arrow-up-right
    4.3-2415~g56d23c872arrow-up-right
    [email protected]envelope
    GitHub commit details...arrow-up-right
    4.3-2410~g808a87a6aarrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2409~g0f74b0ab0arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2405~g8d469350farrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2408~g85360924darrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2406~g128854638arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2404~gc0c55c783arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2403~g532c2a71farrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2402~gede23be0darrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2401~g27b12a92darrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2400~g1a3ca885aarrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2399~g26a14aa31arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2398~g7e1f9caa9arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2397~gebac08749arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2395~g75119b6e9arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2396~g36ba82848arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2394~g7da199b61arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2393~g221400c9farrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2392~g03272650darrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2390~gcf2929259arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2388~gcebe61590arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2391~gbdec3c501arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2389~g13804ab50arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2387~gdf4eaf8e1arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2382~gda1ac73b9arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2379~gcc07e3471arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2386~gba243eaf3arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2378~gab81dce3earrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2380~g728885fbearrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2381~g0eea8a59farrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2375~g653bd0400arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2372~gb69dac929arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2374~g26ec161fbarrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2371~geee5cdadfarrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2370~g28de5c092arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2369~g05c3170aearrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2367~g9dec5b585arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2368~g55404da6carrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2366~g9ac57a0c1arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2364~g4aff54328arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2365~g2e92208c3arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2363~g18ff23f90arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2361~gdd82541c4arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2359~gfc5a1672earrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2360~g266d03527arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2358~gfacbd4e4barrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2357~g3bb78afa4arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2356~g267aef151arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2355~gf20e38daearrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2354~gadef81b8darrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2353~g76d8fc8bcarrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2352~g49ac93871arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2351~g078a822cfarrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2349~gb774bdd25arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2347~g1dc8ffe78arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2346~g457c02d30arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2344~gd2e41b553arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2343~g1644b6e15arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2342~g128d6861farrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2338~gfd61453daarrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2339~gcd6bfbb0barrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2340~gc8435a098arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2337~ge855f62e6arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2336~g366e56290arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2335~gf15f05761arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2327~ge6b1d5ffbarrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2326~g6c5c8eae4arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2334~g552f9414earrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2325~g3ac184725arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2324~g543236118arrow-up-right
    [email protected]envelope
    GitHub commit details...arrow-up-right
    4.3-2322~gc42043188arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2323~g73a6bd00darrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2321~gaba5e6079arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2320~gaaccc147earrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2319~ga68d340a8arrow-up-right
    [email protected]envelope
    GitHub commit details...arrow-up-right
    4.3-2318~gb10058507arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2317~g223f83b6earrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2316~g4874aaa31arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2314~gcbaf2b1dearrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2315~gab6ea89b1arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2313~gc63115464arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2312~g19c502b15arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2300~g1212b940barrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2299~g79aaa1434arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2298~ge287b2fc6arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2296~gba3b5e56farrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2295~g4d5166ca4arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2292~g9ac61d767arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2290~gae97d5bc5arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2291~ga9c6db8acarrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2289~g7e694e3c0arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2286~gae51d24fearrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2285~g8b429efb7arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2268~ga8f525f36arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2269~g9b88c2502arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2271~g7acca01c4arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2270~g60bd9dce6arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2266~ge02e812eearrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2258~gc7a63e7e3arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2264~gb8bd16726arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2265~g41a326bcearrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2267~g0d26809e3arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2256~gdf46dea35arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2254~gc3a7ce11carrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2257~g771504eb3arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2255~g595bbaad5arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2252~g4430ee70farrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2253~g2ca8a19e4arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2251~g2b0b6a4c4arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2229~g6b5defc76arrow-up-right
    [email protected]envelope
    GitHub commit details...arrow-up-right
    4.3-2228~gce429efe9arrow-up-right
    [email protected]envelope
    GitHub commit details...arrow-up-right
    4.3-2227~ga2ddd3066arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2226~gb91587037arrow-up-right
    [email protected]envelope
    GitHub commit details...arrow-up-right
    4.3-2225~g8bd13ca27arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2223~g6409a6382arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2224~g63c41acc6arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2222~g154cf25adarrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2213~gf12919042arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2212~gac4a041e0arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2215~g9b00888e3arrow-up-right
    [email protected]envelope
    GitHub commit details...arrow-up-right
    4.3-2211~g990b5a8f4arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2214~g5acf42462arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2210~g154b20228arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2207~gc7f46ec56arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2209~gb225e4d6carrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2206~g8ceb72f93arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2205~g0485cf470arrow-up-right
    [email protected]envelope
    GitHub commit details...arrow-up-right
    4.3-2204~g717056be0arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2203~gbcfbe7dbearrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2202~gaf5e2c962arrow-up-right
    [email protected]envelope
    GitHub commit details...arrow-up-right
    4.3-2201~g6229a74aaarrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2200~g212e85c91arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2193~gb7d5a1632arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2192~gc9b38a81aarrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2191~gb4b1cbd47arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2189~g899b38ae5arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2190~g2151348f7arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2188~gb40a62b31arrow-up-right
    [email protected]envelope
    GitHub commit details...arrow-up-right
    4.3-2187~gfd8b9e8baarrow-up-right
    [email protected]envelope
    GitHub commit details...arrow-up-right
    4.3-2186~g4825b8414arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2184~g3cf5acdc7arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2185~g0da7fc0b7arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2183~ga0bd2b359arrow-up-right
    [email protected]envelope
    GitHub commit details...arrow-up-right
    4.3-2171~gf96ea6493arrow-up-right
    [email protected]envelope
    GitHub commit details...arrow-up-right
    4.3-2175~gd85c957aaarrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2173~gb3ac61a01arrow-up-right
    [email protected]envelope
    GitHub commit details...arrow-up-right
    4.3-2172~g8b34c31f2arrow-up-right
    [email protected]envelope
    GitHub commit details...arrow-up-right
    4.3-2174~g49b095e18arrow-up-right
    [email protected]envelope
    GitHub commit details...arrow-up-right
    4.3-2169~g433cf8bbfarrow-up-right
    [email protected]envelope
    GitHub commit details...arrow-up-right
    4.3-2166~gae1ffbe57arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2167~g583de2330arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2162~gbdadcb8b2arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2161~gbc30a74dearrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2160~g2d963dab6arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2158~g2d92f58faarrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2157~g3d16edb0farrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2154~gec56067f4arrow-up-right
    [email protected]envelope
    GitHub commit details...arrow-up-right
    4.3-2153~g21911b5e3arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2151~g76ca76761arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2149~g17eebbef5arrow-up-right
    [email protected]envelope
    GitHub commit details...arrow-up-right
    4.3-2144~gd50105999arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2143~gfe47ecb55arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2142~g23263a54darrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2141~gc531383caarrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2139~g7b5c52697arrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2118~g8efac01dcarrow-up-right
    GitHub commit details...arrow-up-right
    4.3-2115~ga10f7ea44arrow-up-right
    GitHub commit details...arrow-up-right
    diff --git a/src/tvheadend.h b/src/tvheadend.h
    index c2fcee716..751d10d70 100644
    --- a/src/tvheadend.h
    +++ b/src/tvheadend.h
    @@ -334,7 +334,9 @@ void tvh_qsort_r(void *base, size_t nmemb, size_t size, int (*compar)(const void
     # endif /* ULONG_MAX */
     #endif /* __WORDSIZE */
    
    -#if __WORDSIZE == 32
    +#if __WORDSIZE == 32 && defined(PLATFORM_FREEBSD)
    +# define PRItime_t "d"
    +#elif __WORDSIZE == 32
     # define PRItime_t "lld"
     #elif __WORDSIZE == 64
     # define PRItime_t "ld"
     #else

    Release / Change Log

    hashtag
    Releases, Nightly Builds and Change Log

    • Update online help text ()

    • fix memory leak 3 - transcoding ()

    • Recognise checkbox for feature proposals properly ()

    • User's DVR Configuration profile not used when scheduling recordings via HTSP ()

    • remove coded_width and coded_height from encoding ()

    • Fix coverity builds ()

    • Add missing coverity env ()

    • intl: docs: change freenode to Libera.Chat ()

    • intl: js: change freenode to Libera.Chat ()

    • repo: cleanup README.md ()

    • repo: cleanup CONTRIBUTING.md ()

    • ci: disable coverity on forks ()

    • Coverity CID 552897 ()

    • Add API call 'status/activity'. ()

    • fix for video stream detection ()

    • fix dead error condition ()

    • fix memory leak 2 - transcoding ()

    • Fix recording thread freeze when unable to create unique file name. ()

    • fix memory leak - transcoding ()

    • add mpegts parameters from input stream ()

    • MKV Tags - Change rating label. Add Sub-title and Comment. ()

    • fix memory leak ()

    • video hw accel should only be applied for video streams ()

    • Update VAAPI transcoding as recommended by ffmpeg 6.1.1/doc/examples/… (#1792) ()

    • Add Sub-Title Processing Options for DVB OTA EPG ()

    • update audio abuffersink from deprecated channel_layouts to ch_layouts and deprecated FF_PROFILE_* --> AV_PROFILE_* ()

    • iptv: handle relative key URL ()

    • [Docker]: Tag alpine master as latest ()

    • Show recording file name ()

    • fix read/write of PT_DYN_INT ()

    • httpc.c: Fix HTTPS with OpenSSL 3.5 (#1813) ()

    • Global setting for 'Items per page' ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'en_GB' updated. ()

    • Translation for 'en_US' updated. ()

    • Fix crash when updating 'disp_summary' ()

    • Fix CI Builds 2/2 ()

    • Fix Cloudsmith uploads ()

    • Check for hidden fields before reading them. Fixes #1782. ()

    • iptv: allow to limit UDP ports for unicast inputs ()

    • Translation for 'en_GB' updated. ()

    • Translation for 'en_US' updated. ()

    • update libvpx v.1.14.1 ()

    • Fix - Audio transcoding not working #1663 ()

    • fixes #1733 ()

    • Remove HTSP client version test for rating labels and string UUIDs ()

    • Add full UUID to channel, chTag and dvrEntry. ()

    • Add country and authority to HTPS messages containing rating labels. ()

    • HTSP: deliver 'comment' with autorecEntry(Add|Update), timerecEntry(Add|Update). Allow setting 'comment' with 'updateDvrEntry'. ()

    • Fixup updating comment in _dvr_entry_update. Only overwrite existing title if comment is not NULL. Follows the same logic now as other updates done in this function. ()

    • bouquet: fix overzealous channel removals in merged multi-network setup ()

    • HTSP: Expose DVR configuration id in 'dvrEntryAdd', 'dvrEntryUpdate', 'autorecEntryAdd', 'autorecEntryUpdate', 'timerecEntryAdd', 'timerecEntryUpdate'. ()

    • HTSP: Expose broadcast type in 'autorecEntryAdd' and 'autorecEntryUpdate'. Handle broadcast type in 'addAutorecEntry' and 'updateAutorecEntry'. ()

    • Fix mapping HTSP field 'broadcastType' to internal field. Must be 'btype'. ()

    • Fix FTBFS introduced by 76d8fc8bc5455322558c764c84755ebbba254ad5 ()

    • Update Fedora versions for cloudsmith uploads ()

    • HTSP: Expose service provider name with channel information. ()

    • Update linuxdvb_satconf.c - lnb poweroff requires power save ()

    • Enforce issue templates on GitHub ()

    • Fix function passed to avio_alloc_context() (ffmpeg 7) ()

    • Replace deprecated channels/channel_layout ()

    • Translation for 'en_GB' updated. ()

    • Translation for 'en_US' updated. ()

    • Allow node16 for GitHub Actions ()

    • Add dependency for recent Fedora versions ()

    • Rework fullscreen request method detection ()

    • Refactor null value handling. ()

    • Remove tvheadend user on purge ()

    • Replace deprecated av_init_packet() ()

    • Replace deprecated interlaced_frame, top_field_first and key_frame ()

    • Remove useless NULL-assignment in http.c ()

    • Fix potential null-pointer dereference in muxer_mkv.c ()

    • Remove useless NULL-check in ratinglabels.c ()

    • Use safer htsmsg_add_str2 when copying de->de_directory ()

    • XMLTV: Rating Labels: Use 'NONE' when 'system' attribute is missing ()

    • dvr: Added missing directory to rerecord-entry ()

    • Extend CORS origin help/hover message ()

    • Make builds parallel and add bookworm and ubuntu 24.04 builds ()

    • Update x265 to 3.6 ()

    • Add current pcloud cert ()

    • Update nasm ()

    • Update libx264 ()

    • Update libogg and libfdkaac ()

    • Always compile x265 as PIC ()

    • tvhdhomerun: Add ISDB to type check in tvhdhomerun_device_create ()

    • Correct M3U playlist logo tag ()

    • Fix echo target for superuser file in Debian postinst ()

    • Properly escape json in setup ()

    • satip: Ignore additional parameters ()

    • Update WebUI to allow debug/trace subsystem selection from a list. ()

    • Add subsystems to JSON API. ()

    • Fix detection of unknown version numbers in support/version ()

    • webui: Fix year being replaced incorrectly when using custom date format ()

    • Update manpage ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Update README.md ()

    • CI: remove NODIRTY option as those builds may be dirty ()

    • Create special tvheadend-armv6l and tvheadend-dbg-armv6l packages ()

    • Improve armv6l-packages and remove various outdated references/commands ()

    • Revert accidental package renaming ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • update to libvpx 1.14.0-patch ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • ci: added more info logging to cloudsmith.sh ()

    • Improve autorec duplicate handling ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Replace broken links, update copyright year ()

    • Add OpenCollective donate link to Wizard ()

    • Give comment-on-labels.yml permissions to write to PRs ()

    • ci: change CLOUDSMITH_OWNER from a var to a secret ()

    • Make sure we spawn the best matching executable and not the first match ()

    • Fix Auto-PR comment on squash-label ()

    • Run enforce-pr-rebase whenever a PR is updated ()

    • Add some ERRNOs for DVR & Config ()

    • Show SeriesLink for AutoRecs ()

    • Replace poison memset by memset_s to avoid compiler optimising it out ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • ci: Enforce rebasing PRs before merging ()

    • Replace single-bit signed integers with unsigned integers ()

    • Add missing htmsg_destroy() call in hdhomerun_server_discover ()

    • Add support for 12-hour custom date formats ()

    • Add missing tvheadend-prefix in JS file ()

    • Shorten time for stale issues before a warning is applied ()

    • ci: Use correct version of merge commit block action ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Remove broken codeball ()

    • Add automatic labels to PRs ()

    • docs: Fix broken Readme.md badge for builds ()

    • ci: Block merge or autosquash commits in PRs ()

    • intl: update translation templates from code ()

    • ci: use CURL for cloudsmith.sh and enable RPM upload ()

    • CI: Ensure we clone the whole repo ()

    • transcoding: access the codec name only when codec pointer is valid ()

    • dvr: Fix incorrect usage of strerror (

    • Correct description of Change Parameters flag ()

    • Translation for 'pt' updated. ()

    • Translation for 'pt' updated. ()

    • Translation for 'pt' updated. ()

    • Translation for 'pt' updated. ()

    • Translation for 'pt' updated. ()

    • Translation for 'pt' updated. ()

    • Translation for 'en_US' updated. ()

    • descrambler: Fix Sky-UK descrambling ()

    • Sanitise filename in content-disposition header ()

    • Fix audio-only timeshift memory usage ()

    • Automatically comment on PRs needing squash ()

    • Mark PRs needing squashing as stale after a while ()

    • Remove sweep-ai again as it is not useful at all ()

    • Add stale-bot for issues/PRs needing more info ()

    • Configure Sweep (#1612) ()

    • templates: add log section to bug_report.yml ()

    • Add timeshift support for audio-only channels ()

    • Add missing Lithuanian string template (#1608) ()

    • ci: fix cloudsmith.sh & add to CI workflow ()

    • src: filesystem permission fixes ()

    • ci: fix broken cloudsmith python ()

    • templates: add config.yml ()

    • templates: add bug_report.yml ()

    • templates: add feature_proposal.yml ()

    • ci: fix cloudsmith for python3.5 ()

    • update to ffmpeg 6.1.1 ()

    • descrambler: avoid dlopen() ()

    • descrambler: apply ICAM update from Chris230291 ()

    • linuxdvb: add DVB-S2X parameters ()

    • descrambler: support ICAM if detected in libdvbcsa ()

    • ci: fix raspios detection in cloudsmith.sh ()

    • ci: rename build.yml to reduce confusion ()

    • Makefile.ffmpeg nvenc update ()

    • Remove references to Tvheadend Foundation. ()

    • tfx: fix URLs in tvheadend/c files ()

    • tfx: fix URLs in tvheadend/docs files ()

    • tfx: fix URLs in tvheadend/js files ()

    • webui: change donation button to opencollective ()

    • webui: remove old doc references to paypal ()

    • github: add FUNDING.yml with OpenCollective link ()

    • Update copyright year and correct current surname ()

    • hdhomerun: Add HDHomeRun server support for LiveTV only (#4461) ()

    • ci: don't trigger cloudsmith on .github changes ()

    • ci: remove references to travis ()

    • ci: remove references to doozer ()

    • ci: add concurrency to the main CI workflows ()

    • ci: schedule weekly coverity scans ()

    • ci: remove the test-compile workflow ()

    • WebUI: Update donation string as a test to Transifex feed ()

    • Add Parental Rating Labels ()

    • ci update build config ()

    • gitignore: add debian/.debhelper folder ()

    • update ffmpeg to 6.0.1 ()

    • update x264 to c196240 ()

    • update libvpx to 1.13.1 ()

    • Fix builds on stretch ()

    • Add rpi-bookworm to targets ()

    • Update ffmpeg to 5.1.4 ()

    • Correct handling of Remove and Ignore settings ()

    • Removed nested function 'appendPidRange' from within function 'tvhdhomerun_frontend_update_pids' ()

    • 6310 Set 'okay' default to True ()

    • Fix htsstr_argsplit (treat quotes inside an argument correctly) ()

    • support/mkbundle: switch from distutils to setuptools ()

    • Fix bug #6293 – Missing EIT EPG Content Type ()

    • Fix some build and add more targets ()

    • otamux: Make sure we use PRItime_t ()

    • CI: Run the full build with cloudsmith only on master ()

    • Add 'age rating' field to recording metadata ()

    • OTA Genre translation squashed v2 ()

    • Bug Fix: OTA EIT Parental Rating ()

    • Revert non-portable function to previous code ()

    • Fix configuration-loading logic to account for forking operation ()

    • Fix spelling errors encountered during previous work ()

    • Fix portability: Do not use linux/limits.h ()

    • config: Deal with configuration before anything else ()

    • Fix Fedora CI build ()

    • Disable broken codeball ()

    • Update config for Fedora 37/38 ()

    • Add Fedora RPM build to Github Actions ()

    • dvr_rec: Fix a buffer overflow in filename generation ()

    • update to ffmpeg 5.1.3 ()

    • tv_meta_tvdb.py: Fix 'language' typo. ()

    • Remove references to CLA which is no longer available ()

    • tvhmeta: Fix tvhmeta authentication to the tvheadend API. ()

    • updated 'AVCodec' to 'const AVCodec' ()

    • remove deprecate struct vaapi_context and the vaapi.h ()

    • Remove deprecated get_best_effort_timestamp() call ()

    • remove ffmpeg component avresample ()

    • update to ffmpeg codecpar ()

    • iconv: Allow using GNU libiconv ()

    • Revert "fix for 64bit time_t on 32bit systems" ()

    • fix for 64bit time_t on 32bit systems ()

    • Don't attempt to approve PRs automatically ()

    • update vaapi ()

    • update NASM to 2.16.01 ()

    • Codeball should also label PRs that need review ()

    • RTSP redirect support fix and moved to http client ()

    • Fix for DVB Grabber and IPTV Stream ()

    • Use codeball for PRs ()

    • update to ffmpeg codecpar ()

    • update ffmpeg from 4.4.1 to 4.4.3 ()

    • update vaapi ()

    • Revert "Update debian/compat to version 10" ()

    • Ignore title mismatch if dup checking by CRID ()

    • Add descriptions to the existing Unicable configuration fields ()

    • Unify names and order of Unicable-specific configuration fields ()

    • Add configurable delays after Unicable operations ()

    • Unify power up time range to 10-500 ms ()

    • Unify command time range to 10-300 ms ()

    • descrambler: cosmetic cleanups, more CAID logs ()

    • descrambler: cclient: optimisation for multiple key clients ()

    • descrambler: cccam - simplify cccam_handle_keys() ()

    • descrambler: cccam: move send keepalive message to traces ()

    • descrambler: cwc: Fix the additional card registration (mgclient option in oscam) ()

    • descrambler: cwc: do not register bad provider numbers for betacrypt and irdeto ()

    • grammar: Replace "then" with "than" ()

    • updated function _video_filters_get_filters() ()

    • remove libavresample from build scripts ()

    • Add autorec duplicate handling default to dvr config. ()

    • Add amd64 jammy to builds ()

    • Build for kinetic instead of impish ()

    • Allow old builds to pass ()

    • Fix a few more builds, add kinetic support ()

    • Don't fail on strict aliasing violations ()

    • Remove variable declaration from for-loop ()

    • Don't confuse GCC with zero-length array ()

    • Add South Africa to Countries list. ()

    • dvb_psi_pmt: Recognise AC-4 audio descriptor ()

    • config: Enable HbbTV parser by default ()

    • Build various targets and prepare new repository (#1476) ()

    • Use application/json instead of text/x-json as mimetype ()

    • Serve static html files with mimetype text/html ()

    • Don't crash the wizard if tvh has no inputs (

    • Don't call epg_broadcast_set_description twice ()

    • Reduce ADTS header size for better compatibility ()

    • Remove always-true checks ()

    • Increase maximum ADTS packet size to match FFMPEG ()

    • Attempt to fix profile sharer memory leak ()

    • Fix bad mono2sec usage ()

    • Fix race condition/data corruption in imagecache ()

    • Fixed typo ()

    • Close FDs even if no UDP connection is used ()

    • Revert 4355488b8e1e868cb434bf95676c0944b44e88b3 ()

    • Fix typo ()

    • Attempt to fix HBBTV memory leak ()

    • Update regexps for the finnish EIT scraping ()

    • mpegts dvb: Add support for LCN for provider DigiTV ()

    • Avoid leaking iptv fd's ()

    • Ignore PCRE2 illegal accesses ()

    • Fix potential memory leak ()

    • output: UDP streaming ()

    • Added support for ATSC text mode == 0x3F ()

    • Fix crash when mpegts_service_refresh tries to open the CAT again ()

    • Fix FTBFS introduced by 86f3617c8972c5362e51cee7d34cc2d69d799126 ()

    • Allow network scan to modify muxes ()

    • Regexps for the finnish EIT scraping ()

    • extending the regexps for the italian EIT scraping ()

    • No longer use git-protocol ()

    • add Access-Control-Allow-Headers content-length ()

    • Update Copyright year ()

    • Add HMF_UUID to htsmsg_binary_write ()

    • Use GitHubs CI for Building ()

    • GitHub actions improvements ()

    • Travis CI is dead, use GitHub actions for badge ()

    • Fix potential null-pointer-dereference ()

    • Remove useless null-check on an array ()

    • Prevent deadlock-detector leaking memory ()

    • Fix FTBFS in utils.c ()

    • Always parse 'src' in RTSP-requests ()

    • SAT>IP client: UPnP header field names are case insensitive ()

    • Update Python shebangs to python3 ()

    • Fix sid doozer build ()

    • Fix doozer CentOS build ()

    • More doozer build fixes ()

    • Add --nowerror to build for RPM packages ()

    • Fix some failing builds ()

    • Fix doozer builds ()

    • Doozer fixes ()

    • Update RPM to python3 ()

    • epg: ignore past events when matching on eid ()

    • Changed debian package version to 7 ()

    • Update buffer size for h264 and hevc ()

    • doozer: Migrate to Fedora 34 and 35 ()

    • Fix failing builds again ()

    • Episode number regexp ()

    • Fix some issues introduced in #0165f365cd58bbcc3734e4ec9ce696b42870ff8e ()

    • Fix "as: invalid option" during libvpx compilation ()

    • configure: add execinfo option ()

    • Update Makefile.ffmpeg ()

    • some changes to nvenc ()

    • Check the return code of snprintf in utils.c:rmtree ()

    • Fixed parsing w_scan format ()

    • Revert "Remove unnecessary conversion" ()

    • Add support for SCT_RDS ()

    • Expose RDS flag via HTSP. ()

    • Remove unnecessary conversion ()

    • Upgrade to libhdhomerun_20210624 ()

    • Fix ffmpeg jessie build error ()

    • Doozer.io: Add build targets for Debian, Bullseye & Sid ()

    • Autobuild: Add arm64, armhf and armel for bullseye and buster. ()

    • Attempt to fix trusty and centos builds ()

    • Attempt to fix jessie build ()

    • Attempt to fix jessie build ()

    • Fix slow loading bandwidth monitor graph in status tab ()

    • As we no longer have access to #hts on freenode swap to using libera - see https://tvheadend.org/issues/6054 ()

    • Add NVIDIA Hardware accelerated decoding for transcoding ()

    • Fix EN50211 size for large messages ()

    • Allow PMT Parsing when PMT shares a PID with another table ()

    • Fix missing } from previous commit ()

    • Update ffmpeg to 4.4 ()

    • else is missing ()

    • seen is a unsigned type ()

    • SAT>IP-Client: Add option for 16, 24 and 32-channel DVB-C tuners ()

    • Update profile.c ()

    • specified the value on each line ()

    • Delete .DS_Store ()

    • Delete .DS_Store ()

    • Delete .DS_Store ()

    • Update .gitignore ()

    • Improve Readme.md file with a more visual approach ()

    • Move travis builds from trusty to bionic ()

    • Fix possible deadlock ()

    • Update libssl-dependency information ()

    • Add pid file hint for systemd-sysv-generator ()

    • remote timeshift: fix compilation with IPTV disabled ()

    • Upgrade to libhdhomerun_20210224 ()

    • remote timeshift: fix crash on multiple subscriptions and cleanup ()

    • Reset error counters for IPTV on start, issue #5760 ()

    • Try to fix error during compilation ()

    • Fix possible NULL-Pointer-reference ()

    • EMM patch ()

    • Fix issues identified by coverity ()

    • Attempt to fix nvenc encoding ()

    • Rewrite scanfile.c for dynamic memory allocation (#1387) ()

    • Fix uninitialised memory access for several ioctl commands (#1382) ()

    • Add accidentally deleted line again ()

    • Enable LIBX265_DIFFS again ()

    • Silence more x265 warnings ()

    • Move from travis-ci.org to travis-ci.com and update date ()

    • Remove link to bintray as they will shutdown in 2 weeks ()

    • Fix several issues discovered by coverity ()

    • More coverity fixes ()

    • Fix crash when using matroska profile ()

    • Fix more issues identified by coverity ()

    • Fix too small memory allocation ()

    • Upgrade to libhdhomerun_20200907 ()

    • Added ISDB-T SATIP Support ()

    • Add ISDB-T in hdhomerun ()

    • Fix possible deadlock when using tvh_mutex_trylock() ()

    • Sat>IP clear old signal info when opening new stream ()

    • Remove libva-x11 dependency ()

    • docs: fix simple typo, separately -> separately ()

    • in python 3, dict.has_key() has been removed ()

    • Correct Environment variable name. ()

    • Changed shebang of tvhmeta to python ()

    • Use https for downloading ffmpeg and update nv-codec-headers ()

    • Add removed checksum ()

    • Silence x265 warnings (#1368) ()

    • Change no_sanitize("thread") attributes ()

    • Adding polish scraper for DVBC ()

    • Fix #5962 ()

    • Attempt to fix focal build in doozer ()

    • Make focal use python3 for upload ()

    • Fix vaapi patch ()

    • Fix cut & paste error in api/epg. (#1360) ()

    • Remove wrong test in nvenc.c ()

    • Revert dca46eedd9653b90d2722e67281eed0b35740730 ()

    • Upgrade to libhdhomerun_20200521 ()

    • Fix TheTVDB Query ()

    • Revert "HTSP v35: Add support for recording file size" (#1352) ()

    • HTSP v35: Add support for recording file size ()

    • Attempt to fix doozer build/python2/3 detection ()

    • Replace long by int64_t in json parser, fixes #5844 (#1349) ()

    • see https://tvheadend.org/issues/5722 ()

    • Report AAC and AAC-LATM correctly. Always raw stream AAC audio as audio/aac. ()

    • Additional sanity check ()

    • Fix memory leak ()

    • xmltv: add program icon to exported xmltv. Fixes: #5685 ()

    • Allocate space for buf on heap (modified PR #1324) ()

    • Allocate space for buf on heap (modified PR #1324) ()

    • Fix infinite loop when parsing invalid EIT CRID data ()

    • Fix building with -fno-common (default from GCC 10) ()

    • Add python3 requests dependency ()

    • Change nv-codec-headers path, fixes #5901 ()

    • Update Copyright date on UI 'About' screen. ()

    • dvbpsi: Fix build when DVB is not enabled at all ()

    • Changed default .pid path from /var/run/tvheadend.pid to /run/tvheadend.pid to follow "new" FSH 3 standard ()

    • Fix doozer builds ()

    • Fix doozer builds ()

    • Drop focal i386 support ()

    • Use python3 if available ()

    • Attempt to fix doozer builds (#1340) ()

    • Deprecate python2, add support for python3 (#1338) ()

    • Move forward from cosmic to focal ()

    • Prevent buffer overflow, fixes #5896 ()

    • Fix buffer overflow ()

    • Use python3 on focal ()

    • Update copyright and packages link ()

    • Move from cosmic to focal (#1337) ()

    • Upgrade to libhdhomerun_20200225 ()

    • Use HTTPS for libhdhomerun download ()

    • Fix the query URL for IMDB website. (#1327) ()

    • HTSP v35: Add support for recording file size ()

    • esstream: fix NULL dereference in elementary_set_filter_build(), fixes #5787 ()

    • Fix #5782 ()

    • capmt: fix the input filter ()

    • service: fix the default return value for service_get_source() ()

    • mpegts service: fix the build without mpegts_dvb (see PR#1321) ()

    • satip client: try to fix the missing poll file descriptor removal, issue #5496 ()

    • docs: add hint on shell redirections (#5761) ()

    • htsstr: add htsstr_argsplit() test ()

    • htsstr: fix the wrong argument parsing, fixes #5761 ()

    • tvhpoll: add event helpers, code cleanups ()

    • Remove dead assignment ()

    • tvhpoll: add tvhpoll_set_trace() ()

    • xmltv: Fix xmltv_ns typo, fixes #5720 ()

    • Webui: minimal reworks for access theme ()

    • webui: m3u playlist - mark tag playlists with type=playlist, fixes #5663 ()

    • access.h: reorder access_t (format members) ()

    • access: allow to change/set xmltv/htsp output format per matched entry ()

    • dvr: fix the DVR limit per user condition (subtract self) ()

    • access: added missing break for connection limit type ()

    • satip client: SATIP Kathrein & Triax: Avoid mandatory rolloff on DVBS2, fixes #5517 ()

    • satip client: allow to set the rolloff to all possible combinations ()

    • api: return EPERM for the empty arguments, fixes #5755 ()

    • tvhdhomerun: fix the cablecard access in tvhdhomerun_frontend_monitor_cb() ()

    • Fix division by 0, fixes #5754 ()

    • dvb psi: fix the removed MPEG2VIDEO assignment, fixes #5752 ()

    • mux grid: enable 'hide: parent disabled' ()

    • dvb psi: add 0x87 estype as EAC3 (ATSC), fixes #5684 ()

    • bugfix for autorecs duplicate episode number detection in autorecs ()

    • autobuild: add build target for raspbian-buster ()

    • channels: Make const-correct. ()

    • htsp: Allow basic htsp format, fixes #5630 ()

    • xmltv: Avoid outputting lang tags in xmltv for only one language, fixes #5630 ()

    • Added patch to HDHomerun library to allow cross-compilation ()

    • tvhcsa: shift the standard headers to top ()

    • Mux scan: Log correction ()

    • Upgrade to libhdhomerun_20190621 ()

    • systemd service file: remove wildcard mounts preventing startup - replace with a note ()

    • Fixed bad quality for vaapi transcoding h264 and hevc with bitrate ()

    • packaging: add missing DEBHELPER placeholder to postrm script ()

    • linuxdvb: fix integer overflow on 32-bit platforms ()

    • iptv: fix integer overflow on 32-bit platforms ()

    • linuxdvb: take in account similar dmx for the exclusive tuner access, fixes #5744 ()

    • api: fix the wrong negative error codes, fixes #5743 ()

    • satip client: add ATSC- string parsing, issue #5728 ()

    • linuxdvb: do not mix DVBv3/v5 stats, it causes trouble to drivers, fixes #5625 ()

    • add FHD quality support ()

    • service: correct fhdtv/uhdtv height checks ()

    • bouquet: fix overflow when building for 32-bit system On 32-bit system hash value from service can be truncated. ()

    • man page: Correct default values for http and htsp port ()

    • linuxdvb: compilation fix, fixes #5739 ()

    • cclient: more ECM PID fixes, reorder code to be more readable, fixes #5659 ()

    • cclient: mark correctly ECM PID for close, fixes #5659 ()

    • cclient: fix the ECM PID flag for newcamd and cccam, fixes #5659 ()

    • Include stdio.h before tvheadend headers ()

    • Makefile: fix -pie linking according to --disable-pie ()

    • Fix compilation with libhdhomerun 20190621 ()

    • linuxdvb: fix signal status monitor ()

    • mpegts: use 32-bit tsid/onid to define the NONE /unset/ state properly ()

    • revert bogus ONID and TSID remapping ()

    • capmt: another compilation fix, fixes #5661 ()

    • capmt: fix compilation with recent gcc, fixes #5657 ()

    • capmt: fix for the oscam r11520+, fixes #5649 ()

    • fanart: Fix decode error. ()

    • en50221: fix invalid htsmsg manipulation ()

    • en50221: fix menu text decoding ()

    • dvbpsi: fix the freesat bouquet update (inverted condition), fixes #5572 ()

    • api: return an error when incomplete query is passed, fixes #5568 ()

    • linuxdvb: create the mux instances also for the slave tuners, issue #5128 ()

    • linuxdvb: use the right configuration root for the slave tuners (loading), issue #5128 ()

    • Freesat_huffman: Suppress characters < 0x20 except \n. ()

    • Update to newest ffmpeg to fix libX11 compile issue "DSO missing from commandline" ()

    • Add sat longitude and usals angle as parameters to the rotor external command ()

    • http server: fix digest MD5 authorization, fixes #5573 ()

    • utils: sbuf - use correct format character, fixes #5565 ()

    • SAT>IP: fix done - close sessions only when server is active ()

    • eit: fix the possible NULL dereference ()

    • utils: cosmetic fix for sbuf_alloc_fail ()

    • freesat bouquet parser: fix endless loop (double list insert), fixes #4851 ()

    • tvh thread: increase the default watchdog timeout to 15 seconds ()

    • mpegts: fix the idle scan (use another idle scan queue - fixes #5548) ()

    • systemd: service/unit should not be started until after file-systems are mounted - this avoids "file missing" errors ()

    • Prevent rebinding when refreshing SAT-IP Server settings and not changing port, fixes #5539 ()

    • tvh-json.py: the list is returned instead dictionary ()

    • iptv: another improvement in the thread exit procedure, fixes #5550 ()

    • iptv: improve the thread exit procedure, issue #5550 ()

    • iptv: improve the thread exit procedure - use pipe, fixes #5550 ()

    • satip client: fix the compilation, fixes #5547 ()

    • satip client: initialise variable _w correctly for the PIDs split rewrite, fixes #5544, issue #5549 ()

    • satip client: improve the PIDs split for the PLAY RTSP command, fixes #5544 ()

    • Triax & Kathrein: Increase pid length, issue #5544 ()

    • satip client: fix for the PIDs split - missing delpids, issue #5544 ()

    • mpegts: pid subscription - fix wrong mps_type mpegts_mps_cmp(), fixes #5492 ()

    • http server: fix the new digest hashes (apparently firefox nor chrome do support them) ()

    • mpegts input: fix the compilation error, fixes #5492 ()

    • http: digest - show the SHA hash as an authentication alternative (tested with curl) ()

    • http: digest - return back MD5 as only digest hash (multiple login dialogs for firefox/chrome) ()

    • http: digest - do not use EVP_sha512_256() for nonce, check openssl version ()

    • satip client: workaround for FritzBox 6490/6590 (status string parsing), rewritten PR#1256 ()

    • Fix description of RTP/AVP/TCP Mode ()

    • Added compatibility mode for SAT-IP tuners that mess up tuner numbers, for example FritzBox 6490/6590 ()

    • http server: add support for SHA-256 and SHA-512/256 digest hashes ()

    • esfilter: fix the wrong other mask (hbbtv), fixes #5531 ()

    • esfilter: cosmetic fix ()

    • channel: get number - select the lowest service number, fixes #5441 ()

    • descrambler: simplify some destroy sequences ()

    • dvb psi: fix hbbtv parsing, fixes #5531 ()

    • m3u: fix the NULL dereference if the input string cannot be converted to utf-8, fixes #5525 ()

    • WebUI: Update copyright year ()

    • CSS: Fixes ()

    • Update posix.mk ()

    • Kathrein EXIP: Add default config (SATIP) ()

    • dvr: Add {min,max}season and {min,max}year to autorec UI, fixes #5479 ()

    • Changes to make tvheadend work in a container while talking to HDHomerun ()

    • Assign a different port number for each frontend thread ()

    • Avoid caching HDHomeRun's IP address ()

    • Move HDHomeRun config fields into their own group in the UI ()

    • Log an error message if the configured IP address is invalid ()

    • Corrected local_ip description text ()

    • satip server: parse destination for RTP/AVP transfer ()

    • satip client: fix the network limit/group description ()

    • satip server: add icon files, fixes #5268 ()

    • eit: fix UK Cable Virgin configuration, fixes #5499 ()

    • eit: config - fix the json syntax error, fixes #5503 ()

    • mpegts dvb network: fix create mux - wrong class used for comparison (since commit dbee3d2049faa7d5e15374ddef37a91e86768b26), fixes #5486 ()

    • server.h: cleanups for TSS_ flags ()

    • mpegts input: change mpegts_input_tuning_error() to more universal mpegts_input_error() ()

    • mpegts network: stop all running muxes when the network was disabled by the user, fixes #5497 ()

    • http: CORS - add Access-Control-Allow-Credentials header for cookies ()

    • http: CORS - small optimisation ()

    • mpegts: add possibility to enable/disable network ()

    • otamux: fix the 15 seconds delay for the initial scan ()

    • service: enlist - use also is_enabled callback to check the network/mux enable state ()

    • iptv auto network: check the network enabled flag for the auto download ()

    • parse_ac3: avoid the endless loop for the AC3/EAC3 auto-detection, issue #5353 ()

    • Makefile.ffmpeg: upgrade ffmpeg to 4.1, x264 to 20190108, x265 to 2.9 ()

    • doozer: remove OOL Fedora 27 ()

    • otamux: fix NULL dereference, fixes #5488 ()

    • epggrab: reimplement the OTA grabber selection per mux ()

    • epg: add auto-ota-module detection ()

    • DVR: add utf8 validator for title/subtitle when cut ()

    • avahi: try to fix double free, fixes #5484 ()

    • eit: always prefer master rather than slave for the config, issue #5247 ()

    • main: Replace deprecated ERR_remove_state ()

    • CSS: Fix height % ()

    • Add missing !DOCTYPE html ()

    • Fix several errors detected by w3c css validator ()

    • api: Alternative showings match on title if no series link, fixes #5402 ()

    • ui: Make dialogs slightly bigger. ()

    • xmltv export: add LCN to the display-name attribute, fixes #5471 ()

    • cosmetic fixes and optimisations ()

    • satip client: fix the ATSC-C (Annex B) parameters, fixes #5447 ()

    • satip client: remove the dual condition for Annex B ()

    • xmltv: add support for the lcn tag, fixes #5471 ()

    • eit: try to fix the freesat issue, fixes #5247 ()

    • eit: another attempt to fix the freesat issue (slave eit), fixes #5247 ()

    • eit config: fix the uk_freesat_eit description, issue #5247 ()

    • pass muxer: fix the incorrect section length for EIT table, fixes #5418, issue #5062 ()

    • htsp server: use HTTP image URLs for image cache for older clients (pvr.hts), fixes #5455 ()

    • teletext: fix the subtitle parser (wrong SCT_ type match), issue #5422 ()

    • imagecache: fix the missing ref initialisation, fixes #5458 ()

    • hdhomerun: auto detect DVB_T devices ()

    • imagecache: the timer function is already called inside imagecache_lock (sorry), fixes #5458 ()

    • Revert "dvr: move dvr_notify() call to the global_lock using timers, fixes #5437" ()

    • imagecache: do not use global lock, fixes #5453 ()

    • Fix mpegts packet length in descrambler_data_key_check ()

    • caclient: handle correctly connection close / read error, fixes #5445 ()

    • mpegts: fix mpegts_service_find_e2() for atsc-t ()

    • cclient: check keep-alive also when no poll event occurs, fixes #5445 ()

    • satip server: fix ATSC-T / Annex B cable frequency parsing, fixes #5447 ()

    • api: add id=all for the connections/cancel, issue #4937 ()

    • webui: add "drop all connections", fixes #4937 (original request only) ()

    • webui: status - drop all connections - use new id=all call, fixes #4937 ()

    • added linudvb_rotor_external to control an actuator by spawning an external command ()

    • linuxdvb: satconf - cleanups for the rotor external command ()

    • xmltv import: fix the wrong end-of-string mark (off-by-one), fixes #5443 ()

    • dvr: move dvr_notify() call to the global_lock using timers, fixes #5437 ()

    • tvh thread: do not crash when mutex==NULL (magic check failed), fixes #5435 ()

    • satip server: use strempty() function for the uuid check, fixes #5434 ()

    • dvb psi pmt: change the teletext subtitle handling for multiple teletext descriptors, issue #5422 ()

    • iptv: remove double pcr: from traces ()

    • htsp server: fix the wrong htsmsg destroy introduced in the imagecache patch, fixes #5430, fixes #5431, fixes #5429 ()

    • tvh thread: remove wrong commit code ()

    • dvr: fix the real_start variable misuse, fixes #5426 ()

    • satip client: fix the double (and wrong) sf_last_data_tstamp update, fixes #5374 ()

    • iptv http: call iptv_input_mux_started(), move recv_flush to http-header back ()

    • mpegts input: add CC restart for tables, too ()

    • sbuf: add sbuf_replace() ()

    • iptv http: remove the wrong si rewrite code, cleanup the free sequence ()

    • dvb psi lib: add dvb_table_parse_reinit functions ()

    • remove debug code (added by mistake) ()

    • imagecache: do not update the accessed field too much ()

    • profile: add more doc to the pass rewrite fields ()

    • imagecache: increase the save access threshold again ()

    • iptv: add missing lock to the iptv_http_kick_cb, fixes #5415, issue #5353 ()

    • iptv: correction for the previous patch, fixes #5415, issue #5353 ()

    • iptv: http - do not clear the input sbuf in the kick callback ()

    • iptv: http - fix the compilation problem with the previous patch ()

    • mpegts: do not set wrong pls code for bouquet rescan ()

    • main: fix compilation without traces ()

    • http: add auth type detection ()

    • http server: remove wrong aa_auth check from page_srvid2, fixes #5416 ()

    • http: fix the wrong return value (previous patch) ()

    • tvh thread: fix print other mutexes for abort ()

    • Makefile.ffmpeg: add crypto protocol for crypto+http (hls) ()

    • tprofile: fix possible division by zero ()

    • timers - change locking schema, fixes #5413, issue #5353 ()

    • timers: little fixes ()

    • tvh_thread: print filename/lineno for the magic failure when appropriate ()

    • profile: do init for all profile sharer members, issue #5409 ()

    • ui: Enable scrollbar for dialog info, fixes #5405 ()

    • ui: Fix background image to not accept clicks (#5405). ()

    • htsp_server: init htsp_out_mutex ()

    • Don't warn on packets with small/no payload. ()

    • fix some problems detected by cppcheck, issue #5353 ()

    • iptv http input: play with the locking, issue #5353 ()

    • tvh thread: add mutex magic check routines ()

    • main: add gtimer/mtimer magic checks ()

    • dvr: move the initial dvr_autorec_purge_obsolete_timers() call to better place, fixes #5406 ()

    • freebsd: Fixup header files for socket definitions. Make thread owner conditional on Linux. ()

    • Maximize use of libdvbcsa's batch processing. ()

    • wizard: spruce it up a bit ()

    • Reduce DESCRAMBLER_MAX_KEYS from 64 to 8, fixes #5400 ()

    • tvh_thread: show also waiters ()

    • tvhcsa: fix log offset type ()

    • htsmsg: check the field/key name length (max 255 characters), issue #5359 ()

    • xmltv: split names in credits, fixes #5359 ()

    • Fix compilation error: 'saveptr' may be used uninitialised in this function [-Werror=maybe-uninitialised] ()

    • Prepend title to autorec comment when created from EPG. ()

    • tvh_thread: do not use debug code when not activated, issue #5353, issue #5389 ()

    • pass muxer: correct SI length for trimmed events ()

    • satip client: activity timeout cleanups ()

    • http: forbidden status / access_verify2() cleanups, fixes #5391 ()

    • pass muxer: fix pass_muxer_nit_cb() - wrong private tag copy ()

    • tvhthread: fix the cond wait routines (preserve correctly filename/lineno) ()

    • tvh_thread: do not print sid for non glibc binaries, fixes #5385 ()

    • tvh_thread: another filename/lineno cleanups ()

    • tvhlog: add missing lock ()

    • atomic cleanups in tvh_thread, tvhlog (clang) ()

    • opentv: add NULL check to the opentv_find_entry(), fixes #5381 ()

    • imagecache: try to fix the state handling, fixes #5382 ()

    • imagecache: tiny code reshuffle ()

    • linuxdvb: add DMX_SET_SOURCE settings at the probe, fixes #5379 ()

    • dvb support: remove wrong characters bellow 0x20 (except 0x0a - newline), issue #5366 ()

    • http/webui: add special/srvid2 handling ()

    • xmltv: always change the module name after restart, fixes #5383 ()

    • Add ATSC-T With 8VSB Modulation (for Korean User) ()

    • satip client: show the proper connection state in 'RTSP cmd error' log message ()

    • satip client: cosmetic (indent) ()

    • imagecache: fix 'accessed' field loading and the default value, issue #4304 ()

    • imagecache: move saving procedure outside global_lock, fix imagecache_id after start, issue #4304 ()

    • imagecache: fix the build when caching code is deactivated, fixes #5372 ()

    • imagecache: another code reshuffle, add save for the accessed update, issue #4304 ()

    • opentv: fix the wrong event cleanup in opentv_add_entry(), issue #5297 ()

    • watchdog: rename tv_mutex_init to tvh_mutex_init ()

    • debian: remove db_reset lines - fixes #5358 ()

    • tvhlog: add tvhdbg() and send realtime mutex log lines to the UDP socket (if requested) ()

    • tvh thread: print the deadlock text also to stderr ()

    • tvhlog: fix NULL dereference crash ()

    • watchdog: fix missing pthread_mutex_destroy -> tvh_mutex_destroy, issue #5361 ()

    • tvhlog: fix tvhdbg() prototype when traces are not activated, fixes #5362 ()

    • satip client: fix activity timestamp for TCP data transfer mode, fixes #5348 ()

    • imagecache: fix the expire id, issue #4304 ()

    • move htsstr.h to tvh_string.h ()

    • initial pthread mutex/cond wrappers to detect deadlocks ()

    • thread: add mutex watchdog ()

    • tvh_thread: remove restrict keyword ()

    • access: fix tag exclude ()

    • access: a little code reorganisation for the latest tags exclude change ()

    • docs: update and add persistent auth info, refresh some screenshots and tweak a few bits ()

    • cosmetic: TVHeadend|tvheadend -> Tvheadend, where needed for consistency ()

    • debian packaging: always reset superuser info on removal ()

    • debian packaging: use db_purge on --purge ()

    • docs: update debugging ()

    • docs: another screenshot update ()

    • docs: use a table for the program details dialog toolbar items ()

    • descrambler: remove unused code ()

    • webui status: add user-agent (client) column ()

    • webui: streaming - fix the removed scoped lock, fixes #5356 ()

    • webui: remove Title0 typo ()

    • tvh thread: add mutex debug timing, fix the watchdog code ()

    • update valgrind.supp ()

    • tvh thread: fix gtimer_cond timedwait and tvh_cond_init() ()

    • tvh thread: compile the debug thread code only when traces are enabled ()

    • tvh-json.py: add proper digest/plain authentication, fixes #5350 ()

    • imagecache: add 'expire' time for the cached files, fixes #4304 ()

    • opentv: improve the split event merge logic, issue #5297 ()

    • api: Fix NULL blank argument. ()

    • opentv epg: try to fix the incomplete grabbing (use the whole time window for all subscribed PIDs), issue #5297 ()

    • capmt: cosmetic - remove double 'in' from log ()

    • satip client: add hard timeout for the incoming data ()

    • pass muxer: add possibility to continue streaming even if the service is changing, issue #5344 ()

    • pass muxer: do not check for multiple active services (it might not be true), issue #5344 ()

    • pass muxer: check correct variable for MC_CAP_ANOTHER_SERVICE, issue #5344 ()

    • service: do not stop the raw service streaming when service is not enabled ()

    • spawn: show permissions problem with kill, issue #4774 ()

    • webui: Add group renderer capabilities, now when grouping the title don't care about copyright year ()

    • webui: Add 'groupRenderer' in all tabs ()

    • webui: Add 'query CSFD' in dvr broadcast info window ()

    • http/webui: return not found status when redirection is not possible, fixes #5342 ()

    • webui debugging tab: typo fix ()

    • main: Fix OpenSSL 1.1 compilation without deprecated APIs ()

    • main: Load OpenSSL engines ()

    • http: rewrite again the access verification routines, fixes #5339 ()

    • linuxdvb: fix the exclusive frontend access, fixes #5330 ()

    • Fix typo ()

    • dvr: Fix season/episode unique test when recording. ()

    • dvr: Alter test for season/episode on unique path. ()

    • updated nginx example ()

    • webui: access theme - colour correction for EPG count info ()

    • linuxdvb: optimise the exclusive check code (previous change) ()

    • descrambler: improve EMM handling - add provider id checks ()

    • dvbpsi: move the cat decoder from descrambler to a common place and use it everywhere ()

    • dvb_mux_conf_init: set default pls_mode to GOLD, fixes #5328 ()

    • cclient: fix crash on cc_remove_card ()

    • descrambler: reset 'changed' flag on cc_remove_card ()

    • cclient: cc_remove_card - move state to ECM_INIT when active card is removed, issue #5314 ()

    • webui: fixes #5320 ()

    • htsmsg: add htsmsg_remove_string_from_list() function ()

    • satip: rtp - improve udp_multisend_send() error / full buffer condition checking, fixes #5319 ()

    • http: fix http_access_verify_channel(), fixes #5317 ()

    • satip server: fix memory leak for the slave service subscription, fixes #5314 ()

    • satip server: fix pmt rewrite (wrong CC), use sbuf as the internal data buffer ()

    • satip server: fix the weight handling for the scrambled slave subscriptions, fixes #5314 ()

    • mpegts mux: handle better mm_nicename updates ()

    • spawn: close pipe on fork() error path ()

    • iptv: add some more traces for pipe fds... ()

    • linuxdvb: do not call linuxdvb_satconf_power_save for non DVB-S frontends, fixes #5311 ()

    • linuxdvb: set volt - tiny optimisation ()

    • linuxdvb: try to improve the rotor logic (finish the movement), issue #5307 ()

    • satip client: do faster recovery when the server reboots ()

    • Update server.c ()

    • doozer: sort targets, add Fedora 29 ()

    • autobuild: remove Ubuntu Precise which is EOL (as of April 28, 2017) ()

    • doozer/autobuild: debian buster target ()

    • epg: play link - use temporary auth tickets again, fixes #5302 ()

    • linuxdvb rotor: improve satellite longitude description ()

    • scanfile: add support for PLS_CODE and PLS_MODE, fixes #5305 ()

    • htsp server: improve the htsp streaming connection limit check, issue #5290 ()

    • intextra: support 12bit unsigned nrs ()

    • msg queue: wake thread on new message ()

    • access: do not allocate always 50 bytes for aa_representative ()

    • access: set the temporary ticket lifetime between 30 and 3600 seconds ()

    • access: allow advanced streaming for the permanent tickets, fixes #5294 ()

    • webui: m3u playlist - add auth tokens for logo, fixes #5291 ()

    • webui: more tooltips for help buttons! ()

    • webui: Fix #5292 ()

    • Make authentication ticket lifetime configurable ()

    • tcp: fix wrong used variable initialisation, issue #5290 ()

    • service mapper: fix locking, issue #5261 ()

    • access: fix access_copy() for aa_auth, fixes #5285 ()

    • dvr_rec: fix early access_destroy ()

    • dvr: cleanup the error path in dvr_rec_subscribe() ()

    • access: do not use + character for the auth code (HTTP deescaping), issue #5274 ()

    • dvr: fix the dvr_rec_subscribe cleanup ()

    • service mapper: fix mono2sec -> sec2mono thinko ()

    • webui: fix http_m3u_playlist_add(), fixes #5274 ()

    • service mapper: try to determine quickly services without A/V streams, issue #5261 ()

    • http: terminate path correctly in http_resolve() ()

    • fixes for the permanent tickets, issue #5274 ()

    • doc: add authentication type for playlist in url.md ()

    • http: auth playlist, return unauthorized when the authcode is not present ()

    • htsp: Tidy serialisation of category and keyword. ()

    • service mapper: implement time watchdog (cca 30 seconds) ()

    • add permanent tickets for the authentication, fixes #5274 ()

    • linuxdvb: fix again the PLS code skip when the default value is used ()

    • dvb psi: change PMT monitor when PMT PID changes for SID, issue #4942 ()

    • dvb psi: fix for the previous commit - reinstall pmt monitor only when it's already installed ()

    • dvb psi: fix for the previous commits - move pmt monitor change to mpegts_service_find() ()

    • campt: fix the ct_multipid initialisation, fixes #5097 ()

    • bintray: disable uploads :-( ()

    • linuxdvb: set PLS code only when it differs from 1, fixes #5266 ()

    • htsmg: align the access to list/dictionary ()

    • Revert "FreeBSD: Fix recv problem if no data received." ()

    • FreeBSD: kevent is not a bitmask. ()

    • DVR: add username to the subscription, fixes #5215, fixes #5263 ()

    HTSP: Expose is_new flag in EPG event data
    (
    )
    transcode: improve logging of packet transcode errors
    (
    )
    transcode: gracefully handle common hardware decoder errors
    (
    )
    allow NVENC, VAAPI and MMAL to coexist in the same build
    (
    )
    lovcombo-all.js: Fix autorec create/edit TypeError with Firefox 134 (#1786)
    (
    )
    Remove links to old Wiki (#1793)
    (
    )
    wizard: increase buffer size to silence -Wformat-truncation on GCC 15
    (
    )
    Fix CI Builds 1/2
    (
    )
    Add start timeout to streaming profile
    (
    )
    fix bug in AAC channel layout configuration tab
    (
    )
    update vaapi - vainfo
    (
    )
    Allow setting a custom grace period for LinuxDVB adapters
    (
    )
    Docker/Alpine: Remove USB group
    (
    )
    configure: fix parsing args if values contain "="
    (
    )
    Translation for 'pl' updated.
    (
    )
    Translation for 'pl' updated.
    (
    )
    Translation for 'pl' updated.
    (
    )
    Translation for 'pl' updated.
    (
    )
    Translation for 'pl' updated.
    (
    )
    Translation for 'pl' updated.
    (
    )
    Translation for 'pl' updated.
    (
    )
    Translation for 'pl' updated.
    (
    )
    Translation for 'pl' updated.
    (
    )
    Translation for 'pl' updated.
    (
    )
    Translation for 'pl' updated.
    (
    )
    Translation for 'cs' updated.
    (
    )
    Translation for 'de' updated.
    (
    )
    Translation for 'fr' updated.
    (
    )
    Translation for 'hu' updated.
    (
    )
    Translation for 'es' updated.
    (
    )
    Translation for 'nl' updated.
    (
    )
    Translation for 'et' updated.
    (
    )
    Translation for 'en_GB' updated.
    (
    )
    Translation for 'it' updated.
    (
    )
    Translation for 'en_US' updated.
    (
    )
    Translation for 'pt' updated.
    (
    )
    Translation for 'ko' updated.
    (
    )
    Translation for '(#1655)' updated.
    (
    )
    bouquet: Allow merging of services across network bouquet, fixes #5617
    (
    )
    container: Add container support
    (
    )
    )
    Add "recordings" to the backup exclude list
    (
    )
    satipcli: Rename flag to include client reference
    (
    )
    main: Warn about unexpected configuration location
    (
    )
    Fix handling of legacy configuration directories in debian/postinst
    (
    )
    Clean up Debian postinst and postrm scripts
    (
    )
    Use sigaction() instead of signal()
    (
    )
    Transifex updates for project Tvheadend (#1587)
    (
    )
    Fix non-admin users not receiving any updates in web UI
    (
    )
    webui/dvr: Remove unused & duplicated functions
    (
    )
    webui/dvr: Add age_rating in recording details dialogs
    (
    )
    Use explicitly on format warnings for Time test
    (
    )
    CI: Build (without cloudsmith) all targets on every merge request
    (
    )
    Fix time for old 32bit systems
    (
    )
    Fix time for 32bit systems again
    (
    )
    Update Debian packaging to use the new configuration directories
    (
    )
    spawn: Do not close every possible file descriptor
    (
    )
    config: Fix whitespace errors
    (
    )
    dvr_storage: Also support server configurations for recordings
    (
    )
    config: Store config directory variable internally
    (
    )
    config: Add support for XDG config
    (
    )
    config: Support server configurations
    (
    )
    settings: Add XDG support helper functions
    (
    )
    dvr_storage: Use XDG spec directories
    (
    )
    Add simple 'ping' endpoint for healthchecks
    (
    )
    - fixed bug with _lang3_to_lang2()
    (
    )
    update pict_type from AVPacket to AVFrame
    (
    )
    update to ffmpeg 5.1.2
    (
    )
    remove unused function and migrate from AVBitStreamFilterContext to AVBSFContext
    (
    )
    update vaapi
    (
    )
    Fix Coverity-Build (#1499)
    (
    )
    Update debian/compat to version 10
    (
    )
    update vaapi
    (
    )
    Preserve existing Unicable idnode during the set operation
    (
    )
    profile video resize improvements
    (
    )
    update vaapi
    (
    )
    Avoid breaking strict aliasing in IP_AS_V{4,6}
    (
    )
    )
    Simplify IPv6 compare functions to unconfuse gcc compiler
    (
    )
    epgdb: Resolve symlinks before using file location
    (
    )
    iptv_auto: Add support for m3u "channel-number" tag
    (
    )
    Added more 'text modes' to the ATSC Multiple String Structure decoder and convert text to UTF-8. (Fixes #5162)
    (
    )
    Fixed and cleanup the "PSIP: ATSC Grabber" module (Fixes #5610)
    (
    )
    Fix use-after-free
    (
    )
    fix build with libressl
    (
    )
    dvr_disk_space_cleanup() - do not return error if called again too soon (#1)
    (
    )
    Update for VAAPI transcoding
    (
    )
    httpc: Fix multi-value "Connection" header checks
    (
    )
    nvenc: Fix Werror=misleading-indentation FTBFS
    (
    )
    nvenc: Fix Werror=int-conversion FTBFS (and likely bug)
    (
    )
    Use clock_gettime() instead of time() in epggrab.c
    (
    )
    iptv: Fix stream limit starting a new input on a running mux
    (
    )
    Improve the performance of updating the pid filter table in hdhomerun digital tuners.
    (
    )
    opentv: fix missing summary data on rescrape, #5995
    (
    )
    opentv: fix incorrect summaries for skyuk epg, fixes #5995
    (
    )
    iptv: new features for multicast, rtsp & rtcp
    (
    )
    Several coverity fixes, year updated, map muxes between DVB Types
    (
    )
    Several enhancements
    (
    )
    fix vaapi-profiles (#1366)
    (
    )
    update Makefile.ffmpeg (#1359)
    (
    )
    Fix NVENC
    (
    )
    Fix scraping 'new' flag from UK EIT.
    (
    )
    Fix escape code '&quote;' should be '"'. (#1355)
    (
    )
    Handle bad UTF-8 in xmltv (#5909)
    (
    )
    CSS: general improvements
    (
    )
    Makefile.ffmpeg: update almost all upstream packages
    (
    )
    xmltv: Allow sending basic xmltv format, fixes #5630
    (
    )
    tvhcsa.c: include stdio.h
    (
    )
    Avoid configure checks being optimised away with LTO
    (
    )
    dvr: Only check minseason/maxseason/minyear/maxyear if EPG has these values, fixes #5479
    (
    )
    dvr: New fmt spec for per-dir seasons and one movie per dir. (#4667)
    (
    )
    webui, htsbuf: Content-Disposition escape chars are not correct.
    (
    )
    epggrab: run internal grabbers only when wanted, fixes #5421
    (
    )
    imagecache: big cleanups
    (
    )
    dvr: Autorec rules must still match event after update. (#4760).
    (
    )
    ui: Add alternative/similar broadcast buttons, fixes #5335, #5336
    (
    )
    webui: epg: fix compatibility issue for FreeBSD
    (
    )
    Need to delete files on complex scheduling when replacing timer after crash.
    (
    )
    dvr: Add option to automatically delete recording after playback.
    (
    )
    Automatically generated: 2025-06-27 06:12:43 UTC
    2025-06-21arrow-up-right
    2025-06-12arrow-up-right
    2025-06-10arrow-up-right
    2025-06-10arrow-up-right
    2025-06-10arrow-up-right
    2025-06-09arrow-up-right
    2025-06-09arrow-up-right
    2025-06-06arrow-up-right
    2025-06-06arrow-up-right
    2025-06-06arrow-up-right
    2025-06-06arrow-up-right
    2025-06-06arrow-up-right
    2025-06-04arrow-up-right
    2025-06-02arrow-up-right
    2025-06-02arrow-up-right
    2025-05-27arrow-up-right
    2025-05-27arrow-up-right
    2025-05-25arrow-up-right
    2025-05-25arrow-up-right
    2025-05-25arrow-up-right
    2025-05-23arrow-up-right
    2025-05-22arrow-up-right
    2025-05-20arrow-up-right
    2025-05-19arrow-up-right
    2025-05-19arrow-up-right
    2025-05-18arrow-up-right
    2025-05-17arrow-up-right
    2025-05-15arrow-up-right
    2025-05-14arrow-up-right
    2025-05-14arrow-up-right
    2025-05-13arrow-up-right
    2025-05-13arrow-up-right
    2025-05-13arrow-up-right
    2025-05-13arrow-up-right
    2025-05-13arrow-up-right
    2025-05-13arrow-up-right
    2025-05-13arrow-up-right
    2025-05-12arrow-up-right
    2025-05-12arrow-up-right
    2024-11-12arrow-up-right
    2024-10-08arrow-up-right
    2024-10-08arrow-up-right
    2024-10-08arrow-up-right
    2024-10-05arrow-up-right
    2024-09-28arrow-up-right
    2024-09-23arrow-up-right
    2024-09-23arrow-up-right
    2024-09-06arrow-up-right
    2024-09-06arrow-up-right
    2024-09-06arrow-up-right
    2024-09-06arrow-up-right
    2024-09-06arrow-up-right
    2024-08-28arrow-up-right
    2024-08-25arrow-up-right
    2024-08-25arrow-up-right
    2024-08-24arrow-up-right
    2024-08-22arrow-up-right
    2024-08-22arrow-up-right
    2024-08-12arrow-up-right
    2024-08-10arrow-up-right
    2024-08-04arrow-up-right
    2024-08-04arrow-up-right
    2024-07-21arrow-up-right
    2024-07-21arrow-up-right
    2024-07-13arrow-up-right
    2024-07-13arrow-up-right
    2024-07-13arrow-up-right
    2024-06-27arrow-up-right
    2024-06-27arrow-up-right
    2024-06-25arrow-up-right
    2024-06-25arrow-up-right
    2024-06-23arrow-up-right
    2024-06-23arrow-up-right
    2024-06-23arrow-up-right
    2024-06-18arrow-up-right
    2024-06-15arrow-up-right
    2024-06-06arrow-up-right
    2024-06-06arrow-up-right
    2024-06-06arrow-up-right
    2024-06-06arrow-up-right
    2024-06-06arrow-up-right
    2024-06-06arrow-up-right
    2024-06-06arrow-up-right
    2024-06-06arrow-up-right
    2024-06-06arrow-up-right
    2024-06-05arrow-up-right
    2024-04-26arrow-up-right
    2024-04-26arrow-up-right
    2024-04-25arrow-up-right
    2024-04-24arrow-up-right
    2024-04-20arrow-up-right
    2024-04-13arrow-up-right
    2024-04-08arrow-up-right
    2024-03-24arrow-up-right
    2024-03-24arrow-up-right
    2024-03-22arrow-up-right
    2024-03-18arrow-up-right
    2024-03-14arrow-up-right
    2024-03-09arrow-up-right
    2024-03-08arrow-up-right
    2024-03-08arrow-up-right
    2024-03-08arrow-up-right
    2024-03-07arrow-up-right
    2024-03-07arrow-up-right
    2024-03-07arrow-up-right
    2024-03-03arrow-up-right
    2024-03-01arrow-up-right
    2024-03-01arrow-up-right
    2024-03-01arrow-up-right
    2024-03-01arrow-up-right
    2024-03-01arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-22arrow-up-right
    2024-02-22arrow-up-right
    2024-02-21arrow-up-right
    2024-02-21arrow-up-right
    2024-02-21arrow-up-right
    2024-02-21arrow-up-right
    2024-02-20arrow-up-right
    2024-02-20arrow-up-right
    2024-02-20arrow-up-right
    2024-02-20arrow-up-right
    2024-02-20arrow-up-right
    2024-02-20arrow-up-right
    2024-02-20arrow-up-right
    2024-02-20arrow-up-right
    2024-02-20arrow-up-right
    2024-02-19arrow-up-right
    2024-02-19arrow-up-right
    2024-02-19arrow-up-right
    2024-02-19arrow-up-right
    2024-02-19arrow-up-right
    2024-02-19arrow-up-right
    2024-02-18arrow-up-right
    2024-02-18arrow-up-right
    2024-02-18arrow-up-right
    2024-02-18arrow-up-right
    2024-02-18arrow-up-right
    2024-02-18arrow-up-right
    2024-02-18arrow-up-right
    2024-02-17arrow-up-right
    2024-02-17arrow-up-right
    2024-02-17arrow-up-right
    2024-02-17arrow-up-right
    2024-02-17arrow-up-right
    2024-02-17arrow-up-right
    2024-02-17arrow-up-right
    2024-02-17arrow-up-right
    2024-02-17arrow-up-right
    2024-02-17arrow-up-right
    2024-02-16arrow-up-right
    2024-02-15arrow-up-right
    2024-02-11arrow-up-right
    2024-02-09arrow-up-right
    2024-02-08arrow-up-right
    2024-02-06arrow-up-right
    2024-02-05arrow-up-right
    2024-02-05arrow-up-right
    2024-02-05arrow-up-right
    2024-02-05arrow-up-right
    2024-02-05arrow-up-right
    2024-02-05arrow-up-right
    2024-02-05arrow-up-right
    2024-02-05arrow-up-right
    2024-02-03arrow-up-right
    2024-02-03arrow-up-right
    2024-02-03arrow-up-right
    2024-02-03arrow-up-right
    2024-02-03arrow-up-right
    2024-02-02arrow-up-right
    2024-02-02arrow-up-right
    2024-01-31arrow-up-right
    2024-01-31arrow-up-right
    2024-01-30arrow-up-right
    2024-01-28arrow-up-right
    2024-01-24arrow-up-right
    2024-01-23arrow-up-right
    2024-01-23arrow-up-right
    2024-01-23arrow-up-right
    2024-01-23arrow-up-right
    2024-01-22arrow-up-right
    2024-01-21arrow-up-right
    2024-01-11arrow-up-right
    2024-01-11arrow-up-right
    2024-01-05arrow-up-right
    2024-01-04arrow-up-right
    2024-01-01arrow-up-right
    2023-12-26arrow-up-right
    2023-12-18arrow-up-right
    2023-12-13arrow-up-right
    2023-12-11arrow-up-right
    2023-12-11arrow-up-right
    2023-12-11arrow-up-right
    2023-12-09arrow-up-right
    2023-12-09arrow-up-right
    2023-12-09arrow-up-right
    2023-12-09arrow-up-right
    2023-12-09arrow-up-right
    2023-12-06arrow-up-right
    2023-12-06arrow-up-right
    2023-12-06arrow-up-right
    2023-12-06arrow-up-right
    2023-12-06arrow-up-right
    2023-12-06arrow-up-right
    2023-12-06arrow-up-right
    2023-12-05arrow-up-right
    2023-12-01arrow-up-right
    2023-12-01arrow-up-right
    2023-11-29arrow-up-right
    2023-11-29arrow-up-right
    2023-11-29arrow-up-right
    2023-11-28arrow-up-right
    2023-11-21arrow-up-right
    2023-11-20arrow-up-right
    2023-10-26arrow-up-right
    2023-10-14arrow-up-right
    2023-10-14arrow-up-right
    2023-09-06arrow-up-right
    2023-08-11arrow-up-right
    2023-08-09arrow-up-right
    2023-08-08arrow-up-right
    2023-08-06arrow-up-right
    2023-08-05arrow-up-right
    2023-08-02arrow-up-right
    2023-07-30arrow-up-right
    2023-07-19arrow-up-right
    2023-06-25arrow-up-right
    2023-06-23arrow-up-right
    2023-06-23arrow-up-right
    2023-06-21arrow-up-right
    2023-06-16arrow-up-right
    2023-06-15arrow-up-right
    2023-06-12arrow-up-right
    2023-06-07arrow-up-right
    2023-06-07arrow-up-right
    2023-06-05arrow-up-right
    2023-04-17arrow-up-right
    2023-04-08arrow-up-right
    2023-04-02arrow-up-right
    2023-04-02arrow-up-right
    2023-04-01arrow-up-right
    2023-03-30arrow-up-right
    2023-03-25arrow-up-right
    2023-03-24arrow-up-right
    2023-03-23arrow-up-right
    2023-03-23arrow-up-right
    2023-03-14arrow-up-right
    2023-03-08arrow-up-right
    2023-03-06arrow-up-right
    2023-03-06arrow-up-right
    2023-03-06arrow-up-right
    2023-03-05arrow-up-right
    2023-02-24arrow-up-right
    2023-02-24arrow-up-right
    2023-02-21arrow-up-right
    2023-02-20arrow-up-right
    2023-02-12arrow-up-right
    2023-02-10arrow-up-right
    2023-01-28arrow-up-right
    2023-01-27arrow-up-right
    2023-01-24arrow-up-right
    2023-01-24arrow-up-right
    2023-01-24arrow-up-right
    2023-01-24arrow-up-right
    2023-01-24arrow-up-right
    2023-01-23arrow-up-right
    2023-01-23arrow-up-right
    2023-01-23arrow-up-right
    2023-01-23arrow-up-right
    2023-01-22arrow-up-right
    2023-01-22arrow-up-right
    2023-01-17arrow-up-right
    2023-01-14arrow-up-right
    2023-01-10arrow-up-right
    2023-01-10arrow-up-right
    2023-01-04arrow-up-right
    2022-12-21arrow-up-right
    2022-12-21arrow-up-right
    2022-12-21arrow-up-right
    2022-12-17arrow-up-right
    2022-12-17arrow-up-right
    2022-12-10arrow-up-right
    2022-11-28arrow-up-right
    2022-11-28arrow-up-right
    2022-11-28arrow-up-right
    2022-11-27arrow-up-right
    2022-11-21arrow-up-right
    2022-11-21arrow-up-right
    2022-11-21arrow-up-right
    2022-11-21arrow-up-right
    2022-11-21arrow-up-right
    2022-11-10arrow-up-right
    2022-10-27arrow-up-right
    2022-10-27arrow-up-right
    2022-10-27arrow-up-right
    2022-10-26arrow-up-right
    2022-10-26arrow-up-right
    2022-10-26arrow-up-right
    2022-10-26arrow-up-right
    2022-10-26arrow-up-right
    2022-10-16arrow-up-right
    2022-10-14arrow-up-right
    2022-10-07arrow-up-right
    2022-10-07arrow-up-right
    2022-10-07arrow-up-right
    2022-10-07arrow-up-right
    2022-10-03arrow-up-right
    2022-09-15arrow-up-right
    2022-09-15arrow-up-right
    2022-09-03arrow-up-right
    2022-07-17arrow-up-right
    2022-07-08arrow-up-right
    2022-06-17arrow-up-right
    2022-04-22arrow-up-right
    2022-04-14arrow-up-right
    2022-04-11arrow-up-right
    2022-04-11arrow-up-right
    2022-04-11arrow-up-right
    2022-04-11arrow-up-right
    2022-04-08arrow-up-right
    2022-04-08arrow-up-right
    2022-04-08arrow-up-right
    2022-04-07arrow-up-right
    2022-04-05arrow-up-right
    2022-03-15arrow-up-right
    2022-02-14arrow-up-right
    2022-02-14arrow-up-right
    2022-02-14arrow-up-right
    2022-02-14arrow-up-right
    2022-02-13arrow-up-right
    2022-02-13arrow-up-right
    2022-02-13arrow-up-right
    2022-02-13arrow-up-right
    2022-02-13arrow-up-right
    2022-02-12arrow-up-right
    2022-02-12arrow-up-right
    2022-02-12arrow-up-right
    2022-02-12arrow-up-right
    2022-02-12arrow-up-right
    2022-01-12arrow-up-right
    2022-01-10arrow-up-right
    2022-01-09arrow-up-right
    2022-01-02arrow-up-right
    2022-01-02arrow-up-right
    2022-01-02arrow-up-right
    2021-12-12arrow-up-right
    2021-11-15arrow-up-right
    2021-09-07arrow-up-right
    2021-09-06arrow-up-right
    2021-09-06arrow-up-right
    2021-09-06arrow-up-right
    2021-07-29arrow-up-right
    2021-07-24arrow-up-right
    2021-07-23arrow-up-right
    2021-07-23arrow-up-right
    2021-07-23arrow-up-right
    2021-07-23arrow-up-right
    2021-07-23arrow-up-right
    2021-07-21arrow-up-right
    2021-06-12arrow-up-right
    2021-06-09arrow-up-right
    2021-05-31arrow-up-right
    2021-05-05arrow-up-right
    2021-05-05arrow-up-right
    2021-05-05arrow-up-right
    2021-05-04arrow-up-right
    2021-05-04arrow-up-right
    2021-05-04arrow-up-right
    2021-05-01arrow-up-right
    2021-05-01arrow-up-right
    2021-05-01arrow-up-right
    2021-05-01arrow-up-right
    2021-05-01arrow-up-right
    2021-05-01arrow-up-right
    2021-04-21arrow-up-right
    2021-04-20arrow-up-right
    2021-04-02arrow-up-right
    2021-04-02arrow-up-right
    2021-04-02arrow-up-right
    2021-03-19arrow-up-right
    2021-03-17arrow-up-right
    2021-03-16arrow-up-right
    2021-03-16arrow-up-right
    2021-03-16arrow-up-right
    2021-03-12arrow-up-right
    2021-02-24arrow-up-right
    2021-02-24arrow-up-right
    2021-02-21arrow-up-right
    2021-02-20arrow-up-right
    2021-02-18arrow-up-right
    2021-02-18arrow-up-right
    2021-02-18arrow-up-right
    2021-02-18arrow-up-right
    2021-02-18arrow-up-right
    2021-02-18arrow-up-right
    2021-02-18arrow-up-right
    2021-02-18arrow-up-right
    2021-02-18arrow-up-right
    2021-02-18arrow-up-right
    2021-02-17arrow-up-right
    2020-12-29arrow-up-right
    2020-12-29arrow-up-right
    2020-12-29arrow-up-right
    2020-12-16arrow-up-right
    2020-12-14arrow-up-right
    2020-12-06arrow-up-right
    2020-11-27arrow-up-right
    2020-11-14arrow-up-right
    2020-10-28arrow-up-right
    2020-10-28arrow-up-right
    2020-10-27arrow-up-right
    2020-10-27arrow-up-right
    2020-10-27arrow-up-right
    2020-10-22arrow-up-right
    2020-10-21arrow-up-right
    2020-10-19arrow-up-right
    2020-10-14arrow-up-right
    2020-10-14arrow-up-right
    2020-10-12arrow-up-right
    2020-10-08arrow-up-right
    2020-10-08arrow-up-right
    2020-09-28arrow-up-right
    2020-09-13arrow-up-right
    2020-07-13arrow-up-right
    2020-07-11arrow-up-right
    2020-07-11arrow-up-right
    2020-07-07arrow-up-right
    2020-07-06arrow-up-right
    2020-07-06arrow-up-right
    2020-07-06arrow-up-right
    2020-07-06arrow-up-right
    2020-06-10arrow-up-right
    2020-06-08arrow-up-right
    2020-06-08arrow-up-right
    2020-06-08arrow-up-right
    2020-06-05arrow-up-right
    2020-06-03arrow-up-right
    2020-05-22arrow-up-right
    2020-05-22arrow-up-right
    2020-05-21arrow-up-right
    2020-05-21arrow-up-right
    2020-05-21arrow-up-right
    2020-05-19arrow-up-right
    2020-05-19arrow-up-right
    2020-05-19arrow-up-right
    2020-05-18arrow-up-right
    2020-05-18arrow-up-right
    2020-05-17arrow-up-right
    2020-05-15arrow-up-right
    2020-05-15arrow-up-right
    2020-05-15arrow-up-right
    2020-05-15arrow-up-right
    2020-05-15arrow-up-right
    2020-05-15arrow-up-right
    2020-05-15arrow-up-right
    2020-05-15arrow-up-right
    2020-05-14arrow-up-right
    2020-05-14arrow-up-right
    2019-11-28arrow-up-right
    2019-11-28arrow-up-right
    2019-11-15arrow-up-right
    2019-11-04arrow-up-right
    2019-11-04arrow-up-right
    2019-11-01arrow-up-right
    2019-11-01arrow-up-right
    2019-10-31arrow-up-right
    2019-10-31arrow-up-right
    2019-10-31arrow-up-right
    2019-10-28arrow-up-right
    2019-10-28arrow-up-right
    2019-10-27arrow-up-right
    2019-10-27arrow-up-right
    2019-10-24arrow-up-right
    2019-10-21arrow-up-right
    2019-10-21arrow-up-right
    2019-10-21arrow-up-right
    2019-10-21arrow-up-right
    2019-10-21arrow-up-right
    2019-10-21arrow-up-right
    2019-10-21arrow-up-right
    2019-10-21arrow-up-right
    2019-10-20arrow-up-right
    2019-10-19arrow-up-right
    2019-10-18arrow-up-right
    2019-10-17arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-14arrow-up-right
    2019-10-14arrow-up-right
    2019-10-06arrow-up-right
    2019-10-06arrow-up-right
    2019-10-06arrow-up-right
    2019-10-06arrow-up-right
    2019-10-06arrow-up-right
    2019-10-06arrow-up-right
    2019-10-06arrow-up-right
    2019-08-02arrow-up-right
    2019-07-29arrow-up-right
    2019-07-06arrow-up-right
    2019-07-02arrow-up-right
    2019-06-30arrow-up-right
    2019-06-30arrow-up-right
    2019-06-30arrow-up-right
    2019-06-30arrow-up-right
    2019-06-30arrow-up-right
    2019-06-18arrow-up-right
    2019-06-17arrow-up-right
    2019-06-12arrow-up-right
    2019-05-20arrow-up-right
    2019-05-20arrow-up-right
    2019-05-20arrow-up-right
    2019-03-24arrow-up-right
    2019-03-21arrow-up-right
    2019-03-20arrow-up-right
    2019-03-20arrow-up-right
    2019-03-15arrow-up-right
    2019-03-13arrow-up-right
    2019-03-13arrow-up-right
    2019-03-13arrow-up-right
    2019-03-07arrow-up-right
    2019-03-06arrow-up-right
    2019-03-06arrow-up-right
    2019-03-06arrow-up-right
    2019-03-06arrow-up-right
    2019-03-02arrow-up-right
    2019-03-02arrow-up-right
    2019-03-01arrow-up-right
    2019-03-01arrow-up-right
    2019-03-01arrow-up-right
    2019-02-28arrow-up-right
    2019-02-27arrow-up-right
    2019-02-27arrow-up-right
    2019-02-16arrow-up-right
    2019-02-16arrow-up-right
    2019-02-15arrow-up-right
    2019-02-15arrow-up-right
    2019-02-15arrow-up-right
    2019-02-14arrow-up-right
    2019-02-14arrow-up-right
    2019-02-14arrow-up-right
    2019-02-14arrow-up-right
    2019-02-14arrow-up-right
    2019-02-14arrow-up-right
    2019-02-14arrow-up-right
    2019-02-14arrow-up-right
    2019-02-14arrow-up-right
    2019-02-13arrow-up-right
    2019-02-12arrow-up-right
    2019-02-12arrow-up-right
    2019-02-11arrow-up-right
    2019-02-11arrow-up-right
    2019-02-09arrow-up-right
    2019-02-04arrow-up-right
    2019-02-04arrow-up-right
    2019-02-04arrow-up-right
    2019-02-04arrow-up-right
    2019-02-04arrow-up-right
    2019-02-04arrow-up-right
    2019-02-04arrow-up-right
    2019-02-04arrow-up-right
    2019-02-04arrow-up-right
    2019-02-04arrow-up-right
    2019-02-04arrow-up-right
    2019-02-04arrow-up-right
    2019-01-24arrow-up-right
    2019-01-23arrow-up-right
    2019-01-21arrow-up-right
    2019-01-18arrow-up-right
    2019-01-18arrow-up-right
    2019-01-17arrow-up-right
    2019-01-15arrow-up-right
    2019-01-15arrow-up-right
    2019-01-15arrow-up-right
    2019-01-14arrow-up-right
    2019-01-14arrow-up-right
    2019-01-14arrow-up-right
    2019-01-14arrow-up-right
    2019-01-14arrow-up-right
    2019-01-14arrow-up-right
    2019-01-13arrow-up-right
    2019-01-09arrow-up-right
    2019-01-09arrow-up-right
    2019-01-09arrow-up-right
    2019-01-08arrow-up-right
    2019-01-08arrow-up-right
    2019-01-08arrow-up-right
    2019-01-08arrow-up-right
    2019-01-02arrow-up-right
    2019-01-02arrow-up-right
    2019-01-02arrow-up-right
    2019-01-02arrow-up-right
    2019-01-02arrow-up-right
    2019-01-02arrow-up-right
    2019-01-02arrow-up-right
    2019-01-01arrow-up-right
    2019-01-01arrow-up-right
    2019-01-01arrow-up-right
    2019-01-01arrow-up-right
    2019-01-01arrow-up-right
    2019-01-01arrow-up-right
    2019-01-01arrow-up-right
    2019-01-01arrow-up-right
    2018-12-30arrow-up-right
    2018-12-28arrow-up-right
    2018-12-28arrow-up-right
    2018-12-26arrow-up-right
    2018-12-26arrow-up-right
    2018-12-26arrow-up-right
    2018-12-25arrow-up-right
    2018-12-25arrow-up-right
    2018-12-25arrow-up-right
    2018-12-22arrow-up-right
    2018-12-22arrow-up-right
    2018-12-22arrow-up-right
    2018-12-20arrow-up-right
    2018-12-19arrow-up-right
    2018-12-19arrow-up-right
    2018-12-19arrow-up-right
    2018-12-19arrow-up-right
    2018-12-19arrow-up-right
    2018-12-17arrow-up-right
    2018-12-16arrow-up-right
    2018-12-15arrow-up-right
    2018-12-15arrow-up-right
    2018-12-15arrow-up-right
    2018-12-14arrow-up-right
    2018-12-14arrow-up-right
    2018-12-14arrow-up-right
    2018-12-14arrow-up-right
    2018-12-14arrow-up-right
    2018-12-13arrow-up-right
    2018-12-13arrow-up-right
    2018-12-13arrow-up-right
    2018-12-12arrow-up-right
    2018-12-12arrow-up-right
    2018-12-12arrow-up-right
    2018-12-12arrow-up-right
    2018-12-12arrow-up-right
    2018-12-12arrow-up-right
    2018-12-11arrow-up-right
    2018-12-11arrow-up-right
    2018-12-11arrow-up-right
    2018-12-11arrow-up-right
    2018-12-11arrow-up-right
    2018-12-11arrow-up-right
    2018-12-11arrow-up-right
    2018-12-11arrow-up-right
    2018-12-11arrow-up-right
    2018-12-11arrow-up-right
    2018-12-11arrow-up-right
    2018-12-10arrow-up-right
    2018-12-10arrow-up-right
    2018-12-10arrow-up-right
    2018-12-10arrow-up-right
    2018-12-10arrow-up-right
    2018-12-10arrow-up-right
    2018-12-10arrow-up-right
    2018-12-09arrow-up-right
    2018-12-09arrow-up-right
    2018-12-09arrow-up-right
    2018-12-09arrow-up-right
    2018-12-08arrow-up-right
    2018-12-08arrow-up-right
    2018-12-07arrow-up-right
    2018-12-06arrow-up-right
    2018-12-06arrow-up-right
    2018-12-06arrow-up-right
    2018-12-06arrow-up-right
    2018-12-06arrow-up-right
    2018-12-06arrow-up-right
    2018-12-05arrow-up-right
    2018-12-05arrow-up-right
    2018-12-05arrow-up-right
    2018-12-05arrow-up-right
    2018-12-03arrow-up-right
    2018-12-03arrow-up-right
    2018-12-03arrow-up-right
    2018-12-03arrow-up-right
    2018-12-02arrow-up-right
    2018-12-02arrow-up-right
    2018-12-02arrow-up-right
    2018-12-02arrow-up-right
    2018-12-02arrow-up-right
    2018-12-02arrow-up-right
    2018-12-01arrow-up-right
    2018-12-01arrow-up-right
    2018-12-01arrow-up-right
    2018-12-01arrow-up-right
    2018-12-01arrow-up-right
    2018-12-01arrow-up-right
    2018-12-01arrow-up-right
    2018-11-30arrow-up-right
    2018-11-30arrow-up-right
    2018-11-30arrow-up-right
    2018-11-30arrow-up-right
    2018-11-30arrow-up-right
    2018-11-30arrow-up-right
    2018-11-30arrow-up-right
    2018-11-29arrow-up-right
    2018-11-29arrow-up-right
    2018-11-28arrow-up-right
    2018-11-28arrow-up-right
    2018-11-28arrow-up-right
    2018-11-28arrow-up-right
    2018-11-28arrow-up-right
    2018-11-28arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-26arrow-up-right
    2018-11-26arrow-up-right
    2018-11-26arrow-up-right
    2018-11-25arrow-up-right
    2018-11-25arrow-up-right
    2018-11-25arrow-up-right
    2018-11-25arrow-up-right
    2018-11-24arrow-up-right
    2018-11-24arrow-up-right
    2018-11-24arrow-up-right
    2018-11-24arrow-up-right
    2018-11-23arrow-up-right
    2018-11-23arrow-up-right
    2018-11-23arrow-up-right
    2018-11-23arrow-up-right
    2018-11-23arrow-up-right
    2018-11-23arrow-up-right
    2018-11-21arrow-up-right
    2018-11-21arrow-up-right
    2018-11-20arrow-up-right
    2018-11-19arrow-up-right
    2018-11-19arrow-up-right
    2018-11-19arrow-up-right
    2018-11-19arrow-up-right
    2018-11-19arrow-up-right
    2018-11-19arrow-up-right
    2018-11-19arrow-up-right
    2018-11-19arrow-up-right
    2018-11-19arrow-up-right
    2018-11-14arrow-up-right
    2018-11-12arrow-up-right
    2018-11-12arrow-up-right
    2018-11-09arrow-up-right
    2018-11-09arrow-up-right
    2018-11-09arrow-up-right
    2018-11-09arrow-up-right
    2018-11-08arrow-up-right
    2018-11-07arrow-up-right
    2018-11-07arrow-up-right
    2018-11-07arrow-up-right
    2018-11-07arrow-up-right
    2018-11-03arrow-up-right
    2018-11-03arrow-up-right
    2018-11-03arrow-up-right
    2018-11-01arrow-up-right
    2018-11-01arrow-up-right
    2018-11-01arrow-up-right
    2018-10-31arrow-up-right
    2018-10-31arrow-up-right
    2018-10-31arrow-up-right
    2018-10-31arrow-up-right
    2018-10-31arrow-up-right
    2018-10-31arrow-up-right
    2018-10-31arrow-up-right
    2018-10-30arrow-up-right
    2018-10-29arrow-up-right
    2018-10-29arrow-up-right
    2018-10-27arrow-up-right
    2018-10-27arrow-up-right
    2018-10-27arrow-up-right
    2018-10-27arrow-up-right
    2018-10-25arrow-up-right
    2018-10-25arrow-up-right
    2018-10-25arrow-up-right
    2018-10-24arrow-up-right
    2018-10-23arrow-up-right
    2018-10-23arrow-up-right
    2018-10-22arrow-up-right
    2018-10-22arrow-up-right
    2018-10-22arrow-up-right
    2018-10-22arrow-up-right
    2018-10-22arrow-up-right
    2018-10-22arrow-up-right
    2018-10-22arrow-up-right
    2018-10-21arrow-up-right
    2018-10-21arrow-up-right
    2018-10-21arrow-up-right
    2018-10-21arrow-up-right
    2018-10-21arrow-up-right
    2018-10-21arrow-up-right
    2018-10-20arrow-up-right
    2018-10-18arrow-up-right
    2018-10-18arrow-up-right
    2018-10-18arrow-up-right
    2018-10-18arrow-up-right
    2018-10-17arrow-up-right
    2018-10-17arrow-up-right
    2018-10-17arrow-up-right
    2018-10-16arrow-up-right
    2018-10-16arrow-up-right
    2018-10-16arrow-up-right
    2018-10-16arrow-up-right
    2025-06-04arrow-up-right
    2025-06-02arrow-up-right
    2025-06-02arrow-up-right
    2025-05-14arrow-up-right
    2025-05-13arrow-up-right
    2025-05-13arrow-up-right
    2025-05-13arrow-up-right
    2025-05-12arrow-up-right
    2024-09-28arrow-up-right
    2024-08-23arrow-up-right
    2024-08-12arrow-up-right
    2024-06-06arrow-up-right
    2024-06-05arrow-up-right
    2024-04-20arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-22arrow-up-right
    2024-02-18arrow-up-right
    2024-02-10arrow-up-right
    2024-02-07arrow-up-right
    2024-02-04arrow-up-right
    2024-02-02arrow-up-right
    2024-02-02arrow-up-right
    2024-02-02arrow-up-right
    2024-02-01arrow-up-right
    2023-12-13arrow-up-right
    2023-10-01arrow-up-right
    2023-08-11arrow-up-right
    2023-08-11arrow-up-right
    2023-08-06arrow-up-right
    2023-08-05arrow-up-right
    2023-08-04arrow-up-right
    2023-07-30arrow-up-right
    2023-06-23arrow-up-right
    2023-06-21arrow-up-right
    2023-06-21arrow-up-right
    2023-06-21arrow-up-right
    2023-06-16arrow-up-right
    2023-06-16arrow-up-right
    2023-06-16arrow-up-right
    2023-06-16arrow-up-right
    2023-06-16arrow-up-right
    2023-06-11arrow-up-right
    2023-04-19arrow-up-right
    2023-04-17arrow-up-right
    2023-04-08arrow-up-right
    2023-03-23arrow-up-right
    2023-02-05arrow-up-right
    2023-01-28arrow-up-right
    2023-01-24arrow-up-right
    2023-01-23arrow-up-right
    2023-01-17arrow-up-right
    2023-01-14arrow-up-right
    2023-01-10arrow-up-right
    2022-11-24arrow-up-right
    2022-11-21arrow-up-right
    2022-11-21arrow-up-right
    2022-11-20arrow-up-right
    2022-10-31arrow-up-right
    2022-09-15arrow-up-right
    2022-08-28arrow-up-right
    2022-07-04arrow-up-right
    2022-04-06arrow-up-right
    2022-04-05arrow-up-right
    2022-03-30arrow-up-right
    2022-02-12arrow-up-right
    2022-01-02arrow-up-right
    2022-01-02arrow-up-right
    2021-12-12arrow-up-right
    2021-12-12arrow-up-right
    2021-11-21arrow-up-right
    2021-10-21arrow-up-right
    2021-10-17arrow-up-right
    2021-03-12arrow-up-right
    2021-02-21arrow-up-right
    2021-02-20arrow-up-right
    2020-12-29arrow-up-right
    2020-10-08arrow-up-right
    2020-10-08arrow-up-right
    2020-09-28arrow-up-right
    2020-07-12arrow-up-right
    2020-07-06arrow-up-right
    2020-05-18arrow-up-right
    2020-05-18arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-02-04arrow-up-right
    2019-02-04arrow-up-right
    2018-12-19arrow-up-right
    2018-12-14arrow-up-right
    2018-12-12arrow-up-right
    2018-12-06arrow-up-right
    2018-11-25arrow-up-right
    2018-11-23arrow-up-right
    2018-11-19arrow-up-right
    2018-11-19arrow-up-right
    Recording icon

    Release / Change Log

    hashtag
    Latest Release 12.34.1arrow-up-right (2024-08-04)

    • Replace deprecated channels/channel_layout (2024-08-04arrow-up-right)

    • Fix function passed to avio_alloc_context() (ffmpeg 7) ()

    • Translation for 'en_US' updated. ()

    • Translation for 'en_GB' updated. ()

    • Rework fullscreen request method detection ()

    • Add dependency for recent Fedora versions ()

    • Allow node16 for GitHub Actions ()

    • Remove tvheadend user on purge ()

    • Refactor null value handling. ()

    • Replace deprecated interlaced_frame, top_field_first and key_frame ()

    • Replace deprecated av_init_packet() ()

    • Remove useless NULL-check in ratinglabels.c ()

    • Fix potential null-pointer dereference in muxer_mkv.c ()

    • Remove useless NULL-assignment in http.c ()

    • Use safer htsmsg_add_str2 when copying de->de_directory ()

    • XMLTV: Rating Labels: Use 'NONE' when 'system' attribute is missing ()

    hashtag
    Recent Releases

    hashtag
    (2024-06-07)

    hashtag
    (2024-06-06)

    hashtag
    (2024-03-24)

    hashtag
    (2024-03-07)

    hashtag
    (2024-02-23)

    hashtag
    (2024-02-21)

    hashtag
    Releases, Nightly Builds and Change Log

    • (2024-08-04)

    • Replace deprecated channels/channel_layout ()

    • Fix function passed to avio_alloc_context() (ffmpeg 7) ()

    Automatically generated: 2024-08-11 03:05:13 UTC

    Nightly build 4.3-2349arrow-up-right (2024-07-21)
  • Translation for 'en_US' updated. (2024-07-21arrow-up-right)

  • Translation for 'en_GB' updated. (2024-07-21arrow-up-right)

  • Nightly build 4.3-2347arrow-up-right (2024-07-14)

  • Nightly build 4.3-2346arrow-up-right (2024-07-13)

  • Rework fullscreen request method detection (2024-07-13arrow-up-right)

  • Add dependency for recent Fedora versions (2024-07-13arrow-up-right)

  • Allow node16 for GitHub Actions (2024-07-13arrow-up-right)

  • Nightly build 4.3-2344arrow-up-right (2024-06-27)

  • Nightly build 4.3-2343arrow-up-right (2024-06-27)

  • Remove tvheadend user on purge (2024-06-27arrow-up-right)

  • Refactor null value handling. (2024-06-27arrow-up-right)

  • Nightly build 4.3-2342arrow-up-right (2024-06-25)

  • Replace deprecated interlaced_frame, top_field_first and key_frame (2024-06-25arrow-up-right)

  • Replace deprecated av_init_packet() (2024-06-25arrow-up-right)

  • Nightly build 4.3-2340arrow-up-right (2024-06-23)

  • Nightly build 4.3-2339arrow-up-right (2024-06-23)

  • Nightly build 4.3-2338arrow-up-right (2024-06-23)

  • Remove useless NULL-check in ratinglabels.c (2024-06-23arrow-up-right)

  • Fix potential null-pointer dereference in muxer_mkv.c (2024-06-23arrow-up-right)

  • Remove useless NULL-assignment in http.c (2024-06-23arrow-up-right)

  • Nightly build 4.3-2337arrow-up-right (2024-06-18)

  • Use safer htsmsg_add_str2 when copying de->de_directory (2024-06-18arrow-up-right)

  • Nightly build 4.3-2336arrow-up-right (2024-06-15)

  • XMLTV: Rating Labels: Use 'NONE' when 'system' attribute is missing (2024-06-15arrow-up-right)

  • Release 12.34.2arrow-up-right (2024-06-07)

  • Nightly build 4.3-2334arrow-up-right (2024-06-06)

  • Nightly build 4.3-2327arrow-up-right (2024-06-06)

  • Nightly build 4.3-2326arrow-up-right (2024-06-06)

  • Release 12.34.3arrow-up-right (2024-06-06)

  • Allow setting a custom grace period for LinuxDVB adapters ()

  • Always compile x265 as PIC (2024-06-06arrow-up-right)

  • Update libogg and libfdkaac (2024-06-06arrow-up-right)

  • Update libx264 (2024-06-06arrow-up-right)

  • Update nasm (2024-06-06arrow-up-right)

  • Add current pcloud cert (2024-06-06arrow-up-right)

  • Update x265 to 3.6 (2024-06-06arrow-up-right)

  • Make builds parallel and add bookworm and ubuntu 24.04 builds (2024-06-06arrow-up-right)

  • Extend CORS origin help/hover message (2024-06-06arrow-up-right)

  • dvr: Added missing directory to rerecord-entry (2024-06-06arrow-up-right)

  • Nightly build 4.3-2324arrow-up-right (2024-06-05)

  • tvhdhomerun: Add ISDB to type check in tvhdhomerun_device_create (2024-06-05arrow-up-right)

  • Docker/Alpine: Remove USB group ()

  • Nightly build 4.3-2323arrow-up-right (2024-04-26)

  • Nightly build 4.3-2322arrow-up-right (2024-04-26)

  • Fix echo target for superuser file in Debian postinst (2024-04-26arrow-up-right)

  • Correct M3U playlist logo tag (2024-04-26arrow-up-right)

  • Nightly build 4.3-2321arrow-up-right (2024-04-25)

  • Nightly build 4.3-2320arrow-up-right (2024-04-25)

  • Properly escape json in setup (2024-04-25arrow-up-right)

  • satip: Ignore additional parameters (2024-04-24arrow-up-right)

  • Nightly build 4.3-2319arrow-up-right (2024-04-21)

  • Nightly build 4.3-2318arrow-up-right (2024-04-20)

  • configure: fix parsing args if values contain "=" ()

  • Update WebUI to allow debug/trace subsystem selection from a list. (2024-04-20arrow-up-right)

  • Nightly build 4.3-2317arrow-up-right (2024-04-13)

  • Add subsystems to JSON API. (2024-04-13arrow-up-right)

  • Nightly build 4.3-2316arrow-up-right (2024-04-08)

  • Fix detection of unknown version numbers in support/version (2024-04-08arrow-up-right)

  • Release 12.34.4arrow-up-right (2024-03-24)

  • Nightly build 4.3-2314arrow-up-right (2024-03-24)

  • Update manpage (2024-03-24arrow-up-right)

  • webui: Fix year being replaced incorrectly when using custom date format (2024-03-24arrow-up-right)

  • Nightly build 4.3-2313arrow-up-right (2024-03-22)

  • Translation for 'pl' updated. (2024-03-22arrow-up-right)

  • Nightly build 4.3-2312arrow-up-right (2024-03-18)

  • Translation for 'pl' updated. ()

  • Translation for 'pl' updated. ()

  • Translation for 'pl' updated. ()

  • Translation for 'pl' updated. ()

  • Translation for 'pl' updated. ()

  • Translation for 'pl' updated. ()

  • Translation for 'pl' updated. ()

  • Translation for 'pl' updated. ()

  • Translation for 'pl' updated. ()

  • Translation for 'pl' updated. ()

  • Translation for 'pl' updated. ()

  • Translation for 'pl' updated. (2024-03-18arrow-up-right)

  • Nightly build 4.3-2300arrow-up-right (2024-03-14)

  • Update README.md (2024-03-14arrow-up-right)

  • Nightly build 4.3-2299arrow-up-right (2024-03-09)

  • CI: remove NODIRTY option as those builds may be dirty (2024-03-09arrow-up-right)

  • Nightly build 4.3-2298arrow-up-right (2024-03-08)

  • Nightly build 4.3-2296arrow-up-right (2024-03-08)

  • Revert accidental package renaming (2024-03-08arrow-up-right)

  • Improve armv6l-packages and remove various outdated references/commands (2024-03-08arrow-up-right)

  • Create special tvheadend-armv6l and tvheadend-dbg-armv6l packages (2024-03-08arrow-up-right)

  • Release 12.34.5arrow-up-right (2024-03-07)

  • Translation for 'pl' updated. (2024-03-07arrow-up-right)

  • Translation for 'pl' updated. (2024-03-07arrow-up-right)

  • Translation for 'pl' updated. (2024-03-07arrow-up-right)

  • Nightly build 4.3-2292arrow-up-right (2024-03-03)

  • update to libvpx 1.14.0-patch (2024-03-03arrow-up-right)

  • Nightly build 4.3-2291arrow-up-right (2024-03-01)

  • Nightly build 4.3-2290arrow-up-right (2024-03-01)

  • Nightly build 4.3-2289arrow-up-right (2024-03-01)

  • Improve autorec duplicate handling (2024-03-01arrow-up-right)

  • ci: added more info logging to cloudsmith.sh (2024-03-01arrow-up-right)

  • Translation for 'pl' updated. (2024-03-01arrow-up-right)

  • Translation for 'pl' updated. (2024-03-01arrow-up-right)

  • Translation for 'pl' updated. (2024-03-01arrow-up-right)

  • Nightly build 4.3-2286arrow-up-right (2024-02-24)

  • Release 12.34.6arrow-up-right (2024-02-23)

  • Replace broken links, update copyright year (2024-02-23arrow-up-right)

  • Translation for 'pl' updated. (2024-02-23arrow-up-right)

  • Translation for 'pl' updated. (2024-02-23arrow-up-right)

  • Translation for 'ko' updated. ()

  • Translation for 'pt' updated. ()

  • Translation for 'en_US' updated. ()

  • Translation for 'it' updated. ()

  • Translation for 'en_GB' updated. ()

  • Translation for 'et' updated. ()

  • Translation for 'nl' updated. ()

  • Translation for 'es' updated. ()

  • Translation for 'hu' updated. ()

  • Translation for 'fr' updated. ()

  • Translation for 'de' updated. ()

  • Translation for 'cs' updated. ()

  • Nightly build 4.3-2271arrow-up-right (2024-02-22)

  • Nightly build 4.3-2270arrow-up-right (2024-02-22)

  • Nightly build 4.3-2269arrow-up-right (2024-02-22)

  • Nightly build 4.3-2268arrow-up-right (2024-02-22)

  • Give comment-on-labels.yml permissions to write to PRs (2024-02-22arrow-up-right)

  • Add OpenCollective donate link to Wizard (2024-02-22arrow-up-right)

  • transifex: Updates for project Tvheadend and language pl (#1655) ()

  • Nightly build 4.3-2267arrow-up-right (2024-02-21)

  • Nightly build 4.3-2266arrow-up-right (2024-02-21)

  • Release 12.34.7arrow-up-right (2024-02-21)

  • Nightly build 4.3-2264arrow-up-right (2024-02-21)

  • Release 12.34.8arrow-up-right (2024-02-21)

  • Run enforce-pr-rebase whenever a PR is updated (2024-02-21arrow-up-right)

  • Fix Auto-PR comment on squash-label (2024-02-21arrow-up-right)

  • Make sure we spawn the best matching executable and not the first match (2024-02-21arrow-up-right)

  • ci: change CLOUDSMITH_OWNER from a var to a secret (2024-02-21arrow-up-right)

  • Release 12.34.9arrow-up-right (2024-02-20)

  • Release 12.34.10arrow-up-right (2024-02-20)

  • Release 12.34.11arrow-up-right (2024-02-20)

  • Release 12.34.12arrow-up-right (2024-02-20)

  • Translation for 'pl' updated. (2024-02-20arrow-up-right)

  • Translation for 'pl' updated. (2024-02-20arrow-up-right)

  • Translation for 'pl' updated. (2024-02-20arrow-up-right)

  • Translation for 'pl' updated. (2024-02-20arrow-up-right)

  • Translation for 'pl' updated. (2024-02-20arrow-up-right)

  • Translation for 'pl' updated. (2024-02-20arrow-up-right)

  • Replace poison memset by memset_s to avoid compiler optimising it out (2024-02-20arrow-up-right)

  • Show SeriesLink for AutoRecs (2024-02-20arrow-up-right)

  • Add some ERRNOs for DVR & Config (2024-02-20arrow-up-right)

  • Release 12.34.13arrow-up-right (2024-02-19)

  • Release 12.34.14arrow-up-right (2024-02-19)

  • Release 12.34.15arrow-up-right (2024-02-19)

  • Shorten time for stale issues before a warning is applied (2024-02-19arrow-up-right)

  • Add missing tvheadend-prefix in JS file (2024-02-19arrow-up-right)

  • Add support for 12-hour custom date formats (2024-02-19arrow-up-right)

  • Add missing htmsg_destroy() call in hdhomerun_server_discover (2024-02-19arrow-up-right)

  • Replace single-bit signed integers with unsigned integers (2024-02-19arrow-up-right)

  • ci: Enforce rebasing PRs before merging (2024-02-19arrow-up-right)

  • Translation for 'pl' updated. (2024-02-18arrow-up-right)

  • Translation for 'pl' updated. (2024-02-18arrow-up-right)

  • Translation for 'pl' updated. (2024-02-18arrow-up-right)

  • Translation for 'pl' updated. (2024-02-18arrow-up-right)

  • Translation for 'pl' updated. (2024-02-18arrow-up-right)

  • Translation for 'pl' updated. (2024-02-18arrow-up-right)

  • bouquet: Allow merging of services across network bouquet, fixes #5617 ()

  • ci: Use correct version of merge commit block action (2024-02-18arrow-up-right)

  • ci: Block merge or autosquash commits in PRs (2024-02-17arrow-up-right)

  • docs: Fix broken Readme.md badge for builds (2024-02-17arrow-up-right)

  • Add automatic labels to PRs (2024-02-17arrow-up-right)

  • Remove broken codeball (2024-02-17arrow-up-right)

  • transifex: Translate tvheadend.js.pot in pl (2024-02-17arrow-up-right)

  • transifex: Translate tvheadend.js.pot in pl (2024-02-17arrow-up-right)

  • transifex: Translate tvheadend.js.pot in pl (2024-02-17arrow-up-right)

  • transifex: Translate tvheadend.js.pot in pl (2024-02-17arrow-up-right)

  • transifex: Translate tvheadend.js.pot in pl (2024-02-17arrow-up-right)

  • transifex: Translate tvheadend.js.pot in pl (2024-02-17arrow-up-right)

  • intl: update translation templates from code (2024-02-16arrow-up-right)

  • ci: use CURL for cloudsmith.sh and enable RPM upload (2024-02-15arrow-up-right)

  • Nightly build 4.3-2229arrow-up-right (2024-02-12)

  • CI: Ensure we clone the whole repo (2024-02-11arrow-up-right)

  • Nightly build 4.3-2228arrow-up-right (2024-02-10)

  • Nightly build 4.3-2227arrow-up-right (2024-02-10)

  • container: Add container support ()

  • transcoding: access the codec name only when codec pointer is valid (2024-02-09arrow-up-right)

  • Nightly build 4.3-2226arrow-up-right (2024-02-08)

  • dvr: Fix incorrect usage of strerror (2024-02-08arrow-up-right)

  • Release 12.34.16arrow-up-right (2024-02-07)

  • Add "recordings" to the backup exclude list ()

  • Nightly build 4.3-2224arrow-up-right (2024-02-06)

  • Nightly build 4.3-2223arrow-up-right (2024-02-06)

  • Correct description of Change Parameters flag (2024-02-06arrow-up-right)

  • Nightly build 4.3-2222arrow-up-right (2024-02-05)

  • descrambler: Fix Sky-UK descrambling (2024-02-05arrow-up-right)

  • transifex: Translate tvheadend.js.pot in en_US (2024-02-05arrow-up-right)

  • transifex: Translate tvheadend.js.pot in pt (2024-02-05arrow-up-right)

  • transifex: Translate tvheadend.js.pot in pt (2024-02-05arrow-up-right)

  • transifex: Translate tvheadend.js.pot in pt (2024-02-05arrow-up-right)

  • transifex: Translate tvheadend.js.pot in pt (2024-02-05arrow-up-right)

  • transifex: Translate tvheadend.js.pot in pt (2024-02-05arrow-up-right)

  • transifex: Translate tvheadend.js.pot in pt (2024-02-05arrow-up-right)

  • Release 12.34.17arrow-up-right (2024-02-04)

  • Nightly build 4.3-2214arrow-up-right (2024-02-04)

  • Nightly build 4.3-2213arrow-up-right (2024-02-04)

  • Nightly build 4.3-2212arrow-up-right (2024-02-04)

  • Nightly build 4.3-2211arrow-up-right (2024-02-04)

  • satipcli: Rename flag to include client reference ()

  • Nightly build 4.3-2210arrow-up-right (2024-02-03)

  • Remove sweep-ai again as it is not useful at all (2024-02-03arrow-up-right)

  • Mark PRs needing squashing as stale after a while (2024-02-03arrow-up-right)

  • Automatically comment on PRs needing squash (2024-02-03arrow-up-right)

  • Fix audio-only timeshift memory usage (2024-02-03arrow-up-right)

  • Sanitise filename in content-disposition header (2024-02-03arrow-up-right)

  • Nightly build 4.3-2209arrow-up-right (2024-02-02)

  • Nightly build 4.3-2207arrow-up-right (2024-02-02)

  • Nightly build 4.3-2206arrow-up-right (2024-02-02)

  • Release 12.34.18arrow-up-right (2024-02-02)

  • Clean up Debian postinst and postrm scripts ()

  • Fix handling of legacy configuration directories in debian/postinst ()

  • Configure Sweep (#1612) (2024-02-02arrow-up-right)

  • Add stale-bot for issues/PRs needing more info (2024-02-02arrow-up-right)

  • main: Warn about unexpected configuration location ()

  • Nightly build 4.3-2204arrow-up-right (2024-02-01)

  • Use sigaction() instead of signal() ()

  • Nightly build 4.3-2203arrow-up-right (2024-01-31)

  • Nightly build 4.3-2202arrow-up-right (2024-01-31)

  • Add timeshift support for audio-only channels (2024-01-31arrow-up-right)

  • templates: add log section to bug_report.yml (2024-01-31arrow-up-right)

  • Nightly build 4.3-2201arrow-up-right (2024-01-30)

  • Add missing Lithuanian string template (#1608) (2024-01-30arrow-up-right)

  • Nightly build 4.3-2200arrow-up-right (2024-01-28)

  • ci: fix cloudsmith.sh & add to CI workflow (2024-01-28arrow-up-right)

  • src: filesystem permission fixes (2024-01-24arrow-up-right)

  • templates: add feature_proposal.yml (2024-01-23arrow-up-right)

  • templates: add bug_report.yml (2024-01-23arrow-up-right)

  • templates: add config.yml (2024-01-23arrow-up-right)

  • ci: fix broken cloudsmith python (2024-01-23arrow-up-right)

  • ci: fix cloudsmith for python3.5 (2024-01-22arrow-up-right)

  • Nightly build 4.3-2193arrow-up-right (2024-01-21)

  • update to ffmpeg 6.1.1 (2024-01-21arrow-up-right)

  • Nightly build 4.3-2192arrow-up-right (2024-01-11)

  • Nightly build 4.3-2191arrow-up-right (2024-01-11)

  • descrambler: apply ICAM update from Chris230291 (2024-01-11arrow-up-right)

  • descrambler: avoid dlopen() (2024-01-11arrow-up-right)

  • Nightly build 4.3-2190arrow-up-right (2024-01-05)

  • Nightly build 4.3-2189arrow-up-right (2024-01-05)

  • linuxdvb: add DVB-S2X parameters (2024-01-05arrow-up-right)

  • descrambler: support ICAM if detected in libdvbcsa (2024-01-04arrow-up-right)

  • Nightly build 4.3-2188arrow-up-right (2024-01-01)

  • ci: fix raspios detection in cloudsmith.sh (2024-01-01arrow-up-right)

  • Nightly build 4.3-2187arrow-up-right (2023-12-26)

  • ci: rename build.yml to reduce confusion (2023-12-26arrow-up-right)

  • Nightly build 4.3-2186arrow-up-right (2023-12-18)

  • Makefile.ffmpeg nvenc update (2023-12-18arrow-up-right)

  • Release 12.34.19arrow-up-right (2023-12-13)

  • Nightly build 4.3-2184arrow-up-right (2023-12-13)

  • Transifex updates for project Tvheadend (#1587) ()

  • Remove references to Tvheadend Foundation. (2023-12-13arrow-up-right)

  • Nightly build 4.3-2183arrow-up-right (2023-12-11)

  • tfx: fix URLs in tvheadend/js files (2023-12-11arrow-up-right)

  • tfx: fix URLs in tvheadend/docs files (2023-12-11arrow-up-right)

  • tfx: fix URLs in tvheadend/c files (2023-12-11arrow-up-right)

  • hdhomerun: Add HDHomeRun server support for LiveTV only (#4461) (2023-12-09arrow-up-right)

  • Update copyright year and correct current surname (2023-12-09arrow-up-right)

  • github: add FUNDING.yml with OpenCollective link (2023-12-09arrow-up-right)

  • webui: remove old doc references to paypal (2023-12-09arrow-up-right)

  • webui: change donation button to opencollective (2023-12-09arrow-up-right)

  • Release 12.34.20arrow-up-right (2023-12-06)

  • Nightly build 4.3-2174arrow-up-right (2023-12-06)

  • Nightly build 4.3-2173arrow-up-right (2023-12-06)

  • Nightly build 4.3-2172arrow-up-right (2023-12-06)

  • Nightly build 4.3-2171arrow-up-right (2023-12-06)

  • Nightly build 4.3-2169arrow-up-right (2023-12-06)

  • WebUI: Update donation string as a test to Transifex feed (2023-12-06arrow-up-right)

  • ci: remove the test-compile workflow (2023-12-06arrow-up-right)

  • ci: schedule weekly coverity scans (2023-12-06arrow-up-right)

  • ci: add concurrency to the main CI workflows (2023-12-06arrow-up-right)

  • ci: remove references to doozer (2023-12-06arrow-up-right)

  • ci: remove references to travis (2023-12-06arrow-up-right)

  • ci: don't trigger cloudsmith on .github changes (2023-12-06arrow-up-right)

  • Add Parental Rating Labels (2023-12-05arrow-up-right)

  • Nightly build 4.3-2167arrow-up-right (2023-12-01)

  • Nightly build 4.3-2166arrow-up-right (2023-12-01)

  • gitignore: add debian/.debhelper folder (2023-12-01arrow-up-right)

  • ci update build config (2023-12-01arrow-up-right)

  • update libvpx to 1.13.1 (2023-11-29arrow-up-right)

  • update x264 to c196240 (2023-11-29arrow-up-right)

  • update ffmpeg to 6.0.1 (2023-11-29arrow-up-right)

  • Nightly build 4.3-2162arrow-up-right (2023-11-28)

  • Fix builds on stretch (2023-11-28arrow-up-right)

  • Nightly build 4.3-2161arrow-up-right (2023-11-21)

  • Add rpi-bookworm to targets (2023-11-21arrow-up-right)

  • Nightly build 4.3-2160arrow-up-right (2023-11-20)

  • Update ffmpeg to 5.1.4 (2023-11-20arrow-up-right)

  • Correct handling of Remove and Ignore settings (2023-10-26arrow-up-right)

  • Release 12.34.21arrow-up-right (2023-10-15)

  • Release 12.34.22arrow-up-right (2023-10-14)

  • 6310 Set 'okay' default to True (2023-10-14arrow-up-right)

  • Removed nested function 'appendPidRange' from within function 'tvhdhomerun_frontend_update_pids' (2023-10-14arrow-up-right)

  • Fix non-admin users not receiving any updates in web UI ()

  • Fix htsstr_argsplit (treat quotes inside an argument correctly) (2023-09-06arrow-up-right)

  • Release 12.34.23arrow-up-right (2023-08-12)

  • Release 12.34.24arrow-up-right (2023-08-12)

  • support/mkbundle: switch from distutils to setuptools (2023-08-11arrow-up-right)

  • webui/dvr: Add age_rating in recording details dialogs ()

  • webui/dvr: Remove unused & duplicated functions ()

  • Release 12.34.25arrow-up-right (2023-08-09)

  • Fix bug #6293 – Missing EIT EPG Content Type (2023-08-09arrow-up-right)

  • Fix some build and add more targets (2023-08-08arrow-up-right)

  • Nightly build 4.3-2149arrow-up-right (2023-08-06)

  • otamux: Make sure we use PRItime_t (2023-08-06arrow-up-right)

  • Use explicitly on format warnings for Time test ()

  • CI: Build (without cloudsmith) all targets on every merge request ()

  • CI: Run the full build with cloudsmith only on master (2023-08-05arrow-up-right)

  • Fix time for old 32bit systems ()

  • Nightly build 4.3-2144arrow-up-right (2023-08-02)

  • Add 'age rating' field to recording metadata (2023-08-02arrow-up-right)

  • Nightly build 4.3-2143arrow-up-right (2023-07-30)

  • Nightly build 4.3-2142arrow-up-right (2023-07-30)

  • Fix time for 32bit systems again ()

  • OTA Genre translation squashed v2 (2023-07-30arrow-up-right)

  • Nightly build 4.3-2141arrow-up-right (2023-07-19)

  • Bug Fix: OTA EIT Parental Rating (2023-07-19arrow-up-right)

  • Revert non-portable function to previous code (2023-06-25arrow-up-right)

  • Nightly build 4.3-2139arrow-up-right (2023-06-23)

  • Fix spelling errors encountered during previous work (2023-06-23arrow-up-right)

  • Update Debian packaging to use the new configuration directories ()

  • Fix configuration-loading logic to account for forking operation (2023-06-23arrow-up-right)

  • dvr_storage: Also support server configurations for recordings ()

  • Fix portability: Do not use linux/limits.h (2023-06-21arrow-up-right)

  • config: Fix whitespace errors ()

  • spawn: Do not close every possible file descriptor ()

  • dvr_storage: Use XDG spec directories ()

  • settings: Add XDG support helper functions ()

  • config: Support server configurations ()

  • config: Add support for XDG config ()

  • config: Store config directory variable internally ()

  • config: Deal with configuration before anything else (2023-06-16arrow-up-right)

  • Fix Fedora CI build (2023-06-15arrow-up-right)

  • Disable broken codeball (2023-06-12arrow-up-right)

  • Add simple 'ping' endpoint for healthchecks ()

  • Add Fedora RPM build to Github Actions (2023-06-07arrow-up-right)

  • Update config for Fedora 37/38 (2023-06-07arrow-up-right)

  • dvr_rec: Fix a buffer overflow in filename generation (2023-06-05arrow-up-right)

  • - fixed bug with _lang3_to_lang2() ()

  • Nightly build 4.3-2118arrow-up-right (2023-04-17)

  • update pict_type from AVPacket to AVFrame ()

  • update to ffmpeg 5.1.3 (2023-04-17arrow-up-right)

  • update to ffmpeg 5.1.2 ()

  • tv_meta_tvdb.py: Fix 'language' typo. (2023-04-08arrow-up-right)

  • Release 12.34.26arrow-up-right (2023-04-02)

  • tvhmeta: Fix tvhmeta authentication to the tvheadend API. (2023-04-02arrow-up-right)

  • Remove references to CLA which is no longer available (2023-04-02arrow-up-right)

  • updated 'AVCodec' to 'const AVCodec' (2023-04-01arrow-up-right)

  • remove deprecate struct vaapi_context and the vaapi.h (2023-03-30arrow-up-right)

  • Remove deprecated get_best_effort_timestamp() call (2023-03-25arrow-up-right)

  • remove ffmpeg component avresample (2023-03-24arrow-up-right)

  • iconv: Allow using GNU libiconv (2023-03-23arrow-up-right)

  • remove unused function and migrate from AVBitStreamFilterContext to AVBSFContext ()

  • update to ffmpeg codecpar (2023-03-23arrow-up-right)

  • Revert "fix for 64bit time_t on 32bit systems" (2023-03-14arrow-up-right)

  • fix for 64bit time_t on 32bit systems (2023-03-08arrow-up-right)

  • update NASM to 2.16.01 (2023-03-06arrow-up-right)

  • update vaapi (2023-03-06arrow-up-right)

  • Don't attempt to approve PRs automatically (2023-03-06arrow-up-right)

  • Codeball should also label PRs that need review (2023-03-05arrow-up-right)

  • Fix for DVB Grabber and IPTV Stream (2023-02-24arrow-up-right)

  • RTSP redirect support fix and moved to http client (2023-02-24arrow-up-right)

  • Use codeball for PRs (2023-02-21arrow-up-right)

  • update to ffmpeg codecpar (2023-02-20arrow-up-right)

  • update ffmpeg from 4.4.1 to 4.4.3 (2023-02-12arrow-up-right)

  • update vaapi (2023-02-10arrow-up-right)

  • update vaapi ()

  • Fix Coverity-Build (#1499) ()

  • Revert "Update debian/compat to version 10" (2023-01-28arrow-up-right)

  • Ignore title mismatch if dup checking by CRID (2023-01-27arrow-up-right)

  • Update debian/compat to version 10 ()

  • Unify command time range to 10-300 ms (2023-01-24arrow-up-right)

  • Unify power up time range to 10-500 ms (2023-01-24arrow-up-right)

  • Add configurable delays after Unicable operations (2023-01-24arrow-up-right)

  • Unify names and order of Unicable-specific configuration fields (2023-01-24arrow-up-right)

  • Add descriptions to the existing Unicable configuration fields (2023-01-24arrow-up-right)

  • update vaapi ()

  • descrambler: cccam: move send keepalive message to traces (2023-01-23arrow-up-right)

  • descrambler: cccam - simplify cccam_handle_keys() (2023-01-23arrow-up-right)

  • descrambler: cclient: optimisation for multiple key clients (2023-01-23arrow-up-right)

  • descrambler: cosmetic cleanups, more CAID logs (2023-01-23arrow-up-right)

  • descrambler: cwc: do not register bad provider numbers for betacrypt and irdeto (2023-01-22arrow-up-right)

  • descrambler: cwc: Fix the additional card registration (mgclient option in oscam) (2023-01-22arrow-up-right)

  • grammar: Replace "then" with "than" (2023-01-17arrow-up-right)

  • Preserve existing Unicable idnode during the set operation ()

  • updated function _video_filters_get_filters() (2023-01-14arrow-up-right)

  • profile video resize improvements ()

  • Add autorec duplicate handling default to dvr config. (2023-01-10arrow-up-right)

  • update vaapi ()

  • remove libavresample from build scripts (2023-01-10arrow-up-right)

  • Add amd64 jammy to builds (2023-01-04arrow-up-right)

  • Fix a few more builds, add kinetic support (2022-12-21arrow-up-right)

  • Allow old builds to pass (2022-12-21arrow-up-right)

  • Build for kinetic instead of impish (2022-12-21arrow-up-right)

  • Remove variable declaration from for-loop (2022-12-17arrow-up-right)

  • Don't fail on strict aliasing violations (2022-12-17arrow-up-right)

  • Don't confuse GCC with zero-length array (2022-12-10arrow-up-right)

  • config: Enable HbbTV parser by default (2022-11-28arrow-up-right)

  • dvb_psi_pmt: Recognise AC-4 audio descriptor (2022-11-28arrow-up-right)

  • Add South Africa to Countries list. (2022-11-28arrow-up-right)

  • Build various targets and prepare new repository (#1476) (2022-11-27arrow-up-right)

  • Avoid breaking strict aliasing in IP_AS_V{4,6} ()

  • Remove always-true checks (2022-11-21arrow-up-right)

  • Reduce ADTS header size for better compatibility (2022-11-21arrow-up-right)

  • Simplify IPv6 compare functions to unconfuse gcc compiler ()

  • Don't call epg_broadcast_set_description twice (2022-11-21arrow-up-right)

  • Don't crash the wizard if tvh has no inputs ()

  • Serve static html files with mimetype text/html (2022-11-21arrow-up-right)

  • Use application/json instead of text/x-json as mimetype (2022-11-21arrow-up-right)

  • epgdb: Resolve symlinks before using file location ()

  • Increase maximum ADTS packet size to match FFMPEG (2022-11-10arrow-up-right)

  • iptv_auto: Add support for m3u "channel-number" tag ()

  • Fix race condition/data corruption in imagecache (2022-10-27arrow-up-right)

  • Fix bad mono2sec usage (2022-10-27arrow-up-right)

  • Attempt to fix profile sharer memory leak (2022-10-27arrow-up-right)

  • Attempt to fix HBBTV memory leak (2022-10-26arrow-up-right)

  • Fix typo (2022-10-26arrow-up-right)

  • Revert 4355488b8e1e868cb434bf95676c0944b44e88b3 (2022-10-26arrow-up-right)

  • Close FDs even if no UDP connection is used (2022-10-26arrow-up-right)

  • Fixed typo (2022-10-26arrow-up-right)

  • Update regexps for the finnish EIT scraping (2022-10-16arrow-up-right)

  • mpegts dvb: Add support for LCN for provider DigiTV (2022-10-14arrow-up-right)

  • output: UDP streaming (2022-10-07arrow-up-right)

  • Fix potential memory leak (2022-10-07arrow-up-right)

  • Ignore PCRE2 illegal accesses (2022-10-07arrow-up-right)

  • Avoid leaking iptv fd's (2022-10-07arrow-up-right)

  • Added support for ATSC text mode == 0x3F (2022-10-03arrow-up-right)

  • Fix FTBFS introduced by 86f3617c8972c5362e51cee7d34cc2d69d799126 (2022-09-15arrow-up-right)

  • Fix crash when mpegts_service_refresh tries to open the CAT again (2022-09-15arrow-up-right)

  • Added more 'text modes' to the ATSC Multiple String Structure decoder and convert text to UTF-8. (Fixes #5162) ()

  • Allow network scan to modify muxes (2022-09-03arrow-up-right)

  • Fixed and cleanup the "PSIP: ATSC Grabber" module (Fixes #5610) ()

  • Regexps for the finnish EIT scraping (2022-07-17arrow-up-right)

  • extending the regexps for the italian EIT scraping (2022-07-08arrow-up-right)

  • Fix use-after-free ()

  • No longer use git-protocol (2022-06-17arrow-up-right)

  • add Access-Control-Allow-Headers content-length (2022-04-22arrow-up-right)

  • Update Copyright year (2022-04-14arrow-up-right)

  • Travis CI is dead, use GitHub actions for badge (2022-04-11arrow-up-right)

  • GitHub actions improvements (2022-04-11arrow-up-right)

  • Use GitHubs CI for Building (2022-04-11arrow-up-right)

  • Add HMF_UUID to htsmsg_binary_write (2022-04-11arrow-up-right)

  • Prevent deadlock-detector leaking memory (2022-04-08arrow-up-right)

  • Remove useless null-check on an array (2022-04-08arrow-up-right)

  • Fix potential null-pointer-dereference (2022-04-08arrow-up-right)

  • Fix FTBFS in utils.c (2022-04-07arrow-up-right)

  • fix build with libressl ()

  • Always parse 'src' in RTSP-requests (2022-04-05arrow-up-right)

  • dvr_disk_space_cleanup() - do not return error if called again too soon (#1) ()

  • Update for VAAPI transcoding ()

  • SAT>IP client: UPnP header field names are case insensitive (2022-03-15arrow-up-right)

  • More doozer build fixes (2022-02-14arrow-up-right)

  • Fix doozer CentOS build (2022-02-14arrow-up-right)

  • Fix sid doozer build (2022-02-14arrow-up-right)

  • Update Python shebangs to python3 (2022-02-14arrow-up-right)

  • Update RPM to python3 (2022-02-13arrow-up-right)

  • Doozer fixes (2022-02-13arrow-up-right)

  • Fix doozer builds (2022-02-13arrow-up-right)

  • Fix some failing builds (2022-02-13arrow-up-right)

  • Add --nowerror to build for RPM packages (2022-02-13arrow-up-right)

  • Fix failing builds again (2022-02-12arrow-up-right)

  • doozer: Migrate to Fedora 34 and 35 (2022-02-12arrow-up-right)

  • Update buffer size for h264 and hevc (2022-02-12arrow-up-right)

  • Changed debian package version to 7 (2022-02-12arrow-up-right)

  • epg: ignore past events when matching on eid (2022-02-12arrow-up-right)

  • httpc: Fix multi-value "Connection" header checks ()

  • Episode number regexp (2022-01-12arrow-up-right)

  • Fix some issues introduced in #0165f365cd58bbcc3734e4ec9ce696b42870ff8e (2022-01-10arrow-up-right)

  • Fix "as: invalid option" during libvpx compilation (2022-01-09arrow-up-right)

  • nvenc: Fix Werror=int-conversion FTBFS (and likely bug) ()

  • nvenc: Fix Werror=misleading-indentation FTBFS ()

  • some changes to nvenc (2022-01-02arrow-up-right)

  • Update Makefile.ffmpeg (2022-01-02arrow-up-right)

  • configure: add execinfo option (2022-01-02arrow-up-right)

  • iptv: Fix stream limit starting a new input on a running mux ()

  • Check the return code of snprintf in utils.c:rmtree (2021-12-12arrow-up-right)

  • Use clock_gettime() instead of time() in epggrab.c ()

  • Improve the performance of updating the pid filter table in hdhomerun digital tuners. ()

  • Fixed parsing w_scan format (2021-11-15arrow-up-right)

  • opentv: fix missing summary data on rescrape, #5995 ()

  • opentv: fix incorrect summaries for skyuk epg, fixes #5995 ()

  • Revert "Remove unnecessary conversion" (2021-09-07arrow-up-right)

  • Remove unnecessary conversion (2021-09-06arrow-up-right)

  • Expose RDS flag via HTSP. (2021-09-06arrow-up-right)

  • Add support for SCT_RDS (2021-09-06arrow-up-right)

  • Upgrade to libhdhomerun_20210624 (2021-07-29arrow-up-right)

  • Fix ffmpeg jessie build error (2021-07-24arrow-up-right)

  • Attempt to fix jessie build (2021-07-23arrow-up-right)

  • Attempt to fix jessie build (2021-07-23arrow-up-right)

  • Attempt to fix trusty and centos builds (2021-07-23arrow-up-right)

  • Autobuild: Add arm64, armhf and armel for bullseye and buster. (2021-07-23arrow-up-right)

  • Doozer.io: Add build targets for Debian, Bullseye & Sid (2021-07-23arrow-up-right)

  • Fix slow loading bandwidth monitor graph in status tab (2021-07-21arrow-up-right)

  • As we no longer have access to #hts on freenode swap to using libera - see https://tvheadend.org/issues/6054 (2021-06-12arrow-up-right)

  • Add NVIDIA Hardware accelerated decoding for transcoding (2021-06-09arrow-up-right)

  • Fix EN50211 size for large messages (2021-05-31arrow-up-right)

  • Update ffmpeg to 4.4 (2021-05-05arrow-up-right)

  • Fix missing } from previous commit (2021-05-05arrow-up-right)

  • Allow PMT Parsing when PMT shares a PID with another table (2021-05-05arrow-up-right)

  • SAT>IP-Client: Add option for 16, 24 and 32-channel DVB-C tuners (2021-05-04arrow-up-right)

  • seen is a unsigned type (2021-05-04arrow-up-right)

  • else is missing (2021-05-04arrow-up-right)

  • Update .gitignore (2021-05-01arrow-up-right)

  • Delete .DS_Store (2021-05-01arrow-up-right)

  • Delete .DS_Store (2021-05-01arrow-up-right)

  • Delete .DS_Store (2021-05-01arrow-up-right)

  • specified the value on each line (2021-05-01arrow-up-right)

  • Update profile.c (2021-05-01arrow-up-right)

  • Improve Readme.md file with a more visual approach (2021-04-21arrow-up-right)

  • Move travis builds from trusty to bionic (2021-04-20arrow-up-right)

  • Add pid file hint for systemd-sysv-generator (2021-04-02arrow-up-right)

  • Update libssl-dependency information (2021-04-02arrow-up-right)

  • Fix possible deadlock (2021-04-02arrow-up-right)

  • remote timeshift: fix compilation with IPTV disabled (2021-03-19arrow-up-right)

  • Upgrade to libhdhomerun_20210224 (2021-03-17arrow-up-right)

  • Try to fix error during compilation (2021-03-16arrow-up-right)

  • Reset error counters for IPTV on start, issue #5760 (2021-03-16arrow-up-right)

  • remote timeshift: fix crash on multiple subscriptions and cleanup (2021-03-16arrow-up-right)

  • iptv: new features for multicast, rtsp & rtcp ()

  • Fix possible NULL-Pointer-reference (2021-03-12arrow-up-right)

  • Fix issues identified by coverity (2021-02-24arrow-up-right)

  • EMM patch (2021-02-24arrow-up-right)

  • Attempt to fix nvenc encoding (2021-02-21arrow-up-right)

  • Several coverity fixes, year updated, map muxes between DVB Types ()

  • Rewrite scanfile.c for dynamic memory allocation (#1387) (2021-02-20arrow-up-right)

  • Several enhancements ()

  • Fix more issues identified by coverity (2021-02-18arrow-up-right)

  • Fix crash when using matroska profile (2021-02-18arrow-up-right)

  • More coverity fixes (2021-02-18arrow-up-right)

  • Fix several issues discovered by coverity (2021-02-18arrow-up-right)

  • Remove link to bintray as they will shutdown in 2 weeks (2021-02-18arrow-up-right)

  • Move from travis-ci.org to travis-ci.com and update date (2021-02-18arrow-up-right)

  • Silence more x265 warnings (2021-02-18arrow-up-right)

  • Enable LIBX265_DIFFS again (2021-02-18arrow-up-right)

  • Add accidentally deleted line again (2021-02-18arrow-up-right)

  • Fix uninitialised memory access for several ioctl commands (#1382) (2021-02-18arrow-up-right)

  • Fix too small memory allocation (2021-02-17arrow-up-right)

  • Add ISDB-T in hdhomerun (2020-12-29arrow-up-right)

  • fix vaapi-profiles (#1366) ()

  • Added ISDB-T SATIP Support (2020-12-29arrow-up-right)

  • Upgrade to libhdhomerun_20200907 (2020-12-29arrow-up-right)

  • Fix possible deadlock when using tvh_mutex_trylock() (2020-12-16arrow-up-right)

  • Sat>IP clear old signal info when opening new stream (2020-12-14arrow-up-right)

  • Remove libva-x11 dependency (2020-12-06arrow-up-right)

  • docs: fix simple typo, separately -> separately (2020-11-27arrow-up-right)

  • in python 3, dict.has_key() has been removed (2020-11-14arrow-up-right)

  • Changed shebang of tvhmeta to python (2020-10-28arrow-up-right)

  • Correct Environment variable name. (2020-10-28arrow-up-right)

  • Silence x265 warnings (#1368) (2020-10-27arrow-up-right)

  • Add removed checksum (2020-10-27arrow-up-right)

  • Use https for downloading ffmpeg and update nv-codec-headers (2020-10-27arrow-up-right)

  • Change no_sanitize("thread") attributes (2020-10-22arrow-up-right)

  • Adding polish scraper for DVBC (2020-10-21arrow-up-right)

  • Fix #5962 (2020-10-19arrow-up-right)

  • Make focal use python3 for upload (2020-10-14arrow-up-right)

  • Attempt to fix focal build in doozer (2020-10-14arrow-up-right)

  • Fix vaapi patch (2020-10-12arrow-up-right)

  • Remove wrong test in nvenc.c (2020-10-08arrow-up-right)

  • Fix NVENC ()

  • update Makefile.ffmpeg (#1359) ()

  • Fix cut & paste error in api/epg. (#1360) (2020-10-08arrow-up-right)

  • Revert dca46eedd9653b90d2722e67281eed0b35740730 (2020-09-28arrow-up-right)

  • Fix scraping 'new' flag from UK EIT. ()

  • Upgrade to libhdhomerun_20200521 (2020-09-13arrow-up-right)

  • Fix TheTVDB Query (2020-07-13arrow-up-right)

  • Fix escape code '&quote;' should be '"'. (#1355) ()

  • HTSP v35: Add support for recording file size (2020-07-11arrow-up-right)

  • Revert "HTSP v35: Add support for recording file size" (#1352) (2020-07-11arrow-up-right)

  • Attempt to fix doozer build/python2/3 detection (2020-07-07arrow-up-right)

  • Additional sanity check (2020-07-06arrow-up-right)

  • Report AAC and AAC-LATM correctly. Always raw stream AAC audio as audio/aac. (2020-07-06arrow-up-right)

  • see https://tvheadend.org/issues/5722 (2020-07-06arrow-up-right)

  • Handle bad UTF-8 in xmltv (#5909) ()

  • Replace long by int64_t in json parser, fixes #5844 (#1349) (2020-07-06arrow-up-right)

  • Fix memory leak (2020-06-10arrow-up-right)

  • Allocate space for buf on heap (modified PR #1324) (2020-06-08arrow-up-right)

  • Allocate space for buf on heap (modified PR #1324) (2020-06-08arrow-up-right)

  • xmltv: add program icon to exported xmltv. Fixes: #5685 (2020-06-08arrow-up-right)

  • Fix infinite loop when parsing invalid EIT CRID data (2020-06-05arrow-up-right)

  • Fix building with -fno-common (default from GCC 10) (2020-06-03arrow-up-right)

  • Change nv-codec-headers path, fixes #5901 (2020-05-22arrow-up-right)

  • Add python3 requests dependency (2020-05-22arrow-up-right)

  • Changed default .pid path from /var/run/tvheadend.pid to /run/tvheadend.pid to follow "new" FSH 3 standard (2020-05-21arrow-up-right)

  • dvbpsi: Fix build when DVB is not enabled at all (2020-05-21arrow-up-right)

  • Update Copyright date on UI 'About' screen. (2020-05-21arrow-up-right)

  • Drop focal i386 support (2020-05-19arrow-up-right)

  • Fix doozer builds (2020-05-19arrow-up-right)

  • Fix doozer builds (2020-05-19arrow-up-right)

  • Attempt to fix doozer builds (#1340) (2020-05-18arrow-up-right)

  • Use python3 if available (2020-05-18arrow-up-right)

  • Makefile.ffmpeg: update almost all upstream packages ()

  • CSS: general improvements ()

  • Deprecate python2, add support for python3 (#1338) (2020-05-17arrow-up-right)

  • Use HTTPS for libhdhomerun download (2020-05-15arrow-up-right)

  • Upgrade to libhdhomerun_20200225 (2020-05-15arrow-up-right)

  • Move from cosmic to focal (#1337) (2020-05-15arrow-up-right)

  • Update copyright and packages link (2020-05-15arrow-up-right)

  • Use python3 on focal (2020-05-15arrow-up-right)

  • Fix buffer overflow (2020-05-15arrow-up-right)

  • Prevent buffer overflow, fixes #5896 (2020-05-15arrow-up-right)

  • Move forward from cosmic to focal (2020-05-15arrow-up-right)

  • HTSP v35: Add support for recording file size (2020-05-14arrow-up-right)

  • Fix the query URL for IMDB website. (#1327) (2020-05-14arrow-up-right)

  • Fix #5782 (2019-11-28arrow-up-right)

  • esstream: fix NULL dereference in elementary_set_filter_build(), fixes #5787 (2019-11-28arrow-up-right)

  • capmt: fix the input filter (2019-11-15arrow-up-right)

  • mpegts service: fix the build without mpegts_dvb (see PR#1321) (2019-11-04arrow-up-right)

  • service: fix the default return value for service_get_source() (2019-11-04arrow-up-right)

  • docs: add hint on shell redirections (#5761) (2019-11-01arrow-up-right)

  • satip client: try to fix the missing poll file descriptor removal, issue #5496 (2019-11-01arrow-up-right)

  • tvhpoll: add event helpers, code cleanups (2019-10-31arrow-up-right)

  • htsstr: fix the wrong argument parsing, fixes #5761 (2019-10-31arrow-up-right)

  • htsstr: add htsstr_argsplit() test (2019-10-31arrow-up-right)

  • tvhpoll: add tvhpoll_set_trace() (2019-10-28arrow-up-right)

  • Remove dead assignment (2019-10-28arrow-up-right)

  • Webui: minimal reworks for access theme (2019-10-27arrow-up-right)

  • xmltv: Fix xmltv_ns typo, fixes #5720 (2019-10-27arrow-up-right)

  • webui: m3u playlist - mark tag playlists with type=playlist, fixes #5663 (2019-10-24arrow-up-right)

  • tvhdhomerun: fix the cablecard access in tvhdhomerun_frontend_monitor_cb() (2019-10-21arrow-up-right)

  • api: return EPERM for the empty arguments, fixes #5755 (2019-10-21arrow-up-right)

  • satip client: allow to set the rolloff to all possible combinations (2019-10-21arrow-up-right)

  • satip client: SATIP Kathrein & Triax: Avoid mandatory rolloff on DVBS2, fixes #5517 (2019-10-21arrow-up-right)

  • access: added missing break for connection limit type (2019-10-21arrow-up-right)

  • dvr: fix the DVR limit per user condition (subtract self) (2019-10-21arrow-up-right)

  • access: allow to change/set xmltv/htsp output format per matched entry (2019-10-21arrow-up-right)

  • access.h: reorder access_t (format members) (2019-10-21arrow-up-right)

  • Fix division by 0, fixes #5754 (2019-10-20arrow-up-right)

  • dvb psi: fix the removed MPEG2VIDEO assignment, fixes #5752 (2019-10-19arrow-up-right)

  • mux grid: enable 'hide: parent disabled' (2019-10-18arrow-up-right)

  • dvb psi: add 0x87 estype as EAC3 (ATSC), fixes #5684 (2019-10-17arrow-up-right)

  • iptv: fix integer overflow on 32-bit platforms (2019-10-15arrow-up-right)

  • linuxdvb: fix integer overflow on 32-bit platforms (2019-10-15arrow-up-right)

  • Avoid configure checks being optimised away with LTO ()

  • packaging: add missing DEBHELPER placeholder to postrm script (2019-10-15arrow-up-right)

  • Fixed bad quality for vaapi transcoding h264 and hevc with bitrate (2019-10-15arrow-up-right)

  • systemd service file: remove wildcard mounts preventing startup - replace with a note (2019-10-15arrow-up-right)

  • Upgrade to libhdhomerun_20190621 (2019-10-15arrow-up-right)

  • Mux scan: Log correction (2019-10-15arrow-up-right)

  • tvhcsa: shift the standard headers to top (2019-10-15arrow-up-right)

  • tvhcsa.c: include stdio.h ()

  • Added patch to HDHomerun library to allow cross-compilation (2019-10-15arrow-up-right)

  • xmltv: Avoid outputting lang tags in xmltv for only one language, fixes #5630 (2019-10-15arrow-up-right)

  • htsp: Allow basic htsp format, fixes #5630 (2019-10-15arrow-up-right)

  • xmltv: Allow sending basic xmltv format, fixes #5630 ()

  • channels: Make const-correct. (2019-10-15arrow-up-right)

  • autobuild: add build target for raspbian-buster (2019-10-15arrow-up-right)

  • bugfix for autorecs duplicate episode number detection in autorecs (2019-10-15arrow-up-right)

  • api: fix the wrong negative error codes, fixes #5743 (2019-10-14arrow-up-right)

  • linuxdvb: take in account similar dmx for the exclusive tuner access, fixes #5744 (2019-10-14arrow-up-right)

  • linuxdvb: compilation fix, fixes #5739 (2019-10-06arrow-up-right)

  • man page: Correct default values for http and htsp port (2019-10-06arrow-up-right)

  • bouquet: fix overflow when building for 32-bit system On 32-bit system hash value from service can be truncated. (2019-10-06arrow-up-right)

  • service: correct fhdtv/uhdtv height checks (2019-10-06arrow-up-right)

  • add FHD quality support (2019-10-06arrow-up-right)

  • linuxdvb: do not mix DVBv3/v5 stats, it causes trouble to drivers, fixes #5625 (2019-10-06arrow-up-right)

  • satip client: add ATSC- string parsing, issue #5728 (2019-10-06arrow-up-right)

  • cclient: more ECM PID fixes, reorder code to be more readable, fixes #5659 (2019-08-02arrow-up-right)

  • cclient: mark correctly ECM PID for close, fixes #5659 (2019-07-29arrow-up-right)

  • cclient: fix the ECM PID flag for newcamd and cccam, fixes #5659 (2019-07-06arrow-up-right)

  • Include stdio.h before tvheadend headers (2019-07-02arrow-up-right)

  • revert bogus ONID and TSID remapping (2019-06-30arrow-up-right)

  • mpegts: use 32-bit tsid/onid to define the NONE /unset/ state properly (2019-06-30arrow-up-right)

  • linuxdvb: fix signal status monitor (2019-06-30arrow-up-right)

  • Fix compilation with libhdhomerun 20190621 (2019-06-30arrow-up-right)

  • Makefile: fix -pie linking according to --disable-pie (2019-06-30arrow-up-right)

  • capmt: another compilation fix, fixes #5661 (2019-06-18arrow-up-right)

  • capmt: fix compilation with recent gcc, fixes #5657 (2019-06-17arrow-up-right)

  • capmt: fix for the oscam r11520+, fixes #5649 (2019-06-12arrow-up-right)

  • en50221: fix menu text decoding (2019-05-20arrow-up-right)

  • en50221: fix invalid htsmsg manipulation (2019-05-20arrow-up-right)

  • fanart: Fix decode error. (2019-05-20arrow-up-right)

  • dvbpsi: fix the freesat bouquet update (inverted condition), fixes #5572 (2019-03-24arrow-up-right)

  • api: return an error when incomplete query is passed, fixes #5568 (2019-03-21arrow-up-right)

  • linuxdvb: use the right configuration root for the slave tuners (loading), issue #5128 (2019-03-20arrow-up-right)

  • linuxdvb: create the mux instances also for the slave tuners, issue #5128 (2019-03-20arrow-up-right)

  • Freesat_huffman: Suppress characters < 0x20 except \n. (2019-03-15arrow-up-right)

  • http server: fix digest MD5 authorization, fixes #5573 (2019-03-13arrow-up-right)

  • Add sat longitude and usals angle as parameters to the rotor external command (2019-03-13arrow-up-right)

  • Update to newest ffmpeg to fix libX11 compile issue "DSO missing from commandline" (2019-03-13arrow-up-right)

  • utils: sbuf - use correct format character, fixes #5565 (2019-03-07arrow-up-right)

  • freesat bouquet parser: fix endless loop (double list insert), fixes #4851 (2019-03-06arrow-up-right)

  • utils: cosmetic fix for sbuf_alloc_fail (2019-03-06arrow-up-right)

  • eit: fix the possible NULL dereference (2019-03-06arrow-up-right)

  • SAT>IP: fix done - close sessions only when server is active (2019-03-06arrow-up-right)

  • mpegts: fix the idle scan (use another idle scan queue - fixes #5548) (2019-03-02arrow-up-right)

  • tvh thread: increase the default watchdog timeout to 15 seconds (2019-03-02arrow-up-right)

  • tvh-json.py: the list is returned instead dictionary (2019-03-01arrow-up-right)

  • Prevent rebinding when refreshing SAT-IP Server settings and not changing port, fixes #5539 (2019-03-01arrow-up-right)

  • systemd: service/unit should not be started until after file-systems are mounted - this avoids "file missing" errors (2019-03-01arrow-up-right)

  • iptv: another improvement in the thread exit procedure, fixes #5550 (2019-02-28arrow-up-right)

  • iptv: improve the thread exit procedure - use pipe, fixes #5550 (2019-02-27arrow-up-right)

  • iptv: improve the thread exit procedure, issue #5550 (2019-02-27arrow-up-right)

  • satip client: initialise variable _w correctly for the PIDs split rewrite, fixes #5544, issue #5549 (2019-02-16arrow-up-right)

  • satip client: fix the compilation, fixes #5547 (2019-02-16arrow-up-right)

  • satip client: fix for the PIDs split - missing delpids, issue #5544 (2019-02-15arrow-up-right)

  • Triax & Kathrein: Increase pid length, issue #5544 (2019-02-15arrow-up-right)

  • satip client: improve the PIDs split for the PLAY RTSP command, fixes #5544 (2019-02-15arrow-up-right)

  • Added compatibility mode for SAT-IP tuners that mess up tuner numbers, for example FritzBox 6490/6590 (2019-02-14arrow-up-right)

  • Fix description of RTP/AVP/TCP Mode (2019-02-14arrow-up-right)

  • satip client: workaround for FritzBox 6490/6590 (status string parsing), rewritten PR#1256 (2019-02-14arrow-up-right)

  • http: digest - do not use EVP_sha512_256() for nonce, check openssl version (2019-02-14arrow-up-right)

  • http: digest - return back MD5 as only digest hash (multiple login dialogs for firefox/chrome) (2019-02-14arrow-up-right)

  • http: digest - show the SHA hash as an authentication alternative (tested with curl) (2019-02-14arrow-up-right)

  • mpegts input: fix the compilation error, fixes #5492 (2019-02-14arrow-up-right)

  • http server: fix the new digest hashes (apparently firefox nor chrome do support them) (2019-02-14arrow-up-right)

  • mpegts: pid subscription - fix wrong mps_type mpegts_mps_cmp(), fixes #5492 (2019-02-14arrow-up-right)

  • http server: add support for SHA-256 and SHA-512/256 digest hashes (2019-02-13arrow-up-right)

  • esfilter: cosmetic fix (2019-02-12arrow-up-right)

  • esfilter: fix the wrong other mask (hbbtv), fixes #5531 (2019-02-12arrow-up-right)

  • descrambler: simplify some destroy sequences (2019-02-11arrow-up-right)

  • channel: get number - select the lowest service number, fixes #5441 (2019-02-11arrow-up-right)

  • dvb psi: fix hbbtv parsing, fixes #5531 (2019-02-09arrow-up-right)

  • Corrected local_ip description text (2019-02-04arrow-up-right)

  • Log an error message if the configured IP address is invalid (2019-02-04arrow-up-right)

  • Move HDHomeRun config fields into their own group in the UI (2019-02-04arrow-up-right)

  • Avoid caching HDHomeRun's IP address (2019-02-04arrow-up-right)

  • Assign a different port number for each frontend thread (2019-02-04arrow-up-right)

  • Changes to make tvheadend work in a container while talking to HDHomerun (2019-02-04arrow-up-right)

  • dvr: New fmt spec for per-dir seasons and one movie per dir. (#4667) ()

  • dvr: Add {min,max}season and {min,max}year to autorec UI, fixes #5479 (2019-02-04arrow-up-right)

  • dvr: Only check minseason/maxseason/minyear/maxyear if EPG has these values, fixes #5479 ()

  • Kathrein EXIP: Add default config (SATIP) (2019-02-04arrow-up-right)

  • Update posix.mk (2019-02-04arrow-up-right)

  • CSS: Fixes (2019-02-04arrow-up-right)

  • WebUI: Update copyright year (2019-02-04arrow-up-right)

  • m3u: fix the NULL dereference if the input string cannot be converted to utf-8, fixes #5525 (2019-02-04arrow-up-right)

  • satip server: parse destination for RTP/AVP transfer (2019-01-24arrow-up-right)

  • satip client: fix the network limit/group description (2019-01-23arrow-up-right)

  • satip server: add icon files, fixes #5268 (2019-01-21arrow-up-right)

  • eit: config - fix the json syntax error, fixes #5503 (2019-01-18arrow-up-right)

  • eit: fix UK Cable Virgin configuration, fixes #5499 (2019-01-18arrow-up-right)

  • mpegts dvb network: fix create mux - wrong class used for comparison (since commit dbee3d2049faa7d5e15374ddef37a91e86768b26), fixes #5486 (2019-01-17arrow-up-right)

  • mpegts network: stop all running muxes when the network was disabled by the user, fixes #5497 (2019-01-15arrow-up-right)

  • mpegts input: change mpegts_input_tuning_error() to more universal mpegts_input_error() (2019-01-15arrow-up-right)

  • server.h: cleanups for TSS_ flags (2019-01-15arrow-up-right)

  • iptv auto network: check the network enabled flag for the auto download (2019-01-14arrow-up-right)

  • service: enlist - use also is_enabled callback to check the network/mux enable state (2019-01-14arrow-up-right)

  • otamux: fix the 15 seconds delay for the initial scan (2019-01-14arrow-up-right)

  • mpegts: add possibility to enable/disable network (2019-01-14arrow-up-right)

  • http: CORS - small optimisation (2019-01-14arrow-up-right)

  • http: CORS - add Access-Control-Allow-Credentials header for cookies (2019-01-14arrow-up-right)

  • parse_ac3: avoid the endless loop for the AC3/EAC3 auto-detection, issue #5353 (2019-01-13arrow-up-right)

  • otamux: fix NULL dereference, fixes #5488 (2019-01-09arrow-up-right)

  • doozer: remove OOL Fedora 27 (2019-01-09arrow-up-right)

  • Makefile.ffmpeg: upgrade ffmpeg to 4.1, x264 to 20190108, x265 to 2.9 (2019-01-09arrow-up-right)

  • avahi: try to fix double free, fixes #5484 (2019-01-08arrow-up-right)

  • DVR: add utf8 validator for title/subtitle when cut (2019-01-08arrow-up-right)

  • epg: add auto-ota-module detection (2019-01-08arrow-up-right)

  • epggrab: reimplement the OTA grabber selection per mux (2019-01-08arrow-up-right)

  • ui: Make dialogs slightly bigger. (2019-01-02arrow-up-right)

  • api: Alternative showings match on title if no series link, fixes #5402 (2019-01-02arrow-up-right)

  • Fix several errors detected by w3c css validator (2019-01-02arrow-up-right)

  • Add missing !DOCTYPE html (2019-01-02arrow-up-right)

  • CSS: Fix height % (2019-01-02arrow-up-right)

  • main: Replace deprecated ERR_remove_state (2019-01-02arrow-up-right)

  • eit: always prefer master rather than slave for the config, issue #5247 (2019-01-02arrow-up-right)

  • eit config: fix the uk_freesat_eit description, issue #5247 (2019-01-01arrow-up-right)

  • eit: another attempt to fix the freesat issue (slave eit), fixes #5247 (2019-01-01arrow-up-right)

  • eit: try to fix the freesat issue, fixes #5247 (2019-01-01arrow-up-right)

  • xmltv: add support for the lcn tag, fixes #5471 (2019-01-01arrow-up-right)

  • satip client: remove the dual condition for Annex B (2019-01-01arrow-up-right)

  • satip client: fix the ATSC-C (Annex B) parameters, fixes #5447 (2019-01-01arrow-up-right)

  • cosmetic fixes and optimisations (2019-01-01arrow-up-right)

  • xmltv export: add LCN to the display-name attribute, fixes #5471 (2019-01-01arrow-up-right)

  • pass muxer: fix the incorrect section length for EIT table, fixes #5418, issue #5062 (2018-12-30arrow-up-right)

  • teletext: fix the subtitle parser (wrong SCT_ type match), issue #5422 (2018-12-28arrow-up-right)

  • htsp server: use HTTP image URLs for image cache for older clients (pvr.hts), fixes #5455 (2018-12-28arrow-up-right)

  • imagecache: the timer function is already called inside imagecache_lock (sorry), fixes #5458 (2018-12-26arrow-up-right)

  • hdhomerun: auto detect DVB_T devices (2018-12-26arrow-up-right)

  • imagecache: fix the missing ref initialisation, fixes #5458 (2018-12-26arrow-up-right)

  • Fix mpegts packet length in descrambler_data_key_check (2018-12-25arrow-up-right)

  • imagecache: do not use global lock, fixes #5453 (2018-12-25arrow-up-right)

  • Revert "dvr: move dvr_notify() call to the global_lock using timers, fixes #5437" (2018-12-25arrow-up-right)

  • cclient: check keep-alive also when no poll event occurs, fixes #5445 (2018-12-22arrow-up-right)

  • mpegts: fix mpegts_service_find_e2() for atsc-t (2018-12-22arrow-up-right)

  • caclient: handle correctly connection close / read error, fixes #5445 (2018-12-22arrow-up-right)

  • satip server: fix ATSC-T / Annex B cable frequency parsing, fixes #5447 (2018-12-20arrow-up-right)

  • linuxdvb: satconf - cleanups for the rotor external command (2018-12-19arrow-up-right)

  • added linudvb_rotor_external to control an actuator by spawning an external command (2018-12-19arrow-up-right)

  • webui, htsbuf: Content-Disposition escape chars are not correct. ()

  • webui: status - drop all connections - use new id=all call, fixes #4937 (2018-12-19arrow-up-right)

  • webui: add "drop all connections", fixes #4937 (original request only) (2018-12-19arrow-up-right)

  • api: add id=all for the connections/cancel, issue #4937 (2018-12-19arrow-up-right)

  • xmltv import: fix the wrong end-of-string mark (off-by-one), fixes #5443 (2018-12-17arrow-up-right)

  • dvr: move dvr_notify() call to the global_lock using timers, fixes #5437 (2018-12-16arrow-up-right)

  • dvb psi pmt: change the teletext subtitle handling for multiple teletext descriptors, issue #5422 (2018-12-15arrow-up-right)

  • satip server: use strempty() function for the uuid check, fixes #5434 (2018-12-15arrow-up-right)

  • tvh thread: do not crash when mutex==NULL (magic check failed), fixes #5435 (2018-12-15arrow-up-right)

  • satip client: fix the double (and wrong) sf_last_data_tstamp update, fixes #5374 (2018-12-14arrow-up-right)

  • epggrab: run internal grabbers only when wanted, fixes #5421 ()

  • dvr: fix the real_start variable misuse, fixes #5426 (2018-12-14arrow-up-right)

  • tvh thread: remove wrong commit code (2018-12-14arrow-up-right)

  • htsp server: fix the wrong htsmsg destroy introduced in the imagecache patch, fixes #5430, fixes #5431, fixes #5429 (2018-12-14arrow-up-right)

  • iptv: remove double pcr: from traces (2018-12-14arrow-up-right)

  • sbuf: add sbuf_replace() (2018-12-13arrow-up-right)

  • mpegts input: add CC restart for tables, too (2018-12-13arrow-up-right)

  • iptv http: call iptv_input_mux_started(), move recv_flush to http-header back (2018-12-13arrow-up-right)

  • imagecache: increase the save access threshold again (2018-12-12arrow-up-right)

  • profile: add more doc to the pass rewrite fields (2018-12-12arrow-up-right)

  • imagecache: do not update the accessed field too much (2018-12-12arrow-up-right)

  • imagecache: big cleanups ()

  • remove debug code (added by mistake) (2018-12-12arrow-up-right)

  • dvb psi lib: add dvb_table_parse_reinit functions (2018-12-12arrow-up-right)

  • iptv http: remove the wrong si rewrite code, cleanup the free sequence (2018-12-12arrow-up-right)

  • Makefile.ffmpeg: add crypto protocol for crypto+http (hls) (2018-12-11arrow-up-right)

  • tvh thread: fix print other mutexes for abort (2018-12-11arrow-up-right)

  • http: fix the wrong return value (previous patch) (2018-12-11arrow-up-right)

  • http server: remove wrong aa_auth check from page_srvid2, fixes #5416 (2018-12-11arrow-up-right)

  • http: add auth type detection (2018-12-11arrow-up-right)

  • main: fix compilation without traces (2018-12-11arrow-up-right)

  • mpegts: do not set wrong pls code for bouquet rescan (2018-12-11arrow-up-right)

  • iptv: http - fix the compilation problem with the previous patch (2018-12-11arrow-up-right)

  • iptv: http - do not clear the input sbuf in the kick callback (2018-12-11arrow-up-right)

  • iptv: correction for the previous patch, fixes #5415, issue #5353 (2018-12-11arrow-up-right)

  • iptv: add missing lock to the iptv_http_kick_cb, fixes #5415, issue #5353 (2018-12-11arrow-up-right)

  • ui: Fix background image to not accept clicks (#5405). (2018-12-10arrow-up-right)

  • ui: Enable scrollbar for dialog info, fixes #5405 (2018-12-10arrow-up-right)

  • profile: do init for all profile sharer members, issue #5409 (2018-12-10arrow-up-right)

  • tvh_thread: print filename/lineno for the magic failure when appropriate (2018-12-10arrow-up-right)

  • timers: little fixes (2018-12-10arrow-up-right)

  • timers - change locking schema, fixes #5413, issue #5353 (2018-12-10arrow-up-right)

  • tprofile: fix possible division by zero (2018-12-10arrow-up-right)

  • iptv http input: play with the locking, issue #5353 (2018-12-09arrow-up-right)

  • fix some problems detected by cppcheck, issue #5353 (2018-12-09arrow-up-right)

  • Don't warn on packets with small/no payload. (2018-12-09arrow-up-right)

  • htsp_server: init htsp_out_mutex (2018-12-09arrow-up-right)

  • main: add gtimer/mtimer magic checks (2018-12-08arrow-up-right)

  • tvh thread: add mutex magic check routines (2018-12-08arrow-up-right)

  • dvr: move the initial dvr_autorec_purge_obsolete_timers() call to better place, fixes #5406 (2018-12-07arrow-up-right)

  • tvhcsa: fix log offset type (2018-12-06arrow-up-right)

  • tvh_thread: show also waiters (2018-12-06arrow-up-right)

  • Reduce DESCRAMBLER_MAX_KEYS from 64 to 8, fixes #5400 (2018-12-06arrow-up-right)

  • dvr: Autorec rules must still match event after update. (#4760). ()

  • wizard: spruce it up a bit (2018-12-06arrow-up-right)

  • Maximize use of libdvbcsa's batch processing. (2018-12-06arrow-up-right)

  • freebsd: Fixup header files for socket definitions. Make thread owner conditional on Linux. (2018-12-06arrow-up-right)

  • Prepend title to autorec comment when created from EPG. (2018-12-05arrow-up-right)

  • Fix compilation error: 'saveptr' may be used uninitialised in this function [-Werror=maybe-uninitialised] (2018-12-05arrow-up-right)

  • xmltv: split names in credits, fixes #5359 (2018-12-05arrow-up-right)

  • htsmsg: check the field/key name length (max 255 characters), issue #5359 (2018-12-05arrow-up-right)

  • http: forbidden status / access_verify2() cleanups, fixes #5391 (2018-12-03arrow-up-right)

  • satip client: activity timeout cleanups (2018-12-03arrow-up-right)

  • pass muxer: correct SI length for trimmed events (2018-12-03arrow-up-right)

  • tvh_thread: do not use debug code when not activated, issue #5353, issue #5389 (2018-12-03arrow-up-right)

  • atomic cleanups in tvh_thread, tvhlog (clang) (2018-12-02arrow-up-right)

  • tvhlog: add missing lock (2018-12-02arrow-up-right)

  • tvh_thread: another filename/lineno cleanups (2018-12-02arrow-up-right)

  • tvh_thread: do not print sid for non glibc binaries, fixes #5385 (2018-12-02arrow-up-right)

  • tvhthread: fix the cond wait routines (preserve correctly filename/lineno) (2018-12-02arrow-up-right)

  • pass muxer: fix pass_muxer_nit_cb() - wrong private tag copy (2018-12-02arrow-up-right)

  • xmltv: always change the module name after restart, fixes #5383 (2018-12-01arrow-up-right)

  • http/webui: add special/srvid2 handling (2018-12-01arrow-up-right)

  • dvb support: remove wrong characters bellow 0x20 (except 0x0a - newline), issue #5366 (2018-12-01arrow-up-right)

  • linuxdvb: add DMX_SET_SOURCE settings at the probe, fixes #5379 (2018-12-01arrow-up-right)

  • imagecache: tiny code reshuffle (2018-12-01arrow-up-right)

  • imagecache: try to fix the state handling, fixes #5382 (2018-12-01arrow-up-right)

  • opentv: add NULL check to the opentv_find_entry(), fixes #5381 (2018-12-01arrow-up-right)

  • imagecache: another code reshuffle, add save for the accessed update, issue #4304 (2018-11-30arrow-up-right)

  • imagecache: fix the build when caching code is deactivated, fixes #5372 (2018-11-30arrow-up-right)

  • imagecache: move saving procedure outside global_lock, fix imagecache_id after start, issue #4304 (2018-11-30arrow-up-right)

  • imagecache: fix 'accessed' field loading and the default value, issue #4304 (2018-11-30arrow-up-right)

  • satip client: cosmetic (indent) (2018-11-30arrow-up-right)

  • satip client: show the proper connection state in 'RTSP cmd error' log message (2018-11-30arrow-up-right)

  • Add ATSC-T With 8VSB Modulation (for Korean User) (2018-11-30arrow-up-right)

  • watchdog: rename tv_mutex_init to tvh_mutex_init (2018-11-29arrow-up-right)

  • opentv: fix the wrong event cleanup in opentv_add_entry(), issue #5297 (2018-11-29arrow-up-right)

  • tvhlog: fix tvhdbg() prototype when traces are not activated, fixes #5362 (2018-11-28arrow-up-right)

  • watchdog: fix missing pthread_mutex_destroy -> tvh_mutex_destroy, issue #5361 (2018-11-28arrow-up-right)

  • tvhlog: fix NULL dereference crash (2018-11-28arrow-up-right)

  • tvh thread: print the deadlock text also to stderr (2018-11-28arrow-up-right)

  • tvhlog: add tvhdbg() and send realtime mutex log lines to the UDP socket (if requested) (2018-11-28arrow-up-right)

  • debian: remove db_reset lines - fixes #5358 (2018-11-28arrow-up-right)

  • tvh thread: compile the debug thread code only when traces are enabled (2018-11-27arrow-up-right)

  • tvh thread: fix gtimer_cond timedwait and tvh_cond_init() (2018-11-27arrow-up-right)

  • update valgrind.supp (2018-11-27arrow-up-right)

  • tvh thread: add mutex debug timing, fix the watchdog code (2018-11-27arrow-up-right)

  • webui: remove Title0 typo (2018-11-27arrow-up-right)

  • webui: streaming - fix the removed scoped lock, fixes #5356 (2018-11-27arrow-up-right)

  • webui status: add user-agent (client) column (2018-11-27arrow-up-right)

  • descrambler: remove unused code (2018-11-27arrow-up-right)

  • docs: use a table for the program details dialog toolbar items (2018-11-27arrow-up-right)

  • docs: another screenshot update (2018-11-27arrow-up-right)

  • docs: update debugging (2018-11-27arrow-up-right)

  • debian packaging: use db_purge on --purge (2018-11-27arrow-up-right)

  • debian packaging: always reset superuser info on removal (2018-11-27arrow-up-right)

  • cosmetic: TVHeadend|tvheadend -> Tvheadend, where needed for consistency (2018-11-27arrow-up-right)

  • docs: update and add persistent auth info, refresh some screenshots and tweak a few bits (2018-11-27arrow-up-right)

  • access: a little code reorganisation for the latest tags exclude change (2018-11-27arrow-up-right)

  • access: fix tag exclude (2018-11-27arrow-up-right)

  • tvh_thread: remove restrict keyword (2018-11-27arrow-up-right)

  • thread: add mutex watchdog (2018-11-27arrow-up-right)

  • initial pthread mutex/cond wrappers to detect deadlocks (2018-11-27arrow-up-right)

  • move htsstr.h to tvh_string.h (2018-11-27arrow-up-right)

  • imagecache: fix the expire id, issue #4304 (2018-11-27arrow-up-right)

  • satip client: fix activity timestamp for TCP data transfer mode, fixes #5348 (2018-11-27arrow-up-right)

  • opentv: improve the split event merge logic, issue #5297 (2018-11-26arrow-up-right)

  • imagecache: add 'expire' time for the cached files, fixes #4304 (2018-11-26arrow-up-right)

  • tvh-json.py: add proper digest/plain authentication, fixes #5350 (2018-11-26arrow-up-right)

  • satip client: add hard timeout for the incoming data (2018-11-25arrow-up-right)

  • capmt: cosmetic - remove double 'in' from log (2018-11-25arrow-up-right)

  • opentv epg: try to fix the incomplete grabbing (use the whole time window for all subscribed PIDs), issue #5297 (2018-11-25arrow-up-right)

  • ui: Add alternative/similar broadcast buttons, fixes #5335, #5336 ()

  • api: Fix NULL blank argument. (2018-11-25arrow-up-right)

  • service: do not stop the raw service streaming when service is not enabled (2018-11-24arrow-up-right)

  • pass muxer: check correct variable for MC_CAP_ANOTHER_SERVICE, issue #5344 (2018-11-24arrow-up-right)

  • pass muxer: do not check for multiple active services (it might not be true), issue #5344 (2018-11-24arrow-up-right)

  • pass muxer: add possibility to continue streaming even if the service is changing, issue #5344 (2018-11-24arrow-up-right)

  • webui debugging tab: typo fix (2018-11-23arrow-up-right)

  • http/webui: return not found status when redirection is not possible, fixes #5342 (2018-11-23arrow-up-right)

  • webui: epg: fix compatibility issue for FreeBSD ()

  • webui: Add 'query CSFD' in dvr broadcast info window (2018-11-23arrow-up-right)

  • webui: Add 'groupRenderer' in all tabs (2018-11-23arrow-up-right)

  • webui: Add group renderer capabilities, now when grouping the title don't care about copyright year (2018-11-23arrow-up-right)

  • spawn: show permissions problem with kill, issue #4774 (2018-11-23arrow-up-right)

  • main: Load OpenSSL engines (2018-11-21arrow-up-right)

  • main: Fix OpenSSL 1.1 compilation without deprecated APIs (2018-11-21arrow-up-right)

  • http: rewrite again the access verification routines, fixes #5339 (2018-11-20arrow-up-right)

  • dvbpsi: move the cat decoder from descrambler to a common place and use it everywhere (2018-11-19arrow-up-right)

  • descrambler: improve EMM handling - add provider id checks (2018-11-19arrow-up-right)

  • linuxdvb: optimise the exclusive check code (previous change) (2018-11-19arrow-up-right)

  • webui: access theme - colour correction for EPG count info (2018-11-19arrow-up-right)

  • dvr: Add option to automatically delete recording after playback. ()

  • Need to delete files on complex scheduling when replacing timer after crash. ()

  • updated nginx example (2018-11-19arrow-up-right)

  • dvr: Alter test for season/episode on unique path. (2018-11-19arrow-up-right)

  • dvr: Fix season/episode unique test when recording. (2018-11-19arrow-up-right)

  • Fix typo (2018-11-19arrow-up-right)

  • linuxdvb: fix the exclusive frontend access, fixes #5330 (2018-11-19arrow-up-right)

  • dvb_mux_conf_init: set default pls_mode to GOLD, fixes #5328 (2018-11-14arrow-up-right)

  • descrambler: reset 'changed' flag on cc_remove_card (2018-11-12arrow-up-right)

  • cclient: fix crash on cc_remove_card (2018-11-12arrow-up-right)

  • satip: rtp - improve udp_multisend_send() error / full buffer condition checking, fixes #5319 (2018-11-09arrow-up-right)

  • htsmsg: add htsmsg_remove_string_from_list() function (2018-11-09arrow-up-right)

  • webui: fixes #5320 (2018-11-09arrow-up-right)

  • cclient: cc_remove_card - move state to ECM_INIT when active card is removed, issue #5314 (2018-11-09arrow-up-right)

  • http: fix http_access_verify_channel(), fixes #5317 (2018-11-08arrow-up-right)

  • mpegts mux: handle better mm_nicename updates (2018-11-07arrow-up-right)

  • satip server: fix the weight handling for the scrambled slave subscriptions, fixes #5314 (2018-11-07arrow-up-right)

  • satip server: fix pmt rewrite (wrong CC), use sbuf as the internal data buffer (2018-11-07arrow-up-right)

  • satip server: fix memory leak for the slave service subscription, fixes #5314 (2018-11-07arrow-up-right)

  • linuxdvb: do not call linuxdvb_satconf_power_save for non DVB-S frontends, fixes #5311 (2018-11-03arrow-up-right)

  • iptv: add some more traces for pipe fds... (2018-11-03arrow-up-right)

  • spawn: close pipe on fork() error path (2018-11-03arrow-up-right)

  • satip client: do faster recovery when the server reboots (2018-11-01arrow-up-right)

  • linuxdvb: try to improve the rotor logic (finish the movement), issue #5307 (2018-11-01arrow-up-right)

  • linuxdvb: set volt - tiny optimisation (2018-11-01arrow-up-right)

  • scanfile: add support for PLS_CODE and PLS_MODE, fixes #5305 (2018-10-31arrow-up-right)

  • linuxdvb rotor: improve satellite longitude description (2018-10-31arrow-up-right)

  • epg: play link - use temporary auth tickets again, fixes #5302 (2018-10-31arrow-up-right)

  • doozer/autobuild: debian buster target (2018-10-31arrow-up-right)

  • autobuild: remove Ubuntu Precise which is EOL (as of April 28, 2017) (2018-10-31arrow-up-right)

  • doozer: sort targets, add Fedora 29 (2018-10-31arrow-up-right)

  • Update server.c (2018-10-31arrow-up-right)

  • htsp server: improve the htsp streaming connection limit check, issue #5290 (2018-10-30arrow-up-right)

  • msg queue: wake thread on new message (2018-10-29arrow-up-right)

  • intextra: support 12bit unsigned nrs (2018-10-29arrow-up-right)

  • webui: m3u playlist - add auth tokens for logo, fixes #5291 (2018-10-27arrow-up-right)

  • access: allow advanced streaming for the permanent tickets, fixes #5294 (2018-10-27arrow-up-right)

  • access: set the temporary ticket lifetime between 30 and 3600 seconds (2018-10-27arrow-up-right)

  • access: do not allocate always 50 bytes for aa_representative (2018-10-27arrow-up-right)

  • Make authentication ticket lifetime configurable (2018-10-25arrow-up-right)

  • webui: Fix #5292 (2018-10-25arrow-up-right)

  • webui: more tooltips for help buttons! (2018-10-25arrow-up-right)

  • tcp: fix wrong used variable initialisation, issue #5290 (2018-10-24arrow-up-right)

  • access: fix access_copy() for aa_auth, fixes #5285 (2018-10-23arrow-up-right)

  • service mapper: fix locking, issue #5261 (2018-10-23arrow-up-right)

  • service mapper: try to determine quickly services without A/V streams, issue #5261 (2018-10-22arrow-up-right)

  • webui: fix http_m3u_playlist_add(), fixes #5274 (2018-10-22arrow-up-right)

  • service mapper: fix mono2sec -> sec2mono thinko (2018-10-22arrow-up-right)

  • dvr: fix the dvr_rec_subscribe cleanup (2018-10-22arrow-up-right)

  • access: do not use + character for the auth code (HTTP deescaping), issue #5274 (2018-10-22arrow-up-right)

  • dvr: cleanup the error path in dvr_rec_subscribe() (2018-10-22arrow-up-right)

  • dvr_rec: fix early access_destroy (2018-10-22arrow-up-right)

  • service mapper: implement time watchdog (cca 30 seconds) (2018-10-21arrow-up-right)

  • htsp: Tidy serialisation of category and keyword. (2018-10-21arrow-up-right)

  • http: auth playlist, return unauthorized when the authcode is not present (2018-10-21arrow-up-right)

  • doc: add authentication type for playlist in url.md (2018-10-21arrow-up-right)

  • fixes for the permanent tickets, issue #5274 (2018-10-21arrow-up-right)

  • http: terminate path correctly in http_resolve() (2018-10-21arrow-up-right)

  • add permanent tickets for the authentication, fixes #5274 (2018-10-20arrow-up-right)

  • dvb psi: fix for the previous commits - move pmt monitor change to mpegts_service_find() (2018-10-18arrow-up-right)

  • dvb psi: fix for the previous commit - reinstall pmt monitor only when it's already installed (2018-10-18arrow-up-right)

  • dvb psi: change PMT monitor when PMT PID changes for SID, issue #4942 (2018-10-18arrow-up-right)

  • linuxdvb: fix again the PLS code skip when the default value is used (2018-10-18arrow-up-right)

  • linuxdvb: set PLS code only when it differs from 1, fixes #5266 (2018-10-17arrow-up-right)

  • bintray: disable uploads :-( (2018-10-17arrow-up-right)

  • campt: fix the ct_multipid initialisation, fixes #5097 (2018-10-17arrow-up-right)

  • 2024-08-04arrow-up-right
    2024-07-21arrow-up-right
    2024-07-21arrow-up-right
    2024-07-13arrow-up-right
    2024-07-13arrow-up-right
    2024-07-13arrow-up-right
    2024-06-27arrow-up-right
    2024-06-27arrow-up-right
    2024-06-25arrow-up-right
    2024-06-25arrow-up-right
    2024-06-23arrow-up-right
    2024-06-23arrow-up-right
    2024-06-23arrow-up-right
    2024-06-18arrow-up-right
    2024-06-15arrow-up-right
    Release 12.34.2arrow-up-right
    Release 12.34.3arrow-up-right
    Release 12.34.4arrow-up-right
    Release 12.34.5arrow-up-right
    Release 12.34.6arrow-up-right
    Release 12.34.7arrow-up-right
    Release 12.34.1arrow-up-right
    2024-08-04arrow-up-right
    2024-08-04arrow-up-right
    2024-06-06arrow-up-right
    2024-06-05arrow-up-right
    2024-04-20arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-22arrow-up-right
    2024-02-18arrow-up-right
    2024-02-10arrow-up-right
    2024-02-07arrow-up-right
    2024-02-04arrow-up-right
    2024-02-02arrow-up-right
    2024-02-02arrow-up-right
    2024-02-02arrow-up-right
    2024-02-01arrow-up-right
    2023-12-13arrow-up-right
    2023-10-01arrow-up-right
    2023-08-11arrow-up-right
    2023-08-11arrow-up-right
    2023-08-06arrow-up-right
    2023-08-05arrow-up-right
    2023-08-04arrow-up-right
    2023-07-30arrow-up-right
    2023-06-23arrow-up-right
    2023-06-21arrow-up-right
    2023-06-21arrow-up-right
    2023-06-21arrow-up-right
    2023-06-16arrow-up-right
    2023-06-16arrow-up-right
    2023-06-16arrow-up-right
    2023-06-16arrow-up-right
    2023-06-16arrow-up-right
    2023-06-11arrow-up-right
    2023-04-19arrow-up-right
    2023-04-17arrow-up-right
    2023-04-08arrow-up-right
    2023-03-23arrow-up-right
    2023-02-05arrow-up-right
    2023-01-28arrow-up-right
    2023-01-24arrow-up-right
    2023-01-23arrow-up-right
    2023-01-17arrow-up-right
    2023-01-14arrow-up-right
    2023-01-10arrow-up-right
    2022-11-24arrow-up-right
    2022-11-21arrow-up-right
    2022-11-21arrow-up-right
    2022-11-20arrow-up-right
    2022-10-31arrow-up-right
    2022-09-15arrow-up-right
    2022-08-28arrow-up-right
    2022-07-04arrow-up-right
    2022-04-06arrow-up-right
    2022-04-05arrow-up-right
    2022-03-30arrow-up-right
    2022-02-12arrow-up-right
    2022-01-02arrow-up-right
    2022-01-02arrow-up-right
    2021-12-12arrow-up-right
    2021-12-12arrow-up-right
    2021-11-21arrow-up-right
    2021-10-21arrow-up-right
    2021-10-17arrow-up-right
    2021-03-12arrow-up-right
    2021-02-21arrow-up-right
    2021-02-20arrow-up-right
    2020-12-29arrow-up-right
    2020-10-08arrow-up-right
    2020-10-08arrow-up-right
    2020-09-28arrow-up-right
    2020-07-12arrow-up-right
    2020-07-06arrow-up-right
    2020-05-18arrow-up-right
    2020-05-18arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-02-04arrow-up-right
    2019-02-04arrow-up-right
    2018-12-19arrow-up-right
    2018-12-14arrow-up-right
    2018-12-12arrow-up-right
    2018-12-06arrow-up-right
    2018-11-25arrow-up-right
    2018-11-23arrow-up-right
    2018-11-19arrow-up-right
    2018-11-19arrow-up-right

    Release / Change Log 2

    hashtag
    Releases, Nightly Builds and Change Log

    • Show recording file name (2025-05-14arrow-up-right)

    • allow NVENC, VAAPI and MMAL to coexist in the same build (

    • httpc.c: Fix HTTPS with OpenSSL 3.5 (#1813) ()

    • Global setting for 'Items per page' ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'en_GB' updated. ()

    • Translation for 'en_US' updated. ()

    • Fix crash when updating 'disp_summary' ()

    • Fix CI Builds 2/2 ()

    • Fix Cloudsmith uploads ()

    • Check for hidden fields before reading them. Fixes #1782. ()

    • iptv: allow to limit UDP ports for unicast inputs ()

    • Translation for 'en_GB' updated. ()

    • Translation for 'en_US' updated. ()

    • update libvpx v.1.14.1 ()

    • Fix - Audio transcoding not working #1663 ()

    • fixes #1733 ()

    • Remove HTSP client version test for rating labels and string UUIDs ()

    • Add full UUID to channel, chTag and dvrEntry. ()

    • Add country and authority to HTPS messages containing rating labels. ()

    • HTSP: deliver 'comment' with autorecEntry(Add|Update), timerecEntry(Add|Update). Allow setting 'comment' with 'updateDvrEntry'. ()

    • Fixup updating comment in _dvr_entry_update. Only overwrite existing title if comment is not NULL. Follows the same logic now as other updates done in this function. ()

    • bouquet: fix overzealous channel removals in merged multi-network setup ()

    • HTSP: Expose DVR configuration id in 'dvrEntryAdd', 'dvrEntryUpdate', 'autorecEntryAdd', 'autorecEntryUpdate', 'timerecEntryAdd', 'timerecEntryUpdate'. ()

    • HTSP: Expose broadcast type in 'autorecEntryAdd' and 'autorecEntryUpdate'. Handle broadcast type in 'addAutorecEntry' and 'updateAutorecEntry'. ()

    • Fix mapping HTSP field 'broadcastType' to internal field. Must be 'btype'. ()

    • Fix FTBFS introduced by 76d8fc8bc5455322558c764c84755ebbba254ad5 ()

    • Update Fedora versions for cloudsmith uploads ()

    • HTSP: Expose service provider name with channel information. ()

    • Update linuxdvb_satconf.c - lnb poweroff requires power save ()

    • (2024-08-10)

    • Enforce issue templates on GitHub ()

    • (2024-08-04)

    • Fix function passed to avio_alloc_context() (ffmpeg 7) ()

    • Replace deprecated channels/channel_layout ()

    • (2024-07-21)

    • Translation for 'en_GB' updated. ()

    • Translation for 'en_US' updated. ()

    • (2024-07-14)

    • (2024-07-13)

    • Allow node16 for GitHub Actions ()

    • Add dependency for recent Fedora versions ()

    • Rework fullscreen request method detection ()

    • (2024-06-27)

    • (2024-06-27)

    • Refactor null value handling. ()

    • Remove tvheadend user on purge ()

    • (2024-06-25)

    • Replace deprecated av_init_packet() ()

    • Replace deprecated interlaced_frame, top_field_first and key_frame ()

    • (2024-06-23)

    • (2024-06-23)

    • (2024-06-23)

    • Remove useless NULL-assignment in http.c ()

    • Fix potential null-pointer dereference in muxer_mkv.c ()

    • Remove useless NULL-check in ratinglabels.c ()

    • (2024-06-18)

    • Use safer htsmsg_add_str2 when copying de->de_directory ()

    • (2024-06-15)

    • XMLTV: Rating Labels: Use 'NONE' when 'system' attribute is missing ()

    • (2024-06-07)

    • (2024-06-06)

    • (2024-06-06)

    • (2024-06-06)

    • (2024-06-06)

    • dvr: Added missing directory to rerecord-entry ()

    • Extend CORS origin help/hover message ()

    • Make builds parallel and add bookworm and ubuntu 24.04 builds ()

    • Update x265 to 3.6 ()

    • Add current pcloud cert ()

    • Update nasm ()

    • Update libx264 ()

    • Update libogg and libfdkaac ()

    • Always compile x265 as PIC ()

    • (2024-06-05)

    • tvhdhomerun: Add ISDB to type check in tvhdhomerun_device_create ()

    • (2024-04-26)

    • (2024-04-26)

    • Correct M3U playlist logo tag ()

    • Fix echo target for superuser file in Debian postinst ()

    • (2024-04-25)

    • (2024-04-25)

    • Properly escape json in setup ()

    • satip: Ignore additional parameters ()

    • (2024-04-21)

    • (2024-04-20)

    • Update WebUI to allow debug/trace subsystem selection from a list. ()

    • (2024-04-13)

    • Add subsystems to JSON API. ()

    • (2024-04-08)

    • Fix detection of unknown version numbers in support/version ()

    • (2024-03-24)

    • (2024-03-24)

    • webui: Fix year being replaced incorrectly when using custom date format ()

    • Update manpage ()

    • (2024-03-22)

    • Translation for 'pl' updated. ()

    • (2024-03-18)

    • Translation for 'pl' updated. ()

    • (2024-03-14)

    • Update README.md ()

    • (2024-03-09)

    • CI: remove NODIRTY option as those builds may be dirty ()

    • (2024-03-08)

    • (2024-03-08)

    • Create special tvheadend-armv6l and tvheadend-dbg-armv6l packages ()

    • Improve armv6l-packages and remove various outdated references/commands ()

    • Revert accidental package renaming ()

    • (2024-03-07)

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • (2024-03-03)

    • update to libvpx 1.14.0-patch ()

    • (2024-03-01)

    • (2024-03-01)

    • (2024-03-01)

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • ci: added more info logging to cloudsmith.sh ()

    • Improve autorec duplicate handling ()

    • (2024-02-24)

    • (2024-02-23)

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Replace broken links, update copyright year ()

    • (2024-02-22)

    • (2024-02-22)

    • (2024-02-22)

    • (2024-02-22)

    • Add OpenCollective donate link to Wizard ()

    • Give comment-on-labels.yml permissions to write to PRs ()

    • (2024-02-21)

    • (2024-02-21)

    • (2024-02-21)

    • (2024-02-21)

    • (2024-02-21)

    • ci: change CLOUDSMITH_OWNER from a var to a secret ()

    • Make sure we spawn the best matching executable and not the first match ()

    • Fix Auto-PR comment on squash-label ()

    • Run enforce-pr-rebase whenever a PR is updated ()

    • (2024-02-20)

    • (2024-02-20)

    • (2024-02-20)

    • (2024-02-20)

    • Add some ERRNOs for DVR & Config ()

    • Show SeriesLink for AutoRecs ()

    • Replace poison memset by memset_s to avoid compiler optimising it out ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • (2024-02-19)

    • (2024-02-19)

    • (2024-02-19)

    • ci: Enforce rebasing PRs before merging ()

    • Replace single-bit signed integers with unsigned integers ()

    • Add missing htmsg_destroy() call in hdhomerun_server_discover ()

    • Add support for 12-hour custom date formats ()

    • Add missing tvheadend-prefix in JS file ()

    • Shorten time for stale issues before a warning is applied ()

    • ci: Use correct version of merge commit block action ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Translation for 'pl' updated. ()

    • Remove broken codeball ()

    • Add automatic labels to PRs ()

    • docs: Fix broken Readme.md badge for builds ()

    • ci: Block merge or autosquash commits in PRs ()

    • intl: update translation templates from code ()

    • ci: use CURL for cloudsmith.sh and enable RPM upload ()

    • (2024-02-12)

    • CI: Ensure we clone the whole repo ()

    • (2024-02-10)

    • (2024-02-10)

    • transcoding: access the codec name only when codec pointer is valid ()

    • (2024-02-08)

    • dvr: Fix incorrect usage of strerror (

    • (2024-02-07)

    • (2024-02-06)

    • (2024-02-06)

    • Correct description of Change Parameters flag ()

    • (2024-02-05)

    • Translation for 'pt' updated. ()

    • Translation for 'pt' updated. ()

    • Translation for 'pt' updated. ()

    • Translation for 'pt' updated. ()

    • Translation for 'pt' updated. ()

    • Translation for 'pt' updated. ()

    • Translation for 'en_US' updated. ()

    • descrambler: Fix Sky-UK descrambling ()

    • (2024-02-04)

    • (2024-02-04)

    • (2024-02-04)

    • (2024-02-04)

    • (2024-02-04)

    • (2024-02-03)

    • Sanitise filename in content-disposition header ()

    • Fix audio-only timeshift memory usage ()

    • Automatically comment on PRs needing squash ()

    • Mark PRs needing squashing as stale after a while ()

    • Remove sweep-ai again as it is not useful at all ()

    • (2024-02-02)

    • (2024-02-02)

    • (2024-02-02)

    • (2024-02-02)

    • Add stale-bot for issues/PRs needing more info ()

    • Configure Sweep (#1612) ()

    • (2024-02-01)

    • (2024-01-31)

    • (2024-01-31)

    • templates: add log section to bug_report.yml ()

    • Add timeshift support for audio-only channels ()

    • (2024-01-30)

    • Add missing Lithuanian string template (#1608) ()

    • (2024-01-28)

    • ci: fix cloudsmith.sh & add to CI workflow ()

    • src: filesystem permission fixes ()

    • ci: fix broken cloudsmith python ()

    • templates: add config.yml ()

    • templates: add bug_report.yml ()

    • templates: add feature_proposal.yml ()

    • ci: fix cloudsmith for python3.5 ()

    • (2024-01-21)

    • update to ffmpeg 6.1.1 ()

    • (2024-01-11)

    • (2024-01-11)

    • descrambler: avoid dlopen() ()

    • descrambler: apply ICAM update from Chris230291 ()

    • (2024-01-05)

    • (2024-01-05)

    • linuxdvb: add DVB-S2X parameters ()

    • descrambler: support ICAM if detected in libdvbcsa ()

    • (2024-01-01)

    • ci: fix raspios detection in cloudsmith.sh ()

    • (2023-12-26)

    • ci: rename build.yml to reduce confusion ()

    • (2023-12-18)

    • Makefile.ffmpeg nvenc update ()

    • (2023-12-13)

    • (2023-12-13)

    • Remove references to Tvheadend Foundation. ()

    • (2023-12-11)

    • tfx: fix URLs in tvheadend/c files ()

    • tfx: fix URLs in tvheadend/docs files ()

    • tfx: fix URLs in tvheadend/js files ()

    • webui: change donation button to opencollective ()

    • webui: remove old doc references to paypal ()

    • github: add FUNDING.yml with OpenCollective link ()

    • Update copyright year and correct current surname ()

    • hdhomerun: Add HDHomeRun server support for LiveTV only (#4461) ()

    • (2023-12-06)

    • (2023-12-06)

    • (2023-12-06)

    • (2023-12-06)

    • (2023-12-06)

    • (2023-12-06)

    • ci: don't trigger cloudsmith on .github changes ()

    • ci: remove references to travis ()

    • ci: remove references to doozer ()

    • ci: add concurrency to the main CI workflows ()

    • ci: schedule weekly coverity scans ()

    • ci: remove the test-compile workflow ()

    • WebUI: Update donation string as a test to Transifex feed ()

    • Add Parental Rating Labels ()

    • (2023-12-01)

    • (2023-12-01)

    • ci update build config ()

    • gitignore: add debian/.debhelper folder ()

    • update ffmpeg to 6.0.1 ()

    • update x264 to c196240 ()

    • update libvpx to 1.13.1 ()

    • (2023-11-28)

    • Fix builds on stretch ()

    • (2023-11-21)

    • Add rpi-bookworm to targets ()

    • (2023-11-20)

    • Update ffmpeg to 5.1.4 ()

    • Correct handling of Remove and Ignore settings ()

    • (2023-10-15)

    • (2023-10-14)

    • Removed nested function 'appendPidRange' from within function 'tvhdhomerun_frontend_update_pids' ()

    • 6310 Set 'okay' default to True ()

    • Fix htsstr_argsplit (treat quotes inside an argument correctly) ()

    • (2023-08-12)

    • (2023-08-12)

    • support/mkbundle: switch from distutils to setuptools ()

    • (2023-08-09)

    • Fix bug #6293 – Missing EIT EPG Content Type ()

    • Fix some build and add more targets ()

    • (2023-08-06)

    • otamux: Make sure we use PRItime_t ()

    • CI: Run the full build with cloudsmith only on master ()

    • (2023-08-02)

    • Add 'age rating' field to recording metadata ()

    • (2023-07-30)

    • (2023-07-30)

    • OTA Genre translation squashed v2 ()

    • (2023-07-19)

    • Bug Fix: OTA EIT Parental Rating ()

    • Revert non-portable function to previous code ()

    • (2023-06-23)

    • Fix configuration-loading logic to account for forking operation ()

    • Fix spelling errors encountered during previous work ()

    • Fix portability: Do not use linux/limits.h ()

    • config: Deal with configuration before anything else ()

    • Fix Fedora CI build ()

    • Disable broken codeball ()

    • Update config for Fedora 37/38 ()

    • Add Fedora RPM build to Github Actions ()

    • dvr_rec: Fix a buffer overflow in filename generation ()

    • (2023-04-17)

    • update to ffmpeg 5.1.3 ()

    • tv_meta_tvdb.py: Fix 'language' typo. ()

    • (2023-04-02)

    • Remove references to CLA which is no longer available ()

    • tvhmeta: Fix tvhmeta authentication to the tvheadend API. ()

    • updated 'AVCodec' to 'const AVCodec' ()

    • remove deprecate struct vaapi_context and the vaapi.h ()

    • Remove deprecated get_best_effort_timestamp() call ()

    • remove ffmpeg component avresample ()

    • update to ffmpeg codecpar ()

    • iconv: Allow using GNU libiconv ()

    • Revert "fix for 64bit time_t on 32bit systems" ()

    • fix for 64bit time_t on 32bit systems ()

    • Don't attempt to approve PRs automatically ()

    • update vaapi ()

    • update NASM to 2.16.01 ()

    • Codeball should also label PRs that need review ()

    • RTSP redirect support fix and moved to http client ()

    • Fix for DVB Grabber and IPTV Stream ()

    • Use codeball for PRs ()

    • update to ffmpeg codecpar ()

    • update ffmpeg from 4.4.1 to 4.4.3 ()

    • update vaapi ()

    • Revert "Update debian/compat to version 10" ()

    • Ignore title mismatch if dup checking by CRID ()

    • Add descriptions to the existing Unicable configuration fields ()

    • Unify names and order of Unicable-specific configuration fields ()

    • Add configurable delays after Unicable operations ()

    • Unify power up time range to 10-500 ms ()

    • Unify command time range to 10-300 ms ()

    • descrambler: cosmetic cleanups, more CAID logs ()

    • descrambler: cclient: optimisation for multiple key clients ()

    • descrambler: cccam - simplify cccam_handle_keys() ()

    • descrambler: cccam: move send keepalive message to traces ()

    • descrambler: cwc: Fix the additional card registration (mgclient option in oscam) ()

    • descrambler: cwc: do not register bad provider numbers for betacrypt and irdeto ()

    • grammar: Replace "then" with "than" ()

    • updated function _video_filters_get_filters() ()

    • remove libavresample from build scripts ()

    • Add autorec duplicate handling default to dvr config. ()

    • Add amd64 jammy to builds ()

    • Build for kinetic instead of impish ()

    • Allow old builds to pass ()

    • Fix a few more builds, add kinetic support ()

    • Don't fail on strict aliasing violations ()

    • Remove variable declaration from for-loop ()

    • Don't confuse GCC with zero-length array ()

    • Add South Africa to Countries list. ()

    • dvb_psi_pmt: Recognise AC-4 audio descriptor ()

    • config: Enable HbbTV parser by default ()

    • Build various targets and prepare new repository (#1476) ()

    • Use application/json instead of text/x-json as mimetype ()

    • Serve static html files with mimetype text/html ()

    • Don't crash the wizard if tvh has no inputs (

    • Don't call epg_broadcast_set_description twice ()

    • Reduce ADTS header size for better compatibility ()

    • Remove always-true checks ()

    • Increase maximum ADTS packet size to match FFMPEG ()

    • Attempt to fix profile sharer memory leak ()

    • Fix bad mono2sec usage ()

    • Fix race condition/data corruption in imagecache ()

    • Fixed typo ()

    • Close FDs even if no UDP connection is used ()

    • Revert 4355488b8e1e868cb434bf95676c0944b44e88b3 ()

    • Fix typo ()

    • Attempt to fix HBBTV memory leak ()

    • Update regexps for the finnish EIT scraping ()

    • mpegts dvb: Add support for LCN for provider DigiTV ()

    • Avoid leaking iptv fd's ()

    • Ignore PCRE2 illegal accesses ()

    • Fix potential memory leak ()

    • output: UDP streaming ()

    • Added support for ATSC text mode == 0x3F ()

    • Fix crash when mpegts_service_refresh tries to open the CAT again ()

    • Fix FTBFS introduced by 86f3617c8972c5362e51cee7d34cc2d69d799126 ()

    • Allow network scan to modify muxes ()

    • Regexps for the finnish EIT scraping ()

    • extending the regexps for the italian EIT scraping ()

    • No longer use git-protocol ()

    • add Access-Control-Allow-Headers content-length ()

    • Update Copyright year ()

    • Add HMF_UUID to htsmsg_binary_write ()

    • Use GitHubs CI for Building ()

    • GitHub actions improvements ()

    • Travis CI is dead, use GitHub actions for badge ()

    • Fix potential null-pointer-dereference ()

    • Remove useless null-check on an array ()

    • Prevent deadlock-detector leaking memory ()

    • Fix FTBFS in utils.c ()

    • Always parse 'src' in RTSP-requests ()

    • SAT>IP client: UPnP header field names are case insensitive ()

    • Update Python shebangs to python3 ()

    • Fix sid doozer build ()

    • Fix doozer CentOS build ()

    • More doozer build fixes ()

    • Add --nowerror to build for RPM packages ()

    • Fix some failing builds ()

    • Fix doozer builds ()

    • Doozer fixes ()

    • Update RPM to python3 ()

    • epg: ignore past events when matching on eid ()

    • Changed debian package version to 7 ()

    • Update buffer size for h264 and hevc ()

    • doozer: Migrate to Fedora 34 and 35 ()

    • Fix failing builds again ()

    • Episode number regexp ()

    • Fix some issues introduced in #0165f365cd58bbcc3734e4ec9ce696b42870ff8e ()

    • Fix "as: invalid option" during libvpx compilation ()

    • configure: add execinfo option ()

    • Update Makefile.ffmpeg ()

    • some changes to nvenc ()

    • Check the return code of snprintf in utils.c:rmtree ()

    • Fixed parsing w_scan format ()

    • Revert "Remove unnecessary conversion" ()

    • Add support for SCT_RDS ()

    • Expose RDS flag via HTSP. ()

    • Remove unnecessary conversion ()

    • Upgrade to libhdhomerun_20210624 ()

    • Fix ffmpeg jessie build error ()

    • Doozer.io: Add build targets for Debian, Bullseye & Sid ()

    • Autobuild: Add arm64, armhf and armel for bullseye and buster. ()

    • Attempt to fix trusty and centos builds ()

    • Attempt to fix jessie build ()

    • Attempt to fix jessie build ()

    • Fix slow loading bandwidth monitor graph in status tab ()

    • As we no longer have access to #hts on freenode swap to using libera - see https://tvheadend.org/issues/6054 ()

    • Add NVIDIA Hardware accelerated decoding for transcoding ()

    • Fix EN50211 size for large messages ()

    • Allow PMT Parsing when PMT shares a PID with another table ()

    • Fix missing } from previous commit ()

    • Update ffmpeg to 4.4 ()

    • else is missing ()

    • seen is a unsigned type ()

    • SAT>IP-Client: Add option for 16, 24 and 32-channel DVB-C tuners ()

    • Update profile.c ()

    • specified the value on each line ()

    • Delete .DS_Store ()

    • Delete .DS_Store ()

    • Delete .DS_Store ()

    • Update .gitignore ()

    • Improve Readme.md file with a more visual approach ()

    • Move travis builds from trusty to bionic ()

    • Fix possible deadlock ()

    • Update libssl-dependency information ()

    • Add pid file hint for systemd-sysv-generator ()

    • remote timeshift: fix compilation with IPTV disabled ()

    • Upgrade to libhdhomerun_20210224 ()

    • remote timeshift: fix crash on multiple subscriptions and cleanup ()

    • Reset error counters for IPTV on start, issue #5760 ()

    • Try to fix error during compilation ()

    • Fix possible NULL-Pointer-reference ()

    • EMM patch ()

    • Fix issues identified by coverity ()

    • Attempt to fix nvenc encoding ()

    • Rewrite scanfile.c for dynamic memory allocation (#1387) ()

    • Fix uninitialised memory access for several ioctl commands (#1382) ()

    • Add accidentally deleted line again ()

    • Enable LIBX265_DIFFS again ()

    • Silence more x265 warnings ()

    • Move from travis-ci.org to travis-ci.com and update date ()

    • Remove link to bintray as they will shutdown in 2 weeks ()

    • Fix several issues discovered by coverity ()

    • More coverity fixes ()

    • Fix crash when using matroska profile ()

    • Fix more issues identified by coverity ()

    • Fix too small memory allocation ()

    • Upgrade to libhdhomerun_20200907 ()

    • Added ISDB-T SATIP Support ()

    • Add ISDB-T in hdhomerun ()

    • Fix possible deadlock when using tvh_mutex_trylock() ()

    • Sat>IP clear old signal info when opening new stream ()

    • Remove libva-x11 dependency ()

    • docs: fix simple typo, separately -> separately ()

    • in python 3, dict.has_key() has been removed ()

    • Correct Environment variable name. ()

    • Changed shebang of tvhmeta to python ()

    • Use https for downloading ffmpeg and update nv-codec-headers ()

    • Add removed checksum ()

    • Silence x265 warnings (#1368) ()

    • Change no_sanitize("thread") attributes ()

    • Adding polish scraper for DVBC ()

    • Fix #5962 ()

    • Attempt to fix focal build in doozer ()

    • Make focal use python3 for upload ()

    • Fix vaapi patch ()

    • Fix cut & paste error in api/epg. (#1360) ()

    • Remove wrong test in nvenc.c ()

    • Revert dca46eedd9653b90d2722e67281eed0b35740730 ()

    • Upgrade to libhdhomerun_20200521 ()

    • Fix TheTVDB Query ()

    • Revert "HTSP v35: Add support for recording file size" (#1352) ()

    • HTSP v35: Add support for recording file size ()

    • Attempt to fix doozer build/python2/3 detection ()

    • Replace long by int64_t in json parser, fixes #5844 (#1349) ()

    • see https://tvheadend.org/issues/5722 ()

    • Report AAC and AAC-LATM correctly. Always raw stream AAC audio as audio/aac. ()

    • Additional sanity check ()

    • Fix memory leak ()

    • xmltv: add program icon to exported xmltv. Fixes: #5685 ()

    • Allocate space for buf on heap (modified PR #1324) ()

    • Allocate space for buf on heap (modified PR #1324) ()

    • Fix infinite loop when parsing invalid EIT CRID data ()

    • Fix building with -fno-common (default from GCC 10) ()

    • Add python3 requests dependency ()

    • Change nv-codec-headers path, fixes #5901 ()

    • Update Copyright date on UI 'About' screen. ()

    • dvbpsi: Fix build when DVB is not enabled at all ()

    • Changed default .pid path from /var/run/tvheadend.pid to /run/tvheadend.pid to follow "new" FSH 3 standard ()

    • Fix doozer builds ()

    • Fix doozer builds ()

    • Drop focal i386 support ()

    • Use python3 if available ()

    • Attempt to fix doozer builds (#1340) ()

    • Deprecate python2, add support for python3 (#1338) ()

    • Move forward from cosmic to focal ()

    • Prevent buffer overflow, fixes #5896 ()

    • Fix buffer overflow ()

    • Use python3 on focal ()

    • Update copyright and packages link ()

    • Move from cosmic to focal (#1337) ()

    • Upgrade to libhdhomerun_20200225 ()

    • Use HTTPS for libhdhomerun download ()

    • Fix the query URL for IMDB website. (#1327) ()

    • HTSP v35: Add support for recording file size ()

    • esstream: fix NULL dereference in elementary_set_filter_build(), fixes #5787 ()

    • Fix #5782 ()

    • capmt: fix the input filter ()

    • service: fix the default return value for service_get_source() ()

    • mpegts service: fix the build without mpegts_dvb (see PR#1321) ()

    • satip client: try to fix the missing poll file descriptor removal, issue #5496 ()

    • docs: add hint on shell redirections (#5761) ()

    • htsstr: add htsstr_argsplit() test ()

    • htsstr: fix the wrong argument parsing, fixes #5761 ()

    • tvhpoll: add event helpers, code cleanups ()

    • Remove dead assignment ()

    • tvhpoll: add tvhpoll_set_trace() ()

    • xmltv: Fix xmltv_ns typo, fixes #5720 ()

    • Webui: minimal reworks for access theme ()

    • webui: m3u playlist - mark tag playlists with type=playlist, fixes #5663 ()

    • access.h: reorder access_t (format members) ()

    • access: allow to change/set xmltv/htsp output format per matched entry ()

    • dvr: fix the DVR limit per user condition (subtract self) ()

    • access: added missing break for connection limit type ()

    • satip client: SATIP Kathrein & Triax: Avoid mandatory rolloff on DVBS2, fixes #5517 ()

    • satip client: allow to set the rolloff to all possible combinations ()

    • api: return EPERM for the empty arguments, fixes #5755 ()

    • tvhdhomerun: fix the cablecard access in tvhdhomerun_frontend_monitor_cb() ()

    • Fix division by 0, fixes #5754 ()

    • dvb psi: fix the removed MPEG2VIDEO assignment, fixes #5752 ()

    • mux grid: enable 'hide: parent disabled' ()

    • dvb psi: add 0x87 estype as EAC3 (ATSC), fixes #5684 ()

    • bugfix for autorecs duplicate episode number detection in autorecs ()

    • autobuild: add build target for raspbian-buster ()

    • channels: Make const-correct. ()

    • htsp: Allow basic htsp format, fixes #5630 ()

    • xmltv: Avoid outputting lang tags in xmltv for only one language, fixes #5630 ()

    • Added patch to HDHomerun library to allow cross-compilation ()

    • tvhcsa: shift the standard headers to top ()

    • Mux scan: Log correction ()

    • Upgrade to libhdhomerun_20190621 ()

    • systemd service file: remove wildcard mounts preventing startup - replace with a note ()

    • Fixed bad quality for vaapi transcoding h264 and hevc with bitrate ()

    • packaging: add missing DEBHELPER placeholder to postrm script ()

    • linuxdvb: fix integer overflow on 32-bit platforms ()

    • iptv: fix integer overflow on 32-bit platforms ()

    • linuxdvb: take in account similar dmx for the exclusive tuner access, fixes #5744 ()

    • api: fix the wrong negative error codes, fixes #5743 ()

    • satip client: add ATSC- string parsing, issue #5728 ()

    • linuxdvb: do not mix DVBv3/v5 stats, it causes trouble to drivers, fixes #5625 ()

    • add FHD quality support ()

    • service: correct fhdtv/uhdtv height checks ()

    • bouquet: fix overflow when building for 32-bit system On 32-bit system hash value from service can be truncated. ()

    • man page: Correct default values for http and htsp port ()

    • linuxdvb: compilation fix, fixes #5739 ()

    • cclient: more ECM PID fixes, reorder code to be more readable, fixes #5659 ()

    • cclient: mark correctly ECM PID for close, fixes #5659 ()

    • cclient: fix the ECM PID flag for newcamd and cccam, fixes #5659 ()

    • Include stdio.h before tvheadend headers ()

    • Makefile: fix -pie linking according to --disable-pie ()

    • Fix compilation with libhdhomerun 20190621 ()

    • linuxdvb: fix signal status monitor ()

    • mpegts: use 32-bit tsid/onid to define the NONE /unset/ state properly ()

    • revert bogus ONID and TSID remapping ()

    • capmt: another compilation fix, fixes #5661 ()

    • capmt: fix compilation with recent gcc, fixes #5657 ()

    • capmt: fix for the oscam r11520+, fixes #5649 ()

    • fanart: Fix decode error. ()

    • en50221: fix invalid htsmsg manipulation ()

    • en50221: fix menu text decoding ()

    • dvbpsi: fix the freesat bouquet update (inverted condition), fixes #5572 ()

    • api: return an error when incomplete query is passed, fixes #5568 ()

    • linuxdvb: create the mux instances also for the slave tuners, issue #5128 ()

    • linuxdvb: use the right configuration root for the slave tuners (loading), issue #5128 ()

    • Freesat_huffman: Suppress characters < 0x20 except \n. ()

    • Update to newest ffmpeg to fix libX11 compile issue "DSO missing from commandline" ()

    • Add sat longitude and usals angle as parameters to the rotor external command ()

    • http server: fix digest MD5 authorization, fixes #5573 ()

    • utils: sbuf - use correct format character, fixes #5565 ()

    • SAT>IP: fix done - close sessions only when server is active ()

    • eit: fix the possible NULL dereference ()

    • utils: cosmetic fix for sbuf_alloc_fail ()

    • freesat bouquet parser: fix endless loop (double list insert), fixes #4851 ()

    • tvh thread: increase the default watchdog timeout to 15 seconds ()

    • mpegts: fix the idle scan (use another idle scan queue - fixes #5548) ()

    • systemd: service/unit should not be started until after file-systems are mounted - this avoids "file missing" errors ()

    • Prevent rebinding when refreshing SAT-IP Server settings and not changing port, fixes #5539 ()

    • tvh-json.py: the list is returned instead dictionary ()

    • iptv: another improvement in the thread exit procedure, fixes #5550 ()

    • iptv: improve the thread exit procedure, issue #5550 ()

    • iptv: improve the thread exit procedure - use pipe, fixes #5550 ()

    • satip client: fix the compilation, fixes #5547 ()

    • satip client: initialise variable _w correctly for the PIDs split rewrite, fixes #5544, issue #5549 ()

    • satip client: improve the PIDs split for the PLAY RTSP command, fixes #5544 ()

    • Triax & Kathrein: Increase pid length, issue #5544 ()

    • satip client: fix for the PIDs split - missing delpids, issue #5544 ()

    • mpegts: pid subscription - fix wrong mps_type mpegts_mps_cmp(), fixes #5492 ()

    • http server: fix the new digest hashes (apparently firefox nor chrome do support them) ()

    • mpegts input: fix the compilation error, fixes #5492 ()

    • http: digest - show the SHA hash as an authentication alternative (tested with curl) ()

    • http: digest - return back MD5 as only digest hash (multiple login dialogs for firefox/chrome) ()

    • http: digest - do not use EVP_sha512_256() for nonce, check openssl version ()

    • satip client: workaround for FritzBox 6490/6590 (status string parsing), rewritten PR#1256 ()

    • Fix description of RTP/AVP/TCP Mode ()

    • Added compatibility mode for SAT-IP tuners that mess up tuner numbers, for example FritzBox 6490/6590 ()

    • http server: add support for SHA-256 and SHA-512/256 digest hashes ()

    • esfilter: fix the wrong other mask (hbbtv), fixes #5531 ()

    • esfilter: cosmetic fix ()

    • channel: get number - select the lowest service number, fixes #5441 ()

    • descrambler: simplify some destroy sequences ()

    • dvb psi: fix hbbtv parsing, fixes #5531 ()

    • m3u: fix the NULL dereference if the input string cannot be converted to utf-8, fixes #5525 ()

    • WebUI: Update copyright year ()

    • CSS: Fixes ()

    • Update posix.mk ()

    • Kathrein EXIP: Add default config (SATIP) ()

    • dvr: Add {min,max}season and {min,max}year to autorec UI, fixes #5479 ()

    • Changes to make tvheadend work in a container while talking to HDHomerun ()

    • Assign a different port number for each frontend thread ()

    • Avoid caching HDHomeRun's IP address ()

    • Move HDHomeRun config fields into their own group in the UI ()

    • Log an error message if the configured IP address is invalid ()

    • Corrected local_ip description text ()

    • satip server: parse destination for RTP/AVP transfer ()

    • satip client: fix the network limit/group description ()

    • satip server: add icon files, fixes #5268 ()

    • eit: fix UK Cable Virgin configuration, fixes #5499 ()

    • eit: config - fix the json syntax error, fixes #5503 ()

    • mpegts dvb network: fix create mux - wrong class used for comparison (since commit dbee3d2049faa7d5e15374ddef37a91e86768b26), fixes #5486 ()

    • server.h: cleanups for TSS_ flags ()

    • mpegts input: change mpegts_input_tuning_error() to more universal mpegts_input_error() ()

    • mpegts network: stop all running muxes when the network was disabled by the user, fixes #5497 ()

    • http: CORS - add Access-Control-Allow-Credentials header for cookies ()

    • http: CORS - small optimisation ()

    • mpegts: add possibility to enable/disable network ()

    • otamux: fix the 15 seconds delay for the initial scan ()

    • service: enlist - use also is_enabled callback to check the network/mux enable state ()

    • iptv auto network: check the network enabled flag for the auto download ()

    • parse_ac3: avoid the endless loop for the AC3/EAC3 auto-detection, issue #5353 ()

    • Makefile.ffmpeg: upgrade ffmpeg to 4.1, x264 to 20190108, x265 to 2.9 ()

    • doozer: remove OOL Fedora 27 ()

    • otamux: fix NULL dereference, fixes #5488 ()

    • epggrab: reimplement the OTA grabber selection per mux ()

    • epg: add auto-ota-module detection ()

    • DVR: add utf8 validator for title/subtitle when cut ()

    • avahi: try to fix double free, fixes #5484 ()

    • eit: always prefer master rather than slave for the config, issue #5247 ()

    • main: Replace deprecated ERR_remove_state ()

    • CSS: Fix height % ()

    • Add missing !DOCTYPE html ()

    • Fix several errors detected by w3c css validator ()

    • api: Alternative showings match on title if no series link, fixes #5402 ()

    • ui: Make dialogs slightly bigger. ()

    • xmltv export: add LCN to the display-name attribute, fixes #5471 ()

    • cosmetic fixes and optimisations ()

    • satip client: fix the ATSC-C (Annex B) parameters, fixes #5447 ()

    • satip client: remove the dual condition for Annex B ()

    • xmltv: add support for the lcn tag, fixes #5471 ()

    • eit: try to fix the freesat issue, fixes #5247 ()

    • eit: another attempt to fix the freesat issue (slave eit), fixes #5247 ()

    • eit config: fix the uk_freesat_eit description, issue #5247 ()

    • pass muxer: fix the incorrect section length for EIT table, fixes #5418, issue #5062 ()

    • htsp server: use HTTP image URLs for image cache for older clients (pvr.hts), fixes #5455 ()

    • teletext: fix the subtitle parser (wrong SCT_ type match), issue #5422 ()

    • imagecache: fix the missing ref initialisation, fixes #5458 ()

    • hdhomerun: auto detect DVB_T devices ()

    • imagecache: the timer function is already called inside imagecache_lock (sorry), fixes #5458 ()

    • Revert "dvr: move dvr_notify() call to the global_lock using timers, fixes #5437" ()

    • imagecache: do not use global lock, fixes #5453 ()

    • Fix mpegts packet length in descrambler_data_key_check ()

    • caclient: handle correctly connection close / read error, fixes #5445 ()

    • mpegts: fix mpegts_service_find_e2() for atsc-t ()

    • cclient: check keep-alive also when no poll event occurs, fixes #5445 ()

    • satip server: fix ATSC-T / Annex B cable frequency parsing, fixes #5447 ()

    • api: add id=all for the connections/cancel, issue #4937 ()

    • webui: add "drop all connections", fixes #4937 (original request only) ()

    • webui: status - drop all connections - use new id=all call, fixes #4937 ()

    • added linudvb_rotor_external to control an actuator by spawning an external command ()

    • linuxdvb: satconf - cleanups for the rotor external command ()

    • xmltv import: fix the wrong end-of-string mark (off-by-one), fixes #5443 ()

    • dvr: move dvr_notify() call to the global_lock using timers, fixes #5437 ()

    • tvh thread: do not crash when mutex==NULL (magic check failed), fixes #5435 ()

    • satip server: use strempty() function for the uuid check, fixes #5434 ()

    • dvb psi pmt: change the teletext subtitle handling for multiple teletext descriptors, issue #5422 ()

    • iptv: remove double pcr: from traces ()

    • htsp server: fix the wrong htsmsg destroy introduced in the imagecache patch, fixes #5430, fixes #5431, fixes #5429 ()

    • tvh thread: remove wrong commit code ()

    • dvr: fix the real_start variable misuse, fixes #5426 ()

    • satip client: fix the double (and wrong) sf_last_data_tstamp update, fixes #5374 ()

    • iptv http: call iptv_input_mux_started(), move recv_flush to http-header back ()

    • mpegts input: add CC restart for tables, too ()

    • sbuf: add sbuf_replace() ()

    • iptv http: remove the wrong si rewrite code, cleanup the free sequence ()

    • dvb psi lib: add dvb_table_parse_reinit functions ()

    • remove debug code (added by mistake) ()

    • imagecache: do not update the accessed field too much ()

    • profile: add more doc to the pass rewrite fields ()

    • imagecache: increase the save access threshold again ()

    • iptv: add missing lock to the iptv_http_kick_cb, fixes #5415, issue #5353 ()

    • iptv: correction for the previous patch, fixes #5415, issue #5353 ()

    • iptv: http - do not clear the input sbuf in the kick callback ()

    • iptv: http - fix the compilation problem with the previous patch ()

    • mpegts: do not set wrong pls code for bouquet rescan ()

    • main: fix compilation without traces ()

    • http: add auth type detection ()

    • http server: remove wrong aa_auth check from page_srvid2, fixes #5416 ()

    • http: fix the wrong return value (previous patch) ()

    • tvh thread: fix print other mutexes for abort ()

    • Makefile.ffmpeg: add crypto protocol for crypto+http (hls) ()

    • tprofile: fix possible division by zero ()

    • timers - change locking schema, fixes #5413, issue #5353 ()

    • timers: little fixes ()

    • tvh_thread: print filename/lineno for the magic failure when appropriate ()

    • profile: do init for all profile sharer members, issue #5409 ()

    • ui: Enable scrollbar for dialog info, fixes #5405 ()

    • ui: Fix background image to not accept clicks (#5405). ()

    • htsp_server: init htsp_out_mutex ()

    • Don't warn on packets with small/no payload. ()

    • fix some problems detected by cppcheck, issue #5353 ()

    • iptv http input: play with the locking, issue #5353 ()

    • tvh thread: add mutex magic check routines ()

    • main: add gtimer/mtimer magic checks ()

    • dvr: move the initial dvr_autorec_purge_obsolete_timers() call to better place, fixes #5406 ()

    • freebsd: Fixup header files for socket definitions. Make thread owner conditional on Linux. ()

    • Maximize use of libdvbcsa's batch processing. ()

    • wizard: spruce it up a bit ()

    • Reduce DESCRAMBLER_MAX_KEYS from 64 to 8, fixes #5400 ()

    • tvh_thread: show also waiters ()

    • tvhcsa: fix log offset type ()

    • htsmsg: check the field/key name length (max 255 characters), issue #5359 ()

    • xmltv: split names in credits, fixes #5359 ()

    • Fix compilation error: 'saveptr' may be used uninitialised in this function [-Werror=maybe-uninitialised] ()

    • Prepend title to autorec comment when created from EPG. ()

    • tvh_thread: do not use debug code when not activated, issue #5353, issue #5389 ()

    • pass muxer: correct SI length for trimmed events ()

    • satip client: activity timeout cleanups ()

    • http: forbidden status / access_verify2() cleanups, fixes #5391 ()

    • pass muxer: fix pass_muxer_nit_cb() - wrong private tag copy ()

    • tvhthread: fix the cond wait routines (preserve correctly filename/lineno) ()

    • tvh_thread: do not print sid for non glibc binaries, fixes #5385 ()

    • tvh_thread: another filename/lineno cleanups ()

    • tvhlog: add missing lock ()

    • atomic cleanups in tvh_thread, tvhlog (clang) ()

    • opentv: add NULL check to the opentv_find_entry(), fixes #5381 ()

    • imagecache: try to fix the state handling, fixes #5382 ()

    • imagecache: tiny code reshuffle ()

    • linuxdvb: add DMX_SET_SOURCE settings at the probe, fixes #5379 ()

    • dvb support: remove wrong characters bellow 0x20 (except 0x0a - newline), issue #5366 ()

    • http/webui: add special/srvid2 handling ()

    • xmltv: always change the module name after restart, fixes #5383 ()

    • Add ATSC-T With 8VSB Modulation (for Korean User) ()

    • satip client: show the proper connection state in 'RTSP cmd error' log message ()

    • satip client: cosmetic (indent) ()

    • imagecache: fix 'accessed' field loading and the default value, issue #4304 ()

    • imagecache: move saving procedure outside global_lock, fix imagecache_id after start, issue #4304 ()

    • imagecache: fix the build when caching code is deactivated, fixes #5372 ()

    • imagecache: another code reshuffle, add save for the accessed update, issue #4304 ()

    • opentv: fix the wrong event cleanup in opentv_add_entry(), issue #5297 ()

    • watchdog: rename tv_mutex_init to tvh_mutex_init ()

    • debian: remove db_reset lines - fixes #5358 ()

    • tvhlog: add tvhdbg() and send realtime mutex log lines to the UDP socket (if requested) ()

    • tvh thread: print the deadlock text also to stderr ()

    • tvhlog: fix NULL dereference crash ()

    • watchdog: fix missing pthread_mutex_destroy -> tvh_mutex_destroy, issue #5361 ()

    • tvhlog: fix tvhdbg() prototype when traces are not activated, fixes #5362 ()

    • satip client: fix activity timestamp for TCP data transfer mode, fixes #5348 ()

    • imagecache: fix the expire id, issue #4304 ()

    • move htsstr.h to tvh_string.h ()

    • initial pthread mutex/cond wrappers to detect deadlocks ()

    • thread: add mutex watchdog ()

    • tvh_thread: remove restrict keyword ()

    • access: fix tag exclude ()

    • access: a little code reorganisation for the latest tags exclude change ()

    • docs: update and add persistent auth info, refresh some screenshots and tweak a few bits ()

    • cosmetic: TVHeadend|tvheadend -> Tvheadend, where needed for consistency ()

    • debian packaging: always reset superuser info on removal ()

    • debian packaging: use db_purge on --purge ()

    • docs: update debugging ()

    • docs: another screenshot update ()

    • docs: use a table for the program details dialog toolbar items ()

    • descrambler: remove unused code ()

    • webui status: add user-agent (client) column ()

    • webui: streaming - fix the removed scoped lock, fixes #5356 ()

    • webui: remove Title0 typo ()

    • tvh thread: add mutex debug timing, fix the watchdog code ()

    • update valgrind.supp ()

    • tvh thread: fix gtimer_cond timedwait and tvh_cond_init() ()

    • tvh thread: compile the debug thread code only when traces are enabled ()

    • tvh-json.py: add proper digest/plain authentication, fixes #5350 ()

    • imagecache: add 'expire' time for the cached files, fixes #4304 ()

    • opentv: improve the split event merge logic, issue #5297 ()

    • api: Fix NULL blank argument. ()

    • opentv epg: try to fix the incomplete grabbing (use the whole time window for all subscribed PIDs), issue #5297 ()

    • capmt: cosmetic - remove double 'in' from log ()

    • satip client: add hard timeout for the incoming data ()

    • pass muxer: add possibility to continue streaming even if the service is changing, issue #5344 ()

    • pass muxer: do not check for multiple active services (it might not be true), issue #5344 ()

    • pass muxer: check correct variable for MC_CAP_ANOTHER_SERVICE, issue #5344 ()

    • service: do not stop the raw service streaming when service is not enabled ()

    • spawn: show permissions problem with kill, issue #4774 ()

    • webui: Add group renderer capabilities, now when grouping the title don't care about copyright year ()

    • webui: Add 'groupRenderer' in all tabs ()

    • webui: Add 'query CSFD' in dvr broadcast info window ()

    • http/webui: return not found status when redirection is not possible, fixes #5342 ()

    • webui debugging tab: typo fix ()

    • main: Fix OpenSSL 1.1 compilation without deprecated APIs ()

    • main: Load OpenSSL engines ()

    • http: rewrite again the access verification routines, fixes #5339 ()

    • linuxdvb: fix the exclusive frontend access, fixes #5330 ()

    • Fix typo ()

    • dvr: Fix season/episode unique test when recording. ()

    • dvr: Alter test for season/episode on unique path. ()

    • updated nginx example ()

    • webui: access theme - colour correction for EPG count info ()

    • linuxdvb: optimise the exclusive check code (previous change) ()

    • descrambler: improve EMM handling - add provider id checks ()

    • dvbpsi: move the cat decoder from descrambler to a common place and use it everywhere ()

    • dvb_mux_conf_init: set default pls_mode to GOLD, fixes #5328 ()

    • cclient: fix crash on cc_remove_card ()

    • descrambler: reset 'changed' flag on cc_remove_card ()

    • cclient: cc_remove_card - move state to ECM_INIT when active card is removed, issue #5314 ()

    • webui: fixes #5320 ()

    • htsmsg: add htsmsg_remove_string_from_list() function ()

    • satip: rtp - improve udp_multisend_send() error / full buffer condition checking, fixes #5319 ()

    • http: fix http_access_verify_channel(), fixes #5317 ()

    • satip server: fix memory leak for the slave service subscription, fixes #5314 ()

    • satip server: fix pmt rewrite (wrong CC), use sbuf as the internal data buffer ()

    • satip server: fix the weight handling for the scrambled slave subscriptions, fixes #5314 ()

    • mpegts mux: handle better mm_nicename updates ()

    • spawn: close pipe on fork() error path ()

    • iptv: add some more traces for pipe fds... ()

    • linuxdvb: do not call linuxdvb_satconf_power_save for non DVB-S frontends, fixes #5311 ()

    • linuxdvb: set volt - tiny optimisation ()

    • linuxdvb: try to improve the rotor logic (finish the movement), issue #5307 ()

    • satip client: do faster recovery when the server reboots ()

    • Update server.c ()

    • doozer: sort targets, add Fedora 29 ()

    • autobuild: remove Ubuntu Precise which is EOL (as of April 28, 2017) ()

    • doozer/autobuild: debian buster target ()

    • epg: play link - use temporary auth tickets again, fixes #5302 ()

    • linuxdvb rotor: improve satellite longitude description ()

    • scanfile: add support for PLS_CODE and PLS_MODE, fixes #5305 ()

    • htsp server: improve the htsp streaming connection limit check, issue #5290 ()

    • intextra: support 12bit unsigned nrs ()

    • msg queue: wake thread on new message ()

    • access: do not allocate always 50 bytes for aa_representative ()

    • access: set the temporary ticket lifetime between 30 and 3600 seconds ()

    • access: allow advanced streaming for the permanent tickets, fixes #5294 ()

    • webui: m3u playlist - add auth tokens for logo, fixes #5291 ()

    • webui: more tooltips for help buttons! ()

    • webui: Fix #5292 ()

    • Make authentication ticket lifetime configurable ()

    • tcp: fix wrong used variable initialisation, issue #5290 ()

    • service mapper: fix locking, issue #5261 ()

    • access: fix access_copy() for aa_auth, fixes #5285 ()

    • dvr_rec: fix early access_destroy ()

    • dvr: cleanup the error path in dvr_rec_subscribe() ()

    • access: do not use + character for the auth code (HTTP deescaping), issue #5274 ()

    • dvr: fix the dvr_rec_subscribe cleanup ()

    • service mapper: fix mono2sec -> sec2mono thinko ()

    • webui: fix http_m3u_playlist_add(), fixes #5274 ()

    • service mapper: try to determine quickly services without A/V streams, issue #5261 ()

    • http: terminate path correctly in http_resolve() ()

    • fixes for the permanent tickets, issue #5274 ()

    • doc: add authentication type for playlist in url.md ()

    • http: auth playlist, return unauthorized when the authcode is not present ()

    • htsp: Tidy serialisation of category and keyword. ()

    • service mapper: implement time watchdog (cca 30 seconds) ()

    • add permanent tickets for the authentication, fixes #5274 ()

    • linuxdvb: fix again the PLS code skip when the default value is used ()

    • dvb psi: change PMT monitor when PMT PID changes for SID, issue #4942 ()

    • dvb psi: fix for the previous commit - reinstall pmt monitor only when it's already installed ()

    • dvb psi: fix for the previous commits - move pmt monitor change to mpegts_service_find() ()

    • campt: fix the ct_multipid initialisation, fixes #5097 ()

    • bintray: disable uploads :-( ()

    • linuxdvb: set PLS code only when it differs from 1, fixes #5266 ()

    • htsmg: align the access to list/dictionary ()

    • Revert "FreeBSD: Fix recv problem if no data received." ()

    • FreeBSD: kevent is not a bitmask. ()

    • DVR: add username to the subscription, fixes #5215, fixes #5263 ()

    )
    lovcombo-all.js: Fix autorec create/edit TypeError with Firefox 134 (#1786)
    (
    )
    Remove links to old Wiki (#1793)
    (
    )
    wizard: increase buffer size to silence -Wformat-truncation on GCC 15
    (
    )
    Fix CI Builds 1/2
    (
    )
    Add start timeout to streaming profile
    (
    )
    fix bug in AAC channel layout configuration tab
    (
    )
    update vaapi - vainfo
    (
    )
    Allow setting a custom grace period for LinuxDVB adapters
    (
    )
    Docker/Alpine: Remove USB group
    (
    )
    configure: fix parsing args if values contain "="
    (
    )
    Translation for 'pl' updated.
    (
    )
    Translation for 'pl' updated.
    (
    )
    Translation for 'pl' updated.
    (
    )
    Translation for 'pl' updated.
    (
    )
    Translation for 'pl' updated.
    (
    )
    Translation for 'pl' updated.
    (
    )
    Translation for 'pl' updated.
    (
    )
    Translation for 'pl' updated.
    (
    )
    Translation for 'pl' updated.
    (
    )
    Translation for 'pl' updated.
    (
    )
    Translation for 'pl' updated.
    (
    )
    Translation for 'cs' updated.
    (
    )
    Translation for 'de' updated.
    (
    )
    Translation for 'fr' updated.
    (
    )
    Translation for 'hu' updated.
    (
    )
    Translation for 'es' updated.
    (
    )
    Translation for 'nl' updated.
    (
    )
    Translation for 'et' updated.
    (
    )
    Translation for 'en_GB' updated.
    (
    )
    Translation for 'it' updated.
    (
    )
    Translation for 'en_US' updated.
    (
    )
    Translation for 'pt' updated.
    (
    )
    Translation for 'ko' updated.
    (
    )
    Translation for '(#1655)' updated.
    (
    )
    bouquet: Allow merging of services across network bouquet, fixes #5617
    (
    )
    container: Add container support
    (
    )
    )
    Add "recordings" to the backup exclude list
    (
    )
    satipcli: Rename flag to include client reference
    (
    )
    main: Warn about unexpected configuration location
    (
    )
    Fix handling of legacy configuration directories in debian/postinst
    (
    )
    Clean up Debian postinst and postrm scripts
    (
    )
    Use sigaction() instead of signal()
    (
    )
    Transifex updates for project Tvheadend (#1587)
    (
    )
    Fix non-admin users not receiving any updates in web UI
    (
    )
    webui/dvr: Remove unused & duplicated functions
    (
    )
    webui/dvr: Add age_rating in recording details dialogs
    (
    )
    Use explicitly on format warnings for Time test
    (
    )
    CI: Build (without cloudsmith) all targets on every merge request
    (
    )
    Fix time for old 32bit systems
    (
    )
    Fix time for 32bit systems again
    (
    )
    Update Debian packaging to use the new configuration directories
    (
    )
    spawn: Do not close every possible file descriptor
    (
    )
    config: Fix whitespace errors
    (
    )
    dvr_storage: Also support server configurations for recordings
    (
    )
    config: Store config directory variable internally
    (
    )
    config: Add support for XDG config
    (
    )
    config: Support server configurations
    (
    )
    settings: Add XDG support helper functions
    (
    )
    dvr_storage: Use XDG spec directories
    (
    )
    Add simple 'ping' endpoint for healthchecks
    (
    )
    - fixed bug with _lang3_to_lang2()
    (
    )
    update pict_type from AVPacket to AVFrame
    (
    )
    update to ffmpeg 5.1.2
    (
    )
    remove unused function and migrate from AVBitStreamFilterContext to AVBSFContext
    (
    )
    update vaapi
    (
    )
    Fix Coverity-Build (#1499)
    (
    )
    Update debian/compat to version 10
    (
    )
    update vaapi
    (
    )
    Preserve existing Unicable idnode during the set operation
    (
    )
    profile video resize improvements
    (
    )
    update vaapi
    (
    )
    Avoid breaking strict aliasing in IP_AS_V{4,6}
    (
    )
    )
    Simplify IPv6 compare functions to unconfuse gcc compiler
    (
    )
    epgdb: Resolve symlinks before using file location
    (
    )
    iptv_auto: Add support for m3u "channel-number" tag
    (
    )
    Added more 'text modes' to the ATSC Multiple String Structure decoder and convert text to UTF-8. (Fixes #5162)
    (
    )
    Fixed and cleanup the "PSIP: ATSC Grabber" module (Fixes #5610)
    (
    )
    Fix use-after-free
    (
    )
    fix build with libressl
    (
    )
    dvr_disk_space_cleanup() - do not return error if called again too soon (#1)
    (
    )
    Update for VAAPI transcoding
    (
    )
    httpc: Fix multi-value "Connection" header checks
    (
    )
    nvenc: Fix Werror=misleading-indentation FTBFS
    (
    )
    nvenc: Fix Werror=int-conversion FTBFS (and likely bug)
    (
    )
    Use clock_gettime() instead of time() in epggrab.c
    (
    )
    iptv: Fix stream limit starting a new input on a running mux
    (
    )
    Improve the performance of updating the pid filter table in hdhomerun digital tuners.
    (
    )
    opentv: fix missing summary data on rescrape, #5995
    (
    )
    opentv: fix incorrect summaries for skyuk epg, fixes #5995
    (
    )
    iptv: new features for multicast, rtsp & rtcp
    (
    )
    Several coverity fixes, year updated, map muxes between DVB Types
    (
    )
    Several enhancements
    (
    )
    fix vaapi-profiles (#1366)
    (
    )
    update Makefile.ffmpeg (#1359)
    (
    )
    Fix NVENC
    (
    )
    Fix scraping 'new' flag from UK EIT.
    (
    )
    Fix escape code '&quote;' should be '"'. (#1355)
    (
    )
    Handle bad UTF-8 in xmltv (#5909)
    (
    )
    CSS: general improvements
    (
    )
    Makefile.ffmpeg: update almost all upstream packages
    (
    )
    xmltv: Allow sending basic xmltv format, fixes #5630
    (
    )
    tvhcsa.c: include stdio.h
    (
    )
    Avoid configure checks being optimised away with LTO
    (
    )
    dvr: Only check minseason/maxseason/minyear/maxyear if EPG has these values, fixes #5479
    (
    )
    dvr: New fmt spec for per-dir seasons and one movie per dir. (#4667)
    (
    )
    webui, htsbuf: Content-Disposition escape chars are not correct.
    (
    )
    epggrab: run internal grabbers only when wanted, fixes #5421
    (
    )
    imagecache: big cleanups
    (
    )
    dvr: Autorec rules must still match event after update. (#4760).
    (
    )
    ui: Add alternative/similar broadcast buttons, fixes #5335, #5336
    (
    )
    webui: epg: fix compatibility issue for FreeBSD
    (
    )
    Need to delete files on complex scheduling when replacing timer after crash.
    (
    )
    dvr: Add option to automatically delete recording after playback.
    (
    )
    Automatically generated: 2025-05-14 19:49:48 UTC
    2025-05-14arrow-up-right
    2025-05-13arrow-up-right
    2025-05-13arrow-up-right
    2025-05-13arrow-up-right
    2025-05-13arrow-up-right
    2025-05-13arrow-up-right
    2025-05-13arrow-up-right
    2025-05-13arrow-up-right
    2025-05-12arrow-up-right
    2025-05-12arrow-up-right
    2024-11-12arrow-up-right
    2024-10-08arrow-up-right
    2024-10-08arrow-up-right
    2024-10-08arrow-up-right
    2024-10-05arrow-up-right
    2024-09-28arrow-up-right
    2024-09-23arrow-up-right
    2024-09-23arrow-up-right
    2024-09-06arrow-up-right
    2024-09-06arrow-up-right
    2024-09-06arrow-up-right
    2024-09-06arrow-up-right
    2024-09-06arrow-up-right
    2024-08-28arrow-up-right
    2024-08-25arrow-up-right
    2024-08-25arrow-up-right
    2024-08-24arrow-up-right
    2024-08-22arrow-up-right
    2024-08-22arrow-up-right
    2024-08-12arrow-up-right
    Nightly build 4.3-2352arrow-up-right
    2024-08-10arrow-up-right
    Nightly build 4.3-2351arrow-up-right
    2024-08-04arrow-up-right
    2024-08-04arrow-up-right
    Nightly build 4.3-2349arrow-up-right
    2024-07-21arrow-up-right
    2024-07-21arrow-up-right
    Nightly build 4.3-2347arrow-up-right
    Nightly build 4.3-2346arrow-up-right
    2024-07-13arrow-up-right
    2024-07-13arrow-up-right
    2024-07-13arrow-up-right
    Nightly build 4.3-2344arrow-up-right
    Nightly build 4.3-2343arrow-up-right
    2024-06-27arrow-up-right
    2024-06-27arrow-up-right
    Nightly build 4.3-2342arrow-up-right
    2024-06-25arrow-up-right
    2024-06-25arrow-up-right
    Nightly build 4.3-2340arrow-up-right
    Nightly build 4.3-2339arrow-up-right
    Nightly build 4.3-2338arrow-up-right
    2024-06-23arrow-up-right
    2024-06-23arrow-up-right
    2024-06-23arrow-up-right
    Nightly build 4.3-2337arrow-up-right
    2024-06-18arrow-up-right
    Nightly build 4.3-2336arrow-up-right
    2024-06-15arrow-up-right
    Nightly build 4.3-2335arrow-up-right
    Nightly build 4.3-2334arrow-up-right
    Nightly build 4.3-2327arrow-up-right
    Nightly build 4.3-2326arrow-up-right
    Nightly build 4.3-2325arrow-up-right
    2024-06-06arrow-up-right
    2024-06-06arrow-up-right
    2024-06-06arrow-up-right
    2024-06-06arrow-up-right
    2024-06-06arrow-up-right
    2024-06-06arrow-up-right
    2024-06-06arrow-up-right
    2024-06-06arrow-up-right
    2024-06-06arrow-up-right
    Nightly build 4.3-2324arrow-up-right
    2024-06-05arrow-up-right
    Nightly build 4.3-2323arrow-up-right
    Nightly build 4.3-2322arrow-up-right
    2024-04-26arrow-up-right
    2024-04-26arrow-up-right
    Nightly build 4.3-2321arrow-up-right
    Nightly build 4.3-2320arrow-up-right
    2024-04-25arrow-up-right
    2024-04-24arrow-up-right
    Nightly build 4.3-2319arrow-up-right
    Nightly build 4.3-2318arrow-up-right
    2024-04-20arrow-up-right
    Nightly build 4.3-2317arrow-up-right
    2024-04-13arrow-up-right
    Nightly build 4.3-2316arrow-up-right
    2024-04-08arrow-up-right
    Nightly build 4.3-2315arrow-up-right
    Nightly build 4.3-2314arrow-up-right
    2024-03-24arrow-up-right
    2024-03-24arrow-up-right
    Nightly build 4.3-2313arrow-up-right
    2024-03-22arrow-up-right
    Nightly build 4.3-2312arrow-up-right
    2024-03-18arrow-up-right
    Nightly build 4.3-2300arrow-up-right
    2024-03-14arrow-up-right
    Nightly build 4.3-2299arrow-up-right
    2024-03-09arrow-up-right
    Nightly build 4.3-2298arrow-up-right
    Nightly build 4.3-2296arrow-up-right
    2024-03-08arrow-up-right
    2024-03-08arrow-up-right
    2024-03-08arrow-up-right
    Nightly build 4.3-2295arrow-up-right
    2024-03-07arrow-up-right
    2024-03-07arrow-up-right
    2024-03-07arrow-up-right
    Nightly build 4.3-2292arrow-up-right
    2024-03-03arrow-up-right
    Nightly build 4.3-2291arrow-up-right
    Nightly build 4.3-2290arrow-up-right
    Nightly build 4.3-2289arrow-up-right
    2024-03-01arrow-up-right
    2024-03-01arrow-up-right
    2024-03-01arrow-up-right
    2024-03-01arrow-up-right
    2024-03-01arrow-up-right
    Nightly build 4.3-2286arrow-up-right
    Nightly build 4.3-2285arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    Nightly build 4.3-2271arrow-up-right
    Nightly build 4.3-2270arrow-up-right
    Nightly build 4.3-2269arrow-up-right
    Nightly build 4.3-2268arrow-up-right
    2024-02-22arrow-up-right
    2024-02-22arrow-up-right
    Nightly build 4.3-2267arrow-up-right
    Nightly build 4.3-2266arrow-up-right
    Nightly build 4.3-2265arrow-up-right
    Nightly build 4.3-2264arrow-up-right
    Nightly build 4.3-2258arrow-up-right
    2024-02-21arrow-up-right
    2024-02-21arrow-up-right
    2024-02-21arrow-up-right
    2024-02-21arrow-up-right
    Nightly build 4.3-2257arrow-up-right
    Nightly build 4.3-2256arrow-up-right
    Nightly build 4.3-2255arrow-up-right
    Nightly build 4.3-2254arrow-up-right
    2024-02-20arrow-up-right
    2024-02-20arrow-up-right
    2024-02-20arrow-up-right
    2024-02-20arrow-up-right
    2024-02-20arrow-up-right
    2024-02-20arrow-up-right
    2024-02-20arrow-up-right
    2024-02-20arrow-up-right
    2024-02-20arrow-up-right
    Nightly build 4.3-2253arrow-up-right
    Nightly build 4.3-2252arrow-up-right
    Nightly build 4.3-2251arrow-up-right
    2024-02-19arrow-up-right
    2024-02-19arrow-up-right
    2024-02-19arrow-up-right
    2024-02-19arrow-up-right
    2024-02-19arrow-up-right
    2024-02-19arrow-up-right
    2024-02-18arrow-up-right
    2024-02-18arrow-up-right
    2024-02-18arrow-up-right
    2024-02-18arrow-up-right
    2024-02-18arrow-up-right
    2024-02-18arrow-up-right
    2024-02-18arrow-up-right
    2024-02-17arrow-up-right
    2024-02-17arrow-up-right
    2024-02-17arrow-up-right
    2024-02-17arrow-up-right
    2024-02-17arrow-up-right
    2024-02-17arrow-up-right
    2024-02-17arrow-up-right
    2024-02-17arrow-up-right
    2024-02-17arrow-up-right
    2024-02-17arrow-up-right
    2024-02-16arrow-up-right
    2024-02-15arrow-up-right
    Nightly build 4.3-2229arrow-up-right
    2024-02-11arrow-up-right
    Nightly build 4.3-2228arrow-up-right
    Nightly build 4.3-2227arrow-up-right
    2024-02-09arrow-up-right
    Nightly build 4.3-2226arrow-up-right
    2024-02-08arrow-up-right
    Nightly build 4.3-2225arrow-up-right
    Nightly build 4.3-2224arrow-up-right
    Nightly build 4.3-2223arrow-up-right
    2024-02-06arrow-up-right
    Nightly build 4.3-2222arrow-up-right
    2024-02-05arrow-up-right
    2024-02-05arrow-up-right
    2024-02-05arrow-up-right
    2024-02-05arrow-up-right
    2024-02-05arrow-up-right
    2024-02-05arrow-up-right
    2024-02-05arrow-up-right
    2024-02-05arrow-up-right
    Nightly build 4.3-2215arrow-up-right
    Nightly build 4.3-2214arrow-up-right
    Nightly build 4.3-2213arrow-up-right
    Nightly build 4.3-2212arrow-up-right
    Nightly build 4.3-2211arrow-up-right
    Nightly build 4.3-2210arrow-up-right
    2024-02-03arrow-up-right
    2024-02-03arrow-up-right
    2024-02-03arrow-up-right
    2024-02-03arrow-up-right
    2024-02-03arrow-up-right
    Nightly build 4.3-2209arrow-up-right
    Nightly build 4.3-2207arrow-up-right
    Nightly build 4.3-2206arrow-up-right
    Nightly build 4.3-2205arrow-up-right
    2024-02-02arrow-up-right
    2024-02-02arrow-up-right
    Nightly build 4.3-2204arrow-up-right
    Nightly build 4.3-2203arrow-up-right
    Nightly build 4.3-2202arrow-up-right
    2024-01-31arrow-up-right
    2024-01-31arrow-up-right
    Nightly build 4.3-2201arrow-up-right
    2024-01-30arrow-up-right
    Nightly build 4.3-2200arrow-up-right
    2024-01-28arrow-up-right
    2024-01-24arrow-up-right
    2024-01-23arrow-up-right
    2024-01-23arrow-up-right
    2024-01-23arrow-up-right
    2024-01-23arrow-up-right
    2024-01-22arrow-up-right
    Nightly build 4.3-2193arrow-up-right
    2024-01-21arrow-up-right
    Nightly build 4.3-2192arrow-up-right
    Nightly build 4.3-2191arrow-up-right
    2024-01-11arrow-up-right
    2024-01-11arrow-up-right
    Nightly build 4.3-2190arrow-up-right
    Nightly build 4.3-2189arrow-up-right
    2024-01-05arrow-up-right
    2024-01-04arrow-up-right
    Nightly build 4.3-2188arrow-up-right
    2024-01-01arrow-up-right
    Nightly build 4.3-2187arrow-up-right
    2023-12-26arrow-up-right
    Nightly build 4.3-2186arrow-up-right
    2023-12-18arrow-up-right
    Nightly build 4.3-2185arrow-up-right
    Nightly build 4.3-2184arrow-up-right
    2023-12-13arrow-up-right
    Nightly build 4.3-2183arrow-up-right
    2023-12-11arrow-up-right
    2023-12-11arrow-up-right
    2023-12-11arrow-up-right
    2023-12-09arrow-up-right
    2023-12-09arrow-up-right
    2023-12-09arrow-up-right
    2023-12-09arrow-up-right
    2023-12-09arrow-up-right
    Nightly build 4.3-2175arrow-up-right
    Nightly build 4.3-2174arrow-up-right
    Nightly build 4.3-2173arrow-up-right
    Nightly build 4.3-2172arrow-up-right
    Nightly build 4.3-2171arrow-up-right
    Nightly build 4.3-2169arrow-up-right
    2023-12-06arrow-up-right
    2023-12-06arrow-up-right
    2023-12-06arrow-up-right
    2023-12-06arrow-up-right
    2023-12-06arrow-up-right
    2023-12-06arrow-up-right
    2023-12-06arrow-up-right
    2023-12-05arrow-up-right
    Nightly build 4.3-2167arrow-up-right
    Nightly build 4.3-2166arrow-up-right
    2023-12-01arrow-up-right
    2023-12-01arrow-up-right
    2023-11-29arrow-up-right
    2023-11-29arrow-up-right
    2023-11-29arrow-up-right
    Nightly build 4.3-2162arrow-up-right
    2023-11-28arrow-up-right
    Nightly build 4.3-2161arrow-up-right
    2023-11-21arrow-up-right
    Nightly build 4.3-2160arrow-up-right
    2023-11-20arrow-up-right
    2023-10-26arrow-up-right
    Nightly build 4.3-2158arrow-up-right
    Nightly build 4.3-2157arrow-up-right
    2023-10-14arrow-up-right
    2023-10-14arrow-up-right
    2023-09-06arrow-up-right
    Nightly build 4.3-2154arrow-up-right
    Nightly build 4.3-2153arrow-up-right
    2023-08-11arrow-up-right
    Nightly build 4.3-2151arrow-up-right
    2023-08-09arrow-up-right
    2023-08-08arrow-up-right
    Nightly build 4.3-2149arrow-up-right
    2023-08-06arrow-up-right
    2023-08-05arrow-up-right
    Nightly build 4.3-2144arrow-up-right
    2023-08-02arrow-up-right
    Nightly build 4.3-2143arrow-up-right
    Nightly build 4.3-2142arrow-up-right
    2023-07-30arrow-up-right
    Nightly build 4.3-2141arrow-up-right
    2023-07-19arrow-up-right
    2023-06-25arrow-up-right
    Nightly build 4.3-2139arrow-up-right
    2023-06-23arrow-up-right
    2023-06-23arrow-up-right
    2023-06-21arrow-up-right
    2023-06-16arrow-up-right
    2023-06-15arrow-up-right
    2023-06-12arrow-up-right
    2023-06-07arrow-up-right
    2023-06-07arrow-up-right
    2023-06-05arrow-up-right
    Nightly build 4.3-2118arrow-up-right
    2023-04-17arrow-up-right
    2023-04-08arrow-up-right
    Nightly build 4.3-2115arrow-up-right
    2023-04-02arrow-up-right
    2023-04-02arrow-up-right
    2023-04-01arrow-up-right
    2023-03-30arrow-up-right
    2023-03-25arrow-up-right
    2023-03-24arrow-up-right
    2023-03-23arrow-up-right
    2023-03-23arrow-up-right
    2023-03-14arrow-up-right
    2023-03-08arrow-up-right
    2023-03-06arrow-up-right
    2023-03-06arrow-up-right
    2023-03-06arrow-up-right
    2023-03-05arrow-up-right
    2023-02-24arrow-up-right
    2023-02-24arrow-up-right
    2023-02-21arrow-up-right
    2023-02-20arrow-up-right
    2023-02-12arrow-up-right
    2023-02-10arrow-up-right
    2023-01-28arrow-up-right
    2023-01-27arrow-up-right
    2023-01-24arrow-up-right
    2023-01-24arrow-up-right
    2023-01-24arrow-up-right
    2023-01-24arrow-up-right
    2023-01-24arrow-up-right
    2023-01-23arrow-up-right
    2023-01-23arrow-up-right
    2023-01-23arrow-up-right
    2023-01-23arrow-up-right
    2023-01-22arrow-up-right
    2023-01-22arrow-up-right
    2023-01-17arrow-up-right
    2023-01-14arrow-up-right
    2023-01-10arrow-up-right
    2023-01-10arrow-up-right
    2023-01-04arrow-up-right
    2022-12-21arrow-up-right
    2022-12-21arrow-up-right
    2022-12-21arrow-up-right
    2022-12-17arrow-up-right
    2022-12-17arrow-up-right
    2022-12-10arrow-up-right
    2022-11-28arrow-up-right
    2022-11-28arrow-up-right
    2022-11-28arrow-up-right
    2022-11-27arrow-up-right
    2022-11-21arrow-up-right
    2022-11-21arrow-up-right
    2022-11-21arrow-up-right
    2022-11-21arrow-up-right
    2022-11-21arrow-up-right
    2022-11-10arrow-up-right
    2022-10-27arrow-up-right
    2022-10-27arrow-up-right
    2022-10-27arrow-up-right
    2022-10-26arrow-up-right
    2022-10-26arrow-up-right
    2022-10-26arrow-up-right
    2022-10-26arrow-up-right
    2022-10-26arrow-up-right
    2022-10-16arrow-up-right
    2022-10-14arrow-up-right
    2022-10-07arrow-up-right
    2022-10-07arrow-up-right
    2022-10-07arrow-up-right
    2022-10-07arrow-up-right
    2022-10-03arrow-up-right
    2022-09-15arrow-up-right
    2022-09-15arrow-up-right
    2022-09-03arrow-up-right
    2022-07-17arrow-up-right
    2022-07-08arrow-up-right
    2022-06-17arrow-up-right
    2022-04-22arrow-up-right
    2022-04-14arrow-up-right
    2022-04-11arrow-up-right
    2022-04-11arrow-up-right
    2022-04-11arrow-up-right
    2022-04-11arrow-up-right
    2022-04-08arrow-up-right
    2022-04-08arrow-up-right
    2022-04-08arrow-up-right
    2022-04-07arrow-up-right
    2022-04-05arrow-up-right
    2022-03-15arrow-up-right
    2022-02-14arrow-up-right
    2022-02-14arrow-up-right
    2022-02-14arrow-up-right
    2022-02-14arrow-up-right
    2022-02-13arrow-up-right
    2022-02-13arrow-up-right
    2022-02-13arrow-up-right
    2022-02-13arrow-up-right
    2022-02-13arrow-up-right
    2022-02-12arrow-up-right
    2022-02-12arrow-up-right
    2022-02-12arrow-up-right
    2022-02-12arrow-up-right
    2022-02-12arrow-up-right
    2022-01-12arrow-up-right
    2022-01-10arrow-up-right
    2022-01-09arrow-up-right
    2022-01-02arrow-up-right
    2022-01-02arrow-up-right
    2022-01-02arrow-up-right
    2021-12-12arrow-up-right
    2021-11-15arrow-up-right
    2021-09-07arrow-up-right
    2021-09-06arrow-up-right
    2021-09-06arrow-up-right
    2021-09-06arrow-up-right
    2021-07-29arrow-up-right
    2021-07-24arrow-up-right
    2021-07-23arrow-up-right
    2021-07-23arrow-up-right
    2021-07-23arrow-up-right
    2021-07-23arrow-up-right
    2021-07-23arrow-up-right
    2021-07-21arrow-up-right
    2021-06-12arrow-up-right
    2021-06-09arrow-up-right
    2021-05-31arrow-up-right
    2021-05-05arrow-up-right
    2021-05-05arrow-up-right
    2021-05-05arrow-up-right
    2021-05-04arrow-up-right
    2021-05-04arrow-up-right
    2021-05-04arrow-up-right
    2021-05-01arrow-up-right
    2021-05-01arrow-up-right
    2021-05-01arrow-up-right
    2021-05-01arrow-up-right
    2021-05-01arrow-up-right
    2021-05-01arrow-up-right
    2021-04-21arrow-up-right
    2021-04-20arrow-up-right
    2021-04-02arrow-up-right
    2021-04-02arrow-up-right
    2021-04-02arrow-up-right
    2021-03-19arrow-up-right
    2021-03-17arrow-up-right
    2021-03-16arrow-up-right
    2021-03-16arrow-up-right
    2021-03-16arrow-up-right
    2021-03-12arrow-up-right
    2021-02-24arrow-up-right
    2021-02-24arrow-up-right
    2021-02-21arrow-up-right
    2021-02-20arrow-up-right
    2021-02-18arrow-up-right
    2021-02-18arrow-up-right
    2021-02-18arrow-up-right
    2021-02-18arrow-up-right
    2021-02-18arrow-up-right
    2021-02-18arrow-up-right
    2021-02-18arrow-up-right
    2021-02-18arrow-up-right
    2021-02-18arrow-up-right
    2021-02-18arrow-up-right
    2021-02-17arrow-up-right
    2020-12-29arrow-up-right
    2020-12-29arrow-up-right
    2020-12-29arrow-up-right
    2020-12-16arrow-up-right
    2020-12-14arrow-up-right
    2020-12-06arrow-up-right
    2020-11-27arrow-up-right
    2020-11-14arrow-up-right
    2020-10-28arrow-up-right
    2020-10-28arrow-up-right
    2020-10-27arrow-up-right
    2020-10-27arrow-up-right
    2020-10-27arrow-up-right
    2020-10-22arrow-up-right
    2020-10-21arrow-up-right
    2020-10-19arrow-up-right
    2020-10-14arrow-up-right
    2020-10-14arrow-up-right
    2020-10-12arrow-up-right
    2020-10-08arrow-up-right
    2020-10-08arrow-up-right
    2020-09-28arrow-up-right
    2020-09-13arrow-up-right
    2020-07-13arrow-up-right
    2020-07-11arrow-up-right
    2020-07-11arrow-up-right
    2020-07-07arrow-up-right
    2020-07-06arrow-up-right
    2020-07-06arrow-up-right
    2020-07-06arrow-up-right
    2020-07-06arrow-up-right
    2020-06-10arrow-up-right
    2020-06-08arrow-up-right
    2020-06-08arrow-up-right
    2020-06-08arrow-up-right
    2020-06-05arrow-up-right
    2020-06-03arrow-up-right
    2020-05-22arrow-up-right
    2020-05-22arrow-up-right
    2020-05-21arrow-up-right
    2020-05-21arrow-up-right
    2020-05-21arrow-up-right
    2020-05-19arrow-up-right
    2020-05-19arrow-up-right
    2020-05-19arrow-up-right
    2020-05-18arrow-up-right
    2020-05-18arrow-up-right
    2020-05-17arrow-up-right
    2020-05-15arrow-up-right
    2020-05-15arrow-up-right
    2020-05-15arrow-up-right
    2020-05-15arrow-up-right
    2020-05-15arrow-up-right
    2020-05-15arrow-up-right
    2020-05-15arrow-up-right
    2020-05-15arrow-up-right
    2020-05-14arrow-up-right
    2020-05-14arrow-up-right
    2019-11-28arrow-up-right
    2019-11-28arrow-up-right
    2019-11-15arrow-up-right
    2019-11-04arrow-up-right
    2019-11-04arrow-up-right
    2019-11-01arrow-up-right
    2019-11-01arrow-up-right
    2019-10-31arrow-up-right
    2019-10-31arrow-up-right
    2019-10-31arrow-up-right
    2019-10-28arrow-up-right
    2019-10-28arrow-up-right
    2019-10-27arrow-up-right
    2019-10-27arrow-up-right
    2019-10-24arrow-up-right
    2019-10-21arrow-up-right
    2019-10-21arrow-up-right
    2019-10-21arrow-up-right
    2019-10-21arrow-up-right
    2019-10-21arrow-up-right
    2019-10-21arrow-up-right
    2019-10-21arrow-up-right
    2019-10-21arrow-up-right
    2019-10-20arrow-up-right
    2019-10-19arrow-up-right
    2019-10-18arrow-up-right
    2019-10-17arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-14arrow-up-right
    2019-10-14arrow-up-right
    2019-10-06arrow-up-right
    2019-10-06arrow-up-right
    2019-10-06arrow-up-right
    2019-10-06arrow-up-right
    2019-10-06arrow-up-right
    2019-10-06arrow-up-right
    2019-10-06arrow-up-right
    2019-08-02arrow-up-right
    2019-07-29arrow-up-right
    2019-07-06arrow-up-right
    2019-07-02arrow-up-right
    2019-06-30arrow-up-right
    2019-06-30arrow-up-right
    2019-06-30arrow-up-right
    2019-06-30arrow-up-right
    2019-06-30arrow-up-right
    2019-06-18arrow-up-right
    2019-06-17arrow-up-right
    2019-06-12arrow-up-right
    2019-05-20arrow-up-right
    2019-05-20arrow-up-right
    2019-05-20arrow-up-right
    2019-03-24arrow-up-right
    2019-03-21arrow-up-right
    2019-03-20arrow-up-right
    2019-03-20arrow-up-right
    2019-03-15arrow-up-right
    2019-03-13arrow-up-right
    2019-03-13arrow-up-right
    2019-03-13arrow-up-right
    2019-03-07arrow-up-right
    2019-03-06arrow-up-right
    2019-03-06arrow-up-right
    2019-03-06arrow-up-right
    2019-03-06arrow-up-right
    2019-03-02arrow-up-right
    2019-03-02arrow-up-right
    2019-03-01arrow-up-right
    2019-03-01arrow-up-right
    2019-03-01arrow-up-right
    2019-02-28arrow-up-right
    2019-02-27arrow-up-right
    2019-02-27arrow-up-right
    2019-02-16arrow-up-right
    2019-02-16arrow-up-right
    2019-02-15arrow-up-right
    2019-02-15arrow-up-right
    2019-02-15arrow-up-right
    2019-02-14arrow-up-right
    2019-02-14arrow-up-right
    2019-02-14arrow-up-right
    2019-02-14arrow-up-right
    2019-02-14arrow-up-right
    2019-02-14arrow-up-right
    2019-02-14arrow-up-right
    2019-02-14arrow-up-right
    2019-02-14arrow-up-right
    2019-02-13arrow-up-right
    2019-02-12arrow-up-right
    2019-02-12arrow-up-right
    2019-02-11arrow-up-right
    2019-02-11arrow-up-right
    2019-02-09arrow-up-right
    2019-02-04arrow-up-right
    2019-02-04arrow-up-right
    2019-02-04arrow-up-right
    2019-02-04arrow-up-right
    2019-02-04arrow-up-right
    2019-02-04arrow-up-right
    2019-02-04arrow-up-right
    2019-02-04arrow-up-right
    2019-02-04arrow-up-right
    2019-02-04arrow-up-right
    2019-02-04arrow-up-right
    2019-02-04arrow-up-right
    2019-01-24arrow-up-right
    2019-01-23arrow-up-right
    2019-01-21arrow-up-right
    2019-01-18arrow-up-right
    2019-01-18arrow-up-right
    2019-01-17arrow-up-right
    2019-01-15arrow-up-right
    2019-01-15arrow-up-right
    2019-01-15arrow-up-right
    2019-01-14arrow-up-right
    2019-01-14arrow-up-right
    2019-01-14arrow-up-right
    2019-01-14arrow-up-right
    2019-01-14arrow-up-right
    2019-01-14arrow-up-right
    2019-01-13arrow-up-right
    2019-01-09arrow-up-right
    2019-01-09arrow-up-right
    2019-01-09arrow-up-right
    2019-01-08arrow-up-right
    2019-01-08arrow-up-right
    2019-01-08arrow-up-right
    2019-01-08arrow-up-right
    2019-01-02arrow-up-right
    2019-01-02arrow-up-right
    2019-01-02arrow-up-right
    2019-01-02arrow-up-right
    2019-01-02arrow-up-right
    2019-01-02arrow-up-right
    2019-01-02arrow-up-right
    2019-01-01arrow-up-right
    2019-01-01arrow-up-right
    2019-01-01arrow-up-right
    2019-01-01arrow-up-right
    2019-01-01arrow-up-right
    2019-01-01arrow-up-right
    2019-01-01arrow-up-right
    2019-01-01arrow-up-right
    2018-12-30arrow-up-right
    2018-12-28arrow-up-right
    2018-12-28arrow-up-right
    2018-12-26arrow-up-right
    2018-12-26arrow-up-right
    2018-12-26arrow-up-right
    2018-12-25arrow-up-right
    2018-12-25arrow-up-right
    2018-12-25arrow-up-right
    2018-12-22arrow-up-right
    2018-12-22arrow-up-right
    2018-12-22arrow-up-right
    2018-12-20arrow-up-right
    2018-12-19arrow-up-right
    2018-12-19arrow-up-right
    2018-12-19arrow-up-right
    2018-12-19arrow-up-right
    2018-12-19arrow-up-right
    2018-12-17arrow-up-right
    2018-12-16arrow-up-right
    2018-12-15arrow-up-right
    2018-12-15arrow-up-right
    2018-12-15arrow-up-right
    2018-12-14arrow-up-right
    2018-12-14arrow-up-right
    2018-12-14arrow-up-right
    2018-12-14arrow-up-right
    2018-12-14arrow-up-right
    2018-12-13arrow-up-right
    2018-12-13arrow-up-right
    2018-12-13arrow-up-right
    2018-12-12arrow-up-right
    2018-12-12arrow-up-right
    2018-12-12arrow-up-right
    2018-12-12arrow-up-right
    2018-12-12arrow-up-right
    2018-12-12arrow-up-right
    2018-12-11arrow-up-right
    2018-12-11arrow-up-right
    2018-12-11arrow-up-right
    2018-12-11arrow-up-right
    2018-12-11arrow-up-right
    2018-12-11arrow-up-right
    2018-12-11arrow-up-right
    2018-12-11arrow-up-right
    2018-12-11arrow-up-right
    2018-12-11arrow-up-right
    2018-12-11arrow-up-right
    2018-12-10arrow-up-right
    2018-12-10arrow-up-right
    2018-12-10arrow-up-right
    2018-12-10arrow-up-right
    2018-12-10arrow-up-right
    2018-12-10arrow-up-right
    2018-12-10arrow-up-right
    2018-12-09arrow-up-right
    2018-12-09arrow-up-right
    2018-12-09arrow-up-right
    2018-12-09arrow-up-right
    2018-12-08arrow-up-right
    2018-12-08arrow-up-right
    2018-12-07arrow-up-right
    2018-12-06arrow-up-right
    2018-12-06arrow-up-right
    2018-12-06arrow-up-right
    2018-12-06arrow-up-right
    2018-12-06arrow-up-right
    2018-12-06arrow-up-right
    2018-12-05arrow-up-right
    2018-12-05arrow-up-right
    2018-12-05arrow-up-right
    2018-12-05arrow-up-right
    2018-12-03arrow-up-right
    2018-12-03arrow-up-right
    2018-12-03arrow-up-right
    2018-12-03arrow-up-right
    2018-12-02arrow-up-right
    2018-12-02arrow-up-right
    2018-12-02arrow-up-right
    2018-12-02arrow-up-right
    2018-12-02arrow-up-right
    2018-12-02arrow-up-right
    2018-12-01arrow-up-right
    2018-12-01arrow-up-right
    2018-12-01arrow-up-right
    2018-12-01arrow-up-right
    2018-12-01arrow-up-right
    2018-12-01arrow-up-right
    2018-12-01arrow-up-right
    2018-11-30arrow-up-right
    2018-11-30arrow-up-right
    2018-11-30arrow-up-right
    2018-11-30arrow-up-right
    2018-11-30arrow-up-right
    2018-11-30arrow-up-right
    2018-11-30arrow-up-right
    2018-11-29arrow-up-right
    2018-11-29arrow-up-right
    2018-11-28arrow-up-right
    2018-11-28arrow-up-right
    2018-11-28arrow-up-right
    2018-11-28arrow-up-right
    2018-11-28arrow-up-right
    2018-11-28arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-27arrow-up-right
    2018-11-26arrow-up-right
    2018-11-26arrow-up-right
    2018-11-26arrow-up-right
    2018-11-25arrow-up-right
    2018-11-25arrow-up-right
    2018-11-25arrow-up-right
    2018-11-25arrow-up-right
    2018-11-24arrow-up-right
    2018-11-24arrow-up-right
    2018-11-24arrow-up-right
    2018-11-24arrow-up-right
    2018-11-23arrow-up-right
    2018-11-23arrow-up-right
    2018-11-23arrow-up-right
    2018-11-23arrow-up-right
    2018-11-23arrow-up-right
    2018-11-23arrow-up-right
    2018-11-21arrow-up-right
    2018-11-21arrow-up-right
    2018-11-20arrow-up-right
    2018-11-19arrow-up-right
    2018-11-19arrow-up-right
    2018-11-19arrow-up-right
    2018-11-19arrow-up-right
    2018-11-19arrow-up-right
    2018-11-19arrow-up-right
    2018-11-19arrow-up-right
    2018-11-19arrow-up-right
    2018-11-19arrow-up-right
    2018-11-14arrow-up-right
    2018-11-12arrow-up-right
    2018-11-12arrow-up-right
    2018-11-09arrow-up-right
    2018-11-09arrow-up-right
    2018-11-09arrow-up-right
    2018-11-09arrow-up-right
    2018-11-08arrow-up-right
    2018-11-07arrow-up-right
    2018-11-07arrow-up-right
    2018-11-07arrow-up-right
    2018-11-07arrow-up-right
    2018-11-03arrow-up-right
    2018-11-03arrow-up-right
    2018-11-03arrow-up-right
    2018-11-01arrow-up-right
    2018-11-01arrow-up-right
    2018-11-01arrow-up-right
    2018-10-31arrow-up-right
    2018-10-31arrow-up-right
    2018-10-31arrow-up-right
    2018-10-31arrow-up-right
    2018-10-31arrow-up-right
    2018-10-31arrow-up-right
    2018-10-31arrow-up-right
    2018-10-30arrow-up-right
    2018-10-29arrow-up-right
    2018-10-29arrow-up-right
    2018-10-27arrow-up-right
    2018-10-27arrow-up-right
    2018-10-27arrow-up-right
    2018-10-27arrow-up-right
    2018-10-25arrow-up-right
    2018-10-25arrow-up-right
    2018-10-25arrow-up-right
    2018-10-24arrow-up-right
    2018-10-23arrow-up-right
    2018-10-23arrow-up-right
    2018-10-22arrow-up-right
    2018-10-22arrow-up-right
    2018-10-22arrow-up-right
    2018-10-22arrow-up-right
    2018-10-22arrow-up-right
    2018-10-22arrow-up-right
    2018-10-22arrow-up-right
    2018-10-21arrow-up-right
    2018-10-21arrow-up-right
    2018-10-21arrow-up-right
    2018-10-21arrow-up-right
    2018-10-21arrow-up-right
    2018-10-21arrow-up-right
    2018-10-20arrow-up-right
    2018-10-18arrow-up-right
    2018-10-18arrow-up-right
    2018-10-18arrow-up-right
    2018-10-18arrow-up-right
    2018-10-17arrow-up-right
    2018-10-17arrow-up-right
    2018-10-17arrow-up-right
    2018-10-16arrow-up-right
    2018-10-16arrow-up-right
    2018-10-16arrow-up-right
    2018-10-16arrow-up-right
    2025-05-13arrow-up-right
    2025-05-13arrow-up-right
    2025-05-13arrow-up-right
    2025-05-12arrow-up-right
    2024-09-28arrow-up-right
    2024-08-23arrow-up-right
    2024-08-12arrow-up-right
    2024-06-06arrow-up-right
    2024-06-05arrow-up-right
    2024-04-20arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-03-18arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-23arrow-up-right
    2024-02-22arrow-up-right
    2024-02-18arrow-up-right
    2024-02-10arrow-up-right
    2024-02-07arrow-up-right
    2024-02-04arrow-up-right
    2024-02-02arrow-up-right
    2024-02-02arrow-up-right
    2024-02-02arrow-up-right
    2024-02-01arrow-up-right
    2023-12-13arrow-up-right
    2023-10-01arrow-up-right
    2023-08-11arrow-up-right
    2023-08-11arrow-up-right
    2023-08-06arrow-up-right
    2023-08-05arrow-up-right
    2023-08-04arrow-up-right
    2023-07-30arrow-up-right
    2023-06-23arrow-up-right
    2023-06-21arrow-up-right
    2023-06-21arrow-up-right
    2023-06-21arrow-up-right
    2023-06-16arrow-up-right
    2023-06-16arrow-up-right
    2023-06-16arrow-up-right
    2023-06-16arrow-up-right
    2023-06-16arrow-up-right
    2023-06-11arrow-up-right
    2023-04-19arrow-up-right
    2023-04-17arrow-up-right
    2023-04-08arrow-up-right
    2023-03-23arrow-up-right
    2023-02-05arrow-up-right
    2023-01-28arrow-up-right
    2023-01-24arrow-up-right
    2023-01-23arrow-up-right
    2023-01-17arrow-up-right
    2023-01-14arrow-up-right
    2023-01-10arrow-up-right
    2022-11-24arrow-up-right
    2022-11-21arrow-up-right
    2022-11-21arrow-up-right
    2022-11-20arrow-up-right
    2022-10-31arrow-up-right
    2022-09-15arrow-up-right
    2022-08-28arrow-up-right
    2022-07-04arrow-up-right
    2022-04-06arrow-up-right
    2022-04-05arrow-up-right
    2022-03-30arrow-up-right
    2022-02-12arrow-up-right
    2022-01-02arrow-up-right
    2022-01-02arrow-up-right
    2021-12-12arrow-up-right
    2021-12-12arrow-up-right
    2021-11-21arrow-up-right
    2021-10-21arrow-up-right
    2021-10-17arrow-up-right
    2021-03-12arrow-up-right
    2021-02-21arrow-up-right
    2021-02-20arrow-up-right
    2020-12-29arrow-up-right
    2020-10-08arrow-up-right
    2020-10-08arrow-up-right
    2020-09-28arrow-up-right
    2020-07-12arrow-up-right
    2020-07-06arrow-up-right
    2020-05-18arrow-up-right
    2020-05-18arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-10-15arrow-up-right
    2019-02-04arrow-up-right
    2019-02-04arrow-up-right
    2018-12-19arrow-up-right
    2018-12-14arrow-up-right
    2018-12-12arrow-up-right
    2018-12-06arrow-up-right
    2018-11-25arrow-up-right
    2018-11-23arrow-up-right
    2018-11-19arrow-up-right
    2018-11-19arrow-up-right