{"schemaVersion":1,"exportedAt":1780716793364,"app":"Local-AI-Assistant","data":{"registeredScripts":[{"createdAt":1780502762127,"css":"#copilot-video-speed-overlay{position:fixed;top:80px;left:20px;z-index:2147483647;background:rgba(20,20,20,.35);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);color:#fff;border:1px solid rgba(255,255,255,.25);border-radius:12px;padding:10px 12px;display:flex;gap:8px;align-items:center;box-shadow:0 8px 24px rgba(0,0,0,.25);cursor:move;user-select:none;}\n#copilot-video-speed-overlay button{appearance:none;border:0;border-radius:999px;padding:6px 10px;background:rgba(255,255,255,.16);color:#fff;font:600 13px/1.2 sans-serif;cursor:pointer;}\n#copilot-video-speed-overlay button:hover{background:rgba(255,255,255,.28);}","id":"reg_video_speed_overlay_youtube_v2","js":"(() => {\n  const ID = 'copilot-video-speed-overlay';\n  const SPEEDS = [1.0, 1.5, 2.0, 3.0];\n  const existing = document.getElementById(ID);\n  if (existing) existing.remove();\n\n  const overlay = document.createElement('div');\n  overlay.id = ID;\n  overlay.setAttribute('data-copilot-video-speed-overlay', '1');\n  overlay.innerHTML = SPEEDS.map(s => `<button type=\"button\" data-speed=\"${s}\">x${s.toFixed(1)}</button>`).join('');\n\n  const setAllVideos = (rate) => {\n    document.querySelectorAll('video').forEach(v => { try { v.playbackRate = rate; } catch (e) {} });\n  };\n\n  overlay.addEventListener('click', (e) => {\n    const btn = e.target.closest('button[data-speed]');\n    if (!btn) return;\n    const rate = Number(btn.dataset.speed);\n    setAllVideos(rate);\n    overlay.setAttribute('data-current-speed', String(rate));\n  });\n\n  let dragging = false, sx = 0, sy = 0, ox = 0, oy = 0;\n  overlay.addEventListener('pointerdown', (e) => {\n    if (e.target.closest('button')) return;\n    dragging = true;\n    overlay.setPointerCapture?.(e.pointerId);\n    const r = overlay.getBoundingClientRect();\n    ox = r.left; oy = r.top; sx = e.clientX; sy = e.clientY;\n    overlay.style.right = 'auto';\n    overlay.style.bottom = 'auto';\n  });\n  window.addEventListener('pointermove', (e) => {\n    if (!dragging) return;\n    overlay.style.left = `${Math.max(0, ox + (e.clientX - sx))}px`;\n    overlay.style.top = `${Math.max(0, oy + (e.clientY - sy))}px`;\n  });\n  window.addEventListener('pointerup', () => { dragging = false; });\n\n  document.documentElement.appendChild(overlay);\n  setAllVideos(1.0);\n  return { matched: true, targetMatched: true, affected: 1 };\n})();","matches":["https://www.youtube.com/*"],"runAt":"document_end"},{"createdAt":1780547513177,"id":"hide_youtube_shorts","js":"const target = document.querySelector(\"#copilot-video-speed-overlay\");\nif (!target) return;\n\n// Avoid double-binding\nif (target.dataset.copilotToggleBound === '1') return;\ntarget.dataset.copilotToggleBound = '1';\n\nconst collapsedStyle = {\n  overflow: 'hidden',\n  maxHeight: '0px',\n  opacity: '0',\n  pointerEvents: 'none',\n  transform: 'translateY(8px)',\n};\nconst expandedStyle = {\n  overflow: 'visible',\n  maxHeight: 'none',\n  opacity: '1',\n  pointerEvents: 'auto',\n  transform: 'translateY(0)',\n};\n\nlet expanded = false;\n\nfunction applyState() {\n  if (expanded) {\n    Object.assign(target.style, expandedStyle);\n  } else {\n    Object.assign(target.style, collapsedStyle);\n  }\n}\n\n// Start collapsed if not already visible\napplyState();\n\ntarget.style.transition = 'opacity 160ms ease, transform 160ms ease, max-height 160ms ease';\ntarget.style.cursor = 'pointer';\n\ntarget.addEventListener('click', (e) => {\n  e.stopPropagation();\n  expanded = !expanded;\n  applyState();\n}, true);","matches":["https://www.youtube.com/*"],"runAt":"document_end"},{"createdAt":1780570057638,"css":"ytd-player video.html5-main-video { filter:none !important; }","id":"8767673e-3bdf-4c5a-bd05-f1bb95e73224","js":"// ==UserScript==\n// @name         YouTube 광고 자동 건너뛰기\n// @namespace    http://tampermonkey.net/\n// @version      1.0\n// @description  유튜브 영상 광고를 자동으로 건너뛰고, 건너뛸 수 없는 광고는 빨리 감아 넘깁니다.\n// @match        https://www.youtube.com/*\n// @match        https://m.youtube.com/*\n// @run-at       document-start\n// @grant        none\n// ==/UserScript==\n\n(function () {\n  'use strict';\n\n  // 1) \"건너뛰기\" 버튼이 보이면 자동 클릭\n  function clickSkipButton() {\n    const skipSelectors = [\n      '.ytp-ad-skip-button',\n      '.ytp-ad-skip-button-modern',\n      '.ytp-skip-ad-button',\n      'button[id^=\"skip-button\"]',\n    ];\n    for (const sel of skipSelectors) {\n      const btn = document.querySelector(sel);\n      if (btn) {\n        btn.click();\n        return true;\n      }\n    }\n    return false;\n  }\n\n  // 2) 광고가 재생 중인지 확인 (플레이어에 .ad-showing 클래스가 붙음)\n  function isAdPlaying() {\n    return document.querySelector('.ad-showing, .ytp-ad-player-overlay') !== null;\n  }\n\n  // 3) 건너뛸 수 없는 광고는 끝으로 빨리 감기 + 음소거\n  function fastForwardAd() {\n    const video = document.querySelector('video');\n    if (video && isAdPlaying() && isFinite(video.duration) && video.duration > 0) {\n      video.muted = true;\n      video.currentTime = video.duration; // 광고 영상 끝으로 점프\n      video.playbackRate = 16;            // 혹시 안 넘어가면 빠르게 재생\n    }\n  }\n\n  // 4) 배너/오버레이 광고 닫기 및 제거\n  function removeOverlayAds() {\n    document.querySelectorAll('.ytp-ad-overlay-close-button')\n      .forEach((btn) => btn.click());\n\n    const overlaySelectors = [\n      '.ytp-ad-overlay-container',\n      '.ytp-ad-image-overlay',\n      '#player-ads',\n      '.ytd-banner-promo-renderer',\n    ];\n    overlaySelectors.forEach((sel) => {\n      document.querySelectorAll(sel).forEach((el) => el.remove());\n    });\n  }\n\n  // 메인 루프: 0.3초마다 광고 상태 점검\n  function loop() {\n    if (isAdPlaying()) {\n      if (!clickSkipButton()) {\n        fastForwardAd();\n      }\n    }\n    removeOverlayAds();\n  }\n\n  setInterval(loop, 300);\n\n  // DOM 변화 감지로 광고가 뜨자마자 즉시 대응\n  const observer = new MutationObserver(loop);\n  observer.observe(document.documentElement, {\n    childList: true,\n    subtree: true,\n  });\n})();","matches":["https://www.youtube.com/*"],"runAt":"document_start"},{"createdAt":1780585766671,"css":"ytd-ad-slot-renderer, ytd-display-ad-renderer, ytd-in-feed-ad-layout-renderer, ytd-promoted-sparkles-web-renderer, ytd-action-companion-renderer, ytd-search-pyv-renderer, ytd-video-masthead-ad-v3-renderer, .ytp-ad-module, .ytp-ad-player-overlay, .ytp-ad-image-overlay, .ytp-ad-text-overlay, .ytp-ad-survey, #masthead-ad, #player-ads, #companion, #secondary-inner ytd-ad-slot-renderer { display: none !important; visibility: hidden !important; }","id":"youtube-hide-ads-persistent","matches":["https://www.youtube.com/*"],"runAt":"document_start"},{"createdAt":1780585781793,"css":"ytd-ad-slot-renderer, ytd-display-ad-renderer, ytd-in-feed-ad-layout-renderer, ytd-promoted-sparkles-web-renderer, ytd-action-companion-renderer, ytd-search-pyv-renderer, ytd-video-masthead-ad-v3-renderer, .ytp-ad-module, .ytp-ad-player-overlay, .ytp-ad-image-overlay, .ytp-ad-text-overlay, .ytp-ad-survey, #masthead-ad, #player-ads, #companion { display: none !important; visibility: hidden !important; }\n","id":"yt_hide_ads_persistent","matches":["https://www.youtube.com/*"],"runAt":"document_start"}],"scriptMetadata":{"reg_video_speed_overlay_youtube_v2":{"createdBy":"ai","description":"영상속도를 조절할 수 있는 반투명 오버레이 플로팅 버튼을 항상 보일 수 있도록 만들어줘. 이 반투명 오버레이 플로팅 버튼은 영상속도 별로 x1.0, x1.5, x2.0, x3.0으","paused":false},"hide_youtube_shorts":{"createdBy":"ai","description":"자동 클릭/입력 JS","paused":false},"8767673e-3bdf-4c5a-bd05-f1bb95e73224":{"createdBy":"ai","description":"CSS 스타일 변경","paused":false},"youtube-hide-ads-persistent":{"createdBy":"ai","description":"유튜브 사이트에 항상 광고가 보이지 않게 해줘.","paused":false},"yt_hide_ads_persistent":{"createdBy":"ai","description":"유튜브 사이트에 항상 광고가 보이지 않게 해줘.","paused":false}}}}