public async Task <Either <BaseError, Tuple <EpisodeMetadata, MediaVersion> > > GetEpisodeMetadataAndStatistics( PlexLibrary library, string key, PlexConnection connection, PlexServerAuthToken token) { try { IPlexServerApi service = XmlServiceFor(connection.Uri); Option <PlexXmlVideoMetadataResponseContainer> maybeResponse = await service .GetVideoMetadata(key, token.AuthToken) .Map(Optional) .Map(r => r.Filter(m => m.Metadata.Media.Count > 0 && m.Metadata.Media[0].Part.Count > 0)); return(maybeResponse.Match( response => { Option <MediaVersion> maybeVersion = ProjectToMediaVersion(response.Metadata); return maybeVersion.Match <Either <BaseError, Tuple <EpisodeMetadata, MediaVersion> > >( version => Tuple( ProjectToEpisodeMetadata(response.Metadata, library.MediaSourceId), version), () => BaseError.New("Unable to locate metadata")); }, () => BaseError.New("Unable to locate metadata"))); } catch (Exception ex) { return(BaseError.New(ex.ToString())); } }
public async Task <Either <BaseError, List <PlexLibrary> > > GetLibraries( PlexConnection connection, PlexServerAuthToken token) { try { IPlexServerApi service = RestService.For <IPlexServerApi>( new HttpClient { BaseAddress = new Uri(connection.Uri), Timeout = TimeSpan.FromSeconds(10) }); List <PlexLibraryResponse> directory = await service.GetLibraries(token.AuthToken).Map(r => r.MediaContainer.Directory); return(directory // .Filter(l => l.Hidden == 0) .Filter(l => l.Type.ToLowerInvariant() is "movie" or "show") .Map(Project) .Somes() .ToList()); } catch (Exception ex) { return(BaseError.New(ex.ToString())); } }
public async Task <Either <BaseError, List <PlexShow> > > GetShowLibraryContents( PlexLibrary library, PlexConnection connection, PlexServerAuthToken token) { try { IPlexServerApi service = RestService.For <IPlexServerApi>(connection.Uri); return(await service.GetLibrarySectionContents(library.Key, token.AuthToken) .Map(r => r.MediaContainer.Metadata) .Map(list => list.Map(metadata => ProjectToShow(metadata, library.MediaSourceId)).ToList())); } catch (Exception ex) { return(BaseError.New(ex.ToString())); } }
public async Task <Either <BaseError, List <PlexSeason> > > GetShowSeasons( PlexLibrary library, PlexShow show, PlexConnection connection, PlexServerAuthToken token) { try { IPlexServerApi service = XmlServiceFor(connection.Uri); return(await service.GetShowChildren(show.Key.Split("/").Reverse().Skip(1).Head(), token.AuthToken) .Map(r => r.Metadata) .Map(list => list.Map(metadata => ProjectToSeason(metadata, library.MediaSourceId)).ToList())); } catch (Exception ex) { return(BaseError.New(ex.ToString())); } }
public async Task <Either <BaseError, ShowMetadata> > GetShowMetadata( PlexLibrary library, string key, PlexConnection connection, PlexServerAuthToken token) { try { IPlexServerApi service = XmlServiceFor(connection.Uri); return(await service.GetDirectoryMetadata(key, token.AuthToken) .Map(Optional) .MapT(response => ProjectToShowMetadata(response.Metadata, library.MediaSourceId)) .Map(o => o.ToEither <BaseError>("Unable to locate metadata"))); } catch (Exception ex) { return(BaseError.New(ex.ToString())); } }
public async Task <Either <BaseError, List <PlexEpisode> > > GetSeasonEpisodes( PlexLibrary library, PlexSeason season, PlexConnection connection, PlexServerAuthToken token) { try { IPlexServerApi service = XmlServiceFor(connection.Uri); return(await service.GetSeasonChildren(season.Key.Split("/").Reverse().Skip(1).Head(), token.AuthToken) .Map(r => r.Metadata.Filter(m => m.Media.Count > 0 && m.Media[0].Part.Count > 0)) .Map(list => list.Map(metadata => ProjectToEpisode(metadata, library.MediaSourceId))) .Map(ProcessMultiEpisodeFiles)); } catch (Exception ex) { return(BaseError.New(ex.ToString())); } }
public async Task <Either <BaseError, MovieMetadata> > GetMovieMetadata( PlexLibrary library, string key, PlexConnection connection, PlexServerAuthToken token) { try { IPlexServerApi service = XmlServiceFor(connection.Uri); return(await service.GetVideoMetadata(key, token.AuthToken) .Map(Optional) .Map(r => r.Filter(m => m.Metadata.Media.Count > 0 && m.Metadata.Media[0].Part.Count > 0)) .MapT(response => ProjectToMovieMetadata(response.Metadata, library.MediaSourceId)) .Map(o => o.ToEither <BaseError>("Unable to locate metadata"))); } catch (Exception ex) { return(BaseError.New(ex.ToString())); } }
public async Task <bool> Ping( PlexConnection connection, PlexServerAuthToken token) { try { IPlexServerApi service = RestService.For <IPlexServerApi>( new HttpClient { BaseAddress = new Uri(connection.Uri), Timeout = TimeSpan.FromSeconds(5) }); await service.Ping(token.AuthToken); return(true); } catch (Exception) { return(false); } }