- Video detail (done videos): added 'Download audio' button; removed the
manual 'Thumbnail' button (thumbnails auto-download now, so it was redundant).
- New 'GET /api/videos/{id}/audio' endpoint (also serves HEAD for probing),
serving data/audio/<video_id>.mp3. Audio job outtmpl switched to %(id)s so
files are addressable per video.
- Integrated <audio> player appears in the detail view once the MP3 is present
(probed via HEAD on openVideo; polled after a download job until ready).
- Synced transcript follower: as audio plays, the matching segment is
highlighted (seg-active) and auto-scrolled into view like a karaoke/lyrics
tracker. Clicking any segment timestamp or chapter seeks the audio to that
point (falls back to scroll when no audio). Playback indicator pulses while
playing.
187 lines
6.5 KiB
JSON
187 lines
6.5 KiB
JSON
{
|
|
"pyproject.toml": {
|
|
"mtime": 1785126752.9759955,
|
|
"ast_hash": "f80dc007b3b67c7f7a78d9df01a81ead",
|
|
"semantic_hash": "f80dc007b3b67c7f7a78d9df01a81ead"
|
|
},
|
|
"scripts/start-server.ps1": {
|
|
"mtime": 1785130613.533591,
|
|
"ast_hash": "9baf397df6c14b7917ca59fbe6df61cc",
|
|
"semantic_hash": "9baf397df6c14b7917ca59fbe6df61cc"
|
|
},
|
|
"scripts/stop-server.ps1": {
|
|
"mtime": 1785127403.2329483,
|
|
"ast_hash": "4398501c202a3eb624fb439f6d03fcf5",
|
|
"semantic_hash": "4398501c202a3eb624fb439f6d03fcf5"
|
|
},
|
|
"src/yt_scraper/__init__.py": {
|
|
"mtime": 1785120608.3336751,
|
|
"ast_hash": "4867131295172353fe6c2295851defc7",
|
|
"semantic_hash": "4867131295172353fe6c2295851defc7"
|
|
},
|
|
"src/yt_scraper/analysis.py": {
|
|
"mtime": 1785126463.1545029,
|
|
"ast_hash": "c28d08131e6594e1e7c6111ff01b2d37",
|
|
"semantic_hash": "c28d08131e6594e1e7c6111ff01b2d37"
|
|
},
|
|
"src/yt_scraper/chapters.py": {
|
|
"mtime": 1785120675.3308973,
|
|
"ast_hash": "1bf51b7c13486b9db9bcc3420fba2593",
|
|
"semantic_hash": "1bf51b7c13486b9db9bcc3420fba2593"
|
|
},
|
|
"src/yt_scraper/cli.py": {
|
|
"mtime": 1785126572.0575886,
|
|
"ast_hash": "9734cedf7c1e045e1ab0e4a102860e29",
|
|
"semantic_hash": "9734cedf7c1e045e1ab0e4a102860e29"
|
|
},
|
|
"src/yt_scraper/config.py": {
|
|
"mtime": 1785120620.335521,
|
|
"ast_hash": "2f3c8f7768a942e12c0a9e41b54891be",
|
|
"semantic_hash": "2f3c8f7768a942e12c0a9e41b54891be"
|
|
},
|
|
"src/yt_scraper/cookies.py": {
|
|
"mtime": 1785126417.4218228,
|
|
"ast_hash": "dd5ec44bb4c6e6375be80f21307fc73d",
|
|
"semantic_hash": "dd5ec44bb4c6e6375be80f21307fc73d"
|
|
},
|
|
"src/yt_scraper/discover.py": {
|
|
"mtime": 1785120708.331971,
|
|
"ast_hash": "8db06d0b131575f709b55467eabdc2a9",
|
|
"semantic_hash": "8db06d0b131575f709b55467eabdc2a9"
|
|
},
|
|
"src/yt_scraper/export.py": {
|
|
"mtime": 1785126439.6829402,
|
|
"ast_hash": "f1cff31fb1004f08e997655f838e3a58",
|
|
"semantic_hash": "f1cff31fb1004f08e997655f838e3a58"
|
|
},
|
|
"src/yt_scraper/extract.py": {
|
|
"mtime": 1785122183.7294595,
|
|
"ast_hash": "3e2179db2f7fd316d2b3acedee536086",
|
|
"semantic_hash": "3e2179db2f7fd316d2b3acedee536086"
|
|
},
|
|
"src/yt_scraper/monitor.py": {
|
|
"mtime": 1785126496.288271,
|
|
"ast_hash": "a64188f938dc4f8917335ef41d333ead",
|
|
"semantic_hash": "a64188f938dc4f8917335ef41d333ead"
|
|
},
|
|
"src/yt_scraper/parse.py": {
|
|
"mtime": 1785120665.3384771,
|
|
"ast_hash": "25354365ac1ab52f1561c97256573806",
|
|
"semantic_hash": "25354365ac1ab52f1561c97256573806"
|
|
},
|
|
"src/yt_scraper/pipeline.py": {
|
|
"mtime": 1785131195.7311583,
|
|
"ast_hash": "ebce1b294140bf40f809848ef280c290",
|
|
"semantic_hash": "ebce1b294140bf40f809848ef280c290"
|
|
},
|
|
"src/yt_scraper/ratelimit.py": {
|
|
"mtime": 1785120650.3795395,
|
|
"ast_hash": "6082befe56d342fc43abd5299dd6c6ea",
|
|
"semantic_hash": "6082befe56d342fc43abd5299dd6c6ea"
|
|
},
|
|
"src/yt_scraper/render.py": {
|
|
"mtime": 1785120688.3247268,
|
|
"ast_hash": "ff83764f3a8c8874557993e11eab1f89",
|
|
"semantic_hash": "ff83764f3a8c8874557993e11eab1f89"
|
|
},
|
|
"src/yt_scraper/segments.py": {
|
|
"mtime": 1785128385.6652262,
|
|
"ast_hash": "09c7da35bc09a3f75fd0a627c0534746",
|
|
"semantic_hash": "09c7da35bc09a3f75fd0a627c0534746"
|
|
},
|
|
"src/yt_scraper/store.py": {
|
|
"mtime": 1785131583.548138,
|
|
"ast_hash": "9a3d4286214aa54ae4ac4df2097b643d",
|
|
"semantic_hash": "9a3d4286214aa54ae4ac4df2097b643d"
|
|
},
|
|
"src/yt_scraper/webapp/__init__.py": {
|
|
"mtime": 1785126827.4957752,
|
|
"ast_hash": "d41d8cd98f00b204e9800998ecf8427e",
|
|
"semantic_hash": "d41d8cd98f00b204e9800998ecf8427e"
|
|
},
|
|
"src/yt_scraper/webapp/api.py": {
|
|
"mtime": 1785131595.9914868,
|
|
"ast_hash": "e64174f04d6eab0747b1d2a7c2a96a01",
|
|
"semantic_hash": "e64174f04d6eab0747b1d2a7c2a96a01"
|
|
},
|
|
"src/yt_scraper/webapp/app.py": {
|
|
"mtime": 1785126888.8032887,
|
|
"ast_hash": "e0b1925b4318305dcf746d360373ff50",
|
|
"semantic_hash": "e0b1925b4318305dcf746d360373ff50"
|
|
},
|
|
"src/yt_scraper/webapp/jobs.py": {
|
|
"mtime": 1785131211.0397103,
|
|
"ast_hash": "8b6c80001ff8c95eaaa16f7b61d1f207",
|
|
"semantic_hash": "8b6c80001ff8c95eaaa16f7b61d1f207"
|
|
},
|
|
"src/yt_scraper/webapp/static/app.js": {
|
|
"mtime": 1785131664.8792574,
|
|
"ast_hash": "f6b081fadc5884d379152abbd1e59700",
|
|
"semantic_hash": "f6b081fadc5884d379152abbd1e59700"
|
|
},
|
|
"tests/test_chapters.py": {
|
|
"mtime": 1785120789.3300896,
|
|
"ast_hash": "6d5303fa86de8dc99af6ae2ee17da033",
|
|
"semantic_hash": "6d5303fa86de8dc99af6ae2ee17da033"
|
|
},
|
|
"tests/test_features.py": {
|
|
"mtime": 1785126709.65728,
|
|
"ast_hash": "21f9c44ce7cc1d618ece402ab7c2b057",
|
|
"semantic_hash": "21f9c44ce7cc1d618ece402ab7c2b057"
|
|
},
|
|
"tests/test_parse.py": {
|
|
"mtime": 1785120974.3283188,
|
|
"ast_hash": "57ce74ee10fe6f9a90126ec7d9fd96b0",
|
|
"semantic_hash": "57ce74ee10fe6f9a90126ec7d9fd96b0"
|
|
},
|
|
"tests/test_render.py": {
|
|
"mtime": 1785120806.3260238,
|
|
"ast_hash": "27125960e235813724fd669001faab59",
|
|
"semantic_hash": "27125960e235813724fd669001faab59"
|
|
},
|
|
"tests/test_store_platform.py": {
|
|
"mtime": 1785126662.4772756,
|
|
"ast_hash": "bad13dcf37be7a414ffae8018c29e55b",
|
|
"semantic_hash": "bad13dcf37be7a414ffae8018c29e55b"
|
|
},
|
|
".opencode/agent/webapp-builder.md": {
|
|
"mtime": 1785126783.7152567,
|
|
"ast_hash": "58e92641724400370d7823dce1e02ca3",
|
|
"semantic_hash": "58e92641724400370d7823dce1e02ca3"
|
|
},
|
|
".opencode/goals/webapp-build.md": {
|
|
"mtime": 1785126796.8402326,
|
|
"ast_hash": "478e7a2350ded2fd273cfdb0714d228d",
|
|
"semantic_hash": "478e7a2350ded2fd273cfdb0714d228d"
|
|
},
|
|
"OPPORTUNITIES.md": {
|
|
"mtime": 1785122706.3466253,
|
|
"ast_hash": "4af60e3106b394664fbf5b5c5f645804",
|
|
"semantic_hash": "4af60e3106b394664fbf5b5c5f645804"
|
|
},
|
|
"README.md": {
|
|
"mtime": 1785121499.3282604,
|
|
"ast_hash": "a0a8e6b62a991fce5d6c58171f80075e",
|
|
"semantic_hash": "a0a8e6b62a991fce5d6c58171f80075e"
|
|
},
|
|
"config.example.yaml": {
|
|
"mtime": 1785120602.4114335,
|
|
"ast_hash": "415b0fc8e71ecc305d21e9c3c08d585a",
|
|
"semantic_hash": "415b0fc8e71ecc305d21e9c3c08d585a"
|
|
},
|
|
"docs/superpowers/plans/2026-07-26-platform-build.md": {
|
|
"mtime": 1785126240.4211702,
|
|
"ast_hash": "8097056ef23068f22c48151746de305b",
|
|
"semantic_hash": "8097056ef23068f22c48151746de305b"
|
|
},
|
|
"docs/superpowers/specs/2026-07-26-platform-design.md": {
|
|
"mtime": 1785126024.4879057,
|
|
"ast_hash": "9b85f02fd45c93cdabfd2e1c6d1e0c9e",
|
|
"semantic_hash": "9b85f02fd45c93cdabfd2e1c6d1e0c9e"
|
|
},
|
|
"src/yt_scraper/webapp/static/index.html": {
|
|
"mtime": 1785131695.7653384,
|
|
"ast_hash": "13591b7c8c662d8e7c2540f3032ae26d",
|
|
"semantic_hash": "13591b7c8c662d8e7c2540f3032ae26d"
|
|
}
|
|
} |