A badass guy targeted his friend. Nightclub girls are hard to get dates with lately, so he resorted to tricking his friend into playing truth or dare, eventually grabbing his hair and giving him a good beating.A badass guy targeted his friend. Nightclub girls are hard to get dates with lately, so he resorted to tricking his friend into playing truth or dare, eventually grabbing his hair and giving him a good beating.","lastmod":"2026-07-11","duration":"46:31","url":"/play/19154451.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzEvMGQ3OGI5NTRiN2FjMjU1M2ZjMjk5MzY1OWQ4NTEzODMuanBn.cache","vod_id":18975248,"title":"A Russian girl gave herself to me to celebrate my birthday.","lastmod":"2025-03-28","duration":"19:33","url":"/play/18975248.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzEvMGEyZDhhZDc0MDc0YTM0OTIwOTQ1Y2U1ZmZhN2NkMzUuanBn.cache","vod_id":19042152,"title":"A private cinema scene features a woman in a onesie wearing black stockings and a mask, wearing a dildo and riding on top, with her legs lifted onto her shoulders and then being fucked from behind. A vibrator is used to play with her, rotating her rapidly.","lastmod":"2025-03-29","duration":"44:47","url":"/play/19042152.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNjA1MTMvNjZmYzZkOWMyMzM3ZWVmOWI0NzlkNmU5OWMwYmRjNTUuanBn.cache","vod_id":19146224,"title":"A very horny, short-haired girl who gets wet easily is being fucked; her breasts are shaking, the scene is beautiful, but she doesn't moan and keeps looking at her phone.","lastmod":"2026-05-29","duration":"36:22","url":"/play/19146224.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzEvYzQ3YTViYzg2MzE1NjliMWUyMGZlZmRhOGNiMmZiY2QuanBn.cache","vod_id":18986485,"title":"A voluptuous woman was violently penetrated by an older man.","lastmod":"2025-03-28","duration":"43:07","url":"/play/18986485.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzEvMDUxZDVkMDZhMzA1NzdkYjU4NDIyZGU4ODQ4YmU2MjYuanBn.cache","vod_id":19012166,"title":"I arranged to have a threesome with two sexy girls in white dresses, and one vibrator kept them thoroughly entertained.","lastmod":"2025-03-28","duration":"24:40","url":"/play/19012166.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTEyMjMvMzI0NWE5Yjk2NDQxNDczYzc0NDhjOTFlOThiNTZkYWUuanBn.cache","vod_id":19137367,"title":"The photographer of Fengyin Birdsong's new work uses various SM techniques to train the Chinese model Susu, who begs for mercy and says no more. The old routine of interrogation and penetration is followed by shooting.","lastmod":"2026-04-16","duration":"01:02:51","url":"/play/19137367.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNjA2MTMvYjVmOWI4NzM5OTY4NjA3MGI5ODNlNzdjMzQ1M2UzMzAuanBn.cache","vod_id":19149000,"title":"Not here! Ahh, husband, husband, you haven't ejaculated yet! I still want more! My pussy is itchy! Come on, let me taste it! Two girls are being taken turns being penetrated and having their semen sucked, moaning and screaming.","lastmod":"2026-06-12","duration":"21:14","url":"/play/19149000.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzEvYzNmMzhkNzUzNGM0MzVkMWQwMmU2ZTBkNGVkMmQxZjMuanBn.cache","vod_id":18990006,"title":"The girl's seductive poses were incredibly alluring.","lastmod":"2025-03-28","duration":"02:53","url":"/play/18990006.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzEvNDg0ODg3ZGY2YjUyYTBlMjhkYzE1ZDBlYTg3YTZjNDYuanBn.cache","vod_id":19037838,"title":"Mirror Hard Cooks New Year Filming: Lazy Girl Loses and Can't Wait to Go to Bed Immediately! Baseball Fist Battle! - Starring Kotone, Hirose Miki, Ichikawa Aima, etc.","lastmod":"2025-03-29","duration":"04:56:13","url":"/play/19037838.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzEvZTc3Y2FiNDQ0ZjhjMDFlYWE3MzhjZDRmZmJhZGVmMGMuanBn.cache","vod_id":18960520,"title":"A stunningly beautiful girl from Guangdong was secretly filmed having sex with her boyfriend.","lastmod":"2025-03-28","duration":"26:24","url":"/play/18960520.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTEyMjMvOGI2NGIzNTI3ZmVmOWExNjc1NzUxZjk4MTgzNDdhNWEuanBn.cache","vod_id":19140407,"title":"Never do this! A secret fertility treatment to prolong fertility at a high-end male rejuvenation salon in Tokyo! \"If I'm rejected, I...\" (Big Mocal)","lastmod":"2026-05-01","duration":"04:00:19","url":"/play/19140407.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzEvMzg2ZTIwNzZmZTkyOTdmOTcxNTI0NDdjOWI3ZjI3YWIuanBn.cache","vod_id":19032301,"title":"The target is a female employee of an underwear manufacturer with J-cup breasts! The 7th installment of the harassment video featuring the busty harassing girl \"Mizuhara Mie\".","lastmod":"2025-03-29","duration":"02:07:04","url":"/play/19032301.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzEvMDUwYTdhZjMyZWYwODIwYjJkMmJjZDQxMDcwNGZjYzYuanBn.cache","vod_id":18974604,"title":"A pretty girl gave me oral sex and made me blowjob.","lastmod":"2025-03-28","duration":"11:32","url":"/play/18974604.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTEyMjMvZDAwNTZlZDBmYmM0NWZlMDY3MTU1Njk4MTZmZGYyZDEuanBn.cache","vod_id":19131680,"title":"A pure and innocent girl met a patron who knew how to make her orgasm and directly targeted her heart.","lastmod":"2026-03-19","duration":"37:07","url":"/play/19131680.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzEvZWY1ZjcwMGVkYzMwNjRlMGZlYWY1ZGFlNWU0NGI3MzEuanBn.cache","vod_id":19039539,"title":"During a bikini-clad oil massage where touching is strictly prohibited, the masseur couldn't resist and secretly touched her! Although he firmly refused, saying, \"We're not that kind of shop,\" I still couldn't resist...","lastmod":"2025-03-29","duration":"03:02:46","url":"/play/19039539.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNjA2MzAvNzJkYWU4YWY0Y2M4MGViMmY1MGI0NjBhNmRlMzRkYzEuanBn.cache","vod_id":19152559,"title":"What a beautiful girl! Such elegant hair! She wore a long black dress and followed me onto the bus. I've already prepared three days' worth of craft beer for her.","lastmod":"2026-06-29","duration":"00:00:32","url":"/play/19152559.html"}]},
videoTitle: 'The girl refused to return the money, leading to an argument.',
language: 'en',
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('Link copied!');
}).catch(() => {
// 降级到旧方法
document.execCommand('copy');
alert('Link copied!');
});
} else {
// 降级到旧方法
document.execCommand('copy');
alert('Link copied!');
}
}
},
// 切换布局
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=/`;
}
};
}