selmaks

Untitled

Apr 8th, 2023
13
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.29 KB | None | 0 0
  1. import re
  2. import requests
  3. import json
  4. from datetime import datetime, timedelta
  5. import time
  6.  
  7. sonarr_api_key = "api"
  8. sonarr_url = "sonarr.cm"
  9.  
  10. def get_sonarr_logs(page_size=10):
  11. response = requests.get(
  12. f"{sonarr_url}/api/v3/log",
  13. headers={"X-Api-Key": sonarr_api_key},
  14. params={
  15. #"page": page,
  16. "pageSize": page_size,
  17. },
  18. )
  19. response.raise_for_status()
  20. return response.json()
  21.  
  22. # Get list of all series
  23. response = requests.get(
  24. f"{sonarr_url}/api/v3/series",
  25. headers={"X-Api-Key": sonarr_api_key},
  26. )
  27. response.raise_for_status()
  28. all_series = response.json()
  29.  
  30. # Refresh each series one at a time
  31. for series in all_series:
  32. series_id = series["id"]
  33. print(f"Refreshing media info for {series['title']}")
  34.  
  35. response = requests.post(
  36. f"{sonarr_url}/api/v3/command",
  37. headers={"X-Api-Key": sonarr_api_key},
  38. json={
  39. "name": "RefreshSeries",
  40. "seriesId": series_id,
  41. },
  42. )
  43. response.raise_for_status()
  44.  
  45. # Wait for refresh to complete
  46. status = 'queued'
  47. while status != 'completed':
  48. response = requests.get(
  49. f"{sonarr_url}/api/v3/command/{response.json()['id']}",
  50. headers={"X-Api-Key": sonarr_api_key},
  51. )
  52. status = response.json().get('status')
  53. time.sleep(1)
  54.  
  55. # Get updated logs
  56. logs = get_sonarr_logs(page_size=3000)
  57. #print(logs)
  58. for log in logs['records']:
  59. if "Unable to parse media info from file: " in log["message"]:
  60. # Extract series information from log message
  61. match = re.search(r"/TV/(.+)/Season (\d+)/(.+) - S(\d+)E(\d+) - (.+)\.mkv", log["message"])
  62. if match:
  63. series_name = match.group(1)
  64. season_number = int(match.group(2))
  65. episode_number = int(match.group(5))
  66. 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"
  67.  
  68. # Get series ID
  69. response = requests.get(
  70. f"{sonarr_url}/api/v3/series",
  71. headers={"X-Api-Key": sonarr_api_key},
  72. )
  73. response.raise_for_status()
  74. series_id = None
  75. for series in response.json():
  76. if series["title"] == series_name:
  77. series_id = series["id"]
  78. break
  79.  
  80. if series_id:
  81. print(f"Series ID: {series_id}")
  82.  
  83. # Get episode file ID
  84. response = requests.get(
  85. f"{sonarr_url}/api/v3/episodefile",
  86. headers={"X-Api-Key": sonarr_api_key},
  87. params={
  88. "seriesId": series_id,
  89. },
  90. )
  91. response.raise_for_status()
  92. episode_file_id = None
  93. for episode_file in response.json():
  94. if episode_file["seasonNumber"] == season_number and episode_file["relativePath"] == episode_relative_path:
  95. episode_file_id = episode_file["id"]
  96. break
  97.  
  98. if episode_file_id:
  99. print(f"Episode file ID: {episode_file_id}")
  100.  
  101. # Delete episode file
  102. response = requests.delete(
  103. f"{sonarr_url}/api/v3/episodefile/{episode_file_id}",
  104. headers={"X-Api-Key": sonarr_api_key},
  105. )
  106. response.raise_for_status()
  107.  
  108. # Get episode ID
  109. response = requests.get(
  110. f"{sonarr_url}/api/v3/episode",
  111. headers={"X-Api-Key": sonarr_api_key},
  112. params={
  113. "seriesId": series_id,
  114. },
  115. )
  116. response.raise_for_status()
  117. episode_id = None
  118. for episode in response.json():
  119. if episode["seasonNumber"] == season_number and episode["episodeNumber"] == episode_number:
  120. episode_id = episode["id"]
  121. break
  122.  
  123. if episode_id:
  124. # Update episode and mark as wanted
  125. response = requests.put(
  126. f"{sonarr_url}/api/v3/episode/{episode_id}",
  127. headers={"X-Api-Key": sonarr_api_key},
  128. json={
  129. "monitored": True,
  130. },
  131. )
  132. response.raise_for_status()
  133.  
  134. # Search for new download
  135. response = requests.post(
  136. f"{sonarr_url}/api/v3/command",
  137. headers={"X-Api-Key": sonarr_api_key},
  138. json={
  139. "name": "EpisodeSearch",
  140. "episodeIds": [episode_id],
  141. },
  142. )
  143. response.raise_for_status()
  144. else:
  145. print("Episode not found.")
  146.  
Advertisement
Add Comment
Please, Sign In to add comment