✦ CODE SNIPPET
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html>
<html b:version='2' class='v2' expr:dir='data:blog.languageDirection' xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'>
<head>
<meta content='width=device-width, initial-scale=1' name='viewport'/>
<title><data:blog.pageTitle/></title>
<b:include data='blog' name='all-head-content'/>
<script>
//<![CDATA[
/* =====================================================================
★★★ WEBSITE CONFIGURATION — শুধু এই অংশ পরিবর্তন করলেই হবে ★★★
===================================================================== */
var VCONFIG = {
siteName : 'VIDORA', // ওয়েবসাইটের নাম
logo : '', // লোগো ইমেজের URL (ফাঁকা রাখলে নাম দেখাবে)
whatsapp : '8801927661298', // WhatsApp নম্বর (দেশের কোড সহ, + ছাড়া। যেমন 8801712345678)
bkash : '01927661298', // bKash নম্বর
nagad : '01927661298', // Nagad নম্বর
price : '৳100', // ডিফল্ট Premium ভিডিও প্রাইস (পোস্টে PRICE দিলে সেটা কাজ করবে)
/* ===== PIN আনলক সেটিং =====
প্রতিটি পোস্টে আলাদা PIN দিতে vcfg-তে লিখুন: PIN: 4821
কোনো পোস্টে PIN না দিলে নিচের masterPin চলবে (ফাঁকা রাখলে চলবে না)
PIN বানাতে যেকোনো পেজের লিংকের শেষে #pinsetup দিয়ে খুলুন (যেমন yourblog.com/#pinsetup) */
masterPin: '',
facebook : 'https://facebook.com/yourpage', // ফাঁকা রাখলে বাটন দেখাবে না
telegram : 'https://t.me/yourchannel',
youtube : 'https://youtube.com/@yourchannel',
// ওয়েবসাইটের রং
colors : {
accent : '#ff2e63', // মূল রং (বাটন, ব্যাজ)
accent2: '#ff8a00', // গ্র্যাডিয়েন্টের দ্বিতীয় রং
darkBg : '#0b0b0f', // ডার্ক মোড ব্যাকগ্রাউন্ড
darkCard: '#16161d', // ডার্ক মোড কার্ড
lightBg: '#f4f5f8', // লাইট মোড ব্যাকগ্রাউন্ড
lightCard:'#ffffff' // লাইট মোড কার্ড
},
// ক্যাটাগরি = Blogger Label. Label-এর নাম হুবহু একই হতে হবে
categories : [['Viral','🔥'],['Entertainment','🎬'],['Funny','😂'],['Music','🎵'],
['Trending','🎥'],['Emotional','❤️'],['Latest','⚡'],['Premium','🔒']],
// উপরের মেনু [নাম, লিংক]
nav : [['Home','/'],['Viral Videos','/search/label/Viral'],['Trending','/search/label/Trending'],
['Latest Videos','/search'],['Premium Videos','/search/label/Premium']],
shorts : true, // true = Shorts (৯:১৬ লম্বা) স্টাইল, false = সাধারণ ১৬:৯
/* ===== ADS (বিজ্ঞাপন) ===== */
ads : {
enabled : false, // বিজ্ঞাপন চালু করতে true করুন
adsenseClient : 'ca-pub-XXXXXXXXXXXXXXXX', // আপনার AdSense Publisher ID
// AdSense Ad Unit-এর slot ID (ফাঁকা রাখলে ঐ জায়গায় অ্যাড আসবে না)
slots : { top:'', feed:'', player:'', after:'' },
// অন্য নেটওয়ার্কের কোড (Adsterra, Monetag ইত্যাদি) বসাতে ব্যবহার করুন; এটা দিলে AdSense-এর বদলে এটা চলবে
custom : { top:'', feed:'', player:'', after:'' },
feedEvery : 6 // প্রতি কয়টি ভিডিওর পর হোমপেজে অ্যাড
},
defaultCategory : 'Viral' // পোস্টে ক্যাটাগরি না দিলে এটা দেখাবে
};
/* রং CSS-এ বসানো + সেভ করা থিম আগেই সেট (ফ্ল্যাশ এড়াতে) */
(function(){
var c = VCONFIG.colors, s = document.createElement('style');
s.textContent = ':root{--ac:'+c.accent+';--ac2:'+c.accent2+';--bg:'+c.darkBg+';--card:'+c.darkCard+'}' +
'[data-theme=light]{--bg:'+c.lightBg+';--card:'+c.lightCard+'}' +
':root{--ratio:'+(VCONFIG.shorts?'9/16':'16/9')+';--pw:'+(VCONFIG.shorts?'420px':'100%')+'}';
if (!VCONFIG.shorts) document.documentElement.className += ' wide';
document.head.appendChild(s);
var t = 'dark';
try { t = localStorage.getItem('vtheme') || 'dark'; } catch(e) {}
document.documentElement.setAttribute('data-theme', t);
})();
//]]>
</script>
<b:skin><![CDATA[
/* ===== Base ===== */
:root{--tx:#f2f3f7;--mut:#9aa0b4;--bd:rgba(255,255,255,.09);--sh:0 10px 28px rgba(0,0,0,.45)}
[data-theme=light]{--tx:#14161f;--mut:#667085;--bd:rgba(0,0,0,.09);--sh:0 10px 28px rgba(20,22,31,.13)}
*{box-sizing:border-box;margin:0;padding:0}
html{-webkit-text-size-adjust:100%}
body{background:var(--bg);color:var(--tx);font-family:'Hind Siliguri','Noto Sans Bengali',system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;line-height:1.55;transition:background .25s,color .25s}
a{color:inherit;text-decoration:none}
img{max-width:100%;display:block}
button,input,select{font:inherit;color:inherit}
#navbar,#navbar-iframe,.Navbar{display:none!important;height:0!important}
.wrap{max-width:1280px;margin:0 auto;padding:0 16px}
.mut{color:var(--mut)} .sm{font-size:.82rem}
/* ===== Header ===== */
.vhead{position:sticky;top:0;z-index:50;background:color-mix(in srgb,var(--bg) 88%,transparent);backdrop-filter:blur(14px);border-bottom:1px solid var(--bd)}
.vh{display:flex;align-items:center;gap:14px;height:62px}
.brand{font-weight:800;font-size:1.35rem;letter-spacing:.5px;display:flex;align-items:center;gap:6px;white-space:nowrap}
.brand span{color:var(--ac)} .brand img{height:34px}
#vnav{display:none;gap:4px;margin-left:8px}
#vnav a{padding:7px 12px;border-radius:99px;font-size:.92rem;color:var(--mut);transition:.2s}
#vnav a:hover,#vnav a.on{background:var(--card);color:var(--tx)}
.vsearch{margin-left:auto;display:flex;background:var(--card);border:1px solid var(--bd);border-radius:99px;overflow:hidden;min-width:0;flex:1;max-width:340px}
.vsearch input{background:none;border:0;outline:0;padding:8px 14px;min-width:0;width:100%}
.vsearch button{background:none;border:0;padding:0 14px;cursor:pointer}
#vtheme{width:40px;height:40px;border-radius:50%;border:1px solid var(--bd);background:var(--card);cursor:pointer;font-size:1.05rem;flex:none}
.chips{display:flex;gap:8px;overflow-x:auto;padding:0 0 12px;scrollbar-width:none}
.chips::-webkit-scrollbar{display:none}
.chip{flex:none;padding:6px 14px;border-radius:99px;background:var(--card);border:1px solid var(--bd);font-size:.88rem;transition:.2s}
.chip:hover,.chip.on{background:linear-gradient(135deg,var(--ac),var(--ac2));border-color:transparent;color:#fff}
@media(min-width:900px){#vnav{display:flex}}
/* ===== Sections & Grid ===== */
main{padding:22px 0 40px;min-height:60vh}
.vsec{margin-bottom:34px}
.vsec h2{font-size:1.25rem;margin-bottom:14px;font-weight:700}
.vgrid{display:grid;gap:14px;grid-template-columns:repeat(2,1fr)}
@media(min-width:640px){.vgrid{grid-template-columns:repeat(3,1fr)}}
@media(min-width:900px){.vgrid{grid-template-columns:repeat(4,1fr)}}
@media(min-width:1200px){.vgrid{grid-template-columns:repeat(5,1fr)}}
.wide .vgrid{grid-template-columns:1fr}
@media(min-width:560px){.wide .vgrid{grid-template-columns:repeat(2,1fr)}}
@media(min-width:900px){.wide .vgrid{grid-template-columns:repeat(3,1fr)}}
@media(min-width:1200px){.wide .vgrid{grid-template-columns:repeat(4,1fr)}}
.vraw{display:block}
.vempty{padding:40px 0;text-align:center;color:var(--mut)}
/* ===== Video Card ===== */
.vc{display:block;transition:transform .25s}
.vc:hover{transform:translateY(-4px)}
.vth{position:relative;aspect-ratio:var(--ratio);border-radius:14px;overflow:hidden;background:linear-gradient(135deg,#23232e,#12121a);box-shadow:var(--sh)}
.vth img{width:100%;height:100%;object-fit:cover;transition:transform .4s}
.vc:hover .vth img{transform:scale(1.06)}
.vplay{position:absolute;left:50%;top:50%;width:58px;height:58px;margin:-29px 0 0 -29px;border-radius:50%;background:rgba(0,0,0,.55);backdrop-filter:blur(4px);border:2px solid rgba(255,255,255,.85);display:flex;align-items:center;justify-content:center;color:#fff;font-size:1.3rem;padding-left:4px;transition:.25s}
.vplay::after{content:'';position:absolute;inset:-2px;border-radius:50%;border:2px solid var(--ac);opacity:0;animation:ring 2s infinite}
.vc:hover .vplay{background:var(--ac);transform:scale(1.12)}
@keyframes ring{0%{transform:scale(1);opacity:.7}100%{transform:scale(1.6);opacity:0}}
.vbadge{position:absolute;top:10px;left:10px;font-size:.72rem;font-weight:700;padding:3px 10px;border-radius:99px;color:#fff;letter-spacing:.4px}
.vbadge.free{background:#16a34a}
.vbadge.lock{background:linear-gradient(135deg,#f59e0b,#ef4444)}
.vbadge.lock i{display:inline-block;font-style:normal;animation:shake 2.4s infinite}
@keyframes shake{0%,80%,100%{transform:rotate(0)}85%{transform:rotate(-14deg)}90%{transform:rotate(12deg)}95%{transform:rotate(-8deg)}}
.vcap{position:absolute;left:0;right:0;bottom:0;padding:38px 10px 10px;background:linear-gradient(transparent,rgba(0,0,0,.88));color:#fff}
.vcap h3{font-size:.9rem;font-weight:600;line-height:1.3;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.vcap .vm{color:rgba(255,255,255,.8);font-size:.72rem;margin-top:3px}
.vth{display:block}
.vinfo h3{font-size:1rem;font-weight:600;line-height:1.35;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.vm{margin-top:4px;font-size:.8rem;color:var(--mut);display:flex;flex-wrap:wrap;gap:4px 10px}
/* ===== Pager ===== */
.vpager{display:flex;justify-content:space-between;gap:10px;margin-top:10px}
.vpager a{padding:10px 20px;border-radius:99px;background:var(--card);border:1px solid var(--bd)}
.vpager a:hover{background:var(--ac);color:#fff;border-color:transparent}
/* ===== Video Page ===== */
.vpost{max-width:980px;margin:0 auto}
.vtitle{font-size:1.5rem;line-height:1.35;margin:4px 0 14px}
#vplayer{max-width:var(--pw);margin:0 auto}
.vstage{position:relative;aspect-ratio:var(--ratio);background:#000;border-radius:16px;overflow:hidden;box-shadow:var(--sh)}
.vstage>img{width:100%;height:100%;object-fit:cover}
.vstage iframe{position:absolute;inset:0;width:100%;height:100%;border:0}
.vbig{position:absolute;left:50%;top:50%;width:84px;height:84px;margin:-42px 0 0 -42px;border-radius:50%;border:0;cursor:pointer;background:linear-gradient(135deg,var(--ac),var(--ac2));color:#fff;font-size:2rem;padding-left:6px;box-shadow:0 0 0 0 var(--ac);animation:pulse 2s infinite}
@keyframes pulse{0%{box-shadow:0 0 0 0 rgba(255,46,99,.55)}100%{box-shadow:0 0 0 26px rgba(255,46,99,0)}}
.vspin{position:absolute;left:50%;top:50%;width:42px;height:42px;margin:-21px 0 0 -21px;border:4px solid rgba(255,255,255,.25);border-top-color:var(--ac);border-radius:50%;animation:spin .8s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.vlock{position:absolute;inset:0;background:rgba(8,8,12,.78);backdrop-filter:blur(7px);display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:6px;padding:16px;color:#fff;overflow-y:auto}
.vlock .ic{font-size:3rem;animation:shake 2.4s infinite}
.vlock b{font-size:1.2rem;letter-spacing:1.5px}
.vlock p{opacity:.85;margin-bottom:8px}
.vbtn{border:0;cursor:pointer;padding:11px 24px;border-radius:99px;font-weight:700;color:#fff;background:linear-gradient(135deg,var(--ac),var(--ac2));transition:.2s}
.vbtn:hover{transform:translateY(-2px);filter:brightness(1.1)}
.vbtn.wa{background:#25d366;width:100%;margin-top:6px}
.vlink{background:none;border:0;color:#fff;opacity:.8;text-decoration:underline;cursor:pointer;font-size:.85rem;margin-top:6px}
/* PIN বক্স (লক স্ক্রিনে) */
.vpinbox{width:100%;max-width:300px;margin-top:12px;padding-top:12px;border-top:1px solid rgba(255,255,255,.2)}
.vpinbox small{display:block;opacity:.85;margin-bottom:8px;font-size:.82rem}
.vpinrow{display:flex;gap:6px}
.vpinrow input{flex:1;min-width:0;padding:10px 12px;border-radius:99px;border:1px solid rgba(255,255,255,.3);background:rgba(255,255,255,.12);color:#fff;outline:0;text-align:center;letter-spacing:4px;font-weight:700}
.vpinrow input:focus{border-color:var(--ac)}
.vpinrow input::placeholder{letter-spacing:0;font-weight:400;color:rgba(255,255,255,.6)}
.vpinrow .vbtn{padding:10px 18px}
.vpinrow.bad input{border-color:#ef4444;animation:nope .35s}
@keyframes nope{0%,100%{transform:translateX(0)}25%{transform:translateX(-6px)}75%{transform:translateX(6px)}}
.vout{margin-top:10px;padding:10px 12px;border-radius:10px;background:var(--bg);border:1px dashed var(--bd);word-break:break-all;font-weight:700}
.vtools{display:flex;flex-wrap:wrap;gap:8px;margin:12px 0}
.vtools button,.vtools a{padding:7px 14px;border-radius:99px;background:var(--card);border:1px solid var(--bd);cursor:pointer;font-size:.86rem}
.vtools button:hover,.vtools a:hover{border-color:var(--ac)}
.vmeta{display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px;color:var(--mut);font-size:.9rem;margin-bottom:14px}
.pill{padding:3px 12px;border-radius:99px;font-size:.78rem;font-weight:700;color:#fff}
.pill.free{background:#16a34a} .pill.lock{background:linear-gradient(135deg,#f59e0b,#ef4444)}
.vdesc{background:var(--card);border:1px solid var(--bd);border-radius:14px;padding:16px;overflow-wrap:anywhere}
.vdesc:empty{display:none}
.vdesc img{border-radius:10px;margin:8px 0}
.vshare{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:16px 0}
.vshare a,.vshare button{padding:8px 16px;border-radius:99px;border:0;cursor:pointer;color:#fff;font-size:.86rem;font-weight:600}
.vshare .fb{background:#1877f2}.vshare .wa{background:#25d366}.vshare .tg{background:#229ed9}.vshare .x{background:#000;border:1px solid #444}.vshare .cp{background:var(--card);color:var(--tx);border:1px solid var(--bd)}
.vrel{margin-top:30px}
/* ===== Payment Modal ===== */
.vmodal{position:fixed;inset:0;z-index:100;background:rgba(0,0,0,.72);display:flex;align-items:center;justify-content:center;padding:16px;overflow-y:auto}
.vbox{position:relative;width:100%;max-width:420px;background:var(--card);border:1px solid var(--bd);border-radius:18px;padding:22px;box-shadow:var(--sh);animation:pop .25s}
@keyframes pop{from{transform:scale(.92);opacity:0}to{transform:none;opacity:1}}
.vbox h3{margin-bottom:2px}
.vx{position:absolute;right:12px;top:12px;width:32px;height:32px;border-radius:50%;border:0;background:var(--bg);cursor:pointer}
.vnum{display:flex;align-items:center;gap:8px;margin-top:10px;padding:10px 12px;border-radius:12px;background:var(--bg);border:1px dashed var(--bd)}
.vnum span{flex:1;font-weight:700;letter-spacing:.5px}
.vnum button{border:0;background:var(--ac);color:#fff;border-radius:8px;padding:4px 10px;cursor:pointer;font-size:.8rem}
.vprice{margin:12px 0 4px;font-size:1.1rem}
.vbox label{display:block;margin-top:10px;font-size:.82rem;color:var(--mut)}
.vbox input,.vbox select{width:100%;margin-top:4px;padding:10px 12px;border-radius:10px;border:1px solid var(--bd);background:var(--bg);outline:0}
.vbox input:focus,.vbox select:focus{border-color:var(--ac)}
/* ===== Footer & Toast ===== */
.vad{margin:18px 0;text-align:center;overflow:hidden}
.vad small{display:block;color:var(--mut);font-size:.68rem;margin-bottom:4px}
.vad.feed{grid-column:1/-1;margin:4px 0}
.vfoot{border-top:1px solid var(--bd);padding:22px 0 30px;text-align:center;color:var(--mut);font-size:.88rem}
.vfoot .soc{display:flex;justify-content:center;gap:10px;margin-bottom:10px;flex-wrap:wrap}
.vfoot .soc a{padding:6px 14px;border-radius:99px;background:var(--card);border:1px solid var(--bd);color:var(--tx)}
.vtoast{position:fixed;left:50%;bottom:26px;transform:translateX(-50%);background:#111;color:#fff;padding:10px 20px;border-radius:99px;z-index:200;font-size:.9rem;box-shadow:var(--sh)}
]]></b:skin>
</head>
<body expr:data-label='data:blog.searchLabel' expr:data-pt='data:blog.pageType' expr:data-q='data:blog.searchQuery'>
<header class='vhead'>
<div class='wrap vh'>
<a class='brand' expr:href='data:blog.homepageUrl' id='brand'><data:blog.title/></a>
<nav id='vnav'/>
<form action='/search' class='vsearch' method='get'>
<input name='q' placeholder='ভিডিও খুঁজুন...' required='required' type='search'/>
<button aria-label='Search' type='submit'>🔍</button>
</form>
<button aria-label='Dark/Light' id='vtheme' type='button'>☀️</button>
</div>
<div class='wrap'><div class='chips' id='vchips'/></div>
</header>
<main>
<div class='wrap'>
<b:section class='main' id='main' showaddelement='yes'>
<b:widget id='Blog1' locked='true' title='Blog Posts' type='Blog' version='2' visible='true'>
<b:widget-settings>
<b:widget-setting name='showDateHeader'>false</b:widget-setting>
<b:widget-setting name='style.textcolor'>#ffffff</b:widget-setting>
<b:widget-setting name='showShareButtons'>true</b:widget-setting>
<b:widget-setting name='showCommentLink'>true</b:widget-setting>
<b:widget-setting name='style.urlcolor'>#ffffff</b:widget-setting>
<b:widget-setting name='showAuthor'>false</b:widget-setting>
<b:widget-setting name='style.linkcolor'>#ffffff</b:widget-setting>
<b:widget-setting name='style.unittype'>TextAndImage</b:widget-setting>
<b:widget-setting name='style.bgcolor'>#ffffff</b:widget-setting>
<b:widget-setting name='timestampLabel'/>
<b:widget-setting name='reactionsLabel'/>
<b:widget-setting name='showAuthorProfile'>false</b:widget-setting>
<b:widget-setting name='style.layout'>1x1</b:widget-setting>
<b:widget-setting name='showLabels'>true</b:widget-setting>
<b:widget-setting name='showLocation'>true</b:widget-setting>
<b:widget-setting name='postLabelsLabel'/>
<b:widget-setting name='showTimestamp'>true</b:widget-setting>
<b:widget-setting name='postsPerAd'>3</b:widget-setting>
<b:widget-setting name='showBacklinks'>false</b:widget-setting>
<b:widget-setting name='style.bordercolor'>#ffffff</b:widget-setting>
<b:widget-setting name='showInlineAds'>true</b:widget-setting>
<b:widget-setting name='showReactions'>false</b:widget-setting>
</b:widget-settings>
<b:includable id='main' var='top'>
<b:if cond='data:blog.pageType == "item"'>
<!-- ===== ভিডিও ডিটেইলস পেজ ===== -->
<b:loop values='data:posts' var='post'>
<article class='vpost' expr:data-date='data:post.date' expr:data-id='data:post.id' expr:data-title='data:post.title'>
<h1 class='vtitle'><data:post.title/></h1>
<div id='vplayer'/>
<div class='vmeta' id='vmeta'/>
<span class='vlabels' style='display:none'><b:loop values='data:post.labels' var='label'><i><data:label.name/></i></b:loop></span>
<div class='vdesc' id='vdesc'><data:post.body/></div>
<div class='vshare' id='vshare'/>
<section class='vrel' id='vrel'/>
</article>
</b:loop>
<b:elseif cond='data:blog.pageType == "static_page"'/>
<b:loop values='data:posts' var='post'>
<article class='vpost'>
<h1 class='vtitle'><data:post.title/></h1>
<div class='vdesc' style='display:block'><data:post.body/></div>
</article>
</b:loop>
<b:else/>
<!-- ===== হোমপেজ / লেবেল / সার্চ ===== -->
<section class='vsec'>
<h2 id='vh2'>🆕 Latest Videos</h2>
<div class='vgrid' id='vmain'>
<b:loop values='data:posts' var='post'>
<article class='vraw' expr:data-date='data:post.date' expr:data-title='data:post.title' expr:data-url='data:post.url'>
<a class='vc' expr:href='data:post.url'>
<div class='vth'>
<b:if cond='data:post.firstImageUrl'><img expr:src='data:post.firstImageUrl' loading='lazy'/></b:if>
<span class='vplay'>▶</span>
<div class='vcap'><h3><data:post.title/></h3><div class='vm'><span><data:post.date/></span></div></div>
</div>
</a>
<span class='vlabels' style='display:none'><b:loop values='data:post.labels' var='label'><i><data:label.name/></i></b:loop></span>
<template><data:post.body/></template>
</article>
</b:loop>
</div>
<div class='vpager'>
<span><b:if cond='data:newerPageUrl'><a expr:href='data:newerPageUrl'>← নতুন ভিডিও</a></b:if></span>
<span><b:if cond='data:olderPageUrl'><a expr:href='data:olderPageUrl'>আরও ভিডিও →</a></b:if></span>
</div>
</section>
<section class='vsec' id='sec-trending' style='display:none'><h2>🔥 Trending Videos</h2><div class='vgrid'/></section>
<section class='vsec' id='sec-most' style='display:none'><h2>🔥 Most Viewed</h2><div class='vgrid'/></section>
</b:if>
</b:includable>
<b:includable id='aboutPostAuthor'>
<div class='author-name'>
<a class='g-profile' expr:href='data:post.author.profileUrl' rel='author' title='author profile'>
<span>
<data:post.author.name/>
</span>
</a>
</div>
<div>
<span class='author-desc'>
<data:post.author.aboutMe/>
</span>
</div>
</b:includable>
<b:includable id='addComments'>
<a expr:href='data:post.commentsUrl' expr:onclick='data:post.commentsUrlOnclick'>
<b:message name='messages.postAComment'/>
</a>
</b:includable>
<b:includable id='commentAuthorAvatar'>
<div class='avatar-image-container'>
<img class='author-avatar' expr:src='data:comment.authorAvatarSrc' height='35' width='35'/>
</div>
</b:includable>
<b:includable id='commentDeleteIcon' var='comment'>
<span expr:class='"item-control " + data:comment.adminClass'>
<b:if cond='data:showCmtPopup'>
<div class='goog-toggle-button'>
<div class='goog-inline-block comment-action-icon'/>
</div>
<b:else/>
<a class='comment-delete' expr:href='data:comment.deleteUrl' expr:title='data:messages.deleteComment'>
<img src='https://resources.blogblog.com/img/icon_delete13.gif'/>
</a>
</b:if>
</span>
</b:includable>
<b:includable id='commentForm' var='post'>
<div class='comment-form'>
<a name='comment-form'/>
<h4 id='comment-post-message'><data:messages.postAComment/></h4>
<b:if cond='data:this.messages.blogComment != ""'>
<p><data:this.messages.blogComment/></p>
</b:if>
<b:include data='post' name='commentFormIframeSrc'/>
<iframe allowtransparency='allowtransparency' class='blogger-iframe-colorize blogger-comment-from-post' expr:height='data:cmtIframeInitialHeight ?: "90px"' frameborder='0' id='comment-editor' name='comment-editor' src='' width='100%'/>
<data:post.cmtfpIframe/>
<script type='text/javascript'>
BLOG_CMT_createIframe('<data:post.appRpcRelayPath/>');
</script>
</div>
</b:includable>
<b:includable id='commentFormIframeSrc' var='post'>
<a expr:href='data:post.commentFormIframeSrc' id='comment-editor-src'/>
</b:includable>
<b:includable id='commentItem' var='comment'>
<div class='comment' expr:id='"c" + data:comment.id'>
<b:include cond='data:blog.enabledCommentProfileImages' name='commentAuthorAvatar'/>
<div class='comment-block'>
<div class='comment-author'>
<b:if cond='data:comment.authorUrl'>
<b:message name='messages.authorSaidWithLink'>
<b:param expr:value='data:comment.author' name='authorName'/>
<b:param expr:value='data:comment.authorUrl' name='authorUrl'/>
</b:message>
<b:else/>
<b:message name='messages.authorSaid'>
<b:param expr:value='data:comment.author' name='authorName'/>
</b:message>
</b:if>
</div>
<div expr:class='"comment-body" + (data:comment.isDeleted ? " deleted" : "")'>
<data:comment.body/>
</div>
<div class='comment-footer'>
<span class='comment-timestamp'>
<a expr:href='data:comment.url' title='comment permalink'>
<data:comment.timestamp/>
</a>
<b:include data='comment' name='commentDeleteIcon'/>
</span>
</div>
</div>
</div>
</b:includable>
<b:includable id='commentList' var='comments'>
<div id='comments-block'>
<b:loop values='data:comments' var='comment'>
<b:include data='comment' name='commentItem'/>
</b:loop>
</div>
</b:includable>
<b:includable id='commentPicker' var='post'>
<b:if cond='data:post.showThreadedComments'>
<b:include data='post' name='threadedComments'/>
<b:else/>
<b:include data='post' name='comments'/>
</b:if>
</b:includable>
<b:includable id='comments' var='post'>
<section expr:class='"comments" + (data:post.embedCommentForm ? " embed" : "")' expr:data-num-comments='data:post.numberOfComments' id='comments'>
<a name='comments'/>
<b:if cond='data:post.allowComments'>
<b:include name='commentsTitle'/>
<div expr:id='data:widget.instanceId + "_comments-block-wrapper"'>
<b:include cond='data:post.comments' data='post.comments' name='commentList'/>
</div>
<b:if cond='data:post.commentPagingRequired'>
<div class='paging-control-container'>
<b:if cond='data:post.hasOlderLinks'>
<a expr:class='data:post.oldLinkClass' expr:href='data:post.oldestLinkUrl'>
<data:messages.oldest/>
</a>
<a expr:class='data:post.oldLinkClass' expr:href='data:post.olderLinkUrl'>
<data:messages.older/>
</a>
</b:if>
<span class='comment-range-text'>
<data:post.commentRangeText/>
</span>
<b:if cond='data:post.hasNewerLinks'>
<a expr:class='data:post.newLinkClass' expr:href='data:post.newerLinkUrl'>
<data:messages.newer/>
</a>
<a expr:class='data:post.newLinkClass' expr:href='data:post.newestLinkUrl'>
<data:messages.newest/>
</a>
</b:if>
</div>
</b:if>
<div class='footer'>
<b:if cond='data:post.embedCommentForm'>
<b:if cond='data:post.allowNewComments'>
<b:include data='post' name='commentForm'/>
<b:else/>
<data:post.noNewCommentsText/>
</b:if>
<b:else/>
<b:if cond='data:post.allowComments'>
<b:include data='post' name='addComments'/>
</b:if>
</b:if>
</div>
</b:if>
<b:if cond='data:showCmtPopup'>
<div id='comment-popup'>
<iframe allowtransparency='allowtransparency' frameborder='0' id='comment-actions' name='comment-actions' scrolling='no'>
</iframe>
</div>
</b:if>
</section>
</b:includable>
<b:includable id='commentsTitle'>
<h3 class='title'><data:messages.comments/></h3>
</b:includable>
<b:includable id='feedLinks'>
<b:if cond='!data:view.isPost'> <!-- Blog feed links -->
<b:if cond='data:feedLinks'>
<div class='blog-feeds'>
<b:include data='feedLinks' name='feedLinksBody'/>
</div>
</b:if>
<b:else/> <!--Post feed links -->
<div class='post-feeds'>
<b:loop values='data:posts' var='post'>
<b:if cond='data:post.allowComments and data:post.feedLinks'>
<b:include data='post.feedLinks' name='feedLinksBody'/>
</b:if>
</b:loop>
</div>
</b:if>
</b:includable>
<b:includable id='feedLinksBody' var='links'>
<div class='feed-links'>
<data:messages.subscribeTo/>
<b:loop values='data:links' var='f'>
<a class='feed-link' expr:href='data:f.url' expr:type='data:f.mimeType' target='_blank'><data:f.name/> (<data:f.feedType/>)</a>
</b:loop>
</div>
</b:includable>
<b:includable id='homePageLink'>
<a class='home-link' expr:href='data:blog.homepageUrl'>
<data:messages.home/>
</a>
</b:includable>
<b:includable id='iframeComments' var='post'>
<!-- G+ comments, no longer available. The includable is retained for backwards-compatibility. -->
</b:includable>
<b:includable id='inlineAd' var='post'>
<b:if cond='!data:view.isPreview'>
<b:if cond='data:this.adCode or data:this.adClientId or data:blog.adsenseClientId'>
<!-- Ad -->
<div class='inline-ad'>
<b:if cond='data:this.adCode != ""'>
<data:this.adCode/>
<b:else/>
<b:include cond='data:this.adClientId or data:blog.adsenseClientId' name='defaultAdUnit'/>
</b:if>
</div>
</b:if>
<b:else/>
<div class='inline-ad'>
<div class='inline-ad-placeholder'>
<span><b:message name='messages.adsGoHere'/></span>
</div>
</div>
</b:if>
</b:includable>
<b:includable id='nextPageLink'>
<a class='blog-pager-older-link' expr:href='data:olderPageUrl' expr:id='data:widget.instanceId + "_blog-pager-older-link"' expr:title='data:messages.olderPosts'>
<data:messages.olderPosts/>
</a>
</b:includable>
<b:includable id='post' var='post'>
<div class='post'>
<b:include data='post' name='postMeta'/>
<b:include data='post' name='postTitle'/>
<b:include name='headerByline'/>
<b:if cond='data:view.isSingleItem'>
<b:include data='post' name='postBody'/>
<b:else/>
<b:include data='post' name='postBodySnippet'/>
<b:include data='post' name='postJumpLink'/>
</b:if>
<b:include data='post' name='postFooter'/>
</div>
</b:includable>
<b:includable id='postBody' var='post'>
<!-- If metaDescription is empty, use the post body as the schema.org description too, for G+/FB snippeting. -->
<div class='post-body entry-content float-container' expr:id='"post-body-" + data:post.id'>
<data:post.body/>
</div>
</b:includable>
<b:includable id='postBodySnippet' var='post'>
<b:include data='post' name='postBody'/>
</b:includable>
<b:includable id='postCommentsAndAd' var='post'>
<article class='post-outer-container'>
<!-- Post title and body -->
<div class='post-outer'>
<b:include data='post' name='post'/>
</div>
<!-- Comments -->
<b:include cond='data:view.isSingleItem' data='post' name='commentPicker'/>
<!-- Show ad inside post container, after comments, if single item. -->
<b:include cond='data:view.isSingleItem and data:post.includeAd' data='post' name='inlineAd'/>
</article>
<!-- Show ad outside post container (between posts) for feed pages. -->
<b:include cond='data:view.isMultipleItems and data:post.includeAd' data='post' name='inlineAd'/>
</b:includable>
<b:includable id='postCommentsLink'>
<b:if cond='data:view.isMultipleItems'>
<span class='byline post-comment-link container'>
<b:include cond='data:post.commentSource != 1' name='commentsLink'/>
</span>
</b:if>
</b:includable>
<b:includable id='postFooter' var='post'>
<div class='post-footer'>
<b:include name='footerBylines'/>
<b:include data='post' name='postFooterAuthorProfile'/>
</div>
</b:includable>
<b:includable id='postFooterAuthorProfile' var='post'>
<b:if cond='data:post.author.aboutMe and data:view.isPost'>
<div class='author-profile'>
<b:if cond='data:post.author.authorPhoto.url'>
<img class='author-image' expr:src='data:post.author.authorPhoto.url' width='50px'/>
<div class='author-about'>
<b:include data='post' name='aboutPostAuthor'/>
</div>
<b:else/>
<b:include data='post' name='aboutPostAuthor'/>
</b:if>
</div>
</b:if>
</b:includable>
<b:includable id='postHeader' var='post'>
<b:include name='headerByline'/>
</b:includable>
<b:includable id='postMeta' var='post'>
<b:include data='post' name='postMetadataJSON'/>
</b:includable>
<b:includable id='postPagination'>
<div class='blog-pager container' id='blog-pager'>
<b:include cond='data:newerPageUrl' name='previousPageLink'/>
<b:include cond='data:olderPageUrl' name='nextPageLink'/>
<b:include cond='data:view.url != data:blog.homepageUrl' name='homePageLink'/>
</div>
</b:includable>
<b:includable id='postTitle' var='post'>
<a expr:name='data:post.id'/>
<b:if cond='data:post.title != ""'>
<h3 class='post-title entry-title'>
<b:if cond='data:post.link or (data:post.url and data:view.url != data:post.url)'>
<a expr:href='data:post.link ?: data:post.url'><data:post.title/></a>
<b:else/>
<data:post.title/>
</b:if>
</h3>
</b:if>
</b:includable>
<b:includable id='previousPageLink'>
<a class='blog-pager-newer-link' expr:href='data:newerPageUrl' expr:id='data:widget.instanceId + "_blog-pager-newer-link"' expr:title='data:messages.newerPosts'>
<data:messages.newerPosts/>
</a>
</b:includable>
<b:includable id='threadedCommentForm' var='post'>
<div class='comment-form'>
<a name='comment-form'/>
<h4 id='comment-post-message'><data:messages.postAComment/></h4>
<b:if cond='data:this.messages.blogComment != ""'>
<p><data:this.messages.blogComment/></p>
</b:if>
<b:include data='post' name='commentFormIframeSrc'/>
<iframe allowtransparency='allowtransparency' class='blogger-iframe-colorize blogger-comment-from-post' expr:height='data:cmtIframeInitialHeight ?: "90px"' frameborder='0' id='comment-editor' name='comment-editor' src='' width='100%'/>
<data:post.cmtfpIframe/>
<script type='text/javascript'>
BLOG_CMT_createIframe('<data:post.appRpcRelayPath/>');
</script>
</div>
</b:includable>
<b:includable id='threadedCommentJs' var='post'>
<script async='async' expr:src='data:post.commentSrc' type='text/javascript'/>
<b:template-script inline='true' name='threaded_comments'/>
<script type='text/javascript'>
blogger.widgets.blog.initThreadedComments(
<data:post.commentJso/>,
<data:post.commentMsgs/>,
<data:post.commentConfig/>);
</script>
</b:includable>
<b:includable id='threadedComments' var='post'>
<section class='comments threaded' expr:data-embed='data:post.embedCommentForm' expr:data-num-comments='data:post.numberOfComments' id='comments'>
<a name='comments'/>
<b:include name='commentsTitle'/>
<div class='comments-content'>
<b:if cond='data:post.embedCommentForm'>
<b:include data='post' name='threadedCommentJs'/>
</b:if>
<div id='comment-holder'>
<data:post.commentHtml/>
</div>
</div>
<p class='comment-footer'>
<b:if cond='data:post.allowNewComments'>
<b:include data='post' name='threadedCommentForm'/>
<b:else/>
<data:post.noNewCommentsText/>
</b:if>
<b:if cond='data:post.showManageComments'>
<b:include data='post' name='manageComments'/>
</b:if>
</p>
<b:if cond='data:showCmtPopup'>
<div id='comment-popup'>
<iframe allowtransparency='allowtransparency' frameborder='0' id='comment-actions' name='comment-actions' scrolling='no'>
</iframe>
</div>
</b:if>
</section>
</b:includable>
<b:includable id='tooltipCss'>
<!-- LINT.IfChange -->
<style>
.post-body a.b-tooltip-container {
position: relative;
display: inline-block;
}
.post-body a.b-tooltip-container .b-tooltip {
display: block !important;
position: absolute;
top: 100%;
left: 50%;
transform: translate(-20%, 1px);
visibility: hidden;
opacity: 0;
z-index: 1;
transition: opacity 0.2s ease-in-out;
}
.post-body a.b-tooltip-container .b-tooltip iframe {
width: 200px;
height: 198px;
max-width: none;
border: none;
border-radius: 20px;
box-shadow: 1px 1px 3px 1px rgba(0, 0, 0, 0.2);
}
@media (hover: hover) {
.post-body a.b-tooltip-container:hover .b-tooltip {
visibility: visible;
opacity: 1;
}
}
</style>
<!-- LINT.ThenChange(//depot/google3/java/com/google/blogger/b2/layouts/widgets/v2-style.css) -->
</b:includable>
</b:widget>
</b:section>
</div>
</main>
<!-- ===== AD GADGETS: Layout থেকে এডিট করা যাবে (Layout → Ad: ... গ্যাজেটে ক্লিক → কোড পেস্ট) ===== -->
<b:section class='adpool' id='adpool' showaddelement='no'>
<b:widget id='HTML1' locked='false' title='Ad: Top (সব পেজের উপরে)' type='HTML' version='2' visible='true'>
<b:widget-settings>
<b:widget-setting name='content'/>
</b:widget-settings>
<b:includable id='main'><template class='vadtpl' data-pos='top'><data:content/></template></b:includable>
</b:widget>
<b:widget id='HTML2' locked='false' title='Ad: Feed (হোমপেজে ভিডিওর মাঝে)' type='HTML' version='2' visible='true'>
<b:widget-settings>
<b:widget-setting name='content'/>
</b:widget-settings>
<b:includable id='main'><template class='vadtpl' data-pos='feed'><data:content/></template></b:includable>
</b:widget>
<b:widget id='HTML3' locked='false' title='Ad: Player (প্লেয়ারের নিচে)' type='HTML' version='2' visible='true'>
<b:widget-settings>
<b:widget-setting name='content'/>
</b:widget-settings>
<b:includable id='main'><template class='vadtpl' data-pos='player'><data:content/></template></b:includable>
</b:widget>
<b:widget id='HTML4' locked='false' title='Ad: After (বর্ণনার নিচে)' type='HTML' version='2' visible='true'>
<b:widget-settings>
<b:widget-setting name='content'/>
</b:widget-settings>
<b:includable id='main'><template class='vadtpl' data-pos='after'><data:content/></template></b:includable>
</b:widget>
</b:section>
<footer class='vfoot'><div class='wrap' id='vfoot'/></footer>
<script>
//<![CDATA[
(function(){
'use strict';
var C = window.VCONFIG, D = document, B = D.body, S = !!C.shorts;
var PT = B.getAttribute('data-pt'), LBL = B.getAttribute('data-label') || '', Q = B.getAttribute('data-q') || '';
var $ = function(s, r){ return (r || D).querySelector(s); };
var $$ = function(s, r){ return Array.prototype.slice.call((r || D).querySelectorAll(s)); };
var esc = function(s){ return String(s == null ? '' : s).replace(/[&<>"']/g, function(c){ return {'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]; }); };
/* ---------- Helpers ---------- */
function toast(m){ var t = D.createElement('div'); t.className = 'vtoast'; t.textContent = m; B.appendChild(t); setTimeout(function(){ t.remove(); }, 2600); }
function copy(txt){
if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(txt).then(function(){ toast('কপি হয়েছে ✓'); }, function(){ toast('কপি করা যায়নি'); }); return; }
var i = D.createElement('textarea'); i.value = txt; B.appendChild(i); i.select();
try { D.execCommand('copy'); toast('কপি হয়েছে ✓'); } catch(e) {} i.remove();
}
function toNum(s){ if(!s) return 0; var m = String(s).replace(/,/g,'').match(/([\d.]+)\s*([kKmM]?)/); if(!m) return 0; var n = parseFloat(m[1]); if(/k/i.test(m[2])) n *= 1e3; if(/m/i.test(m[2])) n *= 1e6; return n; }
function fmt(n){ return n >= 1e6 ? (n/1e6).toFixed(1).replace('.0','')+'M' : n >= 1e3 ? (n/1e3).toFixed(1).replace('.0','')+'K' : String(n); }
function thumb(u, w, h){
if(!u) return '';
return u.replace(/\/(?:s\d+|w\d+-h\d+)(?:-[a-z]+)*\//, '/w'+w+'-h'+h+'-c/').replace(/=(?:s|w)\d+[^?&"']*$/, '=w'+w+'-h'+h+'-c');
}
var CFG_KEYS = /^\s*(VIDEO\s*URL|VIDEO\s*STATUS|STATUS|VIDEO\s*CATEGORY|CATEGORY|PRICE|VIEWS|PIN)\s*:/i;
/* পোস্টের লেখা থেকে VIDEO URL / STATUS / CATEGORY / PRICE / VIEWS / PIN পড়া */
function parseCfg(html){
var t = html.replace(/<br\s*\/?>|<\/(div|p|li)>/gi, '\n').replace(/<[^>]+>/g, '').replace(/ /g,' ').replace(/&/g,'&');
var o = {}, m, re = /^\s*(VIDEO\s*URL|VIDEO\s*STATUS|STATUS|VIDEO\s*CATEGORY|CATEGORY|PRICE|VIEWS|PIN)\s*:[ \t]*\n?\s*(.+?)\s*$/gim;
while ((m = re.exec(t))) o[m[1].toUpperCase().replace(/\s+/g,' ')] = m[2];
var st = (o['VIDEO STATUS'] || o['STATUS'] || '').toUpperCase();
return { url: o['VIDEO URL'] || '', status: /LOCK|PREMIUM/.test(st) ? 'LOCKED' : 'FREE',
cat: o['VIDEO CATEGORY'] || o['CATEGORY'] || '', price: o['PRICE'] || '', views: o['VIEWS'] || '', pin: o['PIN'] || '' };
}
function build(html, o){
var c = parseCfg(html), m = html.match(/<img[^>]+src=["']([^"']+)/i), L = o.labels || [];
var skip = ['Premium','Trending','Latest'];
var cat = c.cat || L.filter(function(l){ return skip.indexOf(l) < 0; })[0] || L[0] || C.defaultCategory;
return { title:o.title || 'ভিডিও', url:o.url, date:o.date, labels:L, img: m ? m[1] : (o.img || ''), cat:cat,
status:c.status, price:c.price || C.price, views:toNum(c.views), drive:c.url, pin:c.pin };
}
function fromRaw(el){
var tpl = $('template', el), html = tpl ? tpl.innerHTML : '';
var labels = $$('.vlabels i', el).map(function(i){ return i.textContent; });
return build(html, { title: el.getAttribute('data-title'), url: el.getAttribute('data-url'), date: el.getAttribute('data-date'), labels: labels });
}
function fromEntry(e){
var link = (e.link || []).filter(function(l){ return l.rel === 'alternate'; })[0];
var html = (e.content || e.summary || {}).$t || '';
var d = new Date(e.published.$t);
return build(html, { title: e.title.$t, url: link ? link.href : '#', date: d.toLocaleDateString('bn-BD', {day:'numeric', month:'short', year:'numeric'}),
labels: (e.category || []).map(function(c){ return c.term; }), img: e.media$thumbnail ? e.media$thumbnail.url : '' });
}
var feedP;
function feed(){
return feedP || (feedP = fetch('/feeds/posts/default?alt=json&max-results=150').then(function(r){ return r.json(); })
.then(function(j){ return (j.feed.entry || []).map(fromEntry); }).catch(function(){ return []; }));
}
/* ---------- Video Card ---------- */
function card(p){
var lock = p.status === 'LOCKED', img = thumb(p.img, S ? 360 : 640, S ? 640 : 360);
return '<a class="vc" href="'+esc(p.url)+(lock ? '' : '#play')+'">' +
'<div class="vth">' + (img ? '<img loading="lazy" decoding="async" src="'+esc(img)+'" alt="'+esc(p.title)+'">' : '') +
'<span class="vplay">▶</span>' +
(lock ? '<span class="vbadge lock"><i>🔒</i> PREMIUM</span>' : '<span class="vbadge free">FREE</span>') +
'<div class="vcap"><h3>'+esc(p.title)+'</h3><div class="vm"><span>'+esc(p.cat)+'</span>' +
(p.views ? '<span>👁 '+fmt(p.views)+'</span>' : '') + '<span>'+esc(p.date)+'</span></div></div></div></a>';
}
function fill(id, list){
var s = $('#'+id); if(!s) return;
if(!list.length){ return; }
$('.vgrid', s).innerHTML = list.map(card).join(''); s.style.display = '';
}
/* ---------- Ads ---------- */
var adsLoaded = false;
function loadAdsense(){
if (adsLoaded) return; adsLoaded = true;
var s = D.createElement('script'); s.async = true; s.crossOrigin = 'anonymous';
s.src = 'https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=' + C.ads.adsenseClient;
D.head.appendChild(s);
}
var seenSrc = {};
function adEl(pos){
var A = C.ads || {}, h = '', fromCfg = false;
var t = $('.vadtpl[data-pos="'+pos+'"]'); /* ১) Layout গ্যাজেটের কোড */
if (t) h = t.innerHTML.trim();
if (!h && A.enabled) { /* ২) Config-এর কোড */
fromCfg = true;
h = (A.custom && A.custom[pos]) || '';
if (!h && A.adsenseClient && A.slots && A.slots[pos])
h = '<ins class="adsbygoogle" style="display:block" data-ad-client="'+A.adsenseClient+'" data-ad-slot="'+A.slots[pos]+'" data-ad-format="auto" data-full-width-responsive="true"></ins>';
}
if (!h) return null;
var d = D.createElement('div'); d.className = 'vad'; d.innerHTML = '<small>Advertisement</small><div class="vadin"></div>';
var inn = $('.vadin', d); inn.innerHTML = h;
$$('script', inn).forEach(function(o){ /* innerHTML-এর script চলে না, তাই নতুন করে বানানো */
if (o.src) { if (seenSrc[o.src]) { o.remove(); return; } seenSrc[o.src] = 1; }
var n = D.createElement('script');
Array.prototype.slice.call(o.attributes).forEach(function(a){ n.setAttribute(a.name, a.value); });
n.text = o.text; o.parentNode.replaceChild(n, o);
});
if (fromCfg && $('.adsbygoogle', inn)) { loadAdsense(); try { (window.adsbygoogle = window.adsbygoogle || []).push({}); } catch(e) {} }
return d;
}
/* ---------- Header / Footer ---------- */
var br = $('#brand');
br.innerHTML = C.logo ? '<img src="'+esc(C.logo)+'" alt="'+esc(C.siteName)+'">' : '<span>▶</span> '+esc(C.siteName);
$('#vnav').innerHTML = C.nav.map(function(n){
var on = (n[1] === '/' && location.pathname === '/') || (n[1] !== '/' && decodeURI(location.pathname) === n[1]);
return '<a class="'+(on?'on':'')+'" href="'+esc(n[1])+'">'+esc(n[0])+'</a>';
}).join('');
$('#vchips').innerHTML = C.categories.map(function(c){
return '<a class="chip'+(LBL === c[0] ? ' on' : '')+'" href="/search/label/'+encodeURIComponent(c[0])+'">'+c[1]+' '+esc(c[0])+'</a>';
}).join('');
var soc = [['Facebook',C.facebook],['Telegram',C.telegram],['YouTube',C.youtube]].filter(function(s){ return s[1]; })
.map(function(s){ return '<a href="'+esc(s[1])+'" target="_blank" rel="noopener">'+s[0]+'</a>'; }).join('');
$('#vfoot').innerHTML = (soc ? '<div class="soc">'+soc+'</div>' : '') + '© '+new Date().getFullYear()+' '+esc(C.siteName);
/* টপ ব্যানার অ্যাড */
var mw = $('main .wrap'), topAd = adEl('top'); if (mw && topAd) mw.insertBefore(topAd, mw.firstChild);
/* ---------- Dark / Light ---------- */
var tb = $('#vtheme'), root = D.documentElement;
function sync(){ tb.textContent = root.getAttribute('data-theme') === 'light' ? '🌙' : '☀️'; }
tb.onclick = function(){
var n = root.getAttribute('data-theme') === 'light' ? 'dark' : 'light';
root.setAttribute('data-theme', n);
try { localStorage.setItem('vtheme', n); } catch(e) {}
sync();
};
sync();
/* ---------- PIN যাচাই ---------- */
function sha(s){
if (!(window.crypto && crypto.subtle && window.TextEncoder)) return Promise.resolve('');
return crypto.subtle.digest('SHA-256', new TextEncoder().encode(s)).then(function(b){
return Array.prototype.map.call(new Uint8Array(b), function(x){ return ('0'+x.toString(16)).slice(-2); }).join('');
});
}
/* stored = "4821" (সাধারণ) অথবা "sha256:xxxx" (Hash). পোস্টে PIN না থাকলে masterPin */
function checkPin(inp, stored){
stored = String(stored || C.masterPin || '').trim();
if (!stored) return Promise.resolve(false);
if (/^sha256:/i.test(stored)) return sha(inp).then(function(h){ return !!h && h === stored.slice(7).toLowerCase(); });
return Promise.resolve(inp === stored);
}
/* ---------- PIN সেটআপ টুল (যেকোনো পেজের লিংকের শেষে #pinsetup দিন) ---------- */
function pinTool(){
if ($('#vpintool')) return;
var m = D.createElement('div'); m.className = 'vmodal'; m.id = 'vpintool';
m.innerHTML = '<div class="vbox"><button class="vx" aria-label="Close">✕</button><h3>🔑 PIN Setup</h3>' +
'<p class="mut sm">PIN লিখুন বা Random বানান, তারপর নিচের লাইনটি কপি করে পোস্টের vcfg-তে বসান।</p>' +
'<label>PIN (সংখ্যা ব্যবহার করা ভালো)<input id="vsp" inputmode="numeric" maxlength="12" placeholder="যেমন: 4821" autocomplete="off"></label>' +
'<label>ধরন<select id="vst"><option value="plain">সাধারণ (সহজ)</option><option value="hash">Hash (পোস্টে PIN সরাসরি দেখা যাবে না)</option></select></label>' +
'<div style="display:flex;gap:8px;margin-top:12px"><button class="vbtn" id="vsr" type="button">🎲 Random</button><button class="vbtn" id="vsg" type="button">⚙ লাইন বানান</button></div>' +
'<div class="vout" id="vso" style="display:none"></div>' +
'<button class="vbtn wa" id="vsc" type="button" style="display:none">📋 কপি</button></div>';
B.appendChild(m);
m.onclick = function(e){ if (e.target === m || e.target.className === 'vx') m.remove(); };
$('#vsr', m).onclick = function(){ $('#vsp', m).value = String(Math.floor(1000 + Math.random() * 9000)); };
$('#vsg', m).onclick = function(){
var pin = $('#vsp', m).value.trim();
if (!pin) { toast('PIN লিখুন'); return; }
var show = function(line){ var o = $('#vso', m); o.textContent = line; o.style.display = ''; $('#vsc', m).style.display = ''; };
if ($('#vst', m).value === 'hash') {
sha(pin).then(function(h){
if (!h) { toast('এই ব্রাউজারে Hash চলবে না, সাধারণ ধরন ব্যবহার করুন'); return; }
show('PIN: sha256:' + h);
});
} else show('PIN: ' + pin);
};
$('#vsc', m).onclick = function(){ copy($('#vso', m).textContent); };
}
if (location.hash === '#pinsetup') pinTool();
window.addEventListener('hashchange', function(){ if (location.hash === '#pinsetup') pinTool(); });
/* ---------- Payment Box + WhatsApp ---------- */
function pay(p){
var m = $('#vpay');
if(!m){ m = D.createElement('div'); m.id = 'vpay'; m.className = 'vmodal'; B.appendChild(m); }
m.style.display = 'flex';
m.innerHTML = '<div class="vbox"><button class="vx" aria-label="Close">✕</button><h3>💳 Payment</h3><p class="mut sm">'+esc(p.title)+'</p>' +
'<div class="vnum"><b>bKash:</b><span>'+esc(C.bkash)+'</span><button data-c="'+esc(C.bkash)+'">কপি</button></div>' +
'<div class="vnum"><b>Nagad:</b><span>'+esc(C.nagad)+'</span><button data-c="'+esc(C.nagad)+'">কপি</button></div>' +
'<div class="vprice">Price: <b>'+esc(p.price)+'</b></div>' +
'<label>Payment Method<select id="vpm"><option>bKash</option><option>Nagad</option></select></label>' +
'<label>Transaction ID<input id="vpt" placeholder="যেমন: 8N7A6D5E4C" autocomplete="off"></label>' +
'<label>Amount<input id="vpa" value="'+esc(p.price)+'"></label>' +
'<label>Gmail (ভিডিও Access পেতে)<input id="vpg" type="email" placeholder="you@gmail.com"></label>' +
'<button class="vbtn wa" id="vpw">📱 WhatsApp-এ Payment Details পাঠান</button>' +
'<p class="mut sm" style="margin-top:8px">Payment করার পর Transaction ID দিয়ে বাটনে ক্লিক করুন। Admin verify করে WhatsApp-এ আপনাকে একটি PIN পাঠাবেন। সেই PIN ভিডিওর উপরে দিলে ভিডিও Unlock হবে।</p></div>';
m.onclick = function(e){
if(e.target === m || e.target.className === 'vx') m.style.display = 'none';
var c = e.target.getAttribute && e.target.getAttribute('data-c'); if(c) copy(c);
};
$('#vpw').onclick = function(){
var trx = $('#vpt').value.trim();
if(!trx){ toast('Transaction ID লিখুন'); $('#vpt').focus(); return; }
var gm = $('#vpg').value.trim();
var msg = 'Hello,\nI want to unlock this video.\n\nVideo: '+p.title+'\n\nPayment Method: '+$('#vpm').value+
'\n\nTransaction ID: '+trx+'\n\nAmount: '+$('#vpa').value.trim()+(gm ? '\n\nGmail: '+gm : '')+
'\n\nPlease unlock this video.';
window.open('https://wa.me/'+C.whatsapp.replace(/\D/g,'')+'?text='+encodeURIComponent(msg), '_blank');
m.style.display = 'none';
toast('WhatsApp-এ পাঠানো হয়েছে। PIN পেলে ভিডিওর উপরে দিন');
var pi = $('#vpin'); if (pi) pi.focus();
};
}
/* ---------- হোমপেজ / লেবেল / সার্চ ---------- */
if (PT === 'index' || PT === 'archive') {
var grid = $('#vmain'), h2 = $('#vh2');
if (h2) { if (LBL) h2.textContent = '🎬 ' + LBL; else if (Q) h2.textContent = '🔍 ' + Q; }
if (grid) {
$$('.vraw', grid).forEach(function(el){ try { el.outerHTML = card(fromRaw(el)); } catch(e) {} });
$$('.vc', grid).forEach(function(c, i){ /* ইন-ফিড অ্যাড */
if ((i + 1) % ((C.ads && C.ads.feedEvery) || 6) === 0) { var fa = adEl('feed'); if (fa) { fa.className += ' feed'; c.parentNode.insertBefore(fa, c.nextSibling); } }
});
if (!$('.vc', grid)) grid.innerHTML = '<div class="vempty" style="grid-column:1/-1">😕 কোনো ভিডিও পাওয়া যায়নি</div>';
}
var home = (location.pathname === '/' || location.pathname === '') && !LBL && !Q;
if (home && ($('#sec-trending') || $('#sec-most'))) {
feed().then(function(all){
var byViews = all.slice().sort(function(a,b){ return b.views - a.views; });
var tr = all.filter(function(p){ return p.labels.indexOf('Trending') > -1; }).slice(0, 4);
if (tr.length < 4) byViews.forEach(function(p){ if (tr.length < 4 && tr.indexOf(p) < 0 && p.views) tr.push(p); });
fill('sec-trending', tr);
fill('sec-most', byViews.filter(function(p){ return p.views; }).slice(0, 8));
});
}
}
/* ---------- ভিডিও ডিটেইলস পেজ ---------- */
if (PT === 'item' && $('#vdesc')) {
var art = $('.vpost'), d = $('#vdesc'), html = d.innerHTML;
var labels = $$('.vlabels i', art).map(function(i){ return i.textContent; });
var p = build(html, { title: art.getAttribute('data-title'), url: location.href.split('#')[0], date: art.getAttribute('data-date'), labels: labels });
var vt = $('.vtitle'); if (vt && !vt.textContent.trim()) vt.textContent = p.title;
var idm = p.drive.match(/\/d\/([\w-]+)/) || p.drive.match(/[?&]id=([\w-]+)/);
var fid = idm ? idm[1] : '';
var premium = p.status === 'LOCKED';
var unl = false; /* আগে PIN দিয়ে আনলক করা থাকলে মনে রাখা */
try { unl = localStorage.getItem('vu_' + (fid || p.url)) === '1'; } catch(e) {}
var locked = premium && !unl;
var th = thumb(p.img, S ? 720 : 1280, S ? 1280 : 720);
/* কনফিগ লাইন ও থাম্বনেইল ছবি বর্ণনা থেকে সরানো (PIN-সহ) */
$$('.vcfg', d).forEach(function(e){ e.remove(); });
$$('div,p,span,b', d).forEach(function(e){
if (!e.querySelector('div,p') && e.textContent.length < 400 && CFG_KEYS.test(e.textContent)) e.remove();
});
var fi = $('img', d); if (fi) { var fa = fi.closest('a'); (fa || fi).remove(); }
/* প্লেয়ার */
var box = $('#vplayer');
box.innerHTML = '<div class="vstage" id="vstage">' + (th ? '<img src="'+esc(th)+'" alt="'+esc(p.title)+'">' : '') +
(locked
? '<div class="vlock"><div class="ic">🔒</div><b>PREMIUM VIDEO</b><p>ভিডিও দেখতে Unlock করুন</p>' +
'<button class="vbtn" id="vunlock">🔓 Unlock Video — '+esc(p.price)+'</button>' +
'<div class="vpinbox"><small>Payment-এর পর WhatsApp-এ PIN পেয়েছেন?</small>' +
'<div class="vpinrow" id="vpinrow"><input id="vpin" type="password" inputmode="numeric" maxlength="12" placeholder="PIN দিন" autocomplete="off">' +
'<button class="vbtn" id="vpinok" type="button">Unlock</button></div></div></div>'
: '<button class="vbig" id="vgo" aria-label="Play">▶</button>') + '</div>' +
'<div class="vtools"><button id="vfs" type="button">⛶ Fullscreen</button>' +
(!locked && fid ? '<a href="https://drive.google.com/file/d/'+fid+'/view" target="_blank" rel="noopener">↗ Google Drive-এ খুলুন</a>' : '') +
'<button id="vcl" type="button">🔗 লিংক কপি</button></div>';
var pad = adEl('player'); if (pad) box.appendChild(pad);
var stage = $('#vstage');
function load(){
if (!fid) { toast('ভিডিও লিংক পাওয়া যায়নি'); return; }
stage.innerHTML = '<div class="vspin"></div><iframe src="https://drive.google.com/file/d/'+fid+'/preview" allow="autoplay; fullscreen" allowfullscreen></iframe>';
$('iframe', stage).onload = function(){ var s = $('.vspin', stage); if (s) s.remove(); };
}
if ($('#vgo')) $('#vgo').onclick = load;
if ($('#vunlock')) $('#vunlock').onclick = function(){ pay(p); };
/* PIN দিয়ে আনলক (৫ বার ভুল হলে ৩০ সেকেন্ড অপেক্ষা) */
var tries = 0, waitUntil = 0;
function tryPin(){
var inp = $('#vpin'), row = $('#vpinrow'), v = inp.value.trim();
if (Date.now() < waitUntil) { toast('একটু অপেক্ষা করে আবার চেষ্টা করুন'); return; }
if (!v) { toast('PIN লিখুন'); inp.focus(); return; }
if (!String(p.pin || C.masterPin || '').trim()) { toast('এই ভিডিওর জন্য PIN সেট করা নেই'); return; }
checkPin(v, p.pin).then(function(ok){
if (ok) {
try { localStorage.setItem('vu_' + (fid || p.url), '1'); } catch(e) {}
toast('আনলক হয়েছে ✓ 🎉');
var pl = $('.pill'); if (pl) pl.textContent = '🔓 PREMIUM';
load();
} else {
tries++; inp.value = '';
row.classList.remove('bad'); void row.offsetWidth; row.classList.add('bad');
if (tries >= 5) { tries = 0; waitUntil = Date.now() + 30000; toast('৫ বার ভুল! ৩০ সেকেন্ড অপেক্ষা করুন'); }
else toast('ভুল PIN, আবার চেষ্টা করুন');
}
});
}
if ($('#vpinok')) {
$('#vpinok').onclick = tryPin;
$('#vpin').onkeydown = function(e){ if (e.key === 'Enter') tryPin(); };
}
$('#vfs').onclick = function(){ (stage.requestFullscreen || stage.webkitRequestFullscreen || function(){ toast('Fullscreen সাপোর্ট নেই'); }).call(stage); };
$('#vcl').onclick = function(){ copy(p.url); };
if (!locked && location.hash === '#play') load();
/* মেটা */
$('#vmeta').innerHTML = '<span class="pill '+(premium?'lock':'free')+'">'+(premium ? (locked ? '🔒 PREMIUM' : '🔓 PREMIUM') : 'FREE')+'</span>' +
'<a href="/search/label/'+encodeURIComponent(p.cat)+'">📂 '+esc(p.cat)+'</a>' +
(p.views ? '<span>👁 '+fmt(p.views)+' views</span>' : '') + '<span>📅 '+esc(p.date)+'</span>';
var aad = adEl('after'); if (aad) $('#vshare').parentNode.insertBefore(aad, $('#vshare'));
/* শেয়ার */
var u = encodeURIComponent(p.url), t = encodeURIComponent(p.title);
$('#vshare').innerHTML = '<b>Share:</b>' +
'<a class="fb" target="_blank" rel="noopener" href="https://www.facebook.com/sharer/sharer.php?u='+u+'">Facebook</a>' +
'<a class="wa" target="_blank" rel="noopener" href="https://wa.me/?text='+t+'%20'+u+'">WhatsApp</a>' +
'<a class="tg" target="_blank" rel="noopener" href="https://t.me/share/url?url='+u+'&text='+t+'">Telegram</a>' +
'<a class="x" target="_blank" rel="noopener" href="https://twitter.com/intent/tweet?url='+u+'&text='+t+'">X</a>' +
'<button class="cp" type="button" id="vcp">Copy Link</button>';
$('#vcp').onclick = function(){ copy(p.url); };
/* Related Videos — একই ক্যাটাগরির ভিডিও */
feed().then(function(all){
var cur = p.url.replace(/^https?:/,'');
var rest = all.filter(function(x){ return x.url.replace(/^https?:/,'') !== cur; });
var rel = rest.filter(function(x){ return x.cat === p.cat; }).slice(0, 4);
rest.forEach(function(x){ if (rel.length < 4 && rel.indexOf(x) < 0) rel.push(x); });
if (rel.length) $('#vrel').innerHTML = '<div class="vsec"><h2>🎬 Related Videos</h2><div class="vgrid">'+rel.map(card).join('')+'</div></div>';
});
}
})();
//]]>
</script>
</body>
</html>
✦ CODE SNIPPET
<div class="vcfg"> VIDEO URL: https://drive.google.com/file/d/XXXXXXXX/view<br> VIDEO STATUS: LOCKED<br> VIDEO CATEGORY: Premium<br> PRICE: ৳100<br> VIEWS: 12K<br> PIN: 4821 </div>
