412 lines
11 KiB
Plaintext
412 lines
11 KiB
Plaintext
|
#!/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
|