Skip to main content
Glama
utils.py2.64 kB
from datetime import datetime from math import floor, log from math import pow as pw from typing import Any from .categories import get_category_id, get_category_name from .models import Torrent def format_size(size_bytes: int | None) -> str: """Converts a size in bytes to a human-readable string.""" if size_bytes is None: return "N/A" if size_bytes == 0: return "0B" size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB") i = int(floor(log(size_bytes, 1024))) p = pw(1024, i) s = round(size_bytes / p, 2) return f"{s} {size_name[i]}" def format_date(date_str: str | None) -> str: """Converts an ISO date string to a human-readable string 'YYYY-MM-DD HH:MM:SS' or 'N/A' if input is None.""" if date_str is None: return "N/A" return datetime.fromisoformat(date_str).strftime("%Y-%m-%d %H:%M:%S") def format_torrent(torrent: dict[str, Any], torrent_id: int | None = None) -> Torrent: """Converts a torrent data dictionary from the API into a Torrent model instance.""" cat_id: int | str = torrent.get("category_id") or "N/A" return Torrent( id=torrent_id or torrent.get("id") or 0, filename=torrent.get("title") or "N/A", category=( get_category_name(cat_id) or str(cat_id) if isinstance(cat_id, int) else str(cat_id) ), size=format_size(torrent.get("size")), seeders=torrent.get("seeders") or 0, leechers=torrent.get("leechers") or 0, downloads=torrent.get("downloads") or 0, date=format_date(torrent.get("uploaded_at")), magnet_link=None, ) def check_categories(categories: list[int] | list[str] | None = None) -> list[int]: """Checks if the categories are valid.""" processed_category_ids: list[int] = [] if categories: if all(isinstance(cat, int) for cat in categories): processed_category_ids = list(set(categories)) # type: ignore elif all(isinstance(cat, str) for cat in categories): temp_ids: list[int] = [] for keyword_val in categories: cat_id = get_category_id(str(keyword_val).lower()) if cat_id is not None: temp_ids.append(cat_id) if temp_ids: processed_category_ids = list(set(temp_ids)) if not processed_category_ids: print( f"Warning: None of the provided category keywords matched: {categories}." " Proceeding without category filter." ) return processed_category_ids

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/philogicae/ygg-torrent-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server