Files
shellscripts/m3u-cue-converter.sh
2025-07-12 20:30:34 +07:00

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