bep40 commited on
Commit
d7d9268
Β·
verified Β·
1 Parent(s): 58aa5ca

ROOT CAUSE FIX: move all JS from head= (stripped by Gradio) to js= parameter

Browse files
Files changed (1) hide show
  1. app.py +52 -103
app.py CHANGED
@@ -757,7 +757,7 @@ footer,.built-with{display:none!important}
757
  .label-wrap{background:#111!important}
758
  """
759
 
760
- JS_HEAD = """
761
  <meta name="description" content="Tin tα»©c tα»•ng hợp nhanh nhαΊ₯t - VnExpress, BongDaPlus">
762
  <meta property="og:title" content="Tin Tα»©c Việt Nam - Tα»•ng Hợp">
763
  <meta property="og:description" content="Thời sα»±, thαΊΏ giα»›i, kinh doanh, cΓ΄ng nghệ, thể thao, giαΊ£i trΓ­.">
@@ -765,12 +765,18 @@ JS_HEAD = """
765
  <meta property="og:image" content="https://s1.vnecdn.net/vnexpress/restruct/i/v9505/logo_default.jpg">
766
  <meta name="twitter:card" content="summary_large_image">
767
  <link rel="canonical" href="https://bep40-bongdaplus-news.hf.space">
768
- <script src="https://cdn.jsdelivr.net/npm/hls.js@1/dist/hls.min.js"></script>
769
- <script>
770
- (function(){
 
 
 
 
 
 
771
  var SPACE='https://bep40-bongdaplus-news.hf.space';
772
 
773
- /* ── Navigation ── */
774
  window.bdpOpen=function(url,aid,sl){
775
  window.location.hash='#/'+sl+'/'+aid;
776
  try{localStorage.setItem('bdp_url_'+aid,url);}catch(e){}
@@ -778,8 +784,8 @@ window.bdpOpen=function(url,aid,sl){
778
  if(!w) return;
779
  var el=w.querySelector('input')||w.querySelector('textarea');
780
  if(!el) return;
781
- var d=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,'value');
782
- if(el.tagName==='TEXTAREA') d=Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype,'value');
783
  if(d&&d.set) d.set.call(el,url);
784
  el.dispatchEvent(new Event('input',{bubbles:true}));
785
  window.scrollTo({top:0,behavior:'smooth'});
@@ -800,12 +806,11 @@ window.bdpToast=function(m){var e=document.getElementById('bdp-toast');if(!e){e=
800
 
801
  /* ── Slider scroll ── */
802
  window.bdpSlideScroll=function(dir){
803
- var track=document.getElementById('vslide-track');
804
- if(!track) track=document.querySelector('.vslide-track');
805
  if(track) track.scrollBy({left:dir*260,behavior:'smooth'});
806
  };
807
 
808
- /* ── TikTok Mode from slider ── */
809
  window.bdpTikTokMode=function(){
810
  var items=document.querySelectorAll('#vslide-track .vslide-item[data-vinfo]');
811
  if(!items.length) return;
@@ -816,122 +821,66 @@ window.bdpTikTokMode=function(){
816
  };
817
 
818
  function _openTikTok(vids){
819
- var old=document.getElementById('tk-fullscreen');
820
- if(old) old.remove();
821
- var wrap=document.createElement('div');
822
- wrap.id='tk-fullscreen';
823
- wrap.className='tk-container';
824
- var html='<div class="tk-header"><span>πŸ“± '+vids.length+' Video Β· LΖ°α»›t để xem tiαΊΏp</span><button class="tk-close" onclick="document.getElementById(\'tk-fullscreen\').remove()">βœ•</button></div><div class="tk-scroll">';
825
  vids.forEach(function(v,i){
826
- var poster=v.poster||v.img||'';
827
- var isHls=v.type==='hls'||v.src.indexOf('m3u8')>-1;
828
- html+='<div class="tk-slide" data-idx="'+i+'" data-vsrc="'+(v.src||'')+'" data-vtype="'+(isHls?'hls':'mp4')+'" data-embed="'+(v.embed_id||'')+'" data-source="'+(v.source||'')+'" data-link="'+(v.link||'')+'">';
829
- html+='<div class="tk-video-box">';
830
- if(v.src){
831
- if(isHls) html+='<video class="tk-video" playsinline preload="metadata" poster="'+poster+'" data-hls-src="'+v.src+'"></video>';
832
- else html+='<video class="tk-video" playsinline preload="metadata" poster="'+poster+'"><source src="'+v.src+'" type="video/mp4"></video>';
833
- } else {
834
- html+='<div class="tk-loading" style="color:#fff;text-align:center;padding:40px">⏳ Đang tải video...</div>';
835
- html+='<video class="tk-video" playsinline preload="metadata" poster="'+poster+'" style="display:none"></video>';
836
- }
837
- html+='</div><div class="tk-info"><p class="tk-cap">'+v.title+'</p><span class="tk-counter">'+(i+1)+'/'+vids.length+'</span></div></div>';
838
  });
839
- html+='</div>';
840
- wrap.innerHTML=html;
841
- document.body.appendChild(wrap);
842
- _initTkScroll(wrap);
843
  }
844
 
845
  function _initTkScroll(container){
846
- var scroll=container.querySelector('.tk-scroll');
847
- if(!scroll) return;
848
- var currentIdx=-1;
849
  function playSlide(idx){
850
- if(idx===currentIdx) return;
851
- /* Pause all */
852
  container.querySelectorAll('.tk-video').forEach(function(v){try{v.pause();}catch(e){}});
853
  currentIdx=idx;
854
- var slide=container.querySelector('.tk-slide[data-idx="'+idx+'"]');
855
- if(!slide) return;
856
- var video=slide.querySelector('.tk-video');
857
- if(!video) return;
858
- /* Lazy-load BDP videos that don't have src yet */
859
- var vsrc=slide.getAttribute('data-vsrc');
860
- var embedId=slide.getAttribute('data-embed');
861
- if(!vsrc && embedId && slide.getAttribute('data-source')==='bdp'){
862
  var loading=slide.querySelector('.tk-loading');
863
- fetch('/api/bdp_video/'+embedId).catch(function(){});
864
- /* Use XMLHttpRequest to fetch embed page directly */
865
- var xhr=new XMLHttpRequest();
866
- xhr.open('GET','https://bongdaplus.vn/video-embed/'+embedId+'.html',true);
867
- xhr.onload=function(){
868
- var match=xhr.responseText.match(/src="([^"]+\\.mp4[^"]*)"/);
869
- if(match){
870
- slide.setAttribute('data-vsrc',match[1]);
871
- var src=document.createElement('source');
872
- src.src=match[1];src.type='video/mp4';
873
- video.appendChild(src);video.style.display='block';video.load();
874
- if(loading) loading.style.display='none';
875
- video.play().catch(function(){});
876
- }
877
- };
878
- xhr.send();
879
- return;
880
  }
881
- /* Init HLS if needed */
882
  var vtype=slide.getAttribute('data-vtype');
883
- if(vtype==='hls' && video.getAttribute('data-hls-src') && !video._hlsInit){
884
- initHlsVideo(video);
885
- }
886
- if(!video._initDone && vtype!=='hls'){video._initDone=true;video.load();}
887
- video.currentTime=0;
888
- video.play().catch(function(){});
889
  }
890
- /* IntersectionObserver for auto-play on scroll */
891
- var observer=new IntersectionObserver(function(entries){
892
- entries.forEach(function(e){
893
- if(e.isIntersecting && e.intersectionRatio>0.6){
894
- var idx=parseInt(e.target.getAttribute('data-idx'));
895
- playSlide(idx);
896
- }
897
- });
898
- },{root:scroll,threshold:[0.6]});
899
- container.querySelectorAll('.tk-slide').forEach(function(s){observer.observe(s);});
900
- /* Start first */
901
  setTimeout(function(){playSlide(0);},300);
902
  }
903
 
904
  /* ── Comments ── */
905
  function gc(a){try{return JSON.parse(localStorage.getItem('bdp_cmt_'+a))||[];}catch(e){return[];}}
906
  function sc(a,c){try{localStorage.setItem('bdp_cmt_'+a,JSON.stringify(c));}catch(e){}}
907
- window.bdpRenderCmt=function(a){var l=document.getElementById('cmt-list-'+a);if(!l)return;var c=gc(a);if(!c.length){l.innerHTML='<div class="bdp-cmt-empty">ChΖ°a cΓ³ bΓ¬nh luαΊ­n. HΓ£y lΓ  người Δ‘αΊ§u tiΓͺn!</div>';return;}var h='';for(var i=c.length-1;i>=0;i--){var x=c[i];h+='<div class="bdp-cmt-item"><span class="bdp-cmt-author">'+x.name+'</span><span class="bdp-cmt-date">'+x.date+'</span><div class="bdp-cmt-body">'+x.text.replace(/</g,'&lt;').replace(/>/g,'&gt;')+'</div></div>';}l.innerHTML=h;};
908
- window.bdpAddCmt=function(a){var n=document.getElementById('cmt-name-'+a),t=document.getElementById('cmt-text-'+a);if(!n||!t)return;var nm=n.value.trim(),tx=t.value.trim();if(!nm){window.bdpToast('⚠️ NhαΊ­p tΓͺn');n.focus();return;}if(!tx){window.bdpToast('⚠️ NhαΊ­p bΓ¬nh luαΊ­n');t.focus();return;}var c=gc(a);c.push({name:nm,text:tx,date:new Date().toLocaleString('vi-VN')});sc(a,c);t.value='';window.bdpRenderCmt(a);window.bdpToast('βœ… Đã gα»­i!');};
909
 
910
- /* ══ HLS + Video init ══ */
911
  function initHlsVideo(v){
912
- if(v._hlsInit) return; v._hlsInit=true;
913
- var src=v.getAttribute('data-hls-src'); if(!src) return;
914
  if(v.canPlayType('application/vnd.apple.mpegURL')){v.src=src;}
915
- else if(window.Hls&&Hls.isSupported()){
916
- var h=new Hls({maxBufferLength:30,maxMaxBufferLength:60});
917
- h.loadSource(src);h.attachMedia(v);
918
- h.on(Hls.Events.ERROR,function(e,data){if(data.fatal){v.src=src;}});
919
- } else {v.src=src;}
920
  }
921
 
922
  new MutationObserver(function(muts){muts.forEach(function(m){m.addedNodes.forEach(function(n){
923
- if(!n.querySelectorAll) return;
924
- n.querySelectorAll('img.bdp-lazy-img').forEach(function(img){
925
- if(!img._errBound){img._errBound=true;img.addEventListener('error',function(){this.style.display='none';});}
926
- });
927
  n.querySelectorAll('video[data-hls-src]').forEach(initHlsVideo);
928
  n.querySelectorAll('video.bdp-video:not([data-hls-src])').forEach(function(v){if(!v._initDone){v._initDone=true;v.load();}});
929
  n.querySelectorAll('[id^="cmt-list-"]').forEach(function(d){window.bdpRenderCmt(d.id.replace('cmt-list-',''));});
930
- /* Auto-init TikTok scroll in article */
931
- n.querySelectorAll('.tk-container .tk-scroll').forEach(function(sc){
932
- var container=sc.closest('.tk-container');
933
- if(container && !container._tkInit){container._tkInit=true;_initTkScroll(container);}
934
- });
935
  });});}).observe(document.body,{childList:true,subtree:true});
936
 
937
  setInterval(function(){
@@ -940,13 +889,13 @@ setInterval(function(){
940
  },1500);
941
 
942
  /* ── Hash routing ── */
943
- window.addEventListener('load',function(){var h=window.location.hash;if(h&&h.startsWith('#/')){var ps=h.slice(2).split('/');if(ps.length>=2){var aid=ps[ps.length-1];try{var url=localStorage.getItem('bdp_url_'+aid);if(url)setTimeout(function(){window.bdpOpen(url,aid,ps.slice(0,-1).join('/'));},1200);}catch(e){}}}});
944
- })();
945
- </script>
946
  """
947
 
948
  # ══════════════════════════════════════════════════════════════════════════════
949
- with gr.Blocks(title="Tin Tα»©c Việt Nam",css=CSS,head=JS_HEAD,theme=gr.themes.Base(),fill_width=True) as demo:
950
  gr.HTML('<div class="bdp-header"><h1>πŸ“° Tin Tα»©c Việt Nam</h1><p>VnExpress Β· BongDaPlus Β· Thời sα»± Β· ThαΊΏ giα»›i Β· Kinh doanh Β· CΓ΄ng nghệ Β· Thể thao Β· GiαΊ£i trΓ­ Β· Video</p></div>')
951
  article_url=gr.Textbox(value="",elem_id="article-url-input",elem_classes=["sr-only"],max_lines=1)
952
  with gr.Row(elem_classes=["controls-row"]):
 
757
  .label-wrap{background:#111!important}
758
  """
759
 
760
+ HEAD_META = """
761
  <meta name="description" content="Tin tα»©c tα»•ng hợp nhanh nhαΊ₯t - VnExpress, BongDaPlus">
762
  <meta property="og:title" content="Tin Tα»©c Việt Nam - Tα»•ng Hợp">
763
  <meta property="og:description" content="Thời sα»±, thαΊΏ giα»›i, kinh doanh, cΓ΄ng nghệ, thể thao, giαΊ£i trΓ­.">
 
765
  <meta property="og:image" content="https://s1.vnecdn.net/vnexpress/restruct/i/v9505/logo_default.jpg">
766
  <meta name="twitter:card" content="summary_large_image">
767
  <link rel="canonical" href="https://bep40-bongdaplus-news.hf.space">
768
+ """
769
+
770
+ JS_CODE = """
771
+ function() {
772
+ /* Load HLS.js */
773
+ var s=document.createElement('script');
774
+ s.src='https://cdn.jsdelivr.net/npm/hls.js@1/dist/hls.min.js';
775
+ document.head.appendChild(s);
776
+
777
  var SPACE='https://bep40-bongdaplus-news.hf.space';
778
 
779
+ /* ── Navigation: set textbox value via native setter β†’ triggers Gradio .input() ── */
780
  window.bdpOpen=function(url,aid,sl){
781
  window.location.hash='#/'+sl+'/'+aid;
782
  try{localStorage.setItem('bdp_url_'+aid,url);}catch(e){}
 
784
  if(!w) return;
785
  var el=w.querySelector('input')||w.querySelector('textarea');
786
  if(!el) return;
787
+ var d=Object.getOwnPropertyDescriptor(
788
+ el.tagName==='TEXTAREA'?HTMLTextAreaElement.prototype:HTMLInputElement.prototype,'value');
789
  if(d&&d.set) d.set.call(el,url);
790
  el.dispatchEvent(new Event('input',{bubbles:true}));
791
  window.scrollTo({top:0,behavior:'smooth'});
 
806
 
807
  /* ── Slider scroll ── */
808
  window.bdpSlideScroll=function(dir){
809
+ var track=document.getElementById('vslide-track')||document.querySelector('.vslide-track');
 
810
  if(track) track.scrollBy({left:dir*260,behavior:'smooth'});
811
  };
812
 
813
+ /* ── TikTok Mode ── */
814
  window.bdpTikTokMode=function(){
815
  var items=document.querySelectorAll('#vslide-track .vslide-item[data-vinfo]');
816
  if(!items.length) return;
 
821
  };
822
 
823
  function _openTikTok(vids){
824
+ var old=document.getElementById('tk-fullscreen');if(old)old.remove();
825
+ var wrap=document.createElement('div');wrap.id='tk-fullscreen';wrap.className='tk-container';
826
+ var h='<div class="tk-header"><span>'+vids.length+' Video</span><button class="tk-close" onclick="document.getElementById(\'tk-fullscreen\').remove()">βœ•</button></div><div class="tk-scroll">';
 
 
 
827
  vids.forEach(function(v,i){
828
+ var poster=v.poster||'';var isHls=v.type==='hls'||(v.src&&v.src.indexOf('m3u8')>-1);
829
+ h+='<div class="tk-slide" data-idx="'+i+'" data-vsrc="'+(v.src||'')+'" data-vtype="'+(isHls?'hls':'mp4')+'" data-embed="'+(v.embed_id||'')+'" data-source="'+(v.source||'')+'"><div class="tk-video-box">';
830
+ if(v.src){h+=isHls?'<video class="tk-video" playsinline preload="metadata" poster="'+poster+'" data-hls-src="'+v.src+'"></video>':'<video class="tk-video" playsinline preload="metadata" poster="'+poster+'"><source src="'+v.src+'" type="video/mp4"></video>';}
831
+ else{h+='<div class="tk-loading" style="color:#fff;text-align:center;padding:40px">⏳</div><video class="tk-video" playsinline preload="metadata" poster="'+poster+'" style="display:none"></video>';}
832
+ h+='</div><div class="tk-info"><p class="tk-cap">'+v.title+'</p><span class="tk-counter">'+(i+1)+'/'+vids.length+'</span></div></div>';
 
 
 
 
 
 
 
833
  });
834
+ h+='</div>';wrap.innerHTML=h;document.body.appendChild(wrap);_initTkScroll(wrap);
 
 
 
835
  }
836
 
837
  function _initTkScroll(container){
838
+ var scroll=container.querySelector('.tk-scroll');if(!scroll)return;var currentIdx=-1;
 
 
839
  function playSlide(idx){
840
+ if(idx===currentIdx)return;
 
841
  container.querySelectorAll('.tk-video').forEach(function(v){try{v.pause();}catch(e){}});
842
  currentIdx=idx;
843
+ var slide=container.querySelector('.tk-slide[data-idx="'+idx+'"]');if(!slide)return;
844
+ var video=slide.querySelector('.tk-video');if(!video)return;
845
+ var vsrc=slide.getAttribute('data-vsrc');var embedId=slide.getAttribute('data-embed');
846
+ if(!vsrc&&embedId&&slide.getAttribute('data-source')==='bdp'){
 
 
 
 
847
  var loading=slide.querySelector('.tk-loading');
848
+ var xhr=new XMLHttpRequest();xhr.open('GET','https://bongdaplus.vn/video-embed/'+embedId+'.html',true);
849
+ xhr.onload=function(){var m=xhr.responseText.match(/src="([^"]+\\.mp4[^"]*)"/);if(m){slide.setAttribute('data-vsrc',m[1]);var src=document.createElement('source');src.src=m[1];src.type='video/mp4';video.appendChild(src);video.style.display='block';video.load();if(loading)loading.style.display='none';video.play().catch(function(){});}};
850
+ xhr.send();return;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
851
  }
 
852
  var vtype=slide.getAttribute('data-vtype');
853
+ if(vtype==='hls'&&video.getAttribute('data-hls-src')&&!video._hlsInit)initHlsVideo(video);
854
+ if(!video._initDone&&vtype!=='hls'){video._initDone=true;video.load();}
855
+ video.currentTime=0;video.play().catch(function(){});
 
 
 
856
  }
857
+ var obs=new IntersectionObserver(function(entries){entries.forEach(function(e){if(e.isIntersecting&&e.intersectionRatio>0.6)playSlide(parseInt(e.target.getAttribute('data-idx')));});},{root:scroll,threshold:[0.6]});
858
+ container.querySelectorAll('.tk-slide').forEach(function(s){obs.observe(s);});
 
 
 
 
 
 
 
 
 
859
  setTimeout(function(){playSlide(0);},300);
860
  }
861
 
862
  /* ── Comments ── */
863
  function gc(a){try{return JSON.parse(localStorage.getItem('bdp_cmt_'+a))||[];}catch(e){return[];}}
864
  function sc(a,c){try{localStorage.setItem('bdp_cmt_'+a,JSON.stringify(c));}catch(e){}}
865
+ window.bdpRenderCmt=function(a){var l=document.getElementById('cmt-list-'+a);if(!l)return;var c=gc(a);if(!c.length){l.innerHTML='<div class="bdp-cmt-empty">Chưa có bình luận.</div>';return;}var h='';for(var i=c.length-1;i>=0;i--){var x=c[i];h+='<div class="bdp-cmt-item"><span class="bdp-cmt-author">'+x.name+'</span><span class="bdp-cmt-date">'+x.date+'</span><div class="bdp-cmt-body">'+x.text.replace(/</g,'&lt;').replace(/>/g,'&gt;')+'</div></div>';}l.innerHTML=h;};
866
+ window.bdpAddCmt=function(a){var n=document.getElementById('cmt-name-'+a),t=document.getElementById('cmt-text-'+a);if(!n||!t)return;var nm=n.value.trim(),tx=t.value.trim();if(!nm){window.bdpToast('NhαΊ­p tΓͺn');n.focus();return;}if(!tx){window.bdpToast('NhαΊ­p bΓ¬nh luαΊ­n');t.focus();return;}var c=gc(a);c.push({name:nm,text:tx,date:new Date().toLocaleString('vi-VN')});sc(a,c);t.value='';window.bdpRenderCmt(a);window.bdpToast('Đã gα»­i!');};
867
 
868
+ /* ── HLS + Video init ── */
869
  function initHlsVideo(v){
870
+ if(v._hlsInit)return;v._hlsInit=true;
871
+ var src=v.getAttribute('data-hls-src');if(!src)return;
872
  if(v.canPlayType('application/vnd.apple.mpegURL')){v.src=src;}
873
+ else if(window.Hls&&Hls.isSupported()){var h=new Hls();h.loadSource(src);h.attachMedia(v);h.on(Hls.Events.ERROR,function(e,d){if(d.fatal)v.src=src;});}
874
+ else{v.src=src;}
 
 
 
875
  }
876
 
877
  new MutationObserver(function(muts){muts.forEach(function(m){m.addedNodes.forEach(function(n){
878
+ if(!n.querySelectorAll)return;
879
+ n.querySelectorAll('img.bdp-lazy-img').forEach(function(img){if(!img._errBound){img._errBound=true;img.addEventListener('error',function(){this.style.display='none';});}});
 
 
880
  n.querySelectorAll('video[data-hls-src]').forEach(initHlsVideo);
881
  n.querySelectorAll('video.bdp-video:not([data-hls-src])').forEach(function(v){if(!v._initDone){v._initDone=true;v.load();}});
882
  n.querySelectorAll('[id^="cmt-list-"]').forEach(function(d){window.bdpRenderCmt(d.id.replace('cmt-list-',''));});
883
+ n.querySelectorAll('.tk-container .tk-scroll').forEach(function(sc){var c=sc.closest('.tk-container');if(c&&!c._tkInit){c._tkInit=true;_initTkScroll(c);}});
 
 
 
 
884
  });});}).observe(document.body,{childList:true,subtree:true});
885
 
886
  setInterval(function(){
 
889
  },1500);
890
 
891
  /* ── Hash routing ── */
892
+ var hh=window.location.hash;
893
+ if(hh&&hh.startsWith('#/')){var ps=hh.slice(2).split('/');if(ps.length>=2){var aid=ps[ps.length-1];try{var url=localStorage.getItem('bdp_url_'+aid);if(url)setTimeout(function(){window.bdpOpen(url,aid,ps.slice(0,-1).join('/'));},2500);}catch(e){}}}
894
+ }
895
  """
896
 
897
  # ══════════════════════════════════════════════════════════════════════════════
898
+ with gr.Blocks(title="Tin Tα»©c Việt Nam",css=CSS,head=HEAD_META,js=JS_CODE,theme=gr.themes.Base(),fill_width=True) as demo:
899
  gr.HTML('<div class="bdp-header"><h1>πŸ“° Tin Tα»©c Việt Nam</h1><p>VnExpress Β· BongDaPlus Β· Thời sα»± Β· ThαΊΏ giα»›i Β· Kinh doanh Β· CΓ΄ng nghệ Β· Thể thao Β· GiαΊ£i trΓ­ Β· Video</p></div>')
900
  article_url=gr.Textbox(value="",elem_id="article-url-input",elem_classes=["sr-only"],max_lines=1)
901
  with gr.Row(elem_classes=["controls-row"]):