Inserts each YouTube video ID into your Supabase table exactly once
目前為
// ==UserScript==
// @name YouTube → Supabase Logger
// @description Inserts each YouTube video ID into your Supabase table exactly once
// @match https://www.youtube.com/
// @run-at document-end
// @version 0.0.1.20250508200230
// @namespace https://greasyfork.org/users/1435046
// ==/UserScript==
(function() {
'use strict';
// Supabase configuration
const SUPABASE_URL = 'https://haughsijawbsqwumuryg.supabase.co';
const SUPABASE_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImhhdWdoc2lqYXdic3F3dW11cnlnIiwicm9sZSI6ImFub24iLCJpYXQiOjE3MzM0ODE3MjYsImV4cCI6MjA0OTA1NzcyNn0.stESUMuJEs4CNBWGtxZr1XNp2XpnQeXmKkq3fNaVE-c';
const TABLE = 'youtube_recommended_videos_table';
// Remember which IDs we've already sent
const seen = new Set();
// Extracts the “v” parameter from a YouTube URL
function getVideoId(href) {
try {
const u = new URL(href);
return u.searchParams.get('v');
} catch {
return null;
}
}
// Inserts a new video ID into Supabase
function insertVideoId(id) {
fetch(`${SUPABASE_URL}/rest/v1/${TABLE}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'apikey': SUPABASE_KEY,
'Authorization': `Bearer ${SUPABASE_KEY}`
},
body: JSON.stringify([{ video_id_column: id }])
});
}
// Scan for new video links and send unseen IDs to Supabase
function logAndSend() {
document.querySelectorAll('a[href*="/watch"]').forEach(link => {
const id = getVideoId(link.href);
if (id && !seen.has(id)) {
seen.add(id);
insertVideoId(id);
}
});
}
// Initial run
logAndSend();
// Observe for added nodes
new MutationObserver(logAndSend)
.observe(document.body, { childList: true, subtree: true });
})();