@@ -110,13 +110,14 @@ filter_tracks() {
110110}
111111
112112preferred_languages () {
113- local pref_langs=${langs,,}
113+ local pref_langs=$( echo " $ {langs} " | tr ' [:upper:] ' ' [:lower:] ' )
114114 echo " ${pref_langs// ,/ $' \n ' } "
115115}
116116
117117guess_track_priority () {
118118 # Sets some numeric weight for track. Used when sorting tracks.
119- local -r track_lang=${1,,} track_title=${2,,}
119+ local -r track_lang=$( echo " ${1} " | tr ' [:upper:]' ' [:lower:]' )
120+ local -r track_title=$( echo " ${2} " | tr ' [:upper:]' ' [:lower:]' )
120121 local weight=0
121122
122123 # impd wants to use full subtitle tracks and avoid other tracks if possible.
@@ -161,7 +162,7 @@ best_track() {
161162 if [[ -n $tracks ]]; then
162163 while IFS=$' \t ' read -r track_num track_lang track_title; do
163164 printf -- ' %d\t%d\n' " $track_num " " $( guess_track_priority " $track_lang " " $track_title " ) "
164- done <<< " $tracks" | sort --stable - g -k 2 -t $' \t ' | cut -f1 | head -1
165+ done <<< " $tracks" | sort -g -k 2 -t $' \t ' | cut -f1 | head -1
165166 fi
166167}
167168
@@ -241,14 +242,13 @@ fetch_episode_number() {
241242 local -r file=${1:? }
242243 {
243244 echo 01
244- grep -Pio ' \[\K\d+(?=\])' <<< " ${file%.*}"
245245 sed \
246246 -Ee ' s/(\[|\()[^])]*(\]|\))//g' \
247247 -Ee ' s/[0-9]{3,4}[pP]//g' \
248248 -Ee ' s/(19|20)[0-9]{2}//g' \
249249 -Ee ' s/v[.0-9-]{1,4}//g' \
250250 -e ' s/_/ /g' <<< " ${file%.*}" |
251- grep -Pio ' (?<= [##. pe-]) [[:digit:]]{1,3}\b'
251+ grep -Eio ' [##. pe-][[:digit:]]{1,3}\b' | grep -Eo ' [[:digit:]]{1,3} '
252252 } | tail -1
253253}
254254
@@ -371,7 +371,7 @@ make_output_basename() {
371371make_uncondensed () {
372372 local -r input=${1:? }
373373 local -r base=$( make_output_basename " $input " )
374- local -r job_dir=$( mktemp -d --tmpdir= " $tmp_dir " -t " make_uncondensed.job-XXXX" )
374+ local -r job_dir=$( mktemp -d " $tmp_dir / make_uncondensed.job-XXXX" )
375375 local -r temp_audio=$job_dir /$base .ogg
376376 local -r output=$immersionpod_dir /$current /$base .ogg
377377
@@ -627,12 +627,12 @@ make_condensed() {
627627 local -r video=$( canonicalize " ${1:? Video path not set.} " ) # convert to full path
628628 local -r base=$( make_output_basename " $video " )
629629
630- local -r job_dir=$( mktemp -d --tmpdir= " $tmp_dir " -t " $base .job-XXXX" )
630+ local -r job_dir=$( mktemp -d " $tmp_dir / $base .job-XXXX" )
631631
632632 local -r temp_audio=$job_dir /$base .ogg
633633 local -r output=$( canonicalize " ${2:- $immersionpod_dir / $current / $base .ogg} " )
634634
635- local -r chunks_dir=$( mktemp -d --tmpdir= " $job_dir " -t " chunks-XXXX" )
635+ local -r chunks_dir=$( mktemp -d " $job_dir / chunks-XXXX" )
636636 local -r chunks_file=$job_dir /chunks.list
637637
638638 local -r subs_out=$job_dir /$base .srt
@@ -752,7 +752,7 @@ add_file() {
752752
753753add_remote () {
754754 local -r source_url=${1:? }
755- local -r job_dir=$( mktemp -d --tmpdir= " $tmp_dir " -t " download.job-XXXX" )
755+ local -r job_dir=$( mktemp -d " $tmp_dir / download.job-XXXX" )
756756 (
757757 cd -- " $job_dir " && curl -L -O " $source_url "
758758 for file in " $job_dir " /* ; do
@@ -835,7 +835,7 @@ add() {
835835
836836file_can_be_added () {
837837 local -r file=$1
838- grep -Pqv " $filename_skip_pattern " <<< " $file" && is_media " $file "
838+ grep -Eqv " $filename_skip_pattern " <<< " $file" && is_media " $file "
839839}
840840
841841add_stdin () {
@@ -888,7 +888,7 @@ download_yt() {
888888
889889add_yt () {
890890 local -r source_url=${1:? }
891- local -r job_dir=$( mktemp -d --tmpdir= " $tmp_dir " -t " youtube-dl.job-XXXX" )
891+ local -r job_dir=$( mktemp -d " $tmp_dir / youtube-dl.job-XXXX" )
892892
893893 download_yt -o " $job_dir /%(uploader)s - %(title).60s.%(ext)s" " $source_url "
894894
@@ -948,16 +948,19 @@ mkplaylist() {
948948
949949 find " $immersionpod_dir /$current " \
950950 -type f \
951- -printf ' %P\n' \
952- -regextype posix-extended \
953- -iregex ' .*\.(mp3|opus|ogg|m4a|wav|wma)$' |
951+ -iname ' *.mp3' -o -iname ' *.opus' -o -iname ' *.ogg' -o -iname ' *.m4a' -o -iname ' *.wav' -o -iname ' *.wma' |
954952 shuf > " $m3u_path "
955953 echo " created file '$m3u_path '"
956954}
957955
958956grep_mpd_dir () {
959957 # https://wiki.archlinux.org/index.php/Music_Player_Daemon#Configuration
960- grep -Pos ' music_directory\s*"?\K[^"]*(?="?)' -- ~ /.config/mpd/mpd.conf
958+ if command -v ggrep > /dev/null; then
959+ ggrep -Pos ' music_directory\s*"?\K[^"]*(?="?)' -- ~ /.config/mpd/mpd.conf 2> /dev/null
960+ else
961+ # Fallback for macOS - extract music directory path from mpd.conf
962+ grep ' music_directory' ~ /.config/mpd/mpd.conf 2> /dev/null | sed -E ' s/.*music_directory[[:space:]]*"?([^"]*).*/\1/'
963+ fi
961964}
962965
963966choose_mpd_dir () {
@@ -966,7 +969,14 @@ choose_mpd_dir() {
966969 # Otherwise, the directory is set to the value from mpd's config.
967970 # Different fallbacks are tried in other cases.
968971 local dir
969- for dir in " $music_dir " " $( grep_mpd_dir) " " $( xdg-user-dir MUSIC) " ~ /Music ~ /music; do
972+ # macOS doesn't have xdg-user-dir, so we'll use ~/Music as the default
973+ local music_fallback
974+ if [[ " $( uname) " == " Darwin" ]]; then
975+ music_fallback=" $HOME /Music"
976+ else
977+ music_fallback=" $( xdg-user-dir MUSIC 2> /dev/null || echo " $HOME /Music" ) "
978+ fi
979+ for dir in " $music_dir " " $( grep_mpd_dir) " " $music_fallback " ~ /Music ~ /music; do
970980 dir=${dir/ \~ / $HOME }
971981 dir=${dir// \/\/ / \/ }
972982 dir=${dir%%/ }
@@ -1052,7 +1062,7 @@ version() {
10521062read_config_file () {
10531063 if [[ -f $config_filepath ]]; then
10541064 # shellcheck source=/dev/null
1055- source -- <( grep -xP ' ^[a-z_]+=.+ $' -- " $config_filepath " )
1065+ source -- <( grep -x ' ^[a-z_]*=.* $' -- " $config_filepath " )
10561066 fi
10571067}
10581068
0 commit comments