asteroid/scripts/music-library-tree-basic.sh

127 lines
4.0 KiB
Bash

#!/bin/bash
# Basic music library tree generator (no external tools required)
# Shows file structure with sizes only
# Usage: ./music-library-tree-basic.sh [music-directory] [output-file]
MUSIC_DIR="${1:-/home/glenneth/Music}"
OUTPUT_FILE="${2:-music-library-tree.txt}"
# Check if music directory exists
if [ ! -d "$MUSIC_DIR" ]; then
echo "Error: Music directory '$MUSIC_DIR' does not exist"
exit 1
fi
# Function to format file size
format_size() {
local size=$1
if [ $size -ge 1073741824 ]; then
awk "BEGIN {printf \"%.1fG\", $size/1073741824}"
elif [ $size -ge 1048576 ]; then
awk "BEGIN {printf \"%.1fM\", $size/1048576}"
elif [ $size -ge 1024 ]; then
awk "BEGIN {printf \"%.0fK\", $size/1024}"
else
printf "%dB" $size
fi
}
# Function to recursively build tree
build_tree() {
local dir="$1"
local prefix="$2"
# Get all entries sorted
local entries=()
while IFS= read -r -d $'\0' entry; do
entries+=("$entry")
done < <(find "$dir" -maxdepth 1 -mindepth 1 -print0 2>/dev/null | sort -z)
# Separate directories and files
local dirs=()
local files=()
for entry in "${entries[@]}"; do
if [ -d "$entry" ]; then
dirs+=("$entry")
else
files+=("$entry")
fi
done
# Combine: directories first, then files
local all_entries=("${dirs[@]}" "${files[@]}")
local count=${#all_entries[@]}
local index=0
for entry in "${all_entries[@]}"; do
index=$((index + 1))
local basename=$(basename "$entry")
local is_last=false
[ $index -eq $count ] && is_last=true
if [ -d "$entry" ]; then
# Directory - count files inside
local file_count=$(find "$entry" -type f 2>/dev/null | wc -l)
if $is_last; then
echo "${prefix}└── $basename/ ($file_count files)" >> "$OUTPUT_FILE"
build_tree "$entry" "${prefix} "
else
echo "${prefix}├── $basename/ ($file_count files)" >> "$OUTPUT_FILE"
build_tree "$entry" "${prefix}"
fi
else
# File
local ext="${basename##*.}"
ext=$(echo "$ext" | tr '[:upper:]' '[:lower:]')
local size=$(stat -c%s "$entry" 2>/dev/null || stat -f%z "$entry" 2>/dev/null || echo "0")
local size_fmt=$(format_size $size)
if [[ "$ext" =~ ^(mp3|flac|ogg|m4a|wav|aac|opus|wma)$ ]]; then
if $is_last; then
echo "${prefix}└── ♪ $basename ($size_fmt)" >> "$OUTPUT_FILE"
else
echo "${prefix}├── ♪ $basename ($size_fmt)" >> "$OUTPUT_FILE"
fi
else
if $is_last; then
echo "${prefix}└── $basename ($size_fmt)" >> "$OUTPUT_FILE"
else
echo "${prefix}├── $basename ($size_fmt)" >> "$OUTPUT_FILE"
fi
fi
fi
done
}
echo "Generating music library tree (basic mode - no duration info)..."
# Start generating the tree
{
echo "Music Library Tree"
echo "=================="
echo "Generated: $(date)"
echo "Directory: $MUSIC_DIR"
echo "Note: Duration info not available (requires mediainfo/ffprobe)"
echo ""
# Count total files
total_audio=$(find "$MUSIC_DIR" -type f \( -iname "*.mp3" -o -iname "*.flac" -o -iname "*.ogg" -o -iname "*.m4a" -o -iname "*.wav" -o -iname "*.aac" -o -iname "*.opus" -o -iname "*.wma" \) 2>/dev/null | wc -l)
total_dirs=$(find "$MUSIC_DIR" -type d 2>/dev/null | wc -l)
total_size=$(du -sh "$MUSIC_DIR" 2>/dev/null | cut -f1)
echo "Total audio files: $total_audio"
echo "Total directories: $total_dirs"
echo "Total size: $total_size"
echo ""
# Build the tree
echo "$(basename "$MUSIC_DIR")/"
} > "$OUTPUT_FILE"
build_tree "$MUSIC_DIR" ""
echo ""
echo "Tree generated successfully!"
echo "Output saved to: $OUTPUT_FILE"