Maista c2abfdf6d8
Aylo API scrapers (#1641)
* Add new AyloAPI scrapers
* Remove old MindGeek scrapers deprecated by AyloAPI
* Update SCRAPERS-LIST for AyloAPI
2024-02-03 18:45:33 +01:00

68 lines
1.8 KiB
Python

import atexit
import datetime
import json
from pathlib import Path
from typing import Callable
from urllib.parse import urlparse
"""
Keeps a cache of instance tokens for the Aylo API.
Domains are assumed to omit the TLD, e.g. "brazzers" instead of "brazzers.com"
"""
__TOKENS_FILE = Path(__file__).parent / "aylo_tokens.json"
try:
__TOKENS = json.load(__TOKENS_FILE.open(encoding="utf-8"))
except (FileNotFoundError, json.JSONDecodeError):
__TOKENS = {}
@atexit.register
def __save_domains():
sorted_domains = dict(sorted(__TOKENS.items(), key=lambda x: x[0]))
json.dump(sorted_domains, __TOKENS_FILE.open("w", encoding="utf-8"), indent=2)
def site_name(url: str) -> str:
"""
Returns the site name of the given URL, e.g. "brazzers" for "https://www.brazzers.com"
"""
return urlparse(url).netloc.split(".")[-2]
def get_token_for(domain: str, fallback: Callable[[str], str | None]) -> str | None:
"""
Returns a token for the given domain. If the stored token is not valid, the provided
fallback function will be used to generate a new token.
If the fallback function returns None, it will return None.
"""
today = datetime.datetime.today().strftime("%Y-%m-%d")
# If the domain is in the list and if the token is still valid we just return it
if (entry := __TOKENS.get(domain)) and entry["date"] == today and entry["token"]:
return entry["token"]
# Generate the token using the provided fallback function
url = f"https://www.{domain}.com"
token = fallback(url)
if not token:
return None
# And persist it
__TOKENS[domain] = {
"token": token,
"date": today,
}
return token
def all_domains() -> list[str]:
"""
Returns a list of all known domains for the Aylo API
"""
return list(__TOKENS.keys())