soapdish/scripts/playlist/playlist_view

412 lines
11 KiB
Plaintext
Raw Normal View History

2021-03-07 07:47:06 +00:00
#!/bin/bash
# MAIN: PLAYLIST VIEW
# Displays Playlist, with details such as time and commented out tracks
# $PLAYLIST_PATH
# Includes and Declarations (global variables, formatting, and functions)
source "${APPLICATION_ROOT}/scripts/system/system-functions"
source "${APPLICATION_ROOT}/scripts/system/system-declarations"
# Arrays Declarations
MASTER_USABLE_FILE_CONTENTS_ARRAY=()
# FUNCTION: Sum Times
function sum_times {
# Receive parmeters
INBOUND_ARRAY_FOR_SUMMING=("$@")
# Get array length
INBOUND_ARRAY_FOR_SUMMING_LENGTH=${#INBOUND_ARRAY_FOR_SUMMING[@]}
# Sum - Centiseconds in array
for ((i=0; i<INBOUND_ARRAY_FOR_SUMMING_LENGTH; i++));
do
# ECHOVAR=$((i+1));
TIMECS=${INBOUND_ARRAY_FOR_SUMMING[${i}]};
TIMECS=${TIMECS:9};
if [[ ${TIMECS:0:1} == "0" ]] ; then TIMECS="${TIMECS:1}"; fi # If time has leading zero, remove to prevent token fault
# echo $TIMECS # Debug
TOTAL_ARRAY_TIME_CS=$((TOTAL_ARRAY_TIME_CS+TIMECS));
done
# echo "Total Time in MS: ${TOTAL_ARRAY_TIME_MS}" # DEBUG
# Sum - Seconds only in array
for ((i=0; i<INBOUND_ARRAY_FOR_SUMMING_LENGTH; i++));
do
# ECHOVAR=$((i+1));
TIMES=${INBOUND_ARRAY_FOR_SUMMING[${i}]};
TIMES=${TIMES:6};
TIMES=${TIMES::-3};
if [[ ${TIMES:0:1} == "0" ]] ; then TIMES="${TIMES:1}"; fi # If time has leading zero, remove to prevent token fault
# echo $TIMES # Debug
TOTAL_ARRAY_TIME_S=$((TOTAL_ARRAY_TIME_S+TIMES));
done
# echo "Total Time in S: ${TOTAL_ARRAY_TIME_S}" # DEBUG
# Sum - Minutes only in array
for ((i=0; i<INBOUND_ARRAY_FOR_SUMMING_LENGTH; i++));
do
# ECHOVAR=$((i+1));
TIMEM=${INBOUND_ARRAY_FOR_SUMMING[${i}]};
TIMEM=${TIMEM:3};
TIMEM=${TIMEM::-6};
if [[ ${TIMEM:0:1} == "0" ]] ; then TIMEM="${TIMEM:1}"; fi # If time has leading zero, remove to prevent token fault
# echo $TIMEM # Debug
TOTAL_ARRAY_TIME_M=$((TOTAL_ARRAY_TIME_M+TIMEM));
done
# echo "Total Time in M: ${TOTAL_ARRAY_TIME_M}" # DEBUG
# Sum - Hours only in array
for ((i=0; i<INBOUND_ARRAY_FOR_SUMMING_LENGTH; i++));
do
# ECHOVAR=$((i+1));
TIMEH=${INBOUND_ARRAY_FOR_SUMMING[${i}]};
TIMEH=${TIMEH:0};
TIMEH=${TIMEH::-9};
if [[ ${TIMEH:0:1} == "0" ]] ; then TIMEH="${TIMEH:1}"; fi # If time has leading zero, remove to prevent token fault
# echo $TIMEH # Debug
TOTAL_ARRAY_TIME_H=$((TOTAL_ARRAY_TIME_H+TIMEH));
done
# echo "Total Time in H: ${TOTAL_ARRAY_TIME_H}" # DEBUG
# Assign intermediary variables the totals for further processing
TEMPTOTAL_CS=${TOTAL_ARRAY_TIME_CS}
TEMPTOTAL_S=${TOTAL_ARRAY_TIME_S}
TEMPTOTAL_M=${TOTAL_ARRAY_TIME_M}
TEMPTOTAL_H=${TOTAL_ARRAY_TIME_H}
# Calculation of modolo values to assmenble friendly time:
# Milliseconds - modolo and carryover calculation
TT_CS_MOD=$((TEMPTOTAL_CS%100));
TT_CS_DIV=$((TEMPTOTAL_CS/100));
TT_CS_DIV=${TT_CS_DIV%.*} # Get rid of decimal
# echo "ms - "${TEMPTOTAL_MS} "(modolo of:" ${TT_CS_MOD}"), and div of: "${TT_CS_DIV}; #DEBUG
FRIENDLY_CS=${TT_CS_MOD};
TEMPTOTAL_S=$((TEMPTOTAL_S + TT_CS_DIV));
# Seconds - modolo and carryover calculation
TT_S_MOD=$((TEMPTOTAL_S%60));
TT_S_DIV=$((TEMPTOTAL_S/60));
TT_S_DIV=${TT_S_DIV%.*}; # Get rid of decimal
# echo "s - "${TEMPTOTAL_S} "(modolo of:" ${TT_S_MOD}"), and a div of: "${TT_S_DIV}; #DEBUG
FRIENDLY_S=${TT_S_MOD};
TEMPTOTAL_M=$((TEMPTOTAL_M + TT_S_DIV));
# Minutes - modolo and carryover calculation
TT_M_MOD=$((TEMPTOTAL_M%60));
TT_M_DIV=$((TEMPTOTAL_M/60));
TT_M_DIV=${TT_M_DIV%.*}; # Get rid of decimal
# echo "m - "${TEMPTOTAL_M} "(modolo of:" ${TT_M_MOD}"), and a div of: "${TT_M_DIV}; #DEBUG
FRIENDLY_M=${TT_M_MOD};
TEMPTOTAL_H=$((TEMPTOTAL_H + TT_M_DIV));
# Hours - modolo (no carryover, because days are not calculated)
TT_H_MOD=$((TEMPTOTAL_H%24));
TT_H_DIV=$((TEMPTOTAL_H/24));
TT_H_DIV=${TT_H_DIV%.*}; # Get rid of decimal
# echo "h - "${TEMPTOTAL_H} "(modolo of:" ${TT_H_MOD}"), and a div of: "${TT_H_DIV}; #DEBUG
FRIENDLY_H=${TEMPTOTAL_H};
# Display Friendly Time:
SUM_FUNCTION_RETURN="${FRIENDLY_H}h ${FRIENDLY_M}m ${FRIENDLY_S}.${FRIENDLY_CS}s"
echo "$SUM_FUNCTION_RETURN"
# Unset Variables
FRIENDLY_H=""
FRIENDLY_M=""
FRIENDLY_S=""
FRIENDLY_CS=""
TOTAL_ARRAY_TIME_MS=""
TOTAL_ARRAY_TIME_S=""
TOTAL_ARRAY_TIME_M=""
TOTAL_ARRAY_TIME_H=""
SUM_FUNCTION_RETURN=""
}
function get_ffprobe_time {
# Capture value pass
TIME_CHECK_INPUT=$1
# Use ffprobe and various text stream actions to pull time value
FF_OUTPUT=$(ffprobe "$TIME_CHECK_INPUT" 2>&1 | grep "Duration");
FF_OUTPUT=${FF_OUTPUT:12};
FF_OUTPUT=${FF_OUTPUT::-36};
# Return value
echo $FF_OUTPUT;
}
function calculate_playlist_time {
# Instsantiate Array
MASTER_USABLE_FILE_CONTENTS_ARRAY=()
# Read playlist file contents
while IFS= read -r PLAYLIST_FILE_LINE
do
# Remove leading spaces
PLAYLIST_LINE_NO_LEADING_SPACES=$(echo -e "${PLAYLIST_FILE_LINE}" | sed -e 's/^[[:space:]]*//')
# If file line is not empty and ends in .mp3
if [[ "$PLAYLIST_LINE_NO_LEADING_SPACES" != "" && $PLAYLIST_LINE_NO_LEADING_SPACES == *.mp3 ]]; then
# Add file to master file contents array, get length
MASTER_USABLE_FILE_CONTENTS_ARRAY+=("$PLAYLIST_LINE_NO_LEADING_SPACES")
# Master usable array length
MASTER_USABLE_ARRAY_LENGTH=${#MASTER_USABLE_FILE_CONTENTS_ARRAY[@]}
fi
done < "$PLAYLIST_PATH"
# Create arrays for both commented and non commented lines
ARRAY_OF_QUEUED_TIMES=()
ARRAY_OF_ALL_TIMES=()
for LINE_FOR_HASH_CHECK in "${MASTER_USABLE_FILE_CONTENTS_ARRAY[@]}"; do
# If first character beings with hash
if [[ ${LINE_FOR_HASH_CHECK:0:1} = "#" ]]; then
# Remove Hash
# LINE_FOR_HASH_CHECK=$(echo $LINE_FOR_HASH_CHECK | sed -e "s/\#//")
LINE_FOR_HASH_CHECK=$(echo -e "${LINE_FOR_HASH_CHECK}" | sed -e 's/^[#| ]*//')
LINE_FOR_HASH_CHECK=$(echo -e "${LINE_FOR_HASH_CHECK}" | sed -e 's/^[[:space:]]*//')
# Run get_ffprobe_time for value
FF_PROBE_RESULT=$(get_ffprobe_time "${LINE_FOR_HASH_CHECK}")
# Add to arrays (both, in this case)
ARRAY_OF_ALL_TIMES=( "${ARRAY_OF_ALL_TIMES[@]}" "$FF_PROBE_RESULT" )
# Else if line doesn't start with hash
else
# Run get_ffprobe_time for value
FF_PROBE_RESULT=$(get_ffprobe_time "${LINE_FOR_HASH_CHECK}")
# # Add to all array only
ARRAY_OF_QUEUED_TIMES=( "${ARRAY_OF_QUEUED_TIMES[@]}" "$FF_PROBE_RESULT" )
ARRAY_OF_ALL_TIMES=( "${ARRAY_OF_ALL_TIMES[@]}" "$FF_PROBE_RESULT" )
fi
done
# Render Results
printf "${COLOR_GREEN}[V] Playlist view:${COLOR_DEFAULT}\n";
echo ""
echo ""
echo " ${FONT_BOLD}PLAYLIST FILES (HH:MM:SS.MS)${FONT_DEFAULT}"
echo ""
# Numbmering Indexes (the printable ones)
FRIENDLY_INDEX=1;
COMPLETE_INDEX=1;
# Create Array
ARRAY_OF_QUEUED_TRACKS=()
for (( i = 0; i < $MASTER_USABLE_ARRAY_LENGTH; i++ )); do
# Prepare Filename to Echo
FILENAME_TO_ECHO=${MASTER_USABLE_FILE_CONTENTS_ARRAY[$i]}
FILENAME_TO_ECHO=$(sed -e s/"^.*queued\/"// <<< ${FILENAME_TO_ECHO})
# check if line begins with #
if [[ ${MASTER_USABLE_FILE_CONTENTS_ARRAY[$i]:0:1} == "#" ]]; then
if [[ ${MASTER_USABLE_FILE_CONTENTS_ARRAY[$i]:0:1} == "#" ]]; then
# Prepare "printable complete index"
if [[ ${#COMPLETE_INDEX} = 1 ]]; then
printf " ${COLOR_GRAY}[0$COMPLETE_INDEX] ${ARRAY_OF_ALL_TIMES[$i]} # ${FILENAME_TO_ECHO}${COLOR_DEFAULT}\n"
else
printf " ${COLOR_GRAY}[$COMPLETE_INDEX] ${ARRAY_OF_ALL_TIMES[$i]} # ${FILENAME_TO_ECHO}${COLOR_DEFAULT}\n"
fi
fi
# Else if line doesn't start with #
else
# If does not start with #
if [[ ${#FRIENDLY_INDEX} = 1 ]]; then
printf " 0$FRIENDLY_INDEX"
else
printf " $FRIENDLY_INDEX"
fi
FRIENDLY_INDEX=$((FRIENDLY_INDEX+1))
# Prepare "printable complete index" (later gets indexed outside loop)
if [[ ${#COMPLETE_INDEX} = 1 ]]; then
printf " $SYMBOL_RAQUO [0$COMPLETE_INDEX] "
else
printf " $SYMBOL_RAQUO [$COMPLETE_INDEX] "
fi
# Echo Time
echo -e " ${ARRAY_OF_ALL_TIMES[$i]} ${FILENAME_TO_ECHO}"
fi
# Index "complete index"
COMPLETE_INDEX=$((COMPLETE_INDEX+1))
done
# Deincrement friendly index, because increment happens in loop after it's printed
FRIENDLY_INDEX=$(("$FRIENDLY_INDEX-1")) # Get final count of queued times
FINAL_COUNT_OF_QUEUED_ITEMS=${#ARRAY_OF_QUEUED_TIMES[@]}
# Unsetariables and get sum of time arrays (for all files and queued files)
SUM_OF_QUEUED_TIMES=""
# SUM_OF_NT_OF_ALL_ITEMS=${#ARRAY_OF_ALL_TIMES[@]}ALL_TIMES=""
SUM_OF_QUEUED_TIMES=$(sum_times "${ARRAY_OF_QUEUED_TIMES[@]}")
SUM_OF_ALL_TIMES=$(sum_times "${ARRAY_OF_ALL_TIMES[@]}")
# Echo Output
echo -e ""
echo -e " ${FONT_BOLD}Total (${FINAL_COUNT_OF_QUEUED_ITEMS}/${MASTER_USABLE_ARRAY_LENGTH} tracks): $SUM_OF_QUEUED_TIMES / $SUM_OF_ALL_TIMES${FONT_DEFAULT}\n"
echo -e ""
echo -e ""
echo -e ""
}
function verify_playlist_integrity() {
# Clear Array
INTEGRITY_CHECK_FILE_LINES_ARRAY=()
# Declare integrity check flag
INTEGRITY_CHECK_FLAG="true"
# Read playlist file contents
while IFS= read -r PLAYLIST_FILE_LINE
do
# Remove leading spaces
PLAYLIST_LINE_WITH_NO_LEADING_SPACES=$(echo -e "${PLAYLIST_FILE_LINE}" | sed -e 's/^[[:space:]]*//')
# If line isn't blank
if [[ -n $PLAYLIST_LINE_WITH_NO_LEADING_SPACES ]];
then
# If ends in .mp3
if [[ "$PLAYLIST_LINE_WITH_NO_LEADING_SPACES" == *.mp3 ]]; then
# remove pound
PLAYLIST_LINE_WITH_NO_LEADING_POUND=$(echo -e "${PLAYLIST_LINE_WITH_NO_LEADING_SPACES}" | sed -e 's/^[#| ]*//')
# Add file to master file contents array, get length
INTEGRITY_CHECK_FILE_LINES_ARRAY+=("$PLAYLIST_LINE_WITH_NO_LEADING_POUND")
fi
# If line is blank (then don't add to array / continue)
else
continue
fi
done < "$PLAYLIST_PATH"
# Check that a file exists for each playlist line
for INTEGRITY_CHECK_ITEM in "${INTEGRITY_CHECK_FILE_LINES_ARRAY[@]}"
do
# If doesn't exist then throw notice
if [[ ! -f "$INTEGRITY_CHECK_ITEM" ]];
then
# Flag as failed
INTEGRITY_CHECK_FLAG="false"
fi
done
echo $INTEGRITY_CHECK_FLAG
}
# If playlist file exists, then do routine
if test -f "$PLAYLIST_PATH";
# Execute calcualte_playlist_time
then
MASTER_PLAYLIST_INTEGRITY_CHECK=$(verify_playlist_integrity)
if [[ "$MASTER_PLAYLIST_INTEGRITY_CHECK" == "true" ]];
# If playlist integrity check passed
then
echo "Calculating playlist time..."
calculate_playlist_time
# else error
else
error_message "[V] View playlist: playlist contains invalid refs. Please edit or recreate for summary."
echo ""
fi
# else if playlist file doesn't exist
else
error_message "[V] View playlist: playlist file not found. Run \"C\" to create.";
echo ""
fi