changes - hope they work

This commit is contained in:
2026-03-14 11:13:56 +01:00
parent 867124d2fd
commit 335aa54621
5 changed files with 171 additions and 46 deletions

View File

@ -2,13 +2,13 @@
set -euo pipefail
CSV_DEFAULT="wunf_scenes.csv"
DRY_RUN=0
usage() {
echo "Användning:"
echo " $0 <filnamn> [csv-fil]"
echo " $0 --all <katalog> [csv-fil]"
echo " $0 --list <textfil> [csv-fil] # en väg per rad"
echo " ls -1 --quoting-style=literal \[WUNF\]_*.mp4 > filenames.txt && ./script/wunf_upd_prefix.sh --list filenames.txt wunf_scenes.csv && rm filenames.txt"
echo " $0 [--dry-run] <filnamn> [csv-fil]"
echo " $0 [--dry-run] --all <katalog> [csv-fil]"
echo " $0 [--dry-run] --list <textfil> [csv-fil] # en väg per rad"
exit 1
}
@ -16,77 +16,167 @@ rename_file() {
local FILE="$1"
local CSV="$2"
local base dir rest first second remainder name code code_us newbase newpath
if [[ ! -f "$FILE" ]]; then
echo "Fel: Filen finns inte: $FILE" >&2
return 1
fi
local base dir rest name_segment code newbase newpath
base="$(basename -- "$FILE")"
dir="$(dirname -- "$FILE")"
# Kontrollera prefix
if [[ "$base" != "[WUNF]"* ]]; then
# Hoppa över om den redan har index, t.ex. [WUNF_427]...
if [[ "${base:0:7}" == "[WUNF_" ]]; then
echo "Hoppar över (har redan index): $base" >&2
return 0
fi
# Kräver exakt prefixet "[WUNF]"
if [[ "${base:0:6}" != "[WUNF]" ]]; then
echo "Hoppar över (ej [WUNF]-prefix): $base" >&2
return 0
fi
# Plocka ut allt efter prefixet [WUNF]_
rest="${base#"[WUNF]"}"
rest="${rest#_}"
# Ta bort prefixet "[WUNF]"
rest="${base:6}"
IFS='_' read -r first second remainder <<< "$rest"
# Ta bort ett eller flera ledande underscores efter prefixet
while [[ "${rest:0:1}" == "_" ]]; do
rest="${rest:1}"
done
if [[ -z "${first:-}" || -z "${second:-}" ]]; then
echo "Fel: Kunde inte extrahera två namn-delar i: $base" >&2
return 1
# Ta bort extension (.mp4, .mkv osv)
name_segment="${rest%.*}"
if [[ -z "$name_segment" ]]; then
echo "Ingen namn-del efter prefix i: $base" >&2
return 0
fi
# Namn = två första token, med '_' -> ' '
name="${first//_/ } ${second//_/ }"
name="$(printf '%s' "$name" | sed -E 's/^[[:space:]]+|[[:space:]]+$//g')"
# slå upp i CSV (format Namn;Kod;Tid)
# Slå upp kod i CSV via tokeniserad matchning
code="$(
awk -F';' -v target="$name" '
BEGIN{IGNORECASE=1}
awk -F';' -v fstring="$name_segment" '
BEGIN {
# 1) Tokenisera filnamnets namn-del
s = fstring
gsub(/_+/, " ", s) # "_" -> mellanslag
gsub(/[[:space:]]+/, " ", s) # normalisera whitespace
sub(/^[[:space:]]+/, "", s)
sub(/[[:space:]]+$/, "", s)
s = tolower(s)
if (length(s) == 0) { exit 0 }
n_ft = split(s, ft, " ") # ft[] = filtokens
bestScore = 0
bestCode = ""
ambiguous = 0
}
{
n=$1; gsub(/^[ \t]+|[ \t]+$/, "", n);
if (n==target) {
c=$2; gsub(/^[ \t]+|[ \t]+$/, "", c);
print c; exit
# 2) Tokenisera namn-kolumnen i CSV
name = $1
gsub(/,/, " ", name) # kommatecken ignoreras
gsub(/[[:space:]]+/, " ", name)
sub(/^[[:space:]]+/, "", name)
sub(/[[:space:]]+$/, "", name)
lname = tolower(name)
if (length(lname) == 0) next
n_rt = split(lname, rt, " ") # rt[] = CSV-tokens
# kan inte vara prefix om den är längre än filens tokenlista
if (n_rt > n_ft) next
# 3) Kolla om CSV-tokenlistan är prefix till filnamnets tokens
matchOK = 1
for (i = 1; i <= n_rt; i++) {
if (rt[i] != ft[i]) { matchOK = 0; break }
}
}' "$CSV"
if (!matchOK) next
matchLen = n_rt
if (matchLen > 0) {
if (matchLen > bestScore) {
bestScore = matchLen
bestCode = $2
ambiguous = 0
} else if (matchLen == bestScore) {
# Fler rader med samma bästa längd => tvetydigt
ambiguous = 1
}
}
}
END {
if (bestScore > 0 && !ambiguous && length(bestCode) > 0) {
c = bestCode
gsub(/^[ \t]+|[ \t]+$/, "", c)
print c
}
}
' "$CSV"
)"
if [[ -z "$code" ]]; then
echo "Ingen kod för \"$name\" hittades i $CSV (fil: $base)" >&2
return 1
echo "Ingen unik match för filen: $base" >&2
return 0
fi
code_us="${code// /_}"
# Bygg prefix med paddad index:
# förväntat format: t.ex. "WUNF 1", "WUNF 88", "WUNF 427"
local trimmed_code prefix number number_padded code_us
trimmed_code="$(printf '%s' "$code" | sed -E 's/^[[:space:]]+|[[:space:]]+$//g')"
if [[ "$trimmed_code" =~ ^([A-Za-z]+)[[:space:]]*([0-9]+)$ ]]; then
prefix="${BASH_REMATCH[1]}"
number="${BASH_REMATCH[2]}"
printf -v number_padded "%03d" "$number"
code_us="${prefix}_${number_padded}"
else
# Fallback om formatet skulle avvika använd gammal logik
code_us="${trimmed_code// /_}"
fi
# Ersätt bara själva prefixet [WUNF] i början
newbase="$(printf '%s' "$base" | sed -E "s/^\[WUNF\]/[$code_us]/")"
newpath="$dir/$newbase"
if [[ "$base" == "$newbase" ]]; then
echo "Hoppar över (redan rätt namn): $base" >&2
echo "Hoppar över (redan rätt prefix): $base" >&2
return 0
fi
if [[ -e "$newpath" ]]; then
if [[ -e "$newpath" && $DRY_RUN -eq 0 ]]; then
echo "Fel: Målfilen finns redan: $newpath" >&2
return 1
fi
mv -- "$dir/$base" "$newpath"
echo "Bytt namn:"
echo " Från: $base"
echo " Till: $newbase"
if [[ $DRY_RUN -eq 1 ]]; then
echo "DRY-RUN: skulle byta namn:"
echo " Från: $base"
echo " Till: $newbase"
else
mv -- "$dir/$base" "$newpath"
echo "Bytt namn:"
echo " Från: $base"
echo " Till: $newbase"
fi
}
### Huvudprogram
if [[ $# -lt 1 ]]; then
usage
fi
# Global flagga --dry-run
if [[ "${1:-}" == "--dry-run" ]]; then
DRY_RUN=1
shift
fi
if [[ $# -lt 1 ]]; then
usage
fi
@ -128,14 +218,9 @@ case "$mode" in
exit 1
fi
# Läs en rad i taget; ignorera tomma rader och kommentarer
# Hanterar vägar med mellanslag korrekt
while IFS= read -r line || [[ -n "$line" ]]; do
# Trim CR (om filen är CRLF)
line="${line%$'\r'}"
# Trim whitespace runt
trimmed="$(printf '%s' "$line" | sed -E 's/^[[:space:]]+|[[:space:]]+$//g')"
# Hoppa över tomma rader och kommentarer
[[ -z "$trimmed" || "$trimmed" =~ ^# ]] && continue
rename_file "$trimmed" "$CSV" || true
done < "$LIST"