Get under surveillance script: Difference between revisions
		
		
		
		
		
		Jump to navigation
		Jump to search
		
				
		
		
	
| mNo edit summary | m (Changed show length) | ||
| (3 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
| <pre> | <pre> | ||
| #!/bin/ksh | #!/bin/ksh | ||
| # | |||
| # Quick-and-dirty Script to fetch the KXCI radio show Under Surveillance from  | |||
| # last Friday (available that Saturday). | |||
| # | |||
| # Works in ksh, bash, and probably others. | |||
| # | |||
| # Dependencies: awk, pv, figlet, wget, ffmpeg, mid3v2 | |||
| # | |||
| # by david, david@sidiprojects.us (0x5AFF330ADEFD0AE2C59E9C3DD7362C75283B6B3D) | |||
| # 12 Mar 2022 | |||
| # Licensed under WTFPL | |||
| function do_exit_tasks { | |||
|    rm "${SAVEDIR}/${ORIGINAL_MANIFEST_NAME}" 2>/dev/null | |||
|    rm "${SAVEDIR}/${NEW_MANIFEST_NAME}" 2>/dev/null | |||
| } | |||
| trap do_exit_tasks EXIT | |||
| function do_interrupt_tasks { | |||
|    read answer?"Erase the directory for this week's Under Surveillance (${SAVEDIR}) [y/N]?" | |||
|    [[ "${answer}" = "y" ]] && rm -rf "${SAVEDIR}" | |||
| } | |||
| trap do_interrupt_tasks SIGINT | |||
| function write_line { | function write_line { | ||
|     TERMINAL_WIDTH=$(stty size | cut -d' ' -f2) |     TERMINAL_WIDTH=$(stty size | cut -d' ' -f2) | ||
|     for ((j=0; j<$TERMINAL_WIDTH; j++)); do |     for ((j=0; j<$TERMINAL_WIDTH; j++)); do | ||
|        echo -n "-" |        echo -n "-" >&2 | ||
|     done |     done | ||
|     echo |     echo >&2 | ||
| } | } | ||
| function display_banner { | function display_banner { | ||
|     write_line; write_line |     write_line; write_line | ||
|     echo Getting |     echo Getting >&2 | ||
|     figlet -t "UNDER SURVEILLANCE" |     figlet -t "UNDER SURVEILLANCE" >&2 | ||
|     echo for $(date -d "${DATE_TO_GET}" +%F) |     echo for $(date -d "${DATE_TO_GET}" +%F) >&2 | ||
|     write_line; write_line |     write_line; write_line | ||
| } | } | ||
| Line 28: | Line 47: | ||
| # MAIN FUNCTION | # MAIN FUNCTION | ||
| [[ $(date +%A) = "Saturday" ]] && DATE_TO_GET="now" || DATE_TO_GET="last saturday" | |||
| YEAR=$(date -d "${DATE_TO_GET}" +%Y)      # full year (e.g., 2015) | YEAR=$(date -d "${DATE_TO_GET}" +%Y)      # full year (e.g., 2015) | ||
| MONTHNAME=$(date -d "${DATE_TO_GET}" +%b) # month abbrev. name (e.g., Oct) | MONTHNAME=$(date -d "${DATE_TO_GET}" +%b) # month abbrev. name (e.g., Oct) | ||
| Line 38: | Line 53: | ||
| DAY=$(date -d "${DATE_TO_GET}" +%d)       # day, with 2 digits (e.g., 31) | DAY=$(date -d "${DATE_TO_GET}" +%d)       # day, with 2 digits (e.g., 31) | ||
| SAVEDIR="${HOME}/Music/under_surveillance/${MONTHNAME}_${DAY}_${YEAR}" | SAVEDIR="${HOME}/Music/under_surveillance/${MONTHNAME}_${DAY}_${YEAR}" | ||
| ORIGINAL_MANIFEST_NAME="index.m3u8" | |||
| NEW_MANIFEST_NAME="newindex.m3u8" | |||
| SHOW_LENGTH=336 | |||
| if mkdir ${SAVEDIR} 2> /dev/null; then | if mkdir ${SAVEDIR} 2> /dev/null; then | ||
| Line 44: | Line 61: | ||
|     display_banner |     display_banner | ||
| else | else | ||
|     echo "Directory $SAVEDIR already exists. Exiting..." |     echo "Directory $SAVEDIR already exists. Exiting..." >&2 | ||
|     exit 1   |     exit 1   | ||
| fi | fi | ||
| remote_dirname="KXCI-${YEAR}${MONTH}${DAY}T050000Z" | |||
| local_filename="Under-Surveillance_${DAY}-${MONTHNAME}-${YEAR}.mp3" | |||
| echo -n "Getting manifest, cutting it down to size..." >&2 | |||
| wget "https://ark2.spinitron.com/ark2/${remote_dirname}/index.m3u8" -O ${ORIGINAL_MANIFEST_NAME} >/dev/null 2>&1 | |||
| awk ' | |||
|    /seg-'${SHOW_LENGTH}'-a1\.ts/ { | |||
| done |       print($0) | ||
|       FLAG=1 | |||
|    }  | |||
|    FLAG { | |||
|       next | |||
|    }  | |||
|    # fall-through case | |||
|    { | |||
|        print($0) | |||
|    } | |||
|    END { | |||
|       print("#EXT-X-ENDLIST") | |||
|    }' \ | |||
|    ./index.m3u8 > "${NEW_MANIFEST_NAME}" | |||
| echo "done." | |||
| # turn off buffering in ffmpeg and track progress | |||
| ffmpeg  -protocol_whitelist "file,tcp,tls,https" \ | |||
|         -i "${NEW_MANIFEST_NAME}" \ | |||
|         "${local_filename}" 2>&1 \ | |||
|    | stdbuf -i0 -o0 -e0 egrep -o 'seg-[[:digit:]].+\.ts' \ | |||
|    | stdbuf -i0 -o0 -e0 -- pv -eta --progress --name "Reading fragments" -l -s ${SHOW_LENGTH} - \ | |||
|    | cat >/dev/null | |||
| mid3v2 \ | |||
|    --artist="Dave Wright, Falcotronik" \ | |||
|    --album="Under Surveillance" \ | |||
|    --genre="IDM Square-Dance and Atmospherics" \ | |||
|    --date=${YEAR}-${MONTH}-${DAY} \ | |||
|    --comment="Shout out as always to Armchair Lou and the Bimbos" \ | |||
|    ${local_filename} | |||
| echo "Enjoy /Under Surveillance/!" >&2 | |||
| exit 0 | |||
| </pre> | </pre> | ||
Latest revision as of 13:52, 11 March 2022
#!/bin/ksh
#
# Quick-and-dirty Script to fetch the KXCI radio show Under Surveillance from 
# last Friday (available that Saturday).
#
# Works in ksh, bash, and probably others.
#
# Dependencies: awk, pv, figlet, wget, ffmpeg, mid3v2
#
# by david, david@sidiprojects.us (0x5AFF330ADEFD0AE2C59E9C3DD7362C75283B6B3D)
# 12 Mar 2022
# Licensed under WTFPL
function do_exit_tasks {
   rm "${SAVEDIR}/${ORIGINAL_MANIFEST_NAME}" 2>/dev/null
   rm "${SAVEDIR}/${NEW_MANIFEST_NAME}" 2>/dev/null
}
trap do_exit_tasks EXIT
function do_interrupt_tasks {
   read answer?"Erase the directory for this week's Under Surveillance (${SAVEDIR}) [y/N]?"
   [[ "${answer}" = "y" ]] && rm -rf "${SAVEDIR}"
}
trap do_interrupt_tasks SIGINT
function write_line {
   TERMINAL_WIDTH=$(stty size | cut -d' ' -f2)
   for ((j=0; j<$TERMINAL_WIDTH; j++)); do
      echo -n "-" >&2
   done
   echo >&2
}
function display_banner {
   write_line; write_line
   echo Getting >&2
   figlet -t "UNDER SURVEILLANCE" >&2
   echo for $(date -d "${DATE_TO_GET}" +%F) >&2
   write_line; write_line
}
# MAIN FUNCTION
[[ $(date +%A) = "Saturday" ]] && DATE_TO_GET="now" || DATE_TO_GET="last saturday"
YEAR=$(date -d "${DATE_TO_GET}" +%Y)      # full year (e.g., 2015)
MONTHNAME=$(date -d "${DATE_TO_GET}" +%b) # month abbrev. name (e.g., Oct)
MONTH=$(date -d "${DATE_TO_GET}" +%m)     # month number (e.g., 10)
DAY=$(date -d "${DATE_TO_GET}" +%d)       # day, with 2 digits (e.g., 31)
SAVEDIR="${HOME}/Music/under_surveillance/${MONTHNAME}_${DAY}_${YEAR}"
ORIGINAL_MANIFEST_NAME="index.m3u8"
NEW_MANIFEST_NAME="newindex.m3u8"
SHOW_LENGTH=336
if mkdir ${SAVEDIR} 2> /dev/null; then
   cd $SAVEDIR
   display_banner
else
   echo "Directory $SAVEDIR already exists. Exiting..." >&2
   exit 1 
fi
remote_dirname="KXCI-${YEAR}${MONTH}${DAY}T050000Z"
local_filename="Under-Surveillance_${DAY}-${MONTHNAME}-${YEAR}.mp3"
echo -n "Getting manifest, cutting it down to size..." >&2
wget "https://ark2.spinitron.com/ark2/${remote_dirname}/index.m3u8" -O ${ORIGINAL_MANIFEST_NAME} >/dev/null 2>&1
awk '
   /seg-'${SHOW_LENGTH}'-a1\.ts/ {
      print($0)
      FLAG=1
   } 
   
   FLAG {
      next
   } 
   
   # fall-through case
   {
      print($0)
   }
   
   END {
      print("#EXT-X-ENDLIST")
   }' \
   ./index.m3u8 > "${NEW_MANIFEST_NAME}"
echo "done."
# turn off buffering in ffmpeg and track progress
ffmpeg  -protocol_whitelist "file,tcp,tls,https" \
        -i "${NEW_MANIFEST_NAME}" \
        "${local_filename}" 2>&1 \
   | stdbuf -i0 -o0 -e0 egrep -o 'seg-[[:digit:]].+\.ts' \
   | stdbuf -i0 -o0 -e0 -- pv -eta --progress --name "Reading fragments" -l -s ${SHOW_LENGTH} - \
   | cat >/dev/null
mid3v2 \
   --artist="Dave Wright, Falcotronik" \
   --album="Under Surveillance" \
   --genre="IDM Square-Dance and Atmospherics" \
   --date=${YEAR}-${MONTH}-${DAY} \
   --comment="Shout out as always to Armchair Lou and the Bimbos" \
   ${local_filename}
echo "Enjoy /Under Surveillance/!" >&2
exit 0