YouTube → Supabase Logger (Homepage Only)

Inserts each YouTube video ID into your Supabase table exactly once—only on the homepage feed

// ==UserScript==
// @name        YouTube → Supabase Logger (Homepage Only)
// @description Inserts each YouTube video ID into your Supabase table exactly once—only on the homepage feed
// @match       https://www.youtube.com/*
// @run-at      document-end
// @version 0.0.1.20250508203757
// @namespace https://greasyfork.org/users/1435046
// ==/UserScript==
 
(function() {
  'use strict';
 
  // 0. Bail out if not on the homepage feed
  const p = location.pathname;
  // skip video watch pages, search/results, and any channel pages
  if (
    p.startsWith('/watch')    ||  // individual video page
    p.startsWith('/results')  ||  // search results
    p.startsWith('/@')        ||  // “@channel” handle
    p.startsWith('/channel')  ||  // standard channel URL
    p.startsWith('/c')           // custom channel URL
  ) {
    return;
  }
 
  // 1. Supabase configuration
  const SUPABASE_URL = 'https://haughsijawbsqwumuryg.supabase.co';
  const SUPABASE_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImhhdWdoc2lqYXdic3F3dW11cnlnIiwicm9sZSI6ImFub24iLCJpYXQiOjE3MzM0ODE3MjYsImV4cCI6MjA0OTA1NzcyNn0.stESUMuJEs4CNBWGtxZr1XNp2XpnQeXmKkq3fNaVE-c';
  const TABLE         = 'youtube_recommended_videos_table';
 
  // 2. Track which IDs have been sent
  const seen = new Set();
 
  // 3. Extract the “v” parameter from any YouTube URL
  function getVideoId(href) {
    try {
      const u = new URL(href);
      return u.searchParams.get('v');
    } catch {
      return null;
    }
  }
 
  // 4. POST one new video ID to 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 }])
    });
  }
 
  // 5. Find every “/watch” link on the homepage feed,
  //    skip ones in `seen`, send the rest
  function logAndSend() {
    document.querySelectorAll('a[href*="/watch"]').forEach(link => {
      const id = getVideoId(link.href);
      if (id && !seen.has(id)) {
        seen.add(id);
        insertVideoId(id);
      }
    });
  }
 
  // 6. Initial scan
  logAndSend();
 
  // 7. Re-scan whenever YouTube injects more items (infinite scroll)
  new MutationObserver(logAndSend)
    .observe(document.body, { childList: true, subtree: true });
 
})();