changes - hope they work
This commit is contained in:
@ -72,7 +72,7 @@ cleanup() {
|
|||||||
trap cleanup EXIT INT TERM
|
trap cleanup EXIT INT TERM
|
||||||
|
|
||||||
echo "==> Steg 1: Scannar och sätter prefix (${PREFIX}) i ${DIR}"
|
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}"
|
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')"
|
escaped_prefix_for_glob="$(printf '%s' "${PREFIX}" | sed -e 's/\[/\\[/g' -e 's/]/\\]/g')"
|
||||||
|
|||||||
@ -12,7 +12,7 @@ set -euo pipefail
|
|||||||
# ---- Defaults ----
|
# ---- Defaults ----
|
||||||
DRY_RUN=0
|
DRY_RUN=0
|
||||||
RECURSIVE=0
|
RECURSIVE=0
|
||||||
PREFIX="PINK_"
|
PREFIX="[WUNF_*]"
|
||||||
DURATION="1.0"
|
DURATION="1.0"
|
||||||
FPS="6"
|
FPS="6"
|
||||||
HUE_MIN="285"
|
HUE_MIN="285"
|
||||||
@ -48,6 +48,13 @@ while [[ $# -gt 0 ]]; do
|
|||||||
esac
|
esac
|
||||||
done
|
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 ----
|
# ---- Helpers ----
|
||||||
print_result() { # $1=status $2=file $3=detail
|
print_result() { # $1=status $2=file $3=detail
|
||||||
printf "%-10s %s%s\n" "$1" "$2" "${3:+ ($3)}"
|
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; }
|
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 ----
|
# ---- File list ----
|
||||||
if [[ $RECURSIVE -eq 1 ]]; then
|
if [[ $RECURSIVE -eq 1 ]]; then
|
||||||
mapfile -t FILES < <(find "$DIR" -type f \( -iname '*.mp4' \))
|
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; }
|
is_mp4 "$f" || { print_result "SKIPPED" "$f" "not mp4"; continue; }
|
||||||
|
|
||||||
base=$(basename -- "$f")
|
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"
|
print_result "SKIPPED" "$f" "already prefixed"
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
@ -144,7 +169,8 @@ for f in "${FILES[@]}"; do
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
awk -v r="$ratio" -v thr="$MIN_RATIO" 'BEGIN{exit !(r>=thr)}' && {
|
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
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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; }
|
cd "$PRE_WORKDIR" 2>/dev/null || { echo "Error: WORKDIR '$PRE_WORKDIR' not accessible" >&2; exit 1; }
|
||||||
fi
|
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
|
# ---- Arg parsing
|
||||||
REF_IMAGE=""
|
REF_IMAGE=""
|
||||||
USER_SET_THRESHOLD="false"
|
USER_SET_THRESHOLD="false"
|
||||||
@ -420,3 +430,7 @@ fi
|
|||||||
for f in "${FILES[@]}"; do
|
for f in "${FILES[@]}"; do
|
||||||
process_file "$f"
|
process_file "$f"
|
||||||
done
|
done
|
||||||
|
|
||||||
|
END_EPOCH=$(date +%s)
|
||||||
|
ELAPSED=$((END_EPOCH - START_EPOCH))
|
||||||
|
echo "=== wcs-frame-match end $(date -Iseconds) (elapsed ${ELAPSED}s) ==="
|
||||||
|
|||||||
@ -7,7 +7,7 @@ set -euo pipefail
|
|||||||
|
|
||||||
BASE_URL="https://www.woodmancastingx.com"
|
BASE_URL="https://www.woodmancastingx.com"
|
||||||
LIST_PATH="/casting-xxx/"
|
LIST_PATH="/casting-xxx/"
|
||||||
OUT_FILE="wcx_index.json"
|
OUT_FILE="/storage/disk1/X/wcx_index.json"
|
||||||
END_PAGE=47
|
END_PAGE=47
|
||||||
SLEEP_MS=300
|
SLEEP_MS=300
|
||||||
DRY_RUN=0
|
DRY_RUN=0
|
||||||
|
|||||||
@ -2,13 +2,13 @@
|
|||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
CSV_DEFAULT="wunf_scenes.csv"
|
CSV_DEFAULT="wunf_scenes.csv"
|
||||||
|
DRY_RUN=0
|
||||||
|
|
||||||
usage() {
|
usage() {
|
||||||
echo "Användning:"
|
echo "Användning:"
|
||||||
echo " $0 <filnamn> [csv-fil]"
|
echo " $0 [--dry-run] <filnamn> [csv-fil]"
|
||||||
echo " $0 --all <katalog> [csv-fil]"
|
echo " $0 [--dry-run] --all <katalog> [csv-fil]"
|
||||||
echo " $0 --list <textfil> [csv-fil] # en väg per rad"
|
echo " $0 [--dry-run] --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"
|
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -16,77 +16,167 @@ rename_file() {
|
|||||||
local FILE="$1"
|
local FILE="$1"
|
||||||
local CSV="$2"
|
local CSV="$2"
|
||||||
|
|
||||||
local base dir rest first second remainder name code code_us newbase newpath
|
|
||||||
|
|
||||||
if [[ ! -f "$FILE" ]]; then
|
if [[ ! -f "$FILE" ]]; then
|
||||||
echo "Fel: Filen finns inte: $FILE" >&2
|
echo "Fel: Filen finns inte: $FILE" >&2
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
local base dir rest name_segment code newbase newpath
|
||||||
|
|
||||||
base="$(basename -- "$FILE")"
|
base="$(basename -- "$FILE")"
|
||||||
dir="$(dirname -- "$FILE")"
|
dir="$(dirname -- "$FILE")"
|
||||||
|
|
||||||
# Kontrollera prefix
|
# Hoppa över om den redan har index, t.ex. [WUNF_427]...
|
||||||
if [[ "$base" != "[WUNF]"* ]]; then
|
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
|
echo "Hoppar över (ej [WUNF]-prefix): $base" >&2
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Plocka ut allt efter prefixet [WUNF]_
|
# Ta bort prefixet "[WUNF]"
|
||||||
rest="${base#"[WUNF]"}"
|
rest="${base:6}"
|
||||||
rest="${rest#_}"
|
|
||||||
|
|
||||||
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
|
# Ta bort extension (.mp4, .mkv osv)
|
||||||
echo "Fel: Kunde inte extrahera två namn-delar i: $base" >&2
|
name_segment="${rest%.*}"
|
||||||
return 1
|
|
||||||
|
if [[ -z "$name_segment" ]]; then
|
||||||
|
echo "Ingen namn-del efter prefix i: $base" >&2
|
||||||
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Namn = två första token, med '_' -> ' '
|
# Slå upp kod i CSV via tokeniserad matchning
|
||||||
name="${first//_/ } ${second//_/ }"
|
|
||||||
name="$(printf '%s' "$name" | sed -E 's/^[[:space:]]+|[[:space:]]+$//g')"
|
|
||||||
|
|
||||||
# slå upp i CSV (format Namn;Kod;Tid)
|
|
||||||
code="$(
|
code="$(
|
||||||
awk -F';' -v target="$name" '
|
awk -F';' -v fstring="$name_segment" '
|
||||||
BEGIN{IGNORECASE=1}
|
BEGIN {
|
||||||
{
|
# 1) Tokenisera filnamnets namn-del
|
||||||
n=$1; gsub(/^[ \t]+|[ \t]+$/, "", n);
|
s = fstring
|
||||||
if (n==target) {
|
gsub(/_+/, " ", s) # "_" -> mellanslag
|
||||||
c=$2; gsub(/^[ \t]+|[ \t]+$/, "", c);
|
gsub(/[[:space:]]+/, " ", s) # normalisera whitespace
|
||||||
print c; exit
|
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
|
||||||
}
|
}
|
||||||
}' "$CSV"
|
{
|
||||||
|
# 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 }
|
||||||
|
}
|
||||||
|
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
|
if [[ -z "$code" ]]; then
|
||||||
echo "Ingen kod för \"$name\" hittades i $CSV (fil: $base)" >&2
|
echo "Ingen unik match för filen: $base" >&2
|
||||||
return 1
|
return 0
|
||||||
fi
|
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]/")"
|
newbase="$(printf '%s' "$base" | sed -E "s/^\[WUNF\]/[$code_us]/")"
|
||||||
newpath="$dir/$newbase"
|
newpath="$dir/$newbase"
|
||||||
|
|
||||||
if [[ "$base" == "$newbase" ]]; then
|
if [[ "$base" == "$newbase" ]]; then
|
||||||
echo "Hoppar över (redan rätt namn): $base" >&2
|
echo "Hoppar över (redan rätt prefix): $base" >&2
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -e "$newpath" ]]; then
|
if [[ -e "$newpath" && $DRY_RUN -eq 0 ]]; then
|
||||||
echo "Fel: Målfilen finns redan: $newpath" >&2
|
echo "Fel: Målfilen finns redan: $newpath" >&2
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [[ $DRY_RUN -eq 1 ]]; then
|
||||||
|
echo "DRY-RUN: skulle byta namn:"
|
||||||
|
echo " Från: $base"
|
||||||
|
echo " Till: $newbase"
|
||||||
|
else
|
||||||
mv -- "$dir/$base" "$newpath"
|
mv -- "$dir/$base" "$newpath"
|
||||||
echo "Bytt namn:"
|
echo "Bytt namn:"
|
||||||
echo " Från: $base"
|
echo " Från: $base"
|
||||||
echo " Till: $newbase"
|
echo " Till: $newbase"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
### Huvudprogram
|
### 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
|
if [[ $# -lt 1 ]]; then
|
||||||
usage
|
usage
|
||||||
fi
|
fi
|
||||||
@ -128,14 +218,9 @@ case "$mode" in
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
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
|
while IFS= read -r line || [[ -n "$line" ]]; do
|
||||||
# Trim CR (om filen är CRLF)
|
|
||||||
line="${line%$'\r'}"
|
line="${line%$'\r'}"
|
||||||
# Trim whitespace runt
|
|
||||||
trimmed="$(printf '%s' "$line" | sed -E 's/^[[:space:]]+|[[:space:]]+$//g')"
|
trimmed="$(printf '%s' "$line" | sed -E 's/^[[:space:]]+|[[:space:]]+$//g')"
|
||||||
# Hoppa över tomma rader och kommentarer
|
|
||||||
[[ -z "$trimmed" || "$trimmed" =~ ^# ]] && continue
|
[[ -z "$trimmed" || "$trimmed" =~ ^# ]] && continue
|
||||||
rename_file "$trimmed" "$CSV" || true
|
rename_file "$trimmed" "$CSV" || true
|
||||||
done < "$LIST"
|
done < "$LIST"
|
||||||
|
|||||||
Reference in New Issue
Block a user