import os import pickle import logging from google.auth.transport.requests import Request from google_auth_oauthlib.flow import InstalledAppFlow log = logging.getLogger(__name__) SCOPES = ["https://www.googleapis.com/auth/youtube.readonly"] CONFIG_DIR = os.environ.get("CONFIG_DIR", "/app/config") _local_dir = os.path.dirname(os.path.abspath(__file__)) _local_config = os.path.join(os.path.dirname(_local_dir), "config") if os.path.exists(os.path.join(_local_config, "client_secret.json")): CONFIG_DIR = _local_config CLIENT_SECRET = os.path.join(CONFIG_DIR, "client_secret.json") TOKEN_FILE = os.path.join(CONFIG_DIR, "token.pickle") def get_credentials(): """Load or refresh OAuth credentials, triggering browser flow if needed.""" creds = None if os.path.exists(TOKEN_FILE): with open(TOKEN_FILE, "rb") as token: creds = pickle.load(token) if not creds or not creds.valid: if creds and creds.expired and creds.refresh_token: creds.refresh(Request()) else: if not os.path.exists(CLIENT_SECRET): raise FileNotFoundError( f"client_secret.json not found at {CLIENT_SECRET}. " "Download from Google Cloud Console." ) flow = InstalledAppFlow.from_client_secrets_file(CLIENT_SECRET, SCOPES) creds = flow.run_local_server(port=0) os.makedirs(os.path.dirname(TOKEN_FILE), exist_ok=True) with open(TOKEN_FILE, "wb") as token: pickle.dump(creds, token) return creds