Spaces:
Sleeping
Sleeping
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) | |