Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dosbox-staging/dosbox-staging.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkcgen <kcgen@users.noreply.github.com>2022-10-26 04:26:27 +0300
committerkcgen <1557255+kcgen@users.noreply.github.com>2022-10-27 03:25:22 +0300
commitbe76ed366ffec860ede73cc612d9964c0d4bc6b7 (patch)
tree826f525d954e58e0afa7e8261ea03dd7b9adb856
parentc8a04435cc4b8faed55833f64684d8a67f9d5570 (diff)
Split contributed CD-DA scripts into fetch vs. cue functions
This avoids duplicating the CUE generating portion among the playlist and chapter fetching scripts. It also improves the CUE generation to handle content that exceeds a single Redbook CD-DA (it generates multiple CUEs).
-rwxr-xr-xcontrib/scripts/chapters-to-tracks.sh91
-rwxr-xr-xcontrib/scripts/playlist-to-tracks.sh88
-rwxr-xr-xcontrib/scripts/tracks-to-cues.sh176
-rwxr-xr-xcontrib/scripts/yt-chapters-to-cdda.sh143
4 files changed, 355 insertions, 143 deletions
diff --git a/contrib/scripts/chapters-to-tracks.sh b/contrib/scripts/chapters-to-tracks.sh
new file mode 100755
index 000000000..f1b84d0f2
--- /dev/null
+++ b/contrib/scripts/chapters-to-tracks.sh
@@ -0,0 +1,91 @@
+#!/usr/bin/env bash
+
+# SPDX-License-Identifier: GPL-2.0-or-later
+#
+# Copyright (C) 2022-2022 kcgen <kcgen@users.noreply.github.com>
+
+# Bash strict-mode
+set -euo pipefail
+IFS=$'\n\t'
+
+print_usage() {
+ local script="${0##*/}"
+ echo ""
+ echo "usage: $script URI [URI [...]]"
+ echo
+ echo "Convert a YouTube video with chapters into CD-DA tracks."
+ echo " - Multiple videos can be provided; each will be converted."
+ echo " - URIs can be the full https:// URL or just the identifier."
+ echo ""
+ echo "Depends on:"
+ echo " - yt-dlp (install with pip3 install yt-dlp)"
+ echo " - ffmpeg, and GNU find and sort: install with package manager"
+ echo ""
+}
+
+main() {
+ case ${1:--help} in
+ -h | -help | --help) print_usage ;;
+ *)
+ check-dependencies
+ convert-chapters-to-tracks "$@"
+ ;;
+ esac
+}
+
+check-dependencies() {
+ local missing_deps=0
+ for dep in yt-dlp ffmpeg find sort rm; do
+ if ! command -v "$dep" &>/dev/null; then
+ echo "Missing dependency: $dep could not be found in the PATH"
+ ((missing_deps++))
+ fi
+ done
+ # Were any missing?
+ if [[ $missing_deps -gt 0 ]]; then
+ echo "Install the above programs and try again"
+ exit 1
+ fi
+}
+
+download-chapters-from-uri() {
+ # YouTube Opus format identifiers in order of quality
+ local webm_formats="338/251/250/249"
+
+ # Directory/##-Track output layout
+ local cdda_ouput="chapter:%(title)s/%(section_number)02d-%(section_title)s.%(ext)s"
+
+ # Fetch the track and split it on chapters
+ yt-dlp \
+ --split-chapters \
+ --restrict-filenames \
+ --format "$webm_formats" \
+ --output "$cdda_ouput" \
+ "$uri" || true
+}
+
+extract-opus-from-webm() {
+ local opus="${webm%.webm}.opus"
+
+ ffmpeg \
+ -hide_banner \
+ -loglevel error \
+ -i "$webm" \
+ -vn -acodec copy "$opus"
+
+ # Delete the WebM source if we've got the Opus
+ if [[ -f $opus ]]; then
+ rm "$webm"
+ fi
+}
+
+convert-chapters-to-tracks() {
+ for uri in "$@"; do
+ download-chapters-from-uri
+ done
+ for webm in $(find . -maxdepth 2 -mindepth 2 -name '*.webm' | sort || true); do
+ extract-opus-from-webm
+ done
+}
+
+main "$@"
diff --git a/contrib/scripts/playlist-to-tracks.sh b/contrib/scripts/playlist-to-tracks.sh
new file mode 100755
index 000000000..48b71586a
--- /dev/null
+++ b/contrib/scripts/playlist-to-tracks.sh
@@ -0,0 +1,88 @@
+#!/usr/bin/env bash
+
+# SPDX-License-Identifier: GPL-2.0-or-later
+#
+# Copyright (C) 2022-2022 kcgen <kcgen@users.noreply.github.com>
+
+# Bash strict-mode
+set -euo pipefail
+IFS=$'\n\t'
+
+print_usage() {
+ local script="${0##*/}"
+ echo ""
+ echo "usage: $script URI [URI [...]]"
+ echo
+ echo "Convert a YouTube playlist into CD-DA track format."
+ echo " - Multiple playlists can be provided; each will be converted."
+ echo " - URIs can be the full https:// URL or just the identifier."
+ echo ""
+ echo "Depends on:"
+ echo " - yt-dlp (install with pip3 install yt-dlp)"
+ echo " - ffmpeg: install with package manager"
+ echo ""
+}
+
+main() {
+ case ${1:--help} in
+ -h | -help | --help) print_usage ;;
+ *)
+ check-dependencies
+ convert-playlists-to-tracks "$@"
+ ;;
+ esac
+}
+
+check-dependencies() {
+ local missing_deps=0
+ for dep in yt-dlp ffmpeg find sort rm; do
+ if ! command -v "$dep" &>/dev/null; then
+ echo "Missing dependency: $dep could not be found in the PATH"
+ ((missing_deps++))
+ fi
+ done
+ # Were any missing?
+ if [[ $missing_deps -gt 0 ]]; then
+ echo "Install the above programs and try again"
+ exit 1
+ fi
+}
+
+download-playlist-from-uri() {
+ # YouTube Opus format identifiers in order of quality
+ local webm_formats="338/251/250/249"
+
+ # Playlist/##-Track output layout
+ local cdda_ouput="%(playlist|)s/%(playlist_index)03d-%(title)s.%(ext)s"
+
+ yt-dlp \
+ --restrict-filenames \
+ --format "$webm_formats" \
+ --output "$cdda_ouput" \
+ "$uri" || true
+}
+
+extract-opus-from-webm() {
+ local opus="${webm%.webm}.opus"
+
+ ffmpeg \
+ -hide_banner \
+ -loglevel error \
+ -i "$webm" \
+ -vn -acodec copy "$opus"
+ # Delete the WebM source if we've got the Opus
+ if [[ -f $opus ]]; then
+ rm "$webm"
+ fi
+}
+
+convert-playlists-to-tracks() {
+ for uri in "$@"; do
+ download-playlist-from-uri
+ done
+ for webm in $(find . -maxdepth 2 -mindepth 2 -name '*.webm' | sort || true); do
+ extract-opus-from-webm
+ done
+}
+
+main "$@"
diff --git a/contrib/scripts/tracks-to-cues.sh b/contrib/scripts/tracks-to-cues.sh
new file mode 100755
index 000000000..1cc0d1cc3
--- /dev/null
+++ b/contrib/scripts/tracks-to-cues.sh
@@ -0,0 +1,176 @@
+#!/usr/bin/env bash
+
+# SPDX-License-Identifier: GPL-2.0-or-later
+#
+# Copyright (C) 2022-2022 kcgen <kcgen@users.noreply.github.com>
+
+# Bash strict-mode
+set -euo pipefail
+IFS=$'\n\t'
+
+print_usage() {
+ readonly SCRIPT="${0##*/}"
+ echo ""
+ echo "usage: $SCRIPT DIR [DIR [...]]"
+ echo
+ echo "Generate DOS Redbook CD-DA CUE file(s) in the given"
+ echo "directories made up of flac, wav, opus, ogg, and mp3s"
+ echo "Track numbers starts at 2 if an ISO file is present."
+ echo "Redbook's 99 minute/track limits are handled."
+ echo ""
+ echo "Depends on: ffprobe (part of ffmpeg), GNU find and sort."
+ echo ""
+}
+
+main() {
+ case ${1:--help} in
+ -h | -help | --help) print_usage ;;
+ *)
+ check-dependencies
+ generate-cues-for-dirs "$@"
+ ;;
+ esac
+}
+
+check-dependencies() {
+ local missing_deps=0
+ for dep in ffprobe find sort rm; do
+ if ! command -v "$dep" &>/dev/null; then
+ echo "Missing dependency: $dep could not be found in the PATH"
+ missing_deps=$((missing_deps + 1))
+ fi
+ done
+ # Were any missing?
+ if ((missing_deps > 0)); then
+ echo "Install the above programs and try again"
+ exit 1
+ fi
+}
+
+initialize-state-variables() {
+ iso=""
+
+ track=""
+ track_number=1
+ track_runtime=0
+ track_is_first=1
+ readonly track_limit=99
+
+ cue="cdrom.cue"
+ cue_number=1
+ cue_runtime=0
+ readonly runtime_limit=$((99 * 60))
+}
+
+generate-cues-for-dirs() {
+ for dir in "$@"; do
+ {
+ cd "$dir"
+ generate-cues-for-tracks
+ }
+ done
+}
+
+generate-cues-for-tracks() {
+ initialize-state-variables
+ iso=$(get-first-iso)
+ if [[ -n $iso ]]; then
+ add-iso-to-cue
+ fi
+ for track in $(get-audio-tracks); do
+ add-track-to-cue
+ done
+}
+
+add-iso-to-cue() {
+ {
+ echo "FILE \"$iso\" BINARY"
+ echo " TRACK 1 MODE1/2048"
+ echo " INDEX 01 00:00:00"
+ echo ""
+ } >>"$cue"
+ increment-track-number
+}
+
+add-track-to-cue() {
+ get-track-runtime
+ if ((track_runtime > runtime_limit)); then
+ echo "Skipping $track: $track_runtime s runtime exceeds CD-DAs maximum of $runtime_limit"
+ return
+ fi
+ add-track-runtime-to-cue
+ {
+ track_type=${track##*.}
+ echo "FILE \"$track\" ${track_type^^}"
+ echo " TRACK $track_number AUDIO"
+
+ if ((track_is_first == 1)); then
+ echo " PREGAP 00:02:00"
+ track_is_first=0
+ fi
+ echo " INDEX 01 00:00:00"
+ echo ""
+ } >>"$cue"
+
+ increment-track-number
+}
+
+increment-track-number() {
+ track_number=$((track_number + 1))
+ if ((track_number > track_limit)); then
+ increment-cue
+ fi
+}
+
+get-track-runtime() {
+ track_runtime=$(ffprobe \
+ -v error \
+ -show_entries format=duration \
+ -of default=noprint_wrappers=1:nokey=1 \
+ "$track")
+
+ # Ceil decimal portion by a full second
+ track_runtime=$((${track_runtime%%.*} + 1))
+}
+
+add-track-runtime-to-cue() {
+ cue_runtime=$((cue_runtime + track_runtime))
+ if ((cue_runtime > runtime_limit)); then
+ increment-cue
+ fi
+}
+
+increment-cue() {
+ if ((cue_number == 1)); then
+ mv "$cue" "cdrom1.cue"
+ fi
+ cue_runtime=$track_runtime
+ cue_number=$((cue_number + 1))
+ cue="cdrom${cue_number}.cue"
+
+ track_number=1
+ track_is_first=1
+}
+
+get-first-iso() {
+ find ./ -type f \
+ \( -iname \*.iso \) \
+ -printf '%P\n' |
+ sort --ignore-case |
+ head -1 ||
+ true
+}
+
+get-audio-tracks() {
+ find ./ -type f \
+ \( -iname \*.flac \
+ -o -iname \*.wav \
+ -o -iname \*.opus \
+ -o -iname \*.ogg \
+ -o -iname \*.mp3 \) \
+ -printf '%P\n' |
+ sort --ignore-case ||
+ true
+}
+
+main "$@"
diff --git a/contrib/scripts/yt-chapters-to-cdda.sh b/contrib/scripts/yt-chapters-to-cdda.sh
deleted file mode 100755
index 7d4cbc9b9..000000000
--- a/contrib/scripts/yt-chapters-to-cdda.sh
+++ /dev/null
@@ -1,143 +0,0 @@
-#!/usr/bin/env bash
-
-# SPDX-License-Identifier: GPL-2.0-or-later
-#
-# Copyright (C) 2022-2022 kcgen <kcgen@users.noreply.github.com>
-
-# Bash strict-mode
-set -euo pipefail
-IFS=$'\n\t'
-
-SCRIPT=$(basename "$0")
-readonly SCRIPT
-
-print_usage() {
- echo ""
- echo "usage: $SCRIPT URI [URI [...]]"
- echo
- echo "Convert a YouTube video with chapters into CDDA+CUE format."
- echo " - Multiple videos can be provided; each will be converted."
- echo " - URIs can be the full https:// URL or just the identifier."
- echo ""
- echo "Depends on:"
- echo " - yt-dlp (install with pip3 install yt-dlp)"
- echo " - ffmpeg: install with package manager"
- echo " - basename: install with package manager"
- echo ""
-}
-
-main() {
- case ${1:-} in
- -h | -help | --help) print_usage ;;
- *)
- check-dependencies
- convert-chapters-to-cdda "$@"
- ;;
- esac
-}
-
-check-dependencies() {
- local missing_deps=0
- for dep in yt-dlp ffmpeg find sort rm basename; do
- if ! command -v "$dep" &>/dev/null; then
- echo "Missing dependency: $dep could not be found in the PATH"
- ((missing_deps++))
- fi
- done
- # Were any missing?
- if [[ "$missing_deps" -gt 0 ]]; then
- echo "Install the above programs and try again"
- exit 1
- fi
-}
-
-download-chapters-from-uri() {
- local uri="$1"
-
- # YouTube Opus format identifiers in order of quality
- local webm_formats="338/251/250/249"
-
- # Directory/##-Track output layout
- local cdda_ouput="chapter:%(title)s/%(section_number)02d-%(section_title)s.%(ext)s"
-
- # Fetch the track and split it on chapters
- yt-dlp \
- --split-chapters \
- --restrict-filenames \
- --format "$webm_formats" \
- --output "$cdda_ouput" \
- "$uri"
-}
-
-extract-opus-from-webm() {
- local webm="$1"
- local opus="${1%.webm}.opus"
-
- if [[ -f "$webm" && ! -f "$opus" ]]; then
- # Extract the Opus stream from the WebM
- ffmpeg -hide_banner -loglevel error \
- -i "$webm" \
- -vn -acodec copy "$opus"
- # Delete the WebM source if we've got the Opus
- if [[ -f "$opus" ]]; then
- rm "$webm"
- fi
- fi
-}
-
-add-track-to-cue() {
- local dir
- local webm
- local opus
- dir=$(basename "${1%/*}")
- webm=$(basename "$1")
- opus=$(basename "$webm" webm)opus
-
- local track_number="$2"
-
- # Ensure this directory and the track exists
- if [[ ! -d "$dir" || ! -f "$dir/$opus" ]]; then
- echo "Problem finding the CDDA directory ($dir) and/or track ($dir/$opus)"
- exit 1
- fi
-
- # Add a CUE entry for the track
- cue_path="$dir/cdrom.cue"
- {
- echo "FILE \"$opus\" OPUS"
- echo " TRACK $track_number AUDIO"
- # Add pre-gap just for the first track
- if [[ "$track_number" == "1" ]]; then
- echo " PREGAP 00:02:00"
- fi
- echo " INDEX 01 00:00:00"
- echo ""
- } >>"$cue_path"
-}
-
-convert-local-webm-to-cdda() {
- local count=1
- for webm in $(find . -maxdepth 2 -mindepth 2 -name '*.webm' | sort); do
- extract-opus-from-webm "$webm"
- add-track-to-cue "$webm" "$count"
- ((count += 1))
- done
-}
-
-print-dosbox-imgmount-line() {
- local cue="$1"
- if [[ -n "$cue" ]]; then
- echo "imgmount d \"$cue\" -t cdrom"
- fi
-}
-
-convert-chapters-to-cdda() {
- for uri in "$@"; do
- cue_path=""
- download-chapters-from-uri "$uri"
- convert-local-webm-to-cdda
- print-dosbox-imgmount-line "$cue_path"
- done
-}
-
-main "$@"