🎬 ArteTV downloader
💡 What is it ?
This is a toy/research project whose primary goal is to familiarize with some of the technologies involved in multi-lingual video streaming. Using this program may violate usage policy of ArteTV website and we do not recommend using it for other purpose then studying the code.
ArteTV is a is a European public service channel dedicated to culture. Programmes are usually available with multiple audio and subtitles languages.
🚀 Quick start
Install FFMPEG binaries and ensure it is in your
$ ffmpeg -version ffmpeg version N-109344-g1bebcd43e1-20221202 Copyright (c) 2000-2022 the FFmpeg developers built with gcc 12.2.0 (crosstool-NG 188.8.131.52_cf9beb1)
Clone this repository
$ git clone https://git.afpy.org/fcode/delarte.git $ cd delarte
Optionally create a virtual environnement
$ python3 -m venv .venv $ source .venv/Scripts/activate
Install in edit mode
$ pip install -e .
Or install in edit mode with
dev dependencies if you intend to contribute.
$ pip install -e .[dev]
Now you can run the script
$ python3 -m delarte --help or $ delarte --help delarte - ArteTV downloader. Usage: delarte (-h | --help) delarte --version delarte [options] URL delarte [options] URL RENDITION delarte [options] URL RENDITION VARIANT Download a video from ArteTV streaming service. Omit RENDITION and/or VARIANT to print the list of available values. Arguments: URL the URL from ArteTV website RENDITION the rendition code [audio/subtitles language combination] VARIANT the variant code [video quality version] Options: -h --help print this message --version print current version of the program --debug on error, print debugging information --name-use-id use the program ID --name-use-slug use the URL slug --name-sep=<sep> field separator [default: - ] --name-seq-pfx=<pfx> sequence counter prefix [default: - ] --name-seq-no-pad disable sequence zero-padding --name-add-rendition add rendition code --name-add-variant add variant code
🔧 How it works
🏗️ The streaming infrastructure
We support both single program pages and program collection pages. Every page is shipped with some embedded JSON data (we do not keep samples as the structure seems to change regularly). From that we extract metadata for each programs. In particular, we extract a site language and a program ID. These enables us to query the config API
The config API
This API returns a
ConfigPlayer JSON object, a sample of which can be found here. A list of available audio/subtitles combinations in
$.data.attributes.streams. In our code such a combination is referred to as a rendition. Every such rendition has a reference to a program index file in
The program index file
- exactly one video track index reference
- exactly one audio track index reference
- at most one subtitles track index reference
Audio and subtitles tracks reference also include:
- a two-letter
languagecode attribute (
mulis used for audio multiple language)
- a free form
nameattribute that is used to detect an audio original version
- a coded
characteristicsthat is used to detect accessibility tracks (audio or textual description)
The video and audio track index file
The subtitles track index file
- Fetch program sources form the page pointed by the given URL
- Fetch rendition sources from config API
- Filter renditions
- Fetch variant sources from HLS program index files.
- Filter variants
- Fetch final target information and figure out output naming
- Download data streams (convert VTT subtitles to formatted SRT subtitles) and mux them with FFMPEG
Why not use FFMPEG directly with the HLS program index URL ?
So we can be more granular about renditions and variants that we want.
Why not use
VTT subtitles directly ?
Because FFMPEG do not support styles in WebVTT 😒.
Why not use FFMPEG directly with the track index URLs and let it do the download ?
Because some programs would randomly fail 😒. Probably due to invalid segmentation on the server.
For sure ! The more the merrier.