Một người phụ nữ cao ráo, gợi cảm với thân hình quyến rũ đang liên tục vuốt ve và làm tình trong một khách sạn tình yêu.","lastmod":"2026-07-11","duration":"01:37:14","url":"/play/19161161.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTEyMjMvN2ZiOGIwODI3ZGQ2Y2Y4OTIyMjVmNTQzMzczNWZjYzMuanBn.cache","vod_id":19138387,"title":"Hơn cả bạn tình, nhưng chưa phải người yêu. Lúc nào cũng muốn quan hệ tình dục! Một con thú dâm đãng ở khách sạn. Azumi Amatsuki SQTE-622","lastmod":"2026-01-14","duration":"02:13:02","url":"/play/19138387.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTA4MjkvNGZkYTM3OGM2ZTlkMDQ1NGRhNjE4Y2IwNGI0YWU0YmUuanBn.cache","vod_id":19049001,"title":"REAL891 Đây là câu chuyện về một nữ sinh viên bị đánh thức bởi ca phẫu thuật thanh quản của một bác sĩ chuyên khoa tai mũi họng có khuynh hướng khổ dâm và đạt đến cực khoái trong nước mắt.","lastmod":"2025-08-28","duration":"02:02:32","url":"/play/19049001.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvZmZkMTAzYjcxNTEzNDM5MWYxM2UwNzRhYTg0MDM1YTkuanBn.cache","vod_id":18992096,"title":"BLK-414 Nhật ký mại dâm sau giờ học của một cô gái yêu văn chương. Quan hệ tình dục nguyên thủy với con gái Tomo-chan 1","lastmod":"2025-03-23","duration":"02:57:53","url":"/play/18992096.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTEyMjMvYTdhYmQ5MjhmZjc2MDBjY2UzYjVmY2VmMzExMWM3YzQuanBn.cache","vod_id":19138607,"title":"Cô gái mặc quần tất đen, chiếc quần tất đen trơn bóng và ẩm ướt khiến dương vật tôi cương cứng và nh pulsating. Mặc dù cô ấy là em gái tôi, nhưng chúng tôi vẫn quan hệ tình dục! Diễn viên không rõ danh tính SW-1015","lastmod":"2026-01-16","duration":"03:40:51","url":"/play/19138607.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvNTgzNjY0ODU1MzlmY2Q1MTk1ZGM2MTA0Mjg0YjI1N2MuanBn.cache","vod_id":18967947,"title":"MIGD-742 Nữ sinh thích xuất tinh sâu vào cổ họng từ phía sau! Mio Oshima","lastmod":"2025-12-14","duration":"02:37:21","url":"/play/18967947.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvZTZhYzdjYjdjMGE4NmNlMDIyZmIxN2NmZTNkZGZmMGYuanBn.cache","vod_id":19007969,"title":"Một nữ sinh viên đang trên đường về nhà sau hoạt động câu lạc bộ MDB982 đã bị tấn công tình dục khi không sử dụng bao cao su.","lastmod":"2025-03-24","duration":"02:31:25","url":"/play/19007969.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvMjM4MGY4YThmZjE5ZjFhODNmMDRkNDY2MmQ0ZDE0YzQuanBn.cache","vod_id":18938895,"title":"\"Nhanh lên, làm đi, tự liếm mình cũng được, em có thể tự xem.\" Hai sinh viên, không cởi quần áo, đang quan hệ tình dục trên bàn, và cô gái có vẻ rất không muốn.","lastmod":"2025-12-14","duration":"00:04:49","url":"/play/18938895.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNjA2MjMvODBkMTUxM2U2MWY4YWQ0YTFkYTcwNjMxYmI4ZGZmNTYuanBn.cache","vod_id":19164721,"title":"[Trao đổi khuôn mặt] Cuộc phiêu lưu tình dục tại nhà của Cobie Smulders...","lastmod":"2026-07-11","duration":"15:52","url":"/play/19164721.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvOTUzMGU2YmNhNTQ5MmRjZTg1MzIwZmE1YTNhNWIzM2QuanBn.cache","vod_id":18963236,"title":"REAL-549 Quan hệ tình dục bằng miệng ma quỷ - Nữ sinh địa ngục - Phiên bản đặc biệt 2 Uehara Ai, Haruki Karen","lastmod":"2025-03-22","duration":"02:47:28","url":"/play/18963236.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzEvMzM0Mzc2NzFlM2M0OTVhODA2ZTY0M2M5NmY2MTllMzEuanBn.cache","vod_id":18973041,"title":"MIDV-260 Là một giáo viên chủ nhiệm, tôi không thể cưỡng lại sự cám dỗ của học sinh mình. Sau giờ học, tôi đã quan hệ tình dục với cô ấy hết lần này đến lần khác tại một khách sạn tình yêu... Aoi Ibuki","lastmod":"2025-12-14","duration":"02:00:32","url":"/play/18973041.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvMDY1YTU5YTQwZWFkYzZkOWZmY2FlNjhhYTUxNmVlMDYuanBn.cache","vod_id":18955554,"title":"[Tin nóng ✅ Ảnh chụp riêng tư của người mẫu bị rò rỉ] Nữ sinh năm hai đại học Trùng Khánh kiếm thêm tiền bằng buổi chụp ảnh hàng đầu cho nhóm người mẫu, nhiếp ảnh gia sờ mó, vuốt ve và vạch vùng kín của cô, nhưng \"cậu nhỏ\" của cô ấy không được khỏe lắm.","lastmod":"2025-03-22","duration":"00:01:02","url":"/play/18955554.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvMmVhMDhiM2IwZGI4Y2VmMTZjNGIwNjFjYWZhMjJmNjQuanBn.cache","vod_id":19001860,"title":"MEYD-436 Tôi đến một nhà thổ không cung cấp dịch vụ tình dục và phát hiện ra cô tiếp viên là người hàng xóm xinh đẹp, kiêu kỳ của tôi. Tôi bắt quả tang cô ta và định xuất tinh vào trong cô ta! Tôi sẽ biến cô ta thành nô lệ tình dục của mình. Matsunaga Sana","lastmod":"2025-03-23","duration":"01:56:08","url":"/play/19001860.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvMThkYTYxYWIxOTNlYmI4ZmEzMTcwZmZiZTExZDNiYzAuanBn.cache","vod_id":18968204,"title":"Một nàng tiên cá trên bãi biển quyến rũ một người qua đường: \"Anh ơi, anh giỏi chuyện giường chiếu không? Em lạnh quá, và 'chỗ kín' của em ngứa quá.\" Người đàn ông: \"Ahhh, anh sắp xuất tinh rồi, xuất tinh vào trong em đi...thật là kích thích!\"","lastmod":"2025-12-14","duration":"00:11:30","url":"/play/18968204.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNjA1MTMvOTkwMmU1MjE5ODFkMjBjNzhjYzcyMTU3MTE5ZTY3NTcuanBn.cache","vod_id":19158413,"title":"Người mới bước chân vào ngành công nghiệp phim người lớn là một nữ sinh viên chất lượng cao, an toàn và khỏe mạnh, bị anh trai ruột quan hệ tình dục không dùng bao cao su - 3","lastmod":"2026-05-16","duration":"01:15:04","url":"/play/19158413.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTA5MDUvNmFhODU4N2JjZWUxMjA3NTQ4NzIxYTY1ZTE1NmQ5MWEuanBn.cache","vod_id":19049948,"title":"Sau khi LULU360 quan hệ tình dục với chồng và sinh con, bố chồng cô lập tức đưa dương vật khổng lồ của mình vào âm đạo cô, khiến tử cung cô thụ thai đúng vào ngày cô rụng trứng, và xuất tinh vào bên trong cô.","lastmod":"2025-09-04","duration":"02:40:04","url":"/play/19049948.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTEyMjMvZTk1NDk0M2I3ZjI0Mzg0ZmI1YjE5ZTA0M2I5YWFlYTUuanBn.cache","vod_id":19154071,"title":"Một cốt truyện hấp dẫn diễn ra khi một nữ sinh viên đại học tự nguyện chịu đựng sự quấy rối tình dục trong một cuộc phỏng vấn xin việc, cô rên rỉ và đạt cực khoái nhiều lần.","lastmod":"2026-04-18","duration":"19:50","url":"/play/19154071.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvYjJlNzIzYzZkYjI2N2JmNmE3MzNlOWQ1ZGZiYWUxZDUuanBn.cache","vod_id":18986559,"title":"Miku-Kanemura-Quan hệ tình dục ở trường","lastmod":"2025-12-14","duration":"00:10:54","url":"/play/18986559.html"}]},
videoTitle: 'Cô nữ sinh xinh xắn quyến rũ nhiếp ảnh gia để quan hệ tình dục.',
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=/`;
}
};
}