Hugging Face
Models
Datasets
Spaces
Buckets
new
Docs
Enterprise
Pricing
Website
Tasks
HuggingChat
Collections
Languages
Organizations
Community
Blog
Posts
Daily Papers
Learn
Discord
Forum
GitHub
Solutions
Team & Enterprise
Hugging Face PRO
Enterprise Support
Inference Providers
Inference Endpoints
Storage Buckets
Log In
Sign Up
Spaces:
Duplicated from
bep40/bongdaplus-news
bep40
/
VNEWS
like
0
Restarting
App
Files
Files
Community
32
Fetching metadata from the HF Docker repository...
Fix: Change default VTV channel from VTV3 to VTV6
#22
by
bep40
- opened
13 days ago
base:
refs/heads/main
←
from:
refs/pr/22
Discussion
Files changed
+1192
-3529
initial commit
865d01d8
Upload README.md
90cb3105
Upload requirements.txt
d981e69a
Upload app.py
dbda0481
fix: move css/theme back to gr.Blocks() for Gradio 5.x compatibility
889c53f0
feat: inline article reader - read full articles without redirect
cad6cba0
feat: fullscreen dark UI, strip article links, share buttons (Web Share API + clipboard fallback)
9500889c
feat: VnExpress source, hash URL routing, share with page link, localStorage comments
8fb0b204
feat: multi-category VnExpress, grouped homepage, SEO-friendly URLs with slug, schema.org markup, og meta tags
b69646bf
update README for multi-source news aggregator
7b6fe037
feat: inline video player (VnExpress MP4 + BDP video-embed), OG image in share links, dynamic meta tags
8fc079e0
feat: inline video player (VnExpress MP4 + BDP video-embed), OG image in share links, dynamic meta tags
3826fdf5
fix: OG image URL encoding, HLS.js for VnExpress video, GIF onerror no longer hides parent
4872afc6
fix: share original URL (OG image works), HLS via MutationObserver (no inline script), image error via JS (no inline onerror), add Video category
fc16b1c1
Fix video playback, share URLs, images & add video slider on homepage
c1737fac
v3: VNE videos in slider, hash URL share, TikTok-style viewer
233cf1c7
v3: VNE+BDP videos in slider, hash URL share, TikTok viewer
4bd4c6f3
Fix: hidden elements not in DOM, robust bdpOpen + slider scroll
7c0e509c
Fix: remove hidden button, use Textbox.submit(), fast homepage (no VNE video scan)
6f21b3c9
FINAL FIX: native value setter + Textbox.input() + sr-only visible
58aa5ca1
ROOT CAUSE FIX: move all JS from head= (stripped by Gradio) to js= parameter
d7d92681
Revert to working version + fix JS injection (head= strips scripts, use js= instead)
b17f42d0
feat: hash URL sharing + TikTok-style vertical video feed
55f76b13
feat: fullscreen TikTok video feed + 24h.com.vn video source
590f2b00
fix: 24h videos in homepage slider + TikTok feed playback fixes
819566bd
fix: 24h in slider + TikTok feed scroll-based playback
e64c4953
feat: 24h multi-part videos, slider->TikTok, seek buttons, grid->TikTok
a38c268a
fix: 24h-only slider, tap-to-show seek controls, multi-part probe
dae13098
Revert to a38c268: slider BDP+24h, seek buttons, grid->TikTok
3942ddf5
Replace video slider with featured news carousel on homepage (no extra fetch, instant)
7cc732ea
Timezone VN (UTC+7), remove BDP video, fix 24h multi-part probe (\d+ not \d{2})
1487a0ab
Add 24h video carousel on homepage (parallel fetch, no extra latency)
13d1ec0b
Add Dantri video carousel, TikTok button on 24h carousel, 24h full playlist in article view
6856a051
Fix: Dantri video-ngan, 24h playlist in article, TikTok btn fix
1a4b0066
Fix: dantri video from JS streamLocalPath, visible=True for hidden elements, bdpGoVideo native setter
abd753aa
CRITICAL: bdpOpen uses native setter + setTimeout for button click
3abcab75
Playlist tabs UI for 24h multi-part videos, TikTok fullscreen for dantri, native setter in bdpOpen
717887a1
force rebuild with comment
bce5b406
Revert to working version (24h carousel on homepage, before broken fixes)
f2df10e3
feat: icon category grid + auto-hide seek buttons + video slide→TikTok fix
8a0dccc8
fix: disable SSR to fix UnicodeEncodeError with flag emojis
b4fb4e33
fix: remove surrogate pairs in JS string (use proper Unicode codepoints)
06e11293
fix: replace dropdown hack with hidden textbox+button for reliable category switching + TikTok navigation
0ac0a873
feat: unique vid per TikTok slide, share+hash per video, fix multi-part match all parts in feed
f013786c
temp: patch script (will be replaced)
e4ea4a97
Delete patch_shorts.py
caf0caf9
feat: add 24h news shorts scraper module
7f0fde27
feat: add 24h news shorts to homepage via startup patcher
d84565ae
feat: app.py as patcher entry point, patches and runs main app with 24h shorts
95e415ac
revert: restore app.py as main entry, use startup import for shorts"
79a93056
restore: revert app.py from commit 8a0dccc (working version before accidental overwrite)
46a000fb
Update app.py
73ee85dc
fix: rewrite startup.py with proper 9:16 shorts carousel patch
1a272ccd
fix: make startup.py the app_file entry point for proper patching
ea49b1bd
fix: proper startup.py with 9:16 shorts carousel patching
23fb1479
fix: revert to app_file=app.py, integrate shorts directly
8eb963ce
fix: use app_wrapper.py as entry point to reliably add shorts
419ce885
feat: app_wrapper.py - patches app.py then runs it with shorts carousel
b95575e8
revert app_file to app.py
112ae6d5
fix: app_wrapper patches in memory (no disk write), set as app_file
b965e8c5
fix: app_wrapper patches in-memory only, no disk write, exec directly
833270e3
revert app_file to app.py - will edit app.py directly
3f942a8a
feat: shorts_carousel module - self-contained 9:16 shorts carousel
0d25b45b
fix: app_wrapper imports app module properly instead of exec
025df0aa
set app_file to app_wrapper.py
c94fe635
fix: shorts_carousel.py - filter only real article URLs (c{N}a{N} pattern)
7966cb07
fix: shorts click opens article view (bdpOpen) not TikTok highlight feed
60e5c0b5
feat: 24h article videos render in TikTok 9:16 fullscreen mode
4c90cb6e
feat: shorts opens fullscreen TikTok feed (swipe between shorts) + 9:16 crop center
17be8c73
feat: add _extract_24h_video_url to shorts_carousel.py
29cb912b
fix: inline JS in shorts HTML (not patching JS_FUNC), add video list below feed
204c16c9
fix: shorts uses same tiktok-slide classes (auto-init by existing JS), fullwidth, no inline script
a8cd9317
fix: fullwidth mobile layout + toggle fullheight button in highlight TikTok
fb55446f
revert: remove fullwidth CSS + fullheight button, back to previous version
856c3160
feat: fullwidth mobile + fullheight toggle (no homepage load impact)
00539986
fix: aggressive padding removal all levels + ensure multi-part highlight videos
2fe32ae6
fix: multi-part videos + slider click opens correct video in TikTok feed
1b03480f
fix: all video links (BDP+24h) from slider open in TikTok mode, remove broken 02.m3u8 probe
2b0cb3af
fix: slider bdpOpen with 3 params + add slug; note on multi-part limitation
501f7c84
feat: multi-part video extraction via AJAX probe + m3u8 master playlist check
93879357
fix: expand all_parts into separate slides in TikTok feed
5190f384
fix: regex for multi-part probe - use greedy (.+) to match last 2 digits before .m3u8
6646eb5f
fix: GREEDY regex (.+) not (.+?) for multi-part probe - this is the actual bug
19df7024
fix: correct multi-part detection for 24h videos (different article IDs per part)"
bb8ed7a4
fix: override app._extract_24h_video_urls with fixed version from shorts_carousel
4aac2806
fix: shorts thumbnail ratio 3:4, keep highlight videos in highlight slide only
2f1bbb54
fix: all TikTok video feeds (shorts + highlight) use 3:4 aspect ratio
69f7becc
revert: restore previous shorts_carousel.py (before 3:4 ratio change)
d85311d5
revert: app_wrapper.py back to previous version (before 3:4 change)
701d8564
feat: video ratio 3:4 for both shorts and highlight TikTok feeds (CSS only, no load impact)
34c42f63
revert: restore previous app_wrapper.py (before 3:4 ratio change)
a705f349
fix: shorts scraper accepts all article links, shorts TikTok uses shorts data, 3:4 ratio
4db84cfb
fix: shorts click uses shorts data for TikTok, all video feeds 3:4 ratio
e86a4398
revert: restore previous version (before 3:4 + shorts fix)
900d809a
revert: shorts_carousel.py back to previous (9:16 ratio, strict regex)
eae3352a
fix: shorts scraper relaxed filter + async fetch + 3:4 ratio + fix dark screen
8304f762
fix: async shorts, 3:4 all video feeds, fix dark screen overlay, shorts TikTok feed
1c9d9ab6
revert: restore previous shorts_carousel.py
e908c6ee
revert: app_wrapper.py back to previous version
5385081d
css-only: video 3:4 ratio for all TikTok feeds + shorts thumbnail 3:4
2ff7eb03
fix shorts_carousel.py ONLY: relax URL filter + 3:4 thumbnail ratio
e4080d4d
revert: shorts_carousel.py back to previous (strict regex, 9:16)
96114755
fix: shorts scraper uses correct URL pattern from video-tin-tuc page
88b47c1f
revert: shorts_carousel.py back to previous version
8fa1839c
change CSS only: shorts thumbnail 3:4 ratio (no logic change)
8a8a8878
fix: use shorts_scraper.py (article tags - working version) instead of shorts_carousel regex
84fe37ce
revert: app_wrapper.py back to previous (import from shorts_carousel)
37067ce2
fix: import scrape_24h_news_shorts from shorts_scraper.py (article tags - stable version)
e7d30943
revert: app_wrapper.py back to previous (import from shorts_carousel only)
1e22d57a
fix scrape_24h_news_shorts inside shorts_carousel.py: use article tags like shorts_scraper.py
69ee9a84
revert: shorts_carousel.py back to stable version with regex filter
7d02719a
fix: shorts click prioritizes shorts list first, highlights second
c159cfaa
css: all TikTok feeds 3:4 ratio + fullscreen toggle for all slides
6827bbb3
fix: sync 3:4 CSS + contain button for BOTH video page and article TikTok feeds, fix slider slug
bd03b267
revert: app_wrapper.py back to previous version (shorts routing fix)
6004329a
feat: comment button on TikTok slides + share includes thumbnail image
ecfc3fdd
revert: app_wrapper.py back to previous (shorts routing, no comment/share changes)
2e5ded4e
feat: og:image in share + reduce TikTok player height for mobile
41f5f100
fix: correct video ordering (P1 before P2) + share includes thumbnail URL in text
29d9120b
revert: app_wrapper.py back to previous version
68900a7e
revert: app_wrapper.py back to shorts routing version (before og:image + height changes)
bb03a0e1
restore: version with 80vh TikTok height + og:image meta
452730df
fix: share original article URL (has og:image) instead of hash URL
7953b352
feat: change share URL from hash to query parameter format for og:image support
c8ccdd09
feat: FastAPI wrapper for dynamic og:image + Gradio mount
3d4689ca
fix: share URL includes img param for dynamic og:image per article
b5fa6757
feat: comment btn + share btn right side + view/share/comment counters on TikTok slides
ead52f15
revert: app_wrapper.py back to previous version (before comment/counter changes)
38de8d61
fix: disable auto-refresh timer when viewing video, preserve video order
9f1a55d8
fix: click video in list scrolls to slide (no reload) + highlight video 1:1 default
90206e84
fix: simpler JS scroll for video cards - no escape issues
215fbb28
fix: use anchor links for card scroll (native browser, no JS needed), fix slide IDs
994c5f00
rebuild: switch to Docker SDK for FastAPI + pure HTML/JS app
7da08d83
add Dockerfile for FastAPI app
1f1c6147
add main.py FastAPI backend with all scrapers + API routes
729e3173
add frontend: SPA with TikTok video feed, no page reload on navigation
65554546
feat: add news categories tabs + BDP categories + ensure shorts visible
6dd94b4a
feat: full frontend with category tabs, shorts on homepage, video playlist below feed
3f602dc8
feat: inline article reader + BBC Vietnamese + fix shorts/highlights sliders
158506a2
feat: inline article reader + BBC + fix sliders showing all items
fa312719
fix: BBC scraper improved, shorts visibility, highlights ordered by newest + multi-part
d1ee6cb2
fix: shorts always visible, highlights ordered + multi-part expanded in TikTok
632ed396
fix: show all slider items (no img filter), add share/comment/views counters, hash URL share
ffea8846
fix: hash routing works, shorts fallback scraper, highlight img from og, video comments+views
44667498
feat: hash routing works, video comments+views, SEO meta, shorts fallback
3313ae0f
feat: video comments panel, right-side action buttons TikTok style, hash routing works, SEO share URL
d5dbba67
fix: view count once per session, share URL includes article URL for cross-device, highlight click correct
a263f699
fix: view count once per video per session, share URL with article link for SEO, correct highlight click
44acceaa
fix: frontend - view once per session, share URL with og:image, pending article from share
d406f23f
fix: share URL points to VNEWS with SEO, highlight passes link not index, close cmt on scroll, persist note
ed6aeb52
feat: persistent JSON database + hide/show UI on tap + fix share URL + fix comment close
e8e433f9
feat: UI hide/show on tap, server-side database for views/comments/shares, fix all issues
e03c1b4a
fix: add hash-based share URLs with SEO /s/slug/hash route + slug helper
4a1a498c
fix: hash URL share + tiktok scroll auto-play + close comments on scroll
f6e6bea8
cleanup: remove old Gradio files, Docker only needs main.py + static/
62d21983
fix: make_slug handles đ→d correctly
4b762c4a
revert: restore previous version (commit ed6aeb5244)
0ac1437b
revert: restore missing files from ed6aeb5244
ac1e4155
revert: restore main.py to ed6aeb5244 version
a2100fb4
revert: restore static/index.html to ed6aeb5244 version
97f13fbe
revert: restore main.py to previous working version
3d2a7833
revert: restore static/index.html to previous working version
4cfa0946
fix: database persistent + hash share URL + /s/slug/hash SEO route
d9e41fbd
fix: all issues - hash share, server DB, close cmt on scroll, correct slide click, UI hide/show on tap
91a167b2
fix: share opens VNEWS reader (not external), scrollToSlide uses feed.scrollTop, close cmt on every scroll"
1c23a1e3
fix: scrollToSlide uses feed.scrollTop, close cmt in scroll handler directly, pending_article plain string
d5f29af9
fix: readArticle handles ALL sources in VNEWS reader + IntersectionObserver for slide change detection + close cmt"
5ac2e356
fix: add BDP to /api/article + replace scroll-snap with manual touch swipe (guaranteed slide change detection)"
7f65e3f1
fix: /api/article supports BDP + 24h (scrape any article for in-app reading)
0698a4cb
revert: restore to ed6aeb52 (previous stable version)
090cbfb1
revert: restore static/index.html to ed6aeb52
ba46f0a1
fix share: redirect via ?open= query param (no localStorage), fix comment: click outside closes panel
c8e389b4
fix: share reads ?open= param (no localStorage), readArticle always in-app, click outside closes comment
35191dc0
fix: /api/article supports BDP+24h, video click always closes comment panels
88025ad3
Delete FIX_NOTES.md
642ff282
fix: add BDP+24h article scrapers to /api/article
35630e18
fix: video click closes comment panels (stopPropagation bypass fix)
da7584b6
Delete FIX_TEMP.md
81df2254
fix: closeAllCmtPanels in video click handler (1 line fix)
df7babae
revert: restore index.html + main.py to ed6aeb52 (stable version before comment bug)
43c5903a
revert: restore index.html to ed6aeb52
1ec593cd
revert: restore index.html to d406f23f
f7c7a88f
Remove comment sections from video player and article view
b17c8d2d
Add /v route for direct video share links
fff7472b
Add direct video share deep-link + comments with auto-close on video change
181405d5
Remove comments completely + fix video start index from homepage slide
1d699ebf
Add VTV live TV streaming: backend /api/livetv + frontend slide section
c60e3b8f
Add Live TV slide section on homepage with fullscreen player
eeddff84
Switch to YouTube embed for live TV - 100% reliable, no token needed
6e613546
Switch TV player to YouTube iframe embed - works 100% reliable
80c2da26
Fix TV: use YouTube @handle/live embed which always works + remove non-working channels
4389cb35
Fix TV: open YouTube live link directly (embed blocked by YouTube X-Frame-Options)
3349c6f8
Restore to version before VTV live TV slide (no comments, fixed video start, video share links)
a33afe8c
Restore index.html to pre-VTV version (no comments, fixed video, share links)
b2b7bde3
Add livescore widget (ScoreBat) + auto football news from 24h on homepage
c523fe87
Add /api/football_news endpoint - scrape live football articles from 24h
7427014e
Native livescore from BDP + read 24h/BDP articles directly in-app
e0bd3f54
Fix: allow reading 24h/BDP articles in-app + fix football news source tag
375172c2
Fix: robust 24h/BDP article parsers (generic p-block finder), remove livescore, fix football news scraper
977c11d9
Remove livescore widget, keep football news slide + in-app reading for all sources
f5c407be
Restore to pre-football-news version + remove BDP category
105a10e9
Restore frontend to original version (no football news, no livescore, no BDP categories)
ffe8cdba
Add all VNE categories + VnExpress video + DanTri tin nong slide
8a3fcaa9
Frontend: add DanTri hot news slide + VnExpress video in shorts section
b623a6f6
Fix: VnEgo from correct URL, all VNE cats on homepage, DanTri read in-app
b6c569e0
Fix: DanTri read in-app + readArticle supports dantri.com.vn
1f06701b
Fix: DanTri read in-app + readArticle supports dantri
5e60ffa1
Delete static/fix-note.txt
52975329
Fix: DanTri always fetch OG image + VnEgo remove strict path filter + DanTri read in-app frontend
546a1a8e
Delete static/fix-placeholder.txt
68024cba
Fix VnEgo (use /video page), DanTri always OG image, frontend DanTri in-app read
2fff7657
Fix: remove VnE video, DanTri read in-app (readArticle supports dantri source)
e3bb58e2
Add football livescore/fixtures/standings from bongda.com.vn API + BXH scrape
da9cda9b
REVERT - restore main.py (accidentally overwritten)
928cbf6f
Add livescore from bongda.com.vn API (live, upcoming, standings, results) - native display
772a7a53
Add livescore section on homepage: live, upcoming, results from bongda.com.vn API
494ac7d0
Add match detail API (commentaries + stats) + featured match endpoint
524ed03e
Full frontend: featured match, match detail (commentaries+stats), league standings tabs
00244b90
Fix featured match: prioritize top leagues (NHA/CL) + search today fixtures. Fix match detail loading.
4d481f25
Restore main.py + fix featured match priority (top leagues first, search today)
d9b2feaa
placeholder
edb601f2
Delete static/fix.js
c8fa4d15
Delete dev/, DEPLOY_NOTE.md
4fa78e4e
Fix featured: prioritize NHA first, then CL, then others. Fix cache TTL to 30s for featured.
e474a21b
Fix: add FA Cup to priority leagues + fix frontend openMatch timing issue
c484c4a8
Fix: improve event_id extraction from match click + add await delay for overlay render
99567225
Delete static/fix_note.txt
29d65d87
Rewrite livescore: JSON with goal scorers instead of raw HTML
ab3d2186
Revert to previous working version (HTML livescore + FA Cup priority)
f00cad13
Fix 24h timeout: use corsproxy.io as fallback when direct connection fails
0a3c75e8
Add yt-dlp to Dockerfile for YouTube video extraction
06881ac8
Replace 24h with YouTube FPT Bóng Đá for shorts/highlights + YouTube embed player
975c5e93
Fix frontend: YouTube videos render as iframe embed instead of native video tag
1679bcfe
Delete static/temp.txt
909afc8a
Fix frontend: YouTube videos play via iframe embed in TikTok-style player
99038b53
Delete static/temp2.txt
c1aba2ae
Fix: YouTube embed iframe in TikTok player + CSS for iframe slides
f90b78ce
Fix: sort YouTube by date (newest first) + stop iframe audio on slide change
efd02f9c
Fix iframe audio overlap: lazy-load iframe src only for active slide, remove on scroll away
98c20b3b
Delete static/temp3.txt
782cb192
Fix iframe audio overlap: lazy-load iframe with data-yt-src, act() manages iframe src on scroll
233527b1
Fix: remove --playlist-sort date (not supported by yt-dlp) - fixes empty shorts/highlights
7c0f3d4b
Delete static/fix_note.txt
60528ae9
Fix: remove invalid --playlist-sort option that caused empty shorts/highlights
683a9760
Revert to pre-iframe-fix version (shorts/highlights working, audio overlap on scroll)
ae9ee3c1
Fix audio overlap: iframe uses data-yt-src lazy load, act() sets/removes src on scroll. No other changes.
582f9dc7
Delete static/temp_del.txt
65701b50
Fix audio overlap: iframe lazy-load with data-yt-src + act() manages iframe src on scroll
0524d844
Replace FPT highlights with ScoreBat API (50 highlight videos, no geo-restrict)"
5d75b1de
Fix: use embed/v/ URL (video only) instead of matchview URL (full page) for ScoreBat highlights
4d228ea0
Delete FIX.md
19d9ae48
Fix: prioritize embed URL over matchview in scorebat highlights link field
3a201bbc
Revert: link field back to matchview or embed
cd8694c9
Delete static/note.txt
fe08c537
Revert to pre-ScoreBat version (FPT YouTube highlights + shorts, iframe audio fix)
3f511a44
Replace FPT highlights with xemlaibongda.top (HLS m3u8 native playback, thumbnails)"
e339ba15
Fix HLS video not playing on mobile: wait for canplay + tap-to-play + controls attribute
a530bdd7
Delete FIX_NOTE.md
58c72708
Fix HLS not playing: add controls+autoplay+preload=auto to video tag for mobile playback
3131160d
Delete FIX.md
edabcdea
Fix HLS video not playing on mobile: add controls autoplay preload=auto
9219f548
Fix: always use hls.js (never native) because segments have wrong content-type image/png
c27b0e9c
Delete FIX2.md
32440f3c
Fix: always use hls.js instead of native HLS (segments have wrong content-type)
ee480119
Fix: proxy m3u8 and video to bypass CORS (root cause of video not playing on Android)
073d8248
Fix: featured match real-time refresh, match click navigation bug, stats table CSS
33c00f04
Add highlights by league (Premier League, FA Cup, Bundesliga, Serie A, La Liga, Champions League, Europa League, World Cup 2026 Qualifiers)
f25dbb05
Frontend: show highlights by league on homepage (Premier League, FA Cup, Bundesliga, Serie A, La Liga, Champions League, Europa League, World Cup 2026)
0c0b3488
Fix: video stalling after few seconds + slow loading (lazy HLS init, destroy inactive, buffer tuning)
6ec75296
Fix ROOT CAUSE: segments are PNG-wrapped TS - proxy strips 188-byte PNG header, rewrites m3u8 segment URLs through server
06a7c109
Increase highlights per league: scrape 20, show 12 on league page, 6 on homepage
c0e0e12d
League player: video on top + playlist below for video selection (replace TikTok scroll for highlights)
cf68f092
Fix: Công nghệ URL /so-hoa→/khoa-hoc-cong-nghe, add more VNE categories, fix DanTri scraper to get images from homepage
59aad665
Delete _vne_cats_temp.txt
e9755b07
Fix: Công nghệ URL, add 4 more VNE categories on homepage, DanTri scrape images from homepage
cd1be9b9
Update ML Intern artifact metadata
89e0d1b7
Frontend: video player default 1:1 with 16:9 toggle button
3ebcf7a8
Fix: Công nghệ from DanTri, proxy DanTri images (fix 403 hotlink), add /api/proxy/img
807f0a23
Fix: DanTri articles open in external browser (server cant parse JS-rendered pages)
840f64ef
Fix: Công nghệ scraper accepts articles without images from DanTri
79b33c4f
Fix: DanTri article parser uses <main> tag, proxy images in articles
d723a135
Fix: DanTri articles readable in-app, video player full-height default with 16:9 toggle
e9ea944a
Add Công Nghệ to homepage (from DanTri)
e190ad6b
Fix video player: 1:1 = square crop (object-fit:cover, full height), toggle to 16:9
59ce1f93
Add vnreview.vn AI scraper + /api/vnreview_ai endpoint
308f50bb
Replace DanTri tin nổi bật with vnreview AI slide (🤖 Ứng dụng AI)
6003e2e6
Replace vnreview with genk.vn AI (articles readable in-app via .knc-content parser)
76b264ca
AI slide: genk.vn articles open in-app (readable), not external
5faf2984
Fix genk.vn scraper: search 6 levels up for images, filter avatars/logos
366c0ff4
temp
a966f51d
Delete static/fix.js
08acb916
Fix: AI slide reads in-app (readArticle) instead of window.open redirect
8a812747
Fix: genk AI images via OG fallback, dedup article images, livescore default=today
f9e31012
Restore main.py from commit 8a81274
213936d1
Fix: genk AI slide images with OG fallback + dedup article images + livescore default=today with auto-switch to live
d1b45994
Fix: genk AI OG image fallback + dedup article images (figure only, no standalone img)
7897c57c
More AI articles (30), OG fallback for all, replace Công Nghệ with Ứng dụng AI on homepage
f02fb9d6
Replace FPT shorts with DanTri+SucKhoe shorts, filter AI articles without images
ed7222c4
Force rebuild - add ffmpeg for yt-dlp
d190d4e8
Restore main.py from f02fb9d - fix SyntaxError
f84707f8
Replace FPT shorts with DanTri+SucKhoe channels, increase AI image OG threads, fix all missing thumbnails
833b482e
Restore from 8a81274 + apply: shorts @baodantri7941+@baosuckhoedoisongboyte, genk AI 30 articles+OG fallback, homepage genk_ai replaces cong-nghe
4d8e550b
Fix shorts: use @baodantri7941 + @fptbongdaofficial, increase timeout to 90s, sequential fetch for reliability
aa5083a4
Fix: add @baosuckhoedoisongboyte to shorts (parallel), limit OG fallback to 5 items for speed
5bbadb76
Fix homepage load: genk_ai loads async after initial render (no more blocking)
1763750f
Revert to aa5083a: main.py
d8f62368
Revert to aa5083a: index.html
fe806fc4
Fix: shorts @baodantri+@baosuckhoedoisong sorted newest first, genk AI parallel OG fetch for all missing images
ccc872f4
Fix shorts: --no-check-certificates for SSL fix, 15 per channel
82bbf99c
Fix: shorts video 9:16 full height (object-fit:cover, 100vh)
99c41010
Add @duongdenworldcup_2026 shorts (30 videos) + /api/shorts/worldcup endpoint
f733be84
Add World Cup 2026 shorts slide above Dân Trí shorts
92df7029
Fix shorts: sequential fetch (more reliable), timeout 120s, duongdenworldcup as fallback
4fc94ce7
Fix shorts: timeout 60s, baodantri primary + baosuckhoedoisong fallback
4bd76c6c
Fix: swap shorts order in Promise.all (worldcup first=fast, dantri second=slow)
4d2b9a42
Fix shorts: duongdenworldcup as fallback when baodantri/baosuckhoedoisong fail
7d88c180
Fix shorts: timeout 30s, baodantri first then duongdenworldcup fallback (skip baosuckhoedoisong)
5eb0d07b
Revert to aa5083a
af71575e
Revert to aa5083a: index.html
b1e53647
Shorts: @baodantri7941 + @baosuckhoedoisongboyte, timeout 30s, --no-check-certificates, sorted newest
d09c715d
Rename shorts slide: Dân Trí & Sức Khỏe
73ae545b
Shorts: baodantri+baosuckhoedoisong with duongdenworldcup_2026 fallback (guaranteed content)
90ceb2ee
Add /api/shorts/worldcup - fetch ALL shorts from @duongdenworldcup_2026
7d347ca9
Add World Cup 2026 shorts slide above Dân Trí & Sức Khỏe slide
e5110566
Fix worldcup shorts: dedicated 90s timeout (not shared with 30s shorts timeout)
b9a23154
Revert to 90ceb2e
d3044b19
Revert to 90ceb2e: index.html
c3813ca4
Revert to d09c715
09166cfc
Revert to aa5083a
a62d6d29
Revert to aa5083a: index.html
043de389
Revert to 90ceb2e
1cf951bf
Revert to 90ceb2e: index.html
40c4d3e3
Fix homepage: add .catch() to shorts fetch so page loads even if yt-dlp fails
74743339
Fix homepage slow load: async shorts + reference-style 9:16 fullscreen shorts viewer
d22e0a32
Fix shorts load fast: parse YouTube shorts HTML for DanTri+SucKhoe; remove Genk from blocking homepage scrape
dc469413
Fix homepage load fast: load AI and shorts slides asynchronously after initial render
0d3593b2
Add persistent shorts stats/comments API (views, likes, shares, comments)
79bb8769
Add shorts interactions UI: views, likes, comments, shares, auto-next on YouTube ended
781391cf
Make shorts stable: fast scrape plus static fallback for DanTri/SucKhoe, cache v3
90f76170
Add Thethaovanhoa World Cup 2026 scraper + in-app article parser
04c87734
Add Đường đến World Cup 2026 slide from Thethaovanhoa with in-app reading
c95a3a05
World Cup RSS all articles + persistent AI rewrite wall APIs
39c3d679
Add AI rewrite/share-to-wall button and homepage wall UI
b8a71c0c
Add AI rewrite/share button to article view
102aef0f
Add AI wall slide and browser Vietnamese AI short creator
14bc600e
Speed up homepage with lazy-loaded sections
9727b8aa
Restore frontend before AI wall and 9:16 short creator
41038c42
Restore Space to commit b8a71c0
135fb59c
Restore main.py from b8a71c0
5abd4757
Restore static/index.html from b8a71c0
9f6bef71
Add lightweight AI rewrite tone selector and local AI wall slide
15845af5
Use server-side AI wall and server rewrite endpoint
ee1caac6
Restore livescore, shorts, highlights, World Cup road while keeping server AI wall
fea27605
Restore livescore shorts highlights worldcup sections without AI wall
02798781
Restore b8a71c0 UI and append AI rewrite wall safely
b027175d
Topic-aware AI rewrite voice style
a966d8b0
Append AI wall and rewrite without removing features
3b645583
Restore b8a71c0 frontend and append AI wall safely
480693ec
Restore main.py to revision 0279878
e80fd295
Restore static/index.html to revision 0279878
a7b84186
Restore main.py to revision a966d8b
4d9a2c6a
Restore static/index.html to revision a966d8b
5066b9eb
Restore main.py to revision b027175
bc44def2
Restore static/index.html to revision ee1caac
172841f6
Restore index.html from 8a81274 - has Livescore, Shorts, Highlight, Highlight by league, World Cup 2026
8274b7cb
Restore homepage features: livescore shorts highlights league highlights world cup
0af187ec
Restore homepage features: livescore, shorts, highlights, league highlights, AI wall, World Cup 2026 from TheThaoVanHoa
702a71e9
Fix AI slide images, dedupe article images, default livescore to today with live auto-switch
4603e548
Improve AI rewrite: Qwen2.5-VL router fallback + full article context + topic/url wall endpoints
84e8b2b8
Add homepage AI composer (topic+URL) and wire to wall endpoints
883d436e
Fix URL-to-wall: accept summary fallback and og:title for TTVH articles
45e90742
Fix AI rewrite completeness, generic URL scraping, web-context topic posts
f9e97af0
Fix wall UX: prepend AI posts immediately without page reload
8bfef2ef
Fix Space error: remove duplicate /api/wall decorator
d496a668
Improve topic posts: use Google News RSS web context before fallback
6505e8da
Add AI wall topic/url Qwen2.5-VL extension
b6f0232f
Run AI extension app and add huggingface_hub dependency
21932955
Fix AI URL input persistence and improve internet-sourced topic posts
88518240
Fix AI scraping with Jina Reader/Search and require Qwen for summaries
d5050aa2
Remove AI compose box and fix HF token/Qwen/Jina handling
5cd9dd01
Fix URL scraping with Jina fallback and topic posts from real article content
27d6a5b1
Fix Space error: remove duplicate wall decorator after URL/topic patch
b2cd7316
Fix topic posts: summarize filtered news context directly, avoid Google News redirect scraping
0bf88ffc
Fix topic AI: filter readable article sources and summarize actual article bodies
fb934748
Fix duplicate AI wall: mark initial wall for replacement
ce9dd6f4
Improve topic filtering: require keyword relevance inside article bodies
62d9dcf2
Change AI rewrite to concise main-point summaries only
90c28002
Add TTS/image deps for AI shorts generation
ac767d50
Summaries only and add AI shorts video generation from wall posts
92a492b8
Patch AI wall compatibility endpoints and frontend overrides
44b815d6
Run patched AI app with compatibility endpoints
93f87730
Fix AI summaries dedupe and clarify shorts creation flow
d95f6659
Fix Qwen readiness: add HTTP router fallback and extractive fallback
df9f27fb
Improve topic rewrite context, add voice/emotion short options and AI shorts slide
b9eda7f0
Fix topic data fallback, improve AI short progress UI, 1.2x voice and sentence pauses
0fb89d6f
Add edge-tts for selectable Vietnamese male/female voices
02e92fba
Topic creates per-article summaries, edge-tts voices, full-width text and burned subtitles
523f7be1
Final AI topic aggregate and short timing fixes
44b174db
Run ai_fix2 patched app
a0435869
Fix topic scraping real article bodies and subtitle timing/font
0cc3b1f5
Restore runtime to ai_patch app
33c3dda0
Restore AI patch and replace subtitles with segmented shorts synced to voice
0d29d760
Fix ai_patch syntax/self import and stabilize segmented shorts
90c15edb
Restore Dockerfile to revision 0cc3b1f
78bd0cf4
Restore Dockerfile to revision 44b174d
9d8092b0
Restore Dockerfile to revision a043586
41eba188
Restore Dockerfile to revision 90c15ed
18bad018
Finalize restore of livescore shorts highlights worldcup and remove AI wall UI
4a45527a
Restore ai_ext.py from 33c3dda
82dd0491
Restore Space to revision 33c3dda
ba0e89f1
AI short scenes per summary segment without subtitles
07a34c42
Restore Space to revision 33c3dda
bcaa2dc8
AI short: separate timed summary scenes, remove subtitles
b0588d74
Add runtime patch for stable JSON url_wall/topic_post endpoints
73917efb
Load runtime patch before serving app
da4abcca
Add frontend safeJson injection for robust AI post creation
84dd1f05
Restore runtime to commit bcaa2dc via snapshot download
96ee3ffc
Run restored revision bcaa2dc at startup
9d3d370c
Run ai_patch directly instead of restore runner
80eaf427
Runtime patch: segmented shorts without subtitles and aggregate topic summaries
65b6e3ad
Run ai_runtime segmented short app
03c66d37
Fix: short captions centered bottom no dots, source badge on image, wall posts include all images from URL, remove topic input keep URL input only
579829ca
Patch AI rewrite UI, URL images, and short frame layout
a27cf19b
Final runtime overrides for URL-only AI, image gallery, and short layout
c53c3ff3
Run final AI runtime overrides
cd815279
Use restored full UI if local static index is placeholder
eee056aa
Fix URL input full-width, article-only images, domain source badge, add VN voices
7206c118
Strict article images, per-slide images, Vietnamese TTS fallback, no-reload posts, share AI
c504a4c0
Improve article image detection without over-filtering
5ec348f9
Run final2 runtime with improved article image detection
d2e08797
Add topic Qwen posts, robust YouTube shorts, TikTok actions for shorts and AI shorts
be111321
Run final3 runtime for shorts actions and Qwen topic posts
edd8bb91
Fix topic button, shorts homepage, ask AI for videos and articles
c2262382
Run final4 runtime for topic button, shorts, and article AI ask
7b2cfdd8
Fix duplicate topic input, knowledge topic prompt, and direct shorts playback
cb8a7597
Run final5 runtime for topic dedupe and direct shorts playback
0cc8f3e6
Ensure topic post appears on wall without reload
0a1291e7
Run final6 runtime for single topic box and wall insertion
40766521
Consolidate AI wall, persistent comments/shorts, direct shorts player, better Qwen topics
53ee7c5b
Fix AI short generator call for persistence
675b8242
Run final8 runtime with persistent short fix
1f823b43
Export missing runtime symbols for final7/final8 imports
106fc3d9
Restore Space runtime to revision 53ee7c5
cfc41e3b
Run restored revision 53ee7c5
21572f91
Restore Space to revision cb8a759
52925080
Fix restore runner target for cb8a759
e4669993
Add restore runner for cb8a759 app target
5c6ffe29
Patch cb8a759 restore for topic dedupe and stable shorts
c53b3cd8
Fix syntax error in cb8 restore patch string
b287e562
Stable cb8a759 patch for AI topic and YouTube shorts
261a870c
Fix error and run stable cb patch runtime
fc49e5d6
Add restore runner for revision 53ee7c5
4442fd63
Restore Space runtime to revision 53ee7c5
fc05cd5c
Improve latest YouTube shorts feed and direct player
49f40b01
Run cb patch2 for latest YouTube shorts
95a537f4
Patch 53ee7c5 restore for live YouTube Shorts display and playback
7807176d
Run restored 53ee7c5 with Shorts live patch
76ec43bb
Robustly fix Dantri SKDS shorts display and direct playback
fe1da154
Run shorts fix runtime
ab523962
Stable cb8a759 runtime with fixed Dantri SKDS shorts
d1072a38
Run stable cb8 shorts fix runtime
106d9421
Fix Internal Server Error in shorts runtime index loader
426e4aca
Patch cb8a759 restore with working Shorts feed and player
552791f3
Run cb8a759 with patched YouTube Shorts feed/player
9336a6f9
Restore Space to revision 53ee7c5
b498712f
Patch 53ee7c5: dedupe Shorts and improve topic article model/prompt
e0c9dbdc
Run 53ee7c5 with Shorts dedupe and better topic model patch
519a0a36
Fix AI wall persistence on homepage and no reload for topic posts
bb74e32f
Improve topic article model and sanitize prompt-like outputs
0c151e5f
Restore 53ee7c5: delete ai_runtime_cb8_shorts.py
28f7bb3d
Restore 53ee7c5: delete ai_runtime_cb_patch.py
984367c9
Restore 53ee7c5: delete ai_runtime_final8.py
f32660a4
Restore 53ee7c5: delete ai_runtime_cb_patch2.py
4fd33b9b
Restore 53ee7c5: delete ai_runtime_shorts_fix.py
295cf322
Restore 53ee7c5: delete restore_53ee7c5.py
8d4724f5
Restore 53ee7c5: delete restore_patch_shorts.py
5d95c388
Restore 53ee7c5: delete restore_cb8a759.py
b2b5d581
Restore 53ee7c5: delete restore_patch_topic_shorts.py
beeb6676
Restore Space to revision 53ee7c5
2ca9c7e0
Fix topic AI uses web context and force restore DanTri/SKDS shorts on homepage
8453c4db
Speed up homepage shorts: instant fallback + background YouTube refresh
d37b7355
Fix AI topic synthesis and deduplicate Vietnamese shorts titles
bd589f81
Fix topic AI synthesis and de-duplicate/translate Shorts titles
577097b8
Robust web synthesis and stable latest Dantri/SKDS shorts
57f39a26
Add hot Google keywords under topic box + improve topic research guidance
8bec4090
Improve topic synthesis with multi-source article crawling and quality gate
ce1bb121
Patch VN hot hashtags and reliable RSS topic sources
8bd4af1a
Make topic generation fast using RSS cache and timeout
c4d591c8
Fix slow homepage with fast RSS endpoints
eef96bda
Show source article contents inside topic-generated article
6c90b8ab
Clean topic prompt leakage and open source links in-app
9f22b779
Restrict hashtags and topic sources to selected Vietnamese sources
d4a0b485
Limit topics to requested VN sources and speed homepage
b9b6ba46
Remove prompt leakage, add rewrite button, restore stable shorts
fd860599
Restore 53ee7c5 and patch shorts/topic AI
0c44863f
Restore to 53ee7c5 with minimal shorts/topic patch
3002f203
Restore b9b6ba4 and patch topic rewrite/shorts
232ee22d
Restore b9b6ba4 with prompt/shorts patch
7dbefc97
Restore Space runtime to revision b9b6ba4
d7f41b21
Run restored b9b6ba4 snapshot
9b500ed2
Patch restored b9b6ba4 for AI ask, faster shorts, clean topic output and rewrite buttons
df997b0b
Add stable runtime entrypoint to recover Space from restore snapshot error
efd25ff2
Fix Space crash by running stable current-repo runtime
c93863b0
Fix stable runtime full UI loading from final runtime chain
44a4f30d
Add restore runner for revision b9b6ba4
79220094
Restore Space runtime to revision b9b6ba4
f085d5e2
Restore Space to revision d7f41b2
43908476
Run restore runner for d7f41b2 snapshot
510f4b7a
Add restore runner for b9b6ba4
da8757c9
Restore Space runtime to commit b9b6ba4
75935519
Restore Space to revision b9b6ba4
ed0a702e
Run restored revision b9b6ba4
85c64e71
Patch restored b9b6ba4 placeholder static index from restore branch
81f974f9
Also patch /app/static/index.html during restore
67a9b4ab
Add runner to restore exact b9b6ba4 snapshot
78c49246
Restore Space to exact b9b6ba4 runtime
6e21fafa
Patch b9b6ba4 topic prompt, fast shorts, and topic article actions
66605daa
Run b9b6ba4 snapshot with patch module
c7ef81df
Use b9b6ba4 original index output before applying patch
589a6394
Restore b9b6ba4 with safe runtime patch for topic cleanup and fast shorts
0d607acc
Hotfix b9b6ba4: clean topic output, fast shorts, topic actions
7cac0c5b
Run b9b6ba4 hotfix runner safely
5786e17d
Fix hotfix runner index loader references
6ac5829e
Add clean b9b6ba4 runner with no hotfix layers
d5405482
Add safe wrapper app to prevent Space crash on runtime errors
5a381fd2
Add guarded hotfix patch for safe app
8036cd30
Run safe app wrapper to prevent Space crash
89987340
Run final8 after persistent short generator fix
7dd8420b
Restore runtime to b9b6ba4 with non-placeholder index hotfix
c20a51f7
Run b9b6ba4 restore snapshot with index hotfix
0a518f6f
Restore exact b9b6ba4 snapshot without hotfixes
73451c77
Remove files not in b9b6ba4
cc4cedf6
Restore to b9b6ba4 via snapshot_download
5bef4c70
Restore 100% to b9b6ba4 via snapshot runner
917c63bf
Post-restore patch: clean topic output, add rewrite+wall+links buttons
12b8b9bd
Patch: clean AI output and add rewrite/source buttons to topic posts
fb99322b
Add post-load patch: strip AI instructions from topic posts, add rewrite/link buttons
ef67ab0f
Restore Dockerfile to b9b6ba4 (run ai_runtime_final6)
c02b2582
Patch: fix source links persistence, AI wall slide, rewrite button in topic articles
31102dd3
Run ai_runtime_patch on top of final6 for source links and wall slide fix
acbbb6ce
Run final8 runtime after consolidation
40da3903
Restore exact revision b9b6ba4
73c9c045
Remove leaked prompt instructions from topic posts
a64bc186
Run final9 runtime with topic instruction cleanup
5e8fc83c
Fix Space crash: remove missing ai_runtime_final8 import
d5951d41
Fix Space crash: import final6 directly instead of broken final7
2f56bd89
Restore topic source links, clean redundant text, add rewrite for topic posts
ed3968dd
Run final10 runtime for topic links and rewrite
065c7473
Clean remaining topic instruction and add rich source cards with in-app viewing/rewrite
53a9533b
Run final11 runtime for clean topic links and source reader
c0eb53f7
Fix Space crash: import Query from fastapi
c41c6e0b
Restore Space runtime to exact b9b6ba4 snapshot
ebeb678d
Run restore runner for exact b9b6ba4 version
47de245d
Restore to b9b6ba4: run ai_runtime_final6
19fa4a13
Remove files not in b9b6ba4 to restore exact version
1f78d68a
Remove leftover runtime files not in b9b6ba4
e3af78a7
Restore restore_runner.py to b9b6ba4 version
88f93b7f
Patch: fast home, source thumbnails, rewrite button in articles and topics
546d76a9
Run patched runtime for faster home and rewrite buttons
7c3efeda
Topic posts: filter irrelevant content + source links open in-app via readArticle"
79fa1c86
Background prefetch on startup + instant cache response for homepage speed"
c1e27033
Fix: strip prompt from topic text, persist source_details on reload, AI ask from content, dedupe rewrite btn
9f0cfe6b
Bypass deep import chain: direct main import for fast startup + fix all issues"
f21c48d3
Run app_fast.py for instant startup and homepage"
6e9bf25d
Restore to c1e2703: remove app_fast.py, restore Dockerfile
6141c90b
Restore Dockerfile to c1e2703
e7b65d8a
Restore ai_runtime_patch_fast.py to exact c1e2703 version
a08eba10
Add persistent source_details render, topic rewrite, and short comments"
144a193b
Fix: single rewrite btn, 24h TTL for wall/shorts, AI ask uses article content"
09b68ef0
Fix: topic rewrite uses post text if no URL, AI ask answers naturally based on content"
ce8ef964
Fix: add /api/topic/rewrite handler and natural AI ask prompt
d529d07b
Fix: persistent data via HF Dataset, single ask box, working rewrite"
decdd253
Fix: scrape URLs on rewrite, in-app links, natural AI, persistent check"
e8bc7d71
Fix: single rewrite button, guaranteed rewrite success, short button after rewrite"
7bcd2f83
Fix: Short AI same layout as YouTube shorts, source links with image + VNEWS button, storage guide"
76fa7325
Fix: hide old source/short-AI renderers, show comment count, force VNEWS link buttons"
9acb2dd0
Fix: topic rewrite no-URL error, remove duplicate AI short slide, full interaction buttons"
7e390ce0
Fix: right panel position, kill duplicate slide renderers, add short creation progress toast"
c808efaf
Delete PATCH_NOTES.md
f730069d
Fix tiktok-right position, kill old renderers, add progress toast
98a5a214
Wrapper to inject extra CSS/JS fixes after main patch"
c250c973
Run app_entry.py with extra fixes for tiktok buttons and duplicate slides"
c6d23317
Fix: auto title rewrite, % progress bar for short, topic uses source og:image"
436045cd
Auto title for rewrite, topic uses source og:image instead of AI image"
1de98fce
Fix: remove FINAL6E causing slow load and DOM destruction, keep short button after rewrite"
98cd03aa
Fix: don't delete new slides, keep Short AI button after rewrite, faster home"
643d1c0a
Prevent ensureNewsShortsHome from overriding slides, keep AI wall+short slides"
65274184
Restore app_entry.py to c6d2331
8aa2d37c
Restore patch_extra.py to c6d2331
ce5a8ee3
Auto title for rewrite, topic uses source og:image"
f3c722bd
Fix: ensure rewrite has image, updates wall, short works after rewrite"
9d6983e7
Add missing livescore CSS for updated bongda.com HTML"
a6352649
Add comprehensive CSS for all livescore tabs: BXH, commentary, stats, match detail"
689f9b91
Fix: highlight fullheight TikTok layout, prevent slide deletion after load"
2aaf385e
Remove FINAL6E_INJECT (causes slide deletion), fix highlight 1:1 layout with interaction buttons"
cdb04893
Fix slow load: homepage returns immediately even without cache, never blocks"
f7850632
Kill renderTopicWallE BEFORE old injects run, not after"
de6789eb
Enhanced highlight layout with interaction buttons, ensure source details visible"
bc81294b
Fix: highlight as TikTok feed, single wall, clean rewrite text"
75c8c81e
Clean rewrite text, remove junk phrases, better prompt"
8328df11
Restore app_entry.py and patch_extra.py to c6d2331 before clean rewrite
4f5713c2
Restore patch_extra.py to c6d2331
f271a91f
Clean rewrite: single unified patch replacing app_entry + patch_extra"
2e430e68
Switch to unified patch v2"
3002813c
Remove file not in c6d2331
37b92804
Restore Dockerfile to c6d2331"
61cea15b
New unified patch v2: all features in one clean file, no conflicts
71dcdcb9
Run unified patch as entry point"
6a500765
Fix highlight: fetch league data if empty, never show 'no video' incorrectly"
c1a1e9e1
Delete _temp_fix.txt
7d12eacb
Fix highlight: fetch league from API if _hlLeagueData empty"
b94a27c8
Run app_final.py with highlight fix"
3ae926a0
Fix: let renderTopicWallE run (renders Tường AI), only block duplicate Short AI"
e26bab91
Fix: PRE_KILL also blocks renderPatchedWall, renderAiShorts, renderWall"
2da1f13b
Fix: hide duplicate wall from loadHome, ensure wall renders after bg refresh"
beca1892
Add highlight interaction counts (persistent) + 16:9 toggle button"
b1c64f68
Fix: override openLeaguePlayer completely in HIGHLIGHT_INTERACT_JS with all buttons"
5a5b6269
Add inline hashtag sources on homepage with rewrite button"
f5a644a8
Delete _temp.txt
71ffd13e
Hashtag inline: show sources on homepage + rewrite button"
4cb3c62d
Add hashtag inline sources to app_final.py"
0144c7bc
Move HIGHLIGHT_FULL_OVERRIDE to separate importable file"
81e261b6
Delete highlight_override.py
111894a7
Clean app_final.py: unified fix + hashtag inline, no broken exec"
ed79f7e2
Restore to 5a5b626: remove extra file
686ff272
Restore app_final.py to 5a5b626 + add inline hashtag sources with rewrite button"
8b1f1814
Fast hashtag sources (no og:image scrape inline), loading spinner, topic input same flow"
3146fb17
Delete _temp.txt
da06cd7e
Fast hashtag: no inline scrape, spinner, topic input triggers same sources view"
cf610cfc
Override root to add fast hashtag UI + topic input same flow"
6efe66fd
Run app_run.py with fast hashtag"
a31de866
Fix: hashtag sources use Google News search for relevance instead of generic RSS pool"
9b3c04d7
Fix: readArticle supports ALL URLs via /api/article scrape, no external links"
fd0fe75b
Fix: /api/article supports ALL URLs via generic scrape + Google News redirect follow"
62f29843
Hashtag sources: stricter relevance, newest first, load more pagination"
08cde7c8
Fix: use real article URLs from DDG search instead of Google News redirect URLs"
55d7435e
Delete _temp2.txt
58d24bc3
Fix: use VnExpress/Dantri/Vietnamnet direct search for real URLs, not Google News"
bd921766
Hashtag: more results from Google News, sorted newest, load more button, strict filter"
92b913fe
Fix: hashtag uses VN news search (real URLs) instead of Google News (undecoded)"
97d6adb6
Delete _tmp.txt
2af9e606
Override hashtag to use VN news direct search (real URLs, scrapable)"
b856d888
Run app_main.py with VN news search"
31ed1b02
Fix: split CamelCase hashtag into words before searching (BóngĐáViệtNam → Bóng đá Việt Nam)"
91b309bf
Fix: hashtag uses topic field (pre-split) not label, works for all languages"
7aeece12
Fix root cause: remove HTML onclick attr from chips, use data-topic from FINAL6 topic field"
9981d9de
Restructure: new homepage layout, news tab, more sources, auto-load hashtag"
f447de9c
Force rebuild: trigger Space rebuild with app_main entry point"
20713043
Fix: use MutationObserver to hide news sections immediately when they appear"
4c594e55
Delete _tmp2.txt
74d04b89
Force hide news grids on homepage via CSS (instant, no JS delay needed)"
78e8191d
New clean static/index.html part 1: HTML structure + full CSS + core JS initialization
d66b09c9
Part 2-4: Complete JS for loadHome, hashtag, livescore, articles, shorts, highlights"
0e305e77
index_v2: load JS from separate file app_v2.js"
012aca79
Remove all comment/bình luận features from video feeds per user request
d5c4d43a
app_clean.py: Clean backend serving index_v2.html with all APIs preserved
f983fa64
Switch to app_clean.py as entry point for clean v2 frontend
269db868
Serve clean index_v2.html frontend, remove comments, mount /static
62bd220a
Revert to app_main:app entry point (now serves clean v2 frontend)
1a996ee3
app_v2.js: restore interactions counters, comments inline on videos, shorts interleaved
9678f6f7
Add inline comments CSS to index_v2.html
7341c02b
Add persistent interactions + comments API (views/likes/comments stored on /data)
510e6474
Add World Cup 2026 scraper module: fixtures, standings, stats, news from bongda.com.vn
bfa1eaa8
Add World Cup 2026 API endpoints + background refresh thread
b6373709
Add World Cup 2026 LIVE section with auto-refresh + interleaved news/road content
cc6ee0cf
Include wc2026_v2.js + add WC2026 CSS styles
704a7d65
Fix: WC2026 rendered inside loadHome (not lost), hashtag search with relevance filter
0c4338a7
Fix wc2026_v2.js: remove duplicate init, keep only render functions + live refresh
016650c8
Fix hashtag: add relevance filter - only show articles with topic keywords in title
2adafa42
Rewrite wc2026_scraper: use real sources (VnExpress RSS, livescore.com, search) instead of SPA bongda.com.vn
9a373323
Fix WC2026 scraper: use bongda.com.vn internal AJAX API (same as livescore) with tournament_id=24254
46d9fb44
Update wc2026_v2.js: render bongda.com.vn HTML directly (same as livescore)"
20e6f491
WC2026: add team stats, H2H, lineups, match details + fix CSS for tables"
2e130468
Add WC2026 H2H, lineups, match detail, history API endpoints + fix CSS in frontend
d89e007c
WC2026 frontend: add History tab, fix CSS for bongda.com.vn HTML tables/lists, match click for H2H/lineups
9c03e95a
Add CSS for bongda.com.vn HTML content inside WC2026 section + add History tab
a4b9ad50
Add History tab to WC2026 section + link wc2026.css in HTML
7882b486
Add wc2026.css link + fix WC tabs to include History tab via post-load script
97942d50
index_v2.html: add wc2026.css link + WC History tab patch inline
107982d1
Fix: WC2026 fixtures/standings ONLY use tournament_id=24254, no fallback to all leagues. Fix CSS."
db376977
Fix wc2026.css: complete styles for bongda.com.vn BXH tables, fixtures lists, match details"
f90bdab0
Clean up temp files
cf744a44
Add wc2026.css: styles for bongda.com.vn HTML content in WC section (same as livescore)"
108b8459
Add 'Lịch sử' tab to WC2026 section in loadHome()"
930d9664
Fix: add Lịch sử tab to WC2026 section HTML in app_v2.js + delete temp file
49f08c72
CRITICAL FIX: Aggressively remove ALL old '/' routes + move mount to end + ensure v2 frontend is served
c212cd85
ROOT CAUSE FIX: New clean entry point that imports main.py directly, bypasses ALL injection layers"
d165dece
CRITICAL: Switch to app_v2_entry.py - bypasses ALL injection chain, imports only main.py"
e8889215
Force rebuild - add build timestamp to trigger fresh Docker build
31750699
Remove old static/index.html (was being served by StaticFiles mount from main.py)"
ba23411f
FIX: Remove ALL old routes AND mounts from main.py before registering new ones"
53e3f282
FIX WC2026: BXH dùng tournament_id=24254, fixtures/stats dùng news thay vì API không hỗ trợ filter"
0c18ead3
Fix wc2026_v2.js: inject inline CSS for external HTML content + proper dark theme for tables"
c3059803
WC2026 fixtures: try ALL candidate bongda.com.vn API endpoints in priority order"
d349e0d9
Add /api/wc2026/debug endpoint to see which bongda API endpoints work"
e6b4b036
FIX FINAL: WC fixtures uses iframe embed of bongda.com.vn (API doesn't support tournament filter for fixtures)"
fe6f8f02
WC2026 fixtures: scrape from bongda24h.vn/vck-world-cup/lich-thi-dau-41.html (server-rendered)"
6c0bef87
wc2026_v2.js: fixtures tab renders scraped HTML from bongda24h.vn (no iframe)"
353305bf
Fix white boxes: force dark bg on all elements, hide broken images, remove inline white styles"
032498ac
FIX: scrape WC2026 fixtures from bongdanet.net (server-rendered, dedicated WC page)"
85b1e182
FIX: Parse WC fixtures into structured JSON data, render with own CSS (no raw HTML injection)"
63755bfd
FIX wc2026_v2.js: render fixtures from JSON matches array (no raw HTML injection)"
d3bc03da
Fix fixtures: scrape from worldcup2026.thanhnien.vn/lich-thi-dau as user requested"
e8f23f2e
FIX ImportError: update imports to match new wc2026_scraper.py (no FIXTURES_CANDIDATES)"
4d22c6da
Fix fixtures tab: scrape schedule IMAGES from tienphong.vn article (infographic layout)"
db638150
Fix wc2026_v2.js: render fixtures as infographic images (from tienphong.vn)"
443361e4
WC fixtures: render as styled HTML table matching tienphong.vn infographic layout (not images)"
6ce96ef7
wc2026_v2.js: render fixtures as CSS-styled cards matching tienphong.vn infographic layout"
e312224a
Debug: add /api/wc2026/debug endpoint to check what tienphong.vn returns"
0f3ffd00
Add debug endpoint + import debug_fixtures from wc2026_scraper"
d37b9612
Remove temp file
fc5376c0
WC2026 fixtures: hardcode official FIFA schedule (104 matches, giờ VN) - guaranteed correct"
7eda38fd
Fixtures: load from static JSON file (official FIFA data, guaranteed correct)"
692f9d2b
Fix WC2026: scrape fixtures+standings from dantri.com.vn/the-thao/world-cup (server-rendered)"
a3ce762c
Update wc2026_v2.js: fixtures now returns html from dantri (not infographic images)"
d085dc00
Fix CSS: proper image sizing (flags vs banners), table backgrounds, hide large non-flag images"
85f70856
REAL FIX: scraper removes all images/junk, keeps ONLY tables+match data. CSS forced dark."
de7bd029
Fix CSS + strip images in JS after render as safety net"
0cbe29fa
Fix wc2026.css: complete dark theme for .wc-data-box tables, force !important"
124d42b6
Fix: Keep flag images in tables, only strip large/banner images. Show dantri layout intact."
7774011b
Fix CSS: keep flag images visible in tables, dark theme matching dantri layout"
457edce4
Fix JS: do NOT remove images (flags kept by backend), only remove inline styles"
f35c4f5f
FINAL FIX: Self-render fixtures+standings with hardcoded WC2026 data + flag CDN. No more broken scraping."
c5e06a51
CSS for self-rendered WC tables: clean, uniform flags 20x14, proper dark table layout"
38661836
CORRECT FIX: Use Sofascore/Flashscore widget iframe for fixtures+standings (always accurate, livescore included)"
d47077dd
Fix JS: allow iframe rendering for Flashscore widgets in fixtures/standings tabs"
3b7c9fab
Simplify CSS for iframe-based WC content"
486b1158
WC2026 fixtures: hardcode official FIFA schedule (104 matches, VN time, stadiums) + live score integration + fix news images"
bd5d01d4
Fix: render fixtures as styled table (stadium, time VN, live score), news with images"
ce46c2ab
Fix WC2026 official schedule: scrape tables/images from TienPhong official article; restore news images
92c43c23
Fix WC fixtures renderer: support official tables/images and restore news images
a59b50f0
CSS: support WC fixture tables/images and news thumbnails
69e57c3f
COMPLETE FIX: Use fixturedownload.com JSON (104 matches, stadiums, UTC→VN time) + fix news images + hashtag"
aa67f6bc
Frontend: render fixtures from JSON (group tables, stadium, VN time, live scores)"
fe9bf66e
CSS: fixtures table (dark blue theme, stadium column) + bxh data-box styling"
4f5c800e
CRITICAL: Add /api/hot_topics endpoint (was missing!), fix fixtures fallback, fix news images proxy"
9bbfaaf7
Fix fixtures download headers + add github fallback + fix news image extraction"
989df80e
WC2026 fixtures: use fixturedownload.com JSON (official 104 matches, venues, UTC→VN time, livescore ready)"
c8a7daa0
wc2026_v2.js: render fixtures from JSON (groups, venues, VN time, live scores) + fix news images"
72303813
WC2026: fixtures sorted by date, Vietnamese team names + flags, BXH table design, news images fix"
1da6727f
FIX: BXH self-rendered from fixtures JSON (groups), news always fetches og:image, livescore confirmed"
b4dce59e
FIX: WC news always fetches og:image server-side; hashtag adds bongda.com.vn + vietnamnet sources"
6d15b8da
Fix hashtag: add bongda.com.vn + more vietnamnet sources for better article coverage"
e84e9be4
delete temp file
f9928aef
Fix hashtag: add bongda.com.vn search + use 4 sources in parallel for better coverage"
a5907dbb
Fix: road_to_wc always gets og:image; hot_topics from 8 RSS sources (not just VnExpress)"
207b0630
Fix hot_topics: add VietNamNet + ThanhNien + BongDa RSS sources for diverse hashtags"
0151ff0c
Delete _hot_topics_fix.txt
fdf45c62
CRITICAL FIX: hashtags diverse (interleave sources, no over-filter), WC news interleave all sources, hot topics dedup"
1aa870eb
FIX WC news: INTERLEAVE sources (not sequential), so user sees diverse sources"
03c993a4
Fix syntax error in _news_vnexpress (| typo)"
67bd03d3
Delete _fix_syntax.py
ef2f9683
Fix syntax error: remove stray | in _news_vnexpress"
8db297bd
Delete _tmp_fix.py
9df1d606
Hotfix: patch wc2026_scraper._news_vnexpress syntax error at module load"
8caa1742
Fix critical syntax error: |or → or in _news_vnexpress + delete hotfix file"
ef2577b6
Fix syntax: replace |or with or in _news_vnexpress line 96"
ea60fd79
FIX: 1) Add article scraper for vietnamnet+bongda 2) Light relevance filter (at least 1 keyword match) 3) Remove irrelevant results"
3fb08c07
Add genk, thanhnien, tuoitre, thethaovanhoa, nghenhinvietnam to hashtag search sources (8 total)"
046cde38
LIVE mode: all homepage sections auto-refresh 60s (livescore, featured, hashtag, WC); hashtag limit increased to 12 per page"
ddfcd7af
Add live_mode.js script tag + increase hashtag per_page to 12"
284ab7fe
Delete static/_script_section.txt
764148c2
Merge live_mode into wc2026_v2.js (loaded after app_v2.js, has access to all functions)"
23fa7d62
index_v2: add live_mode.js script tag"
51ed49f8
ALL sections LIVE with badge + auto-refresh; hashtag sorted by most sources first + auto-load hottest"
1d3c56e1
Hot topics sorted by frequency (most mentioned across feeds = hottest = first); auto-load immediately"
e9356a61
Delete static/_ht_fix.txt
4721f3cd
Fix _get_hot_topics: count frequency across feeds, sort by hotness (most mentioned first)"
caaf5aff
Add WC highlight + Friendly highlights: new tab in WC2026 section + slide on homepage"
0e98611f
Add 'friendly' to HL_LEAGUES + WC highlight tab handler in wc2026_v2.js"
2e17d69f
Add 'friendly' path to HL_LEAGUES for xemlaibongda.top/giao-huu highlights"
95eabd35
Delete _friendly_fix.py
ac66edd0
FIX: Restore ALL wc2026 render functions + add highlights tab + friendly + live refresh"
ed6a8ac2
Add 'friendly' to HL_LEAGUES by importing and modifying it from main.py"
4e51d52a
Delete _fix_import.py
d12db28a
Fix: import HL_LEAGUES + add friendly path for highlights"
f0bf332e
Fix friendly path: use 'giai-khac/friendly' (correct xemlaibongda.top URL)"
47b1743f
Fix: Tin HOT = tổng hợp từ nhiều hashtag; WC news dùng 8 nguồn search (không Google News)"
7ae3e27c
Fix loadHotTopics: load tin HOT = tổng hợp từ TOP 3 hashtag nóng nhất xen kẽ"
646dd0e6
Delete static/_hotfix_topics.js
d2d6cd5c
Override loadHotTopics: tin HOT = tổng hợp từ TOP 3 hashtag nóng nhất"
59f0844d
Add hot_multi.js script tag (overrides loadHotTopics with multi-hashtag aggregation)"
54948945
FIX rewrite/topic_post: import ai_ext to get AI endpoints (rewrite_share, topic_post, ai_wall)"
72ebab0a
Update app_v2.js: Realtime AI wall prepend after rewrite (no reload)
b2f21272
Update index_v2.html: Add wall-item flash animation CSS for new AI posts
84bd225f
Fix: Use /api/wall endpoint + prepend wall section when not on homepage
659da5e3
Upload ai_ext.py
2086ac6d
Upload static/app_v2.js
bc0f4064
Upload static/index_v2.html
e09afd0d
Upload static/app_v2.js
8f5df759
Upload ai_ext.py
c139a0b9
Upload /app/static/app_v2.js
a3a4e340
Upload /static/app_v2.js
5351b47a
Upload /static/index_v2.html
62e9dc55
Upload ai_ext.py
9904f995
Delete ai_ext.py
0031a6a6
Update ai_ext.py: stricter rewrite, dedup, all images, 24 multilingual voices
31519470
Update index_v2.html: CSS for grouped voice selector
c93b5448
Update app_v2.js: multilingual voice selector grouped by country
e72a7e57
Fix rewrite: dedup sentences, complete sentence trim, merge images from direct+Jina scrape (#1)
a5363a4a
Upload patch_extra.py
87f3fb59
Upload .gitattributes
f998f1be
Upload restore_runner.py
4f67223b
Upload wc2026_scraper.py
e0ec8cc7
Upload ai_ext.py
304f5ce2
Upload .gitattributes
3db4b5c7
Upload patch_extra.py
0e489856
Restore ai_fix2.py from c93b544
e6b52d91
Restore ai_ext.py from c93b544 - AI extension endpoints
b8db1704
Restore restore_runner.py from c93b544
cce84a11
Restore wc2026_scraper.py from c93b544
0dabb0ae
Restore ai_runtime*.py chain from c93b544 (part 1: ai_runtime.py + ai_runtime_final.py)
cc8a3abd
Restore ai_runtime_final.py from c93b544 - final runtime overrides with article-only images
ffa275aa
Delete restore_runner.py, patch_runtime.py, patch_extra.py, app_entry.py, app_clean.py, wc2026_scraper.py, ai_ext.py, ai_fix2.py, ai_patch.py, app_v2_entry.py, Dockerfile, .gitattributes
89bccb2f
Restore: ai_ext.py, ai_fix2.py, ai_patch.py from c93b544
bb8388c6
Restore Dockerfile from c93b544
0e669ffb
Restore app_v2_entry.py from c93b544
829fde6d
Restore to c93b544 (#4)
a4355473
Restore complete ai_runtime.py from c93b544 (18.9KB)
eb55d03e
Test upload size - first half of ai_ext.py from c93b544
0edf2113
Restore: ai_fix2.py (full), app_entry.py, patch_extra.py, restore_runner.py, app_clean.py, wc2026_scraper.py from c93b544
ca8c13bc
Restore ai_patch.py from c93b544
d05bd1bb
Fix ai_patch.py - restore full file from c93b544
2f1b18b2
Restore app_clean.py from c93b544
3ed3643e
Restore restore_runner.py from c93b544
d03c0a8d
Restore app_entry.py from c93b544
b2c34de9
Restore patch_extra.py from c93b544
272ab76f
Restore wc2026_scraper.py from c93b544
a5553d93
Restore patch_runtime.py from c93b544
b36130e0
Fix app_v2_entry.py - restore from c93b544
2bd8e4a9
Fix ai_runtime.py - restore from c93b544
d6fd7a7c
Fix ai_fix2.py - restore from c93b544
3a998dba
Fix ai_runtime_final.py - restore from c93b544
b069982a
Fix ai_ext.py - restore from c93b544
db9a6c63
Add /api/rewrite_slide: fast summary as slides (key points + images from article, no AI timeout)"
022faf75
Import rewrite_slide module to register /api/rewrite_slide endpoint"
48cc0598
Delete _import_fix.py
6ebe0280
Dockerfile: preload rewrite_slide module at startup"
176aa51c
RESTORE: copy index_v2.html from c93b544 version (complete with all CSS + scripts)"
8600b563
Delete RESTORE_NOTE.md
c40ea540
FIX: rewriteArticle calls /api/rewrite_slide (correct endpoint name from rewrite_slide.py)"
9ecd1aab
FIX CSS: broken fm-league rule (missing }) + add rewrite_fix.js script"
da7b43a0
Critical CSS fix + rewrite endpoint fix in one patch file"
a2f4886a
Inject CSS fix + rewrite patch at runtime (fixes broken fm-league CSS + rewrite endpoint)"
99535df3
Force all CSS with !important to override broken inline style
99414cb6
Add progress-toast + cache bust v2 to fm_fix.css
ca3ba978
live_mode: cache-bust fm_fix.css + inject CSS directly inline as backup"
6b0d812c
Filter TTS voices: VN (HoaiMy/NamMinh) + gTTS + 12 Multilingual only
72192737
readWallPost: slides view + dynamic voices from /api/ai/voices
30eb1a1f
Add article/rewrite/TTS CSS fixes
23748504
Fix: AI wall article CSS (move TTS selector out of flex + badge), WC2026 BXH table CSS, highlight wrong-match selection
91a754d9
Fix: AI wall article CSS (move TTS selector out of flex + badge), WC2026 BXH table CSS, highlight wrong-match selection
84a6548e
Fix: AI wall article CSS (move TTS selector out of flex + badge), WC2026 BXH table CSS, highlight wrong-match selection
66ca21a0
Fix: static/index_v2.html (CSS rewrite/AI-wall, WC2026 BXH, highlight selection)
18f5c34f
Fix: static/wc2026_v2.js (CSS rewrite/AI-wall, WC2026 BXH, highlight selection)
d2432a0c
Fix: static/app_v2.js (CSS rewrite/AI-wall, WC2026 BXH, highlight selection)
b22729d4
Fix: multi-segment short video - each key point shown with its own image
ed7fd4e1
Add emotion (cảm xúc) TTS + AI auto-select voice+emotion per topic
f7cf4f52
Slide posts: store AI-chosen voice+emotion
5ca441ca
Auto-navigate to wall post / short feed after create; emotion selector
418e53b1
Navigate to Tường AI post after rewrite
3e426546
Add .tts-emo-btn emotion selector styles
8894f632
Add vatvostudio + bongda/bongdaplus Jina scrapers; merge vatvo into AI-apps slide
26ce5818
Hashtag search + hot topics: add bongda & bongdaplus (Jina); Jina article fallback
bb652f7b
WC2026 news: add bongda & bongdaplus (Jina, keyword-filtered)
5b129c82
Speed up rewrite: background short-video generation; topic_post text-only Qwen (no image input)
57ab0c5f
Speed up rewrite: use fast text LLM for summaries (no vision needed), text-only for rewrite/url/topic, 60s timeout
25723f06
Cache last-working LLM to avoid retrying unavailable models (faster subsequent rewrites)
2ef4f2f2
Fix article reader for vatvostudio/bongda/bongdaplus: clean body (strip nav/ads/related), extract cover + inline images
43634cd9
Add /api/ai/probe diagnostic to find fast available chat model
c93bc674
probe: more candidate models + full error
cf30bddc
Speed up homepage hashtag rewrite (tong hop nguon): pre-filter by title + scrape sources concurrently (was 40 serial scrapes ~110s, now ~12s); compute context once; _call_qwen uses fast text models
f382d7bf
Homepage hashtag post: structured per-news items (title+image+short desc, no URLs); strip prompt leak; /s and /v share pages now carry og:image+og:description and open the right content in-app
53cdad66
Remove duplicate /s route (single share handler in main.py)
2384d88c
Render topic news items as cards; share opens article/post with OG preview; add Playlist button to all shorts feeds
8da37d72
Shorts: live update via YouTube RSS feed (Dan tri + SKDS), HTML scrape fallback; shorts cache TTL 30m->10m
8025d896
Article load speedup: per-URL cache (15m), no double-scrape, Jina timeout 35s->18s
d6c76e90
Move "Ung dung AI" slider to top + continuous left->right auto-scroll (pauses on touch)
83ce1120
Shorts: classify each Dan tri/SKDS video as short vs normal (is_short via /shorts/<id> redirect check, cached per id)
687c9491
Share link: open article immediately on arrival (no wait for homepage); show Short/Video label; add 1:1 ratio view button for normal videos
c78e5c52
Fix shorts not updating: YouTube RSS is empty from datacenter IPs -> fetch newest Dan tri/SKDS videos via Jina-rendered channel pages (X-Locale vi-VN), RSS/HTML as fallback
0ddc0a0e
Fix 1:1 (ratio-square) view for Dan tri/SKDS videos: fill full height + crop width. YouTube iframe ignores object-fit, so size iframe 16:9 around 100% height, center it, slide overflow:hidden crops the sides.
63fecd9c
Make 1:1 (ratio-square) override win regardless of CSS load order by raising specificity with #tiktok-feed ancestor
413f2b5a
Fix shorts/video classification: tag is_short deterministically from Jina channel tabs (no YouTube HEAD), override /api/shorts
f5a57e27
Add comments_off.js: remove the comment section from every video slide
83968cd3
Load comments_off.js after app_v2.js to remove comment section on videos
0971c08b
Restore comment button + inline comment panel on videos (stop loading comments_off.js)
77e3600f
Remove comments_off.js — comment section restored on videos
2c16feba
Add YouTube Live block pinned to top of home page
3792640b
Load yt_live.js so the YouTube live stream is pinned to top of home
0e76e7df
Upload static/yt_live.js
c96c5cb6
Upload static/yt_live.js
7373dd94
Upload match_detail.py
ffc9f115
Upload app_main.py
f6dbdacf
Upload app_main.py
e006aad1
Upload static/match_detail.js
06087f4d
Upload static/index_v2.html
fa52edeb
Upload vtv_scraper.py
ecfd22b2
Upload static/yt_live.js
89e641ce
Upload app_main.py
4937047e
Upload static/match_detail.js
79e67201
Upload static/yt_live.js
367fa5d9
Upload vtv_scraper.py
7a380a95
Upload app_main.py
451f005c
Upload match_detail.py
3d237b10
Upload static/match_detail.js
d25db91c
Upload static/index_v2.html
9d4117d3
Upload app_main.py
7a422697
Upload static/match_detail.js
7d91a96b
Upload static/index_v2.html
de9f2e0b
Upload static/yt_live.js
9ac9d26b
Upload vtv_scraper.py
4cc38e4a
Upload match_detail.py
9e9ccf45
Upload static/match_detail.js
74261c5c
Upload app_main.py
f4969ab9
Fix VTV player: add VTV6, VTV10, fetch streams from backend API
233453ac
Fix match detail UI: graceful error handling, no more false 404 errors
c0c2360e
Fix VTV scraper: add VTV6/VTV10, scrape xemtv PHP for fresh URLs
fff0b046
Fix match detail API: handle empty/error responses, add commentaries endpoint
8f57b1f0
Add /api/vtv/streams endpoint for fetching all VTV channel streams
ba8a3483
Rewrite VTV player: parse M3U from 3 IPTV sources with HLS.js failover
7eee3366
Fix match detail: add HTML page scraping fallback when API returns no data
354b82e4
Fix match detail UI: add lineups section, restore proper rendering
d199be80
Clean up app_main.py: remove unused VTV backend routes, keep match detail
d52af2c7
Fix VTV: VTV6->VTV Can Tho, VTV Can Tho->VTV10, add xemtv PHP fallback for geo-blocked channels
f2039b16
Fix bongda: better HTML scraping with redirect following, more CSS selectors, extract commentaries
d7ac7335
Fix match detail UI: add lineups, commentaries, restore clean rendering
54dbb9a9
Fix match detail: pass full URL with slug to backend for HTML scraping
b0b31791
Add url param to match detail API for slug-based HTML scraping
291cb4ef
Fix bongda: fetch_match_detail_by_url always scrapes HTML with slug, fetch_match_detail tries API first
0fe6e025
Fix match detail: pass full URL from livescore to API, default to detail tab, add commentaries/stats endpoints
24b77d85
Add missing /api/match/{id}/commentaries and /stats endpoints, fix syntax error
5e177a63
Restore full app_v2.js with targeted fixes: pass full URL from livescore, default to detail tab, fix API endpoints
dc723738
Force rebuild: add comment to trigger Docker rebuild
5460fe66
Add python-dateutil to force Docker layer rebuild
74f6a13b
Rebuild: add httpx to force new Docker image layer
7ab76b05
Add /api/match/{event_id}/detail route to main.py (the actual running module)
2c431d76
Upload static/main_patch.py
556ce052
Add /api/match/{event_id}/detail route to app_v2_entry.py (the actual running module)
1c80a771
Fix: restore working app_v2_entry.py + add /api/match/{event_id}/detail route
52d42e61
Restore main.py from restore-c93b544
cf826e9d
Upload main.py with huggingface_hub
0e2f303c
Delete static/main_patch.py, app_v2_entry.py.orig
4c407fea
Add /api/proxy/page endpoint for VTV xemtv PHP fallback
b3c7bff6
Fix match detail CSS: sanitizeHtml() to strip inline styles/scripts, add md-raw-html scoping class
4664070a
Fix match_detail.py: always scrape HTML page as fallback, extract team IDs from HTML
41fedbc9
Fix yt_live.js: proxy fptplay CDN URLs via /api/proxy/m3u8 to bypass Referer check
40f4ea95
Add proxy_m3u8_v2 with fptplay Referer fix for VTV streams
88302c6e
Fix yt_live.js: remove fptplay proxy (server IP blocked), play directly from browser
891c99d3
Fix: remove old proxy/m3u8 route before adding new one with fptplay Referer
215bd26b
Trigger space restart
c6e87684
Force Docker rebuild for match_detail + VTV fixes
021913f4
Restore app_v2_entry.py from working branch + add proxy/page + match detail endpoints
7f68115b
Restore Dockerfile from working branch
1384269f
Fix yt_live.js: all streams play directly from browser, xemtv PHP fallback for missing channels
296e061e
Upload static/yt_live.js
d8228185
Fix VTV mapping: VTV6=VTV Cần Thơ, VTV10=VTV10 (not Cần Thơ)
044d29dc
Rebuild: fix VTV6=VTV Cần Thơ, VTV10=VTV10 mapping
5bd4c23f
Fix VTV mapping: VTV6=VTV Cần Thơ, VTV10=VTV10 (not Cần Thơ)
83937e14
Fix bindMatchClicks: handle .status a and .team a links, add cursor:pointer
5474a63e
Rewrite match_detail.py with correct CSS selectors for bongda.com.vn HTML structure
9964459e
Fix match_detail.py: use html.parser fallback, correct CSS selectors, simplify code
b542202b
Rewrite match_detail.py: simpler, no cache, direct scraping with correct selectors
0778dc9b
Add debug logging to match_detail.py to trace scraping issues
fcbc2e38
Upload _static_build_trigger.txt
a27ceba9
Upload app_v2_entry_v2.py
ea696399
Upload _run.py
59b6c1b8
Upload requirements.txt
681ee17a
Upload requirements.txt
f584a14e
Upload Dockerfile
bbd0e1d0
Upload Dockerfile
1e19c827
Upload Dockerfile
4fdfc667
Rewrite match_detail.js: structured timeline, events, stats, score+status display
b1a2fd53
Upload Dockerfile
fbcef8ea
Delete Dockerfile
385096fd
Upload Dockerfile
36c9ddc7
Upload app_v2_entry_test.py
91aa9b4c
Force reload match_detail module on each request
c4bf61ee
Switch to match_detail_v2 import
23adc8f2
Add match_detail_v2.py (copy of fixed match_detail.py)
0481ecdf
Upload Dockerfile
85ce832c
Add /api/match/{id}/live inline scraping endpoint
00740e14
Update match_detail.js: try /live endpoint first, fallback to /detail
4b101f96
v3: Add client-side scraping via CORS proxy as fallback
ba7756f0
Force rebuild: clear .pyc cache, use match_detail_v2
94c4db9c
v4: client-side scraping + fallback to bongda.com.vn link
0efe1a37
Upload match_detail_v2.py
abe22500
Upload static/match_detail.js
ac3c9504
Upload match_detail_v2.py
c0968b69
Upload app_v2_entry.py
055055db
Upload _run.py
2e07eda6
Upload Dockerfile
c8562206
Upload Dockerfile
c6521145
Upload CHANGELOG.md
3e1e386a
Upload static/restart_trigger.txt
7cbebb79
Upload Dockerfile
1c3fe35d
Upload match_detail_v2.py
669e5ba2
Upload bongda_proxy.py
cfd8ab3d
Upload app_v2_entry.py
2a0e039d
Upload static/match_detail.js
5488128a
Upload Dockerfile
fd6e368a
Upload Dockerfile
b44cf8f1
Upload app_v2_entry.py
1acc897c
Upload static/match_detail.js with huggingface_hub
46dbe573
Upload Dockerfile with huggingface_hub
ffda644a
Upload _run.py with huggingface_hub
196a8d47
fix: auto-open pending_article from /s share link on page load
64e96471
fix: auto-open pending_article from /s share link on page load
69682b76
Upload Dockerfile with huggingface_hub
5e8f2857
fix: add /api/match/{id}/detail endpoint for frontend compatibility - v6
fef87d68
trigger: force docker rebuild
582ca8d2
FORCE REBUILD: v7 - add reload + lxml explicit
0d3d9803
fix: avoid duplicate Chi tiết tab + fix slug detection
64db37cd
new: match_detail_v6.js - fixed hook without duplicate tabs
eb6b3f62
use match_detail_v6.js - fixed duplicate tabs + fast endpoint
d6424750
Delete static/match_detail.js with huggingface_hub
552cd47a
fix: auto-build matchUrl for featured matches
9c54318a
Upload vtv_api.py
722da1a6
Add VTV API router import helper
bf4f55ea
Add VTV API router for VTV1-VTV10 + VTVPrime streams
03adda28
Fix VTV1-VTV10 stream URLs: add VTVGo failover (200 OK), replace broken fptplay CDN (403), fix VTV10 Can Tho source
005ebef9
Trigger rebuild for VTV stream URL fix
a883aad6
Upload main.py
719a5c2f
Upload vtv_api.py
33dc11d3
Upload static/yt_live.js
10d2a8f2
Upload vtv_api.py
1be4b9eb
Upload static/yt_live.js
510d5ca5
Upload match_detail_v2.py
aee77630
Fix match detail: add endpoint + parallel scrape (#9)
e80f9c87
Upload vtv_api.py
a8be5006
Upload static/yt_live.js
3174a648
Upload vtv_api.py
1a26ff4a
Upload static/yt_live.js
c5b59f3e
Upload vtv_api.py
1a5526cb
Upload vtv_api.py
20bb74fc
Upload match_detail_v2.py
a66121f9
Upload main.py
1c30017d
Upload static/app_v2.js
352113cf
Upload app_v2_entry.py
800cd457
Upload app_v2_entry.py
9b8f5f50
Upload main.py
4c5f84f7
Fix: restore full main.py 951 lines with BONGDA_HEADERS
73ea05e9
Fix: add try/except for BONGDA_HEADERS import
9389745d
Fix: EPG schedule, VTV6 default channel, no double-load
67bf0b88
Fix: featured match ID encoding, robust livescore click binding
e44ab289
v3: fix featured match ID + robust livescore clicks
3c7b3845
v2: EPG + VTV6 default + no double-load
98626e41
Fix: update script refs to v3/v2 to bypass cache
07618e55
Fix: proxy ALL VTV streams to bypass CORS
ac033712
Fix: VTV10 stream URL priority
f6904cd7
Trigger rebuild
8a3534ce
Fix: add cache-busting query strings to all script tags
12f9bdb3
Fix: cache-bust v2
d8602533
New index file to bypass CDN cache
046a5ad5
Fix: serve index_v3.html to bypass CDN cache
e1445de6
Delete static/index_v2.html with huggingface_hub
b1c0619b
Delete static/app_v2.js with huggingface_hub
e09bd2d5
Delete static/yt_live.js with huggingface_hub
250ecabd
Delete static/app_v3.js with huggingface_hub
bbed4a84
Delete static/yt_live_v2.js with huggingface_hub
db5b1d28
Delete static/restart_trigger.txt with huggingface_hub
e579fc77
New index.html with fresh JS file names
bb1b54ca
New index.html
3902fcb7
Core JS
592c71ef
TV player JS - fresh
6913c458
Serve index.html with tv_player.js
4e223820
New index.html - bypass CDN cache
eef92d32
Serve index.html
9813ae60
Combined all JS inline into index.html - v7
97fc7a9f
Inline all JS - force refresh 1781058532
d65c9acc
Fix /s proxy: HTTP 302 redirect trực tiếp thay vì JS redirect
bb1f6c7d
Restore app_v3.js from core
b8c4f936
Restore yt_live_v2.js from tv_player
fa3e4bfb
Update cache-buster v=1781059323
dff2c34e
Serve index_v3.html instead of inline index.html
cb3cffc0
app_v4.js — VTV inline + fixed bindMatchClicks with closest()
ddff3ca6
Use app_v4.js, remove yt_live_v2.js
60e310a2
index_v4.html — VTV CSS fix + app_v5.js
f6529564
Serve index_v4.html
7eab1ea9
vtv_api v2 — multi-source auto-failover
036e9d91
app_v5.js — VTV inline + multi-source + fixed livescore
46881f58
vtv_api: fix verify for smil URLs, use GET+Range
882a5934
Add bongda redirect routes: /doi-bong/ /giai-dau/ /cau-thu/
0f003601
Upload vtv_api.py
fa01fdfc
Upload app_v2_entry.py with huggingface_hub
437fe01e
Upload main.py with huggingface_hub
fa0e8d32
Upload static/app_v2.js with huggingface_hub
8151f949
Upload static/index_v3.html with huggingface_hub
04583b2d
fix: VTV player + featured match + team stats
6c739c91
Update ML Intern artifact metadata
a67bce10
fix: add space metadata to README
0788a079
Update ML Intern artifact metadata
6a659cdd
Delete app/app_v2_entry.py, app/app_v2_entry_test.py, app/app_v2_entry_v2.py, app/static/app_v2.js
c5565115
Trigger rebuild
a41ae115
Delete ai_fix2.py, ai_patch.py, ai_runtime.py, ai_runtime_final.py, ai_runtime_final2.py, ai_runtime_final3.py, ai_runtime_final4.py, ai_runtime_final5.py, ai_runtime_final6.py, ai_runtime_patch_fast.py, app_clean.py, app_entry.py, app_final.py, app_main.py, app_patch_unified.py, app_run.py, main_patch.py, patch_extra.py, patch_runtime.py, restore_runner.py, rewrite_slide.py, vtv_scraper.py, TRIGGER_REBUILD_V6.md, _static_build_trigger.txt, app/
334381cf
Delete static/app_v3.js, static/app_v4.js, static/app_v5.js, static/core_1781056782.js, static/fm_fix.css, static/index.html, static/index_v2.html, static/index_v4.html, static/rewrite_fix.js, static/tv_player.js, static/yt_live_v2.js
255c1af0
Fix /s route: HTTP 302 redirect instead of meta refresh
8e44f18d
Force rebuild: /s route HTTP 302 redirect
1a4bc73b
fix: remove stale yt_live.js reference from index_v3.html
7881df4f
fix: re-upload app_v2_entry.py with team stats routes
9059d408
Upload app_v2_entry_check.txt
8fb1cc4c
Delete app_v2_entry.py with huggingface_hub
7e45da76
fix: team stats routes (_scrape_team_page, /doi-bong/, /api/team/)
ecade070
fix: team stats routes
f892f666
fix: re-add app_v2_entry.py with team stats routes
6fde4174
rebuild: trigger space restart after team stats fix
224875ae
Update ML Intern artifact metadata
be249f7b
rebuild: force Docker rebuild with cache bust
5f081182
fix: remove stale app_v2_entry files
5fc1fbb3
fix: upload fresh app_v2_entry with team stats
1dbafffc
fix: update _run.py to import from app_v2_entry_fresh
fe244115
rebuild: force full Docker rebuild with new entry point
50bf7b4c
Fix _run.py: use main:app instead of missing app_v2_entry_fresh
f18d0e65
VNEWS minimal: fix /s 302 redirect + livescore APIs
4014deb2
VNEWS static: no external API calls, just /s redirect + routes
3f97ddb0
Fix Dockerfile: use main:app
0e05537b
rebuild: cache bust fdb9dad2
132bf7b5
Restore original main.py + fix /s 302 redirect
67aab793
fix: restore app_v2_entry.py with all team stats routes
13f19ce7
rebuild: force COPY cache bust 721c3fb3d2d0
122714de
Upload README.md
0e4b6c7e
Upload requirements.txt
53392fc5
Upload Dockerfile
b82a7dfb
Upload _run.py
905a3980
Restore to commit 6c739c9
3ef17e95
Restore to commit 6c739c9
85f8b9ca
Upload README.md
7ce21a42
Fix VTV loading: yt_live.js -> yt_live_v2.js
7703d0a7
Fix VTV channel loading spinner hanging
0051c4f3
Fix VTV loading, match detail, homepage speed
a82a8089
VTV API v4: faster timeouts, reduced xemtv threads
47db7d67
Fix VTV: auto-play VTV6, single-source fast fail (4s), no duplicate function
24f2ba07
Update ML Intern artifact metadata
f1e80275
Fix VTV proxy: manifest 5s, segment 8s timeout
b5232a5c
Upload static/app_v2.js
3b3db62c
Upload static/app_v2.js with huggingface_hub
4cc652a0
Upload static/index.html with huggingface_hub
6cb13728
Delete ai_runtime_final*.py, ai_fix2.py, ai_patch.py, ai_runtime.py, app_clean.py, app_final.py, app_main.py, app_patch_unified.py, app_run.py, app_v2_entry*.py, app_v3.js, app_v4.js, app_v5.js, core_*.js, patch_*.py, patch_extra.py, patch_runtime.py, restore_runner.py, rewrite_fix.js, tv_player.js, yt_live_v2.js, TRIGGER_REBUILD_V6.md, _run.py, _static_build_trigger.txt
cccc5d63
Delete static/app_v3.js, static/app_v4.js, static/app_v5.js, static/core_1781056782.js, static/rewrite_fix.js, static/tv_player.js, static/yt_live_v2.js, static/index_v3.html, static/index_v4.html, ai_runtime_patch_fast.py, main_patch.py, vtv_scraper.py, match_detail.py
11eefb4a
Upload Dockerfile with huggingface_hub
d2f2bf1b
Restore commit 9389745: add try/except for BONGDA_HEADERS import
37396d81
Restore _run.py entry point (imports from app_v2_entry)
91ecf542
Update Dockerfile to use _run:app entry point
101c356c
Restore index_v2.html (needed by app_v2_entry.py)
c451232f
Restore yt_live_v2.js for VTV live channels
cc3e711a
Trigger rebuild after restoring commit 9389745
f39efaa5
Delete REBUILD_TRIGGER
b0405da9
Restore to commit 60e310a
8f91f6b0
Restore to commit 60e310a
93334e3c
Restore to commit 60e310a
d7a19942
Restore to commit 60e310a
1abf252a
Restore to commit 60e310a
5ef3a535
Restore to commit 60e310a
75b66af6
Restore to commit 60e310a - add restore script
60c1d7eb
Restore to commit 60e310a - restore script
7fdeafc1
Restore to commit 60e310a - auto restore on startup
bb8e137e
Restore to commit 60e310a
aa042d1c
Restore to commit 60e310a
bf164111
Restore to commit 60e310a
a587e951
Restore to commit 60e310a
709596c8
Fix VTV: stable HLS config, EPG API, proxy m3u8 fix
d0dba35a
Fix VTV: CSS tab layout, EPG from backend, stable HLS player
6a288546
Force rebuild: VTV fix v3 - trigger Docker rebuild
de2c4492
Trigger rebuild: VTV fix v3
7b4609ea
VTV fix v3: rebuild all - requirements.txt
c27540f6
VTV fix v3: rebuild all - _run.py
3887d145
VTV fix v3: force Docker rebuild
2b9ded56
VTV fix v3: force Docker rebuild
fcb42118
Restore 60e310a: Dockerfile
8043e323
Restore 60e310a: _run.py
fff674ac
Restore 60e310a: requirements.txt
4764c093
Restore 60e310a: vtv_api.py (VTV stream API)
5a303e7c
Upload static/index.html
636ed7bd
Restore e80f9c8: requirements.txt
8c50ba40
Restore e80f9c8: main.py
faf72650
Restore e80f9c8: app_v2_entry.py
6d5060ba
Restore e80f9c8: vtv_api.py
d531f51d
Restore e80f9c8: match_detail_v2.py
59917be0
Restore e80f9c8: static/index.html
2e97efb9
Restore e80f9c8: static/index_v2.html
7edcb16f
Restore e80f9c8: static/app_v2.js
927a2612
Restore e80f9c8: static/yt_live.js
4f856838
Restore e80f9c8: static/restart_trigger.txt
d56d6073
Fix VTV: EPG thực tế + endpoint /api/vtv/epg/{channel_id}
be6ca460
Fix VTV: load 1 lần + EPG UI + HLS stability
3fe63b06
Fix VTV triệt để: MutationObserver thay vì wrap loadHome
58d17394
Restore 60e310a: remove files added after target commit
f62825b4
Restore to commit 60e310a — full revert
2df50772
Upload restore_commit.py
aa53c6dd
Restore e80f9c8: remove restore_commit.py
69c75e6a
Restore e80f9c8: remove static/app_v3.js
53d4178f
Restore e80f9c8: remove static/app_v4.js
fb9a3d54
Restore e80f9c8: remove static/core_1781056782.js
ae64d8b8
Restore e80f9c8: remove static/index_v3.html
cb5dc51f
Restore e80f9c8: remove static/tv_player.js
59b3befc
Restore e80f9c8: remove static/yt_live_v2.js
93d17c63
Restore e80f9c8: app_v2_entry.py
16b89f54
Restore e80f9c8: main.py
d8a19edb
Restore e80f9c8: match_detail_v2.py
38ce433a
Restore e80f9c8: static/app_v2.js
d7162b2d
Restore e80f9c8: static/index.html
81bcae7e
Restore e80f9c8: static/index_v2.html
a4c1a0a7
Restore e80f9c8: static/restart_trigger.txt
4beae03f
Restore e80f9c8: static/yt_live.js
d45a8789
Restore e80f9c8: vtv_api.py
bf9f83cf
Fix VTV: prevent double-load + add EPG support
365e27db
Add EPG endpoint /api/vtv/epg/{channel_id} for VTV channels
3439f99a
Upload vtv_api.py
0f5ee190
Upload static/yt_live.js
c20d68fc
Upload static/restart_trigger.txt
90a015ea
Upload vtv_api.py
a0845985
Upload static/yt_live.js
0cb177d9
Upload static/restart_trigger.txt
5df1a6e7
Upload vtv_api.py
12e568bb
Upload static/yt_live.js
caeddefd
Upload static/restart_trigger.txt
2ced1648
v6.1: Thêm mytv.com.vn video extractor + video_sources trong match detail
d434930e
v6.1: Thêm section video sources (MyTV, YouTube, Xemlai) trong match detail
4cbeeadf
v6.1-fix: Fix regex syntax error in mytv extractor
30498ddd
v6.1: Force rebuild for video_sources + mytv
345c8ab6
v6.2: Cải thiện video_sources — thêm direct MyTV URL + embedded player
b1156680
v6.2: Tab Video với embedded player (MyTV, YouTube, Xemlai)
d1ee2589
v6.3: Fix match detail cache + reduce timeout
d00006cd
v6.3: Fix video tab (innerHTML race condition) + embedded MyTV player
c5a2fff6
v6.3: Reduce bongda timeout 15s->8s
c476b7cb
v6.3: MyTV scraper cải tiến — dùng URL pattern từ VNEWS matches + verify URL
7e9652fd
v6.3: Thêm section MyTV Highlights ngay dưới VTV block
df939f43
v6.4: Tối ưu MyTV scraper — bỏ HEAD verify, chỉ dùng URL pattern
353b5e09
v6.5: Force cache refresh for yt_live.js
306229ec
v6.6: Tách MyTV section ra file riêng (mytv_section.js)
6d421e72
v6.6: Clean yt_live.js (VTV only, no MyTV code)
4657ac7b
v6.6: MyTV section as standalone file
38217c6b
v6.3: Tích hợp MyTV Highlights vào yt_live.js + fix injection timing
9a9af5c8
v6.3: Fix bindMatchClicks (robust link detection) + optimize loadHome (faster render)
d4e2f3cb
v6.3: Remove standalone mytv_section.js (integrated into yt_live.js)
aab1a953
v6.3: Force rebuild — remove mytv_section.js cache, deploy fixes
64d13b30
v6.3: Xóa reference mytv_section.js (đã tích hợp vào yt_live.js)
1b206466
v6.3-final: Force rebuild — all fixes deployed
b12a5d01
v6.3: Fix bindMatchClicks — robust link detection for match detail clicks
05aa3458
v6.4: Cache-bust all JS files + remove mytv_section.js ref
4fad6e6b
v6.4: Force rebuild
d019b09c
v6.5: Fix loadHome double-execution guard — prevent API spam
9f205b5c
v6.5: Add _homeLoaded guard to VTV inject
14514517
v6.5: Force rebuild
2ec39384
v6.5: Cache-bust v1781173089
d6c2f2c8
v6.5: Create unified JS file (all-in-one)
1a0d8475
v6.5: Single JS file (vnews_all.js) — no more conflicts
60d4d648
v6.5: Force rebuild
c1f8bb1e
v6.6: Add API response caching (30s TTL) — reduce duplicate requests
c205947f
v6.6: Cache-bust v1781174747
f6736e5e
v6.7: Add cache to api_livescore_date + Cache-Control headers (30s) for all livescore endpoints
5d09ad3f
v6.8: Fix page hang — remove VTV loadHome override (double-load), add cachedFetch to all API calls, debounce loadLivescore, global _homeLoaded guard
8f2a4a67
v6.8: Cache-bust JS v1781175291
1628d461
v6.9: Add DOMContentLoaded listener — fix loadHome() called before vnews_all.js loads
f587d93a
v6.9: Remove await loadHome() from inline script (moved to DOMContentLoaded in vnews_all.js)
43fe981f
v6.10: Cache-bust v1781176031
68b6a97b
v6.10: Cache-bust v1781176047
b40a9164
RESTORE 2ced164: Revert to multi-file JS (pre-merge)
f98c531d
RESTORE 2ced164: Revert to multi-file JS (pre-merge)
7678a03e
RESTORE 2ced164: Revert to multi-file JS (pre-merge)
b6533017
RESTORE 2ced164: Revert to multi-file JS (pre-merge)
8764cce4
RESTORE 2ced164: Revert to multi-file JS (pre-merge)
02014728
RESTORE 2ced164: Remove unified vnews_all.js (back to multi-file)
8b6bcf81
Fix: Remove await loadHome() from inline script (runs before app_v2.js loads)
daea5866
Fix: Add DOMContentLoaded listener to call loadHome() after all scripts load
8dfb7737
Fix /s route: HTTP 302 redirect instead of JS redirect for Zalo compatibility
44f76f22
Fix /s: JS redirect + meta refresh fallback for Zalo browser
18695122
/s route: hash fragment redirect for Zalo browser compatibility
a5eda890
Add hash fragment article loader for Zalo browser
cf2f9c72
Upload Dockerfile
78c90598
Upload vtv_api.py
e57d9c43
Update vtv_api.py
080896ba
Update wc2026_scraper.py
dc3fcd2f
Update static/yt_live.js
462b6dcd
Update static/app_v2.js
6a2f1c99
Update app_v2_entry.py
ae576e14
Update main.py
de3cc18d
Force rebuild: fix all issues
020b3441
Update vtv_api.py
f170f09b
Update wc2026_scraper.py
c08ec200
Update static/yt_live.js
194f9b09
Update static/app_v2.js
d377cadb
Update app_v2_entry.py
da75575c
Fix: restore missing match_detail_v2.py dependency + rebuild
26951077
Force rebuild: fix page hang
21cceb67
Fix: install requirements.txt in Dockerfile
2f238198
Fix: install all deps in Dockerfile before USER user
ec74079f
Add app.py entry point
b3e3a29d
Restore original Dockerfile: python:3.12-slim + _run:app + ffmpeg
43b37f2a
Update vtv_api.py
6750b07b
Update wc2026_scraper.py
8f0a4439
Update main.py
04f069fb
Update app_v2_entry.py
cb8fd7a9
Update static/app_v2.js
5062bf43
Update static/yt_live.js
594a0b63
Update Dockerfile
b0253a67
Force update main.py
21f871cf
Force update app_v2_entry.py
6632fdcd
Force update static/app_v2.js
f8dc19dc
Force update static/yt_live.js
d0e8734f
Delete *
9f03772c
Upload CHANGELOG.md
b6501d6a
Upload README.md
b0feaca5
Upload Dockerfile
cd439c8e
Upload _run.py
82b40941
Upload _static_build_trigger.txt
93413e91
Upload requirements.txt
d9576ef4
Upload TRIGGER_REBUILD_V6.md
478ce0b8
Upload CHANGELOG.md with huggingface_hub
05a402d9
Upload README.md with huggingface_hub
912f2eea
Upload ai_ext.py with huggingface_hub
45790815
Upload ai_fix2.py with huggingface_hub
948278ba
Upload ai_patch.py with huggingface_hub
190b31c8
Upload ai_runtime.py with huggingface_hub
c3c6f0b9
Upload ai_runtime_final.py with huggingface_hub
bec08c03
Upload ai_runtime_final2.py with huggingface_hub
480dcfd7
Upload ai_runtime_final3.py with huggingface_hub
e24b6d57
Upload ai_runtime_final4.py with huggingface_hub
84a8b1e0
Upload ai_runtime_final5.py with huggingface_hub
20f42d6a
Upload ai_runtime_final6.py with huggingface_hub
b74d684b
Upload ai_runtime_patch_fast.py with huggingface_hub
2d8ffe89
Upload app/static/app_v2.js with huggingface_hub
0493a2dc
Upload app_clean.py with huggingface_hub
96719b5a
Upload app_entry.py with huggingface_hub
96dde675
Upload app_final.py with huggingface_hub
681297c8
Upload app_main.py with huggingface_hub
01cd6d55
Upload app_patch_unified.py with huggingface_hub
38fa5daf
Upload app_run.py with huggingface_hub
c680c2ba
Upload app_v2_entry.py with huggingface_hub
da66c86d
Upload app_v2_entry_test.py with huggingface_hub
fbca0ca0
Upload app_v2_entry_v2.py with huggingface_hub
bf4863e6
Upload bongda_proxy.py with huggingface_hub
86310c3b
Upload main.py with huggingface_hub
cc37f288
Upload main_patch.py with huggingface_hub
69d4900d
Upload match_detail.py with huggingface_hub
d1d3ae7c
Upload match_detail_v2.py with huggingface_hub
6e02bc57
Upload patch_extra.py with huggingface_hub
003e74c4
Upload patch_runtime.py with huggingface_hub
0c195cb6
Upload requirements.txt with huggingface_hub
584b1351
Upload restore_runner.py with huggingface_hub
7a609ade
Upload rewrite_slide.py with huggingface_hub
642471d7
Upload static/app_v2.js with huggingface_hub
17e9592f
Upload static/fm_fix.css with huggingface_hub
f1ed3e18
Upload static/hot_multi.js with huggingface_hub
72278ddc
Upload static/index.html with huggingface_hub
99d7a431
Upload static/index_v2.html with huggingface_hub
b7b5f8a5
Upload static/live_mode.js with huggingface_hub
62c6bbe3
Upload static/match_detail_v6.js with huggingface_hub
fefdab25
Upload static/restart_trigger.txt with huggingface_hub
81ad536a
Upload static/rewrite_fix.js with huggingface_hub
caf5d71b
Upload static/wc2026.css with huggingface_hub
d667fb86
Upload static/wc2026_fixtures.json with huggingface_hub
fde1e7cd
Upload static/wc2026_v2.js with huggingface_hub
f244fc1d
Upload static/yt_live.js with huggingface_hub
7c6bbda0
Upload vtv_api.py with huggingface_hub
495756e7
Upload vtv_scraper.py with huggingface_hub
e2d6476b
Upload wc2026_scraper.py with huggingface_hub
e3d1b430
Upload static/restart_trigger.txt
daf54115
Upload vtv_api.py with huggingface_hub
43c4babe
Upload main.py with huggingface_hub
0e13544c
Upload static/app_v2.js with huggingface_hub
09336d26
Upload static/yt_live.js with huggingface_hub
4ca39e09
Upload static/restart_trigger.txt with huggingface_hub
08ee8a18
Upload main.py with huggingface_hub
ad9188bd
Upload static/app_v2.js with huggingface_hub
9ce45db4
Upload static/yt_live.js with huggingface_hub
45cc0b87
Upload static/wc2026_v2.js with huggingface_hub
3fc08ed0
Upload static/index_v2.html with huggingface_hub
fbc5824a
Upload static/restart_trigger.txt with huggingface_hub
cc1d512d
Upload main.py with huggingface_hub
8414d4df
Upload static/app_v2.js with huggingface_hub
7e81d893
Upload static/yt_live.js with huggingface_hub
ecfd19fb
Upload static/wc2026_v2.js with huggingface_hub
c05e0be7
Upload static/restart_trigger.txt with huggingface_hub
8e9994d4
Upload static/app_v2.js with huggingface_hub
9cf463a8
Upload static/restart_trigger.txt with huggingface_hub
acfd1d89
Upload /app/app_v2_entry.py
e8c4247f
Upload app_v2_entry.py with huggingface_hub
fa130681
Upload main.py with huggingface_hub
01c6d274
Upload app_v2.js with huggingface_hub
82441ad3
Upload static/restart_trigger.txt with huggingface_hub
73a8198e
Delete app/*
4ba029f2
Upload main.py with huggingface_hub
55c94591
Upload app_v2.js with huggingface_hub
f7de6ead
Upload yt_live.js with huggingface_hub
4b469186
Upload wc2026_v2.js with huggingface_hub
004a109f
Upload static/restart_trigger.txt with huggingface_hub
0df75752
Delete app_v2.js, yt_live.js, wc2026_v2.js
2e40fae9
Upload app_v2_entry.py with huggingface_hub
3afc4906
Upload static/app_v2.js with huggingface_hub
8db5dc4a
Upload static/restart_trigger.txt with huggingface_hub
dccef156
Upload app_v2_entry.py with huggingface_hub
9a9c2bfc
Upload static/wc2026_v2.js with huggingface_hub
ef637d27
Upload static/app_v2.js with huggingface_hub
e3ae45a2
Upload static/restart_trigger.txt with huggingface_hub
f4b77c9b
Upload app_v2_entry.py with huggingface_hub
390d202a
Upload static/restart_trigger.txt with huggingface_hub
5720aad1
Upload app_v2_entry.py with huggingface_hub
aad2773d
Upload static/restart_trigger.txt with huggingface_hub
9fbfad00
Upload static/yt_live.js with huggingface_hub
758910b5
Upload static/app_v2.js with huggingface_hub
b0fe1a6c
Upload static/restart_trigger.txt with huggingface_hub
6c5588aa
Restore VTV cluster: static/yt_live.js from cf2f9c7
7f2dab92
Restore VTV cluster: static/app_v2.js from cf2f9c7
8d175ef4
Restore VTV cluster: app_v2_entry.py from cf2f9c7
6d4be025
Restore VTV cluster: static/index_v2.html from cf2f9c7
93aac6e1
Restore VTV cluster: static/wc2026_v2.js from cf2f9c7
d572ce89
[VTV restore] Trigger rebuild after cf2f9c7 VTV cluster restore
cea966de
Optimize loadHome: skeleton-first progressive loading with per-API timeouts
21301740
Fix WC highlights: direct scrape from xemlaibongda.top/the-gioi/world-cup
4ed29b42
Speed: homepage instant shell + shorter timeouts + lazy loading
e4f1702c
Fix: WC highlights via backend proxy, fix news rendering
c81b931d
Fix: miniplayer auto-close when returning to home
61591626
Add: xemlaibongda.top proxy endpoint (CORS workaround for WC highlights)
246bd473
Rebuild: homepage speed + WC proxy + miniplayer fix
decead62
Fix: world-cup HL path the-gioi/world-cup + improved xlb scraping
9398b2a9
Fix: improved _xlb_scrape multi-strategy parsing for xemlaibongda.top
1871f190
Fix: WC highlights - dedup videos, filter by WC league, fix click handler
39112744
Add: WC Shorts slide (VTV Nam Bộ + WC moments) + continuous autoplay tiktok feed
b597c9f2
Add: VTV sticky/fixed mode when scrolling + compact toggle
7a0c9517
Add: WC Shorts tab + fetch VTV Nam Bộ & WC moments shorts data
2b1ce650
Fix: Add WC Shorts tab handler + full tikTok feed with continuous autoplay + VTV Nam Bộ filter
e9210260
Trigger rebuild: WC Shorts tab + VTV sticky scroll
abae0022
Fix: VTV sticky only on manual pin button, no auto-sticky
128ba871
Fix: include vtvnamo in interleaveShorts, fix shorts slide badge for VTV, update label
08daaf91
Add VTV Nam Bộ shorts to fallback including nqlLH6chLRo
82f5c3d5
Add shorts-badge CSS for VTV/DT/SKDS badge on slider thumbs
06e73b6a
Restore truncated _call_qwen and add VTV Nam Bo shorts fallback
df9715bd
Improve VTV Nam Bộ shorts scraping + add WC shorts endpoints + remove fake Rickroll video
8ee1b226
Improve WC Shorts tab: fetch all VTV Nam Bộ shorts + better TikTok feed with autoplay
0311cf16
Improve shorts loading: fetch VTV Nam Bộ from dedicated endpoint + better TikTok feed
d8288348
Add VTV Nam Bộ shorts scraper using YouTube RSS feed + yt-dlp fallback
8344b219
Integrate vtv_shorts.py scraper + add /api/shorts/wc endpoint + better shorts API
f2982a66
Complete WC Shorts TikTok-style slideshow with autoplay, title overlay, and smooth scroll
3e9bbf0d
Fetch VTV Nam Bộ shorts from dedicated endpoint in loadHome
978e02b6
Trigger rebuild for WC Shorts TikTok slideshow
a0d668ec
Fix import: get_vtvnambo_shorts (was get_vtvnamo_shorts)
65ebb5f6
Upload vtv_shorts.py
6e281057
Upload static/wc_shorts_slide.js
a57d0821
Upload static/wc_shorts_inject.js
c034140e
Upload static/wc_shorts_inject.js
79e3d33c
Upload static/index_v2.html
382e35db
Upload static/wc2026_v2.js
101505dc
Upload main.py
19cfa2a8
Upload TRIGGER_REBUILD_V7.md
8a08792f
Upload static/wc2026_v2.js
4ed4f61c
Upload static/index_v2.html
f46e9bc9
Upload static/collect_shorts.html
0de9cded
Upload piped_client.py
3482a48d
Upload main.py
47e980ba
Upload static/shorts_collector.html
18467f5a
Upload yt_scraper.py
a478c482
Upload main.py
d5ba0b5e
Upload static/test_yt.html
de761595
Upload main.py
2e8a70bd
Upload static/vtv_recorder.js
11bf9017
Upload static/vtv_recorder_inject.js
15b83bc5
Upload static/index_v2.html
e045897e
Upload static/vtv_recorder.js
8f43505f
Upload static/vtv_recorder_inject.js
cc383157
Upload app_v2_entry.py
5fcbdb7a
Upload static/vtv_recorder.js
f30d8be5
Upload static/yt_live.js
80d53b8d
Upload static/yt_live.js
dde5da5e
Upload static/index_v2.html
4ccbd75f
Delete static/vtv_recorder.js, static/vtv_recorder_inject.js
c2a95f64
Delete static/collect_shorts.html, static/shorts_collector.html, static/test_yt.html
c7da4c9d
Fix v5: processRatio uses video.ended event instead of setTimeout, parallel audio video, 200ms timeslice, requestData() flush
be9eb910
Trigger rebuild: yt_live.js v5 ratio fix
9e45c4b3
Fix v6: audio+video record + ratio crop + AI title + Short AI upload
0cc342c9
Trigger rebuild: yt_live.js v6
f425d490
Add /s article viewer route with scraped content (no iframe, works on mobile/Zalo)
1166e5f0
Add v-league to LEAGUE_IDS (tid=27433)
de18d9f4
Add v-league (27433), vleague, vietnam to LEAGUE_IDS
ef4710b5
Delete main_patch_vleague.py
9bc4c1cb
v15.38: Implement /api/article endpoint (scrape article → JSON for SPA), /s redirects to hash URL
380b7018
v15.38: Add rate limiter (_rl_get) for Bongda + news requests, retry on 429
bd75179a
v15.38: Fix /api/article — robust error handling, proper img src filtering
f14f9240
v15.38: Add missing scrape_vne_article, scrape_dantri_article, scrape_genk_article, scrape_bbc_article, scrape_ttvh_article, _scrape_generic to main.py (fixes /api/article 500 error)
572fdcfc
Upload static/index_v2.html
2bb83a56
v15.38: Fix scrape_vne_article — fallback to _scrape_generic, try Windows UA
cfd8ddf8
Upload static/yt_live.js
f34b3656
Delete static/wc_shorts_slide.js, static/wc_shorts_inject.js
13ecfa22
fix: rate limiter + session pooling + cache for all scrape functions
92b2e1c2
fix: article cache + rate-limited scrape + Cache-Control headers
8d84a09c
fix: session pooling + rate limiter for all scrape functions
675ea294
fix: route override for hot_topics/categories/storage_status/s + article cache
0153932b
Upload TRIGGER_REBUILD_V8.md
b6715007
Upload _static_build_trigger.txt
8a531724
Upload Dockerfile
58f0155e
Upload Dockerfile
d3936d8d
fix: multi-UA scrape + OG fallback for all sites
551fddd2
fix: article cache + route overrides
24ccdfdd
fix: fallback UI for articles with limited content
4b369cfc
fix: RSS fallback for blocked sites (VnExpress, DanTri, SoHa...)
222904fd
Fix: Short AI slide timing + genk_ai endpoint in patch layer + more VTV fallback shorts
431cf040
Fix: more VTV fallback shorts + better fallback logic when yt-dlp fails
b2935450
fix: giảm rate limit + concurrency để tránh block worker
eed30384
restart: force rebuild
365406ab
Fix: faster article loading, better cache, direct hash URL
5e584d23
Fix: instant article load from hash, localStorage cache, no 1500ms delay
958dbc5f
Fix: faster article scraping, reduced timeout
f88cf9a0
v8: auto-refresh wall UI after VTV Short AI upload
4787a084
Restore to commit b671500
9e4af8b7
Restore to commit 0cc342c
c1299d23
Fix: đổi default channel VTV6→VTV3, fix lỗi VTV6 (thêm VTVGo CDN fallback + cập nhật fptplay URL + bỏ XEMTV_ONLY restriction)
6a8668de
Fix: rewrite article scraper - fast direct requests, no rate limiter, error handling
a908c339
Fix: faster article load, localStorage cache, error handling
7eb9e193
Fix VTV: proxy VTVGo CDN URLs (CORS), SSL verify=False, fix fptplay vtv6 URL, vtv10→vtvct
9f98b7ab
Fix VTV: remove AbortSignal.timeout, proxy VTVGo CDN, verify=False SSL
8f20fa2e
Fix: use /api/proxy/m3u8/vtv for variant playlists, /api/proxy/seg/vtv for segments
7b17d5dd
Fix VTV proxy: route .m3u8 through /api/proxy/m3u8/vtv, .ts through /api/proxy/seg/vtv
671b3e81
Trigger rebuild
6b368b41
Fix VTV: VTV10→fptplay, VTV6 correct source, stable HLS config, no AbortSignal
57cd85ff
Trigger rebuild
4139b12b
Fix VTV: VTV6 correct source, VTV10 fptplay, direct VTVGo CDN, remove WC/shorts, stable HLS
e77a6375
Remove shorts slide, openYTShortsFeed, clean up
562ca6a9
Upload static/app_v2.js with huggingface_hub
0239e49d
Upload static/yt_live.js with huggingface_hub
53bd90dc
Upload vtv_api.py with huggingface_hub
a445af4c
Upload vtv_api.py with huggingface_hub
38749845
Upload vtv_api.py with huggingface_hub
891fe2f2
Upload static/app_v2.js with huggingface_hub
9ef7ed10
Upload vtv_api.py with huggingface_hub
6607977f
fix: Short AI slide not showing after upload + refreshShortAISlider always creates section
48068903
fix: update _wallPosts + refreshShortAISlider after uploadToWall + default channel vtv6
dfb6d11b
fix: Short AI 100% reload home after upload + DVR live replay controls
707cab79
fix: DVR replay + recorder select from buffer + Short AI upload flow
02662c3e
fix: /api/shorts endpoint - call get_vtvnambo_shorts directly with int count instead of calling api_shorts_vtvnamo() which passes Query object
f206c1cc
fix v8: DVR stable slider, recorder bar uses _recBarMax, buffer-based recording, Short AI upload fix
4c774b97
Upload _run.py
d1aedca7
Upload Dockerfile
a85ca41d
Restore bep40/VNEWS to dfb6d11 (#15)
ec78edd2
fix: VTV streams + WC2026 + remove VTV Nam Bộ shorts
7de3c4d5
fix: VTV streams + WC2026 + remove VTV Nam Bộ shorts
078e85d9
fix: VTV streams + WC2026 + remove VTV Nam Bộ shorts
dd0f5e07
fix: VTV streams + WC2026 + remove VTV Nam Bộ shorts
97d1d937
Remove static/wc2026_v2.js - VTV Nam Bộ shorts cleanup
9e8c0245
Remove static/wc_shorts_inject.js - VTV Nam Bộ shorts cleanup
db5e602c
Remove static/wc_shorts_slide.js - VTV Nam Bộ shorts cleanup
7ac36573
Remove yt_scraper.py - VTV Nam Bộ shorts cleanup
8c395270
Remove vtv_shorts.py - VTV Nam Bộ shorts cleanup
86524ec5
Restore app_v2_entry.py to 0cc342c
1c383400
Restore main.py to 0cc342c
8813cd53
Restore vtv_api.py to 0cc342c
521aa8d1
Restore vtv_shorts.py to 0cc342c
f6cf105c
Restore yt_scraper.py to 0cc342c
0db7d56d
Restore vtv_scraper.py to 0cc342c
c81934ca
Restore static/app_v2.js to 0cc342c
de823c20
Restore static/wc_shorts_inject.js to 0cc342c
5d669090
Restore static/wc_shorts_slide.js to 0cc342c
88a17a4c
Restore static/index_v2.html to 0cc342c
5af12594
Restore static/yt_live.js to 0cc342c
f9fa3227
Restore static/wc2026_v2.js to 0cc342c
53056a7c
Remove .rebuild (not in 0cc342c)
8525eeff
Remove .restart_trigger (not in 0cc342c)
8843b5ed
Remove TRIGGER_REBUILD_V8.md (not in 0cc342c)
ab175a5c
Remove runtime.txt (not in 0cc342c)
5e1bd449
Fix VTV channels: switch to VTVGo CDN primary, add verify=False for SSL, mark vtv10/vtvprime as unavailable
6aa0e766
Update yt_live.js: handle unavailable channel status (vtv10/vtvprime)
5dffe342
Update yt_live.js: handle unavailable channel status (vtv10/vtvprime show 🔒), fix loadAllStreams to use response data
0cefbd88
Fix VTV proxy: separate m3u8 variant proxy from segment proxy, fix content-type handling, add verify=False for self-signed certs
f22c37c1
Update NEEDS_PROXY to include VTVGo CDN domains (vtvdigital.vn, vtvgolive)
7d2c887c
Fix HLS.js config: disable worker, reduce buffer, fix startLevel, add debug logging
10484408
Remove VTVGo CDN from NEEDS_PROXY - direct play since VTVGo has CORS headers
61d8059a
Upgrade HLS.js to v1.5.13, add debug logging for stream playback
4b76fcb0
Re-add VTVGo to NEEDS_PROXY, remove HLS.js upgrade code
3020d765
Add comprehensive HLS.js debug logging to diagnose no-video issue
5e225fee
Upload vtv_test.html
6df6865b
Fix missing rec variable declaration in HLS error handler
e426e577
Add visible status display in VTV player for debugging (vtv-status element)
a0359766
Add VTV debug test page in static folder
6bee349d
Add unified streaming proxy endpoint /api/proxy/stream/vtv
5260a50e
Use unified stream proxy /api/proxy/stream/vtv?channel_id=xxx
c17ce9cc
Fix: make video visible immediately, add click-to-play, fix opacity during load
c4ce6947
Update channel list: vtv3/vtv9 now unavailable (404 on VTVGo CDN)
ce2c1184
Fix import names for scrape functions in api_article_v2
fd510c4a
Fix: cast max_count to int in get_vtvnambo_shorts
8589925b
Add /api/vtv/test endpoint for stream debugging
7b9bcc86
Trigger space rebuild to apply latest fixes
c87d9b35
Remove rebuild trigger
263a547d
Fix: handle Query object in max_count parameter
fcf51e7f
Fix: handle offline channels, add try-catch to prevent crashes
a662daef
Update ML Intern artifact metadata
56347240
fix: expose loadHome on window so yt_live.js can override it
cd8d9c5a
fix: hot topics override + WC shorts tab removed + VTV pinBlock fallback
1277d387
fix: remove wc_shorts script refs from HTML
c23c7e5e
fix: add MutationObserver fallback for VTV pinBlock when loadHome not yet defined
86999338
fix: remove WC section, fix loadHotTopics call, remove auto-loadHome
de1189c6
fix: VTV self-pin on DOMContentLoaded + switchCat home triggers pinBlock
6c043ef5
fix: switchCat calls loadHome, removed WC shorts scripts + wc2026 script
ac71e441
remove: neutralize wc_shorts_inject.js
9ce6b2ae
remove: neutralize wc_shorts_slide.js
61150921
fix: re-add auto-call via window.loadHome for first page load
cd2fb48c
fix: shorts API non-blocking, reduced timeouts to prevent page hang
939b41ef
Restore main to commit 0cc342c (#17)
effcb01a
Fix VTV LIVE blackscreen + remove WC shorts slide
316ba345
Fix VTV LIVE blackscreen + remove WC shorts slide
cac65ef8
Fix VTV LIVE blackscreen + remove WC shorts slide
4abb709d
Delete static/wc_shorts_slide.js, static/wc_shorts_inject.js
6d7c17ad
Fix VTV proxy SSL: verify=False for vtvdigital self-signed cert + rewrite nested m3u8
eec71a2c
Fix VTV proxy SSL: verify=False for vtvdigital self-signed cert + rewrite nested m3u8
c52556fa
Fix VTV 403: add Referer/Origin headers for vtvdigital + show video before HLS attach
f67d473e
Fix VTV 403: add Referer/Origin headers for vtvdigital + show video before HLS attach
2f0c2929
Fix VTV 403: add Referer/Origin headers for vtvdigital + show video before HLS attach
48040cf4
Fix VTV streams: add VTV6/VTV10 failover, force proxy all URLs, multi-source fallback
98436183
Fix VTV streams: return direct URLs to client, update FPTPlay URLs, add canthotv fallback, add CORS proxy, fix AES-128 key URI rewriting in proxy
a5c5040d
Fix VTV player v8: try direct URLs first (client fetches through VPN), fall back to proxy on CORS error. Fix FPTPlay referer headers in xhrSetup.
40b47770
Fix VTV streams: update xemtv.net → xemtv.us with new URL pattern + add FPTPlay/VTVGo/canthotv fallbacks
24ebcdae
Fix VTV scraper: update xemtv.net → xemtv.us with new .html URL pattern
0344d7a4
Rebuild trigger: fix VTV streams xemtv.net → xemtv.us
30c2d1e0
Fix proxy: update headers for xemtv.us + add xemtv origin support
7db83181
Remove test files
3579ed12
Force rebuild: fix VTV xemtv.us streams v2
65f6a67c
Fix typo: tv10 → vtv10 in name_map
58f09c86
Fix typo in name_map: tv10 → vtv10
6c387854
Fix VTV live: restore loadHome wrapper + update to xemtv.us + FPTPlay direct + proxy fallback
6713ddde
Delete TRIGGER_REBUILD_V6.md, TRIGGER_REBUILD_V7.md, _restart_trigger.txt, _static_build_trigger.txt, static/restart_trigger.txt, static/vtv_test2.html
76156e2f
Fix VTV live not showing: restore loadHome wrapper in yt_live.js
f5d4a7d5
Fix VTV: add safety net pinBlock on DOMContentLoaded to prevent race condition
10c8144f
Delete REBUILD_TRIGGER.md
c15a095b
trigger: rebuild for VTV live fix
211bb6f0
Fix VTV live: use MutationObserver to pin VTV block whenever view-home is rendered, independent of loadHome
fe841842
Restore commit e77a637 - main.py
0f375ab7
Restore e77a637: app_v2_entry.py
8e4b25a4
Restore e77a637: vtv_api.py
f722e5a1
Restore e77a637: wc2026_scraper.py
1c992956
Restore e77a637: small config files
9f3ceb3e
Restore e77a637: Dockerfile
6ad34e22
Restore e77a637: _run.py
9495517c
Restore e77a637: vtv_scraper.py
d2599538
Restore e77a637: vtv_shorts.py
fe96d1f1
Restore e77a637: bongda_proxy.py
75548095
Restore e77a637: remaining small files
af3c069e
Restore e77a637: .restart_trigger
d7ae7d83
Delete _rebuild_trigger
a5839cf6
Restore e77a637: static/wc_shorts_inject.js
6ad67367
Restore yt_live.js from e77a637 - VTV streaming fix
3441b9d5
Restore app_v2.js from e77a637 - full e77a637 version
cdbeccbc
Restore index_v2.html - remove wc2026_v2.js reference, match e77a637 structure
7793556d
Fix VTV streams: switch primary to xemtv.us, update FPTPlay URLs, 4-source fallback chain
b4087952
Fix VTV streams: xemtv.us primary, new FPTPlay URLs, normalize old URLs, 4-source fallback
ca1ea7be
Restore World Cup 2026 section on homepage + add wc2026 data fetch
ab9480f0
Change default VTV channel from VTV3 to VTV6, update NEEDS_PROXY regex for fptplay53.net
68e3ccbc
Add World Cup 2026 CSS inline, load wc2026_v2.js before app_v2.js
088e78b8
Trigger rebuild
319e3801
Upload static/app_v2.js
5da3b515
Restore ca1ea7b + WC2026: update static/app_v2.js
c1b9459c
Restore ca1ea7b + WC2026: update static/yt_live.js
1d38f941
Restore ca1ea7b + WC2026: update .rebuild
dfda59d2
Upload test_restore.txt
cec136c8
Delete test_restore.txt
eafa22af
Upload _run.py
ce4a6f76
Upload runtime.txt
ea26195f
Upload main.py
65d2b75d
Upload vtv_shorts.py
7a44ecb4
Upload vtv_api.py
c2ea4533
Upload vtv_scraper.py
db38b970
Upload yt_scraper.py
ecc9c7b6
Upload bongda_proxy.py
7fadd51f
Restore ca1ea7b + WC2026: update static/app_v2.js
67c01bbe
Restore ca1ea7b + WC2026: update static/index_v2.html
e350adc6
Upload static/app_v2.js
fa5a92dc
Restore ca1ea7b + WC2026: update static/app_v2.js
bf0c83b1
Restore ca1ea7b + WC2026: update match_detail.py
8ac36777
Restore ca1ea7b + WC2026: update match_detail_v2.py
bbe026b7
Restore ca1ea7b + WC2026: update piped_client.py
8b96cea1
Restore ca1ea7b + WC2026: update rewrite_slide.py
d3fa499c
Restore ca1ea7b + WC2026: update ai_ext.py
762c6a9c
Restore ca1ea7b + WC2026: update ai_fix2.py
7fe6e69a
Restore ca1ea7b + WC2026: update ai_patch.py
70885db6
Restore ca1ea7b + WC2026: update ai_runtime.py
a74a1c70
Restore ca1ea7b + WC2026: update ai_runtime_final.py
d67d38af
Restore ca1ea7b + WC2026: update ai_runtime_final2.py
4b0a0935
Restore ca1ea7b + WC2026: update ai_runtime_final3.py
a31517de
Restore ca1ea7b + WC2026: update ai_runtime_final4.py
59522cfd
Restore ca1ea7b + WC2026: update ai_runtime_final5.py
0906dfe2
Restore ca1ea7b + WC2026: update ai_runtime_final6.py
fd96c66b
Restore ca1ea7b + WC2026: update ai_runtime_patch_fast.py
92f84800
Restore ca1ea7b + WC2026: update app_clean.py
0534f83c
Restore ca1ea7b + WC2026: update app_entry.py
fa2e427c
Restore ca1ea7b + WC2026: update app_final.py
89f5ae09
Restore ca1ea7b + WC2026: update app_main.py
95b6d937
Restore ca1ea7b + WC2026: update app_patch_unified.py
2f720530
Restore ca1ea7b + WC2026: update app_run.py
33361e39
Restore ca1ea7b + WC2026: update app_v2_entry.py
0f5ec34c
Restore ca1ea7b + WC2026: update app_v2_entry_test.py
39f0a52b
Restore ca1ea7b + WC2026: update app_v2_entry_v2.py
26bd88b6
Restore ca1ea7b + WC2026: update main_patch.py
f46b136d
Restore ca1ea7b + WC2026: update patch_extra.py
212534a9
Restore ca1ea7b + WC2026: update patch_runtime.py
a5106c54
Restore ca1ea7b + WC2026: update restore_runner.py
f31a0442
Restore ca1ea7b + WC2026: update CHANGELOG.md
df9ed1b8
Restore ca1ea7b + WC2026: update README.md
79025aef
Restore ca1ea7b + WC2026: update static/fm_fix.css
d76441f5
Restore ca1ea7b + WC2026: update static/hot_multi.js
336d6837
Restore ca1ea7b + WC2026: update static/index.html
9f0952b3
Restore ca1ea7b + WC2026: update static/index_v2.html
216c2ebd
Restore ca1ea7b + WC2026: update static/live_mode.js
2d78388b
Restore ca1ea7b + WC2026: update static/match_detail_v6.js
bf9b836a
Restore ca1ea7b + WC2026: update static/rewrite_fix.js
c543fc49
Restore ca1ea7b + WC2026: update static/wc2026.css
2a06d2a1
Restore ca1ea7b + WC2026: update static/wc2026_fixtures.json
b9582ce8
Restore ca1ea7b + WC2026: update static/wc2026_v2.js
be986656
Restore ca1ea7b + WC2026: update static/wc_shorts_inject.js
81906364
Restore ca1ea7b + WC2026: update static/yt_live.js
0430151c
Upload .restart_trigger
3e3a609a
Upload runtime.txt
1dadb1ab
Upload yt_scraper.py
71559c3a
Restore to ca1ea7b - update bongda_proxy, vtv files, yt_scraper
ecc38689
Upload vtv_shorts.py
f4aca67a
Restore to ca1ea7b - update .rebuild, .restart_trigger, _run.py
266cc3b8
Upload vtv_api.py
0b47bc27
Upload vtv_scraper.py
137a6712
Upload .restart_trigger
0e4bd6dc
Upload _run.py
cc933b3d
Upload static/index_v2.html
fc6bb308
Restore to ca1ea7b - update static files (app_v2.js, index_v2.html)
a72cc907
Fix: update static/app_v2.js - EPG timezone, World Cup display, page load
6be1547a
Fix: update vtv_api.py - EPG timezone, World Cup display, page load
01b0523a
Fix: update main.py - EPG timezone, World Cup display, page load
88312044
Trigger rebuild
00cd61ff
Fix: World Cup section + EPG timezone + CSS
d503020b
Fix: World Cup section + EPG timezone + CSS
b60f51d6
Fix: World Cup section + EPG timezone + CSS
33d68756
Trigger rebuild
4640214b
Fix: WC section position + EPG timezone + CSS tables
bb4999e8
Fix: WC section position + EPG timezone + CSS tables
ec4733b3
Fix: WC section position + EPG timezone + CSS tables
069377df
Fix: WC highlights img/title + EPG date logic + CSS
137d1dd3
Fix: WC highlights img/title + EPG date logic + CSS
ac359923
Trigger rebuild
bc821fdf
Fix: WC tab loading state + API endpoints + highlights fallback
58846cdd
Fix: WC tab loading state + API endpoints + highlights fallback
c971212b
Trigger rebuild
f043e24b
Fix: rate limit + WC data + scrape logic + CSS
977a86e1
Fix: rate limit + WC data + scrape logic + CSS
7dd66381
Trigger rebuild
ea1eace0
Fix: WC data from scraper + rate limit + highlights fallback
162e53c2
Fix: WC data from scraper + rate limit + highlights fallback
a11c6f49
Trigger rebuild
6004aa85
Fix: add missing scrape_summary, scrape_history, scrape_h2h, scrape_lineups, scrape_match_detail, scrape_road_to_wc
77151af7
Trigger rebuild
5f591710
Fix: WC highlights og:image/title fetch + CSS
b0e7bec2
Trigger rebuild
93e0c0e7
Fix: restore simple scrape logic + WC highlights fallback
9a0ad33e
Trigger rebuild
3af0e60e
Restore index_v2.html WC 2026 section from 7a0c951: wc2026.css, header text, wc2026_v2.js script, WC HTML styles
ac33235a
Restore wc2026_v2.js from 7a0c951: full version with shorts, WC_CSS, standings, renderWCShortsSlide, openWCShortsFeed
af364ab1
Restore app_v2.js WC 2026 section from 7a0c951: wc2026-live-section in loadHome, shorts fetch, switchWCTab call, render order
de642287
Restore wc2026_scraper.py from 7a0c951: add scrape_road_to_wc, road key in get_wc2026_all, 8-source news search
fe822d11
Trigger rebuild: restore WC 2026 section from 7a0c951
b1366592
Upload static/yt_live.js
8299bb27
Fix EPG _parse_time: always use current calendar date (not yesterday for hours < 5)
e072bab3
Trigger rebuild: EPG date fix + v8 player (watch from start, scheduled recording)
bec4bda7
Fix yt_live.js v8 - complete file with watch-from-start + scheduled recording
60ab5c10
Upload .rebuild
b2262eaa
Fix v9: DVR buffer (liveBackBufferLength=120s) + seek bar for watch-from-start. Fix HLS_LEVEL_LOADED seek. Full yt_live.js rewrite.
40f076f2
Fix: WC highlights fallback for world-cup league when xemlaibongda scraper returns empty. Add _get_wc_highlights_fallback with yt_scraper integration.
c040d999
Fix: guard switchWCTab call with typeof check to prevent JS crash before wc2026_v2.js loads. WC highlights slide now renders correctly on homepage.
1e6b05c3
Fix: renderWCHighlights now uses /api/highlights/world-cup (with fallback) instead of non-existent /api/proxy/xlb endpoint. WC highlights tab now loads correctly.
31799229
Upload .rebuild
1a58e67d
Restore to b136659 - WC 2026 section + stable main
d5367a5d
Restore to b136659 - WC 2026 + fix homepage
753cc8d5
Trigger rebuild after restore to b136659
98c133ac
v8: DVR 5-min rewind buffer + default channel VTV6
f9e1c032
Rebuild: DVR v8 + VTV6 default
7f9472ab
v9: Fix DVR seek snap-back to LIVE
264090e4
Rebuild: v9 DVR fix
10b79cac
v10: Fix DVR — stream plays at live + user can seek back freely
13cbabf4
Rebuild v10
0de88acf
v11: Fix DVR snap-back — override hls.startLoad
4b7fba2c
Rebuild v11
4c51c2f6
v12: Fix DVR — disable HLS.js liveSync, manage live edge manually
a7b1259c
v12: Fix DVR — use hls.liveSyncPosition for initial seek
efd0795b
Rebuild v12
fa250ada
v13: Fix DVR — override synchronizeToLiveEdge to NO-OP (root cause fix)
4da61a91
Rebuild v13
6dfc8190
v13b: Use LEVEL_LOADED instead of MANIFEST_PARSED for reliable liveSyncPosition
502a82f6
Rebuild v13b
55ca9ee4
v14: Revert to v7 stable — remove DVR completely, keep LIVE/PiP/recorder, default VTV6
0b3f3723
Rebuild v14
0eba3c52
v14: Force rebuild — remove DVR, revert to v7 stable
955063ee
v15: DVR with liveDurationInfinity — no auto-snap, user seeks freely in 5min buffer
a1eb736f
Rebuild v15
d67b2989
Upload README.md
444e536c
Upload requirements.txt
14324d46
Upload Dockerfile
f48659c2
Upload .rebuild
a454c857
Upload ai_ext.py
27bddcf5
Upload ai_ext.py
0cbc885e
Upload ai_fix2.py
443a6277
Upload ai_runtime_final6.py
f73f710d
Delete patch_runtime.py, restore_runner.py, rewrite_slide.py
e90849cb
Upload ai_patch.py
950be9b0
Upload ai_ext.py
d290ac19
Delete app_v2_entry.py, restore_runner.py, rewrite_slide.py, patch_runtime.py
b355324a
Upload requirements.txt
6252a363
Upload .rebuild
075e7b6e
Upload README.md
acfef257
Upload Dockerfile
f24002b7
Upload app_v2_entry.py
0f655795
Upload requirements.txt
4c20a498
Upload rewrite_slide.py
cf417d13
Upload patch_runtime.py
7a34c13a
Upload README.md
d8b1a31c
Upload restore_runner.py
985e8cb8
Upload ai_runtime_final6.py
f34d7006
Upload static/yt_live.js
fad3e196
bep40
Owner
13 days ago
🤖
bep40/Space-Mutiverse-Control
No description provided.
Fix: Change default VTV channel from VTV3 to VTV6
56ccc2b8
bep40
changed pull request status to
closed
13 days ago
Edit
Preview
Upload images, audio, and videos by dragging in the text input, pasting, or
clicking here
.
Tap or paste here to upload images
Comment
·
Sign up
or
log in
to comment