@@ -106,13 +106,13 @@ filter_tracks() {
106106}
107107
108108preferred_languages () {
109- local pref_langs=${langs,,}
109+ local pref_langs=$( echo " $ {langs} " | tr ' [:upper:] ' ' [:lower:] ' )
110110 echo " ${pref_langs// ,/ $' \n ' } "
111111}
112112
113113guess_track_priority () {
114114 # Sets some numeric weight for track. Used when sorting tracks.
115- local -r track_lang=${1,,} track_title=${2,,}
115+ local -r track_lang=$( echo " ${1} " | tr ' [:upper:] ' ' [:lower:] ' ) track_title=$( echo " ${2} " | tr ' [:upper:] ' ' [:lower:] ' )
116116 local weight=0
117117
118118 # impd wants to use full subtitle tracks and avoid other tracks if possible.
@@ -157,7 +157,7 @@ best_track() {
157157 if [[ -n $tracks ]]; then
158158 while IFS=$' \t ' read -r track_num track_lang track_title; do
159159 printf -- ' %d\t%d\n' " $track_num " " $( guess_track_priority " $track_lang " " $track_title " ) "
160- done <<< " $tracks" | sort --stable - g -k 2 -t $' \t ' | cut -f1 | head -1
160+ done <<< " $tracks" | sort -g -k 2 -t $' \t ' | cut -f1 | head -1
161161 fi
162162}
163163
@@ -214,14 +214,13 @@ fetch_episode_number() {
214214 local -r file=${1:? }
215215 {
216216 echo 01
217- grep -Pio ' \[\K\d+(?=\])' <<< " ${file%.*}"
218217 sed \
219218 -Ee ' s/(\[|\()[^])]*(\]|\))//g' \
220219 -Ee ' s/[0-9]{3,4}[pP]//g' \
221220 -Ee ' s/(19|20)[0-9]{2}//g' \
222221 -Ee ' s/v[.0-9-]{1,4}//g' \
223222 -e ' s/_/ /g' <<< " ${file%.*}" |
224- grep -Pio ' (?<= [##. pe-]) [[:digit:]]{1,3}\b'
223+ grep -Eio ' [##. pe-][[:digit:]]{1,3}\b' | grep -Eo ' [[:digit:]]{1,3} '
225224 } | tail -1
226225}
227226
@@ -263,10 +262,19 @@ check_output() {
263262}
264263
265264extract_audio () {
266- local -r input=$( readlink -f -- " ${1:? } " )
267- local -r output=$( readlink -f -- " ${2:- $immersionpod_dir / $current / $(basename -- " ${input% .* } " ).ogg} " )
265+ local input=" ${1:? } "
266+ local output=" ${2:- $immersionpod_dir / $current / $(basename -- " ${input% .* } " ).ogg} "
268267 local -r track_num=${3:- $(best_track a " $input " )}
269268
269+ # Get absolute paths (macOS compatible)
270+ if [[ " $input " != /* ]]; then
271+ input=" $( pwd) /$input "
272+ fi
273+ if [[ " $output " != /* ]]; then
274+ output=" $( pwd) /$output "
275+ fi
276+ local -r input output
277+
270278 if ! check_output; then
271279 return 1
272280 fi
@@ -306,7 +314,7 @@ extract_audio() {
306314make_uncondensed () {
307315 local -r input=${1:? }
308316 local -r base=$( basename -- " ${input% .* } " )
309- local -r job_dir=$( mktemp -d --tmpdir= " $tmp_dir " -t " make_uncondensed.job-XXXX" )
317+ local -r job_dir=$( mktemp -d " $tmp_dir / make_uncondensed.job-XXXX" )
310318 local -r temp_audio=$job_dir /$base .ogg
311319 local -r output=$immersionpod_dir /$current /$base .ogg
312320
@@ -541,19 +549,34 @@ concat_audio() {
541549}
542550
543551make_condensed () {
544- local -r video=$( readlink -f -- " ${1:? } " )
552+ local video=" ${1:? } "
553+ # Get absolute path (macOS compatible)
554+ if [[ " $video " != /* ]]; then
555+ video=" $( pwd) /$video "
556+ fi
557+ local -r video
545558 local -r base=$( basename -- " ${video% .* } " | tr -d \' )
546559
547- local -r job_dir=$( mktemp -d --tmpdir= " $tmp_dir " -t " $base .job-XXXX" )
560+ local -r job_dir=$( mktemp -d " $tmp_dir / $base .job-XXXX" )
548561
549562 local -r temp_audio=$job_dir /$base .ogg
550- local -r output=$( readlink -f -- " ${2:- $immersionpod_dir / $current / $base .ogg} " )
563+ local output=" ${2:- $immersionpod_dir / $current / $base .ogg} "
564+ # Get absolute path (macOS compatible)
565+ if [[ " $output " != /* ]]; then
566+ output=" $( pwd) /$output "
567+ fi
568+ local -r output
551569
552- local -r chunks_dir=$( mktemp -d --tmpdir= " $job_dir " -t " chunks-XXXX" )
570+ local -r chunks_dir=$( mktemp -d " $job_dir / chunks-XXXX" )
553571 local -r chunks_file=$job_dir /chunks.list
554572
555573 local -r subs_out=$job_dir /$base .srt
556- local -r subs_external=$( readlink -f -- " ${3:- $(find_external_subtitles " $video " )} " )
574+ local subs_external=" ${3:- $(find_external_subtitles " $video " )} "
575+ # Get absolute path (macOS compatible)
576+ if [[ -n " $subs_external " && " $subs_external " != /* ]]; then
577+ subs_external=" $( pwd) /$subs_external "
578+ fi
579+ local -r subs_external
557580
558581 local -r subs_track_num=${4-}
559582 local -r audio_track_num=${5-}
@@ -645,7 +668,12 @@ notify_send() {
645668}
646669
647670add_file () {
648- local -r source_file=$( readlink -f -- " ${1:? } " )
671+ local source_file=" ${1:? } "
672+ # Get absolute path (macOS compatible)
673+ if [[ " $source_file " != /* ]]; then
674+ source_file=" $( pwd) /$source_file "
675+ fi
676+ local -r source_file
649677
650678 if [[ -f $source_file ]]; then
651679 if [[ -z ${global_no_condense-} ]]; then
@@ -658,7 +686,7 @@ add_file() {
658686
659687add_remote () {
660688 local -r source_url=${1:? }
661- local -r job_dir=$( mktemp -d --tmpdir= " $tmp_dir " -t " download.job-XXXX" )
689+ local -r job_dir=$( mktemp -d " $tmp_dir / download.job-XXXX" )
662690 (
663691 cd -- " $job_dir " && curl -L -O " $source_url "
664692 for file in " $job_dir " /* ; do
@@ -741,7 +769,7 @@ add() {
741769
742770file_can_be_added () {
743771 local -r file=$1
744- grep -Pqv " $filename_skip_pattern " <<< " $file" && is_media " $file "
772+ grep -Eqv " $filename_skip_pattern " <<< " $file" && is_media " $file "
745773}
746774
747775add_stdin () {
@@ -794,7 +822,7 @@ download_yt() {
794822
795823add_yt () {
796824 local -r source_url=${1:? }
797- local -r job_dir=$( mktemp -d --tmpdir= " $tmp_dir " -t " youtube-dl.job-XXXX" )
825+ local -r job_dir=$( mktemp -d " $tmp_dir / youtube-dl.job-XXXX" )
798826
799827 download_yt -o " $job_dir /%(uploader)s - %(title).60s.%(ext)s" " $source_url "
800828
@@ -854,16 +882,19 @@ mkplaylist() {
854882
855883 find " $immersionpod_dir /$current " \
856884 -type f \
857- -printf ' %P\n' \
858- -regextype posix-extended \
859- -iregex ' .*\.(mp3|opus|ogg|m4a|wav|wma)$' |
885+ -iname ' *.mp3' -o -iname ' *.opus' -o -iname ' *.ogg' -o -iname ' *.m4a' -o -iname ' *.wav' -o -iname ' *.wma' |
860886 shuf > " $m3u_path "
861887 echo " created file '$m3u_path '"
862888}
863889
864890grep_mpd_dir () {
865891 # https://wiki.archlinux.org/index.php/Music_Player_Daemon#Configuration
866- grep -Pos ' music_directory\s*"?\K[^"]*(?="?)' -- ~ /.config/mpd/mpd.conf
892+ if command -v ggrep > /dev/null; then
893+ ggrep -Pos ' music_directory\s*"?\K[^"]*(?="?)' -- ~ /.config/mpd/mpd.conf 2> /dev/null
894+ else
895+ # Fallback for macOS - extract music directory path from mpd.conf
896+ grep ' music_directory' ~ /.config/mpd/mpd.conf 2> /dev/null | sed -E ' s/.*music_directory[[:space:]]*"?([^"]*).*/\1/'
897+ fi
867898}
868899
869900choose_mpd_dir () {
@@ -872,7 +903,14 @@ choose_mpd_dir() {
872903 # Otherwise, the directory is set to the value from mpd's config.
873904 # Different fallbacks are tried in other cases.
874905 local dir
875- for dir in " $music_dir " " $( grep_mpd_dir) " " $( xdg-user-dir MUSIC) " ~ /Music ~ /music; do
906+ # macOS doesn't have xdg-user-dir, so we'll use ~/Music as the default
907+ local music_fallback
908+ if [[ " $( uname) " == " Darwin" ]]; then
909+ music_fallback=" $HOME /Music"
910+ else
911+ music_fallback=" $( xdg-user-dir MUSIC 2> /dev/null || echo " $HOME /Music" ) "
912+ fi
913+ for dir in " $music_dir " " $( grep_mpd_dir) " " $music_fallback " ~ /Music ~ /music; do
876914 dir=${dir/ \~ / $HOME }
877915 dir=${dir// \/\/ / \/ }
878916 dir=${dir%%/ }
@@ -958,7 +996,7 @@ version() {
958996read_config_file () {
959997 if [[ -f $config_filepath ]]; then
960998 # shellcheck source=/dev/null
961- source -- <( grep -xP ' ^[a-z_]+=.+ $' -- " $config_filepath " )
999+ source -- <( grep -x ' ^[a-z_]*=.* $' -- " $config_filepath " )
9621000 fi
9631001}
9641002
0 commit comments