vidgrab-studio 4.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. vidgrab_studio-4.1.0/.gitignore +24 -0
  2. vidgrab_studio-4.1.0/CHANGELOG.md +217 -0
  3. vidgrab_studio-4.1.0/LICENSE +21 -0
  4. vidgrab_studio-4.1.0/PKG-INFO +130 -0
  5. vidgrab_studio-4.1.0/README.md +98 -0
  6. vidgrab_studio-4.1.0/assets/NotoSansTC-Regular.otf +0 -0
  7. vidgrab_studio-4.1.0/assets/flags/tw.png +0 -0
  8. vidgrab_studio-4.1.0/assets/flags/us.png +0 -0
  9. vidgrab_studio-4.1.0/assets/icon.ico +0 -0
  10. vidgrab_studio-4.1.0/assets/icon.png +0 -0
  11. vidgrab_studio-4.1.0/docs/icon.png +0 -0
  12. vidgrab_studio-4.1.0/ffmpeg/pin.json +39 -0
  13. vidgrab_studio-4.1.0/pyproject.toml +74 -0
  14. vidgrab_studio-4.1.0/pytest.ini +3 -0
  15. vidgrab_studio-4.1.0/scripts/build.bat +85 -0
  16. vidgrab_studio-4.1.0/scripts/build.ps1 +52 -0
  17. vidgrab_studio-4.1.0/scripts/fetch_ffmpeg.py +36 -0
  18. vidgrab_studio-4.1.0/scripts/generate_icon.py +42 -0
  19. vidgrab_studio-4.1.0/scripts/write_version_info.py +67 -0
  20. vidgrab_studio-4.1.0/tests/conftest.py +6 -0
  21. vidgrab_studio-4.1.0/tests/test_app.py +19 -0
  22. vidgrab_studio-4.1.0/tests/test_captions.py +451 -0
  23. vidgrab_studio-4.1.0/tests/test_cli.py +42 -0
  24. vidgrab_studio-4.1.0/tests/test_cuda_runtime.py +119 -0
  25. vidgrab_studio-4.1.0/tests/test_downloader.py +814 -0
  26. vidgrab_studio-4.1.0/tests/test_ffmpeg_fetch.py +109 -0
  27. vidgrab_studio-4.1.0/tests/test_gpu.py +123 -0
  28. vidgrab_studio-4.1.0/tests/test_gui_smoke.py +1861 -0
  29. vidgrab_studio-4.1.0/tests/test_i18n.py +55 -0
  30. vidgrab_studio-4.1.0/tests/test_icon.py +65 -0
  31. vidgrab_studio-4.1.0/tests/test_integration.py +124 -0
  32. vidgrab_studio-4.1.0/tests/test_jobs.py +53 -0
  33. vidgrab_studio-4.1.0/tests/test_network.py +54 -0
  34. vidgrab_studio-4.1.0/tests/test_studio.py +702 -0
  35. vidgrab_studio-4.1.0/tests/test_ytdlp_update.py +132 -0
  36. vidgrab_studio-4.1.0/vidgrab/__init__.py +8 -0
  37. vidgrab_studio-4.1.0/vidgrab/__main__.py +6 -0
  38. vidgrab_studio-4.1.0/vidgrab/_version.py +3 -0
  39. vidgrab_studio-4.1.0/vidgrab/app.py +4227 -0
  40. vidgrab_studio-4.1.0/vidgrab/captions.py +804 -0
  41. vidgrab_studio-4.1.0/vidgrab/cli.py +73 -0
  42. vidgrab_studio-4.1.0/vidgrab/cuda_runtime.py +184 -0
  43. vidgrab_studio-4.1.0/vidgrab/downloader.py +1451 -0
  44. vidgrab_studio-4.1.0/vidgrab/downloads_panel.py +385 -0
  45. vidgrab_studio-4.1.0/vidgrab/ffmpeg_fetch.py +152 -0
  46. vidgrab_studio-4.1.0/vidgrab/gpu.py +196 -0
  47. vidgrab_studio-4.1.0/vidgrab/i18n.py +1200 -0
  48. vidgrab_studio-4.1.0/vidgrab/icon.py +396 -0
  49. vidgrab_studio-4.1.0/vidgrab/jobs.py +103 -0
  50. vidgrab_studio-4.1.0/vidgrab/network.py +73 -0
  51. vidgrab_studio-4.1.0/vidgrab/pick_dialogs.py +308 -0
  52. vidgrab_studio-4.1.0/vidgrab/preview.py +1412 -0
  53. vidgrab_studio-4.1.0/vidgrab/split_dialog.py +324 -0
  54. vidgrab_studio-4.1.0/vidgrab/studio.py +1582 -0
  55. vidgrab_studio-4.1.0/vidgrab/studio_page.py +4952 -0
  56. vidgrab_studio-4.1.0/vidgrab/ytdlp_update.py +210 -0
