유틸)유저스크립트-썸네일&본문 이미지 허용/비허용
s/all에서 썸네일 구경하다가 눈갱 당해서 만들었습니다
기존에 사용하던 썸네일 크기조절 코드에 추가된거라 이부분이 싫으시다면 AI를 활용해 보세요
기본적으로 모든 서브의 이미지와 본문은 비활성화 상태가 됩니다
우측에 서브 정보 하단부에 스위치가 추가됩니다
이렇게 허용 스위치를 켜지 않는다면
게시물에 호버했을때 썸네일이 나오지 않고
본문에 들어갔을때
선제적으로 본문 전체를 블러 처리하고 모든 이미지에 블러 처리 완료되면 본문 블러를 비활성화 합니다(이미지만 블러됨)
아까 말한 스위치를 이 상태에서 활성화시 이미지에 블러는 제거됩니다
s/all에서는 허용한 서브 목록들을 끌수만 있으며 추가는 직접 서브에 방문해야합니다
클로드 AI 활용해서 만든 코드이며, 더 좋은 코드를 위해 마음대로 재 가공 하셔도 좋습니다 MIT
코드
// ==UserScript==
// @name Kone.gg 썸네일 크기조정 및 허용 서브 관리
// @namespace http://tampermonkey.net/
// @version 1.0
// @description 본문 썸네일 + 미리보기 호버 썸네일 크기 통합 조정, SPA 대응, 서브별 미리보기/본문이미지 허용 관리
// @author cloud67p
// @match https://kone.gg/*
// @grant GM_getValue
// @grant GM_setValue
// @run-at document-end
// ==/UserScript==
(function () {
'use strict';
/* =========================
설정
========================= */
const STORAGE_KEY_WIDTH = 'thumbnail-width';
const STORAGE_KEY_HEIGHT = 'thumbnail-height';
const STORAGE_KEY_ALLOWED = 'preview-allowed-subs';
const DEFAULT_WIDTH = 500;
const DEFAULT_HEIGHT = 500;
const PREVIEW_MARGIN = 12;
const MIN_SCALE = 0.55;
const MAX_SCALE = 1.2;
const SCALE_MIN_VIEWPORT_WIDTH = 360;
const SCALE_MAX_VIEWPORT_WIDTH = 1920;
const SWITCH_ID = 'kone-preview-switch-container';
const ALLOWED_CHANGE_EVENT = 'kone-allowed-subs-changed'; // ★ 추가
let cachedScale = null;
const BLUR_AMOUNT = '20px'; // ★ 여기서 통합 조절
function getViewportScale() {
if (cachedScale !== null) return cachedScale;
const vpW = window.innerWidth || SCALE_MIN_VIEWPORT_WIDTH;
const normalized = (vpW - SCALE_MIN_VIEWPORT_WIDTH) / (SCALE_MAX_VIEWPORT_WIDTH - SCALE_MIN_VIEWPORT_WIDTH);
const t = Math.max(0, Math.min(1, normalized));
cachedScale = MIN_SCALE + (MAX_SCALE - MIN_SCALE) * t;
return cachedScale;
}
/* =========================
서브 허용 목록 관리
========================= */
function getAllowedSubs() {
try { return JSON.parse(GM_getValue(STORAGE_KEY_ALLOWED, '[]')); }
catch (e) { return []; }
}
function isSubAllowed(subName) {
if (!subName) return false;
return getAllowedSubs().includes(subName.toLowerCase());
}
// ★ setSubAllowed: 저장 후 커스텀 이벤트 발행
function setSubAllowed(subName, allowed) {
const list = getAllowedSubs();
const name = subName.toLowerCase();
const idx = list.indexOf(name);
if (allowed && idx === -1) list.push(name);
if (!allowed && idx !== -1) list.splice(idx, 1);
GM_setValue(STORAGE_KEY_ALLOWED, JSON.stringify(list));
// 변경 이벤트 발행 → 구독 중인 UI가 즉시 갱신
window.dispatchEvent(new CustomEvent(ALLOWED_CHANGE_EVENT, {
detail: { sub: name, allowed }
}));
}
function getCurrentSub() {
const match = location.pathname.match(/^\/s\/([^/]+)/);
if (!match) return null;
const sub = match[1].toLowerCase();
return sub === 'all' ? null : sub;
}
function getSubFromCard(postWrapper) {
const links = postWrapper.querySelectorAll('a[href*="/s/"]');
for (const link of links) {
const m = link.getAttribute('href').match(/\/s\/([^/]+)/);
if (m && m[1].toLowerCase() !== 'all') return m[1].toLowerCase();
}
return null;
}
/* =========================
본문 이미지 차단/복원 (Shadow DOM 대응)
========================= */
const EARLY_BLOCK_STYLE_ID = 'kone-early-post-block';
const EARLY_BLOCK_RELEASE_ID = 'kone-early-post-block-release';
const SHADOW_STYLE_ID = 'kone-shadow-img-block';
function applyEarlyPostBlock() {
if (document.getElementById(EARLY_BLOCK_STYLE_ID)) return;
const style = document.createElement('style');
style.id = EARLY_BLOCK_STYLE_ID;
style.textContent = `
#post_content,
#post_content + *,
main,
.grow.flex.flex-col,
article {
filter: blur(${BLUR_AMOUNT}) !important;
transition: none !important;
pointer-events: none !important;
user-select: none !important;
}
`;
document.head.appendChild(style);
}
function removeEarlyPostBlock() {
const style = document.getElementById(EARLY_BLOCK_STYLE_ID);
if (!style) return;
const releaseStyle = document.createElement('style');
releaseStyle.id = EARLY_BLOCK_RELEASE_ID;
releaseStyle.textContent = `
#post_content,
#post_content + *,
main,
.grow.flex.flex-col,
article {
filter: none !important;
transition: filter 0.15s ease !important;
}
`;
document.head.appendChild(releaseStyle);
style.remove();
setTimeout(() => {
document.getElementById(EARLY_BLOCK_RELEASE_ID)?.remove();
}, 200);
}
// ★ display:none 버전 제거하고 blur 버전으로 통합
function applyPostImageBlock(allowed) {
const postContent = document.getElementById('post_content');
if (!postContent) return;
const shadow = postContent.shadowRoot;
if (!shadow) return;
const existing = shadow.querySelector(`#${SHADOW_STYLE_ID}`);
if (existing) existing.remove();
if (!allowed) {
const style = document.createElement('style');
style.id = SHADOW_STYLE_ID;
style.textContent = `
img {
filter: blur(${BLUR_AMOUNT}) !important;
transition: none !important;
}
.image-wrapper {
filter: blur(${BLUR_AMOUNT}) !important;
transition: none !important;
}
`;
shadow.appendChild(style);
}
}
function applyPostImageForCurrentPage() {
const sub = getCurrentSub();
const isPostPage = /^\/s\/[^/]+\/.+/.test(location.pathname);
if (!isPostPage) {
removeEarlyPostBlock();
return;
}
const allowed = sub ? isSubAllowed(sub) : false;
if (!allowed) {
applyEarlyPostBlock();
} else {
// 허용: 전체 블러 해제 + shadow 이미지 blur도 즉시 제거
removeEarlyPostBlock();
const postContent = document.getElementById('post_content');
postContent?.shadowRoot?.querySelector(`#${SHADOW_STYLE_ID}`)?.remove();
return;
}
let tries = 0;
const tryApply = () => {
const postContent = document.getElementById('post_content');
if (postContent && postContent.shadowRoot) {
applyPostImageBlock(allowed);
removeEarlyPostBlock();
} else if (tries++ < 20) {
setTimeout(tryApply, 200);
} else {
removeEarlyPostBlock();
}
};
tryApply();
}
(function immediatePostBlock() {
const isPostPage = /^\/s\/[^/]+\/.+/.test(location.pathname);
if (!isPostPage) return;
const sub = location.pathname.match(/^\/s\/([^/]+)/)?.[1]?.toLowerCase();
if (!sub || sub === 'all') return;
try {
const allowed = JSON.parse(GM_getValue('preview-allowed-subs', '[]'));
if (!allowed.includes(sub)) {
applyEarlyPostBlock();
}
} catch (e) {
applyEarlyPostBlock();
}
})();
/* =========================
사이드바 스위치
========================= */
function tryInsertSwitch() {
const isAll = /^\/s\/all(\/|$)/.test(location.pathname);
const subName = getCurrentSub();
const existing = document.getElementById(SWITCH_ID);
if (existing) existing.remove();
if (!subName && !isAll) return;
const subText =
[...document.querySelectorAll('*')].find(el =>
el.children.length === 0 && el.textContent.includes('관리 로그')
) ||
[...document.querySelectorAll('*')].find(el =>
el.children.length === 0 && el.textContent.includes('구독중')
);
const innerPad = subText?.closest('div[class]')?.parentElement;
if (!innerPad) return;
const container = document.createElement('div');
container.id = SWITCH_ID;
container.style.cssText = 'margin-top:12px; padding-top:12px; border-top:1px solid #d4d4d8;';
const isDark = document.documentElement.classList.contains('dark');
if (isDark) container.style.borderTopColor = '#52525b';
innerPad.appendChild(container);
updateSwitchUI(container, subName, isAll);
// ★ 전역 단일 리스너 — 컨테이너 교체와 무관하게 항상 유효
window.addEventListener(ALLOWED_CHANGE_EVENT, () => {
const container = document.getElementById(SWITCH_ID);
if (!container) return;
const isAll = /^\/s\/all(\/|$)/.test(location.pathname);
const subName = getCurrentSub();
updateSwitchUI(container, subName, isAll);
if (isAll) cleanupPreview();
});
}
function updateSwitchUI(container, subName, isAll) {
container.innerHTML = '';
const title = document.createElement('div');
title.style.cssText = 'font-size:13px; margin-bottom:8px;';
title.className = 'text-zinc-600 dark:text-zinc-400';
title.textContent = '이미지 미리보기 / 본문';
container.appendChild(title);
if (isAll) {
// ★ 매번 최신 목록을 읽어서 렌더링
const allowedSubs = getAllowedSubs().sort();
if (allowedSubs.length === 0) {
const empty = document.createElement('div');
empty.style.cssText = 'font-size:11px; color:#a1a1aa;';
empty.textContent = '허용된 서브가 없습니다.';
container.appendChild(empty);
} else {
allowedSubs.forEach(sub => container.appendChild(makeSubRow(sub, container, true)));
}
} else {
container.appendChild(makeSubRow(subName, container, false));
const labelEl = document.createElement('div');
labelEl.id = 'kone-preview-label';
labelEl.style.cssText = 'font-size:11px; margin-top:4px; color:#a1a1aa;';
labelEl.textContent = isSubAllowed(subName)
? '허용됨 — 미리보기 및 본문 이미지가 표시됩니다.'
: '비허용 — 미리보기 및 본문 이미지가 차단됩니다.';
container.appendChild(labelEl);
}
}
function makeSubRow(sub, container, isAll) {
const row = document.createElement('div');
row.style.cssText = 'display:flex; align-items:center; justify-content:space-between; gap:8px; margin-bottom:6px;';
const label = document.createElement('span');
label.style.cssText = 'font-size:12px;';
label.className = 'text-zinc-500 dark:text-zinc-400';
label.textContent = `s/${sub}`;
const btn = document.createElement('button');
btn.style.cssText = `
position:relative; display:inline-flex; align-items:center;
width:40px; height:22px; border-radius:9999px; border:none;
cursor:pointer; transition:background 0.2s; flex-shrink:0; padding:0;
`;
btn.setAttribute('aria-label', `${sub} 이미지 허용 토글`);
const knob = document.createElement('span');
knob.style.cssText = `
position:absolute; width:16px; height:16px; border-radius:50%;
background:white; box-shadow:0 1px 3px rgba(0,0,0,0.3); transition:left 0.2s;
`;
btn.appendChild(knob);
const applyState = () => {
const allowed = isSubAllowed(sub);
btn.style.background = allowed ? '#f97316' : '#a1a1aa';
knob.style.left = allowed ? '21px' : '3px';
if (!isAll) {
const labelEl = container.querySelector('#kone-preview-label');
if (labelEl) labelEl.textContent = allowed
? '허용됨 — 미리보기 및 본문 이미지가 표시됩니다.'
: '비허용 — 미리보기 및 본문 이미지가 차단됩니다.';
}
};
applyState();
btn.addEventListener('click', () => {
const nowAllowed = isSubAllowed(sub);
setSubAllowed(sub, !nowAllowed);
cleanupPreview();
applyPostImageForCurrentPage();
});
row.appendChild(label);
row.appendChild(btn);
return row;
}
/* =========================
본문 썸네일 조정
========================= */
function applyThumbnailStyle(w, h) {
const existing = document.getElementById('custom-thumbnail-style');
if (existing) existing.remove();
const scale = getViewportScale();
const scaledW = Math.round(w * scale);
const scaledH = Math.round(h * scale);
const style = document.createElement('style');
style.id = 'custom-thumbnail-style';
style.textContent = `
img.max-w-50.max-h-40 {
width: auto !important;
height: auto !important;
max-width: ${scaledW}px !important;
max-height: ${scaledH}px !important;
object-fit: unset !important;
display: block;
}
`;
document.head.appendChild(style);
}
function resizeThumbnails() {
const w = GM_getValue(STORAGE_KEY_WIDTH, DEFAULT_WIDTH);
const h = GM_getValue(STORAGE_KEY_HEIGHT, DEFAULT_HEIGHT);
applyThumbnailStyle(w, h);
}
/* =========================
호버 미리보기 위치 계산
========================= */
function calcPreviewPosition(e, postWrapper, previewEl) {
const cardRect = postWrapper.getBoundingClientRect();
const vpW = window.innerWidth;
const vpH = window.innerHeight;
const prevW = previewEl.offsetWidth;
const prevH = previewEl.offsetHeight;
const mouseOnLeft = e.clientX < vpW / 2;
let left;
if (mouseOnLeft) {
left = cardRect.right + PREVIEW_MARGIN;
left = Math.min(left, vpW - prevW - PREVIEW_MARGIN);
} else {
left = cardRect.left - prevW - PREVIEW_MARGIN;
left = Math.max(left, PREVIEW_MARGIN);
}
let top = cardRect.top - 200;
top = Math.max(PREVIEW_MARGIN, Math.min(top, vpH - prevH - PREVIEW_MARGIN));
return { left, top };
}
/* =========================
호버 미리보기 관리
========================= */
let activePreview = null;
let hiddenOriginal = null;
function cleanupPreview() {
if (activePreview) { activePreview.remove(); activePreview = null; }
if (hiddenOriginal) {
hiddenOriginal.style.display = '';
hiddenOriginal = null;
}
}
function onUrlChange() {
cleanupPreview();
applyPostImageForCurrentPage();
const snapUrl = location.href;
let attempts = 0;
const doInsert = () => {
if (location.href !== snapUrl) return;
tryInsertSwitch();
if (!document.getElementById(SWITCH_ID) && attempts++ < 10) {
setTimeout(doInsert, 300);
}
};
setTimeout(doInsert, 300);
}
let _onUrlChangeTimer = null;
function scheduleUrlChange() {
if (_onUrlChangeTimer) clearTimeout(_onUrlChangeTimer);
_onUrlChangeTimer = setTimeout(() => {
_onUrlChangeTimer = null;
onUrlChange();
}, 50);
}
window.addEventListener('pageshow', scheduleUrlChange);
window.addEventListener('popstate', scheduleUrlChange);
const originalPushState = history.pushState;
const originalReplaceState = history.replaceState;
history.pushState = function () {
originalPushState.apply(history, arguments);
scheduleUrlChange();
};
history.replaceState = function () {
originalReplaceState.apply(history, arguments);
scheduleUrlChange();
};
document.addEventListener('mousedown', (e) => {
if (e.target.closest('a') || e.target.closest('button') || e.target.closest('[role="button"]')) {
if (activePreview) { activePreview.remove(); activePreview = null; }
hiddenOriginal = null;
}
}, true);
document.addEventListener('keydown', (e) => { if (e.key === 'Escape') cleanupPreview(); });
window.addEventListener('beforeunload', cleanupPreview);
document.addEventListener('visibilitychange', () => { if (document.hidden) cleanupPreview(); });
document.addEventListener('mouseover', (e) => {
const postWrapper = e.target.closest('.group\\/post-wrapper');
if (!postWrapper) return;
const preview = postWrapper.querySelector('.group-hover\\/post-wrapper\\:block');
if (!preview) return;
const currentSub = getCurrentSub();
const subToCheck = currentSub || getSubFromCard(postWrapper);
if (!subToCheck || !isSubAllowed(subToCheck)) {
cleanupPreview();
preview.style.display = 'none';
return;
}
cleanupPreview();
preview.style.display = 'none';
hiddenOriginal = preview;
const clone = preview.cloneNode(true);
const w = GM_getValue(STORAGE_KEY_WIDTH, DEFAULT_WIDTH);
const h = GM_getValue(STORAGE_KEY_HEIGHT, DEFAULT_HEIGHT);
const img = clone.querySelector('img');
if (img) {
img.className = '';
img.style.objectFit = 'unset';
img.style.display = 'block';
const recalcPosition = () => {
if (!clone.isConnected) return;
const { left, top } = calcPreviewPosition(e, postWrapper, clone);
clone.style.left = left + 'px';
clone.style.top = top + 'px';
};
const applySize = () => {
const natW = img.naturalWidth;
const natH = img.naturalHeight;
const vpH = window.innerHeight;
const scale = getViewportScale();
const scaledW = Math.round(w * scale);
const scaledH = Math.round(h * scale);
if (natW > 0 && natH > 0) {
const ratio = natW / natH;
if (ratio >= 1) {
img.style.width = scaledW + 'px';
img.style.height = 'auto';
img.style.maxWidth = 'unset';
img.style.maxHeight = scaledH + 'px';
} else {
const targetH = Math.round(vpH * 0.85);
img.style.width = 'auto';
img.style.height = targetH + 'px';
img.style.maxWidth = scaledW + 'px';
img.style.maxHeight = 'unset';
}
} else {
img.style.width = 'auto';
img.style.height = 'auto';
img.style.maxWidth = scaledW + 'px';
img.style.maxHeight = scaledH + 'px';
}
requestAnimationFrame(recalcPosition);
};
if (img.complete && img.naturalWidth > 0) {
applySize();
} else {
const scale = getViewportScale();
img.style.maxWidth = Math.round(w * scale) + 'px';
img.style.maxHeight = Math.round(h * scale) + 'px';
img.addEventListener('load', applySize, { once: true });
}
}
clone.style.width = 'fit-content';
clone.style.height = 'fit-content';
clone.style.position = 'fixed';
clone.style.zIndex = '9999';
clone.style.pointerEvents = 'none';
clone.style.visibility = 'hidden';
clone.style.display = 'block';
clone.style.setProperty('inset', 'auto', 'important');
clone.style.setProperty('right', 'auto', 'important');
clone.style.setProperty('bottom', 'auto', 'important');
clone.style.setProperty('transform', 'none', 'important');
clone.style.left = '0px';
clone.style.top = '0px';
document.body.appendChild(clone);
const { left, top } = calcPreviewPosition(e, postWrapper, clone);
clone.style.left = left + 'px';
clone.style.top = top + 'px';
clone.style.visibility = 'visible';
activePreview = clone;
});
document.addEventListener('mouseout', (e) => {
const postWrapper = e.target.closest('.group\\/post-wrapper');
const related = e.relatedTarget?.closest?.('.group\\/post-wrapper');
if (postWrapper && related !== postWrapper) {
cleanupPreview();
const preview = postWrapper.querySelector('.group-hover\\/post-wrapper\\:block');
if (preview) preview.style.display = '';
}
});
/* =========================
초기화 및 DOM 감시
========================= */
resizeThumbnails();
let _resizeTimer = null;
window.addEventListener('resize', () => {
cachedScale = null;
if (_resizeTimer) clearTimeout(_resizeTimer);
_resizeTimer = setTimeout(() => {
_resizeTimer = null;
resizeThumbnails();
}, 150);
});
setTimeout(tryInsertSwitch, 500);
})(); 4
2 comments
argoklarke
04/19 얼마나 사람들이 테러를 많이 당했으면...개추
katress
04/19 크롬에서 템퍼몽키로 코드가져와서 쓰고있는데
이미지 보이는거 허용해놓은곳에 마우스호버했을때 화면 우측에 엄청 크게 썸네일 미리보기 뜨는건 원래대로 하는방법은 없는건가 궁금함
공지
AI 이미지 관련 공지 및 관련 규정 수정 공지
1uF
05/02
60009
22
AI 이미지 관련 공지 및 관련 규정 수정 공지
공지
1uF
05/02 60009 22
공지
‼️뉴비 필독 가이드‼️
1uF
05/02
88481
134
‼️뉴비 필독 가이드‼️
공지
1uF
05/02 88481 134
공지
🔔[필독] 채널 규정 & 신문고 (2026 04 05~)
SK
04/05
201163
-25
🔔[필독] 채널 규정 & 신문고 (2026 04 05~)
공지
SK
04/05 201163 -25
공지
🔔[필독] 탭 별 이용 가이드 (20260206~)
Etrick
02/05
252218
-41
🔔[필독] 탭 별 이용 가이드 (20260206~)
공지
Etrick
02/05 252218 -41
공지
[필독] 서브에 자주 올라오는 여러 가지 질문 모음 (20251026~)
SK
05/17/25
1242137
-14
[필독] 서브에 자주 올라오는 여러 가지 질문 모음 (20251026~)
공지
SK
05/17/25 1242137 -14
동인
[AI번역+검수=노모 단행본] 온천 하렘 이야기+ 첫 경험 시스터즈
mybest
05/10
23843
106
[AI번역+검수=노모 단행본] 온천 하렘 이야기+ 첫 경험 시스터즈
동인
mybest
05/10 23843 106
동인
콜걸 아가씨는 본방은 안 해요!
hatlatal
05/10
26296
134
콜걸 아가씨는 본방은 안 해요!
동인
hatlatal
05/10 26296 134
동인
예능사무소에서 매니저했었을 적 담당했던 아이돌이 베개영업했는데 질문있어?
hatlatal
05/10
20569
57
예능사무소에서 매니저했었을 적 담당했던 아이돌이 베개영업했는데 질문있어?
동인
hatlatal
05/10 20569 57
동인
풍속에서 제자인 JK와 생삽입 절륜 섹스
hatlatal
05/10
21135
53
풍속에서 제자인 JK와 생삽입 절륜 섹스
동인
hatlatal
05/10 21135 53
동인
폭주여친은 발정기
hatlatal
05/10
15623
71
폭주여친은 발정기
동인
hatlatal
05/10 15623 71
야짤
ai, 블아) 야한 속옷을 입은 하스미와 질내사정 섹스 (수요 조사)
kjh9304
05/10
9368
118
ai, 블아) 야한 속옷을 입은 하스미와 질내사정 섹스 (수요 조사)
야짤
kjh9304
05/10 9368 118
번역
[강화버전]달인 퇴마사는 촉수요마 따위에 굴하지 않아_v260523
dmol2279
05/10
65903
184
[강화버전]달인 퇴마사는 촉수요마 따위에 굴하지 않아_v260523
번역
dmol2279
05/10 65903 184
소리
[구매보급]【오호 목소리】 왕자님계 소녀가 ○예가 되어서 길러봤다~ 오호 목소리 섹스~
이름뭐하지
05/10
16195
88
[구매보급]【오호 목소리】 왕자님계 소녀가 ○예가 되어서 길러봤다~ 오호 목소리 섹스~
소리
이름뭐하지
05/10 16195 88
동인
직번[Ichiokumangenjaya (2-G)]편의점 알바 JK는 XXL 사이즈 콘돔을 사는 손님이 신경 쓰여 견딜 수 없다
woo15
05/10
20447
137
직번[Ichiokumangenjaya (2-G)]편의점 알바 JK는 XXL 사이즈 콘돔을 사는 손님이 신경 쓰여 견딜 수 없다
동인
woo15
05/10 20447 137
영상
후원보급,Br@n)보컬로 미쿠,구미 + 통합편집 (쿠로마루 해킹3)
비밀봉투
05/09
19918
93
후원보급,Br@n)보컬로 미쿠,구미 + 통합편집 (쿠로마루 해킹3)
영상
비밀봉투
05/09 19918 93
소리
[요청복구] [총 4편] 잔소리많고 육덕한, 스케베 데카파이 엄마가 자위하는 모습을 본 마더콘 아들은 시리즈
9ya
05/09
10516
88
[요청복구] [총 4편] 잔소리많고 육덕한, 스케베 데카파이 엄마가 자위하는 모습을 본 마더콘 아들은 시리즈
소리
9ya
05/09 10516 88
번역
26.05.12, 90일, 1.71 GB) RJ354108 비타민 퀘스트 2 v1.840. 개선 26.05.12.7z
ㅇㅇ
05/09
41474
171
26.05.12, 90일, 1.71 GB) RJ354108 비타민 퀘스트 2 v1.840. 개선 26.05.12.7z
번역
ㅇㅇ
05/09 41474 171
영상
후원보급,Br@n)버튜버 노엘,마린,스이세이,멜,초코,클로에,페코마마 + 통합편집
비밀봉투
05/09
34419
132
후원보급,Br@n)버튜버 노엘,마린,스이세이,멜,초코,클로에,페코마마 + 통합편집
영상
비밀봉투
05/09 34419 132
야짤
카프카의 은밀한 취미
idjsio864
05/09
19586
75
카프카의 은밀한 취미
야짤
idjsio864
05/09 19586 75
미번
던전 앤 브라이드
SML
05/09
24320
70
던전 앤 브라이드
미번
SML
05/09 24320 70
미번
[구매보급] 음최도시 휴프노즘 v1.06 (1.07버전업)
SML
05/09
26583
42
[구매보급] 음최도시 휴프노즘 v1.06 (1.07버전업)
미번
SML
05/09 26583 42
정보
비월선행록 번역패치 이후 무기 강화 안되는 버그 수정 방법
ccrruuddee
05/09
16547
26
비월선행록 번역패치 이후 무기 강화 안되는 버그 수정 방법
정보
ccrruuddee
05/09 16547 26
소리
[전연령]사랑이 무거운 안데레 소녀의 속삭이며 귀청소
siroyume
05/09
13144
37
[전연령]사랑이 무거운 안데레 소녀의 속삭이며 귀청소
소리
siroyume
05/09 13144 37
정보
[어팬드/예고/발매완료]게임 3개
잉여로운인간의생활
05/09
12021
19
[어팬드/예고/발매완료]게임 3개
정보
잉여로운인간의생활
05/09 12021 19
영상
후원보급,Br@n)젖소파티,벽람항로 카시노 + 통합편집
비밀봉투
05/09
14606
82
후원보급,Br@n)젖소파티,벽람항로 카시노 + 통합편집
영상
비밀봉투
05/09 14606 82
동인
이세계전생 사기 스킬을 가진 OL은 남자한테는 못 이겨!
나나세마루
05/09
37327
128
이세계전생 사기 스킬을 가진 OL은 남자한테는 못 이겨!
동인
나나세마루
05/09 37327 128
동인
이세계전생 사기 스킬을 가진 OL은 남자한테도 안 져!
나나세마루
05/09
28305
120
이세계전생 사기 스킬을 가진 OL은 남자한테도 안 져!
동인
나나세마루
05/09 28305 120
미번
Orange Piece 10개 모음집
playthesean
05/09
13912
24
Orange Piece 10개 모음집
미번
playthesean
05/09 13912 24
영상
후원보급,Br@n)포켓몬 카나리,무쿠 + 통합편집
비밀봉투
05/09
17958
68
후원보급,Br@n)포켓몬 카나리,무쿠 + 통합편집
영상
비밀봉투
05/09 17958 68
정보
해당 작품 왠만하면 구매하지마삼
쩝냡
05/09
13271
52
해당 작품 왠만하면 구매하지마삼
정보
쩝냡
05/09 13271 52
소리
[구매보급] RJ01044892 냄새 페티시 서큐버스의 땀으로 눅눅한 페로몬 착정
gnrjrdtjcft
05/09
12417
50
[구매보급] RJ01044892 냄새 페티시 서큐버스의 땀으로 눅눅한 페로몬 착정
소리
gnrjrdtjcft
05/09 12417 50
소리
[구매보급] RJ01499531 보물 상자 음란 『쌍』 ~미믹 서큐버스~ 당신은 미끈미끈 뭉툭한 거구 쌍둥이 서큐버스가 기다리는 미믹에 갇혔다!? ♡
gnrjrdtjcft
05/09
10998
63
[구매보급] RJ01499531 보물 상자 음란 『쌍』 ~미믹 서큐버스~ 당신은 미끈미끈 뭉툭한 거구 쌍둥이 서큐버스가 기다리는 미믹에 갇혔다!? ♡
소리
gnrjrdtjcft
05/09 10998 63
번역
[기번] Orange Piece 써클 5개
playthesean
05/09
39828
81
[기번] Orange Piece 써클 5개
번역
playthesean
05/09 39828 81
복구
26.05.12, 90일, 1.21 GB) 1-1. RJ112559 ROBF v4.1 개조 21.03.21. 개선 26.05.12.7z
ㅇㅇ
05/09
19736
47
26.05.12, 90일, 1.21 GB) 1-1. RJ112559 ROBF v4.1 개조 21.03.21. 개선 26.05.12.7z
복구
ㅇㅇ
05/09 19736 47
동인
[ろきた][번역] 클라라의 수난 , 백로의 치료 1, 2 , 헤르타 예비 바디
doyoulikekim
05/09
26391
74
[ろきた][번역] 클라라의 수난 , 백로의 치료 1, 2 , 헤르타 예비 바디
동인
doyoulikekim
05/09 26391 74
s/somisoft
• 143,985 subscribers여러가지 다루는 서브
Created 05/17/2025, 14:58:43