diff --git a/multi-channel-bash-scripts/channeldown.sh b/multi-channel-bash-scripts/channeldown.sh index 56a8515..e88aa45 100755 --- a/multi-channel-bash-scripts/channeldown.sh +++ b/multi-channel-bash-scripts/channeldown.sh @@ -40,6 +40,29 @@ FIRST_RUN=false # Scan the dir to see how many channels there are, store them in an arr. CHANNEL_DIR_ARR=( $(find . -maxdepth 1 -type d -name '*'"$CHANNEL_DIR_INCREMENT_SYMBOL"'[[:digit:]]*' -printf "%P\n" | sort -t"$CHANNEL_DIR_INCREMENT_SYMBOL" -n) ) +# Since leading zeros may be an issue, we need to correctly sort the channels. The best way to do this seems to be in python +# So a script will take in the channels as they are, then output them in the correct, sorted order in Channels_Sorted.txt. +# We will run the script, then read in the results. +sudo python ./Channel_Sorter.py ${CHANNEL_DIR_ARR[@]} + +filename="./Channels_Sorted.txt" +i=0 +while read -r line +do + name="$line" + CHANNEL_DIR_SORTED[i]=$name + i=$((i+1)) +done < "$filename" + + +# We need to add on top of this a "buffer" where we remove all leading zeros to compare everything on the same level +# This simply leaves us with the number at the end. NOTE: We should have already sorted things, so this should not be a problem +for i in "${!CHANNEL_DIR_ARR[@]}" +do + CHANNEL_DIR_NUMBERS[i]=$(echo ${CHANNEL_DIR_SORTED[i]} | sed "s/^pseudo-channel${CHANNEL_DIR_INCREMENT_SYMBOL}0*//") +done + + # If the previous channel txt file doesn't exist already create it (first run?) if [ ! -e "$OUTPUT_PREV_CHANNEL_PATH/$OUTPUT_PREV_CHANNEL_FILE" ]; then @@ -56,69 +79,41 @@ fi # then read file, get prevchannel, increment, and trigger next channel: if [ "${#CHANNEL_DIR_ARR[@]}" -gt 1 ]; then - NEXT_CHANNEL="" + #NEXT_CHANNEL="" NEXT_CHANNEL_NUM=1 PREV_CHANNEL_FOUND=false - PREV_CHANNEL_DIR="" + #PREV_CHANNEL_DIR="" echo "+++++ There are ${#CHANNEL_DIR_ARR[@]} channels detected." - PREV_CHANNEL=$(<$OUTPUT_PREV_CHANNEL_PATH/$OUTPUT_PREV_CHANNEL_FILE) + #PREV_CHANNEL=$(<$OUTPUT_PREV_CHANNEL_PATH/$OUTPUT_PREV_CHANNEL_FILE) + + # We are now going to do the same thing here, just with previous channel + PREV_CHANNEL=$(echo $(<$OUTPUT_PREV_CHANNEL_PATH/$OUTPUT_PREV_CHANNEL_FILE) | sed "s/^0*//") echo "+++++ It looks like the previous channel was: $PREV_CHANNEL" - # Now that the prevchannel is stored in a var, loop through channels and find prev channel & increment - for ((i = ${#CHANNEL_DIR_ARR[@]};i >= 1;i--)); do - - NEXT_CHANNEL_NUM=$i - if [ "${i}" -gt 9 ]; then - - if [[ ${i} == *"$PREV_CHANNEL"* ]]; then - echo "+++++ Found previous channel, decreasing by 1." - PREV_CHANNEL_FOUND=true - PREV_CHANNEL_DIR="${CHANNEL_DIR_ARR[i-1]}" - continue + # This is our modified way of searching for the correct directory for the previous channel + for i in "${!CHANNEL_DIR_NUMBERS[@]}" + do + item_compare=${CHANNEL_DIR_NUMBERS[i]} + if [ $item_compare -eq $PREV_CHANNEL ]; then + echo "PREVIOUS CHANNEL MATCH: ${CHANNEL_DIR_SORTED[$i]}" + PREV_CHANNEL_DIR=${CHANNEL_DIR_SORTED[$i]} + if [ $((i-1)) -lt 0 ]; then + ARR_LENGTH=(${#CHANNEL_DIR_SORTED[@]}) + NEXT_CHANNEL=${CHANNEL_DIR_SORTED[$ARR_LENGTH-1]} + else + NEXT_CHANNEL=${CHANNEL_DIR_SORTED[$((i-1))]} fi - - else - - if [[ "0"${i} == *"$PREV_CHANNEL"* ]]; then - echo "+++++ Found previous channel, decreasing by 1." - PREV_CHANNEL_FOUND=true - PREV_CHANNEL_DIR="${CHANNEL_DIR_ARR[i-1]}" - continue - fi - - fi - - if [ "$PREV_CHANNEL_FOUND" = true ] ; then - - echo "PREV_CHANNEL_FOUND" - echo "$PREV_CHANNEL_FOUND" - - NEXT_CHANNEL="${CHANNEL_DIR_ARR[i-1]}" - break - fi - done - # If the next channel is an empty string, then we need to start the cycle over. - if [ -z "$NEXT_CHANNEL" ]; then - - ARR_LENGTH=(${#CHANNEL_DIR_ARR[@]}) - NEXT_CHANNEL=${CHANNEL_DIR_ARR[$ARR_LENGTH-1]} - echo "Starting cycle over." - echo "$PREV_CHANNEL_DIR" - echo "$NEXT_CHANNEL" - - fi - echo "+++++ The next channel is: $NEXT_CHANNEL" # Write next channel to previous channel file to reference later diff --git a/multi-channel-bash-scripts/channelup.sh b/multi-channel-bash-scripts/channelup.sh index 8a67c74..62903e5 100755 --- a/multi-channel-bash-scripts/channelup.sh +++ b/multi-channel-bash-scripts/channelup.sh @@ -51,49 +51,64 @@ fi # Scan the dir to see how many channels there are, store them in an arr. CHANNEL_DIR_ARR=( $(find . -maxdepth 1 -type d -name '*'"$CHANNEL_DIR_INCREMENT_SYMBOL"'[[:digit:]]*' -printf "%P\n" | sort -t"$CHANNEL_DIR_INCREMENT_SYMBOL" -n) ) +# Since leading zeros may be an issue, we need to correctly sort the channels. The best way to do this seems to be in python +# So a script will take in the channels as they are, then output them in the correct, sorted order in Channels_Sorted.txt. +# We will run the script, then read in the results. +sudo python ./Channel_Sorter.py ${CHANNEL_DIR_ARR[@]} + +filename="./Channels_Sorted.txt" +i=0 +while read -r line +do + name="$line" + CHANNEL_DIR_SORTED[i]=$name + i=$((i+1)) +done < "$filename" + + +# We need to add on top of this a "buffer" where we remove all leading zeros to compare everything on the same level +# This simply leaves us with the number at the end. NOTE: We should have already sorted things, so this should not be a problem +for i in "${!CHANNEL_DIR_ARR[@]}" +do + CHANNEL_DIR_NUMBERS[i]=$(echo ${CHANNEL_DIR_SORTED[i]} | sed "s/^pseudo-channel${CHANNEL_DIR_INCREMENT_SYMBOL}0*//") +done + # If this script see's there are multiple channels, # then read file, get prevchannel, increment, and trigger next channel: if [ "${#CHANNEL_DIR_ARR[@]}" -gt 1 ]; then - NEXT_CHANNEL="" + #NEXT_CHANNEL="" PREV_CHANNEL_FOUND=false - PREV_CHANNEL_DIR="" + #PREV_CHANNEL_DIR="" echo "+++++ There are ${#CHANNEL_DIR_ARR[@]} channels detected." - PREV_CHANNEL=$(<$OUTPUT_PREV_CHANNEL_PATH/$OUTPUT_PREV_CHANNEL_FILE) + #PREV_CHANNEL=$(<$OUTPUT_PREV_CHANNEL_PATH/$OUTPUT_PREV_CHANNEL_FILE) + + # We are now going to do the same thing here, just with previous channel + PREV_CHANNEL=$(echo $(<$OUTPUT_PREV_CHANNEL_PATH/$OUTPUT_PREV_CHANNEL_FILE) | sed "s/^0*//") echo "+++++ It looks like the previous channel was: $PREV_CHANNEL" - # Now that the prevchannel is stored in a var, loop through channels and find prev channel & increment - for channel in "${CHANNEL_DIR_ARR[@]}" + + # This is our modified way of searching for the correct directory for the previous channel + for i in "${!CHANNEL_DIR_NUMBERS[@]}" do - if [[ $channel == *"$PREV_CHANNEL"* ]]; then - echo "+++++ Found previous channel, incrementing by 1." - PREV_CHANNEL_FOUND=true - PREV_CHANNEL_DIR=$channel - continue - fi - - if [ "$PREV_CHANNEL_FOUND" = true ] ; then - - NEXT_CHANNEL=$channel - + item_compare=${CHANNEL_DIR_NUMBERS[i]} + if [ $item_compare -eq $PREV_CHANNEL ]; then + echo "PREVIOUS CHANNEL MATCH: ${CHANNEL_DIR_SORTED[$i]}" + PREV_CHANNEL_DIR=${CHANNEL_DIR_SORTED[$i]} + if [ $((i+1)) -gt $((${#CHANNEL_DIR_SORTED[@]}-1)) ]; then + NEXT_CHANNEL=${CHANNEL_DIR_SORTED[0]} + else + NEXT_CHANNEL=${CHANNEL_DIR_SORTED[$((i+1))]} + fi break - fi - done - # If the next channel is an empty string, then we need to start the cycle over. - if [ -z "$NEXT_CHANNEL" ]; then - - NEXT_CHANNEL=${CHANNEL_DIR_ARR[0]} - - fi - echo "+++++ The next channel is: $NEXT_CHANNEL" # Write next channel to previous channel file to reference later diff --git a/multi-channel-bash-scripts/manual.sh b/multi-channel-bash-scripts/manual.sh index 5345e5d..da83cd3 100755 --- a/multi-channel-bash-scripts/manual.sh +++ b/multi-channel-bash-scripts/manual.sh @@ -1,99 +1,103 @@ -#!/bin/bash - -# Credits: irodimus - -# file: manual.sh - -#---- -# Simple script to change to specific channel given - triggering start / stop. -#---- - -#---- -# To Use: -# Run script by including the channel you'd like to run as an argument: ex. ./manual.sh 2, ./manual.sh 9 -# -# Configure something (a tv remote or alexa) to trigger this script. Make sure you move this script just -# outside of the pseudo-channel directories: -# ------------------- -# -channels/ -# --pseudo-channel_1/ -# ---startstop.sh -# --pseudo-channel_2/ -# ---startstop.sh -# --pseudo-channel_3/ -# ---startstop.sh -# --manual.sh <--- on the same level as the 3 channels. -#---- - -# Make sure that each channel dir ends with a "_" + an incrementing number as seen above. - -#----BEGIN EDITABLE VARS---- - -SCRIPT_TO_EXECUTE='startstop.sh' - -OUTPUT_PREV_CHANNEL_PATH=. - -OUTPUT_PREV_CHANNEL_FILE=".prevplaying" - -CHANNEL_DIR_INCREMENT_SYMBOL="_" - -#----END EDITABLE VARS------- - -FIRST_RUN=false - -# Scan the dir to see how many channels there are, store them in an arr. -CHANNEL_DIR_ARR=( $(find . -maxdepth 1 -type d -name '*'"$CHANNEL_DIR_INCREMENT_SYMBOL"'[[:digit:]]*' -printf "%P\n" | sort -t"$CHANNEL_DIR_INCREMENT_SYMBOL" -n) ) - -# If the previous channel txt file doesn't exist already create it (first run?) -if [ ! -e "$OUTPUT_PREV_CHANNEL_PATH/$OUTPUT_PREV_CHANNEL_FILE" ]; then - - #FIRST_RUN_NUM=$((${#CHANNEL_DIR_ARR[@]})) - echo 1 > "$OUTPUT_PREV_CHANNEL_PATH/$OUTPUT_PREV_CHANNEL_FILE" - - echo "First run: $FIRST_RUN_NUM" - - FIRST_RUN=true - -fi - -# If this script see's there are multiple channels, -# then read file, get prevchannel and nextchannel, and trigger next channel: -if [ "${#CHANNEL_DIR_ARR[@]}" -gt 1 ]; then - - NEXT_CHANNEL=$1 - - NEXT_CHANNEL_DIR=( $(find . -maxdepth 1 -type d -name '*'"$CHANNEL_DIR_INCREMENT_SYMBOL""$NEXT_CHANNEL" -printf "%P\n") ) - - PREV_CHANNEL_FOUND=false - - echo "+++++ There are ${#CHANNEL_DIR_ARR[@]} channels detected." - - PREV_CHANNEL=$(<$OUTPUT_PREV_CHANNEL_PATH/$OUTPUT_PREV_CHANNEL_FILE) - - PREV_CHANNEL_DIR=( $(find . -maxdepth 1 -type d -name '*'"$CHANNEL_DIR_INCREMENT_SYMBOL""$PREV_CHANNEL" -printf "%P\n") ) - - echo "+++++ It looks like the previous channel was: $PREV_CHANNEL" - - echo "+++++ The next channel is: $NEXT_CHANNEL" - - # Write next channel to previous channel file to reference later - echo "$NEXT_CHANNEL" > "$OUTPUT_PREV_CHANNEL_PATH/$OUTPUT_PREV_CHANNEL_FILE" - - # Finally let's trigger the startstop script in both the previous channel and the next channel dirs. - # This will stop the previous channels playback & trigger the next channels playback - - if [ "$FIRST_RUN" = false ]; then - cd "$OUTPUT_PREV_CHANNEL_PATH"/"$PREV_CHANNEL_DIR" && ./"$SCRIPT_TO_EXECUTE" - cd ../"$NEXT_CHANNEL_DIR" && ./"$SCRIPT_TO_EXECUTE" - else - - cd "$OUTPUT_PREV_CHANNEL_PATH"/"$NEXT_CHANNEL_DIR" && ./"$SCRIPT_TO_EXECUTE" - - fi - - sleep 1 - - -fi - +#!/bin/bash + +# Credits: irodimus + +# file: manual.sh + +#---- +# Simple script to change to specific channel given - triggering start / stop. +#---- + +#---- +# To Use: +# Run script by including the channel you'd like to run as an argument: ex. ./manual.sh 2, ./manual.sh 9 +# +# Configure something (a tv remote or alexa) to trigger this script. Make sure you move this script just +# outside of the pseudo-channel directories: +# ------------------- +# -channels/ +# --pseudo-channel_1/ +# ---startstop.sh +# --pseudo-channel_2/ +# ---startstop.sh +# --pseudo-channel_3/ +# ---startstop.sh +# --manual.sh <--- on the same level as the 3 channels. +#---- + +# Make sure that each channel dir ends with a "_" + an incrementing number as seen above. + +#----BEGIN EDITABLE VARS---- + +SCRIPT_TO_EXECUTE='startstop.sh' + +OUTPUT_PREV_CHANNEL_PATH=. + +OUTPUT_PREV_CHANNEL_FILE=".prevplaying" + +CHANNEL_DIR_INCREMENT_SYMBOL="_" + +#----END EDITABLE VARS------- + +FIRST_RUN=false + +# Scan the dir to see how many channels there are, store them in an arr. +CHANNEL_DIR_ARR=( $(find . -maxdepth 1 -type d -name '*'"$CHANNEL_DIR_INCREMENT_SYMBOL"'[[:digit:]]*' -printf "%P\n" | sort -t"$CHANNEL_DIR_INCREMENT_SYMBOL" -n) ) + +echo $CHANNEL_DIR_ARR + +# If the previous channel txt file doesn't exist already create it (first run?) +if [ ! -e "$OUTPUT_PREV_CHANNEL_PATH/$OUTPUT_PREV_CHANNEL_FILE" ]; then + + #FIRST_RUN_NUM=$((${#CHANNEL_DIR_ARR[@]})) + echo 1 > "$OUTPUT_PREV_CHANNEL_PATH/$OUTPUT_PREV_CHANNEL_FILE" + + echo "First run: $FIRST_RUN_NUM" + + FIRST_RUN=true + +fi + +# If this script see's there are multiple channels, +# then read file, get prevchannel and nextchannel, and trigger next channel: +if [ "${#CHANNEL_DIR_ARR[@]}" -gt 1 ]; then + + NEXT_CHANNEL=$1 + + NEXT_CHANNEL_DIR=( $(find . -maxdepth 1 -type d -name '*'"$CHANNEL_DIR_INCREMENT_SYMBOL""$NEXT_CHANNEL" -printf "%P\n") ) + + PREV_CHANNEL_FOUND=false + + echo "+++++ There are ${#CHANNEL_DIR_ARR[@]} channels detected." + + PREV_CHANNEL=$(<$OUTPUT_PREV_CHANNEL_PATH/$OUTPUT_PREV_CHANNEL_FILE) + + PREV_CHANNEL_DIR=( $(find . -maxdepth 1 -type d -name '*'"$CHANNEL_DIR_INCREMENT_SYMBOL""$PREV_CHANNEL" -printf "%P\n") ) + + PREV_CHANNEL_DISP=$(echo $PREV_CHANNEL | sed 's/^0*//') + + echo "+++++ It looks like the previous channel was: $PREV_CHANNEL_DISP" + + echo "+++++ The next channel is: $NEXT_CHANNEL" + + # Write next channel to previous channel file to reference later + echo "$NEXT_CHANNEL" > "$OUTPUT_PREV_CHANNEL_PATH/$OUTPUT_PREV_CHANNEL_FILE" + + # Finally let's trigger the startstop script in both the previous channel and the next channel dirs. + # This will stop the previous channels playback & trigger the next channels playback + + if [ "$FIRST_RUN" = false ]; then + cd "$OUTPUT_PREV_CHANNEL_PATH"/"$PREV_CHANNEL_DIR" && ./"$SCRIPT_TO_EXECUTE" + cd ../"$NEXT_CHANNEL_DIR" && ./"$SCRIPT_TO_EXECUTE" + else + + cd "$OUTPUT_PREV_CHANNEL_PATH"/"$NEXT_CHANNEL_DIR" && ./"$SCRIPT_TO_EXECUTE" + + fi + + sleep 1 + + +fi + exit 0 \ No newline at end of file