From 335aa54621db5351f590bd1bf89c4b9e470287eb Mon Sep 17 00:00:00 2001 From: Urban Date: Sat, 14 Mar 2026 11:13:56 +0100 Subject: [PATCH] changes - hope they work --- run_wunf.sh | 2 +- scan_and_prefix_pink.sh | 32 +++++++- wcs-frame-match.sh | 14 ++++ wcx_sync.sh | 2 +- wunf_upd_prefix.sh | 167 ++++++++++++++++++++++++++++++---------- 5 files changed, 171 insertions(+), 46 deletions(-) diff --git a/run_wunf.sh b/run_wunf.sh index b62a4d9..7492262 100755 --- a/run_wunf.sh +++ b/run_wunf.sh @@ -72,7 +72,7 @@ cleanup() { trap cleanup EXIT INT TERM echo "==> Steg 1: Scannar och sätter prefix (${PREFIX}) i ${DIR}" -"$SCAN_SCRIPT" "$DIR" --prefix "$PREFIX" +"$SCAN_SCRIPT" "$DIR" echo "==> Steg 2: Skapar fil-lista för filer med prefix (${PREFIX}) och .${EXT}" escaped_prefix_for_glob="$(printf '%s' "${PREFIX}" | sed -e 's/\[/\\[/g' -e 's/]/\\]/g')" diff --git a/scan_and_prefix_pink.sh b/scan_and_prefix_pink.sh index 8440673..01db486 100755 --- a/scan_and_prefix_pink.sh +++ b/scan_and_prefix_pink.sh @@ -12,7 +12,7 @@ set -euo pipefail # ---- Defaults ---- DRY_RUN=0 RECURSIVE=0 -PREFIX="PINK_" +PREFIX="[WUNF_*]" DURATION="1.0" FPS="6" HUE_MIN="285" @@ -48,6 +48,13 @@ while [[ $# -gt 0 ]]; do esac done +# ---- Derived rename prefix ---- +RENAME_PREFIX="$PREFIX" +# Om PREFIX har formen [TEXT_*] (t.ex. [WUNF_*]) så gör vi rename-prefix = [TEXT]_ +if [[ "$PREFIX" =~ ^\[([^][]+)_\*\]$ ]]; then + RENAME_PREFIX="[${BASH_REMATCH[1]}]_" +fi + # ---- Helpers ---- print_result() { # $1=status $2=file $3=detail printf "%-10s %s%s\n" "$1" "$2" "${3:+ ($3)}" @@ -114,6 +121,23 @@ detect_pink() { # $1=file -> echoes "total pink ratio" is_mp4() { case "$1" in *.mp4|*.MP4) return 0;; *) return 1;; esac; } +# Prefix-match med optional * = 1–3 siffror +is_prefixed() { # $1=basename $2=prefix + local base="$1" prefix="$2" + + # Special handling for patterns like [TEXT_*] + if [[ "$prefix" =~ ^\[([^][]+)_\*\]$ ]]; then + local tag="${BASH_REMATCH[1]}" + # Already-prefixed means: [TAG]_... or [TAG_###]_... at the start + local re="^\[$tag(_[0-9]{1,3})?]_" + [[ "$base" =~ $re ]] + else + # Fallback: simple "starts with prefix" + [[ "$base" == "$prefix"* ]] + fi +} + + # ---- File list ---- if [[ $RECURSIVE -eq 1 ]]; then mapfile -t FILES < <(find "$DIR" -type f \( -iname '*.mp4' \)) @@ -132,7 +156,8 @@ for f in "${FILES[@]}"; do is_mp4 "$f" || { print_result "SKIPPED" "$f" "not mp4"; continue; } base=$(basename -- "$f") - if [[ "$base" == "$PREFIX"* ]]; then + # Matchning använder PREFIX (med * → 1–3 siffror) + if is_prefixed "$base" "$PREFIX"; then print_result "SKIPPED" "$f" "already prefixed" continue fi @@ -144,7 +169,8 @@ for f in "${FILES[@]}"; do fi awk -v r="$ratio" -v thr="$MIN_RATIO" 'BEGIN{exit !(r>=thr)}' && { - safe_rename "$f" "$PREFIX" + # Omdöpning använder RENAME_PREFIX (t.ex. [WUNF]_) + safe_rename "$f" "$RENAME_PREFIX" continue } diff --git a/wcs-frame-match.sh b/wcs-frame-match.sh index d13d7e5..3135277 100755 --- a/wcs-frame-match.sh +++ b/wcs-frame-match.sh @@ -74,6 +74,16 @@ if [[ -n "$PRE_WORKDIR" ]]; then cd "$PRE_WORKDIR" 2>/dev/null || { echo "Error: WORKDIR '$PRE_WORKDIR' not accessible" >&2; exit 1; } fi +# --- Logging setup (per-day log file) +LOG_BASE="${LOGDIR:-"$HOME/log/wcs-match"}" +mkdir -p "$LOG_BASE" +LOG_FILE="$LOG_BASE/log.$(date +%Y-%m-%d).txt" +# Append all subsequent output to the log file +exec >>"$LOG_FILE" 2>&1 + +START_EPOCH=$(date +%s) +echo "=== wcs-frame-match start $(date -Iseconds) (PWD=$(pwd)) ===" + # ---- Arg parsing REF_IMAGE="" USER_SET_THRESHOLD="false" @@ -420,3 +430,7 @@ fi for f in "${FILES[@]}"; do process_file "$f" done + +END_EPOCH=$(date +%s) +ELAPSED=$((END_EPOCH - START_EPOCH)) +echo "=== wcs-frame-match end $(date -Iseconds) (elapsed ${ELAPSED}s) ===" diff --git a/wcx_sync.sh b/wcx_sync.sh index 9702b45..a887940 100755 --- a/wcx_sync.sh +++ b/wcx_sync.sh @@ -7,7 +7,7 @@ set -euo pipefail BASE_URL="https://www.woodmancastingx.com" LIST_PATH="/casting-xxx/" -OUT_FILE="wcx_index.json" +OUT_FILE="/storage/disk1/X/wcx_index.json" END_PAGE=47 SLEEP_MS=300 DRY_RUN=0 diff --git a/wunf_upd_prefix.sh b/wunf_upd_prefix.sh index db6ff12..2da6d85 100755 --- a/wunf_upd_prefix.sh +++ b/wunf_upd_prefix.sh @@ -2,13 +2,13 @@ set -euo pipefail CSV_DEFAULT="wunf_scenes.csv" +DRY_RUN=0 usage() { echo "Användning:" - echo " $0 [csv-fil]" - echo " $0 --all [csv-fil]" - echo " $0 --list [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] [csv-fil]" + echo " $0 [--dry-run] --all [csv-fil]" + echo " $0 [--dry-run] --list [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"