@@ -0,0 +1,24 @@
1
+ .venv/
2
+ venv/
3
+ __pycache__/
4
+ *.py[cod]
5
+ build/
6
+ dist/
7
+ *.spec.bak
8
+ *.egg-info/
9
+ .DS_Store
10
+ Thumbs.db
11
+
12
+ # Large binaries downloaded separately (see ffmpeg/README.txt)
13
+ ffmpeg/ffmpeg.exe
14
+ ffmpeg/ffprobe.exe
15
+ ffmpeg/ffplay.exe
16
+ ffmpeg/win/
17
+ ffmpeg/linux/
18
+ ffmpeg/mac/
19
+ assets/icon.icns
20
+ .pytest_cache/
21
+ .ruff_cache/
22
+
23
+ # Generated at build time by scripts/write_version_info.py
24
+ version_info.txt
@@ -0,0 +1,217 @@
1
+ # Changelog
2
+
3
+ ## 4.1.0
4
+
5
+ Two videos at once, a much more capable Download page, and VidGrab for macOS and pip.
6
+
7
+ ### Starting a pip install
8
+
9
+ - **`vidgrab --info`** shows what the installation has (ffmpeg, auto captions, yt-dlp, Python) and **`vidgrab --help`** / **`--version`** answer in the terminal without opening a window; the README now shows how to start the app from a short Python script too
10
+
11
+ ### Install with pip, and a macOS app
12
+
13
+ - **`pip install vidgrab-studio`** (then `vidgrab`): the same app as a Python package for Windows, Linux and macOS, Python 3.10+. The package carries no ffmpeg and no AI model: ffmpeg is used from `PATH` or downloaded once on first run (with a prompt), speech models come on first use as always. Auto captions are an extra: `pip install "vidgrab-studio[captions]"`; without it the button explains how to add it. A pip install leaves updating yt-dlp to pip, so the in-app updater is hidden there. Publishing to PyPI is wired into the release workflow but off until the repository variable `PYPI_PUBLISH` is `true` and PyPI trusts the repository
14
+ - **macOS app** (`VidGrab-macos-arm64.zip` for Apple silicon, `VidGrab-macos-x64.zip` for Intel): a `VidGrab.app` built by CI. It is not signed, so the first launch needs right-click → Open. ffmpeg is not inside it (the only static build with libass is not redistributable): the app downloads the pinned build once on first use, after asking, and checks its SHA-256. On a Mac, videos can be encoded with Apple VideoToolbox, and speech recognition uses the performance cores. **Built and self-tested by CI on real Apple-silicon and Intel runners (the speech engine and the Studio renders pass there); not yet used by a person on a Mac.**
15
+ - The pinned ffmpeg now also lists the two macOS builds (`ffmpeg/pin.json`, fetched by `vidgrab/ffmpeg_fetch.py`, which `scripts/fetch_ffmpeg.py` uses too)
16
+
17
+ ### Downloads: more formats, sites and control
18
+
19
+ - **Search YouTube from the link box**: type words instead of a link and the button becomes **Search**. The results appear in the page itself, with thumbnails and tick boxes (click anywhere on a row), and **Add to downloads** puts the ticked ones in the link box. Emoji and decorative letters in titles, which the fonts can't draw and used to show as empty boxes, are removed from the titles shown in the window (file names are not changed)
20
+ - **Other sites**: the same link box works for the sites yt-dlp supports (Vimeo, X, Twitch, SoundCloud, Bilibili, Instagram, direct video files and many more); sites that need a login are not supported yet
21
+ - **Audio formats**: besides MP3, **M4A (AAC)**, **Opus**, **FLAC** and **WAV** (the last two are lossless, so they have no bitrate). Pick it next to *Audio*, or set a default in Settings
22
+ - **Exact format**: **Exact format…** lists every resolution / codec / size the video offers (VP9, AV1, 60 fps…) and downloads exactly that one; the sound is added to picture-only formats
23
+ - **Live streams and premieres**: a live video shows *Record this live stream from the start*; a scheduled one waits until it begins. Stopping a recording keeps what was recorded as an MP4. Tested with fakes, not against a real live stream
24
+ - **Subtitles** in 15 languages (Korean, Spanish, French, German, Portuguese, Russian, Indonesian, Vietnamese, Thai, Arabic and Hindi added). A language the video lacks uses YouTube's automatic translation; "too many requests" answers are waited out and retried instead of giving up
25
+ - **Skip videos already downloaded** for playlists and channels (Settings → Downloads), with a list that can be forgotten
26
+ - **Network** settings: speed limit, proxy (HTTP or SOCKS) and retry count
27
+ - **Update yt-dlp without a new VidGrab release** (Settings → Downloads → Download engine): checks PyPI, downloads the new yt-dlp (checksum verified), and uses it after a restart; **Use the built-in version** goes back. A quiet check at start (can be switched off) shows a button on the Download page when one exists. An update that fails to load is switched off automatically, and one made under an older VidGrab is ignored
28
+
29
+ ### Settings
30
+
31
+ - **Pop-up windows are easier to see**: dialogs, message boxes, menus, drop-down lists and tooltips now have a lifted background and a clear outline in both the dark and the light theme
32
+ - Settings is now three tabs — **General**, **Downloads**, **Studio** — so nothing needs scrolling
33
+
34
+ ### Docs
35
+
36
+ - The README is much shorter and written for people who just want to use the app; build and release notes moved to `CONTRIBUTING.md`, the speed measurements to `docs/performance.md`
37
+ - **Demo video and user guide re-recorded for 4.1.0** (5 min 23 s, 33 pages): search, exact format and audio formats, two videos at once, the three Settings tabs, the macOS and pip notes. The guide's screenshots are stored as high-quality JPEG, so it is 5.5 MB instead of 11 MB. The README's main picture shows the current Studio
38
+
39
+ ### Fixed
40
+
41
+ - **The search results panel stayed in the old language** when the app language was changed while it was open
42
+ - **The app could not start on Python 3.10 / 3.11** from source (two f-strings with a backslash inside the braces, valid only from 3.12); the packaged builds were unaffected
43
+ - **MP3s made for "MP4 + MP3" downloads, and trimmed or sped-up MP3s, came out at 64 kbps** whatever you chose (the bitrate was passed to ffmpeg without its "k"); they now use the chosen bitrate
44
+ - **Links to a plain video file** (and other sites whose formats don't report a height) failed with "Requested format is not available" whenever a resolution was chosen; the resolution cap now lets formats of unknown height through
45
+
46
+ ### Two videos at once
47
+
48
+ - **Two videos…** in the Studio plays two videos at the same time in one frame and adds the result to the timeline as a normal clip (trim, subtitles and music work on it as usual). Layouts: **Left | Right**, **Top / Bottom**, **Big + small** and **Picture in picture**, with a live preview of both videos in their places. Choose the frame size (16:9, vertical 9:16 for Shorts / Reels, square; stacked videos start on vertical), the gap between them, whether each video is cropped to fill its space, which sound to keep (both, one, none) and whether it ends with the longer or the shorter video (the shorter one holds its last picture). It starts from the first two clips of the project, with their trims. It encodes on the graphics card when that switch is on, with the usual CPU fallback
49
+
50
+ ## 4.0.0
51
+
52
+ Offline AI captions that use your graphics card, plus a much bigger Studio: per-clip speed, animated and individually styled subtitles, multi-select, export presets and crash recovery.
53
+
54
+ ### Auto captions and graphics cards
55
+
56
+ - **Auto captions**: "Auto captions…" in the Studio turns the speech in the clips into subtitle lines with Whisper, on this computer — nothing is uploaded. Pick the spoken language (or detect it; Chinese can be Traditional or Simplified) and the accuracy: **Fast**, **Balanced** or **Best** (large-v3 turbo). Lines follow the clips' trims, speed and place in the montage; muted clips are skipped. Lines break at sentences, pauses and commas, never inside a word; Chinese lines use spaces instead of commas, as subtitles usually do. Singing over music is still captioned, and Whisper's stock invented lines ("please subscribe…") are dropped. The Render button stops it while it runs; the result is one undo step
57
+ - **Graphics cards for auto captions** — three engines, each falling back to the next if it can't load or fails: **NVIDIA** (CUDA; VidGrab downloads the CUDA 12 cuBLAS / cuDNN libraries once, about 1.3 GB, from NVIDIA's pinned official wheels, so nothing has to be installed), **Intel** graphics (integrated or Arc, through OpenVINO: the *Best* model runs there in 5 s per minute of speech against 19 s on a fast CPU), and the **CPU**. Verified end to end on an Intel Arc 140T; the NVIDIA path is tested with real library downloads and fakes but not on an NVIDIA card
58
+ - **Captions are 5–7× faster on the CPU too**: the old setting used every core, and on laptop chips with performance and efficiency cores that made recognition several times *slower* (one minute of speech: 35 s → 9 s at Balanced). It now uses only the fast cores (read from Windows / Linux), capped at 8 threads
59
+ - **Render on the graphics card**: the video is encoded with NVIDIA NVENC, Intel Quick Sync or AMD AMF when one works (checked by a test encode), the picture quality is the same (SSIM 0.9973 against 0.9975 on a test clip), and a render that fails on the card is redone on the CPU. About 1.5× faster at Balanced and 1.8× at High on a fast laptop CPU, 3× on one with few cores; no gain at Fast
60
+ - **Settings → Hardware**: two switches (render on the graphics card, auto captions on the graphics card; on by default) with a status line saying what was found. **Settings → Storage** shows the downloaded speech models and deletes them
61
+ - **Models are downloaded on demand, not bundled**, to the local cache (`%LOCALAPPDATA%\VidGrab\models` on Windows, `~/.cache/vidgrab/models` on Linux — not the roaming profile): 85 / 260 / 830 MB for Intel graphics, 150 / 490 MB / 1.6 GB for NVIDIA and the CPU
62
+ - **Nothing hangs or crashes when hardware misbehaves**: the graphics-card check is time-limited (a stuck driver counts as "no card"); a render whose graphics encoder stops answering for two minutes is abandoned and redone on the CPU; each captions engine that fails (bad driver, out of memory, corrupt or missing model, no network) hands over to the next, ending on the CPU; a half-downloaded model or CUDA package leaves no partial files and a retry resumes after the last finished package; and quitting while a caption job or hardware check is stuck in a driver no longer aborts the app, nor does it refuse to quit. Basic integrated Intel graphics (under 64 execution units, e.g. UHD 620) are still used when the switch is on, but Settings and the captions dialog say they may be slower than the CPU, so the user decides
63
+ - OpenVINO's analytics (it posts to Google Analytics as soon as it is imported) are switched off, and the package isn't bundled; a test fails if anything touches the network on import
64
+
65
+ ### Studio
66
+
67
+ - **Never lose an edit: autosave and crash recovery.** The Studio keeps a recovery copy of the project while you work; if VidGrab closes without saving (a crash, a power cut), it offers to restore it at the next start
68
+ - **Per-clip speed (0.25×–4×)**: in the Clip panel's Trim tab (0.5× / 1× / 1.5× / 2× or any value). The sound keeps its pitch, the timeline block shrinks or grows to match, transitions and subtitles line up with the sped-up clip, and the preview plays at that speed
69
+ - **Subtitle effects and per-line looks**: a new **Effects** tab per line with entry animations (**Pop**, **Slide up**, **Typewriter**, **Karaoke**) and **Give this line its own look** (its own text colour, background, size and bold); the shared style moved to an **All lines** tab. The preview draws the animations as they will render
70
+ - **Multi-select, copy and paste**: Ctrl+click or drag a box on the timeline to select several clips, subtitles and pictures; move them together, delete them, or copy (Ctrl+C) and paste them at the playhead (Ctrl+V), keeping their spacing. Ctrl+D duplicates, Ctrl+A selects everything
71
+ - **Guides**: a **Guides** button over the preview shows the centre lines and the 5 % safe area; dragged subtitles and pictures snap to them (Alt = free)
72
+ - **Export presets**: the Project panel picks what to make — **YouTube (1080p)**, **Shorts / Reels / TikTok** (vertical, with a reminder when the video is over 60 s), **Square (1:1)**, **Same as the clips**, **GIF** or **Audio only (MP3)** — with the matching resolution and file type
73
+ - The Clip panel is split into **Trim**, **Transition** and **Picture and sound** tabs, so it fits without scrolling
74
+ - The Studio toolbar buttons are shorter ("+ Media…", "♪ Music…") so the row fits in a small window
75
+ - **Subtitles fit vertical and square videos**: their size now follows the *shorter* side of the frame (it followed the height, so text in a 9:16 video came out about twice too big), and long lines are wrapped to the frame width, in the preview and in the render alike. Chinese lines have no spaces for the renderer to break at, so a long caption used to run off both sides of a vertical video. Landscape videos are unchanged
76
+
77
+ ### Downloads and releases
78
+
79
+ - **Downloads retry over IPv4 when the network is unreachable**: on networks (and CI runners) with IPv6 but no route for it, YouTube downloads and link previews failed with "Network is unreachable"; they now retry the same way over IPv4
80
+ - **New demo video and user guide** (繁體中文) for 4.0: auto captions on the graphics card, speed, subtitle effects, guides, export presets and the Hardware settings; recorded on a real Intel Arc GPU
81
+ - **Releases run the tests first**: the release workflow runs the same lint and test suite as CI (Linux and Windows) before building, so a tag can't publish untested code. The checks live in one shared workflow (`checks.yml`) used by both
82
+ - Fixed the trim integration test, which asked for 50 s–110 s of an 8 s video (a four-part time) and so never trimmed; it was hidden because YouTube's bot-check made CI skip it
83
+
84
+ ## 3.3.0
85
+
86
+ - **Images over the video**: "+ Image…" (or drop a picture on the window, or double-click the new **Images** row) shows a picture from the playhead for 4 s, placed by what it is: a cut-out with transparency (a logo, a sticker) small in the top-right corner, a photo as large as fits in the middle (several pictures follow one another). Drag its block in the Images row to change when it shows; in the preview drag the picture to move it, its corner to resize it and the knob above it to **rotate** it (snaps to 0 / 90 / 180 / 270°, Alt = free). The Image panel has start / end, size, opacity, fade in / out, rotation (± 90° buttons), a 3 × 3 position grid and "Fill the frame". Any number of pictures render in the same single ffmpeg pass, under the subtitles; undo and projects include them
87
+ - **The preview shows transitions**: crossfade, dissolve, wipe, slide, circle and zoom are now drawn live in the preview (paused or playing), not just labelled, and the sound crossfades as in the render. A second, hidden player decodes the other clip of a transition for the same preview window
88
+ - **Cut the background music**: the music block now has start / end handles to choose the part of the song that plays, and dragging the block makes the music come in later. When looping, that part repeats (dashed lines mark each pass) and the rest of the song shows faintly behind it. The music panel has exact **Song start**, **Song end** and **Comes in at** fields; undo and projects include them
89
+ - **Several background songs**: "+ Add song…" puts another song on the Music row (right after the previous one); each song has its own part, start time, volume and fade in / out, and overlapping two songs with fades crossfades them. Only the last song loops to the end of the video; the original-audio level and the end fade apply to all music. Projects from 3.2 (one song) still open
90
+ - **Hear the music in the preview**: the play button now plays the background music with the video, as it will be rendered: the chosen part of the song, from its start time, looping, at the music volume, with the original audio turned down and the end fade
91
+ - **Overlapping subtitles (and pictures) stack into lanes**: lines that overlap in time sit one under another in the Subtitles row (which grows to fit) instead of covering each other, so each can be seen, selected and dragged
92
+ - **One pinned ffmpeg everywhere: 9.0.2.** The Windows and Linux executables used to bundle different, unpinned builds (the newest development build on Windows, a 7.x static release on Linux), so behaviour could differ between platforms and change between builds without any code change. Both now ship the same ffmpeg 9.0.2, pinned in `ffmpeg/pin.json` with SHA-256 checks; every CI job tests that exact binary, and `make ffmpeg` gives developers the same one
93
+ - Removed the Studio's **Import .srt / Export .srt** buttons (YouTube subtitles downloaded with a video still come along with "Send to Studio")
94
+ - Headless runs (tests, scripts) never play sound: the download-finished chime is skipped and the preview starts muted
95
+
96
+ ## 3.2.0
97
+
98
+ - **Undo / redo** in the Studio (Ctrl+Z / Ctrl+Y, plus toolbar buttons) for every edit: adding, trimming, splitting, reordering and deleting clips; subtitle text, timing, position and style; background music and its settings. Typing and slider drags count as one step
99
+ - **Projects**: save the Studio timeline as a `.vgproj` file and open it later (Project menu, Ctrl+S / Ctrl+O / Ctrl+N, Open recent). Media paths are stored both absolute and relative to the project file, so a moved folder still opens; missing files are reported and left out. VidGrab asks before discarding unsaved changes, including when you close the window. Dropping a `.vgproj` on the window opens it
100
+ - **Timeline zoom**: Ctrl+wheel (or − / + / Fit) zooms around the mouse; Shift+wheel or the scrollbar pans; the view follows the playhead during playback
101
+ - **Snapping**: trim handles and subtitle blocks snap to the playhead, clip boundaries and other subtitles, with a guide line; hold Alt to drag freely
102
+ - **Keyboard editing**: Space / K play-pause, J / L ±1 s, ← / → one frame, Home / End, I / O trim the clip under the playhead, S split it; a **?** button lists every shortcut
103
+ - **Split clips** at the playhead (✂ Split or S); both halves keep their source times
104
+ - **Transitions between clips**: select a clip to open its new **Clip** panel and pick how it comes in: Cut, Crossfade, Dip to black / white, Dissolve, Wipe, Slide, Circle or Zoom in, with a duration (0.2–3 s) and **Use for all cuts**. The clips overlap on the timeline (marked ✕), the sound crossfades too, and the render uses ffmpeg `xfade`. The preview switches at the middle of a transition, draws dips to black / white, and labels the others while they play
105
+ - **Framing (crop and reframe)**: per clip, **Whole picture** (black bars) or **Fill frame** (crop, no bars), a zoom of 100–300 %, and **drag the picture in the preview** to choose what stays in view. Made for vertical 9:16 and square videos from landscape clips; the preview matches the render
106
+ - **Mute or turn down a clip**: a speaker button on every clip row in the timeline mutes it in one click (red when muted; also `M`), and the Clip panel has Mute plus a 0–200 % volume slider. The preview plays at that level and the render applies it (also in music medleys); saved in projects and undoable
107
+ - **Filmstrip thumbnails**: every tile on a video's timeline block shows the frame at its own time, extracted on demand in the background (zooming in fetches finer frames). Before, one frame was repeated across the block, so a video that fades in from black showed an all-black track, and a short part of a long video showed the same image over and over
108
+ - **Easier trimming**:
109
+ - drag a start / end handle **past the edge** of the timeline and the clip keeps growing (faster the further out you hold it) while the view rescales, so a long clip can be lengthened in one drag instead of many small ones
110
+ - hold **Shift** while dragging for 1/10-speed fine adjustment
111
+ - the Clip panel has **exact Start / End** fields (hundredths) with **−1 s / −1 frame / +1 frame / +1 s** buttons (frame length from the video's own frame rate)
112
+ - **Zoom to clip** (button or Z) zooms the timeline onto the selected clip
113
+ - **Clearer subtitle panel**: Line and Style tabs instead of one long scrolling panel; text and background colours are one-click swatches (with a custom colour picker), and the default position is a Bottom / Top switch
114
+ - **The mouse wheel no longer changes dropdowns, number boxes or sliders** anywhere in the app; it scrolls the panel instead
115
+ - Trims can no longer go past the end of the source (a clip could end up 0 s long)
116
+ - **Preview play button sometimes did nothing**: after jumping into a different clip, the player could report the previous file as loaded, so the jump was lost and the new file played from 0:00 while the playhead and time stayed still. The preview now waits for the new file, re-applies a jump the player drops, and when you jump twice while a file is still loading the newest jump wins
117
+ - Demo video re-recorded and the user guide updated for the new Clip panel (trim, transitions, sound, framing), undo, projects and keyboard shortcuts
118
+ - The clip count / length label under the preview now subtracts transition overlaps, so it matches the preview's total
119
+
120
+ ## 3.1.0
121
+
122
+ - **Settings page** in two columns with five sections:
123
+ - **Download defaults**: save folder, format, video / audio quality, subtitles (language, save or burn), a file-name pattern (title, title + video ID, channel – title, upload date + title), and a sound plus message when the download queue finishes
124
+ - **Studio**: render quality (Fast / Balanced / High quality), default output resolution, and saved subtitle style presets
125
+ - **Storage**: thumbnail cache size and clear, clear download history, export the log file, reset all settings
126
+ - **About**: VidGrab, yt-dlp, ffmpeg, Qt and Python versions
127
+ - **Subtitle style presets**: save the current font, size, colours, background, fade and position from the Studio's subtitle panel and apply them in one click
128
+ - The theme choice is now translated, and the About text describes the current features
129
+ - User guide: fixed list bullets that showed as boxes and added the Settings page; demo video re-recorded with presets and Settings; README rewritten
130
+
131
+
132
+ ## 3.0.0
133
+
134
+ - **Studio (new)** — an editor-style workspace that replaces the Edit page. It fits the window with no scrolling:
135
+ - **Layout**: a large preview on top that plays the finished result (play / pause), an **Inspector** beside it (project, subtitle or music settings), and a **timeline** below in which **every clip has its own row**, plus Subtitles and Music rows. Thumbnails show for video and waveforms for audio
136
+ - **Trimming with two handles**: drag a clip's left handle to choose where it starts and its right handle to choose where it ends. The preview shows the frame under the handle, and the faint area shows the rest of the source. Drag a clip up or down to reorder it
137
+ - **Music medley**: join different songs, or sections of songs, into one MP3 / M4A / WAV with an optional crossfade
138
+ - **Video montage**: join different videos into one MP4. Clips of any size or orientation are fitted to one frame (match the first clip, 1080p / 720p / 480p, vertical 9:16 or square), and clips without sound get silence
139
+ - **Subtitles**: add a line at the playhead, then **drag it in the viewer to position it**. Drag or resize its block on the timeline to retime it. Import / export `.srt`, and set size and colour. Burned in as ASS so the render matches the preview; Chinese renders with the bundled Noto Sans CJK TC
140
+ - **Subtitle colours**: pick the text colour and a background box (none / transparent, black, dark gray, white, yellow, or any custom colour) with adjustable opacity. The preview shows exactly what gets rendered
141
+ - **Subtitle tools**: a 3×3 quick-position grid (alongside dragging), split a line at the playhead, duplicate a line, font choice (bundled CJK font or any installed font, which is handed to ffmpeg so the render matches), bold, and fade in / out
142
+ - **Background music**: mix a song under the montage with separate music / original-audio volume, looping and an end fade-out
143
+ - Drop files anywhere in the window to add them. Rendering shows real progress
144
+ - **Edit page removed**: trimming now lives in the Studio. Flip / speed remain on the Download page. The ffplay-based preview and the bundled `ffplay` binary are gone
145
+ - **Download queue + recent downloads (replaces the log)**: paste several links at once; each download gets a row with thumbnail, progress, speed and ETA, and **Cancel / Retry**. Finished downloads are remembered across restarts with **Send to Studio** (adds the file, and its subtitles, to the Studio timeline). Technical details now go to `vidgrab.log` in the config folder instead of the window
146
+ - **MP4 downloads prefer H.264**: at the chosen resolution VidGrab now picks H.264 over AV1. YouTube often serves AV1 in MP4, which many players (and the Studio preview) can't decode. 1440p / 4K, which exist only as VP9 / AV1, are still downloaded at full resolution
147
+ - **Connection status keeps updating**: the online check used to run once at startup, so starting offline left Download disabled until a restart. It now re-checks every 5 s while offline and every 30 s while online
148
+ - **Several links at once**: pasting a list of links (Ctrl+V or Paste) shows each one in the Video Info card with its thumbnail, title and length (or video count for playlists, with a per-playlist "Download whole playlist" box). Drop any link with ✕ before pressing Download
149
+ - **YouTube subtitles**: optionally download a video's captions (Traditional / Simplified Chinese, English, Japanese; uploaded or auto-generated) as `.srt`, or burn them into the video. Timings follow the trim / speed settings
150
+ - **Download page redesigned**: a link bar with Paste and a large Download button, the video card beside a compact options card, and progress + log below. Nothing scrolls
151
+ - **Navigation rail**: the 212 px sidebar became an 84 px icon rail
152
+ - **Chinese subtitle text**: a Paste button next to the subtitle text (WSL can't pass the Windows IME to Linux apps). ibus is enabled automatically when installed
153
+ - **Redesigned UI**: violet→cyan theme, page headers, rounded cards with accent bars, pill navigation, drawn chevrons and icons (no emoji-font dependency), all generated from one stylesheet template shared by dark and light
154
+ - **Languages**: the UI now ships in **English and 繁體中文** only (the other 10 languages, their flags and the JP/KR fonts were removed; a saved language that no longer exists falls back to English)
155
+ - **Release / CI**:
156
+ - release assets are now `VidGrab-windows-x64.exe`, `VidGrab-linux-x64` (+ `.tar.xz`), the demo video, the zh-TW user guide PDF and `SHA256SUMS.txt`, with notes taken from this changelog
157
+ - the release fails if the tag doesn't match `vidgrab/_version.py`
158
+ - the Linux binary is built on Ubuntu 22.04, so it runs on older distros
159
+ - CI also runs the tests on Windows
160
+ - each build renders Studio projects with the exact ffmpeg it bundles
161
+
162
+ ## 2.3.2
163
+
164
+ - **Full-resolution downloads**: info card and downloads now probe with the `tv_embedded` player client, so video info shows up to 2160p instead of capping at 360p (and 1080p MP4 is a direct mp4 download)
165
+ - **Likes / dislikes / comments**: the info card now shows those counts (dislikes best-effort from the Return YouTube Dislike dataset, skipped gracefully when unavailable)
166
+ - **Reliable trims**: trimming now always downloads the full video and cuts locally with ffmpeg — YouTube's ranged (section) downloads either got HTTP 403 or silently returned the full file, which saved untrimmed videos
167
+ - **Download fallback**: if the high-quality client's media URLs are rejected (403), the download retries with the low-res-but-reliable fallback client instead of failing
168
+ - **Packaged Linux fix**: the Linux binary had `multimedia=0` on clean runners because QtMultimedia links PulseAudio/ALSA/xcb — release and CI builds now install those libraries, and a new CI `integration` job exercises real YouTube downloads on every push
169
+ - **Bigger window** and a redesigned **LOG section** — a proper card, side-by-side Clear button, aligned with the other sections
170
+ - **Interactive finish**: the progress bar animates to a green 100% when a download or processing job completes (upload button shows the saved path)
171
+ - **Flag icons bundled**: all 12 language flags ship as bundled PNGs (no color-emoji font needed)
172
+
173
+ ## 2.3.1
174
+
175
+ - **Fix — inline preview missing from packaged builds**: the Edit-page preview player is back in `VidGrab.exe` / `VidGrab-linux` — the PyInstaller spec excluded `PySide6.QtMultimedia`, so the release binary only offered the ffplay pop-out preview (source builds were unaffected). QtMultimedia is now bundled again, and a hidden `--selftest` flag lets CI verify `multimedia` availability in the packaged binary
176
+
177
+ ## 2.3.0
178
+
179
+ - **Playlist & channel downloads**: paste any playlist/channel URL and download every video in the selected quality (MP4/MP3) with `01 - …` numbering and per-video progress
180
+ - **Video info card**: a preview card on the download page shows the title, uploader, duration and available resolutions (or video count for playlists) before you download
181
+ - **Auto-detect on paste**: pasting a YouTube link instantly probes the video and fills the info card (debounced ~700 ms while typing)
182
+ - **In-window media preview**: the Edit page now includes a preview card — an inline video/sound player with a seek timeline showing the current second, so you can read off the exact trim start/end times; dragging the scrubber jumps straight to that frame
183
+ - **Localization × 12**: the picker now includes Español, Français, Deutsch, Português, Italiano, Русский, Tiếng Việt and Indonesia (each shown with its flag), on top of English, 繁體中文, 日本語 and 한국어
184
+
185
+ ## 2.2.0
186
+
187
+ - **New brand icon**: futuristic cyber-chip design — chamfered tile, electric blue→cyan→violet→magenta gradient, neon outline + glow, play triangle with download chevron, and the "VidGrab" wordmark (shown in README) — committed as assets (no runtime generation)
188
+ - **日本語 (Japanese) and 한국어 (Korean)**: full UI localization bringing the total to 4 languages; Noto Sans CJK JP/KR fonts bundled so both render on every OS
189
+ - **Repo polish**: dedicated long-running session notes moved to `docs/`, build scripts consolidated under `scripts/`, `version_info.txt` now derived from `vidgrab/_version.py`, single `requirements.txt`, dropped the redundant zip artifact
190
+ - **Makefile**: `setup`/`run`/`lint`/`test`/`build`/`clean`/`icon` targets replace `run.sh`
191
+
192
+ ## 2.1.0
193
+
194
+ - **Qt rewrite**: entire GUI rebuilt on PySide6 (Qt 6) replacing CustomTkinter — sidebar + content-panel layout, QSS-styled dark/light themes, proper QStatusBar, professional typography hierarchy
195
+ - **Sidebar navigation**: Download / Edit / Settings pages switch via a left-hand sidebar with icon+label buttons and active accent border
196
+ - **QStatusBar**: connection status, ffmpeg source, and version displayed persistently at the bottom
197
+ - **QSS theming**: hand-crafted dark (deep navy) and light themes with consistent card styling, accent borders, and scrollbar theming
198
+ - **Settings page**: in-app theme combo, about info, version display
199
+ - **Keyboard shortcuts**: Ctrl+V (paste URL), Ctrl+L (clear log), F1 (about)
200
+ - **PyInstaller improvements**: unused Qt modules excluded to reduce bundle size; customtkinter/darkdetect removed
201
+
202
+ ## 2.0.0
203
+
204
+ - **Modern GUI**: rebuilt on CustomTkinter — rounded cards, segmented controls, built-in dark/light theme toggle, tooltip hints, styled modal dialogs, high-DPI support
205
+ - **Internet-aware**: a live ● Online / ○ Offline pill shows connectivity in real time; the download button is disabled and a clean Retry/Exit dialog appears when the machine is offline
206
+ - **Single-pass MP4 + MP3**: selecting both formats now downloads the video once, then derives the MP3 locally — saves ~50 % bandwidth when both are requested
207
+ - **Faster re-encode**: flip-only uses ultrafast x264 (CRF 23) and copies audio streams unchanged
208
+ - **Trim-during-download**: when trimming a YouTube URL, only the wanted section is downloaded when possible; falls back to a full download automatically
209
+ - **Linux binary**: a self-contained x86_64 ELF is now published alongside the Windows exe — same zero-install story for Linux desktops
210
+ - **Project restructured**: code lives in a proper `vidgrab/` Python package (`__version__`, `__main__`)
211
+ - **23 tests** covering output locating, MP3 derivation, local processing, network probe (all mocked), and a GUI smoke test under Xvfb
212
+ - **CI/CD**: GitHub Actions runs lint (ruff), the full test suite including the headless GUI smoke test, builds both Windows and Linux single-file binaries, and publishes all artifacts on tag push
213
+ - CustomTkinter data files bundled correctly by PyInstaller; platform-aware ffmpeg folder layout (`ffmpeg/win/`, `ffmpeg/linux/`)
214
+
215
+ ## 1.0.0
216
+
217
+ - Initial release — single-file Windows exe with embedded ffmpeg
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Coherent17
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,130 @@
1
+ Metadata-Version: 2.5
2
+ Name: vidgrab-studio
3
+ Version: 4.1.0
4
+ Summary: Download videos from YouTube and many other sites, then edit them in a Studio with subtitles, music and AI captions — all on your own computer.
5
+ Project-URL: Homepage, https://github.com/coherent17/VidGrab
6
+ Project-URL: Source, https://github.com/coherent17/VidGrab
7
+ Project-URL: Changelog, https://github.com/coherent17/VidGrab/blob/main/CHANGELOG.md
8
+ Project-URL: Issues, https://github.com/coherent17/VidGrab/issues
9
+ Author: coherent17
10
+ License-Expression: MIT
11
+ License-File: LICENSE
12
+ Keywords: downloader,editor,ffmpeg,pyside6,subtitles,video,whisper,youtube,yt-dlp
13
+ Classifier: Development Status :: 5 - Production/Stable
14
+ Classifier: Environment :: X11 Applications :: Qt
15
+ Classifier: Intended Audience :: End Users/Desktop
16
+ Classifier: Operating System :: MacOS
17
+ Classifier: Operating System :: Microsoft :: Windows
18
+ Classifier: Operating System :: POSIX :: Linux
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Topic :: Multimedia :: Video
21
+ Requires-Python: >=3.10
22
+ Requires-Dist: pyside6>=6.5.0
23
+ Requires-Dist: yt-dlp>=2024.1.0
24
+ Provides-Extra: captions
25
+ Requires-Dist: faster-whisper>=1.1.0; extra == 'captions'
26
+ Requires-Dist: openvino-genai>=2026.1; (sys_platform != 'darwin') and extra == 'captions'
27
+ Provides-Extra: dev
28
+ Requires-Dist: pyinstaller>=6.0.0; extra == 'dev'
29
+ Requires-Dist: pytest>=8.0; extra == 'dev'
30
+ Requires-Dist: ruff>=0.9.0; extra == 'dev'
31
+ Description-Content-Type: text/markdown
32
+
33
+ <div align="center">
34
+
35
+ <img src="https://raw.githubusercontent.com/coherent17/VidGrab/main/docs/icon.png" alt="VidGrab" width="112">
36
+
37
+ # VidGrab
38
+
39
+ **Download videos. Edit them. Caption them with AI. All on your own computer.**
40
+
41
+ Turn a link into a finished video: grab it, cut it, add subtitles (typed, or **written for you from the speech**),
42
+ music and pictures, then export it for YouTube, Shorts, Reels or TikTok. Nothing is uploaded.
43
+
44
+ [![CI](https://github.com/coherent17/VidGrab/actions/workflows/ci.yml/badge.svg)](https://github.com/coherent17/VidGrab/actions/workflows/ci.yml)
45
+ [![Release](https://img.shields.io/github/v/release/coherent17/VidGrab?label=release&color=7c5cff)](https://github.com/coherent17/VidGrab/releases/latest)
46
+ ![Platforms](https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-4c4c4c)
47
+ [![License: MIT](https://img.shields.io/badge/license-MIT-10b981)](LICENSE)
48
+
49
+ [**Download**](https://github.com/coherent17/VidGrab/releases/latest) ·
50
+ [Demo video](https://raw.githubusercontent.com/coherent17/VidGrab/main/docs/VidGrab-demo.mp4) ·
51
+ [User guide (繁體中文)](https://raw.githubusercontent.com/coherent17/VidGrab/main/docs/VidGrab-user-guide-zh-TW.pdf) ·
52
+ [Changelog](CHANGELOG.md)
53
+
54
+ <img src="https://raw.githubusercontent.com/coherent17/VidGrab/main/docs/screenshots/studio.png" alt="VidGrab Studio: preview, inspector and a multi-track timeline" width="900">
55
+
56
+ </div>
57
+
58
+ ---
59
+
60
+ ## What you can do
61
+
62
+ - **Make a Shorts / Reels / TikTok clip** from a long video: trim the best part, pick the vertical format, click **Auto captions**, render.
63
+ - **Subtitle any talk or interview** in about 100 spoken languages, fix a word or two, then burn the subtitles in or keep them as text.
64
+ - **Put two videos side by side** (or stacked, or picture-in-picture) in one frame.
65
+ - **Join clips into a montage or music video** with transitions, per-clip speed, background music and logos.
66
+ - **Download** videos, playlists and music from YouTube and many other sites, as MP4 or MP3 / M4A / Opus / FLAC / WAV.
67
+
68
+ English and 繁體中文, dark and light themes.
69
+
70
+ ## Install
71
+
72
+ | Platform | Get it | Run it |
73
+ |----------|--------|--------|
74
+ | Windows 10 / 11 | `VidGrab-windows-x64.exe` | Double-click |
75
+ | macOS 12+ (Apple silicon or Intel) | `VidGrab-macos-arm64.zip` / `VidGrab-macos-x64.zip` | Unzip, then right-click `VidGrab.app` → **Open** the first time |
76
+ | Linux (x64) | `VidGrab-linux-x64` | `chmod +x VidGrab-linux-x64 && ./VidGrab-linux-x64` |
77
+
78
+ Download from the [latest release](https://github.com/coherent17/VidGrab/releases/latest). On a Mac the app is not signed, so macOS asks you to confirm the first launch, and VidGrab offers to download ffmpeg once.
79
+
80
+ **Or with pip** (Python 3.10+, any system):
81
+
82
+ ```bash
83
+ pipx install vidgrab-studio # for auto captions use "vidgrab-studio[captions]"
84
+ vidgrab # start it; "vidgrab --info" shows what is installed
85
+ ```
86
+
87
+ To start it from your own script:
88
+
89
+ ```python
90
+ from vidgrab.app import main
91
+
92
+ main()
93
+ ```
94
+
95
+ ## Quick start
96
+
97
+ 1. **Download:** copy a video link, click **Paste**, then **Download**. You can also type words to search YouTube.
98
+ 2. **Send to Studio:** click **Send to Studio** next to the finished download.
99
+ 3. **Edit:** drag a clip's edges to trim it, add **+ Subtitle** lines or click **Auto captions…**, add **♪ Music**.
100
+ 4. **Render:** choose an export preset and click **Render**.
101
+
102
+ The [user guide](https://raw.githubusercontent.com/coherent17/VidGrab/main/docs/VidGrab-user-guide-zh-TW.pdf) (繁體中文) shows every page, and the [demo video](https://raw.githubusercontent.com/coherent17/VidGrab/main/docs/VidGrab-demo.mp4) walks through the whole flow.
103
+
104
+ ## Good to know
105
+
106
+ - **Auto captions** run on your computer with Whisper: no account, no upload. The speech model (85 MB to 1.6 GB) is downloaded once, the first time you use it. It uses an Intel or NVIDIA graphics card when there is one ([speed numbers](https://raw.githubusercontent.com/coherent17/VidGrab/main/docs/performance.md)).
107
+ - **Rendering** can use your graphics card (Intel, NVIDIA, AMD, Apple) and falls back to the CPU on its own. See **Settings → Hardware**.
108
+ - **Settings** has three tabs: General, Downloads (defaults, speed limit, proxy, updating the download engine) and Studio.
109
+ - **Privacy:** VidGrab only connects to download what you ask for (the video site, and the speech model the first time you use captions). Your projects and captions never leave your computer.
110
+
111
+ ## Troubleshooting
112
+
113
+ | Problem | Fix |
114
+ |---------|-----|
115
+ | "Video unavailable" or a download error | Sites change often. Update the download engine in **Settings → Downloads**, or update VidGrab (pip: `pip install -U yt-dlp`) |
116
+ | Downloaded at only 360p | The site refused the high-quality stream. Try again later |
117
+ | Auto captions are slow | Pick **Fast** or **Balanced**, and keep **Settings → Hardware → auto captions on the graphics card** on |
118
+ | Can't type Chinese on Linux / WSL | Paste the text instead, or install ibus: `sudo apt install ibus ibus-chewing` |
119
+ | Antivirus warning | Common with this kind of app: add an exception |
120
+ | Won't start on Linux | Needs a desktop session and Qt's libraries: `sudo apt install libegl1 libxkbcommon0 libxcb-cursor0` |
121
+
122
+ Something else? [Open an issue](https://github.com/coherent17/VidGrab/issues).
123
+
124
+ ## For developers
125
+
126
+ Building from source, tests and releases: [CONTRIBUTING.md](CONTRIBUTING.md).
127
+
128
+ ## License
129
+
130
+ [MIT](LICENSE). Built with [yt-dlp](https://github.com/yt-dlp/yt-dlp), [FFmpeg](https://ffmpeg.org), [PySide6 (Qt)](https://doc.qt.io/qtforpython/), [Whisper](https://github.com/openai/whisper) and [Noto Sans CJK](https://github.com/notofonts/noto-cjk). Only download content you have the right to use.
@@ -0,0 +1,98 @@
1
+ <div align="center">
2
+
3
+ <img src="docs/icon.png" alt="VidGrab" width="112">
4
+
5
+ # VidGrab
6
+
7
+ **Download videos. Edit them. Caption them with AI. All on your own computer.**
8
+
9
+ Turn a link into a finished video: grab it, cut it, add subtitles (typed, or **written for you from the speech**),
10
+ music and pictures, then export it for YouTube, Shorts, Reels or TikTok. Nothing is uploaded.
11
+
12
+ [![CI](https://github.com/coherent17/VidGrab/actions/workflows/ci.yml/badge.svg)](https://github.com/coherent17/VidGrab/actions/workflows/ci.yml)
13
+ [![Release](https://img.shields.io/github/v/release/coherent17/VidGrab?label=release&color=7c5cff)](https://github.com/coherent17/VidGrab/releases/latest)
14
+ ![Platforms](https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-4c4c4c)
15
+ [![License: MIT](https://img.shields.io/badge/license-MIT-10b981)](LICENSE)
16
+
17
+ [**Download**](https://github.com/coherent17/VidGrab/releases/latest) ·
18
+ [Demo video](docs/VidGrab-demo.mp4) ·
19
+ [User guide (繁體中文)](docs/VidGrab-user-guide-zh-TW.pdf) ·
20
+ [Changelog](CHANGELOG.md)
21
+
22
+ <img src="docs/screenshots/studio.png" alt="VidGrab Studio: preview, inspector and a multi-track timeline" width="900">
23
+
24
+ </div>
25
+
26
+ ---
27
+
28
+ ## What you can do
29
+
30
+ - **Make a Shorts / Reels / TikTok clip** from a long video: trim the best part, pick the vertical format, click **Auto captions**, render.
31
+ - **Subtitle any talk or interview** in about 100 spoken languages, fix a word or two, then burn the subtitles in or keep them as text.
32
+ - **Put two videos side by side** (or stacked, or picture-in-picture) in one frame.
33
+ - **Join clips into a montage or music video** with transitions, per-clip speed, background music and logos.
34
+ - **Download** videos, playlists and music from YouTube and many other sites, as MP4 or MP3 / M4A / Opus / FLAC / WAV.
35
+
36
+ English and 繁體中文, dark and light themes.
37
+
38
+ ## Install
39
+
40
+ | Platform | Get it | Run it |
41
+ |----------|--------|--------|
42
+ | Windows 10 / 11 | `VidGrab-windows-x64.exe` | Double-click |
43
+ | macOS 12+ (Apple silicon or Intel) | `VidGrab-macos-arm64.zip` / `VidGrab-macos-x64.zip` | Unzip, then right-click `VidGrab.app` → **Open** the first time |
44
+ | Linux (x64) | `VidGrab-linux-x64` | `chmod +x VidGrab-linux-x64 && ./VidGrab-linux-x64` |
45
+
46
+ Download from the [latest release](https://github.com/coherent17/VidGrab/releases/latest). On a Mac the app is not signed, so macOS asks you to confirm the first launch, and VidGrab offers to download ffmpeg once.
47
+
48
+ **Or with pip** (Python 3.10+, any system):
49
+
50
+ ```bash
51
+ pipx install vidgrab-studio # for auto captions use "vidgrab-studio[captions]"
52
+ vidgrab # start it; "vidgrab --info" shows what is installed
53
+ ```
54
+
55
+ To start it from your own script:
56
+
57
+ ```python
58
+ from vidgrab.app import main
59
+
60
+ main()
61
+ ```
62
+
63
+ ## Quick start
64
+
65
+ 1. **Download:** copy a video link, click **Paste**, then **Download**. You can also type words to search YouTube.
66
+ 2. **Send to Studio:** click **Send to Studio** next to the finished download.
67
+ 3. **Edit:** drag a clip's edges to trim it, add **+ Subtitle** lines or click **Auto captions…**, add **♪ Music**.
68
+ 4. **Render:** choose an export preset and click **Render**.
69
+
70
+ The [user guide](docs/VidGrab-user-guide-zh-TW.pdf) (繁體中文) shows every page, and the [demo video](docs/VidGrab-demo.mp4) walks through the whole flow.
71
+
72
+ ## Good to know
73
+
74
+ - **Auto captions** run on your computer with Whisper: no account, no upload. The speech model (85 MB to 1.6 GB) is downloaded once, the first time you use it. It uses an Intel or NVIDIA graphics card when there is one ([speed numbers](docs/performance.md)).
75
+ - **Rendering** can use your graphics card (Intel, NVIDIA, AMD, Apple) and falls back to the CPU on its own. See **Settings → Hardware**.
76
+ - **Settings** has three tabs: General, Downloads (defaults, speed limit, proxy, updating the download engine) and Studio.
77
+ - **Privacy:** VidGrab only connects to download what you ask for (the video site, and the speech model the first time you use captions). Your projects and captions never leave your computer.
78
+
79
+ ## Troubleshooting
80
+
81
+ | Problem | Fix |
82
+ |---------|-----|
83
+ | "Video unavailable" or a download error | Sites change often. Update the download engine in **Settings → Downloads**, or update VidGrab (pip: `pip install -U yt-dlp`) |
84
+ | Downloaded at only 360p | The site refused the high-quality stream. Try again later |
85
+ | Auto captions are slow | Pick **Fast** or **Balanced**, and keep **Settings → Hardware → auto captions on the graphics card** on |
86
+ | Can't type Chinese on Linux / WSL | Paste the text instead, or install ibus: `sudo apt install ibus ibus-chewing` |
87
+ | Antivirus warning | Common with this kind of app: add an exception |
88
+ | Won't start on Linux | Needs a desktop session and Qt's libraries: `sudo apt install libegl1 libxkbcommon0 libxcb-cursor0` |
89
+
90
+ Something else? [Open an issue](https://github.com/coherent17/VidGrab/issues).
91
+
92
+ ## For developers
93
+
94
+ Building from source, tests and releases: [CONTRIBUTING.md](CONTRIBUTING.md).
95
+
96
+ ## License
97
+
98
+ [MIT](LICENSE). Built with [yt-dlp](https://github.com/yt-dlp/yt-dlp), [FFmpeg](https://ffmpeg.org), [PySide6 (Qt)](https://doc.qt.io/qtforpython/), [Whisper](https://github.com/openai/whisper) and [Noto Sans CJK](https://github.com/notofonts/noto-cjk). Only download content you have the right to use.
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,39 @@
1
+ {
2
+ "comment": "The one ffmpeg every build, CI job and `make ffmpeg` uses. BtbN keeps each month's last autobuild long-term, so pin to one of those. To upgrade: pick a newer month-end autobuild-YYYY-MM-DD-* release at https://github.com/BtbN/FFmpeg-Builds/releases, copy the *-linux64-gpl-X.Y.tar.xz / *-win64-gpl-X.Y.zip names and their sha256 digests here, and let CI render-test it. The macOS entries are eugeneware/ffmpeg-static b6.1.1 (static, GPL, libass + x264; built with --enable-nonfree, so VidGrab never bundles it: the app downloads it on first use, checking these SHA-256s).",
3
+ "version": "9.0.2 (n9.0.2-17-g2a571b6068)",
4
+ "release": "autobuild-2026-09-30-13-08",
5
+ "files": {
6
+ "linux": {
7
+ "name": "ffmpeg-n9.0.2-17-g2a571b6068-linux64-gpl-9.0.tar.xz",
8
+ "sha256": "68ee646831adaae2495618346f3bba94ff207ff83bbd34d643e7004730d66269"
9
+ },
10
+ "win": {
11
+ "name": "ffmpeg-n9.0.2-17-g2a571b6068-win64-gpl-9.0.zip",
12
+ "sha256": "a0e45723c72141975f51d8666302e614711745f3102b704ca3f82c897a58d278"
13
+ },
14
+ "mac-arm64": {
15
+ "url_base": "https://github.com/eugeneware/ffmpeg-static/releases/download/b6.1.1/",
16
+ "version": "6.1.1",
17
+ "ffmpeg": {
18
+ "name": "ffmpeg-darwin-arm64.gz",
19
+ "sha256": "8923876afa8db5585022d7860ec7e589af192f441c56793971276d450ed3bbfa"
20
+ },
21
+ "ffprobe": {
22
+ "name": "ffprobe-darwin-arm64.gz",
23
+ "sha256": "d986a8ec7b030899fe66a8a288ed809a3543338705a3ce178cfb85869c5d80be"
24
+ }
25
+ },
26
+ "mac-x64": {
27
+ "url_base": "https://github.com/eugeneware/ffmpeg-static/releases/download/b6.1.1/",
28
+ "version": "6.1.1",
29
+ "ffmpeg": {
30
+ "name": "ffmpeg-darwin-x64.gz",
31
+ "sha256": "929b375c1182d956c51f7ac25e0b2b0411fb01f6f407aa15c9758efeb4242106"
32
+ },
33
+ "ffprobe": {
34
+ "name": "ffprobe-darwin-x64.gz",
35
+ "sha256": "d4da574d6e2e197bd259b47d69cf262df9e312af24ad960444f6d806d3d4c186"
36
+ }
37
+ }
38
+ }
39
+ }