def _create_sync_job( job_type: JobType, **extra_attrs: Any, ) -> SyncJob: base_attrs = { "name": "sync", "type": job_type, "source_url": "http://host", "source_key": "aaa", "dest_url": "http://host2", "dest_key": "bbb", "dest_path": "/path", "dest_profile": "1", } if job_type is JobType.Sonarr: return SonarrSyncJob.parse_obj({**base_attrs, **extra_attrs}) elif job_type is JobType.Radarr: return RadarrSyncJob.parse_obj({**base_attrs, **extra_attrs}) elif job_type is JobType.Lidarr: return LidarrSyncJob.parse_obj({**base_attrs, **extra_attrs}) else: _assert_never(job_type)
def status(job_type: JobType, url: str) -> str: if job_type is JobType.Sonarr: return parse.urljoin(url, "api/v3/system/status") if job_type is JobType.Radarr: return parse.urljoin(url, "api/v3/system/status") if job_type is JobType.Lidarr: return parse.urljoin(url, "api/v1/system/status") else: _assert_never(job_type)
def metadata(job_type: JobType, url: str) -> str: if job_type is JobType.Lidarr: return parse.urljoin(url, "api/v1/metadataprofile") if job_type is JobType.Radarr: raise Exception(f"{job_type} does not support metadata") if job_type is JobType.Sonarr: raise Exception(f"{job_type} does not support metadata") else: _assert_never(job_type)
def language(job_type: JobType, url: str) -> str: if job_type is JobType.Sonarr: return parse.urljoin(url, "api/v3/languageprofile") if job_type is JobType.Radarr: return parse.urljoin(url, "api/v3/language") if job_type is JobType.Lidarr: raise Exception(f"{job_type} does not support language") else: _assert_never(job_type)
def tag(job_type: JobType, url: str) -> str: if job_type is JobType.Sonarr: return parse.urljoin(url, "api/v3/tag") if job_type is JobType.Radarr: return parse.urljoin(url, "api/v3/tag") if job_type is JobType.Lidarr: return parse.urljoin(url, "api/v1/tag") else: _assert_never(job_type)
def profile(job_type: JobType, url: str) -> str: if job_type is JobType.Sonarr: return parse.urljoin(url, "api/v3/qualityprofile") if job_type is JobType.Radarr: return parse.urljoin(url, "api/v3/qualityprofile") if job_type is JobType.Lidarr: return parse.urljoin(url, "api/v1/qualityprofile") else: _assert_never(job_type)
def content(job_type: JobType, url: str) -> str: if job_type is JobType.Sonarr: return parse.urljoin(url, "api/v3/series") if job_type is JobType.Radarr: return parse.urljoin(url, "api/v3/movie") if job_type is JobType.Lidarr: return parse.urljoin(url, "api/v1/artist") else: _assert_never(job_type)
def _create_content_item(job_type: JobType, **extra_attrs: Any) -> ContentItem: nonlocal count count += 1 base_attrs = { "title": f"Item {count}", "title_slug": f"item-{count}", "images": [], "monitored": True, "quality_profile_id": 1, "root_folder_path": "/path", "tags": [], } if job_type is JobType.Radarr: return RadarrContent.parse_obj( { "tmdb_id": count, "year": 2016, "has_file": True, **base_attrs, **extra_attrs, } ) elif job_type is JobType.Sonarr: return SonarrContent.parse_obj( { "tvdb_id": count, "use_scene_numbering": True, "season_folder": True, "seasons": [{"title": "Season 1", "attr": 10}], **base_attrs, **extra_attrs, } ) elif job_type is JobType.Lidarr: return LidarrContent.parse_obj( { "artist_name": f"Item {count}", "foreign_artist_id": f"{count}", "images": [], "monitored": False, "albums": [{"title": "Season 1", "attr": 10}], "quality_profile_id": 1, "root_folder_path": "/path", "tags": [], **extra_attrs, } ) else: _assert_never(job_type)
def content(self) -> ContentItems: full_url = routes.content(job_type=self.job_type, url=self.url) json = self.get(url=full_url) if self.job_type is JobType.Sonarr: return list(map(SonarrContent.parse_obj, json)) elif self.job_type is JobType.Radarr: return list(map(RadarrContent.parse_obj, json)) elif self.job_type is JobType.Lidarr: return list(map(LidarrContent.parse_obj, json)) else: _assert_never(self.job_type)
def test_get_content_payloads_search_missing( job_type: JobType, create_sync_job: CreateSyncJob, create_content_item: CreateContentItem, ) -> None: job = create_sync_job( job_type, dest_search_missing=True, ) profiles: Profiles = [ Profile(name="Any", id=1), ] item_one = create_content_item(job_type) content: ContentItems = [item_one] payloads = get_content_payloads( job=job, content=content, dest_profiles=profiles, dest_metadata_profiles=profiles, dest_languages=[], ) payload = payloads[0] assert payload assert payload.add_options if job_type is JobType.Sonarr: assert payload.add_options["searchForMissingEpisodes"] elif job_type is JobType.Radarr: assert payload.add_options["searchForMovie"] elif job_type is JobType.Lidarr: assert payload.add_options["searchForMissingAlbums"] else: _assert_never(job_type)