7 Commits

Author SHA1 Message Date
096b99f376 chore: ignore local Claude Code settings
.claude/settings.local.json was only excluded by a machine-global
ignore file, so it would be trackable in any fresh clone. It holds
machine-local state (including the internal Gitea host), so ignore
it from the repo itself. Also cover the .tmp.* files written during
atomic saves, which otherwise break `git add -A`.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 12:59:03 +00:00
37ec549544 v5: standalone Tauri rewrite — Rust backend + TypeScript UI
Complete rewrite from the Python/Tkinter app to a native Tauri 2 desktop
app. Drops the song-detection feature, so it needs no Python and no ML
model — just ffmpeg. Replaces video_concat.py entirely.

- Rust backend (src-tauri): stream-copy concat via ffmpeg with honest
  real-time progress (-progress pipe:1, out_time vs total duration), held
  at 99% through the +faststart finalising pass so the bar never jumps
- ffprobe duration scanning parallelised across threads; cancel kills the
  whole ffmpeg process tree; CREATE_NO_WINDOW hides console flashes
- BiliBili Live filename helper ported to Rust (bililive_rename)
- TypeScript UI, no framework: tiny h() DOM helper, drag-and-drop,
  reorderable/checkable file list with live totals, light/dark theme,
  reusable toast + progress components
- Optional delete-originals-after-merge with a clear warning
- New app icon (three clips merging into one); build.bat assembles a
  portable folder with ffmpeg/ffprobe bundled next to the exe
- Ignore tauri-generated gen/schemas (regenerated on every build)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 22:24:59 +08:00
3261a461cb v4.1: BiliBili Live filename auto-rename
- Add a ' Rename' button and live preview to the Output Settings section
- Convert BiliBili Live recording stems of the form
  '[YYYY-MM-DD HH-MM-SS][streamer][title]' into
  'YYYY年MM月DD日【直播回放】title'
- Preview shows the converted result and enables/disables the button based
  on whether the current name matches the pattern
- On auto-fill, keep the raw stem (no '_concat' suffix) so the pattern can
  match; strip a trailing '_concat' before matching as well

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 13:27:37 +00:00
a35b2c6498 v4: production rewrite — real progress, durations, richer UX
Complete rewrite of the application. Highlights:

- Real progress bar driven by ffmpeg '-progress pipe:1' (out_time_ms vs
  total duration), held at 99% until 'progress=end' then snapped to 100%
  so the bar no longer jumps/catches up at the finish
- ffprobe-based per-file duration scanning in background threads, cached
  per item; running total shown; probes parallelised (one thread per file)
- No console/bash windows on Windows: CREATE_NO_WINDOW on all subprocesses
- Optional drag-and-drop via tkinterdnd2 with a graceful fallback
- Card-based scrollable UI with rows of (# index, checkbox, name, duration),
  per-row activate/highlight, plus Move Up/Down/Remove/Select All/Select None
- Output settings: name + extension dropdown + directory, with live output
  path preview
- Start/Stop control: terminate ffmpeg and delete the partial output on stop;
  overwrite, name-conflict, and single-file guards before starting
- Elapsed / ETA / speed readout, collapsible ffmpeg log, light/dark toggle
- Locate ffmpeg/ffprobe next to the exe/script (PyInstaller-friendly) then PATH
- Output hardening: -movflags +faststart and -nostdin

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 13:27:37 +00:00
f8499e9668 v3: drag-to-reorder and DPI scaling
- Replace the Move Up/Down buttons with click-and-drag reordering in the list
- DPI-aware sizing: derive a base font from screen DPI and scale Tk
- Listbox now fills and expands; entry and labels stretch to full width
- Re-check the name conflict when the output directory changes too
- Streamlined three-section layout

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 13:27:18 +00:00
a3fe0fcf65 v2.1: rewrite on CustomTkinter with safer ffmpeg handling
- Migrate the UI from tkinter to customtkinter (themed, system appearance)
- Detect ffmpeg via shutil.which; warn and disable concat if it's missing
- Auto-fill the output name from the first selected file
- Inline output-name conflict detection against the source files, with a
  live red warning and the button disabled while a conflict exists
- Escape paths in the concat list file (quotes/backslashes), write as UTF-8
- Run ffmpeg with explicit -c:v copy / -c:a copy and surface stderr on error
- Re-enable the button and clean up file_list.txt on every exit path

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 13:27:18 +00:00
c26a8fc235 Initial version: basic Tkinter video concatenator
- Plain tkinter GUI: file picker, listbox of selected videos
- Move Up / Move Down buttons to reorder the sequence
- Output name entry + output directory chooser
- Optional 'delete originals after concatenation' checkbox
- Concatenates with the ffmpeg concat demuxer (-c copy) on a worker thread
- Crude fixed time estimate (5s-per-file countdown before running ffmpeg)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 13:26:59 +00:00