Cô vợ trẻ đứng trên đường phố khu chung cư! Vặt 1.5? Quan hệ tình dục tại nhà miễn phí! Thương lượng rồi xuất tinh bên trong không dùng bao cao su được! Một chàng trai trẻ từ bỏ tình dục để giết thời gian Hunter","lastmod":"2026-07-11","duration":"04:00:31","url":"/play/19163820.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvZWYyMjBiZjQ2NGRmODhhOWJmYmJmZGIzN2FlZWQ5MjYuanBn.cache","vod_id":18986224,"title":"10musume Natural Girl 093023_01 Nghiệp dư không trang điểm - Ngay cả sau đêm ân ái, cô ấy cũng không tẩy trang - Yabuki Uran","lastmod":"2025-03-23","duration":"00:56:32","url":"/play/18986224.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvMzdmNzFjNDIyNmE2NjY3ZWIzZGNjMTEzZjE1YmYyZGEuanBn.cache","vod_id":18992101,"title":"CAWD-005 Một cô gái người Mỹ gốc Nhật xinh đẹp trải nghiệm cực khoái lần đầu tiên, và tiếp tục trải nghiệm cực khoái ngay cả sau khi đạt cực khoái ban đầu. Thông qua một loạt các cảnh quan hệ tình dục mạnh mẽ, cô ấy lần đầu tiên khám phá một khía cạnh khác của cực khoái. Ayami Shionoki 1","lastmod":"2025-12-14","duration":"02:28:33","url":"/play/18992101.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvNzIxYzMzMDc0ZTNiYzgzYzBlZjE1MjAzM2JlZWUxNzYuanBn.cache","vod_id":19022723,"title":"Phụ đề tiếng Trung GANA2230: Nghiêm túc và dịu dàng, Phát súng đầu tiên 1439, Phép màu của Alafoh.","lastmod":"2025-03-24","duration":"01:11:05","url":"/play/19022723.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTEyMjMvZmJlNzg4MjU3NTU1OWNjNWEwMTUwZjEwZThhNWEyNTQuanBn.cache","vod_id":19140341,"title":"Xin giới thiệu một con quái vật tình dục điên cuồng, khao khát được chấp nhận và ham muốn tình dục vượt qua mọi ranh giới, haha. Saku, 28 tuổi, diễn viên vô danh, BEAF-182.","lastmod":"2026-01-26","duration":"01:19:31","url":"/play/19140341.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvODQ1MmNkMDEwN2IzYTIzZTlhMjA2NzRlODU5ZjYyMjUuanBn.cache","vod_id":18949560,"title":"Một cặp đôi trẻ đang yêu nhau say đắm chia sẻ những bức ảnh về đời sống tình dục hàng ngày của họ trong khách sạn, bao gồm cả màn oral sex nhẹ nhàng, những lời trêu chọc và tư thế phụ nữ ở trên.","lastmod":"2025-12-14","duration":"00:41:43","url":"/play/18949560.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvNjU1MjlkMzg2N2Y1MGRmYWY4ZjJmOTlmMmFmY2ZiMTAuanBn.cache","vod_id":18966322,"title":"[Phụ đề tiếng Trung] MMUS-072 Tiểu Quỷ Trêu Chọc Hanakoto Xinh Đẹp","lastmod":"2025-12-14","duration":"02:11:15","url":"/play/18966322.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvMmJhMzVmMTI4M2FlN2M3MjI3MGRiMDNmZjg3MmM2ZWMuanBn.cache","vod_id":18944767,"title":"[Phụ đề tiếng Trung] JURA-17 Lần đầu tiên quay phim với một phụ nữ đã kết hôn. Mizuho Kaito","lastmod":"2025-12-14","duration":"02:00:35","url":"/play/18944767.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvODc0Y2RiZTNmYWNkNzdmNTMwYmU2ODUxMTNhMjY5MzQuanBn.cache","vod_id":18952203,"title":"OKP-051 Vớ Thánh - Konno Hikaru. Hãy thưởng thức những lòng bàn chân và ngón chân ướt đẫm mồ hôi của cô gái xinh đẹp này trong bộ đồng phục và đôi vớ mới tinh! Đôi khi cô ấy ngồi lên mặt và thực hiện trò chơi cuồng chân, đôi khi cô ấy xuất tinh bên trong, và đôi khi cô ấy xoa mông và xuất tinh khắp cơ thể! Hãy tận hưởng những trò chơi huấn luyện và cực khoái biến thái của người phụ nữ đang hưng phấn này. Phim AV cuồng dâm.","lastmod":"2025-12-14","duration":"01:33:32","url":"/play/18952203.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTA5MDUvM2I4MjU1YjEzNTM2ZmYyMTgxZmMwZjMwZjJmMTIxM2QuanBn.cache","vod_id":19050403,"title":"EYS110 đã bí mật quay một cảnh sex nóng bỏng! Thói quen tình dục đáng xấu hổ của một người phụ nữ nhạy cảm: núm vú và âm vật cương cứng do kem dưỡng da trơn trượt.","lastmod":"2025-09-04","duration":"02:58:57","url":"/play/19050403.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvY2E4MmQyNDVjYzUyMTUwODhhOWY5YjAyYzgzNzJiNWYuanBn.cache","vod_id":19025889,"title":"Một video ghi lại cảnh quan hệ tình dục của một cặp đôi nổi tiếng người Đài Loan trong phòng khách sạn đã bị hack và rò rỉ. Video cho thấy người đàn ông đang giao hợp nhanh chóng với người phụ nữ trong khi cô ấy ở trên anh ta.","lastmod":"2025-03-24","duration":"03:47","url":"/play/19025889.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvMTdkZjc1MWNlOGI3NTU1YTQ5YWE4NTQxYjM0YjJmMDAuanBn.cache","vod_id":18966928,"title":"Cô bạn gái gợi cảm số 04 của bạn, đang khoe mặt trong lúc quan hệ tình dục với bạn trai trên livestream, rất xinh đẹp và quyến rũ, cho phép chàng trai quan hệ với cô ấy ở nhiều tư thế khác nhau mà không dùng bao cao su, xuất tinh vào miệng cô ấy và nuốt trọn, sử dụng đạo cụ để kích thích âm đạo.","lastmod":"2025-12-14","duration":"00:41:22","url":"/play/18966928.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTEwMTIvZjUzMTEyYjllYjhjODJmMThkYjdjMTgxMzk4OTE4YmUuanBn.cache","vod_id":19057311,"title":"[Tiếng Trung] VEC692 không thể chịu nổi bà nội trợ quyến rũ nhà bên ngày nào cũng tự thỏa mãn. Lý trí tan biến, và dục vọng không thể kìm nén trong cuộc ái ân mãnh liệt, cuồng nhiệt này.","lastmod":"2025-10-11","duration":"01:36:54","url":"/play/19057311.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTA2MTgvNzhkY2ExMjI1NmY1N2ZiNjI4YWQ0N2YxNzhhZmRhNmYuanBn.cache","vod_id":19038862,"title":"Với làn da mịn màng như sứ và vẻ đẹp ngoại hình vô cùng quyến rũ, cô ấy tham gia vào nhiều tư thế quan hệ tình dục khác nhau, bao gồm cả tư thế cưỡi ngựa và tư thế thâm nhập từ bên hông.","lastmod":"2025-06-18","duration":"27:09","url":"/play/19038862.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvMDViN2ViYTM1MDNmZjAxNjkyNjIyMzY5MWZjOGM2ZTIuanBn.cache","vod_id":18979019,"title":"[Phụ đề tiếng Trung] HMN-408 Phát hiện cô giáo mình yêu mến ngoại tình, anh ta phục kích và đe dọa cưỡng hiếp cô. (Amagawa Sora)","lastmod":"2025-03-23","duration":"01:57:56","url":"/play/18979019.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvNGYwMGQyNzY2NjkwZmNmNDU1ZWNmYTFjMjg5MmNmMzAuanBn.cache","vod_id":19015418,"title":"JUFE074 Một bộ phim tài liệu góc nhìn của một ông già. Một cuộc ân ái nồng nhiệt, mãnh liệt, tham lam và đẫm mồ hôi với Mika Mika.","lastmod":"2025-03-24","duration":"02:36:41","url":"/play/19015418.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvODU3MzBiZWZjYzFkODhkZjEwZjA4Njk1YWU2NDQwOTIuanBn.cache","vod_id":18932894,"title":"[Phụ đề tiếng Trung] ATOM-394 Mát-xa Ngực Đàn Hồi! Tại Quán Bar Ngực","lastmod":"2025-12-14","duration":"03:54:32","url":"/play/18932894.html"}]},
videoTitle: '[Phụ đề tiếng Trung] SSNI-581 Hôn và hòa quyện: Tiếp xúc thân mật, Hôn sâu',
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=/`;
}
};
}