soapdish/scripts/playlist/playlist_view

412 lines
11 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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