Này, em gái cậu đang mặc bộ đồ thỏ ngược trên một trang web giải trí người lớn…!? ~Những lời chửi thề như súng máy và kỹ thuật khoe ngực của cô gái siêu dâm đãng này cực kỳ nguy hiểm~ Kuroki Reina MOODYZ","lastmod":"2026-07-11","duration":"02:18:36","url":"/play/19165782.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTEyMjMvNzQwZDJkYjkyYjU4ZmIyYzdmNjhkMmM5NzEyOTY2ZjMuanBn.cache","vod_id":19149287,"title":"Một cô gái trẻ ngây thơ lẻn vào nhà cùng bạn trai và tận hưởng trái cấm.","lastmod":"2026-03-20","duration":"02:15","url":"/play/19149287.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvZTY4NTJmNmZlODMyOGNkYmZlYjgxN2MxNDgzZTAxYzguanBn.cache","vod_id":18972780,"title":"PARATHD-3747 [Hồ sơ loạn luân] Tam giác tình yêu nguy hiểm Phiên bản cao cấp - Quan hệ mẹ con giữa mẹ và em gái & Quan hệ cha con giữa cha và em trai.","lastmod":"2025-12-14","duration":"01:54:58","url":"/play/18972780.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvYmU0OTcyYzZmYTBlMmE2ZjJhYzBkYjc1NDNkNmE4YmQuanBn.cache","vod_id":18965363,"title":"HUNTA-100 \"Anh ơi... lấy nó ra đi...\" Máy rung của em gái tôi bị kẹt khi đang tự thỏa mãn, và em ấy đã gửi tín hiệu cầu cứu cho tôi!","lastmod":"2025-12-14","duration":"03:50:39","url":"/play/18965363.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTEyMjMvMWMyZjc5NGM4NWU4NWM2ZGQ5NTc2YjkzOWQ4ZjMzZjEuanBn.cache","vod_id":19139970,"title":"Từ ngày người em gái yêu quý của cô gặp tai nạn… Bị cuốn vào vòng xoáy tình cảm đồng tính nữ của nạn nhân, cô buộc phải phục vụ và lợi dụng sự nhạy cảm của em gái mình… Nia, Rio Rukawa BBAN-552","lastmod":"2026-01-24","duration":"02:50:02","url":"/play/19139970.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvNmE3NDEzNWE5Njc5NTQ2YmIwZTNmOTU0NjEwNjViOWMuanBn.cache","vod_id":18973459,"title":"PYU-304 Loạn luân: Cô em gái NEET quan hệ tình dục với anh trai để thỏa mãn dục vọng của mình.","lastmod":"2025-12-14","duration":"00:43:56","url":"/play/18973459.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvNzM0NGQ3MmE4ZmI5MDBhOTM3NjVhZjY4YTcxNWEyNzMuanBn.cache","vod_id":19007966,"title":"MDTM342 Cô gái tóc đen thích tình dục ◆ Muto Tsutomi.","lastmod":"2025-03-24","duration":"01:57:32","url":"/play/19007966.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvYzI0NWQyMGZhZDNmOGMyNjljYjk2YmQ4NDI0NjIyYWYuanBn.cache","vod_id":19018835,"title":"Cô em gái xinh đẹp, ngực đầy đặn, không vũ trang đang bị người em trai phi thường của mình xâm hại.","lastmod":"2025-03-24","duration":"02:26:17","url":"/play/19018835.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvOTU5NTFlNmQwZTkwZTE1Yjg3NWIyOTQ4ZTJlN2U3YmYuanBn.cache","vod_id":19010169,"title":"cô gái tập yoga ở khách sạn","lastmod":"2025-03-24","duration":"15:22","url":"/play/19010169.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvNGViMDQwZGI3YTIwZWJmOGFiMjAxNmUzZmYyNTEzMGUuanBn.cache","vod_id":18969911,"title":"Cô em gái mũm mĩm có bộ ngực săn chắc và hồng hào. Nằm bắt chéo chân, vùng kín của cô ấy vô cùng đẹp, và cận cảnh lỗ nhỏ màu hồng se khít cho thấy độ săn chắc của nó.","lastmod":"2025-12-14","duration":"00:32:45","url":"/play/18969911.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTEwMTkvMzA2ZDQxODU2NjYxNWU0Nzc5MjgyYTY2NWM2YmY3YjcuanBn.cache","vod_id":19058466,"title":"Em gái tôi vẫn mặc đồ lót bằng cotton, nhưng vòng một của em ấy đã cỡ H và vẫn đang phát triển! Mặc dù vẫn mặc đồ lót bằng cotton, em ấy vẫn liên tục đăng ảnh mặc đồ lót khiến tôi thèm muốn.","lastmod":"2025-10-18","duration":"01:58:11","url":"/play/19058466.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTA1MjgvNGQ4ODYwNTFmM2RjNmRkNGVlNDNmMzcyMzUyNTRiYWYuanBn.cache","vod_id":19035572,"title":"Tôi đã ăn vài bữa với người em họ xinh đẹp, thanh lịch của mình, và sau khi tặng cô ấy vài món quà, tôi dễ dàng sắp xếp gặp cô ấy ở khách sạn để quan hệ tình dục. Tôi không ngờ cô ấy lại thích quan hệ bằng miệng đến vậy, nên tôi đã làm chuyện đó cho cô ấy rồi sau đó quan hệ mạnh bạo với cô ấy.","lastmod":"2025-05-28","duration":"32:24","url":"/play/19035572.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvMjBlZTdlMDBiODk2YjAxOTgwYjE1M2QzMjZjNTJmMjkuanBn.cache","vod_id":18950741,"title":"Tôi đã chuốc say một cô tiếp viên mũm mĩm ở quán karaoke ❤️ và bắt đầu dùng một ngón tay thọc sâu vào âm đạo và hậu môn của cô ấy một cách thô bạo.","lastmod":"2025-12-14","duration":"00:29:19","url":"/play/18950741.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvOTUwNDhhNGU2M2VhNjZhMGVlYWMwODI2MmZkODBjZTEuanBn.cache","vod_id":18999355,"title":"[Đồng tính nữ] Ghi lại một ngày tuyệt vời: Người chị gái nhẹ nhàng vuốt ve và liếm láp vùng kín màu hồng của em gái mình!","lastmod":"2025-03-23","duration":"09:57","url":"/play/18999355.html"}]},
videoTitle: 'Một cô bé đang say sưa chơi PUBG.',
language: 'vi',
dataKey: '01',
loadingPlayer: true,
showShare: false,
pageUrl: '',
// RecommendedMovies 组件状态
isSingleColumn: false,
pageSize: 8,
currentPage: 1,
// 计算属性(使用 getter)
get layoutIconClass() {
return this.isSingleColumn ? 'icon-view-list' : 'icon-grid';
},
get layoutClass() {
return [
'row',
'g-3',
'row-cols-1',
this.isSingleColumn ? '' : 'row-cols-2',
'row-cols-lg-4'
].filter(Boolean).join(' ');
},
// 方法
onAppMounted() {
// 设置页面 URL
this.pageUrl = window.location.href;
// 保存观看历史
this.saveWatchHistory();
// 更新标签统计
if (this.videoData.tag && this.videoData.tag.length > 0) {
this.updateTagStats(this.videoData.tag);
}
// 发送点击统计
this.hitVideoId(this.videoData.id);
// 从 Cookie 读取布局偏好
const layoutCookie = this.getCookie('list_layout');
if (layoutCookie === 'single') {
this.isSingleColumn = true;
}
// 监听 iframe 加载完成,隐藏骨架屏
// 使用 setTimeout 确保 DOM 已完全渲染
setTimeout(() => {
const iframe = document.getElementById('v2-player');
const skeleton = document.getElementById('player-skeleton');
if (iframe && skeleton) {
// 定义隐藏骨架屏的函数
const hideSkeleton = () => {
skeleton.style.transition = 'opacity 0.3s ease';
skeleton.style.opacity = '0';
setTimeout(() => {
skeleton.style.display = 'none';
}, 300);
};
// 检查 iframe 是否已经加载完成
if (iframe.contentDocument || iframe.contentWindow) {
try {
// 如果 iframe 已加载,直接隐藏骨架屏
if (iframe.contentWindow.document.readyState === 'complete') {
setTimeout(hideSkeleton, 500);
return;
}
} catch (e) {
console.log('[Video] 跨域 iframe,无法检查状态:', e.message);
// 跨域情况下无法访问 contentWindow,继续监听 load 事件
}
}
// 监听 load 事件
iframe.addEventListener('load', () => {
console.log('[Video] iframe load 事件触发');
setTimeout(hideSkeleton, 500);
});
// 添加超时保护,确保骨架屏最终会被隐藏
setTimeout(() => {
if (skeleton.style.display !== 'none') {
console.log('[Video] 超时保护触发,强制隐藏骨架屏');
hideSkeleton();
}
}, 5000); // 5秒后强制隐藏
} else {
console.error('[Video] 未找到 iframe 或 skeleton 元素');
}
}, 0);
},
// 随机跳转
async jumpToRandomVideo() {
try {
const response = await fetch(`/api/qun/randomid?t=${Date.now()}`, {
headers: {
'x-data-key': this.dataKey,
'x-api-key': 'dagexxx.com'
}
});
const data = await response.json();
if (data?.status === 1 && data?.data?.id) {
window.location.href = `/${this.language}/play/${data.data.id}.html`;
} else {
console.error('获取随机视频失败:', data?.message || '未知错误');
}
} catch (err) {
console.error('获取随机视频失败:', err);
}
},
// 复制分享链接
copyShareLink() {
const input = this.$refs.shareInput;
if (input) {
input.select();
input.setSelectionRange(0, 99999); // For mobile devices
// 尝试使用现代 API
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(this.pageUrl).then(() => {
alert('Đã sao chép liên kết!');
}).catch(() => {
// 降级到旧方法
document.execCommand('copy');
alert('Đã sao chép liên kết!');
});
} else {
// 降级到旧方法
document.execCommand('copy');
alert('Đã sao chép liên kết!');
}
}
},
// 切换布局
toggleLayout() {
this.isSingleColumn = !this.isSingleColumn;
this.setCookie('list_layout', this.isSingleColumn ? 'single' : 'multi', 30);
},
// 加载更多
loadMore() {
this.currentPage++;
},
// 保存观看历史
saveWatchHistory() {
try {
const storageKey = 'watchHistory';
let history = JSON.parse(localStorage.getItem(storageKey) || '[]');
// 解码 HTML 实体编码的标题
const decodeHtmlEntities = (text) => {
const textarea = document.createElement('textarea');
textarea.innerHTML = text;
return textarea.value;
};
const video = {
id: this.videoData.id,
title: decodeHtmlEntities(this.videoData.title),
image: this.videoData.images || this.videoData.preview,
duration: this.videoData.duration || ''
};
// 过滤掉已存在的相同 ID 视频
history = history.filter(item => item.id !== video.id);
// 添加新记录到最前面
history.unshift(video);
// 限制最多保存 100 条
if (history.length > 100) {
history = history.slice(0, 100);
}
localStorage.setItem(storageKey, JSON.stringify(history));
} catch (e) {
console.error('Failed to save watch history:', e);
}
},
// 更新标签统计
updateTagStats(tags = []) {
// HTML 实体解码函数
const decodeHtmlEntities = (text) => {
const textarea = document.createElement('textarea');
textarea.innerHTML = text;
return textarea.value;
};
const storageKey = this.dataKey + 'tagWatchStats';
const lastWatchedKey = this.dataKey + 'tagLastWatched';
const raw = localStorage.getItem(storageKey);
const stats = raw ? JSON.parse(raw) : {};
// 解码标签并统计
const decodedTags = tags.map(tag => decodeHtmlEntities(tag));
decodedTags.forEach(tag => {
stats[tag] = (stats[tag] || 0) + 1;
});
localStorage.setItem(storageKey, JSON.stringify(stats));
localStorage.setItem(lastWatchedKey, JSON.stringify(decodedTags));
},
// 点击统计
hitVideoId(id) {
fetch(`/api/qun/hit?type=play&id=${id}`, {
method: 'GET',
headers: {
'x-data-key': this.dataKey,
'x-api-key': 'dagexxx.com'
}
}).catch(err => {
console.error('点击统计失败:', err);
});
},
// Cookie 工具方法
getCookie(name) {
const value = `; ${document.cookie}`;
const parts = value.split(`; ${name}=`);
if (parts.length === 2) return parts.pop().split(';').shift();
},
setCookie(name, value, days) {
const expires = new Date(Date.now() + days * 864e5).toUTCString();
document.cookie = `${name}=${value}; expires=${expires}; path=/`;
}
};
}