Fui a um hotel com uma garçonete que era elogiada por sua beleza e corpo sensual. Tentei atrair a garçonete casada com gorjetas... 4 horas. (Mud Stick Cat - Emaniel)","lastmod":"2026-07-11","duration":"","url":"/play/19267950.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTA0MDIvMjQ2MDZkZWQyY2U1OWUxNGZiMWEwOWEzZDJlMjFlZWYuanBn.cache","vod_id":19195144,"title":"Hospitalidade - mulheres que desejam sêmen espesso.","lastmod":"2025-04-02","duration":"0:00:05","url":"/play/19195144.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzEvZDhkMTUwMGU0ODJlYTk3NzZiZWU2Yjc5MGQwZDcxNGIuanBn.cache","vod_id":19071631,"title":"APKH-190 Fornecedora de beleza com seios grandes, sexo erótico em hotel em primeira pessoa. Eu adoraria lamber seu sêmen e bebê-lo... A garota de programa Reona Tomiyasu, de 26 anos, é uma vadia com seios tamanho H.","lastmod":"2025-03-29","duration":"2:20:43","url":"/play/19071631.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzEvY2MyOWMwNGE0OTgzNzg2MzU3NDA4M2JmZTc2YjUyMTcuanBn.cache","vod_id":19057721,"title":"[Resumido] DDHH-008 Eu só quero experimentar usar o corpo da garota que trocou de lugar comigo com um afrodisíaco de transformação feminina, só uma vez!! Mizuki Nagisa","lastmod":"2025-03-29","duration":"2:00:19","url":"/play/19057721.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzEvMzE0MzQyYTA1OTBhMzFmNjM0YzgwYTY0ZTRiMTg0NTAuanBn.cache","vod_id":19086564,"title":"-zipai- [Encontro] Uma mulher rica e bonita é disciplinada por uma janela do chão ao teto em um hotel de luxo. Ela está usando meias brancas e sendo fodida até atingir o êxtase.","lastmod":"2025-03-29","duration":"0:27:55","url":"/play/19086564.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNjA1MTMvOTc2OWMzMGNlNTVjYzhiNTRmMGJkMThjOWVjMWJlZjkuanBn.cache","vod_id":19260272,"title":"Uma atleta de atletismo foi injetada com um afrodisíaco por um treinador cruel em um campo de treinamento; suas nádegas em formato de pêssego tremeram sob a pressão física e ela teve um orgasmo. (Amasawa Rin MOODYZ)","lastmod":"2026-05-23","duration":"1:59:23","url":"/play/19260272.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzEvZWRlNzM1OWEwNWM5YzYyMDVjZDE3NTFkM2VkZDk2ZjEuanBn.cache","vod_id":19188585,"title":"Garota de avental nua KAORUI.","lastmod":"2025-03-30","duration":"1:57:23","url":"/play/19188585.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTEyMjMvMmRkNzFhNDEzYzRiNTRiZWE3YzU2NTlkZDFlOWI1MDUuanBn.cache","vod_id":19240152,"title":"Versão completa do registro integral da depravação e treinamento da colega deusa","lastmod":"2026-01-17","duration":"0:48:55","url":"/play/19240152.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTA2MTYvM2NhYjUzMWUxMDUwMWE4ZTQ3MDI2NzhjNDUzODg2MmMuanBn.cache","vod_id":19208061,"title":"Num dia chuvoso, a sensual J○ ficou excitada quando um homem contemplou seus seios úmidos, translúcidos e belos pela primeira vez.","lastmod":"2025-06-16","duration":"1:58:48","url":"/play/19208061.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzEvZWZmYTY0ZDM2YjQxNjQzZjRjMDM5ZWFkZmI0YTY0ZDMuanBn.cache","vod_id":19125482,"title":"Fiquei fascinado pelos seus belos seios tamanho E e, depois da aula, tivemos uma relação sexual primitiva em um hotel da cidade... (Novato descoberto)","lastmod":"2025-03-29","duration":"2:01:48","url":"/play/19125482.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzEvZWYyZDQwMWRiMzE2ZWU2MGRhZTgyOWE4YmYwZWM5NzQuanBn.cache","vod_id":19130430,"title":"Uma linda mulher madura que se recusa a fazer sexo é penetrada sem camisinha, ficando ensopada e recebendo um jato de esperma!","lastmod":"2025-03-29","duration":"2:01:02","url":"/play/19130430.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzEvMGY0YjAzOWQwZDU4ZDVjNDUwOWUxNjczZWYzOWYzYzQuanBn.cache","vod_id":19104833,"title":"[Análise HD] ma435MFCS-040 [Sexo primitivo no mesmo dia com uma garota voluptuosa cujos seios são tão grandes que até mesmo um pênis totalmente ereto fica enterrado dentro deles]","lastmod":"2025-03-29","duration":"1:17:01","url":"/play/19104833.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzEvNWE0M2QwZjE0NWUwZmJhY2QwNjI5ODc4NDkxNWY2NjMuanBn.cache","vod_id":19045246,"title":"Projeto Especial Amador de Jato! Primeiro Jato de uma Garota Gostosa de Biquíni, Ejaculações Múltiplas! Essa garota sem muita força de vontade se sentiu tão bem durante uma massagem com óleo que não resistiu à penetração!","lastmod":"2025-03-28","duration":"1:58:42","url":"/play/19045246.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzEvNWY5ZWUzYzRhM2FkNjRmMGI4ZTI2MzdkNmIxMDhkYjQuanBn.cache","vod_id":19060020,"title":"300MAAN-503 convence com seriedade uma líder de torcida fofa de rabo de cavalo! Ao contrário de sua aparência séria e arrumada, ela adora sexo oral sem proteção, chupar pênis e depois sexo com os seios! Ela tem seios lindos e macios, tamanho F, e uma bunda redonda e carnuda que balança quando ela se contorce e ejacula loucamente! Implorando por sexo!","lastmod":"2025-03-29","duration":"1:02:08","url":"/play/19060020.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzEvMzFlNWY1NzEwZmIyZjY2MjlkYzk2YzcyNTg2NDUxZTMuanBn.cache","vod_id":19081859,"title":"Uma nova atriz de novela me fez sexo oral rapidinho, e depois eu ejaculei dentro dela.","lastmod":"2025-03-29","duration":"0:57:57","url":"/play/19081859.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTEyMjMvNDYyNDM3YmJiOTUxY2U1MjkxZDBjYmQ4MTVkZDk0MTAuanBn.cache","vod_id":19242258,"title":"A esposa expõe as nádegas e chupa o pênis de outro homem. O marido pervertido fica excitado ao ver as nádegas enormes e balançando, desejando desesperadamente engravidá-la com seu pênis extremamente grosso, seus delírios quase explodindo. (DVEH-067)","lastmod":"2026-01-30","duration":"2:32:48","url":"/play/19242258.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTEyMjMvNDcxNjNkYjAwOWQwYTIzMmUxOWFmMTcyNDc4MmZjNzQuanBn.cache","vod_id":19252075,"title":"DNIA-006 - Vazado: Assassina, Bondage Lasciva, Inferno de Formigas-Leão, Ato VI: Corpo Feminino Derretendo e Gritos Insanos, Linda Agente Casada, Makoto - CD4","lastmod":"2026-04-02","duration":"0:44:25","url":"/play/19252075.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzEvNDRhZjNjZThiN2I5YzZhMTQ3OTNjMTg0MGMzMzI1MDguanBn.cache","vod_id":19116451,"title":"A vontade de ejacular","lastmod":"2025-03-29","duration":"0:39:44","url":"/play/19116451.html"}]},
videoTitle: 'O corpo de MUDR320 fica encharcado só de fantasias... Uma linda garota masoquista que quer ser amarrada e disciplinada.',
language: 'pt',
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 copiado!');
}).catch(() => {
// 降级到旧方法
document.execCommand('copy');
alert('Link copiado!');
});
} else {
// 降级到旧方法
document.execCommand('copy');
alert('Link copiado!');
}
}
},
// 切换布局
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=/`;
}
};
}