From ec49ab7389ecbc4edbdd76432bfc5703aab1fd27 Mon Sep 17 00:00:00 2001 From: "Jamie.Rees" Date: Wed, 19 Oct 2016 13:20:56 +0100 Subject: [PATCH] More rework to use the Plex DB --- PlexRequests.Helpers/PlexHelper.cs | 6 ++ PlexRequests.Services/Jobs/RecentlyAdded.cs | 61 +++++++------ .../Models/Plex/MetadataItems.cs | 86 +++++++------------ PlexRequests.Store/PlexDatabase.cs | 7 +- .../Repository/BaseGenericRepository.cs | 4 +- 5 files changed, 78 insertions(+), 86 deletions(-) diff --git a/PlexRequests.Helpers/PlexHelper.cs b/PlexRequests.Helpers/PlexHelper.cs index 1e186ddba..008c737a9 100644 --- a/PlexRequests.Helpers/PlexHelper.cs +++ b/PlexRequests.Helpers/PlexHelper.cs @@ -102,6 +102,12 @@ namespace PlexRequests.Helpers $"https://app.plex.tv/web/app#!/server/{machineId}/details/%2Flibrary%2Fmetadata%2F{mediaId}"; return url; } + + public static string FormatGenres(string tags) + { + var split = tags.Split(new[] {'|'}, StringSplitOptions.RemoveEmptyEntries); + return string.Join(", ", split); + } } public class EpisodeModelHelper diff --git a/PlexRequests.Services/Jobs/RecentlyAdded.cs b/PlexRequests.Services/Jobs/RecentlyAdded.cs index c2cfdd1d3..21f592e62 100644 --- a/PlexRequests.Services/Jobs/RecentlyAdded.cs +++ b/PlexRequests.Services/Jobs/RecentlyAdded.cs @@ -68,6 +68,8 @@ namespace PlexRequests.Services.Jobs private IPlexApi Api { get; } private TvMazeApi TvApi = new TvMazeApi(); private readonly TheMovieDbApi _movieApi = new TheMovieDbApi(); + private const int MetadataTypeTv = 4; + private const int MetadataTypeMovie = 1; private ISettingsService PlexSettings { get; } private ISettingsService EmailSettings { get; } private ISettingsService PlexRequestSettings { get; } @@ -144,12 +146,12 @@ namespace PlexRequests.Services.Jobs var sb = new StringBuilder(); var plexSettings = PlexSettings.GetSettings(); - var recentlyAdded = PlexDb.GetItemsAddedAfterDate(DateTime.Now.AddDays(-7)); + var recentlyAdded = PlexDb.GetItemsAddedAfterDate(DateTime.Now.AddDays(-12)).ToList(); - var movies = recentlyAdded.Where(x => x.MetadataType == 1); - var tv = recentlyAdded.Where(x => x.MetadataType == 4); - - GenerateMovieHtmlDb(movies, ref sb); + var movies = recentlyAdded.Where(x => x.metadata_type == MetadataTypeMovie); + var tv = recentlyAdded.Where(x => x.metadata_type == MetadataTypeTv); + + GenerateMovieHtml(movies, ref sb); GenerateTvHtml(tv, ref sb); var template = new RecentlyAddedTemplate(); @@ -217,21 +219,26 @@ namespace PlexRequests.Services.Jobs sb.Append("

"); } - private void GenerateMovieHtmlDb(IEnumerable movies, ref StringBuilder sb) + private void GenerateMovieHtml(IEnumerable movies, ref StringBuilder sb) { + var items = movies as MetadataItems[] ?? movies.ToArray(); + if (!items.Any()) + { + return; + } sb.Append("

New Movies:



"); sb.Append( ""); - foreach (var movie in movies) + foreach (var movie in items) { var plexGUID = string.Empty; try { - plexGUID = movie.Guid; + plexGUID = movie.guid; var imdbId = PlexHelper.GetProviderIdFromPlexGuid(plexGUID); - var info = _movieApi.GetMovieInformation(imdbId).Result; + var info = _movieApi.GetMovieInformation(imdbId).Result; // TODO remove this and get the image info from Plex https://github.com/jakewaldron/PlexEmail/blob/master/scripts/plexEmail.py#L391 sb.Append(""); sb.Append("
"); @@ -245,20 +252,20 @@ namespace PlexRequests.Services.Jobs ""); sb.AppendFormat( - "

{1} {2}

", - info.ImdbId, info.Title, info.ReleaseDate?.ToString("yyyy") ?? string.Empty); + "

{1} {2:yyyy}

", + imdbId, string.IsNullOrEmpty(movie.original_title) ? movie.title : movie.original_title + $" AKA {movie.title}", movie.originally_available_at); - + if (!string.IsNullOrEmpty(movie.tagline)) + { + sb.AppendFormat("

{0}

", movie.tagline); + } - if (info.Genres.Any()) + if (!string.IsNullOrEmpty(movie.tags_genre)) { - sb.AppendFormat( - "

Genre: {0}

", - string.Join(", ", info.Genres.Select(x => x.Name.ToString()).ToArray())); + sb.AppendFormat("

Genre: {0}

", PlexHelper.FormatGenres(movie.tags_genre)); } - sb.AppendFormat( - "

{0}

", - info.Overview); + + sb.AppendFormat("

{0}

", movie.summary); sb.Append(""); @@ -332,17 +339,23 @@ namespace PlexRequests.Services.Jobs private void GenerateTvHtml(IEnumerable tv, ref StringBuilder sb) { + var items = tv as MetadataItems[] ?? tv.ToArray(); + if (!items.Any()) + { + return; + } + // TV sb.Append("

New Episodes:



"); sb.Append( ""); - foreach (var t in tv) + foreach (var t in items) { var plexGUID = string.Empty; try { - plexGUID = t.Guid; + plexGUID = t.guid; var seasonInfo = PlexHelper.GetSeasonsAndEpisodesFromPlexGuid(plexGUID); var info = TvApi.ShowLookupByTheTvDbId(int.Parse(PlexHelper.GetProviderIdFromPlexGuid(plexGUID))); @@ -360,8 +373,8 @@ namespace PlexRequests.Services.Jobs sb.Append(""); sb.Append("
"); - sb.AppendFormat("

{1} {2}

", - info.externals.imdb, info.name, info.premiered.Substring(0, 4)); // Only the year + sb.AppendFormat("

{1} {2:yyyy}

", + info.externals.imdb, string.IsNullOrEmpty(t.original_title) ? t.title : t.original_title + $" AKA {t.title}", t.originally_available_at); // Only the year sb.AppendFormat("

Season: {0}, Episode: {1}

", seasonInfo.SeasonNumber, seasonInfo.EpisodeNumber); @@ -372,7 +385,7 @@ namespace PlexRequests.Services.Jobs string.Join(", ", info.genres.Select(x => x.ToString()).ToArray())); } sb.AppendFormat("

{0}

", - string.IsNullOrEmpty(t.Summary) ? info.summary : t.Summary); // Episode Summary + string.IsNullOrEmpty(t.summary) ? info.summary : t.summary); // Episode Summary sb.Append(""); diff --git a/PlexRequests.Store/Models/Plex/MetadataItems.cs b/PlexRequests.Store/Models/Plex/MetadataItems.cs index 179026c03..67fdefc63 100644 --- a/PlexRequests.Store/Models/Plex/MetadataItems.cs +++ b/PlexRequests.Store/Models/Plex/MetadataItems.cs @@ -26,70 +26,42 @@ #endregion using System; -using System.Data.Linq.Mapping; +using Dapper; +using Dapper.Contrib.Extensions; namespace PlexRequests.Store.Models.Plex { - [Table(Name = "metadata_items")] + [Table("metadata_items")] public class MetadataItems { - [Column(IsPrimaryKey = true)] - public int Id { get; set; } - - [Column(Name = "library_section_id")] - public int LibrarySectionId { get; set; } - - [Column(Name = "parent_id")] - public int ParentId { get; set; } - - [Column(Name = "metadata_type")] - public int MetadataType { get; set; } - - [Column(Name = "guid")] - public string Guid { get; set; } - - [Column(Name = "media_item_count")] - public int MediaItemCount { get; set; } - - [Column(Name = "title")] - public string Title { get; set; } - - [Column(Name = "title_sort")] - public string TitleSort { get; set; } - - [Column(Name = "OriginalTitle")] - public string OriginalTitle { get; set; } - - [Column(Name = "studio")] - public string Studio { get; set; } - [Column(Name = "rating")] - public float Rating { get; set; } - [Column(Name = "rating_count")] - public int RatingCount { get; set; } - [Column(Name = "tagline")] - public string Tagline { get; set; } - [Column(Name = "summary")] - public string Summary { get; set; } - [Column(Name = "trivia")] - public string Trivia { get; set; } - [Column(Name = "quotes")] - public string Quotes { get; set; } - [Column(Name = "content_rating")] - public string ContentRating { get; set; } - [Column(Name = "content_rating_age")] - public int ContentRatingAge { get; set; } - [Column(Name = "Index")] + [Key] + public int id { get; set; } + + public int library_section_id { get; set; } + public int parent_id { get; set; } + public int metadata_type { get; set; } + public string guid { get; set; } + public int media_item_count { get; set; } + public string title { get; set; } + public string title_sort { get; set; } + public string original_title { get; set; } + public string studio { get; set; } + public float rating { get; set; } + public int rating_count { get; set; } + public string tagline { get; set; } + public string summary { get; set; } + public string trivia { get; set; } + public string quotes { get; set; } + public string content_rating { get; set; } + public int content_rating_age { get; set; } public int Index { get; set; } + public string tags_genre { get; set; } // SKIP Until Date Times - - [Column(Name = "originally_available_at")] - public DateTime OriginallyAvailableAt { get; set; } - [Column(Name = "available_at")] - public DateTime AvailableAt { get; set; } - [Column(Name = "expires_at")] - public DateTime ExpiresAt { get; set; } + + public DateTime originally_available_at { get; set; } + public DateTime available_at { get; set; } + public DateTime expires_at { get; set; } // Skip RefreshedAt and Year - [Column(Name = "added_at")] - public DateTime AddedAt { get; set; } + public DateTime added_at { get; set; } } } \ No newline at end of file diff --git a/PlexRequests.Store/PlexDatabase.cs b/PlexRequests.Store/PlexDatabase.cs index 4f274a96d..2635cc22e 100644 --- a/PlexRequests.Store/PlexDatabase.cs +++ b/PlexRequests.Store/PlexDatabase.cs @@ -60,7 +60,7 @@ namespace PlexRequests.Store { throw new SqliteException("Factory returned null"); } - fact.ConnectionString = "Data Source=" + "Plex Path"; + fact.ConnectionString = "Data Source=" + DbLocation; return fact; } @@ -84,7 +84,10 @@ namespace PlexRequests.Store { using (var con = DbConnection()) { - return (IEnumerable)con.Query(query, param); + con.Open(); + var data = con.Query(query, param); + con.Close(); + return data; } } } diff --git a/PlexRequests.Store/Repository/BaseGenericRepository.cs b/PlexRequests.Store/Repository/BaseGenericRepository.cs index f29c2dc95..9cf67a2bb 100644 --- a/PlexRequests.Store/Repository/BaseGenericRepository.cs +++ b/PlexRequests.Store/Repository/BaseGenericRepository.cs @@ -27,13 +27,11 @@ using System; using System.Collections.Generic; using System.Data; -using System.Data.SqlClient; using System.Linq; -using System.Text; using System.Threading.Tasks; -using Dapper; using Dapper.Contrib.Extensions; +using Dapper; using Mono.Data.Sqlite;