11#! /usr/bin/env bash
2- set -e
2+ set -e -o pipefail
33
44CONFIG_DIR=" /media/downloader/config"
55FAIL_DIR=" /media/downloader/fail"
6- LOCK_FILE=" /run/lock /$( basename " $0 " ) .lock"
6+ LOCK_FILE=" /dev/shm /$( basename " $0 " ) .lock"
77NEW_DOWNLOAD=false
88OUTPUT_DIR=" /media/downloader/output"
99WORKDIR=" /media/workdir"
1010
1111# Aquire lock
1212if [ -e " $LOCK_FILE " ]; then
13- echo " Error: $( basename " $0 " ) is already running. Exiting. "
14- exit 1
13+ echo " Error: Already running." >&2
14+ exit 11
1515fi
1616touch " $LOCK_FILE "
1717
18+ function cleanup {
19+ rm " $LOCK_FILE "
20+ }
21+ trap cleanup EXIT
22+
1823echo " Start downloader"
1924
2025mapfile -t DOWNLOADER_ITEMS_FILE < /media/downloader/downloader-list.txt
2126mapfile -t DOWNLOADER_ITEMS_ENVIRONMENT_VARIABLE \
2227 < /media/downloader/downloader-list-from-environment-variable.txt
2328DOWNLOADER_ITEMS=(" ${DOWNLOADER_ITEMS_ENVIRONMENT_VARIABLE[@]} " " ${DOWNLOADER_ITEMS_FILE[@]} " )
2429
30+ AUDIO_DEFAULT_ARGUMENTS=(--extract-audio --audio-format " opus" --format " bestaudio/best" \
31+ --format-sort " acodec:opus,acodec:mp3,acodec:aac" )
2532VIDEO_DEFAULT_ARGUMENTS=(--format " bestvideo[language=?deu]+(bestaudio[language~=?'deu?'],\
2633bestaudio[language~=?'deu?'][format_note*=Audiodeskription],bestaudio[language~='eng?'])/best" \
2734 --format-sort " res,vcodec:av01,acodec:opus,vcodec:vp9,vcodec:h264" \
@@ -44,11 +51,12 @@ for ITEM in "${DOWNLOADER_ITEMS[@]}"; do
4451 YT_DLP_ARGUMENTS=()
4552 if [[ " $TYPE " == movie ]]; then
4653 YT_DLP_ARGUMENTS=(" ${VIDEO_DEFAULT_ARGUMENTS[@]} " --output \
47- " ${WORKDIR} /%(title)s (%(release_date>%Y,upload_date>%Y)s) [%(language).2s].%(ext)s" )
54+ " ${WORKDIR} /%(title)s (%(release_date>%Y,upload_date>%Y)s)\
55+ %(format_note& - {}|)s [%(language).2s].%(ext)s" )
4856 elif [[ " $TYPE " == music ]]; then
4957 RUN_FILENAME_SANITIZE=true
5058 RUN_FILEORGANIZER=true
51- YT_DLP_ARGUMENTS=(--extract-audio --audio-format " opus " \
59+ YT_DLP_ARGUMENTS=(" ${AUDIO_DEFAULT_ARGUMENTS[@]} " \
5260 --postprocessor-args " ThumbnailsConvertor+ffmpeg_o:-c:v \
5361 mjpeg -vf crop=\" 'if(gt(ih,iw),iw,ih)':'if(gt(iw,ih),ih,iw)'\" " \
5462 --output " ${WORKDIR} /%(creator).80s - %(title)s.%(ext)s" )
@@ -60,11 +68,15 @@ for ITEM in "${DOWNLOADER_ITEMS[@]}"; do
6068 YT_DLP_ARGUMENTS=(" ${VIDEO_DEFAULT_ARGUMENTS[@]} " --output \
6169 " ${WORKDIR} /%(release_date>%Y.%m.%d,upload_date>%Y.%m.%d)s \
6270%(playlist_title,channel)s - %(title)s \\ [%(language).2s\\ ].%(ext)s" )
71+ elif [[ " $TYPE " == podcast ]]; then
72+ YT_DLP_ARGUMENTS=(" ${AUDIO_DEFAULT_ARGUMENTS[@]} " --output \
73+ " ${WORKDIR} /%(release_date>%Y.%m.%d,upload_date>%Y.%m.%d)s \
74+ %(series,playlist_title,channel)s%(title& - {}|)s [%(language).2s].%(ext)s" )
6375 elif [[ " $TYPE " == series ]]; then
6476 YT_DLP_ARGUMENTS=(" ${VIDEO_DEFAULT_ARGUMENTS[@]} " --output \
65- " ${WORKDIR} /%(series,playlist_title)s S%(season_number|XX)02dE \
66- %(episode_number,playlist_index|XX)02d%(title& |)s%(title|)s (%(release_date>%Y,upload_date>%Y)s) [ \
67- %(language).2s].%(ext)s" )
77+ " ${WORKDIR} /%(series,playlist_title,channel )s S%(season_number|XX)02d \
78+ E %(episode_number,playlist_index|XX)02d%(title& {} |)s (%(release_date>%Y,upload_date>%Y)s)\
79+ %(format_note& - {}|)s [%( language).2s].%(ext)s" )
6880 else
6981 echo " Type \" ${TYPE} \" not supported."
7082 continue
@@ -122,10 +134,7 @@ tok.*)\)//gi" \
122134 done
123135done
124136
125- POST_EXECUTION_COMMAND=" $( cat /tmp/ post-execution-command) "
137+ POST_EXECUTION_COMMAND=" $( cat /dev/shm/downloader- post-execution-command) "
126138if [[ " $NEW_DOWNLOAD " == true ]] && [[ -n " $POST_EXECUTION_COMMAND " ]]; then
127139 eval " $POST_EXECUTION_COMMAND "
128140fi
129-
130- # Release lock
131- rm " $LOCK_FILE "
0 commit comments