General Manager Zhao is looking for high-end escorts for 3000 yuan. They are all slim and attractive. I want to do them after seeing them.","lastmod":"2026-07-11","duration":"14:32","url":"/play/19161336.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvNDI2ZDE5ZTcxYzM2MzY1MTA4NmIwZWJlZWMyMGE0ZjcuanBn.cache","vod_id":18941322,"title":"Weibo influencer and young beauty [Mengmeng de Naihui & her best friend] rarely shows her face in a lively park outing, revealing a set of 54 photos and 1 video.","lastmod":"2025-12-14","duration":"00:00:47","url":"/play/18941322.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvMGRlNTM2NGFlYzg2ZTlmNDdjYjliMGYyNjE0OWQyYWEuanBn.cache","vod_id":18958635,"title":"Top-tier car model with a tall, devilish figure, clean white vulva, enjoys licking her pussy, and can ejaculate on her stomach in various challenging positions while showering and cleaning up the battlefield.","lastmod":"2025-12-14","duration":"01:52:08","url":"/play/18958635.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTEyMTUvMjBjYWFhNDJiZGIyOTk5MDEyNDE4Zjk1OTMxMjAyYTAuanBn.cache","vod_id":19134635,"title":"A stunningly beautiful internet celebrity with an amazing figure earns her living expenses by livestreaming from hotels.","lastmod":"2025-12-21","duration":"29:17","url":"/play/19134635.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvNGQ1MzhjZTljYTE0ZmIzZTYwZTlkMWY1YWFmM2U1YzAuanBn.cache","vod_id":18984945,"title":"FC2PPV 3852604 A cute girl with fair skin and a voluptuous figure works part-time at a taiyaki shop... On her way home, she wears a naked apron.","lastmod":"2025-12-14","duration":"00:35:14","url":"/play/18984945.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvOWQ3MTA4Njc3MmQ2NGJiYTE5MjBkN2ZlYTIwNTU3YTkuanBn.cache","vod_id":18952252,"title":"This sexy young woman is so hot and horny. She's pretty and got this guy to fuck her at home, giving her oral sex and a vibrator. She moaned and groaned, and he fucked her hard while she peed. So exciting and stimulating!","lastmod":"2025-12-14","duration":"00:24:13","url":"/play/18952252.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvNjViZDhjZjJjZmRiODRjNzE1NzQ3NjBlOGEzMjk3NmMuanBn.cache","vod_id":18973139,"title":"Young men are having a group sex session, with faces showing, deep throating, oral sex, and being thrust into by a huge penis. A pubic girl is being fucked to the point of ecstasy by a missionary who is brutally playing with her vagina.","lastmod":"2025-03-23","duration":"01:25:21","url":"/play/18973139.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvYmEyNGQxMTRkNGU2N2RlYjk2MjBlNzY2YWQ3ZWRkMGMuanBn.cache","vod_id":19011433,"title":"428SUKE006 A flood alarm is triggered due to vaginal leakage, and A-chan, a girl with blood type AB, visits! This mysterious girl has a voluptuous figure and a tight vagina, so just go ahead and fuck her! He inserts from behind, and right in front of him is a paradise of big butts and huge breasts!! Be careful of sudden ejaculation when engaging in immoral student sex while wearing a transparent uniform.","lastmod":"2025-03-24","duration":"01:13:36","url":"/play/19011433.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvYWQwYjg2YzMwNGExYTIyMTEwOWFjM2I1OGM0NTRjYzMuanBn.cache","vod_id":18974924,"title":"The bespectacled model girlfriend's face is shown; her boyfriend picks her up, spreads her legs, and gives a close-up of her pink vulva, then performs deep throat penetration. Her pink, tender vulva is so sensitive that he ejaculates inside her after only a few thrusts.","lastmod":"2025-03-23","duration":"00:38:48","url":"/play/18974924.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTA2MTUvNTlkYWE0NmU1NTc5ZGVkYzY5Zjk5ZTdmNjIzZjE2MjMuanBn.cache","vod_id":19038570,"title":"Two women were fucked early in the morning, their faces were on full display. Two slutty girls and a guy took turns fucking and rubbing their breasts in front of the window, with the curtains not even closed and they weren't afraid of being seen. Don't miss this exciting show.","lastmod":"2025-06-15","duration":"01:02:05","url":"/play/19038570.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvZTIwNjBlNWM3MTk2YTA1MGMzMzI2NTY2YzNjYzZjOWEuanBn.cache","vod_id":18939780,"title":"A female dog born in 2001, with a slim waist and good figure, her bark is enough to make you ejaculate.","lastmod":"2025-12-14","duration":"00:05:04","url":"/play/18939780.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNjA1MTMvZWIyOTZhZGVmNTUxN2U4ZWM4OTc4Y2I5ODIyZTAzMDEuanBn.cache","vod_id":19162960,"title":"","lastmod":"2026-07-11","duration":"11:10","url":"/play/19162960.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvOWY5MDk2YTA0YTA4MWUzY2Y5NDA5MWQxZDYxODk4Y2UuanBn.cache","vod_id":19004411,"title":"Yang Mi, wearing gold cat-patterned black stockings and high heels, with a stunning figure.","lastmod":"2025-03-23","duration":"02:05","url":"/play/19004411.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvODVkYmU2MmYzNTc4YjlhODQxMjE2NmEzZjhiNGE1NmYuanBn.cache","vod_id":18939308,"title":"[Married Woman Series] High-value, top-quality married woman with self-purchased internal ejaculation. She's very beautiful, has a great figure, and is quite slutty. Her moans are very pleasant. She does oral sex, slapping, and after internal ejaculation, she licks out the semen and stimulates the anus. 1080P HD.","lastmod":"2025-12-14","duration":"00:16:12","url":"/play/18939308.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvNTExMDY0NjJmNzEwZTdkYzdkMTNhNDczOGFhZTM1MzEuanBn.cache","vod_id":18957750,"title":"Huya Xiao Reba, a new high-value girl, engages in sex with two girls using props, including oral sex in lingerie and fishnet stockings, riding position, and mutual penetration with vibrating eggs and dildos.","lastmod":"2025-03-22","duration":"03:07:20","url":"/play/18957750.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvODkxNTAxYmJkMzU5NzI5ODczZDJlNGZmMjZhMjQ3OTguanBn.cache","vod_id":19001517,"title":"[Female Slave Zhang Wanyi] A master trains a beautiful female slave, piercing her nipples, whipping her vagina, and electrocuting her!","lastmod":"2025-03-23","duration":"24:22","url":"/play/19001517.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvZGM3NDVkYjcxZDAyYjA0NTczYjRiMTc1MDZmMmNjYTYuanBn.cache","vod_id":18987471,"title":"[Uncut Version] BF-232 Flight Attendant Miwako: Pain, Orgasm, Incontinence... Miwako Yamamoto","lastmod":"2025-12-14","duration":"02:28:59","url":"/play/18987471.html"}]},
videoTitle: 'Showing your face is key; a certain airline flight attendant has the highest figure and looks.',
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=/`;
}
};
}