Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import re
- import requests
- import json
- from datetime import datetime, timedelta
- import time
- sonarr_api_key = "api"
- sonarr_url = "sonarr.cm"
- def get_sonarr_logs(page_size=10):
- response = requests.get(
- f"{sonarr_url}/api/v3/log",
- headers={"X-Api-Key": sonarr_api_key},
- params={
- #"page": page,
- "pageSize": page_size,
- },
- )
- response.raise_for_status()
- return response.json()
- # Get list of all series
- response = requests.get(
- f"{sonarr_url}/api/v3/series",
- headers={"X-Api-Key": sonarr_api_key},
- )
- response.raise_for_status()
- all_series = response.json()
- # Refresh each series one at a time
- for series in all_series:
- series_id = series["id"]
- print(f"Refreshing media info for {series['title']}")
- response = requests.post(
- f"{sonarr_url}/api/v3/command",
- headers={"X-Api-Key": sonarr_api_key},
- json={
- "name": "RefreshSeries",
- "seriesId": series_id,
- },
- )
- response.raise_for_status()
- # Wait for refresh to complete
- status = 'queued'
- while status != 'completed':
- response = requests.get(
- f"{sonarr_url}/api/v3/command/{response.json()['id']}",
- headers={"X-Api-Key": sonarr_api_key},
- )
- status = response.json().get('status')
- time.sleep(1)
- # Get updated logs
- logs = get_sonarr_logs(page_size=3000)
- #print(logs)
- for log in logs['records']:
- if "Unable to parse media info from file: " in log["message"]:
- # Extract series information from log message
- match = re.search(r"/TV/(.+)/Season (\d+)/(.+) - S(\d+)E(\d+) - (.+)\.mkv", log["message"])
- if match:
- series_name = match.group(1)
- season_number = int(match.group(2))
- episode_number = int(match.group(5))
- episode_relative_path = f"Season {season_number}/{series_name} - S{str(season_number).zfill(2)}E{str(episode_number).zfill(2)} - {match.group(6)}.mkv"
- # Get series ID
- response = requests.get(
- f"{sonarr_url}/api/v3/series",
- headers={"X-Api-Key": sonarr_api_key},
- )
- response.raise_for_status()
- series_id = None
- for series in response.json():
- if series["title"] == series_name:
- series_id = series["id"]
- break
- if series_id:
- print(f"Series ID: {series_id}")
- # Get episode file ID
- response = requests.get(
- f"{sonarr_url}/api/v3/episodefile",
- headers={"X-Api-Key": sonarr_api_key},
- params={
- "seriesId": series_id,
- },
- )
- response.raise_for_status()
- episode_file_id = None
- for episode_file in response.json():
- if episode_file["seasonNumber"] == season_number and episode_file["relativePath"] == episode_relative_path:
- episode_file_id = episode_file["id"]
- break
- if episode_file_id:
- print(f"Episode file ID: {episode_file_id}")
- # Delete episode file
- response = requests.delete(
- f"{sonarr_url}/api/v3/episodefile/{episode_file_id}",
- headers={"X-Api-Key": sonarr_api_key},
- )
- response.raise_for_status()
- # Get episode ID
- response = requests.get(
- f"{sonarr_url}/api/v3/episode",
- headers={"X-Api-Key": sonarr_api_key},
- params={
- "seriesId": series_id,
- },
- )
- response.raise_for_status()
- episode_id = None
- for episode in response.json():
- if episode["seasonNumber"] == season_number and episode["episodeNumber"] == episode_number:
- episode_id = episode["id"]
- break
- if episode_id:
- # Update episode and mark as wanted
- response = requests.put(
- f"{sonarr_url}/api/v3/episode/{episode_id}",
- headers={"X-Api-Key": sonarr_api_key},
- json={
- "monitored": True,
- },
- )
- response.raise_for_status()
- # Search for new download
- response = requests.post(
- f"{sonarr_url}/api/v3/command",
- headers={"X-Api-Key": sonarr_api_key},
- json={
- "name": "EpisodeSearch",
- "episodeIds": [episode_id],
- },
- )
- response.raise_for_status()
- else:
- print("Episode not found.")
Advertisement
Add Comment
Please, Sign In to add comment