From 515751b1e1978463dd0323f0103522242afbd864 Mon Sep 17 00:00:00 2001 From: ta264 Date: Wed, 19 Aug 2020 22:16:43 +0100 Subject: [PATCH] New: Send series info to calibre when importing --- .../Books/Calibre/CalibreProxy.cs | 67 +++++++++++-------- .../Books/Calibre/CalibreSettings.cs | 2 +- .../Books/Calibre/Resources/CalibreChanges.cs | 38 +++++++++++ .../CalibreConversionOptions.cs | 0 .../CalibreConversionStatus.cs | 0 .../{ => Resources}/CalibreImportJob.cs | 0 src/NzbDrone.Core/Datastore/TableMapping.cs | 9 ++- 7 files changed, 86 insertions(+), 30 deletions(-) create mode 100644 src/NzbDrone.Core/Books/Calibre/Resources/CalibreChanges.cs rename src/NzbDrone.Core/Books/Calibre/{ => Resources}/CalibreConversionOptions.cs (100%) rename src/NzbDrone.Core/Books/Calibre/{ => Resources}/CalibreConversionStatus.cs (100%) rename src/NzbDrone.Core/Books/Calibre/{ => Resources}/CalibreImportJob.cs (100%) diff --git a/src/NzbDrone.Core/Books/Calibre/CalibreProxy.cs b/src/NzbDrone.Core/Books/Calibre/CalibreProxy.cs index 7af05d92b..d6edbaaa5 100644 --- a/src/NzbDrone.Core/Books/Calibre/CalibreProxy.cs +++ b/src/NzbDrone.Core/Books/Calibre/CalibreProxy.cs @@ -80,20 +80,20 @@ namespace NzbDrone.Core.Books.Calibre var format = Path.GetExtension(file.Path); var bookData = Convert.ToBase64String(File.ReadAllBytes(file.Path)); - var payload = new + var payload = new CalibreChangesPayload { - changes = new + LoadedBookIds = new List { file.CalibreId }, + Changes = new CalibreChanges { - added_formats = new[] + AddedFormats = new List { - new + new CalibreAddFormat { - ext = format, - data_url = bookData + Ext = format, + Data = bookData } } - }, - loaded_book_ids = new[] { file.CalibreId } + } }; ExecuteSetFields(file.CalibreId, payload, settings); @@ -101,14 +101,13 @@ namespace NzbDrone.Core.Books.Calibre public void RemoveFormats(int calibreId, IEnumerable formats, CalibreSettings settings) { - var payload = new + var payload = new CalibreChangesPayload { - changes = new + LoadedBookIds = new List { calibreId }, + Changes = new CalibreChanges { - removed_formats = formats - }, - - loaded_book_ids = new[] { calibreId } + RemovedFormats = formats.ToList() + } }; ExecuteSetFields(calibreId, payload, settings); @@ -117,6 +116,18 @@ namespace NzbDrone.Core.Books.Calibre public void SetFields(BookFile file, CalibreSettings settings) { var edition = file.Edition.Value; + var book = edition.Book.Value; + var serieslink = book.SeriesLinks.Value.FirstOrDefault(); + + var series = serieslink?.Series.Value; + double? seriesIndex = null; + if (double.TryParse(serieslink?.Position, out var index)) + { + _logger.Trace($"Parsed {serieslink?.Position} as {index}"); + seriesIndex = index; + } + + _logger.Trace($"Book: {book} Series: {series?.Title}, Position: {seriesIndex}"); var cover = edition.Images.FirstOrDefault(x => x.CoverType == MediaCoverTypes.Cover); string image = null; @@ -131,30 +142,32 @@ namespace NzbDrone.Core.Books.Calibre } } - var payload = new + var payload = new CalibreChangesPayload { - changes = new + LoadedBookIds = new List { file.CalibreId }, + Changes = new CalibreChanges { - title = edition.Title, - authors = new[] { file.Author.Value.Name }, - cover = image, - pubdate = edition.Book.Value.ReleaseDate, - comments = edition.Overview, - rating = edition.Ratings.Value * 2, - identifiers = new Dictionary + Title = edition.Title, + Authors = new List { file.Author.Value.Name }, + Cover = image, + PubDate = book.ReleaseDate, + Comments = edition.Overview, + Rating = edition.Ratings.Value * 2, + Identifiers = new Dictionary { { "isbn", edition.Isbn13 }, { "asin", edition.Asin }, { "goodreads", edition.ForeignEditionId } - } - }, - loaded_book_ids = new[] { file.CalibreId } + }, + Series = series?.Title, + SeriesIndex = seriesIndex + } }; ExecuteSetFields(file.CalibreId, payload, settings); } - private void ExecuteSetFields(int id, object payload, CalibreSettings settings) + private void ExecuteSetFields(int id, CalibreChangesPayload payload, CalibreSettings settings) { var builder = GetBuilder($"cdb/set-fields/{id}", settings) .Post() diff --git a/src/NzbDrone.Core/Books/Calibre/CalibreSettings.cs b/src/NzbDrone.Core/Books/Calibre/CalibreSettings.cs index 6a53f85ca..25f16900f 100644 --- a/src/NzbDrone.Core/Books/Calibre/CalibreSettings.cs +++ b/src/NzbDrone.Core/Books/Calibre/CalibreSettings.cs @@ -32,7 +32,7 @@ namespace NzbDrone.Core.Books.Calibre } public string Host { get; set; } - public int Port { get; set; } = 8080; + public int Port { get; set; } public string UrlBase { get; set; } public string Username { get; set; } public string Password { get; set; } diff --git a/src/NzbDrone.Core/Books/Calibre/Resources/CalibreChanges.cs b/src/NzbDrone.Core/Books/Calibre/Resources/CalibreChanges.cs new file mode 100644 index 000000000..28c55889a --- /dev/null +++ b/src/NzbDrone.Core/Books/Calibre/Resources/CalibreChanges.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace NzbDrone.Core.Books.Calibre +{ + public class CalibreChangesPayload + { + public CalibreChanges Changes { get; set; } + [JsonProperty("loaded_book_ids")] + public List LoadedBookIds { get; set; } + } + + public class CalibreChanges + { + public string Title { get; set; } + public List Authors { get; set; } + public string Cover { get; set; } + [JsonProperty("pubdate")] + public DateTime? PubDate { get; set; } + public string Comments { get; set; } + public decimal Rating { get; set; } + public Dictionary Identifiers { get; set; } + public string Series { get; set; } + [JsonProperty("series_index")] + public double? SeriesIndex { get; set; } + + public List AddedFormats { get; set; } + public List RemovedFormats { get; set; } + } + + public class CalibreAddFormat + { + public string Ext { get; set; } + [JsonProperty("data_url")] + public string Data { get; set; } + } +} diff --git a/src/NzbDrone.Core/Books/Calibre/CalibreConversionOptions.cs b/src/NzbDrone.Core/Books/Calibre/Resources/CalibreConversionOptions.cs similarity index 100% rename from src/NzbDrone.Core/Books/Calibre/CalibreConversionOptions.cs rename to src/NzbDrone.Core/Books/Calibre/Resources/CalibreConversionOptions.cs diff --git a/src/NzbDrone.Core/Books/Calibre/CalibreConversionStatus.cs b/src/NzbDrone.Core/Books/Calibre/Resources/CalibreConversionStatus.cs similarity index 100% rename from src/NzbDrone.Core/Books/Calibre/CalibreConversionStatus.cs rename to src/NzbDrone.Core/Books/Calibre/Resources/CalibreConversionStatus.cs diff --git a/src/NzbDrone.Core/Books/Calibre/CalibreImportJob.cs b/src/NzbDrone.Core/Books/Calibre/Resources/CalibreImportJob.cs similarity index 100% rename from src/NzbDrone.Core/Books/Calibre/CalibreImportJob.cs rename to src/NzbDrone.Core/Books/Calibre/Resources/CalibreImportJob.cs diff --git a/src/NzbDrone.Core/Datastore/TableMapping.cs b/src/NzbDrone.Core/Datastore/TableMapping.cs index 626b2ef7d..47b9693e7 100644 --- a/src/NzbDrone.Core/Datastore/TableMapping.cs +++ b/src/NzbDrone.Core/Datastore/TableMapping.cs @@ -115,7 +115,9 @@ namespace NzbDrone.Core.Datastore .Where(s => s.Id == series.Id)).ToList(), s => s.Id > 0); - Mapper.Entity("SeriesBookLink").RegisterModel(); + Mapper.Entity("SeriesBookLink").RegisterModel() + .HasOne(l => l.Book, l => l.BookId) + .HasOne(l => l.Series, l => l.SeriesId); Mapper.Entity("AuthorMetadata").RegisterModel(); @@ -135,7 +137,10 @@ namespace NzbDrone.Core.Datastore new SqlBuilder() .Join((a, m) => a.AuthorMetadataId == m.Id) .Where(a => a.AuthorMetadataId == book.AuthorMetadataId)).SingleOrDefault(), - a => a.AuthorMetadataId > 0); + a => a.AuthorMetadataId > 0) + .LazyLoad(b => b.SeriesLinks, + (db, book) => db.Query(new SqlBuilder().Where(s => s.BookId == book.Id)).ToList(), + b => b.Id > 0); Mapper.Entity("Editions").RegisterModel() .HasOne(r => r.Book, r => r.BookId)