166 lines
4.2 KiB
Bash
Executable file
166 lines
4.2 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
|
|
function print_usage {
|
|
echo "Usage: strm [OPTIONS] QUERY ... [OPTIONS]"
|
|
echo
|
|
echo "Stream media files over SSH."
|
|
echo
|
|
echo "OPTIONS"
|
|
echo " -h, --help Show this help message"
|
|
echo " -c, --config CONFIG_FILE Path to config file"
|
|
echo " -l, --list List files instead of playing"
|
|
echo " -m, --media-directories MEDIA_DIRECTORIES Use given media directories, config is ignored"
|
|
echo " -s, --shuffle Play files in random order"
|
|
echo
|
|
echo "EXAMPLES"
|
|
echo " strm -l . # List all available files"
|
|
echo " strm Elephants Dream # Play files whose path contain 'elephants' and 'dream' in order"
|
|
echo " strm e*phants # Play files whose path matches the wildcard 'e*phants'"
|
|
exit
|
|
}
|
|
|
|
function error {
|
|
echo "ERROR: $1" >&2
|
|
exit 1
|
|
}
|
|
|
|
# Check if mpv is installed
|
|
if ! command -v mpv &>/dev/null
|
|
then
|
|
error "mpv was not found, please install it"
|
|
fi
|
|
|
|
# Set default values
|
|
config="$HOME/.config/strm/strm.config"
|
|
list=false
|
|
shuffle=false
|
|
query=""
|
|
media_directories=""
|
|
|
|
# Parse arguments
|
|
while (( "$#" )); do
|
|
case "$1" in
|
|
-c|--config)
|
|
if [ -n "$2" ] && [ "${2:0:1}" != "-" ]; then
|
|
config="$2"
|
|
shift 2
|
|
else
|
|
error "Argument for $1 is missing"
|
|
fi
|
|
;;
|
|
-h|--help)
|
|
print_usage
|
|
;;
|
|
-l|--list)
|
|
list=true
|
|
shift
|
|
;;
|
|
-m|--media-directories)
|
|
if [ -n "$2" ] && [ "${2:0:1}" != "-" ]; then
|
|
media_directories="$2"
|
|
shift 2
|
|
else
|
|
error "Argument for $1 is missing"
|
|
fi
|
|
;;
|
|
-s|--shuffle)
|
|
shuffle=true
|
|
shift
|
|
;;
|
|
*)
|
|
query="$query\*$1"
|
|
shift
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Print usage if no query was given
|
|
if [ "$query" == "" ]; then
|
|
print_usage
|
|
fi
|
|
|
|
# If no media directory was set load config file
|
|
if [ "$media_directories" == "" ]; then
|
|
|
|
# Read config file
|
|
if test -f "$config"; then
|
|
. "$config"
|
|
else
|
|
error "Config file not found ($config)"
|
|
fi
|
|
|
|
# Throws error if still no media directory set
|
|
if [ "$media_directories" == "" ]; then
|
|
error "No media directory specified"
|
|
fi
|
|
fi
|
|
|
|
# Remove possible whitespace characters from media directories string
|
|
media_directories=${media_directories//[[:blank:]]/}
|
|
|
|
# Read media directories
|
|
IFS="," read -a media_directories <<< "$media_directories"
|
|
|
|
# Initialize result arrays
|
|
sftp_results=()
|
|
print_results=()
|
|
|
|
# Get results from every media directory
|
|
for media_directory in "${media_directories[@]}"; do
|
|
|
|
tmp_sftp_results=()
|
|
tmp_print_results=()
|
|
|
|
# Get connection string and remote directory
|
|
IFS="/" read -r connection_string directory <<< "$media_directory"
|
|
|
|
# Add leading and trailing slash to directory if missing
|
|
[[ "$directory" != /*/ ]] && directory="/$directory/"
|
|
|
|
|
|
# Get search results from remote
|
|
# Look for paths matching given queries in visible directories, listing only filenames and links
|
|
mapfile -t tmp_results < <(ssh -o ConnectTimeout=10 "$connection_string" find "$directory" -not -path \"*/\.*\" -type l,f -ipath "$query\*" | sort)
|
|
|
|
# Build SFTP strings and printable strings
|
|
for i in "${!tmp_results[@]}"; do
|
|
tmp_sftp_results["$i"]="sftp://$connection_string${tmp_results[$i]}"
|
|
tmp_print_result="${tmp_results[$i]}"
|
|
tmp_print_results["$i"]="${tmp_print_result/$directory/}"
|
|
done
|
|
sftp_results=("${sftp_results[@]}" "${tmp_sftp_results[@]}")
|
|
print_results=("${print_results[@]}" "${tmp_print_results[@]}")
|
|
done
|
|
|
|
# Exit if no results found
|
|
if [ "${#sftp_results[@]}" == 0 ]; then
|
|
echo "No files found with given query"
|
|
exit
|
|
fi
|
|
|
|
# List files
|
|
if [ "$list" == false ]; then
|
|
if [ "$shuffle" == true ]; then
|
|
echo -e "Playing the following files in random order:\n"
|
|
else
|
|
echo -e "Playing the following files:\n"
|
|
fi
|
|
fi
|
|
|
|
# Print results
|
|
for result in "${print_results[@]}"; do
|
|
echo "$result"
|
|
done
|
|
|
|
# Play results if --list flag not set
|
|
if [ "$list" == false ]; then
|
|
|
|
echo
|
|
|
|
# Play all remote files
|
|
if [ "$shuffle" == true ]; then
|
|
mpv --shuffle "${sftp_results[@]}"
|
|
else
|
|
mpv "${sftp_results[@]}"
|
|
fi
|
|
fi
|