Jeune écolière pulpeuse, voluptueuse et incroyablement mignonne, avec une silhouette parfaite.","lastmod":"2026-07-11","duration":"26:16","url":"/play/19166851.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvMjY0NTViNjM2OWEyZTRkNjBkNTk4OTZiZGFlNTQwOGYuanBn.cache","vod_id":18992975,"title":"KTKZ-051 Étudiante de 36 ans à forte poitrine 1","lastmod":"2025-03-23","duration":"02:30:07","url":"/play/18992975.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvMGM4ZjIyOWZhNDYwYTYwZGNjOTRlNDViN2UyMDNhM2EuanBn.cache","vod_id":19006541,"title":"CHRV-076 La légende des seins géants ! À voir absolument ! Rina","lastmod":"2025-03-24","duration":"02:30:12","url":"/play/19006541.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvNzdhZWM1Y2NiZGU2NTQzOGFmZjM4ZTBhOTBmMDhhYTQuanBn.cache","vod_id":18945027,"title":"HND-195 Une beauté aux seins absolument énormes, un véritable gâteau à la crème interdit ! Hoshizora Moeya","lastmod":"2025-12-14","duration":"02:40:08","url":"/play/18945027.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTA3MTUvOWNkZDVkM2Y4Mzc2YzNmZTM3NjNkZmJkNDU0MTg4ZDQuanBn.cache","vod_id":19043186,"title":"DVMM224 Surveillance AV standard homme/femme - Réservé aux étudiantes à forte poitrine ! Sexe les yeux bandés avec 10 pénis en parallèle.","lastmod":"2025-07-14","duration":"03:57:15","url":"/play/19043186.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTA2MjUvNjU4OTg2YmJjYWFlNGZlMTAxNjAxNDQ0ZmRjNWFkZDkuanBn.cache","vod_id":19039801,"title":"GVH748 « On se fait un autre orgasme avec maman aujourd'hui… ? » Coincé à côté de sa mère plantureuse qui a un amour inhabituel pour lui, il a une érection tous les jours.","lastmod":"2025-06-24","duration":"02:41:53","url":"/play/19039801.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvZDlhYTRkN2VkMzM2NWRjOTRiODcyMTcwYzVlOGUwNTcuanBn.cache","vod_id":18970009,"title":"SSNI-362 Douce et attentionnée, elle restera à votre service jusqu'à ce que vous ayez vraiment envie de coucher avec elle ! Ayami Haruka, hôtesse de bar aux gros seins ondulants.","lastmod":"2025-12-14","duration":"01:58:28","url":"/play/18970009.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvNDAzODUwMmUxZGFlNzJmZDU0ZDczZDI2NGExMjdjZTEuanBn.cache","vod_id":18955051,"title":"[Haute Qualité ✅ Acheté à Prix Élevé] Modèle Rare et Haut de Gamme du Sun and Moon Club [Ayan] - Séance d'aérobic nue - Bas noirs transparents et body - Réservoir d'eau mort, fichier original sans eau - Bas noirs","lastmod":"2025-12-14","duration":"00:17:04","url":"/play/18955051.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTEwMjMvMTNlZDU5Nzk1MzAwYzg3ZDFhNWMyYjNlMjU3MDIxZjcuanBn.cache","vod_id":19059094,"title":"Tutoriel de Boin sur les gros seins - Épisode 1","lastmod":"2025-10-22","duration":"28:08","url":"/play/19059094.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvZWM5ZWRhZjliY2UxZTBmNjQ1ZmE1NWZlNDdiZThjNDMuanBn.cache","vod_id":18945296,"title":"Une vidéo de sexe payante d'un couple chinois récemment devenue populaire sur Pornhub - mettant en scène une protagoniste féminine au corps de tigre blanc et un protagoniste masculin fétichiste du travestissement, proposant diverses techniques, notamment des rapports sexuels non protégés, des levées de jambes et une pénétration intense en haute définition 1080p originale.","lastmod":"2025-12-14","duration":"00:31:33","url":"/play/18945296.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvM2QwNzM4Y2Q3YzQ1NzFiZWEzM2U2ODQyZWZiZjBmNDYuanBn.cache","vod_id":19008369,"title":"Le service de bien-être de MIDE495 pour les seins fermes et volumineux ! Jeux de seins souriants, gommage doux des seins, nettoyage discret du pénis, hôtesse de sauna JULIA.","lastmod":"2025-03-24","duration":"01:57:26","url":"/play/19008369.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNjA2MjMvMjI1MDdiZmZjZmI4ZDg0NTVjZmYyNWRkYTBjNGU4MWMuanBn.cache","vod_id":19164759,"title":"Instructrice de fitness masochiste aux gros seins qui gicle (2) Minako Takemae Toyohiko","lastmod":"2026-07-11","duration":"02:04:28","url":"/play/19164759.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvN2YxZjNkNmEwMThlZWRhNTE3OTI2ZWVlNzI4NjM2YjcuanBn.cache","vod_id":18984483,"title":"[Non censuré] FPRE-032 Une jeune fille aux longs cheveux noirs et au visage angélique cherche à se faire plaisir après les cours. Nanase Ran, une jeune fille aux formes généreuses qui cache son identité sur les réseaux sociaux.","lastmod":"2025-03-23","duration":"02:37:31","url":"/play/18984483.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvYzI5NWVlOTYzZGYwMGM1MTM2NGFkNTQxMGM4ZDdhYmIuanBn.cache","vod_id":18927261,"title":"La plateforme « Little Cute » (anciennement Kawaii) met en scène une streameuse mature et très prisée nommée Qimaomao qui facture des frais pour exhiber sa silhouette et se livrer à des actes de masturbation et de pénétration vaginale extrêmement obscènes.","lastmod":"2025-12-14","duration":"00:59:48","url":"/play/18927261.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvZTBhYWU0ZGIwNzFkNTE4OTI5ZjhlYmM1NTM1MTYyZDEuanBn.cache","vod_id":18932632,"title":"GQR-26 Les farces obscènes d'un garçon à forte poitrine BESTREMIX 1","lastmod":"2025-12-14","duration":"01:59:35","url":"/play/18932632.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvOTNiNTI1OGEwOGE4NTMxYWU1YjExYmVmYmM0MGI1MWMuanBn.cache","vod_id":19017121,"title":"NHDTB294 Une femme sensible qui prend tellement de plaisir à se faire lécher l'oreille et à se faire tripoter les tétons par derrière qu'elle ne peut plus se tenir debout – une athlète, une employée de bureau aux formes généreuses, une étudiante.","lastmod":"2025-03-24","duration":"01:57:26","url":"/play/19017121.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvNmUwZDM0M2IxNjI3N2JhYWM0MGJlMDNkZjZkMTExNTUuanBn.cache","vod_id":19012742,"title":"MDBK079 Recherche de donneurs de sperme pour lutter contre la baisse de la natalité ! Nous recrutons des donneurs de sperme masculins pour un programme de bénévolat de soutien à l'éjaculation chez les femmes à forte poitrine.","lastmod":"2025-03-24","duration":"02:43:38","url":"/play/19012742.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTA3MTcvNWUyODJiNWQzYzU0YmMwNTVjODlhNzM3YjQwMzQ2Y2QuanBn.cache","vod_id":19043305,"title":"FPRE151 Une PDG fière est ligotée et humiliée comme une chienne ; un entraînement SM sournois transforme une femme aux formes généreuses en une bête…","lastmod":"2025-07-16","duration":"02:36:08","url":"/play/19043305.html"}]},
videoTitle: 'Une présentatrice de journal télévisé sud-coréenne aux formes généreuses a exécuté une danse provocante comme on le lui avait demandé !',
language: 'fr',
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('Lien copié !');
}).catch(() => {
// 降级到旧方法
document.execCommand('copy');
alert('Lien copié !');
});
} else {
// 降级到旧方法
document.execCommand('copy');
alert('Lien copié !');
}
}
},
// 切换布局
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=/`;
}
};
}