diff --git a/assets/kiku-integration.gif b/assets/kiku-integration.gif deleted file mode 100644 index c92f3de..0000000 Binary files a/assets/kiku-integration.gif and /dev/null differ diff --git a/assets/minecard.gif b/assets/minecard.gif index 4d45c78..989212b 100644 Binary files a/assets/minecard.gif and b/assets/minecard.gif differ diff --git a/assets/minecard.png b/assets/minecard.png deleted file mode 100644 index 3d8c767..0000000 Binary files a/assets/minecard.png and /dev/null differ diff --git a/assets/minecard.webm b/assets/minecard.webm index 4aa05d8..da30d0f 100644 Binary files a/assets/minecard.webm and b/assets/minecard.webm differ diff --git a/assets/minecard.webp b/assets/minecard.webp new file mode 100644 index 0000000..4d100f3 Binary files /dev/null and b/assets/minecard.webp differ diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 4200410..9410544 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -69,6 +69,7 @@ export default { { text: 'Launcher Script', link: '/launcher-script' }, { text: 'Usage', link: '/usage' }, { text: 'Mining Workflow', link: '/mining-workflow' }, + // { text: 'Feature Demos', link: '/demos' }, ], }, { diff --git a/docs/demos.md b/docs/demos.md new file mode 100644 index 0000000..b0cd34c --- /dev/null +++ b/docs/demos.md @@ -0,0 +1,72 @@ +# Feature Demos + +Short recordings of SubMiner's key features and integrations from real playback sessions. + + + +## Anki Card Mining & Enrichment + +Mine vocabulary cards from Yomitan or directly from subtitle lines. SubMiner automatically attaches the sentence, a timing-accurate audio clip, a screenshot, and a translation. + + + +::: info VIDEO COMING SOON +::: + +## Subtitle Download & Sync + +Search and download subtitles from Jimaku, then automatically synchronize them with alass or ffsubsync — all from within SubMiner. + + + +::: info VIDEO COMING SOON +::: + +## Jellyfin Integration + +Browse your Jellyfin library, cast to devices, and launch playback directly from SubMiner. Watch progress syncs back to your Jellyfin server. + + + +::: info VIDEO COMING SOON +::: + +## Texthooker + +Open subtitles in an external texthooker page for use with browser-based tools and extensions alongside the overlay. + + + +::: info VIDEO COMING SOON +::: + + diff --git a/docs/index.assets.test.ts b/docs/index.assets.test.ts index 4aa2505..0c876b0 100644 --- a/docs/index.assets.test.ts +++ b/docs/index.assets.test.ts @@ -19,6 +19,6 @@ test('docs demo media uses shared cache-busting asset version token', () => { '', ); expect(docsIndexContents).toContain( - 'SubMiner demo GIF fallback', + 'SubMiner demo Animated fallback', ); }); diff --git a/docs/index.md b/docs/index.md index f4f9586..ef47a02 100644 --- a/docs/index.md +++ b/docs/index.md @@ -95,7 +95,7 @@ const demoAssetVersion = '20260223-2'; - SubMiner demo GIF fallback + SubMiner demo Animated fallback diff --git a/docs/public/assets/kiku-integration.gif b/docs/public/assets/kiku-integration.gif deleted file mode 100644 index c92f3de..0000000 Binary files a/docs/public/assets/kiku-integration.gif and /dev/null differ diff --git a/docs/public/assets/minecard.gif b/docs/public/assets/minecard.gif index 4d45c78..989212b 100644 Binary files a/docs/public/assets/minecard.gif and b/docs/public/assets/minecard.gif differ diff --git a/docs/public/assets/minecard.webm b/docs/public/assets/minecard.webm index 4aa05d8..da30d0f 100644 Binary files a/docs/public/assets/minecard.webm and b/docs/public/assets/minecard.webm differ diff --git a/docs/public/assets/minecard.webp b/docs/public/assets/minecard.webp new file mode 100644 index 0000000..4d100f3 Binary files /dev/null and b/docs/public/assets/minecard.webp differ diff --git a/docs/public/config.example.jsonc b/docs/public/config.example.jsonc index 91849f8..c770adc 100644 --- a/docs/public/config.example.jsonc +++ b/docs/public/config.example.jsonc @@ -141,7 +141,7 @@ "bandedColors": ["#ed8796", "#f5a97f", "#f9e2af", "#a6e3a1", "#8aadf4"], // Five colors used for rank bands when mode is `banded` (from most common to least within topX). }, // Frequency dictionary setting. "secondary": { - "fontFamily": "Manrope, Inter", // Font family setting. + "fontFamily": "Inter, Noto Sans, Helvetica Neue, sans-serif", // Font family setting. "fontSize": 24, // Font size setting. "fontColor": "#cad3f5", // Font color setting. "lineHeight": 1.35, // Line height setting. diff --git a/scripts/mkv-to-readme-video.sh b/scripts/mkv-to-readme-video.sh index 2f24908..17769b7 100755 --- a/scripts/mkv-to-readme-video.sh +++ b/scripts/mkv-to-readme-video.sh @@ -11,11 +11,12 @@ Description: Generates two browser-friendly files next to the input file: - .mp4 (H.264 + AAC, prefers NVIDIA GPU if available) - .webm (AV1/VP9 + Opus, prefers NVIDIA GPU if available) - - .gif (palette-optimised, 15 fps) - -poster.jpg (single frame for video poster fallback) + - .webp (animated, only when --webp is provided) Options: -f, --force Overwrite existing output files + -w, --webp Generate animated WebP preview Encoding profile: - Crop: 1920x1080 at x=760 y=200 @@ -25,6 +26,7 @@ USAGE } force=0 +generate_webp=0 input="" while [[ $# -gt 0 ]]; do @@ -36,6 +38,9 @@ while [[ $# -gt 0 ]]; do -f | --force) force=1 ;; + -w | --webp) + generate_webp=1 + ;; -*) echo "Error: unknown option: $1" >&2 usage @@ -74,7 +79,7 @@ base="${filename%.*}" mp4_out="$dir/$base.mp4" webm_out="$dir/$base.webm" -gif_out="$dir/$base.gif" +webp_out="$dir/$base.webp" poster_out="$dir/$base-poster.jpg" overwrite_flag="-n" @@ -83,7 +88,11 @@ if [[ "$force" -eq 1 ]]; then fi if [[ "$force" -eq 0 ]]; then - for output in "$mp4_out" "$webm_out" "$gif_out" "$poster_out"; do + outputs=("$mp4_out" "$webm_out" "$poster_out") + if [[ "$generate_webp" -eq 1 ]]; then + outputs+=("$webp_out") + fi + for output in "${outputs[@]}"; do if [[ -e "$output" ]]; then echo "Error: output exists: $output (use --force to overwrite)" >&2 exit 1 @@ -98,7 +107,6 @@ has_encoder() { crop_vf="crop=1920:1080:760:205" webm_vf="${crop_vf},fps=30" -gif_vf="${crop_vf},fps=15,scale=960:-1:flags=lanczos,split[s0][s1];[s0]palettegen=max_colors=128[p];[s1][p]paletteuse=dither=bayer:bayer_scale=3" echo "Generating MP4: $mp4_out" if has_encoder "h264_nvenc"; then @@ -159,10 +167,20 @@ else "$webm_out" fi -echo "Generating GIF: $gif_out" -ffmpeg "$overwrite_flag" -i "$input" \ - -vf "$gif_vf" \ - "$gif_out" +if [[ "$generate_webp" -eq 1 ]]; then + if ! has_encoder "libwebp"; then + echo "Error: encoder not found: libwebp" >&2 + exit 1 + fi + echo "Generating animated WebP: $webp_out" + ffmpeg "$overwrite_flag" -i "$input" \ + -vf "${crop_vf},fps=24,scale=960:-1:flags=lanczos" \ + -c:v libwebp \ + -q:v 80 \ + -loop 0 \ + -an \ + "$webp_out" +fi echo "Generating poster: $poster_out" ffmpeg "$overwrite_flag" -ss 00:00:05 -i "$input" \ @@ -174,5 +192,7 @@ ffmpeg "$overwrite_flag" -ss 00:00:05 -i "$input" \ echo "Done." echo "MP4: $mp4_out" echo "WebM: $webm_out" -echo "GIF: $gif_out" +if [[ "$generate_webp" -eq 1 ]]; then + echo "WebP: $webp_out" +fi echo "Poster: $poster_out"