From 0ed9dbf41acc3097a12e7cf9ec6ef9e7d4790bfb Mon Sep 17 00:00:00 2001 From: yusufipk Date: Sun, 30 Aug 2026 16:43:32 +0300 Subject: [PATCH] Add badge menu and library Clicking a badge now opens a menu instead of the video: copy a YouTube-style card image (thumbnail + title) to the clipboard, copy the title and link as text, download the card image, or save the video into the extension's own library page. The library groups entries into projects, supports search, moving, two-step deletes, JSON export with a field-level lossless import merge, and re-scores stale entries on open. Badge clicks are swallowed at window capture so YouTube's own handlers (notably on Shorts cards) never see them, and a fixed-position ghost copy of the badge keeps it visible and clickable above the hover preview overlay. Score tier colors and labels now live in one place (OBParse) shared by the badge, the watch panel, and the library. --- .gitignore | 1 + README.md | 9 +- README.tr.md | 8 + library/library.css | 238 ++++++++++++++++ library/library.html | 40 +++ library/library.js | 539 ++++++++++++++++++++++++++++++++++++ manifest.json | 4 +- package.py | 4 +- popup/popup.html | 2 + popup/popup.js | 8 + screenshots/badge-menu.webp | Bin 0 -> 102068 bytes screenshots/library.webp | Bin 0 -> 41690 bytes src/actions.js | 256 +++++++++++++++++ src/badge.js | 105 +++++-- src/content.js | 28 +- src/i18n.js | 74 +++++ src/menu.js | 211 ++++++++++++++ src/panel.js | 10 +- src/parse.js | 18 ++ src/store.js | 57 ++++ src/style.css | 52 +++- 21 files changed, 1616 insertions(+), 48 deletions(-) create mode 100644 library/library.css create mode 100644 library/library.html create mode 100644 library/library.js create mode 100644 screenshots/badge-menu.webp create mode 100644 screenshots/library.webp create mode 100644 src/actions.js create mode 100644 src/menu.js diff --git a/.gitignore b/.gitignore index 8097620..142386f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ web-ext-artifacts/ +.claude/ node_modules/ *.xpi *.zip diff --git a/README.md b/README.md index c00c5d7..c5e9874 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,10 @@ would drag a mean upward and make everything else on that channel look like it never outperformed. Shorts are scored against the channel's Shorts, regular videos against regular videos, and live streams enter no pool at all. The watch page also gets a panel with the score's details and the channel's recent view -distribution. +distribution. Clicking a badge opens a small menu to copy the thumbnail and +title, download the thumbnail, or save the video into the extension's own +library, where entries live in projects, can be exported and imported as JSON, +and get their scores refreshed when the page opens. No server, no API key, no account: the extension calls YouTube's own internal (InnerTube) endpoint from inside youtube.com, without session credentials. One @@ -20,6 +23,10 @@ are only processed once they scroll into view. ![The watch page panel](screenshots/watch-panel.webp) +![The badge menu](screenshots/badge-menu.webp) + +![The library page](screenshots/library.webp) + ## Installing [Get it from addons.mozilla.org](https://addons.mozilla.org/en-US/firefox/addon/youtube-outlier-badge/). diff --git a/README.tr.md b/README.tr.md index a7f38dd..5ac97c0 100644 --- a/README.tr.md +++ b/README.tr.md @@ -8,6 +8,10 @@ bilerek seçildi: tek bir viral video ortalamayı yukarı çekip aynı kanalın videolarını "outlier değil" gösterirdi. Shorts kendi havuzunda, normal videolar kendi havuzunda puanlanır, canlı yayınlar hiçbir havuza girmez. Video sayfasında ayrıca skorun ayrıntısı ve kanalın son videolarının izlenme dağılımı görünür. +Rozete tıklamak küçük bir menü açar: kapak ve başlığı panoya kopyala, kapağı +indir ya da videoyu eklentinin kendi kütüphanesine kaydet; kütüphanede kayıtlar +projelere ayrılır, JSON olarak dışa ve içe aktarılır, skorlar sayfa açılınca +tazelenir. Sunucu, API anahtarı, hesap yok: eklenti youtube.com içinden YouTube'un kendi dahili (InnerTube) ucuna oturumsuz istek atar. Kanal başına bir istek, sonucu @@ -18,6 +22,10 @@ işlenir. ![İzleme sayfasındaki panel](screenshots/watch-panel.webp) +![Rozet menüsü](screenshots/badge-menu.webp) + +![Kütüphane sayfası](screenshots/library.webp) + ## Kurulum [addons.mozilla.org'dan yükleyin](https://addons.mozilla.org/tr/firefox/addon/youtube-outlier-badge/). diff --git a/library/library.css b/library/library.css new file mode 100644 index 0000000..fa8a7be --- /dev/null +++ b/library/library.css @@ -0,0 +1,238 @@ +/* Kütüphane sayfası: ayar penceresiyle aynı koyu palet. */ + +* { box-sizing: border-box; } + +body { + display: flex; + min-height: 100vh; + margin: 0; + font: 13px/1.45 "Segoe UI", Roboto, sans-serif; + color: #eee; + background: #202124; +} + +/* --- Kenar çubuğu --- */ + +#sidebar { + display: flex; + flex-direction: column; + gap: 8px; + width: 230px; + flex-shrink: 0; + padding: 16px 12px; + border-right: 1px solid #3c4043; + position: sticky; + top: 0; + height: 100vh; + overflow-y: auto; +} + +h1 { + margin: 0 0 6px; + font-size: 15px; + font-weight: 600; +} + +#projects { + display: flex; + flex-direction: column; + gap: 2px; +} + +.nav-row { + display: flex; + align-items: center; + gap: 6px; + padding: 6px 9px; + border-radius: 6px; + cursor: pointer; +} + +.nav-row:hover { background: #2b2c2f; } +.nav-row.active { background: #3c4043; } + +.nav-name { + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.nav-count { color: #9aa0a6; font-size: 12px; } + +.nav-act { + display: none; + padding: 0 4px; + border: 0; + background: none; + color: #9aa0a6; + font: inherit; + cursor: pointer; +} + +.nav-row:hover .nav-act { display: inline; } +.nav-act:hover { color: #eee; } + +.nav-edit { + width: 100%; + padding: 3px 6px; + border: 1px solid #4a4a4a; + border-radius: 4px; + background: #303134; + color: #eee; + font: inherit; +} + +button { + background: #303134; + color: #eee; + border: 1px solid #4a4a4a; + border-radius: 4px; + padding: 5px 10px; + font: inherit; + cursor: pointer; +} + +button:hover:not(:disabled) { background: #3c4043; } +button:disabled { color: #9aa0a6; cursor: default; } + +#newProject, #refresh { text-align: left; } + +.io { display: flex; gap: 6px; margin-top: auto; } +.io button { flex: 1; } + +#notice { color: #9aa0a6; font-size: 12px; min-height: 1em; } + +/* --- Ana alan --- */ + +main { + flex: 1; + padding: 16px 18px; + min-width: 0; +} + +header { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 14px; +} + +#search { + flex: 1; + max-width: 340px; + padding: 6px 10px; + border: 1px solid #4a4a4a; + border-radius: 6px; + background: #303134; + color: #eee; + font: inherit; +} + +#count { color: #9aa0a6; } + +#grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); + gap: 14px; +} + +#empty { color: #9aa0a6; } + +/* --- Video kartı --- */ + +.card { + display: flex; + flex-direction: column; + border: 1px solid #3c4043; + border-radius: 10px; + overflow: hidden; + background: #26272b; +} + +.thumb { + position: relative; + display: block; + aspect-ratio: 16 / 9; + background: #000; +} + +.thumb img { + width: 100%; + height: 100%; + object-fit: cover; + display: block; +} + +.chip { + position: absolute; + right: 6px; + bottom: 6px; + padding: 2px 7px; + border-radius: 5px; + color: #fff; + font-weight: 700; + font-size: 13px; + background: rgba(0, 0, 0, 0.78); +} + +/* Rozetle aynı ton skalası. */ +.ob-t0 { background: rgba(60, 60, 60, 0.82); color: #d0d0d0; } +.ob-t1 { background: rgba(29, 92, 168, 0.9); } +.ob-t2 { background: rgba(21, 128, 61, 0.92); } +.ob-t3 { background: rgba(180, 83, 9, 0.94); } +.ob-t4 { background: rgba(159, 18, 57, 0.95); } + +.card-body { + display: flex; + flex-direction: column; + gap: 6px; + padding: 9px 11px 11px; +} + +.card-title { + color: #eee; + text-decoration: none; + font-weight: 500; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} + +.card-title:hover { text-decoration: underline; } + +.card-meta { color: #9aa0a6; font-size: 12px; } + +.card-row { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 6px; + margin-top: 2px; +} + +.card-move { + width: 100%; + padding: 4px 6px; + border: 1px solid #4a4a4a; + border-radius: 4px; + background: #303134; + color: #eee; + font: inherit; + font-size: 12px; +} + +.card-act { + padding: 3px 8px; + font-size: 12px; + white-space: nowrap; +} + +.card-del:hover { background: #5c2b29; border-color: #7a3a37; } + +/* İki adımlı silmenin ikinci adımı: düğme kızarır, tık onaydır. */ +.card-act.armed, +.card-act.armed:hover { background: #5c2b29; border-color: #a15551; color: #ffd8d5; } + +.nav-act.armed { display: inline; color: #f28b82; font-weight: 600; } diff --git a/library/library.html b/library/library.html new file mode 100644 index 0000000..9d819ea --- /dev/null +++ b/library/library.html @@ -0,0 +1,40 @@ + + + + + Outlier Badge + + + + + + +
+
+ + +
+
+ +
+ + + + + + + + + + diff --git a/library/library.js b/library/library.js new file mode 100644 index 0000000..8e833e0 --- /dev/null +++ b/library/library.js @@ -0,0 +1,539 @@ +/* Kütüphane sayfası: kaydedilen videolar, projeler, içe/dışa aktarma. + * + * Veri storage.local'daki tek "library" anahtarında durur ve sayfa + * storage.onChanged'i dinler: açık bir YouTube sekmesi menüden video + * eklediğinde burası kendini yeniler, elle tazelemek gerekmez. + */ +(function () { + "use strict"; + + var api = (typeof browser !== "undefined" ? browser : chrome); + var T = OBI18n; + var P = OBParse; + + var lib = { projects: [], items: [] }; + var current = "all"; /* "all" | "inbox" | proje kimliği */ + var query = ""; + + function $(id) { return document.getElementById(id); } + + function el(tag, cls, text) { + var node = document.createElement(tag); + if (cls) node.className = cls; + if (text != null) node.textContent = text; + return node; + } + + function projectId() { + return "p" + Date.now().toString(36) + Math.random().toString(36).slice(2, 7); + } + + function projectOf(id) { + for (var i = 0; i < lib.projects.length; i++) { + if (lib.projects[i].id === id) return lib.projects[i]; + } + return null; + } + + /* Projesi silinmiş ya da hiç atanmamış her video gelen kutusundadır. */ + function bucketOf(item) { + return item.projectId && projectOf(item.projectId) ? item.projectId : "inbox"; + } + + /* Her değişiklik depodaki güncel kopyaya uygulanır (oku-değiştir-yaz): + * sayfanın bellekteki kopyasını toptan yazmak, yazma ile onChanged yankısı + * arasındaki milisaniyelik pencerede bir YouTube sekmesinin az önce + * eklediği videoyu ezebiliyordu. Kendi yankımız yine yutulmuyor: yankı + * yazılanla aynı veridir, depo tek gerçek kaynak kalır. */ + function persist(mutate) { + return OBStore.readLibrary().then(function (fresh) { + mutate(fresh); + return OBStore.writeLibrary(fresh).then(function () { + lib = fresh; + render(); + }); + }); + } + + /* confirm() penceresi yok: Firefox'un eklenti sekmelerinde dialoglar + * güvenilmez davranabiliyor ve olay döngüsünü bloklamaları başka hatalar + * doğuruyor. Silme iki adım: ilk tık düğmeyi "Silinsin?" yapar, 3 saniye + * içinde ikinci tık siler. */ + function armedDelete(btn, onDelete) { + btn.addEventListener("click", function (e) { + e.stopPropagation(); + if (btn.dataset.armed) { onDelete(); return; } + btn.dataset.armed = "1"; + var old = btn.textContent; + btn.textContent = T.t("libConfirmDelete"); + btn.classList.add("armed"); + setTimeout(function () { + delete btn.dataset.armed; + btn.textContent = old; + btn.classList.remove("armed"); + }, 3000); + }); + } + + /* --- Kenar çubuğu ---------------------------------------------------- */ + + function counts() { + var map = { all: lib.items.length, inbox: 0 }; + lib.items.forEach(function (item) { + var b = bucketOf(item); + map[b] = (map[b] || 0) + 1; + }); + return map; + } + + function navRow(id, name, count, fixed) { + var row = el("div", "nav-row" + (current === id ? " active" : "")); + row.appendChild(el("span", "nav-name", name)); + row.appendChild(el("span", "nav-count", String(count || 0))); + row.addEventListener("click", function () { + current = id; + render(); + }); + if (!fixed) { + var rename = el("button", "nav-act", "✎"); + rename.type = "button"; + rename.title = T.t("libRenameProject"); + rename.addEventListener("click", function (e) { + e.stopPropagation(); + editName(row, id); + }); + var del = el("button", "nav-act", "×"); + del.type = "button"; + del.title = T.t("libDeleteProject") + ". " + T.t("libDeleteProjectHint") + "."; + armedDelete(del, function () { + if (current === id) current = "inbox"; + persist(function (l) { + l.projects = l.projects.filter(function (q) { return q.id !== id; }); + }); + }); + row.appendChild(rename); + row.appendChild(del); + } + return row; + } + + function editName(row, id) { + var p = projectOf(id); + if (!p) return; + var input = el("input", "nav-edit"); + input.value = p.name; + row.textContent = ""; + row.appendChild(input); + input.focus(); + input.select(); + /* finished bayrağı şart: render girdiyi DOM'dan sökünce Chromium blur'u + * senkron ateşler ve bayrak olmadan iptal edilen ad blur üzerinden yine + * kaydedilirdi. */ + var finished = false; + var done = function (save) { + if (finished) return; + finished = true; + var name = input.value.trim(); + if (!save || !name) { render(); return; } + persist(function (l) { + for (var i = 0; i < l.projects.length; i++) { + if (l.projects[i].id === id) l.projects[i].name = name; + } + }); + }; + input.addEventListener("keydown", function (e) { + if (e.key === "Enter") done(true); + if (e.key === "Escape") done(false); + }); + input.addEventListener("blur", function () { done(true); }); + } + + function renderSidebar() { + var nav = $("projects"); + nav.textContent = ""; + var c = counts(); + nav.appendChild(navRow("all", T.t("libAll"), c.all, true)); + nav.appendChild(navRow("inbox", T.t("libInbox"), c.inbox, true)); + lib.projects.forEach(function (p) { + nav.appendChild(navRow(p.id, p.name, c[p.id], false)); + }); + } + + function addProject() { + var nav = $("projects"); + var row = el("div", "nav-row"); + var input = el("input", "nav-edit"); + input.placeholder = T.t("libProjectName"); + row.appendChild(input); + nav.appendChild(row); + input.focus(); + var finished = false; + var done = function (save) { + if (finished) return; + finished = true; + var name = input.value.trim(); + if (save && name) { + var p = { id: projectId(), name: name, createdAt: Date.now() }; + current = p.id; + persist(function (l) { l.projects.push(p); }); + } else { + row.remove(); + } + }; + input.addEventListener("keydown", function (e) { + if (e.key === "Enter") done(true); + if (e.key === "Escape") done(false); + }); + input.addEventListener("blur", function () { done(true); }); + } + + /* --- Video kartları -------------------------------------------------- */ + + function actionButton(labelKey, action) { + var btn = el("button", "card-act", T.t(labelKey)); + btn.type = "button"; + btn.addEventListener("click", function () { + btn.disabled = true; + var old = btn.textContent; + action().then(function () { + btn.textContent = T.t("libDone"); + setTimeout(function () { btn.textContent = old; btn.disabled = false; }, 1200); + }, function () { + btn.textContent = T.t("menuFailed"); + setTimeout(function () { btn.textContent = old; btn.disabled = false; }, 1500); + }); + }); + return btn; + } + + function moveSelect(item) { + var select = el("select", "card-move"); + var opt = function (value, text) { + var o = el("option", null, text); + o.value = value; + select.appendChild(o); + }; + opt("inbox", T.t("libInbox")); + lib.projects.forEach(function (p) { opt(p.id, p.name); }); + select.value = bucketOf(item); + select.addEventListener("change", function () { + var value = select.value === "inbox" ? null : select.value; + persist(function (l) { + for (var i = 0; i < l.items.length; i++) { + if (l.items[i].videoId === item.videoId) l.items[i].projectId = value; + } + }); + }); + return select; + } + + function card(item) { + var box = el("div", "card"); + + var thumb = el("a", "thumb"); + thumb.href = item.url || OBActions.watchUrl(item.videoId, item.isShort); + thumb.target = "_blank"; + thumb.rel = "noopener"; + var img = el("img"); + img.src = OBActions.thumbnailUrl(item.videoId, "hqdefault"); + img.loading = "lazy"; + img.alt = ""; + thumb.appendChild(img); + if (item.score != null) { + thumb.appendChild(el("span", "chip " + P.scoreTone(item.score), P.scoreLabel(item.score))); + } + box.appendChild(thumb); + + var body = el("div", "card-body"); + var title = el("a", "card-title", item.title || item.videoId); + title.href = thumb.href; + title.target = "_blank"; + title.rel = "noopener"; + title.title = item.title || ""; + body.appendChild(title); + + var meta = []; + if (item.channel) meta.push(item.channel); + if (item.savedAt) { + meta.push(new Date(item.savedAt).toLocaleDateString(T.lang() === "tr" ? "tr-TR" : "en-US")); + } + body.appendChild(el("div", "card-meta", meta.join(" · "))); + + body.appendChild(moveSelect(item)); + + var row = el("div", "card-row"); + var copyImg = actionButton("libCopyImage", function () { + return OBActions.copyImage(item.videoId, item.title, item.channel); + }); + copyImg.title = T.t("menuCopyImage"); + row.appendChild(copyImg); + var copyTxt = actionButton("libCopyText", function () { + return OBActions.copyText(item.videoId, item.title, item.isShort); + }); + copyTxt.title = T.t("menuCopyText"); + row.appendChild(copyTxt); + row.appendChild(actionButton("libDownload", function () { + return OBActions.download(item.videoId, item.title, item.channel); + })); + var del = el("button", "card-act card-del", T.t("libDelete")); + del.type = "button"; + armedDelete(del, function () { + persist(function (l) { + l.items = l.items.filter(function (it) { return it.videoId !== item.videoId; }); + }); + }); + row.appendChild(del); + body.appendChild(row); + + box.appendChild(body); + return box; + } + + function visibleItems() { + var q = query.toLowerCase(); + return lib.items.filter(function (item) { + if (current !== "all" && bucketOf(item) !== current) return false; + if (!q) return true; + return (item.title || "").toLowerCase().indexOf(q) >= 0 + || (item.channel || "").toLowerCase().indexOf(q) >= 0; + }); + } + + function renderGrid() { + var grid = $("grid"); + grid.textContent = ""; + var items = visibleItems(); + items.forEach(function (item) { grid.appendChild(card(item)); }); + $("count").textContent = T.t("libCount", items.length); + $("empty").hidden = items.length > 0; + $("empty").textContent = T.t("libEmpty"); + } + + function render() { + renderSidebar(); + renderGrid(); + } + + /* --- Skor tazeleme --------------------------------------------------- */ + + /* Kaydedilen skor kaydedildiği anın görüntüsü. Sayfa açılınca önbellek + * ömründen (ttlHours ayarı) eski olanlar yeniden puanlanır; düğme hepsini + * zorla tazeler. Video başına bir videoDetails isteği gider, kanal + * baseline'ları içerik betiğiyle paylaşılan önbellekten okunur (taze + * değilse OBScore kendisi çeker, kanal istekleri 4'le sınırlı). Büyük bir + * kütüphanede bu yine de çok istek demek; aynı anda en çok 4 video işlenir + * ve ttl dolmadan otomatik tazeleme tekrarlanmaz. */ + var MAX_REFRESH_PARALLEL = 4; + var refreshing = false; + + function refreshItem(it) { + return OBTube.videoDetails(it.videoId).then(function (d) { + if (!d.channelId) throw new Error("kanal bulunamadı"); + return OBScore.baseline(d.channelId, !!it.isShort).then(function (blob) { + var own = OBScore.lookupViews(it.videoId, blob); + var views = d.views != null ? d.views : (own ? own.views : null); + var r = OBScore.score(it.videoId, views, !!it.isShort, blob); + var patch = { scoredAt: Date.now() }; + if (d.title) patch.title = d.title; + if (views != null) patch.views = views; + if (r.score != null) patch.score = r.score; + return { videoId: it.videoId, patch: patch, changed: r.score != null }; + }); + }, function () { + /* Video silinmiş ya da ulaşılamıyor: skor olduğu gibi kalır, zaman yine + * damgalanır ki her açılışta aynı video için istek yağmasın. */ + return { videoId: it.videoId, patch: { scoredAt: Date.now() }, changed: false }; + }); + } + + function refreshScores(force) { + if (refreshing) return; + OBStore.settings().then(function (s) { + var ttlMs = (s.ttlHours || 24) * 3600 * 1000; + var stale = lib.items.filter(function (it) { + return force || !it.scoredAt || Date.now() - it.scoredAt > ttlMs; + }); + if (!stale.length) return; + refreshing = true; + $("refresh").disabled = true; + notice(T.t("libRefreshing", stale.length)); + + /* Güncellemeler videoId ile sonda uygulanır: tazeleme sürerken silme + * veya taşıma yapılabilir, eski nesne referansına yazmak kaybolurdu. */ + var queueItems = stale.slice(); + var active = 0; + var updates = []; + + var finish = function () { + var changed = 0; + persist(function (l) { + updates.forEach(function (u) { + for (var i = 0; i < l.items.length; i++) { + if (l.items[i].videoId === u.videoId) { + Object.assign(l.items[i], u.patch); + if (u.changed) changed++; + break; + } + } + }); + }).then(function () { + refreshing = false; + $("refresh").disabled = false; + notice(T.t("libRefreshed", changed)); + }); + }; + + var startOne = function (it) { + active++; + refreshItem(it).then(function (u) { + updates.push(u); + }).catch(function () {}).then(function () { + active--; + pump(); + }); + }; + + var pump = function () { + while (active < MAX_REFRESH_PARALLEL && queueItems.length) { + startOne(queueItems.shift()); + } + if (!active && !queueItems.length) finish(); + }; + + pump(); + }); + } + + /* --- İçe / dışa aktarma ---------------------------------------------- */ + + function notice(text) { + $("notice").textContent = text; + setTimeout(function () { + if ($("notice").textContent === text) $("notice").textContent = ""; + }, 6000); + } + + function exportLibrary() { + var payload = { + app: "outlier-badge", + v: 1, + exportedAt: new Date().toISOString(), + projects: lib.projects, + items: lib.items + }; + var blob = new Blob([JSON.stringify(payload, null, 2)], { type: "application/json" }); + var url = URL.createObjectURL(blob); + var a = document.createElement("a"); + a.href = url; + a.download = "outlier-badge-library.json"; + document.body.appendChild(a); + a.click(); + a.remove(); + setTimeout(function () { URL.revokeObjectURL(url); }, 10000); + } + + /* Birleştirme alan bazında kayıpsız: yeni videolar eklenir, mevcut videoda + * içe aktarılan alanlar boşları doldurur ama yereldeki proje ataması, + * eski bir dışa aktarımda proje yoksa geri alınmaz; savedAt/scoredAt + * ikisinden yenisi kalır. Böylece bayat bir yedeği içe almak videoları + * gelen kutusuna geri fırlatmaz. */ + function importLibrary(text) { + var data; + try { + data = JSON.parse(text); + } catch (err) { + notice(T.t("libImportFailed", err.message)); + return; + } + var projects = Array.isArray(data.projects) ? data.projects : []; + var items = Array.isArray(data.items) ? data.items : []; + var addedProjects = 0, addedItems = 0; + + persist(function (l) { + projects.forEach(function (p) { + if (!p || !p.id || !p.name) return; + var mine = null; + for (var i = 0; i < l.projects.length; i++) { + if (l.projects[i].id === p.id) mine = l.projects[i]; + } + if (mine) { mine.name = String(p.name); return; } + l.projects.push({ id: p.id, name: String(p.name), createdAt: p.createdAt || Date.now() }); + addedProjects++; + }); + + items.forEach(function (it) { + if (!it || !it.videoId) return; + var local = null; + l.items = l.items.filter(function (mine) { + if (mine.videoId === it.videoId) { local = mine; return false; } + return true; + }); + l.items.push({ + videoId: String(it.videoId), + title: String(it.title || (local && local.title) || ""), + channel: String(it.channel || (local && local.channel) || ""), + url: String(it.url || (local && local.url) || ""), + isShort: !!(it.isShort != null ? it.isShort : local && local.isShort), + score: typeof it.score === "number" ? it.score : (local ? local.score : null), + views: typeof it.views === "number" ? it.views : (local ? local.views : null), + savedAt: Math.max(it.savedAt || 0, (local && local.savedAt) || 0) || Date.now(), + scoredAt: Math.max(it.scoredAt || 0, (local && local.scoredAt) || 0) || null, + projectId: it.projectId || (local ? local.projectId : null) + }); + if (!local) addedItems++; + }); + + l.items.sort(function (a, b) { return (b.savedAt || 0) - (a.savedAt || 0); }); + }).then(function () { + notice(T.t("libImported", addedItems, addedProjects)); + }); + } + + /* --- Kurulum --------------------------------------------------------- */ + + function applyTexts() { + document.title = "Outlier Badge · " + T.t("libTitle"); + var nodes = document.querySelectorAll("[data-i18n]"); + for (var i = 0; i < nodes.length; i++) { + nodes[i].textContent = T.t(nodes[i].dataset.i18n); + } + $("search").placeholder = T.t("libSearch"); + } + + function bind() { + $("newProject").addEventListener("click", addProject); + $("refresh").addEventListener("click", function () { refreshScores(true); }); + $("export").addEventListener("click", exportLibrary); + $("import").addEventListener("click", function () { $("importFile").click(); }); + $("importFile").addEventListener("change", function () { + var file = $("importFile").files[0]; + if (!file) return; + file.text().then(importLibrary, function (err) { + notice(T.t("libImportFailed", err.message)); + }); + $("importFile").value = ""; + }); + $("search").addEventListener("input", function () { + query = $("search").value.trim(); + renderGrid(); + }); + api.storage.onChanged.addListener(function (changes, area) { + if (area !== "local" || !changes.library) return; + lib = changes.library.newValue || { projects: [], items: [] }; + if (!Array.isArray(lib.projects)) lib.projects = []; + if (!Array.isArray(lib.items)) lib.items = []; + render(); + }); + } + + OBStore.settings().then(function (s) { + T.init(s.language); + applyTexts(); + bind(); + return OBStore.readLibrary(); + }).then(function (data) { + lib = data; + render(); + refreshScores(false); + }); +})(); diff --git a/manifest.json b/manifest.json index 02ae37f..01024ab 100644 --- a/manifest.json +++ b/manifest.json @@ -13,7 +13,7 @@ } } }, - "permissions": ["storage"], + "permissions": ["storage", "clipboardWrite"], "host_permissions": ["*://www.youtube.com/*"], "content_scripts": [ { @@ -24,6 +24,8 @@ "src/innertube.js", "src/store.js", "src/score.js", + "src/actions.js", + "src/menu.js", "src/badge.js", "src/panel.js", "src/content.js" diff --git a/package.py b/package.py index 1441390..bba4eed 100755 --- a/package.py +++ b/package.py @@ -16,7 +16,7 @@ import sys import zipfile ROOT = os.path.dirname(os.path.abspath(__file__)) -INCLUDE_DIRS = ["src", "popup", "icons", "_locales"] +INCLUDE_DIRS = ["src", "popup", "library", "icons", "_locales"] INCLUDE_FILES = ["manifest.json", "LICENSE"] # GPL kopyası pakette de bulunmalı OUTPUT = "outlier-badge.zip" @@ -31,7 +31,7 @@ def check_syntax(): """node varsa her JS dosyasını ayrıştırmayı dene: bozuk bir dosyayı AMO'ya yükleyip incelemede öğrenmek yerine burada görelim.""" files = [] - for d in ["src", "popup"]: + for d in ["src", "popup", "library"]: for root, _, names in os.walk(os.path.join(ROOT, d)): files += [os.path.join(root, n) for n in names if n.endswith(".js")] try: diff --git a/popup/popup.html b/popup/popup.html index 614bd60..9f8708c 100644 --- a/popup/popup.html +++ b/popup/popup.html @@ -47,6 +47,8 @@ + +
diff --git a/popup/popup.js b/popup/popup.js index 8067c29..5ceb39c 100644 --- a/popup/popup.js +++ b/popup/popup.js @@ -5,6 +5,9 @@ var api = (typeof browser !== "undefined" ? browser : chrome); var T = OBI18n; + /* Sadece youtube.com: kapaklar (i.ytimg.com) ACAO:* gönderdiği için host + * izni istemez ve buraya eklemek, sadece youtube iznini vermiş mevcut + * kullanıcılara güncellemede yersiz bir uyarı gösterirdi. */ var ORIGINS = { origins: ["*://www.youtube.com/*"] }; var FIELDS = [ @@ -108,6 +111,11 @@ }); }); + $("library").addEventListener("click", function () { + api.tabs.create({ url: api.runtime.getURL("library/library.html") }); + window.close(); + }); + $("clear").addEventListener("click", function () { OBStore.clearBaselines().then(function () { $("stats").textContent = T.t("popupCleared"); diff --git a/screenshots/badge-menu.webp b/screenshots/badge-menu.webp new file mode 100644 index 0000000000000000000000000000000000000000..87eac536e153b6d52cd1a07ad8ef48fb80ddc872 GIT binary patch literal 102068 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

L@?#m^O4eX=ttTFH6#kuS^_=JLO9#s+o`E^!1^C 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�e!Oc6y|g;Ec5fza_eKYS{)ynuMm-^YMS04;V_ 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 G+5ZRGNM5c0 literal 0 HcmV?d00001 diff --git a/src/actions.js b/src/actions.js new file mode 100644 index 0000000..a070e39 --- /dev/null +++ b/src/actions.js @@ -0,0 +1,256 @@ +/* Rozet menüsünün ve kütüphane sayfasının ortak eylemleri: kart görselini + * panoya kopyalama, indirme, kütüphaneye kaydetme. + * + * Hem içerik betiğinde hem eklenti sayfasında çalışır; YouTube DOM'una ve + * InnerTube'a bağımlı değildir. Kapak i.ytimg.com'dan düz CORS ile çekilir: + * sunucu Access-Control-Allow-Origin: * gönderdiği için ayrı host izni + * gerekmiyor. Google bu başlığı bir gün kaldırırsa görsel kopyalama ve + * indirme "olmadı" hatasına düşer; metin kopyalama etkilenmez. + */ +var OBActions = (function () { + "use strict"; + + /* maxres her videoda yok; olmayanında YouTube 404 yerine küçük gri bir yer + * tutucu da dönebiliyor. Sırayla denenir, ilk gerçek görsel kazanır. + * hqdefault her videoda vardır. */ + var SIZES = ["maxresdefault", "sddefault", "hqdefault"]; + var PLACEHOLDER_MAX_BYTES = 4096; + + function thumbnailUrl(videoId, size) { + return "https://i.ytimg.com/vi/" + videoId + "/" + (size || "hqdefault") + ".jpg"; + } + + function watchUrl(videoId, isShort) { + return isShort + ? "https://www.youtube.com/shorts/" + videoId + : "https://www.youtube.com/watch?v=" + videoId; + } + + function fetchThumbnail(videoId) { + var attempt = function (i) { + if (i >= SIZES.length) return Promise.reject(new Error("kapak alınamadı")); + var next = function () { return attempt(i + 1); }; + return fetch(thumbnailUrl(videoId, SIZES[i]), { credentials: "omit" }).then(function (resp) { + if (!resp.ok) return next(); + return resp.blob().then(function (blob) { + if (blob.size < PLACEHOLDER_MAX_BYTES && i + 1 < SIZES.length) return next(); + return blob; + }); + }, next); + }; + return attempt(0); + } + + /* --- Kart görseli ---------------------------------------------------- */ + + /* Kopyala ve indir düz kapağı değil, YouTube'un koyu arayüzündeki karta + * benzeyen tek bir görsel üretir: üstte köşeleri yuvarlak kapak, altında + * başlık ve kanal adı. hq/sd kapaklar 4:3 geldiği için üst-alt siyah + * bantlar 16:9 merkez kırpımıyla atılıyor; maxres zaten 16:9. */ + var CARD = { + width: 1200, + pad: 48, + radius: 24, + gap: 36, + titleFont: "600 46px 'Roboto', 'Segoe UI', Arial, sans-serif", + titleLine: 60, + titleMaxLines: 3, + channelFont: "400 34px 'Roboto', 'Segoe UI', Arial, sans-serif", + channelHeight: 40, + channelGap: 16, + bg: "#0f0f0f", + fg: "#f1f1f1", + dim: "#aaaaaa" + }; + + function roundedPath(ctx, x, y, w, h, r) { + ctx.beginPath(); + ctx.moveTo(x + r, y); + ctx.arcTo(x + w, y, x + w, y + h, r); + ctx.arcTo(x + w, y + h, x, y + h, r); + ctx.arcTo(x, y + h, x, y, r); + ctx.arcTo(x, y, x + w, y, r); + ctx.closePath(); + } + + /* Sığmayan tek parça sözcük (URL, etiket zinciri, boşluksuz CJK başlık) + * harf harf bölünür; yoksa satır kanvasın sağ kenarından taşıp kırpılırdı. */ + function breakWord(ctx, word, maxWidth) { + var parts = []; + var cur = ""; + for (var i = 0; i < word.length; i++) { + var probe = cur + word.charAt(i); + if (cur && ctx.measureText(probe).width > maxWidth) { + parts.push(cur); + cur = word.charAt(i); + } else { + cur = probe; + } + } + if (cur) parts.push(cur); + return parts; + } + + function wrapLines(ctx, text, maxWidth, maxLines) { + var words = []; + String(text).split(/\s+/).filter(Boolean).forEach(function (w) { + if (ctx.measureText(w).width > maxWidth) { + words.push.apply(words, breakWord(ctx, w, maxWidth)); + } else { + words.push(w); + } + }); + var lines = []; + var line = ""; + var cut = false; + for (var i = 0; i < words.length; i++) { + var probe = line ? line + " " + words[i] : words[i]; + if (line && ctx.measureText(probe).width > maxWidth) { + lines.push(line); + line = words[i]; + if (lines.length === maxLines) { cut = true; line = ""; break; } + } else { + line = probe; + } + } + if (line) lines.push(line); + if (cut && lines.length) { + var last = lines[lines.length - 1]; + while (last && ctx.measureText(last + "…").width > maxWidth) { + last = last.slice(0, -1); + } + lines[lines.length - 1] = last + "…"; + } + return lines; + } + + function compose(videoId, title, channel) { + return fetchThumbnail(videoId).then(function (blob) { + return createImageBitmap(blob); + }).then(function (bmp) { + var sw = bmp.width; + var sh = Math.round(sw * 9 / 16); + if (sh > bmp.height) { sh = bmp.height; sw = Math.round(sh * 16 / 9); } + var sx = Math.round((bmp.width - sw) / 2); + var sy = Math.round((bmp.height - sh) / 2); + + var W = CARD.width; + var pad = CARD.pad; + var tw = W - pad * 2; + var th = Math.round(tw * 9 / 16); + + var measure = document.createElement("canvas").getContext("2d"); + measure.font = CARD.titleFont; + var lines = wrapLines(measure, title || "", tw, CARD.titleMaxLines); + + var textTop = pad + th + CARD.gap; + var H = lines.length ? textTop + lines.length * CARD.titleLine : pad + th; + if (channel) H += CARD.channelGap + CARD.channelHeight; + H += pad; + + var canvas = document.createElement("canvas"); + canvas.width = W; + canvas.height = H; + var ctx = canvas.getContext("2d"); + ctx.fillStyle = CARD.bg; + ctx.fillRect(0, 0, W, H); + + ctx.save(); + roundedPath(ctx, pad, pad, tw, th, CARD.radius); + ctx.clip(); + ctx.drawImage(bmp, sx, sy, sw, sh, pad, pad, tw, th); + ctx.restore(); + + ctx.textBaseline = "top"; + ctx.fillStyle = CARD.fg; + ctx.font = CARD.titleFont; + for (var i = 0; i < lines.length; i++) { + ctx.fillText(lines[i], pad, textTop + i * CARD.titleLine); + } + if (channel) { + ctx.fillStyle = CARD.dim; + ctx.font = CARD.channelFont; + ctx.fillText(channel, pad, textTop + lines.length * CARD.titleLine + CARD.channelGap); + } + + return new Promise(function (resolve, reject) { + canvas.toBlob(function (png) { + if (png) resolve(png); + else reject(new Error("png dönüşümü başarısız")); + }, "image/png"); + }); + }); + } + + /* Görsel ve metin ayrı kopyalanır. İkisini tek pano yazımında vermek + * denendi; yapıştırılan alan biçimi kendisi seçiyor ve metin kutuları hep + * düz metni aldığı için görselin gittiği yeri kullanıcı kestiremiyordu. + * ClipboardItem'a doğrudan promise veriliyor: önce çizip sonra yazmak + * kullanıcı jestinin süresini aşabiliyor. */ + function copyImage(videoId, title, channel) { + if (typeof ClipboardItem === "undefined" || !navigator.clipboard.write) { + return Promise.reject(new Error("pano görsel desteklemiyor")); + } + return navigator.clipboard.write([ + new ClipboardItem({ "image/png": compose(videoId, title, channel) }) + ]); + } + + function copyText(videoId, title, isShort) { + var text = (title ? title + "\n" : "") + watchUrl(videoId, isShort); + return navigator.clipboard.writeText(text); + } + + /* Dosya adı başlıktan gelir; yalnız dosya sisteminin yasakladığı karakterler + * atılır, Türkçe harfler kalır. */ + function fileName(title, videoId) { + var base = String(title || "") + .replace(/[/\\:*?"<>|\u0000-\u001f]/g, "") + .replace(/\s+/g, " ") + .trim() + .slice(0, 120); + return (base || videoId) + ".png"; + } + + function download(videoId, title, channel) { + return compose(videoId, title, channel).then(function (blob) { + var url = URL.createObjectURL(blob); + var a = document.createElement("a"); + a.href = url; + a.download = fileName(title, videoId); + document.body.appendChild(a); + a.click(); + a.remove(); + setTimeout(function () { URL.revokeObjectURL(url); }, 10000); + }); + } + + function save(entry) { + return OBStore.libraryAdd({ + videoId: entry.videoId, + title: entry.title || "", + channel: entry.channel || "", + url: watchUrl(entry.videoId, entry.isShort), + isShort: !!entry.isShort, + score: entry.score != null ? entry.score : null, + views: entry.views != null ? entry.views : null, + savedAt: Date.now(), + /* Skorsuz kayıt (rozet daha yüklenirken menüden eklenen video) taze + * damgalanırsa kütüphanenin otomatik tazelemesi onu ttl boyunca atlar; + * damgasız kalsın ki ilk açılışta puanlansın. */ + scoredAt: entry.score != null ? Date.now() : null, + projectId: entry.projectId != null ? entry.projectId : null + }); + } + + return { + thumbnailUrl: thumbnailUrl, + watchUrl: watchUrl, + fetchThumbnail: fetchThumbnail, + compose: compose, + copyImage: copyImage, + copyText: copyText, + download: download, + save: save + }; +})(); diff --git a/src/badge.js b/src/badge.js index e1d15b8..b7d93ed 100644 --- a/src/badge.js +++ b/src/badge.js @@ -25,23 +25,6 @@ var OBBadge = (function () { return card; } - function isShortCard(card) { - return /shorts-lockup/i.test(card.tagName) || !!card.querySelector('a[href*="/shorts/"]'); - } - - function tone(score) { - if (score >= 10) return "ob-t4"; - if (score >= 5) return "ob-t3"; - if (score >= 2) return "ob-t2"; - if (score >= 1) return "ob-t1"; - return "ob-t0"; - } - - function label(score) { - if (score >= 10) return Math.round(score) + "x"; - return T.num(Math.round(score * 10) / 10, 1) + "x"; - } - function element(card) { var box = host(card); var el = box.querySelector(":scope > .ob-badge"); @@ -50,30 +33,29 @@ var OBBadge = (function () { el.className = "ob-badge"; if (getComputedStyle(box).position === "static") box.style.position = "relative"; box.appendChild(el); + /* Tıklama dinleyicisi burada yok: rozet tıklamaları OBMenu window + * seviyesinde, capture aşamasında yakalar. Rozetin kendi üstündeki bir + * dinleyici Shorts kartlarında işe yaramıyordu, YouTube tıklamayı + * belge seviyesindeki capture dinleyicisiyle daha önce alıp Short'u + * açıyordu. */ } - /* Shorts kapağının altı izlenme metniyle dolu, rozet orada üste gider. */ - el.dataset.short = isShortCard(card) ? "1" : ""; return el; } - function base(el) { - return "ob-badge" + (el.dataset.short ? " ob-short" : ""); - } - function loading(card) { var el = element(card); - el.className = base(el) + " ob-loading"; + el.className = "ob-badge ob-loading"; el.textContent = ""; el.removeAttribute("title"); } function show(card, result, extra) { var el = element(card); - el.className = base(el) + " " + tone(result.score); - el.textContent = label(result.score); + el.className = "ob-badge " + P.scoreTone(result.score); + el.textContent = P.scoreLabel(result.score); var unit = T.t(extra && extra.isShort ? "unitShorts" : "unitVideos"); var lines = [ - T.t("badgeScore", label(result.score)), + T.t("badgeScore", P.scoreLabel(result.score)), T.t("badgeViews", P.humanCount(result.views)), T.t("badgeMedian", P.humanCount(result.median), result.sample, unit) ]; @@ -90,7 +72,7 @@ var OBBadge = (function () { function fail(card, reason) { var el = element(card); - el.className = base(el) + " ob-none"; + el.className = "ob-badge ob-none"; el.textContent = "-"; el.title = reason || T.t("badgeFailed"); } @@ -101,5 +83,70 @@ var OBBadge = (function () { if (el) el.remove(); } - return { loading: loading, show: show, fail: fail, clear: clear }; + /* Rozet hâlâ yerinde mi? Hover önizlemesi kapak kutusunu yeniden kurup + * rozeti silebiliyor; tarama bununla anlayıp geri basar. */ + function present(card) { + return !!host(card).querySelector(":scope > .ob-badge"); + } + + /* --- Hayalet rozet ---------------------------------------------------- + * + * Hover önizlemesi (ytd-video-preview) kartın üstüne uygulama seviyesinde + * ayrı bir katman bindiriyor; kartın içindeki rozet z-index'i ne olursa + * olsun o katmanın altında kalıyor. Çare: fare karta girince rozetin + * birebir kopyası body'ye fixed basılır. Body çocuğu olduğu ve z-index'i + * en yüksek olduğu için önizlemenin de üstünde durur, tıklanabilir kalır. + * + * Hayaletin ömrü DOM'la değil geometriyle yönetilir: önizleme katmanı + * kartın soyundan gelmediği için "fare hâlâ kartın içinde mi" sorusuna + * closest() cevap veremez; onun yerine imlecin kartın dikdörtgeni içinde + * olup olmadığına bakılır (önizleme karttan biraz taştığı için payla). */ + var GHOST_MARGIN = 40; + var ghost = null; + var ghostCard = null; + + function hideGhost() { + if (ghost) { ghost.remove(); ghost = null; ghostCard = null; } + } + + function showGhost(card) { + var el = host(card).querySelector(":scope > .ob-badge"); + if (!el) { hideGhost(); return; } + var rect = el.getBoundingClientRect(); + if (!rect.width) { hideGhost(); return; } + if (!ghost) { + ghost = document.createElement("div"); + ghost.dataset.obGhost = "1"; + document.body.appendChild(ghost); + } + ghost.className = el.className + " ob-ghost"; + ghost.textContent = el.textContent; + ghost.title = el.title || ""; + ghost.obCard = card; + ghostCard = card; + ghost.style.left = rect.left + "px"; + ghost.style.top = rect.top + "px"; + } + + document.addEventListener("mouseover", function (e) { + var node = e.target; + if (node && node.dataset && node.dataset.obGhost) return; + while (node && !node.obVideoId) node = node.parentElement; + if (node && (node !== ghostCard || !ghost)) showGhost(node); + }, true); + + document.addEventListener("mousemove", function (e) { + if (!ghost) return; + if (!ghostCard || !ghostCard.isConnected) { hideGhost(); return; } + var r = ghostCard.getBoundingClientRect(); + if (e.clientX < r.left - GHOST_MARGIN || e.clientX > r.right + GHOST_MARGIN || + e.clientY < r.top - GHOST_MARGIN || e.clientY > r.bottom + GHOST_MARGIN) { + hideGhost(); + } + }, true); + + window.addEventListener("scroll", hideGhost, true); + window.addEventListener("yt-navigate-start", hideGhost); + + return { loading: loading, show: show, fail: fail, clear: clear, present: present }; })(); diff --git a/src/content.js b/src/content.js index 78a1b1c..311c04f 100644 --- a/src/content.js +++ b/src/content.js @@ -146,12 +146,21 @@ function processCard(card) { var videoId = videoIdOf(card); - if (!videoId) return; + /* Erken dönüşlerin hepsi obBadged'i düşürmek zorunda: bayrak yüksek ama + * rozet yok kalırsa scan()'in geri basma dalı kartı her turda yeniden + * işleyen bir döngüye girer. */ + if (!videoId) { card.obBadged = false; return; } if (card.obVideoId === videoId) return; card.obVideoId = videoId; + card.obScore = null; + card.obViews = null; var isShort = isShortCard(card); - if (isShort && !settings.scoreShorts) { OBBadge.clear(card); return; } + if (isShort && !settings.scoreShorts) { + card.obBadged = false; + OBBadge.clear(card); + return; + } counters.seen++; OBBadge.loading(card); @@ -166,19 +175,26 @@ var result = OBScore.score(videoId, views, isShort, blob); if (result.score == null) { counters.skipped++; + card.obBadged = false; OBBadge.clear(card); return; } if (settings.minScore && result.score < settings.minScore) { + card.obBadged = false; OBBadge.clear(card); return; } var age = own && own.age != null ? own.age : domAgeDays(card); + /* Rozet menüsü kaydederken skoru da yazsın diye kartta saklanır. */ + card.obScore = result.score; + card.obViews = result.views; counters.scored++; + card.obBadged = true; OBBadge.show(card, result, { young: age != null && age < 7, isShort: isShort }); }).catch(function (err) { counters.failed++; lastError = String(err && err.message ? err.message : err); + card.obBadged = false; OBBadge.clear(card); }); } @@ -261,6 +277,13 @@ /* YouTube kartları geri dönüştürüyor: aynı DOM elemanı başka videoya * bağlıysa rozet eskimiş demektir. */ processCard(card); + } else if (card.obBadged && !OBBadge.present(card)) { + /* Hover önizlemesi (özellikle Shorts'ta) kapak kutusunu yeniden + * kuruyor ve rozet DOM'dan siliniyor. Baseline önbellekte, geri + * basmak ucuz. obVideoId sıfırlanır ki processCard "zaten işledim" + * deyip erken dönmesin. */ + card.obVideoId = null; + processCard(card); } } } @@ -276,6 +299,7 @@ for (var i = 0; i < cards.length; i++) { OBBadge.clear(cards[i]); cards[i].obVideoId = null; + cards[i].obBadged = false; } OBPanel.remove(); panelVideoId = null; diff --git a/src/i18n.js b/src/i18n.js index a4f4870..8d697ea 100644 --- a/src/i18n.js +++ b/src/i18n.js @@ -21,6 +21,42 @@ var OBI18n = (function () { unitVideos: "video", unitShorts: "Shorts", + menuCopyImage: "Görseli kopyala", + menuCopyText: "Başlık + linki kopyala", + menuCopied: "Kopyalandı ✓", + menuDownload: "Kapak + başlığı indir", + menuDownloaded: "İndirildi ✓", + menuSave: "Kütüphaneye ekle", + menuSaved: "Eklendi ✓", + menuUnsave: "Kütüphaneden çıkar", + menuRemoved: "Çıkarıldı ✓", + menuFailed: "Olmadı, tekrar dene", + + libTitle: "Kütüphane", + libAll: "Tümü", + libInbox: "Gelen kutusu", + libNewProject: "+ Yeni proje", + libProjectName: "Proje adı", + libRenameProject: "Yeniden adlandır", + libDeleteProject: "Projeyi sil", + libDeleteProjectHint: "Silinen projenin videoları gelen kutusuna taşınır", + libSearch: "Başlık veya kanal ara", + libRefresh: "Skorları güncelle", + libRefreshing: "Skorlar güncelleniyor ($1 video)…", + libRefreshed: "$1 videonun skoru güncellendi.", + libExport: "Dışa aktar", + libImport: "İçe aktar", + libImported: "$1 video, $2 proje içe aktarıldı.", + libImportFailed: "Dosya okunamadı: $1", + libEmpty: "Burada henüz video yok. YouTube'da bir rozete tıklayıp \"Kütüphaneye ekle\" de.", + libCount: "$1 video", + libCopyImage: "Görsel", + libCopyText: "Metin", + libDownload: "İndir", + libDelete: "Sil", + libConfirmDelete: "Silinsin?", + libDone: "✓", + panelLoading: "Outlier hesaplanıyor", panelTitle: "Outlier", panelHead: "kanal medyanının katı", @@ -52,6 +88,7 @@ var OBI18n = (function () { popupMinScore: "Şu skorun altını gizle", popupTtl: "Önbellek ömrü", popupLanguage: "Dil", + popupLibrary: "Kütüphaneyi aç", popupClear: "Önbelleği temizle", popupCleared: "Önbellek temizlendi.", popupNote: "Skor = videonun izlenmesi / kanalın son N videosunun izlenme medyanı. " + @@ -84,6 +121,42 @@ var OBI18n = (function () { unitVideos: "videos", unitShorts: "Shorts", + menuCopyImage: "Copy image", + menuCopyText: "Copy title + link", + menuCopied: "Copied ✓", + menuDownload: "Download thumbnail + title", + menuDownloaded: "Downloaded ✓", + menuSave: "Add to library", + menuSaved: "Added ✓", + menuUnsave: "Remove from library", + menuRemoved: "Removed ✓", + menuFailed: "Failed, try again", + + libTitle: "Library", + libAll: "All", + libInbox: "Inbox", + libNewProject: "+ New project", + libProjectName: "Project name", + libRenameProject: "Rename", + libDeleteProject: "Delete project", + libDeleteProjectHint: "A deleted project's videos move to the inbox", + libSearch: "Search title or channel", + libRefresh: "Refresh scores", + libRefreshing: "Updating scores ($1 videos)…", + libRefreshed: "Updated scores for $1 videos.", + libExport: "Export", + libImport: "Import", + libImported: "Imported $1 videos and $2 projects.", + libImportFailed: "Could not read the file: $1", + libEmpty: "Nothing here yet. Click a badge on YouTube and pick \"Add to library\".", + libCount: "$1 videos", + libCopyImage: "Image", + libCopyText: "Text", + libDownload: "Download", + libDelete: "Delete", + libConfirmDelete: "Delete?", + libDone: "✓", + panelLoading: "Calculating outlier score", panelTitle: "Outlier", panelHead: "of the channel median", @@ -115,6 +188,7 @@ var OBI18n = (function () { popupMinScore: "Hide scores below", popupTtl: "Cache lifetime", popupLanguage: "Language", + popupLibrary: "Open library", popupClear: "Clear cache", popupCleared: "Cache cleared.", popupNote: "Score = the video's views divided by the median views of the channel's last N " + diff --git a/src/menu.js b/src/menu.js new file mode 100644 index 0000000..375f327 --- /dev/null +++ b/src/menu.js @@ -0,0 +1,211 @@ +/* Rozete tıklanınca açılan menü: kopyala, indir, kütüphaneye ekle/çıkar. + * + * Menü kartın içine değil body'ye eklenir: kart kapsayıcılarının overflow'u + * menüyü kırpar. Konum rozetin o anki yerinden ölçülür, kaydırma ve sayfa içi + * gezinme menüyü kapatır; takip etmeye çalışmaktan ucuz ve yeterli. + */ +var OBMenu = (function () { + "use strict"; + + var T = OBI18n; + var open = null; + + function close() { + if (open) { open.remove(); open = null; } + } + + /* Rozetin kendisi hariç tutulur: rozet tıklaması buraya da düşer ve menü + * burada kapatılırsa toggle açık menü göremez, ikinci tık kapatmak yerine + * yeniden açardı. */ + document.addEventListener("click", function (e) { + if (!open) return; + if (open.contains(e.target) || open.obAnchor.contains(e.target)) return; + close(); + }, true); + + /* Rozet tıklamaları window seviyesinde, capture aşamasında yakalanır ve + * yutulur. Rozetin kendi üstünde dinleyici yetmiyordu: YouTube özellikle + * Shorts kartlarında tıklamayı belge seviyesindeki capture dinleyicisiyle + * bizden önce alıp Short'u açıyordu. Olay yolu window -> document diye + * aktığı için buradaki stopPropagation YouTube'unkilerden önce çalışır. */ + var badgeOf = function (e) { + return e.target && e.target.closest ? e.target.closest(".ob-badge") : null; + }; + + ["pointerdown", "pointerup", "mousedown", "mouseup", "touchend"].forEach(function (type) { + window.addEventListener(type, function (e) { + if (badgeOf(e)) e.stopPropagation(); + }, true); + }); + + window.addEventListener("click", function (e) { + var badge = badgeOf(e); + if (!badge) return; + e.preventDefault(); + e.stopPropagation(); + /* Hayalet rozet body'de durur, kartı DOM'dan bulunamaz; kart referansı + * hayaletin üstünde taşınır. */ + var card = badge.obCard || badge.parentElement; + while (card && !card.obVideoId) card = card.parentElement; + if (card) toggle(badge, contextOf(card)); + }, true); + window.addEventListener("scroll", close, true); + window.addEventListener("yt-navigate-start", close); + window.addEventListener("resize", close); + + /* --- Karttan bağlam çıkarma ------------------------------------------ */ + + /* Başlık kart türüne göre farklı yerlerde; sıra özelden genele. */ + var TITLE_SELECTORS = [ + "#video-title", + "a#video-title-link", + "[class*='lockup-metadata'][class*='title']", + ".shortsLockupViewModelHostMetadataTitle", + "h3 a[href*='/watch']", + "h3 a[href*='/shorts/']" + ]; + + function titleOf(card) { + for (var i = 0; i < TITLE_SELECTORS.length; i++) { + var el = card.querySelector(TITLE_SELECTORS[i]); + var text = el && ((el.getAttribute("title") || "").trim() || (el.textContent || "").trim()); + if (text) return text; + } + return ""; + } + + var CHANNEL_SELECTORS = [ + "ytd-channel-name a", + "ytd-channel-name #text", + "[class*='metadata-view-model'][class*='text'] a[href^='/@']", + "a[href^='/@']" + ]; + + function channelOf(card) { + for (var i = 0; i < CHANNEL_SELECTORS.length; i++) { + var el = card.querySelector(CHANNEL_SELECTORS[i]); + var text = el && (el.textContent || "").trim(); + if (text && text.charAt(0) !== "/") return text; + } + return ""; + } + + function contextOf(card) { + return { + videoId: card.obVideoId, + title: titleOf(card), + channel: channelOf(card), + isShort: /shorts-lockup/i.test(card.tagName) || !!card.querySelector('a[href*="/shorts/"]'), + score: card.obScore != null ? card.obScore : null, + views: card.obViews != null ? card.obViews : null + }; + } + + /* Kanal sayfası kartlarında başlık bazen sadece görselin aria-label'ında; + * hiçbir yerde yoksa son çare InnerTube'a sorulur (tek istek, menü zaten + * kullanıcı jestiyle açıldı). */ + function ensureTitle(ctx) { + if (ctx.title) return Promise.resolve(ctx); + return OBTube.videoDetails(ctx.videoId).then(function (d) { + ctx.title = d.title || ""; + return ctx; + }, function () { return ctx; }); + } + + /* --- Menü ------------------------------------------------------------ */ + + function item(labelKey, action) { + var el = document.createElement("button"); + el.type = "button"; + el.className = "ob-menu-item"; + el.textContent = T.t(labelKey); + el.addEventListener("click", function (e) { + e.preventDefault(); + e.stopPropagation(); + if (el.disabled) return; + el.disabled = true; + el.textContent = "…"; + action().then(function (doneKey) { + el.textContent = T.t(doneKey); + /* Zamanlayıcı yalnız kendi menüsünü kapatır: aradan geçen sürede + * başka bir rozetin menüsü açıldıysa ona dokunmaz. */ + var owner = el.parentElement; + setTimeout(function () { if (open === owner) close(); }, 900); + }, function () { + el.disabled = false; + el.textContent = T.t("menuFailed"); + }); + }); + return el; + } + + function place(menu, anchor) { + var rect = anchor.getBoundingClientRect(); + menu.style.visibility = "hidden"; + document.body.appendChild(menu); + var width = menu.offsetWidth; + var height = menu.offsetHeight; + var left = Math.min(rect.right - width, window.innerWidth - width - 8); + var top = rect.bottom + 6; + if (top + height > window.innerHeight - 8) top = rect.top - height - 6; + menu.style.left = Math.max(8, left) + "px"; + menu.style.top = Math.max(8, top) + "px"; + menu.style.visibility = ""; + } + + function toggle(anchor, ctx) { + if (open && open.obAnchor === anchor) { close(); return; } + close(); + if (!ctx.videoId) return; + + var menu = document.createElement("div"); + menu.className = "ob-menu"; + menu.obAnchor = anchor; + + menu.appendChild(item("menuCopyImage", function () { + return ensureTitle(ctx).then(function () { + return OBActions.copyImage(ctx.videoId, ctx.title, ctx.channel); + }).then(function () { return "menuCopied"; }); + })); + + menu.appendChild(item("menuCopyText", function () { + return ensureTitle(ctx).then(function () { + return OBActions.copyText(ctx.videoId, ctx.title, ctx.isShort); + }).then(function () { return "menuCopied"; }); + })); + + menu.appendChild(item("menuDownload", function () { + return ensureTitle(ctx).then(function () { + return OBActions.download(ctx.videoId, ctx.title, ctx.channel); + }).then(function () { return "menuDownloaded"; }); + })); + + var saved = false; + var saveItem = item("menuSave", function () { + if (saved) { + return OBStore.libraryRemove(ctx.videoId).then(function () { + saved = false; + return "menuRemoved"; + }); + } + return ensureTitle(ctx).then(function () { + return OBActions.save(ctx); + }).then(function () { + saved = true; + return "menuSaved"; + }); + }); + menu.appendChild(saveItem); + OBStore.libraryHas(ctx.videoId).then(function (has) { + if (has && !saveItem.disabled) { + saved = true; + saveItem.textContent = T.t("menuUnsave"); + } + }); + + place(menu, anchor); + open = menu; + } + + return { toggle: toggle, contextOf: contextOf, close: close }; +})(); diff --git a/src/panel.js b/src/panel.js index bed590b..658376b 100644 --- a/src/panel.js +++ b/src/panel.js @@ -139,21 +139,13 @@ var OBPanel = (function () { panel.appendChild(el("div", "ob-note", message)); } - function tone(score) { - return score >= 10 ? "ob-t4" : score >= 5 ? "ob-t3" - : score >= 2 ? "ob-t2" : score >= 1 ? "ob-t1" : "ob-t0"; - } - function render(data) { var panel = mount(); if (!panel) return; panel.textContent = ""; var head = el("div", "ob-panel-head"); - var scoreText = data.score >= 10 - ? Math.round(data.score) + "x" - : T.num(Math.round(data.score * 10) / 10, 1) + "x"; - head.appendChild(el("span", "ob-chip " + tone(data.score), scoreText)); + head.appendChild(el("span", "ob-chip " + P.scoreTone(data.score), P.scoreLabel(data.score))); head.appendChild(el("span", "ob-head-text", T.t("panelHead"))); panel.appendChild(head); diff --git a/src/parse.js b/src/parse.js index 3388672..b0fe371 100644 --- a/src/parse.js +++ b/src/parse.js @@ -133,9 +133,27 @@ var OBParse = (function () { return String(Math.round(n)); } + /* Skor -> renk sınıfı ve "2,4x" etiketi. Rozet, izleme paneli ve kütüphane + * aynı eşikleri ve yuvarlamayı kullanır; tek kopya burada durur ki eşik + * değişince üçü birden değişsin. */ + function scoreTone(score) { + if (score == null) return null; + return score >= 10 ? "ob-t4" : score >= 5 ? "ob-t3" + : score >= 2 ? "ob-t2" : score >= 1 ? "ob-t1" : "ob-t0"; + } + + function scoreLabel(score) { + if (score >= 10) return Math.round(score) + "x"; + var rounded = Math.round(score * 10) / 10; + if (typeof OBI18n === "undefined") return rounded.toFixed(1) + "x"; + return OBI18n.num(rounded, 1) + "x"; + } + return { findAll: findAll, findFirst: findFirst, + scoreTone: scoreTone, + scoreLabel: scoreLabel, textOf: textOf, parseCountEn: parseCountEn, parseCountUI: parseCountUI, diff --git a/src/store.js b/src/store.js index df9bfa1..0f0180c 100644 --- a/src/store.js +++ b/src/store.js @@ -116,6 +116,58 @@ var OBStore = (function () { return set(payload); } + /* --- Kütüphane ------------------------------------------------------- */ + + /* Kütüphane bellekte önbelleklenmez: kütüphane sayfası ile açık YouTube + * sekmeleri aynı veriyi düzenliyor, bayat kopya yanlış "ekli/değil" gösterir. + * Erişim seyrek (menü açılışı, kayıt), her seferinde depodan okumak ucuz. */ + var LIBRARY_KEY = "library"; + + function readLibrary() { + return get(LIBRARY_KEY).then(function (r) { + var lib = r[LIBRARY_KEY] || {}; + return { + v: 1, + projects: Array.isArray(lib.projects) ? lib.projects : [], + items: Array.isArray(lib.items) ? lib.items : [] + }; + }); + } + + function writeLibrary(lib) { + var payload = {}; + payload[LIBRARY_KEY] = lib; + return set(payload); + } + + /* Aynı video ikinci kez eklenirse eski kaydın yerine geçer (tek girdi, + * proje bilgisi korunur), listenin başına alınır. */ + function libraryAdd(item) { + return readLibrary().then(function (lib) { + var old = null; + lib.items = lib.items.filter(function (it) { + if (it.videoId === item.videoId) { old = it; return false; } + return true; + }); + if (old && item.projectId == null) item.projectId = old.projectId; + lib.items.unshift(item); + return writeLibrary(lib).then(function () { return lib; }); + }); + } + + function libraryRemove(videoId) { + return readLibrary().then(function (lib) { + lib.items = lib.items.filter(function (it) { return it.videoId !== videoId; }); + return writeLibrary(lib); + }); + } + + function libraryHas(videoId) { + return readLibrary().then(function (lib) { + return lib.items.some(function (it) { return it.videoId === videoId; }); + }); + } + function clearBaselines() { mem = {}; return get("blIndex").then(function (r) { @@ -139,6 +191,11 @@ var OBStore = (function () { writeBaseline: writeBaseline, readChannelId: readChannelId, writeChannelId: writeChannelId, + readLibrary: readLibrary, + writeLibrary: writeLibrary, + libraryAdd: libraryAdd, + libraryRemove: libraryRemove, + libraryHas: libraryHas, clearBaselines: clearBaselines, stats: stats }; diff --git a/src/style.css b/src/style.css index e13e36a..53463ab 100644 --- a/src/style.css +++ b/src/style.css @@ -8,6 +8,10 @@ position: absolute; right: 4px; bottom: 30px; + /* Mütevazı kalmalı: yüksek bir değer rozeti YouTube'un kendi katmanlarının + (açıklama penceresi gibi dialoglar ~2200) üstüne taşırıyor. Hover + önizlemesinin üstünde kalma işi kartın içindeki bu rozetin değil, + body'ye basılan hayalet kopyanın. */ z-index: 20; min-width: 34px; padding: 3px 7px; @@ -18,14 +22,21 @@ background: rgba(0, 0, 0, 0.78); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4); pointer-events: auto; - cursor: default; + cursor: pointer; white-space: nowrap; } -/* Shorts kapağının altı izlenme metniyle dolu, orada rozet üste gider. */ -.ob-badge.ob-short { - top: 6px; +.ob-badge:hover { + outline: 1px solid rgba(255, 255, 255, 0.55); +} + +/* Hayalet rozet: hover önizleme katmanının üstünde duran fixed kopya; + left/top JS'ten inline verilir. */ +.ob-badge.ob-ghost { + position: fixed; + right: auto; bottom: auto; + z-index: 2147483647; } .ob-badge.ob-loading { @@ -52,6 +63,39 @@ .ob-t3 { background: rgba(180, 83, 9, 0.94); } .ob-t4 { background: rgba(159, 18, 57, 0.95); } +/* --- Rozet menüsü --- */ + +/* Menü de rozet gibi tema bağımsız koyu: sayfanın her yerinde aynı görünür. */ +.ob-menu { + position: fixed; + z-index: 2147483000; + min-width: 190px; + padding: 5px; + border-radius: 9px; + background: #212121; + border: 1px solid rgba(255, 255, 255, 0.14); + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.5); + font-family: "Roboto", "Segoe UI", sans-serif; +} + +.ob-menu-item { + display: block; + width: 100%; + padding: 8px 11px; + border: 0; + border-radius: 6px; + background: transparent; + color: #eee; + font: 500 13px/1.3 inherit; + font-family: inherit; + text-align: left; + cursor: pointer; + white-space: nowrap; +} + +.ob-menu-item:hover:not(:disabled) { background: rgba(255, 255, 255, 0.12); } +.ob-menu-item:disabled { color: #9aa0a6; cursor: default; } + /* --- Izleme sayfasi paneli --- */ .ob-panel {