Barbagus
56c1e8468a
Significant rewrite after model modification: introducing `*Sources` objects that encapsulate metadata and fetch information (urls, protocols). The API (#20) is organized as pipe elements with sources being what flows through the pipe. 1. fetch program sources 2. fetch rendition sources 3. fetch variant sources 4. fetch targets 5. process (download+mux) targets Some user selection filter or modifiers could then be applied at any step of the pipe. Our __main__.py is an implementation of that scheme. Implied modifications include: - Later failure on unsupported protocols, used to be in `api`, now in `hls`. This offers the possibility to filter and/or support them later. - Give up honoring the http ranges for mp4 download, stream-download them by fixed chunk instead. - Cleaning up of the `hls` module moving the main download function to __init__ and specific (mp4/vtt) download functions to a new `download` module. On the side modifications include: - The progress handler showing downloading rates. - The naming utilities providing rendition and variant code insertion. - Download parts to working directories and skip unnecessary re-downloads on failure. This was a big change for a single commit... too big of a change maybe.
75 lines
2.2 KiB
Python
75 lines
2.2 KiB
Python
# License: GNU AGPL v3: http://www.gnu.org/licenses/
|
|
# This file is part of `delarte` (https://git.afpy.org/fcode/delarte.git)
|
|
|
|
"""Provide target muxing utilities."""
|
|
|
|
import subprocess
|
|
|
|
|
|
def mux_target(target, _progress):
|
|
"""Multiplexes target into a single file."""
|
|
cmd = ["ffmpeg", "-hide_banner"]
|
|
|
|
# inputs
|
|
cmd.extend(["-i", target.video_input.url])
|
|
cmd.extend(["-i", target.audio_input.url])
|
|
if target.subtitles_input:
|
|
cmd.extend(["-i", target.subtitles_input.url])
|
|
|
|
# codecs
|
|
cmd.extend(["-c:v", "copy"])
|
|
cmd.extend(["-c:a", "copy"])
|
|
if target.subtitles_input:
|
|
cmd.extend(["-c:s", "copy"])
|
|
|
|
cmd.extend(["-bsf:a", "aac_adtstoasc"])
|
|
|
|
# stream metadata & disposition
|
|
# cmd.extend(["-metadata:s:v:0", f"name={target.video.name!r}"])
|
|
# cmd.extend(["-metadata:s:v:0", f"language={target.video.language!r}"])
|
|
|
|
cmd.extend(["-metadata:s:a:0", f"name={target.audio_input.track.name}"])
|
|
cmd.extend(["-metadata:s:a:0", f"language={target.audio_input.track.language}"])
|
|
|
|
a_disposition = "default"
|
|
if target.audio_input.track.original:
|
|
a_disposition += "+original"
|
|
else:
|
|
a_disposition += "-original"
|
|
|
|
if target.audio_input.track.visual_impaired:
|
|
a_disposition += "+visual_impaired"
|
|
else:
|
|
a_disposition += "-visual_impaired"
|
|
|
|
cmd.extend(["-disposition:a:0", a_disposition])
|
|
|
|
if target.subtitles_input:
|
|
cmd.extend(["-metadata:s:s:0", f"name={target.subtitles_input.track.name}"])
|
|
cmd.extend(
|
|
["-metadata:s:s:0", f"language={target.subtitles_input.track.language}"]
|
|
)
|
|
|
|
s_disposition = "default"
|
|
|
|
if target.subtitles_input.track.hearing_impaired:
|
|
s_disposition += "+hearing_impaired+descriptions"
|
|
else:
|
|
s_disposition += "-hearing_impaired-descriptions"
|
|
|
|
cmd.extend(["-disposition:s:0", s_disposition])
|
|
|
|
# file metadata
|
|
if isinstance(target.title, tuple):
|
|
cmd.extend(["-metadata", f"title={target.title[0]}"])
|
|
cmd.extend(["-metadata", f"subtitle={target.title[1]}"])
|
|
else:
|
|
cmd.extend(["-metadata", f"title={target.title}"])
|
|
|
|
# output
|
|
cmd.append(f"{target.output}.mkv")
|
|
|
|
print(cmd)
|
|
|
|
subprocess.run(cmd)
|