161 lines
3.6 KiB
Bash
Executable File
161 lines
3.6 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Simple M3U to CUE Converter Script
|
|
# Converts M3U playlist files to basic CUE format
|
|
|
|
# Function to display usage
|
|
show_usage() {
|
|
echo "Usage: $0 [OPTIONS] <input.m3u> [output.cue]"
|
|
echo ""
|
|
echo "Options:"
|
|
echo " -t, --title TITLE Set playlist title (default: derived from filename)"
|
|
echo " -r, --relative Use relative paths (strip directory paths)"
|
|
echo " -h, --help Show this help message"
|
|
echo ""
|
|
echo "Examples:"
|
|
echo " $0 Mix.m3u"
|
|
echo " $0 Mix.m3u Mix.cue"
|
|
echo " $0 --title \"My Playlist\" --relative Mix.m3u"
|
|
}
|
|
|
|
# Default options
|
|
PLAYLIST_TITLE=""
|
|
USE_RELATIVE_PATHS=false
|
|
INPUT_FILE=""
|
|
OUTPUT_FILE=""
|
|
|
|
# Parse command line arguments
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
-t|--title)
|
|
PLAYLIST_TITLE="$2"
|
|
shift 2
|
|
;;
|
|
-r|--relative)
|
|
USE_RELATIVE_PATHS=true
|
|
shift
|
|
;;
|
|
-h|--help)
|
|
show_usage
|
|
exit 0
|
|
;;
|
|
-*)
|
|
echo "Unknown option: $1"
|
|
show_usage
|
|
exit 1
|
|
;;
|
|
*)
|
|
if [ -z "$INPUT_FILE" ]; then
|
|
INPUT_FILE="$1"
|
|
elif [ -z "$OUTPUT_FILE" ]; then
|
|
OUTPUT_FILE="$1"
|
|
else
|
|
echo "Too many arguments"
|
|
show_usage
|
|
exit 1
|
|
fi
|
|
shift
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Check if input file is provided
|
|
if [ -z "$INPUT_FILE" ]; then
|
|
echo "Error: Input M3U file is required"
|
|
show_usage
|
|
exit 1
|
|
fi
|
|
|
|
# Check if input file exists
|
|
if [ ! -f "$INPUT_FILE" ]; then
|
|
echo "Error: Input file '$INPUT_FILE' not found"
|
|
exit 1
|
|
fi
|
|
|
|
# Set default output file if not provided
|
|
if [ -z "$OUTPUT_FILE" ]; then
|
|
OUTPUT_FILE="${INPUT_FILE%.*}.cue"
|
|
fi
|
|
|
|
# Set default playlist title if not provided
|
|
if [ -z "$PLAYLIST_TITLE" ]; then
|
|
PLAYLIST_TITLE=$(basename "$INPUT_FILE" .m3u)
|
|
fi
|
|
|
|
# Function to extract filename from path
|
|
get_filename() {
|
|
local filepath="$1"
|
|
if [ "$USE_RELATIVE_PATHS" = true ]; then
|
|
basename "$filepath"
|
|
else
|
|
echo "$filepath"
|
|
fi
|
|
}
|
|
|
|
# Function to determine file format from extension
|
|
get_file_format() {
|
|
local filepath="$1"
|
|
local ext="${filepath##*.}"
|
|
ext=$(echo "$ext" | tr '[:upper:]' '[:lower:]')
|
|
|
|
case "$ext" in
|
|
"flac") echo "FLAC" ;;
|
|
"wav") echo "WAVE" ;;
|
|
"mp3") echo "MP3" ;;
|
|
"ogg") echo "OGG" ;;
|
|
*) echo "BINARY" ;;
|
|
esac
|
|
}
|
|
|
|
echo "Converting M3U to CUE format..."
|
|
echo "Input: $INPUT_FILE"
|
|
echo "Output: $OUTPUT_FILE"
|
|
echo ""
|
|
|
|
# Start writing CUE file
|
|
{
|
|
echo "TITLE \"$PLAYLIST_TITLE\""
|
|
} > "$OUTPUT_FILE"
|
|
|
|
# Process M3U file
|
|
track_num=1
|
|
processed_files=0
|
|
|
|
while IFS= read -r line || [ -n "$line" ]; do
|
|
# Skip empty lines and all comment lines
|
|
if [ -z "$line" ] || [[ "$line" == "#"* ]]; then
|
|
continue
|
|
fi
|
|
|
|
# Process file path
|
|
filepath="$line"
|
|
filename=$(get_filename "$filepath")
|
|
file_format=$(get_file_format "$filepath")
|
|
|
|
# Add track to CUE file
|
|
{
|
|
echo "FILE \"$filename\" $file_format"
|
|
printf " TRACK %02d AUDIO\n" $track_num
|
|
echo " INDEX 01 00:00:00"
|
|
} >> "$OUTPUT_FILE"
|
|
|
|
echo " Track $track_num: $filename"
|
|
|
|
((track_num++))
|
|
((processed_files++))
|
|
done < "$INPUT_FILE"
|
|
|
|
echo ""
|
|
echo "Conversion completed successfully!"
|
|
echo "Processed $processed_files tracks"
|
|
echo "CUE file saved as: $OUTPUT_FILE"
|
|
|
|
# Validate output
|
|
if [ -f "$OUTPUT_FILE" ] && [ -s "$OUTPUT_FILE" ]; then
|
|
echo "Output file validation: OK"
|
|
exit 0
|
|
else
|
|
echo "Error: Output file was not created properly"
|
|
exit 1
|
|
fi
|