76 lines
2.5 KiB
Python
76 lines
2.5 KiB
Python
import hashlib
|
|
import time
|
|
|
|
import pytz
|
|
import requests
|
|
from django.conf import settings
|
|
from django.utils import timezone
|
|
from scrobbles.utils import timestamp_user_tz_to_utc
|
|
|
|
PODCASTINDEX_API_KEY = getattr(settings, "PODCASTINDEX_API_KEY")
|
|
PODCASTINDEX_API_SECRET = getattr(settings, "PODCASTINDEX_API_SECRET")
|
|
|
|
|
|
def get_auth_headers():
|
|
now = int(time.time())
|
|
hash_data = hashlib.sha1(
|
|
(PODCASTINDEX_API_KEY + PODCASTINDEX_API_SECRET + str(now)).encode(
|
|
"utf-8"
|
|
)
|
|
).hexdigest()
|
|
|
|
return {
|
|
"User-Agent": "MyPodcastApp/1.0",
|
|
"X-Auth-Date": str(now),
|
|
"X-Auth-Key": PODCASTINDEX_API_KEY,
|
|
"Authorization": hash_data,
|
|
"Content-Type": "application/json",
|
|
}
|
|
|
|
|
|
def lookup_podcast_from_podcastindex(
|
|
podcast_name: str, dump_raw_response: bool = False
|
|
) -> dict:
|
|
url = "https://api.podcastindex.org/api/1.0/search/byterm"
|
|
headers = get_auth_headers()
|
|
params = {"q": podcast_name}
|
|
|
|
response = requests.get(url, headers=headers, params=params)
|
|
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
if dump_raw_response:
|
|
return data.get("feeds")
|
|
if data.get("feeds"):
|
|
try:
|
|
top_feed_dict = data["feeds"][0]
|
|
|
|
newest_episode_date = timestamp_user_tz_to_utc(
|
|
top_feed_dict.get("newestItemPubdate"), pytz.UTC
|
|
)
|
|
days_since_last_episode = ()
|
|
dead_date = None
|
|
if (timezone.now() - newest_episode_date).days > 180:
|
|
dead_date = newest_episode_date
|
|
|
|
return {
|
|
"podcastindex_id": top_feed_dict.get("id"),
|
|
"title": top_feed_dict.get("title"),
|
|
"site_link": top_feed_dict.get("link"),
|
|
"description": top_feed_dict.get("description"),
|
|
"owner": top_feed_dict.get("ownerName"),
|
|
"image_url": top_feed_dict.get("artwork"),
|
|
"feed_url": top_feed_dict.get("url"),
|
|
"itunes_id": top_feed_dict.get("itunesId"),
|
|
"genres": list(top_feed_dict.get("categories").values()),
|
|
"dead_date": dead_date,
|
|
}
|
|
except IndexError:
|
|
return {}
|
|
else:
|
|
print("No podcasts found.")
|
|
return {}
|
|
else:
|
|
print("Failed to fetch data:", response.status_code, response.text)
|
|
return {}
|