File size: 2,066 Bytes
8a7cf4a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
94dcdac
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import os, re
from googleapiclient.discovery import build
from sentence_transformers import SentenceTransformer, util
import gradio as gr

# YouTube API key
YT_API_KEY = os.environ.get("YOUTUBE_API_KEY")
if not YT_API_KEY:
    raise ValueError("Set YOUTUBE_API_KEY in Settings → Secrets")

youtube = build("youtube", "v3", developerKey=YT_API_KEY)

MODEL_NAMES = [
  "sentence-transformers/all-MiniLM-L6-v2",
  "sentence-transformers/multi-qa-MiniLM-L6-cos-v1",
  "sentence-transformers/paraphrase-MiniLM-L3-v2",
  "sentence-transformers/all-mpnet-base-v2",
  "sentence-transformers/distilbert-base-nli-mean-tokens",
]
models = [SentenceTransformer(name) for name in MODEL_NAMES]

def extract_video_id(url):
    patterns = [ r"v=([A-Za-z0-9_-]{11})", r"youtu\.be/([A-Za-z0-9_-]{11})" ]
    for p in patterns:
        m = re.search(p, url)
        if m: return m.group(1)
    raise ValueError("Invalid YouTube URL")

def fetch_metadata(video_url):
    vid = extract_video_id(video_url)
    resp = youtube.videos().list(part="snippet", id=vid).execute()
    items = resp.get("items", [])
    if not items: raise ValueError("Video not found")
    snip = items[0]["snippet"]
    return snip.get("title",""), snip.get("description","")

def compute_score(video_url, goal):
    title, desc = fetch_metadata(video_url)
    text = title + "\n\n" + desc
    scores = []
    for m in models:
        emb_text = m.encode(text, convert_to_tensor=True, normalize_embeddings=True)
        emb_goal = m.encode(goal, convert_to_tensor=True, normalize_embeddings=True)
        cos_sim = util.cos_sim(emb_text, emb_goal).item()
        pct = int((cos_sim + 1) * 50)
        scores.append(max(0, min(100, pct)))
    return int(round(sum(scores)/len(scores)))

iface = gr.Interface(
  fn=compute_score,
  inputs=[ gr.Textbox(label="YouTube URL"), gr.Textbox(label="Your Goal") ],
  outputs=gr.Number(label="Score 0–100"),
  description="Average of 5 sentence-transformer models"
)

if __name__=="__main__":
    iface.launch(server_name="0.0.0.0", server_port=7860, mcp_server=True)