diff options
Diffstat (limited to 'odin/strm/download_youtube')
| -rw-r--r-- | odin/strm/download_youtube | 54 |
1 files changed, 24 insertions, 30 deletions
diff --git a/odin/strm/download_youtube b/odin/strm/download_youtube index 1d729fee..357988d4 100644 --- a/odin/strm/download_youtube +++ b/odin/strm/download_youtube | |||
| @@ -17,21 +17,13 @@ function notmuch { | |||
| 17 | done | 17 | done |
| 18 | } | 18 | } |
| 19 | 19 | ||
| 20 | logTag=${0:t} | ||
| 21 | |||
| 22 | exec 1> >(logger -t "$logTag" -p news.notice) | ||
| 23 | exec 2> >(logger -t "$logTag" -p news.error) | ||
| 24 | |||
| 25 | debug() { logger -t "$logTag" -p news.debug } | ||
| 26 | warn() { logger -t "$logTag" -p news.warn } | ||
| 27 | |||
| 28 | typeset -a cleanupCmds | 20 | typeset -a cleanupCmds |
| 29 | cleanupCmds=() | 21 | cleanupCmds=() |
| 30 | 22 | ||
| 31 | function doCleanup { | 23 | function doCleanup { |
| 32 | for cmd (${cleanupCmds}); do | 24 | for cmd (${cleanupCmds}); do |
| 33 | # print -- ${cmd} | debug | 25 | # print -- ${cmd} |
| 34 | eval $cmd | debug | 26 | eval $cmd |
| 35 | done | 27 | done |
| 36 | } | 28 | } |
| 37 | 29 | ||
| @@ -74,13 +66,13 @@ printf ">>> %s <<<\n %s\n" "${msgId}" "${message}" | |||
| 74 | msgTags=($(notmuch search --output=tags $msgId )) | 66 | msgTags=($(notmuch search --output=tags $msgId )) |
| 75 | 67 | ||
| 76 | if [[ ${msgTags[(i)cached]} -le $#msgTags ]]; then | 68 | if [[ ${msgTags[(i)cached]} -le $#msgTags ]]; then |
| 77 | print "Message in Cache" | warn | 69 | print "Message in Cache" >&2 |
| 78 | exit 0 | 70 | exit 0 |
| 79 | fi | 71 | fi |
| 80 | 72 | ||
| 81 | if [[ 'base64' == $(sed '/^Content-Transfer-Encoding: */!d; s///;q' ${message}) ]]; then | 73 | if [[ 'base64' == $(sed '/^Content-Transfer-Encoding: */!d; s///;q' ${message}) ]]; then |
| 82 | tmpFile=$(mktemp --tmpdir=/home/gkleen/rss/tmp .writeOut.XXXXXX) | 74 | tmpFile=$(mktemp --tmpdir=/home/gkleen/rss/tmp .writeOut.XXXXXX) |
| 83 | printf "Decoding base64 message content for ‘%s’" ${message} | debug | 75 | printf "Decoding base64 message content for ‘%s’" ${message} |
| 84 | sed '/^Content-Transfer-Encoding: */d; /^$/q' ${message} >! $tmpFile | 76 | sed '/^Content-Transfer-Encoding: */d; /^$/q' ${message} >! $tmpFile |
| 85 | sed '1,/^$/d' ${message} | base64 -d >> $tmpFile | 77 | sed '1,/^$/d' ${message} | base64 -d >> $tmpFile |
| 86 | mv -v $tmpFile ${message} | 78 | mv -v $tmpFile ${message} |
| @@ -96,10 +88,10 @@ printf ">>> %s <<<\n %s\n" "${msgId}" "${message}" | |||
| 96 | sld=$(cut -d '/' -f 3 <<<${url} | rev | cut -d '.' -f 1-2 | rev) | 88 | sld=$(cut -d '/' -f 3 <<<${url} | rev | cut -d '.' -f 1-2 | rev) |
| 97 | 89 | ||
| 98 | if [[ -e ${HOME}/.dl-backup ]] && grep -q ${sld} ${HOME}/.dl-backup; then | 90 | if [[ -e ${HOME}/.dl-backup ]] && grep -q ${sld} ${HOME}/.dl-backup; then |
| 99 | printf "Was told to back up off %s\n" ${sld} | warn | 91 | printf "Was told to back up off %s\n" ${sld} >&2 |
| 100 | exit 0 | 92 | exit 0 |
| 101 | else | 93 | else |
| 102 | printf "Proceeding on %s\n" ${sld} | debug | 94 | printf "Proceeding on %s\n" ${sld} |
| 103 | fi | 95 | fi |
| 104 | 96 | ||
| 105 | dir="/srv/media/youtube" | 97 | dir="/srv/media/youtube" |
| @@ -144,15 +136,15 @@ printf ">>> %s <<<\n %s\n" "${msgId}" "${message}" | |||
| 144 | printf "%s\n%s via %s: %s\nExpecting ‘%s’\n" ${title} ${videoId} ${extractor} ${format} ${filename:t} | 136 | printf "%s\n%s via %s: %s\nExpecting ‘%s’\n" ${title} ${videoId} ${extractor} ${format} ${filename:t} |
| 145 | 137 | ||
| 146 | if [[ -n ${extractor} && -n ${videoId} ]]; then | 138 | if [[ -n ${extractor} && -n ${videoId} ]]; then |
| 147 | printf "Searching for %s on %s in cache...\n" ${videoId} ${extractor} | debug | 139 | printf "Searching for %s on %s in cache...\n" ${videoId} ${extractor} |
| 148 | 140 | ||
| 149 | typeset -a messages | 141 | typeset -a messages |
| 150 | messages=($(notmuch search --output=messages -- from:${extractor} and ${videoId} and is:cached)) | 142 | messages=($(notmuch search --output=messages -- from:${extractor} and ${videoId} and is:cached)) |
| 151 | 143 | ||
| 152 | if [[ ${#messages} -ne 0 ]]; then | 144 | if [[ ${#messages} -ne 0 ]]; then |
| 153 | printf "Video already cached: %s\n" "${messages[*]}" | warn | 145 | printf "Video already cached: %s\n" "${messages[*]}" >&2 |
| 154 | else | 146 | else |
| 155 | printf "Video not yet cached\n" | debug | 147 | printf "Video not yet cached\n" |
| 156 | fi | 148 | fi |
| 157 | fi | 149 | fi |
| 158 | 150 | ||
| @@ -175,7 +167,7 @@ printf ">>> %s <<<\n %s\n" "${msgId}" "${message}" | |||
| 175 | done | 167 | done |
| 176 | fi | 168 | fi |
| 177 | 169 | ||
| 178 | [[ -n ${filename} ]] && printf "Found ‘%s’\n" ${filename:t} || debug | 170 | [[ -n ${filename} ]] && printf "Found ‘%s’\n" ${filename:t} |
| 179 | 171 | ||
| 180 | # newFilename=${filename:h}/$(mungefilename ${filename:t}) | 172 | # newFilename=${filename:h}/$(mungefilename ${filename:t}) |
| 181 | # if [[ "${filename}" != "${newFilename}" ]]; then | 173 | # if [[ "${filename}" != "${newFilename}" ]]; then |
| @@ -199,17 +191,19 @@ printf ">>> %s <<<\n %s\n" "${msgId}" "${message}" | |||
| 199 | extensions=("mp4") | 191 | extensions=("mp4") |
| 200 | fi | 192 | fi |
| 201 | 193 | ||
| 202 | if [[ "${bare_amp}" -ne 0 || ${extensions[(i)${filename:e}]} -gt ${#extensions} ]]; then | 194 | typeset -a transcodeExtractors |
| 203 | printf "Transcoding ‘%s’" ${title} | debug | 195 | transcodeExtractors=("twitch -vod") |
| 196 | |||
| 197 | if [[ "${bare_amp}" -ne 0 || ${extensions[(i)${filename:e}]} -gt ${#extensions} || ${transcodeExtractors[(i)${extractor}]} -le ${#transcodeExtractors} ]]; then | ||
| 198 | printf "Transcoding ‘%s’" ${title} | ||
| 204 | printf "%d %d %d/%d(%d)…\n" \ | 199 | printf "%d %d %d/%d(%d)…\n" \ |
| 205 | $([[ $($alwaysTranscode; print $?) -eq 0 ]]; print $?) \ | 200 | $([[ $($alwaysTranscode; print $?) -eq 0 ]]; print $?) \ |
| 206 | $([[ "${bare_amp}" -ne 0 ]]; print $?) \ | 201 | $([[ "${bare_amp}" -ne 0 ]]; print $?) \ |
| 207 | ${extensions[(i)${filename:e}]} ${#extensions} \ | 202 | ${extensions[(i)${filename:e}]} ${#extensions} \ |
| 208 | $([[ ${extensions[(i)${filename:e}]} -gt ${#extensions} ]]; print $?) \ | 203 | $([[ ${extensions[(i)${filename:e}]} -gt ${#extensions} ]]; print $?) |
| 209 | | debug | ||
| 210 | tempfile=$(mktemp --tmpdir=${filename:h} .transcode.${filename:t:r}.$$.XXXXXX.${filename:e}) | 204 | tempfile=$(mktemp --tmpdir=${filename:h} .transcode.${filename:t:r}.$$.XXXXXX.${filename:e}) |
| 211 | cleanup rm -v -- "${tempfile}" | 205 | cleanup rm -v -- "${tempfile}" |
| 212 | mv -vf "${filename}" "${tempfile}" | debug | 206 | mv -vf "${filename}" "${tempfile}" |
| 213 | 207 | ||
| 214 | typeset -A fileInfo | 208 | typeset -A fileInfo |
| 215 | for line ($(@ffmpeg@/bin/ffprobe -v error -show_format -show_streams -show_entries stream=codec_name,codec_type:format=:stream_tags=:stream_disposition=:format_tags= -of flat=h=0 -- ${tempfile})); do | 209 | for line ($(@ffmpeg@/bin/ffprobe -v error -show_format -show_streams -show_entries stream=codec_name,codec_type:format=:stream_tags=:stream_disposition=:format_tags= -of flat=h=0 -- ${tempfile})); do |
| @@ -234,7 +228,7 @@ printf ">>> %s <<<\n %s\n" "${msgId}" "${message}" | |||
| 234 | local cType=${fileInfo[${formatKey}]} | 228 | local cType=${fileInfo[${formatKey}]} |
| 235 | local cName=${fileInfo[stream.${i}.codec_name]} | 229 | local cName=${fileInfo[stream.${i}.codec_name]} |
| 236 | 230 | ||
| 237 | printf "Stream %d: %s (%s)\n" ${i} ${cName} ${cType} | debug | 231 | printf "Stream %d: %s (%s)\n" ${i} ${cName} ${cType} |
| 238 | 232 | ||
| 239 | if [[ ${cType} == "video" ]]; then | 233 | if [[ ${cType} == "video" ]]; then |
| 240 | if [[ ${ext} == "mkv" ]]; then | 234 | if [[ ${ext} == "mkv" ]]; then |
| @@ -289,22 +283,22 @@ printf ">>> %s <<<\n %s\n" "${msgId}" "${message}" | |||
| 289 | cleanup rm -rfv -- ${PWD} | 283 | cleanup rm -rfv -- ${PWD} |
| 290 | 284 | ||
| 291 | p1args+=(-an -f matroska) | 285 | p1args+=(-an -f matroska) |
| 292 | print -- ${prePass} ${p1args} | debug | 286 | print -- ${prePass} ${p1args} |
| 293 | ffmpeg ${args} ${prePass} ${p1args} -- /dev/null | 287 | ffmpeg ${args} ${prePass} ${p1args} -- /dev/null |
| 294 | 288 | ||
| 295 | print -- ${cargs} ${p2args} | debug | 289 | print -- ${cargs} ${p2args} |
| 296 | ffmpeg ${args} ${cargs} ${p2args} -- "${filename}" | 290 | ffmpeg ${args} ${cargs} ${p2args} -- "${filename}" |
| 297 | 291 | ||
| 298 | cd ${oldPwd} | 292 | cd ${oldPwd} |
| 299 | else | 293 | else |
| 300 | args+=(-v warning -i pipe:0) | 294 | args+=(-v warning -i pipe:0) |
| 301 | 295 | ||
| 302 | print -- ${cargs} ${p2args} | debug | 296 | print -- ${cargs} ${p2args} |
| 303 | pv -N "$(trimName "trans:" ${title})" ${tempfile} | ffmpeg ${args} ${cargs} ${p2args} -- "${filename}" | 297 | pv -N "$(trimName "trans:" ${title})" ${tempfile} | ffmpeg ${args} ${cargs} ${p2args} -- "${filename}" |
| 304 | fi | 298 | fi |
| 305 | fi | 299 | fi |
| 306 | 300 | ||
| 307 | chmod -v 644 "${filename}" | debug | 301 | chmod -v 644 "${filename}" |
| 308 | tmpFile=$(mktemp --tmpdir=/home/gkleen/rss/tmp .insertUrl.$$.XXXXXX) | 302 | tmpFile=$(mktemp --tmpdir=/home/gkleen/rss/tmp .insertUrl.$$.XXXXXX) |
| 309 | relUrl=$(realpath --relative-to=/srv/media ${filename}) | 303 | relUrl=$(realpath --relative-to=/srv/media ${filename}) |
| 310 | typeset -a relUrlComponents | 304 | typeset -a relUrlComponents |
| @@ -315,7 +309,7 @@ printf ">>> %s <<<\n %s\n" "${msgId}" "${message}" | |||
| 315 | relUrl+=$(sed -f ${HOME}/url_escape.sed <<<${urlPiece}) | 309 | relUrl+=$(sed -f ${HOME}/url_escape.sed <<<${urlPiece}) |
| 316 | done | 310 | done |
| 317 | awk -v "link=http://odin.asgard.yggdrasil/${relUrl}" '{ if (r == 0) { r = gsub("href=\"[^\"]+\"", "href=\"" link "\""); }; print; }' "${message}" >! $tmpFile | 311 | awk -v "link=http://odin.asgard.yggdrasil/${relUrl}" '{ if (r == 0) { r = gsub("href=\"[^\"]+\"", "href=\"" link "\""); }; print; }' "${message}" >! $tmpFile |
| 318 | mv -v $tmpFile $message | debug | 312 | mv -v $tmpFile $message |
| 319 | notmuch tag '+cached' -- $msgId && printf "Tagged ‘%s’ as 'cached'" ${msgId} | 313 | notmuch tag '+cached' -- $msgId && printf "Tagged ‘%s’ as 'cached'" ${msgId} |
| 320 | 314 | ||
| 321 | if [[ -n "$(notmuch search "tag:inbox AND $msgId")" ]]; then | 315 | if [[ -n "$(notmuch search "tag:inbox AND $msgId")" ]]; then |
| @@ -328,7 +322,7 @@ printf ">>> %s <<<\n %s\n" "${msgId}" "${message}" | |||
| 328 | fi | 322 | fi |
| 329 | systemctl --no-block start uucico@hel.service | 323 | systemctl --no-block start uucico@hel.service |
| 330 | else | 324 | else |
| 331 | print "Message vanished from inbox" | warn | 325 | print "Message vanished from inbox" >&2 |
| 332 | fi | 326 | fi |
| 333 | else | 327 | else |
| 334 | printf "An error occured while downloading video at ‘%s’ (exitcode: %d)\n" ${url} ${ytResult} >&2 | 328 | printf "An error occured while downloading video at ‘%s’ (exitcode: %d)\n" ${url} ${ytResult} >&2 |
