From 6c60509398bb76ac8b6e8158c2782ca1dc8f27a7 Mon Sep 17 00:00:00 2001 From: whimsical-c4lic0 Date: Sun, 8 Feb 2026 22:58:05 -0600 Subject: [PATCH] Refactor Purchased entities into DTOs and application entities with standardized naming conventions and default values --- OF DL/Models/Dtos/Purchased/FromUserDto.cs | 10 + OF DL/Models/Dtos/Purchased/ListItemDto.cs | 72 +++ OF DL/Models/Dtos/Purchased/PurchasedDto.cs | 10 + OF DL/Models/Entities/Common/FromUser.cs | 2 +- OF DL/Models/Entities/Purchased/ListItem.cs | 33 ++ .../Purchased/PaidMessageCollection.cs | 12 + .../Entities/Purchased/PaidPostCollection.cs | 12 + OF DL/Models/Entities/Purchased/Purchased.cs | 8 + .../Purchased/PurchasedTabCollection.cs | 7 +- .../Purchased/SinglePaidMessageCollection.cs | 17 + OF DL/Models/Mappers/MessagesMapper.cs | 2 +- OF DL/Models/Mappers/PurchasedMapper.cs | 56 +++ .../Models/Purchased/PaidMessageCollection.cs | 10 - OF DL/Models/Purchased/PaidPostCollection.cs | 10 - OF DL/Models/Purchased/Purchased.cs | 75 --- .../Purchased/SinglePaidMessageCollection.cs | 13 - OF DL/Program.cs | 42 +- OF DL/Services/APIService.cs | 457 +++++++++--------- OF DL/Services/DownloadService.cs | 69 +-- OF DL/Services/IAPIService.cs | 2 +- OF DL/Services/IDownloadService.cs | 23 +- 21 files changed, 545 insertions(+), 397 deletions(-) create mode 100644 OF DL/Models/Dtos/Purchased/FromUserDto.cs create mode 100644 OF DL/Models/Dtos/Purchased/ListItemDto.cs create mode 100644 OF DL/Models/Dtos/Purchased/PurchasedDto.cs create mode 100644 OF DL/Models/Entities/Purchased/ListItem.cs create mode 100644 OF DL/Models/Entities/Purchased/PaidMessageCollection.cs create mode 100644 OF DL/Models/Entities/Purchased/PaidPostCollection.cs create mode 100644 OF DL/Models/Entities/Purchased/Purchased.cs rename OF DL/Models/{ => Entities}/Purchased/PurchasedTabCollection.cs (69%) create mode 100644 OF DL/Models/Entities/Purchased/SinglePaidMessageCollection.cs create mode 100644 OF DL/Models/Mappers/PurchasedMapper.cs delete mode 100644 OF DL/Models/Purchased/PaidMessageCollection.cs delete mode 100644 OF DL/Models/Purchased/PaidPostCollection.cs delete mode 100644 OF DL/Models/Purchased/Purchased.cs delete mode 100644 OF DL/Models/Purchased/SinglePaidMessageCollection.cs diff --git a/OF DL/Models/Dtos/Purchased/FromUserDto.cs b/OF DL/Models/Dtos/Purchased/FromUserDto.cs new file mode 100644 index 0000000..fffd69f --- /dev/null +++ b/OF DL/Models/Dtos/Purchased/FromUserDto.cs @@ -0,0 +1,10 @@ +using Newtonsoft.Json; + +namespace OF_DL.Models.Dtos.Purchased; + +public class FromUserDto +{ + [JsonProperty("id")] public long Id { get; set; } + + [JsonProperty("_view")] public string View { get; set; } = ""; +} diff --git a/OF DL/Models/Dtos/Purchased/ListItemDto.cs b/OF DL/Models/Dtos/Purchased/ListItemDto.cs new file mode 100644 index 0000000..2104490 --- /dev/null +++ b/OF DL/Models/Dtos/Purchased/ListItemDto.cs @@ -0,0 +1,72 @@ +using Newtonsoft.Json; +using OF_DL.Models.Dtos.Common; +using MessageDtos = OF_DL.Models.Dtos.Messages; + +namespace OF_DL.Models.Dtos.Purchased; + +public class ListItemDto +{ + [JsonProperty("responseType")] public string ResponseType { get; set; } = ""; + + [JsonProperty("text")] public string Text { get; set; } = ""; + + [JsonProperty("giphyId")] public object GiphyId { get; set; } = new(); + + [JsonProperty("lockedText")] public bool? LockedText { get; set; } + + [JsonProperty("isFree")] public bool? IsFree { get; set; } + + [JsonProperty("price")] public string? Price { get; set; } + + [JsonProperty("isMediaReady")] public bool? IsMediaReady { get; set; } + + [JsonProperty("mediaCount")] public int? MediaCount { get; set; } + + [JsonProperty("media")] public List? Media { get; set; } + + [JsonProperty("previews")] public List? Previews { get; set; } + + [JsonProperty("preview")] public List? Preview { get; set; } + + [JsonProperty("isTip")] public bool? IsTip { get; set; } + + [JsonProperty("isReportedByMe")] public bool? IsReportedByMe { get; set; } + + [JsonProperty("isCouplePeopleMedia")] public bool? IsCouplePeopleMedia { get; set; } + + [JsonProperty("queueId")] public object QueueId { get; set; } = new(); + + [JsonProperty("fromUser")] public FromUserDto? FromUser { get; set; } + + [JsonProperty("author")] public AuthorDto? Author { get; set; } + + [JsonProperty("isFromQueue")] public bool? IsFromQueue { get; set; } + + [JsonProperty("canUnsendQueue")] public bool? CanUnsendQueue { get; set; } + + [JsonProperty("unsendSecondsQueue")] public int? UnsendSecondsQueue { get; set; } + + [JsonProperty("id")] public long Id { get; set; } + + [JsonProperty("isOpened")] public bool IsOpened { get; set; } + + [JsonProperty("isNew")] public bool? IsNew { get; set; } + + [JsonProperty("createdAt")] public DateTime? CreatedAt { get; set; } + + [JsonProperty("postedAt")] public DateTime? PostedAt { get; set; } + + [JsonProperty("changedAt")] public DateTime? ChangedAt { get; set; } + + [JsonProperty("cancelSeconds")] public int? CancelSeconds { get; set; } + + [JsonProperty("isLiked")] public bool? IsLiked { get; set; } + + [JsonProperty("canPurchase")] public bool? CanPurchase { get; set; } + + [JsonProperty("canReport")] public bool? CanReport { get; set; } + + [JsonProperty("isCanceled")] public bool? IsCanceled { get; set; } + + [JsonProperty("isArchived")] public bool? IsArchived { get; set; } +} diff --git a/OF DL/Models/Dtos/Purchased/PurchasedDto.cs b/OF DL/Models/Dtos/Purchased/PurchasedDto.cs new file mode 100644 index 0000000..7be06c7 --- /dev/null +++ b/OF DL/Models/Dtos/Purchased/PurchasedDto.cs @@ -0,0 +1,10 @@ +using Newtonsoft.Json; + +namespace OF_DL.Models.Dtos.Purchased; + +public class PurchasedDto +{ + [JsonProperty("list")] public List List { get; set; } = []; + + [JsonProperty("hasMore")] public bool HasMore { get; set; } +} diff --git a/OF DL/Models/Entities/Common/FromUser.cs b/OF DL/Models/Entities/Common/FromUser.cs index bc09e0b..fe435b2 100644 --- a/OF DL/Models/Entities/Common/FromUser.cs +++ b/OF DL/Models/Entities/Common/FromUser.cs @@ -2,5 +2,5 @@ namespace OF_DL.Models.Entities.Common; public class FromUser { - public long? Id { get; set; } + public long Id { get; set; } } diff --git a/OF DL/Models/Entities/Purchased/ListItem.cs b/OF DL/Models/Entities/Purchased/ListItem.cs new file mode 100644 index 0000000..45561be --- /dev/null +++ b/OF DL/Models/Entities/Purchased/ListItem.cs @@ -0,0 +1,33 @@ +using OF_DL.Models.Entities.Common; +using MessageEntities = OF_DL.Models.Entities.Messages; + +namespace OF_DL.Models.Entities.Purchased; + +public class ListItem +{ + public string ResponseType { get; set; } = ""; + + public string? Text { get; set; } + + public string? Price { get; set; } + + public List? Media { get; set; } + + public List? Previews { get; set; } + + public List? Preview { get; set; } + + public FromUser FromUser { get; set; } = new(); + + public Author Author { get; set; } = new(); + + public long Id { get; set; } + + public bool IsOpened { get; set; } + + public DateTime? CreatedAt { get; set; } + + public DateTime? PostedAt { get; set; } + + public bool? IsArchived { get; set; } +} diff --git a/OF DL/Models/Entities/Purchased/PaidMessageCollection.cs b/OF DL/Models/Entities/Purchased/PaidMessageCollection.cs new file mode 100644 index 0000000..dd1435f --- /dev/null +++ b/OF DL/Models/Entities/Purchased/PaidMessageCollection.cs @@ -0,0 +1,12 @@ +using MessageEntities = OF_DL.Models.Entities.Messages; + +namespace OF_DL.Models.Entities.Purchased; + +public class PaidMessageCollection +{ + public List PaidMessageMedia { get; set; } = []; + + public List PaidMessageObjects { get; set; } = []; + + public Dictionary PaidMessages { get; set; } = new(); +} diff --git a/OF DL/Models/Entities/Purchased/PaidPostCollection.cs b/OF DL/Models/Entities/Purchased/PaidPostCollection.cs new file mode 100644 index 0000000..55b8e7b --- /dev/null +++ b/OF DL/Models/Entities/Purchased/PaidPostCollection.cs @@ -0,0 +1,12 @@ +using MessageEntities = OF_DL.Models.Entities.Messages; + +namespace OF_DL.Models.Entities.Purchased; + +public class PaidPostCollection +{ + public List PaidPostMedia { get; set; } = []; + + public List PaidPostObjects { get; set; } = []; + + public Dictionary PaidPosts { get; set; } = new(); +} diff --git a/OF DL/Models/Entities/Purchased/Purchased.cs b/OF DL/Models/Entities/Purchased/Purchased.cs new file mode 100644 index 0000000..fc80ec9 --- /dev/null +++ b/OF DL/Models/Entities/Purchased/Purchased.cs @@ -0,0 +1,8 @@ +namespace OF_DL.Models.Entities.Purchased; + +public class Purchased +{ + public List List { get; set; } = []; + + public bool HasMore { get; set; } +} diff --git a/OF DL/Models/Purchased/PurchasedTabCollection.cs b/OF DL/Models/Entities/Purchased/PurchasedTabCollection.cs similarity index 69% rename from OF DL/Models/Purchased/PurchasedTabCollection.cs rename to OF DL/Models/Entities/Purchased/PurchasedTabCollection.cs index f41710c..e64eb86 100644 --- a/OF DL/Models/Purchased/PurchasedTabCollection.cs +++ b/OF DL/Models/Entities/Purchased/PurchasedTabCollection.cs @@ -1,9 +1,12 @@ -namespace OF_DL.Models.Purchased; +namespace OF_DL.Models.Entities.Purchased; public class PurchasedTabCollection { public long UserId { get; set; } - public string Username { get; set; } = string.Empty; + + public string Username { get; set; } = ""; + public PaidPostCollection PaidPosts { get; set; } = new(); + public PaidMessageCollection PaidMessages { get; set; } = new(); } diff --git a/OF DL/Models/Entities/Purchased/SinglePaidMessageCollection.cs b/OF DL/Models/Entities/Purchased/SinglePaidMessageCollection.cs new file mode 100644 index 0000000..66e0f5a --- /dev/null +++ b/OF DL/Models/Entities/Purchased/SinglePaidMessageCollection.cs @@ -0,0 +1,17 @@ +using MessageEntities = OF_DL.Models.Entities.Messages; + +namespace OF_DL.Models.Entities.Purchased; + +public class SinglePaidMessageCollection +{ + public List PreviewSingleMessageMedia { get; set; } = []; + + + public Dictionary PreviewSingleMessages { get; set; } = new(); + + public List SingleMessageMedia { get; set; } = []; + + public List SingleMessageObjects { get; set; } = []; + + public Dictionary SingleMessages { get; set; } = new(); +} diff --git a/OF DL/Models/Mappers/MessagesMapper.cs b/OF DL/Models/Mappers/MessagesMapper.cs index 3f3f750..52b9a8e 100644 --- a/OF DL/Models/Mappers/MessagesMapper.cs +++ b/OF DL/Models/Mappers/MessagesMapper.cs @@ -64,7 +64,7 @@ public static class MessagesMapper media?.Select(MapMedium).ToList(); private static FromUser? MapFromUser(FromUserDto? dto) => - dto == null ? null : new FromUser { Id = dto.Id }; + dto?.Id == null ? null : new FromUser { Id = (long)dto.Id }; private static Files? MapFiles(FilesDto? dto) => dto == null ? null : new Files { Full = MapFull(dto.Full), Drm = MapDrm(dto.Drm) }; diff --git a/OF DL/Models/Mappers/PurchasedMapper.cs b/OF DL/Models/Mappers/PurchasedMapper.cs new file mode 100644 index 0000000..43b5830 --- /dev/null +++ b/OF DL/Models/Mappers/PurchasedMapper.cs @@ -0,0 +1,56 @@ +using OF_DL.Models.Dtos.Purchased; +using OF_DL.Models.Dtos.Common; +using MessageDtos = OF_DL.Models.Dtos.Messages; +using CommonEntities = OF_DL.Models.Entities.Common; +using MessageEntities = OF_DL.Models.Entities.Messages; +using PurchasedEntities = OF_DL.Models.Entities.Purchased; + + +namespace OF_DL.Models.Mappers; + +public static class PurchasedMapper +{ + public static PurchasedEntities.Purchased FromDto(PurchasedDto? dto) + { + PurchasedEntities.Purchased mapped = new() { HasMore = dto?.HasMore ?? false }; + + if (dto?.List == null) + { + return mapped; + } + + foreach (ListItemDto entry in dto.List) + { + mapped.List.Add(MapList(entry)); + } + + return mapped; + } + + private static PurchasedEntities.ListItem MapList(ListItemDto dto) => + new() + { + ResponseType = dto.ResponseType, + Text = dto.Text, + Price = dto.Price, + IsOpened = dto.IsOpened, + IsArchived = dto.IsArchived, + CreatedAt = dto.CreatedAt, + PostedAt = dto.PostedAt, + Id = dto.Id, + Media = MapMedia(dto.Media), + Previews = dto.Previews, + Preview = dto.Preview, + FromUser = MapFromUser(dto.FromUser), + Author = MapAuthor(dto.Author) + }; + + private static CommonEntities.FromUser MapFromUser(FromUserDto? dto) => + dto == null ? new CommonEntities.FromUser() : new CommonEntities.FromUser { Id = dto.Id }; + + private static CommonEntities.Author MapAuthor(AuthorDto? dto) => + dto == null ? new CommonEntities.Author() : new CommonEntities.Author { Id = dto.Id }; + + private static List? MapMedia(List? media) => + media?.Select(MessagesMapper.MapMedium).ToList(); +} diff --git a/OF DL/Models/Purchased/PaidMessageCollection.cs b/OF DL/Models/Purchased/PaidMessageCollection.cs deleted file mode 100644 index 26bf6ec..0000000 --- a/OF DL/Models/Purchased/PaidMessageCollection.cs +++ /dev/null @@ -1,10 +0,0 @@ -using MessageEntities = OF_DL.Models.Entities.Messages; - -namespace OF_DL.Models.Purchased; - -public class PaidMessageCollection -{ - public List PaidMessageMedia = new(); - public List PaidMessageObjects = new(); - public Dictionary PaidMessages = new(); -} diff --git a/OF DL/Models/Purchased/PaidPostCollection.cs b/OF DL/Models/Purchased/PaidPostCollection.cs deleted file mode 100644 index 24bce7d..0000000 --- a/OF DL/Models/Purchased/PaidPostCollection.cs +++ /dev/null @@ -1,10 +0,0 @@ -using MessageEntities = OF_DL.Models.Entities.Messages; - -namespace OF_DL.Models.Purchased; - -public class PaidPostCollection -{ - public List PaidPostMedia = new(); - public List PaidPostObjects = new(); - public Dictionary PaidPosts = new(); -} diff --git a/OF DL/Models/Purchased/Purchased.cs b/OF DL/Models/Purchased/Purchased.cs deleted file mode 100644 index cae8e66..0000000 --- a/OF DL/Models/Purchased/Purchased.cs +++ /dev/null @@ -1,75 +0,0 @@ -using Newtonsoft.Json; -using OF_DL.Models.Dtos.Messages; - -namespace OF_DL.Models.Purchased; - -public class Purchased -{ - public List list { get; set; } - public bool hasMore { get; set; } - - public class FromUser - { - public long id { get; set; } - public string _view { get; set; } - } - - public class Author - { - public long id { get; set; } - public string _view { get; set; } - } - - public class Hls - { - [JsonProperty("CloudFront-Policy")] public string CloudFrontPolicy { get; set; } - - [JsonProperty("CloudFront-Signature")] public string CloudFrontSignature { get; set; } - - [JsonProperty("CloudFront-Key-Pair-Id")] - public string CloudFrontKeyPairId { get; set; } - } - - - public class List - { - public string responseType { get; set; } - public string text { get; set; } - public object giphyId { get; set; } - public bool? lockedText { get; set; } - public bool? isFree { get; set; } - public string? price { get; set; } - public bool? isMediaReady { get; set; } - public int? mediaCount { get; set; } - public List media { get; set; } - public List previews { get; set; } - public List preview { get; set; } - public bool? isTip { get; set; } - public bool? isReportedByMe { get; set; } - public bool? isCouplePeopleMedia { get; set; } - public object queueId { get; set; } - public FromUser fromUser { get; set; } - public Author author { get; set; } - public bool? isFromQueue { get; set; } - public bool? canUnsendQueue { get; set; } - public int? unsendSecondsQueue { get; set; } - public long id { get; set; } - public bool isOpened { get; set; } - public bool? isNew { get; set; } - public DateTime? createdAt { get; set; } - public DateTime? postedAt { get; set; } - public DateTime? changedAt { get; set; } - public int? cancelSeconds { get; set; } - public bool? isLiked { get; set; } - public bool? canPurchase { get; set; } - public bool? canReport { get; set; } - public bool? isCanceled { get; set; } - public bool? isArchived { get; set; } - } - - public class Manifest - { - public string hls { get; set; } - public string dash { get; set; } - } -} diff --git a/OF DL/Models/Purchased/SinglePaidMessageCollection.cs b/OF DL/Models/Purchased/SinglePaidMessageCollection.cs deleted file mode 100644 index 1f2e33f..0000000 --- a/OF DL/Models/Purchased/SinglePaidMessageCollection.cs +++ /dev/null @@ -1,13 +0,0 @@ -using MessageEntities = OF_DL.Models.Entities.Messages; - -namespace OF_DL.Models.Purchased; - -public class SinglePaidMessageCollection -{ - public List PreviewSingleMessageMedia = new(); - - public Dictionary PreviewSingleMessages = new(); - public List SingleMessageMedia = new(); - public List SingleMessageObjects = new(); - public Dictionary SingleMessages = new(); -} diff --git a/OF DL/Program.cs b/OF DL/Program.cs index 3f71c3e..7cb09cc 100644 --- a/OF DL/Program.cs +++ b/OF DL/Program.cs @@ -7,13 +7,13 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using OF_DL.CLI; using OF_DL.Models; -using OF_DL.Models.Purchased; using OF_DL.Models.Streams; using OF_DL.Enumerations; using OF_DL.Helpers; using ArchivedEntities = OF_DL.Models.Entities.Archived; using MessageEntities = OF_DL.Models.Entities.Messages; using PostEntities = OF_DL.Models.Entities.Posts; +using PurchasedEntities = OF_DL.Models.Entities.Purchased; using OF_DL.Services; using Serilog; using Spectre.Console; @@ -801,9 +801,9 @@ public class Program(IServiceProvider serviceProvider) Log.Debug($"Download path: {p}"); - List purchasedTabCollections = + List purchasedTabCollections = await apiService.GetPurchasedTab("/posts/paid/all", p, users); - foreach (PurchasedTabCollection purchasedTabCollection in purchasedTabCollections) + foreach (PurchasedEntities.PurchasedTabCollection purchasedTabCollection in purchasedTabCollections) { AnsiConsole.Markup($"[red]\nScraping Data for {purchasedTabCollection.Username}\n[/]"); string path = ""; @@ -1056,7 +1056,7 @@ public class Program(IServiceProvider serviceProvider) IAPIService apiService = serviceProvider.GetRequiredService(); IDownloadService downloadService = serviceProvider.GetRequiredService(); - PaidMessageCollection paidMessageCollection = new(); + PurchasedEntities.PaidMessageCollection paidMessageCollection = new(); await AnsiConsole.Status() .StartAsync("[red]Getting Paid Messages[/]", @@ -1391,7 +1391,7 @@ public class Program(IServiceProvider serviceProvider) AnsiConsole.Markup("[red]Getting Paid Posts\n[/]"); Log.Debug($"Calling DownloadPaidPosts - {user.Key}"); - PaidPostCollection purchasedPosts = new(); + PurchasedEntities.PaidPostCollection purchasedPosts = new(); await AnsiConsole.Status() .StartAsync("[red]Getting Paid Posts[/]", @@ -1442,7 +1442,8 @@ public class Program(IServiceProvider serviceProvider) return result.TotalCount; } - private async Task DownloadPaidPostsPurchasedTab(string username, PaidPostCollection purchasedPosts, + private async Task DownloadPaidPostsPurchasedTab(string username, + PurchasedEntities.PaidPostCollection purchasedPosts, KeyValuePair user, int paidPostCount, string path, Dictionary users) { IDBService dbService = serviceProvider.GetRequiredService(); @@ -1525,9 +1526,9 @@ public class Program(IServiceProvider serviceProvider) MessageEntities.Medium? mediaInfo = purchasedPosts?.PaidPostMedia?.FirstOrDefault(m => m.Id == purchasedPostKVP.Key); - Purchased.List? postInfo = mediaInfo != null + PurchasedEntities.ListItem? postInfo = mediaInfo != null ? purchasedPosts?.PaidPostObjects?.FirstOrDefault(p => - p?.media?.Any(m => m.Id == purchasedPostKVP.Key) == true) + p?.Media?.Any(m => m.Id == purchasedPostKVP.Key) == true) : null; isNew = await downloadService.DownloadPurchasedPostDRMVideo( @@ -1545,7 +1546,7 @@ public class Program(IServiceProvider serviceProvider) .PaidPostFileNameFormat ?? string.Empty, postInfo, mediaInfo, - postInfo?.fromUser, + postInfo?.FromUser, users); if (isNew) { @@ -1560,9 +1561,9 @@ public class Program(IServiceProvider serviceProvider) { MessageEntities.Medium? mediaInfo = purchasedPosts?.PaidPostMedia?.FirstOrDefault(m => m.Id == purchasedPostKVP.Key); - Purchased.List? postInfo = mediaInfo != null + PurchasedEntities.ListItem? postInfo = mediaInfo != null ? purchasedPosts?.PaidPostObjects?.FirstOrDefault(p => - p?.media?.Any(m => m.Id == purchasedPostKVP.Key) == true) + p?.Media?.Any(m => m.Id == purchasedPostKVP.Key) == true) : null; isNew = await downloadService.DownloadPurchasedPostMedia( @@ -1575,7 +1576,7 @@ public class Program(IServiceProvider serviceProvider) .PaidPostFileNameFormat ?? string.Empty, postInfo, mediaInfo, - postInfo?.fromUser, + postInfo?.FromUser, users); if (isNew) { @@ -1597,7 +1598,8 @@ public class Program(IServiceProvider serviceProvider) } private async Task DownloadPaidMessagesPurchasedTab(string username, - PaidMessageCollection paidMessageCollection, KeyValuePair user, int paidMessagesCount, + PurchasedEntities.PaidMessageCollection paidMessageCollection, KeyValuePair user, + int paidMessagesCount, string path, Dictionary users) { IDBService dbService = serviceProvider.GetRequiredService(); @@ -1675,9 +1677,9 @@ public class Program(IServiceProvider serviceProvider) MessageEntities.Medium? mediaInfo = paidMessageCollection.PaidMessageMedia.FirstOrDefault(m => m.Id == paidMessageKVP.Key); - Purchased.List? messageInfo = + PurchasedEntities.ListItem? messageInfo = paidMessageCollection.PaidMessageObjects.FirstOrDefault(p => - p?.media?.Any(m => m.Id == paidMessageKVP.Key) == true); + p?.Media?.Any(m => m.Id == paidMessageKVP.Key) == true); isNew = await downloadService.DownloadPurchasedMessageDRMVideo( policy, @@ -1694,7 +1696,7 @@ public class Program(IServiceProvider serviceProvider) .PaidMessageFileNameFormat ?? string.Empty, messageInfo, mediaInfo, - messageInfo?.fromUser, + messageInfo?.FromUser, users); if (isNew) @@ -1711,9 +1713,9 @@ public class Program(IServiceProvider serviceProvider) { MessageEntities.Medium? mediaInfo = paidMessageCollection.PaidMessageMedia.FirstOrDefault(m => m.Id == paidMessageKVP.Key); - Purchased.List messageInfo = + PurchasedEntities.ListItem messageInfo = paidMessageCollection.PaidMessageObjects.FirstOrDefault(p => - p?.media?.Any(m => m.Id == paidMessageKVP.Key) == true); + p?.Media?.Any(m => m.Id == paidMessageKVP.Key) == true); isNew = await downloadService.DownloadPurchasedMedia( paidMessageKVP.Value, @@ -1725,7 +1727,7 @@ public class Program(IServiceProvider serviceProvider) .PaidMessageFileNameFormat ?? string.Empty, messageInfo, mediaInfo, - messageInfo?.fromUser, + messageInfo?.FromUser, users); if (isNew) { @@ -1827,7 +1829,7 @@ public class Program(IServiceProvider serviceProvider) AnsiConsole.Markup("[red]Getting Paid Message\n[/]"); - SinglePaidMessageCollection singlePaidMessageCollection = + PurchasedEntities.SinglePaidMessageCollection singlePaidMessageCollection = await apiService.GetPaidMessage($"/messages/{message_id.ToString()}", path); int oldPreviewPaidMessagesCount = 0; int newPreviewPaidMessagesCount = 0; diff --git a/OF DL/Services/APIService.cs b/OF DL/Services/APIService.cs index e48dc3c..069929c 100644 --- a/OF DL/Services/APIService.cs +++ b/OF DL/Services/APIService.cs @@ -6,13 +6,13 @@ using System.Xml.Linq; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using OF_DL.Models; -using OF_DL.Models.Purchased; using OF_DL.Models.Stories; using OF_DL.Models.Streams; using OF_DL.Enumerations; using ArchivedDtos = OF_DL.Models.Dtos.Archived; using PostDtos = OF_DL.Models.Dtos.Posts; using MessageDtos = OF_DL.Models.Dtos.Messages; +using PurchasedDtos = OF_DL.Models.Dtos.Purchased; using ListDtos = OF_DL.Models.Dtos.Lists; using HighlightDtos = OF_DL.Models.Dtos.Highlights; using ArchivedEntities = OF_DL.Models.Entities.Archived; @@ -20,6 +20,7 @@ using HighlightEntities = OF_DL.Models.Entities.Highlights; using ListEntities = OF_DL.Models.Entities.Lists; using MessageEntities = OF_DL.Models.Entities.Messages; using PostEntities = OF_DL.Models.Entities.Posts; +using PurchasedEntities = OF_DL.Models.Entities.Purchased; using OF_DL.Models.Mappers; using OF_DL.Widevine; using Serilog; @@ -593,15 +594,16 @@ public class APIService(IAuthService authService, IConfigService configService, } - public async Task GetPaidPosts(string endpoint, string folder, string username, + public async Task GetPaidPosts(string endpoint, string folder, + string username, List paid_post_ids, StatusContext ctx) { Log.Debug($"Calling GetPaidPosts - {username}"); try { - Purchased paidPosts = new(); - PaidPostCollection paidPostCollection = new(); + PurchasedEntities.Purchased paidPosts = new(); + PurchasedEntities.PaidPostCollection paidPostCollection = new(); int post_limit = 50; Dictionary getParams = new() { @@ -613,25 +615,29 @@ public class APIService(IAuthService authService, IConfigService configService, }; string? body = await BuildHeaderAndExecuteRequests(getParams, endpoint, GetHttpClient()); - paidPosts = JsonConvert.DeserializeObject(body, m_JsonSerializerSettings); - ctx.Status($"[red]Getting Paid Posts\n[/] [red]Found {paidPosts.list.Count}[/]"); + PurchasedDtos.PurchasedDto? paidPostsDto = + JsonConvert.DeserializeObject(body, m_JsonSerializerSettings); + paidPosts = PurchasedMapper.FromDto(paidPostsDto); + ctx.Status($"[red]Getting Paid Posts\n[/] [red]Found {paidPosts.List.Count}[/]"); ctx.Spinner(Spinner.Known.Dots); ctx.SpinnerStyle(Style.Parse("blue")); - if (paidPosts != null && paidPosts.hasMore) + if (paidPosts != null && paidPosts.HasMore) { - getParams["offset"] = paidPosts.list.Count.ToString(); + getParams["offset"] = paidPosts.List.Count.ToString(); while (true) { - Purchased newPaidPosts = new(); + PurchasedEntities.Purchased newPaidPosts = new(); string? loopbody = await BuildHeaderAndExecuteRequests(getParams, endpoint, GetHttpClient()); - newPaidPosts = JsonConvert.DeserializeObject(loopbody, m_JsonSerializerSettings); + PurchasedDtos.PurchasedDto? newPaidPostsDto = + JsonConvert.DeserializeObject(loopbody, m_JsonSerializerSettings); + newPaidPosts = PurchasedMapper.FromDto(newPaidPostsDto); - paidPosts.list.AddRange(newPaidPosts.list); - ctx.Status($"[red]Getting Paid Posts\n[/] [red]Found {paidPosts.list.Count}[/]"); + paidPosts.List.AddRange(newPaidPosts.List); + ctx.Status($"[red]Getting Paid Posts\n[/] [red]Found {paidPosts.List.Count}[/]"); ctx.Spinner(Spinner.Known.Dots); ctx.SpinnerStyle(Style.Parse("blue")); - if (!newPaidPosts.hasMore) + if (!newPaidPosts.HasMore) { break; } @@ -640,16 +646,16 @@ public class APIService(IAuthService authService, IConfigService configService, } } - foreach (Purchased.List purchase in paidPosts.list) + foreach (PurchasedEntities.ListItem purchase in paidPosts.List) { - if (purchase.responseType == "post" && purchase.media != null && purchase.media.Count > 0) + if (purchase.ResponseType == "post" && purchase.Media != null && purchase.Media.Count > 0) { List previewids = new(); - if (purchase.previews != null) + if (purchase.Previews != null) { - for (int i = 0; i < purchase.previews.Count; i++) + for (int i = 0; i < purchase.Previews.Count; i++) { - if (purchase.previews[i] is long previewId) + if (purchase.Previews[i] is long previewId) { if (!previewids.Contains(previewId)) { @@ -658,11 +664,11 @@ public class APIService(IAuthService authService, IConfigService configService, } } } - else if (purchase.preview != null) + else if (purchase.Preview != null) { - for (int i = 0; i < purchase.preview.Count; i++) + for (int i = 0; i < purchase.Preview.Count; i++) { - if (purchase.preview[i] is long previewId) + if (purchase.Preview[i] is long previewId) { if (!previewids.Contains(previewId)) { @@ -672,15 +678,14 @@ public class APIService(IAuthService authService, IConfigService configService, } } - await dbService.AddPost(folder, purchase.id, purchase.text != null ? purchase.text : string.Empty, - purchase.price != null ? purchase.price : "0", - purchase.price != null && purchase.isOpened ? true : false, - purchase.isArchived.HasValue ? purchase.isArchived.Value : false, - purchase.createdAt != null ? purchase.createdAt.Value : purchase.postedAt.Value); + await dbService.AddPost(folder, purchase.Id, purchase.Text != null ? purchase.Text : string.Empty, + purchase.Price != null ? purchase.Price : "0", + purchase.Price != null && purchase.IsOpened ? true : false, + purchase.IsArchived.HasValue ? purchase.IsArchived.Value : false, + purchase.CreatedAt != null ? purchase.CreatedAt.Value : purchase.PostedAt.Value); paidPostCollection.PaidPostObjects.Add(purchase); - foreach (MessageDtos.MediumDto medium in purchase.media) + foreach (MessageEntities.Medium medium in purchase.Media) { - MessageEntities.Medium mappedMedium = MessagesMapper.MapMedium(medium); if (!previewids.Contains(medium.Id)) { paid_post_ids.Add(medium.Id); @@ -714,29 +719,29 @@ public class APIService(IAuthService authService, IConfigService configService, { if (!paidPostCollection.PaidPosts.ContainsKey(medium.Id)) { - await dbService.AddMedia(folder, medium.Id, purchase.id, medium.Files.Full.Url, + await dbService.AddMedia(folder, medium.Id, purchase.Id, medium.Files.Full.Url, null, null, null, "Posts", medium.Type == "photo" ? "Images" : medium.Type == "video" || medium.Type == "gif" ? "Videos" : medium.Type == "audio" ? "Audios" : null, previewids.Contains(medium.Id), false, null); paidPostCollection.PaidPosts.Add(medium.Id, medium.Files.Full.Url); - paidPostCollection.PaidPostMedia.Add(mappedMedium); + paidPostCollection.PaidPostMedia.Add(medium); } } else if (!has && medium.CanView && medium.Files != null && medium.Files.Drm != null) { if (!paidPostCollection.PaidPosts.ContainsKey(medium.Id)) { - await dbService.AddMedia(folder, medium.Id, purchase.id, + await dbService.AddMedia(folder, medium.Id, purchase.Id, medium.Files.Drm.Manifest.Dash, null, null, null, "Posts", medium.Type == "photo" ? "Images" : medium.Type == "video" || medium.Type == "gif" ? "Videos" : medium.Type == "audio" ? "Audios" : null, previewids.Contains(medium.Id), false, null); paidPostCollection.PaidPosts.Add(medium.Id, - $"{medium.Files.Drm.Manifest.Dash},{medium.Files.Drm.Signature.Dash.CloudFrontPolicy},{medium.Files.Drm.Signature.Dash.CloudFrontSignature},{medium.Files.Drm.Signature.Dash.CloudFrontKeyPairId},{medium.Id},{purchase.id}"); - paidPostCollection.PaidPostMedia.Add(mappedMedium); + $"{medium.Files.Drm.Manifest.Dash},{medium.Files.Drm.Signature.Dash.CloudFrontPolicy},{medium.Files.Drm.Signature.Dash.CloudFrontSignature},{medium.Files.Drm.Signature.Dash.CloudFrontKeyPairId},{medium.Id},{purchase.Id}"); + paidPostCollection.PaidPostMedia.Add(medium); } } } @@ -747,29 +752,29 @@ public class APIService(IAuthService authService, IConfigService configService, { if (!paidPostCollection.PaidPosts.ContainsKey(medium.Id)) { - await dbService.AddMedia(folder, medium.Id, purchase.id, medium.Files.Full.Url, + await dbService.AddMedia(folder, medium.Id, purchase.Id, medium.Files.Full.Url, null, null, null, "Posts", medium.Type == "photo" ? "Images" : medium.Type == "video" || medium.Type == "gif" ? "Videos" : medium.Type == "audio" ? "Audios" : null, previewids.Contains(medium.Id), false, null); paidPostCollection.PaidPosts.Add(medium.Id, medium.Files.Full.Url); - paidPostCollection.PaidPostMedia.Add(mappedMedium); + paidPostCollection.PaidPostMedia.Add(medium); } } else if (medium.CanView && medium.Files != null && medium.Files.Drm != null) { if (!paidPostCollection.PaidPosts.ContainsKey(medium.Id)) { - await dbService.AddMedia(folder, medium.Id, purchase.id, + await dbService.AddMedia(folder, medium.Id, purchase.Id, medium.Files.Drm.Manifest.Dash, null, null, null, "Posts", medium.Type == "photo" ? "Images" : medium.Type == "video" || medium.Type == "gif" ? "Videos" : medium.Type == "audio" ? "Audios" : null, previewids.Contains(medium.Id), false, null); paidPostCollection.PaidPosts.Add(medium.Id, - $"{medium.Files.Drm.Manifest.Dash},{medium.Files.Drm.Signature.Dash.CloudFrontPolicy},{medium.Files.Drm.Signature.Dash.CloudFrontSignature},{medium.Files.Drm.Signature.Dash.CloudFrontKeyPairId},{medium.Id},{purchase.id}"); - paidPostCollection.PaidPostMedia.Add(mappedMedium); + $"{medium.Files.Drm.Manifest.Dash},{medium.Files.Drm.Signature.Dash.CloudFrontPolicy},{medium.Files.Drm.Signature.Dash.CloudFrontSignature},{medium.Files.Drm.Signature.Dash.CloudFrontKeyPairId},{medium.Id},{purchase.Id}"); + paidPostCollection.PaidPostMedia.Add(medium); } } } @@ -1798,14 +1803,14 @@ public class APIService(IAuthService authService, IConfigService configService, return null; } - public async Task GetPaidMessage(string endpoint, string folder) + public async Task GetPaidMessage(string endpoint, string folder) { Log.Debug($"Calling GetPaidMessage - {endpoint}"); try { MessageEntities.SingleMessage message = new(); - SinglePaidMessageCollection singlePaidMessageCollection = new(); + PurchasedEntities.SinglePaidMessageCollection singlePaidMessageCollection = new(); int post_limit = 50; Dictionary getParams = new() { { "limit", post_limit.ToString() }, { "order", "desc" } }; @@ -2007,15 +2012,16 @@ public class APIService(IAuthService authService, IConfigService configService, } - public async Task GetPaidMessages(string endpoint, string folder, string username, + public async Task GetPaidMessages(string endpoint, string folder, + string username, StatusContext ctx) { Log.Debug($"Calling GetPaidMessages - {username}"); try { - Purchased paidMessages = new(); - PaidMessageCollection paidMessageCollection = new(); + PurchasedEntities.Purchased paidMessages = new(); + PurchasedEntities.PaidMessageCollection paidMessageCollection = new(); int post_limit = 50; Dictionary getParams = new() { @@ -2027,17 +2033,19 @@ public class APIService(IAuthService authService, IConfigService configService, }; string? body = await BuildHeaderAndExecuteRequests(getParams, endpoint, GetHttpClient()); - paidMessages = JsonConvert.DeserializeObject(body, m_JsonSerializerSettings); - ctx.Status($"[red]Getting Paid Messages\n[/] [red]Found {paidMessages.list.Count}[/]"); + PurchasedDtos.PurchasedDto? paidMessagesDto = + JsonConvert.DeserializeObject(body, m_JsonSerializerSettings); + paidMessages = PurchasedMapper.FromDto(paidMessagesDto); + ctx.Status($"[red]Getting Paid Messages\n[/] [red]Found {paidMessages.List.Count}[/]"); ctx.Spinner(Spinner.Known.Dots); ctx.SpinnerStyle(Style.Parse("blue")); - if (paidMessages != null && paidMessages.hasMore) + if (paidMessages != null && paidMessages.HasMore) { - getParams["offset"] = paidMessages.list.Count.ToString(); + getParams["offset"] = paidMessages.List.Count.ToString(); while (true) { string loopqueryParams = "?" + string.Join("&", getParams.Select(kvp => $"{kvp.Key}={kvp.Value}")); - Purchased newpaidMessages = new(); + PurchasedEntities.Purchased newpaidMessages = new(); Dictionary loopheaders = GetDynamicHeaders("/api2/v2" + endpoint, loopqueryParams); HttpClient loopclient = GetHttpClient(); @@ -2053,14 +2061,17 @@ public class APIService(IAuthService authService, IConfigService configService, { loopresponse.EnsureSuccessStatusCode(); string loopbody = await loopresponse.Content.ReadAsStringAsync(); - newpaidMessages = JsonConvert.DeserializeObject(loopbody, m_JsonSerializerSettings); + PurchasedDtos.PurchasedDto? newPaidMessagesDto = + JsonConvert.DeserializeObject(loopbody, + m_JsonSerializerSettings); + newpaidMessages = PurchasedMapper.FromDto(newPaidMessagesDto); } - paidMessages.list.AddRange(newpaidMessages.list); - ctx.Status($"[red]Getting Paid Messages\n[/] [red]Found {paidMessages.list.Count}[/]"); + paidMessages.List.AddRange(newpaidMessages.List); + ctx.Status($"[red]Getting Paid Messages\n[/] [red]Found {paidMessages.List.Count}[/]"); ctx.Spinner(Spinner.Known.Dots); ctx.SpinnerStyle(Style.Parse("blue")); - if (!newpaidMessages.hasMore) + if (!newpaidMessages.HasMore) { break; } @@ -2069,38 +2080,39 @@ public class APIService(IAuthService authService, IConfigService configService, } } - if (paidMessages.list != null && paidMessages.list.Count > 0) + if (paidMessages.List != null && paidMessages.List.Count > 0) { - foreach (Purchased.List purchase in paidMessages.list.Where(p => p.responseType == "message") - .OrderByDescending(p => p.postedAt ?? p.createdAt)) + foreach (PurchasedEntities.ListItem purchase in paidMessages.List + .Where(p => p.ResponseType == "message") + .OrderByDescending(p => p.PostedAt ?? p.CreatedAt)) { if (!configService.CurrentConfig.IgnoreOwnMessages || - purchase.fromUser.id != Convert.ToInt32(authService.CurrentAuth.USER_ID)) + purchase.FromUser.Id != Convert.ToInt32(authService.CurrentAuth.USER_ID)) { - if (purchase.postedAt != null) + if (purchase.PostedAt != null) { - await dbService.AddMessage(folder, purchase.id, - purchase.text != null ? purchase.text : string.Empty, - purchase.price != null ? purchase.price : "0", true, false, purchase.postedAt.Value, - purchase.fromUser.id); + await dbService.AddMessage(folder, purchase.Id, + purchase.Text != null ? purchase.Text : string.Empty, + purchase.Price != null ? purchase.Price : "0", true, false, purchase.PostedAt.Value, + purchase.FromUser.Id); } else { - await dbService.AddMessage(folder, purchase.id, - purchase.text != null ? purchase.text : string.Empty, - purchase.price != null ? purchase.price : "0", true, false, purchase.createdAt.Value, - purchase.fromUser.id); + await dbService.AddMessage(folder, purchase.Id, + purchase.Text != null ? purchase.Text : string.Empty, + purchase.Price != null ? purchase.Price : "0", true, false, purchase.CreatedAt.Value, + purchase.FromUser.Id); } paidMessageCollection.PaidMessageObjects.Add(purchase); - if (purchase.media != null && purchase.media.Count > 0) + if (purchase.Media != null && purchase.Media.Count > 0) { List previewids = new(); - if (purchase.previews != null) + if (purchase.Previews != null) { - for (int i = 0; i < purchase.previews.Count; i++) + for (int i = 0; i < purchase.Previews.Count; i++) { - if (purchase.previews[i] is long previewId) + if (purchase.Previews[i] is long previewId) { if (!previewids.Contains(previewId)) { @@ -2109,11 +2121,11 @@ public class APIService(IAuthService authService, IConfigService configService, } } } - else if (purchase.preview != null) + else if (purchase.Preview != null) { - for (int i = 0; i < purchase.preview.Count; i++) + for (int i = 0; i < purchase.Preview.Count; i++) { - if (purchase.preview[i] is long previewId) + if (purchase.Preview[i] is long previewId) { if (!previewids.Contains(previewId)) { @@ -2123,11 +2135,10 @@ public class APIService(IAuthService authService, IConfigService configService, } } - foreach (MessageDtos.MediumDto medium in purchase.media) + foreach (MessageEntities.Medium medium in purchase.Media) { if (previewids.Count > 0) { - MessageEntities.Medium mappedMedium = MessagesMapper.MapMedium(medium); bool has = previewids.Any(cus => cus.Equals(medium.Id)); if (!has && medium.CanView && medium.Files != null && medium.Files.Full != null && !string.IsNullOrEmpty(medium.Files.Full.Url)) @@ -2154,14 +2165,14 @@ public class APIService(IAuthService authService, IConfigService configService, if (!paidMessageCollection.PaidMessages.ContainsKey(medium.Id)) { - await dbService.AddMedia(folder, medium.Id, purchase.id, + await dbService.AddMedia(folder, medium.Id, purchase.Id, medium.Files.Full.Url, null, null, null, "Messages", medium.Type == "photo" ? "Images" : medium.Type == "video" || medium.Type == "gif" ? "Videos" : medium.Type == "audio" ? "Audios" : null, previewids.Contains(medium.Id), false, null); paidMessageCollection.PaidMessages.Add(medium.Id, medium.Files.Full.Url); - paidMessageCollection.PaidMessageMedia.Add(mappedMedium); + paidMessageCollection.PaidMessageMedia.Add(medium); } } else if (!has && medium.CanView && medium.Files != null && medium.Files.Drm != null) @@ -2188,21 +2199,20 @@ public class APIService(IAuthService authService, IConfigService configService, if (!paidMessageCollection.PaidMessages.ContainsKey(medium.Id)) { - await dbService.AddMedia(folder, medium.Id, purchase.id, + await dbService.AddMedia(folder, medium.Id, purchase.Id, medium.Files.Drm.Manifest.Dash, null, null, null, "Messages", medium.Type == "photo" ? "Images" : medium.Type == "video" || medium.Type == "gif" ? "Videos" : medium.Type == "audio" ? "Audios" : null, previewids.Contains(medium.Id), false, null); paidMessageCollection.PaidMessages.Add(medium.Id, - $"{medium.Files.Drm.Manifest.Dash},{medium.Files.Drm.Signature.Dash.CloudFrontPolicy},{medium.Files.Drm.Signature.Dash.CloudFrontSignature},{medium.Files.Drm.Signature.Dash.CloudFrontKeyPairId},{medium.Id},{purchase.id}"); - paidMessageCollection.PaidMessageMedia.Add(mappedMedium); + $"{medium.Files.Drm.Manifest.Dash},{medium.Files.Drm.Signature.Dash.CloudFrontPolicy},{medium.Files.Drm.Signature.Dash.CloudFrontSignature},{medium.Files.Drm.Signature.Dash.CloudFrontKeyPairId},{medium.Id},{purchase.Id}"); + paidMessageCollection.PaidMessageMedia.Add(medium); } } } else { - MessageEntities.Medium mappedMedium = MessagesMapper.MapMedium(medium); if (medium.CanView && medium.Files != null && medium.Files.Full != null && !string.IsNullOrEmpty(medium.Files.Full.Url)) { @@ -2228,14 +2238,14 @@ public class APIService(IAuthService authService, IConfigService configService, if (!paidMessageCollection.PaidMessages.ContainsKey(medium.Id)) { - await dbService.AddMedia(folder, medium.Id, purchase.id, + await dbService.AddMedia(folder, medium.Id, purchase.Id, medium.Files.Full.Url, null, null, null, "Messages", medium.Type == "photo" ? "Images" : medium.Type == "video" || medium.Type == "gif" ? "Videos" : medium.Type == "audio" ? "Audios" : null, previewids.Contains(medium.Id), false, null); paidMessageCollection.PaidMessages.Add(medium.Id, medium.Files.Full.Url); - paidMessageCollection.PaidMessageMedia.Add(mappedMedium); + paidMessageCollection.PaidMessageMedia.Add(medium); } } else if (medium.CanView && medium.Files != null && medium.Files.Drm != null) @@ -2262,15 +2272,15 @@ public class APIService(IAuthService authService, IConfigService configService, if (!paidMessageCollection.PaidMessages.ContainsKey(medium.Id)) { - await dbService.AddMedia(folder, medium.Id, purchase.id, + await dbService.AddMedia(folder, medium.Id, purchase.Id, medium.Files.Drm.Manifest.Dash, null, null, null, "Messages", medium.Type == "photo" ? "Images" : medium.Type == "video" || medium.Type == "gif" ? "Videos" : medium.Type == "audio" ? "Audios" : null, previewids.Contains(medium.Id), false, null); paidMessageCollection.PaidMessages.Add(medium.Id, - $"{medium.Files.Drm.Manifest.Dash},{medium.Files.Drm.Signature.Dash.CloudFrontPolicy},{medium.Files.Drm.Signature.Dash.CloudFrontSignature},{medium.Files.Drm.Signature.Dash.CloudFrontKeyPairId},{medium.Id},{purchase.id}"); - paidMessageCollection.PaidMessageMedia.Add(mappedMedium); + $"{medium.Files.Drm.Manifest.Dash},{medium.Files.Drm.Signature.Dash.CloudFrontPolicy},{medium.Files.Drm.Signature.Dash.CloudFrontSignature},{medium.Files.Drm.Signature.Dash.CloudFrontKeyPairId},{medium.Id},{purchase.Id}"); + paidMessageCollection.PaidMessageMedia.Add(medium); } } } @@ -2306,7 +2316,7 @@ public class APIService(IAuthService authService, IConfigService configService, try { Dictionary purchasedTabUsers = new(); - Purchased purchased = new(); + PurchasedEntities.Purchased purchased = new(); int post_limit = 50; Dictionary getParams = new() { @@ -2317,14 +2327,16 @@ public class APIService(IAuthService authService, IConfigService configService, }; string? body = await BuildHeaderAndExecuteRequests(getParams, endpoint, GetHttpClient()); - purchased = JsonConvert.DeserializeObject(body, m_JsonSerializerSettings); - if (purchased != null && purchased.hasMore) + PurchasedDtos.PurchasedDto? purchasedDto = + JsonConvert.DeserializeObject(body, m_JsonSerializerSettings); + purchased = PurchasedMapper.FromDto(purchasedDto); + if (purchased != null && purchased.HasMore) { - getParams["offset"] = purchased.list.Count.ToString(); + getParams["offset"] = purchased.List.Count.ToString(); while (true) { string loopqueryParams = "?" + string.Join("&", getParams.Select(kvp => $"{kvp.Key}={kvp.Value}")); - Purchased newPurchased = new(); + PurchasedEntities.Purchased newPurchased = new(); Dictionary loopheaders = GetDynamicHeaders("/api2/v2" + endpoint, loopqueryParams); HttpClient loopclient = GetHttpClient(); @@ -2340,11 +2352,14 @@ public class APIService(IAuthService authService, IConfigService configService, { loopresponse.EnsureSuccessStatusCode(); string loopbody = await loopresponse.Content.ReadAsStringAsync(); - newPurchased = JsonConvert.DeserializeObject(loopbody, m_JsonSerializerSettings); + PurchasedDtos.PurchasedDto? newPurchasedDto = + JsonConvert.DeserializeObject(loopbody, + m_JsonSerializerSettings); + newPurchased = PurchasedMapper.FromDto(newPurchasedDto); } - purchased.list.AddRange(newPurchased.list); - if (!newPurchased.hasMore) + purchased.List.AddRange(newPurchased.List); + if (!newPurchased.HasMore) { break; } @@ -2353,124 +2368,125 @@ public class APIService(IAuthService authService, IConfigService configService, } } - if (purchased.list != null && purchased.list.Count > 0) + if (purchased.List != null && purchased.List.Count > 0) { - foreach (Purchased.List purchase in purchased.list.OrderByDescending(p => p.postedAt ?? p.createdAt)) + foreach (PurchasedEntities.ListItem purchase in + purchased.List.OrderByDescending(p => p.PostedAt ?? p.CreatedAt)) { - if (purchase.fromUser != null) + if (purchase.FromUser != null) { - if (users.Values.Contains(purchase.fromUser.id)) + if (users.Values.Contains(purchase.FromUser.Id)) { - if (!string.IsNullOrEmpty(users.FirstOrDefault(x => x.Value == purchase.fromUser.id).Key)) + if (!string.IsNullOrEmpty(users.FirstOrDefault(x => x.Value == purchase.FromUser.Id).Key)) { if (!purchasedTabUsers.ContainsKey(users - .FirstOrDefault(x => x.Value == purchase.fromUser.id).Key)) + .FirstOrDefault(x => x.Value == purchase.FromUser.Id).Key)) { purchasedTabUsers.Add( - users.FirstOrDefault(x => x.Value == purchase.fromUser.id).Key, - purchase.fromUser.id); + users.FirstOrDefault(x => x.Value == purchase.FromUser.Id).Key, + purchase.FromUser.Id); } } else { - if (!purchasedTabUsers.ContainsKey($"Deleted User - {purchase.fromUser.id}")) + if (!purchasedTabUsers.ContainsKey($"Deleted User - {purchase.FromUser.Id}")) { - purchasedTabUsers.Add($"Deleted User - {purchase.fromUser.id}", - purchase.fromUser.id); + purchasedTabUsers.Add($"Deleted User - {purchase.FromUser.Id}", + purchase.FromUser.Id); } } } else { - JObject user = await GetUserInfoById($"/users/list?x[]={purchase.fromUser.id}"); + JObject user = await GetUserInfoById($"/users/list?x[]={purchase.FromUser.Id}"); if (user is null) { if (!configService.CurrentConfig.BypassContentForCreatorsWhoNoLongerExist) { - if (!purchasedTabUsers.ContainsKey($"Deleted User - {purchase.fromUser.id}")) + if (!purchasedTabUsers.ContainsKey($"Deleted User - {purchase.FromUser.Id}")) { - purchasedTabUsers.Add($"Deleted User - {purchase.fromUser.id}", - purchase.fromUser.id); + purchasedTabUsers.Add($"Deleted User - {purchase.FromUser.Id}", + purchase.FromUser.Id); } } - Log.Debug("Content creator not longer exists - {0}", purchase.fromUser.id); + Log.Debug("Content creator not longer exists - {0}", purchase.FromUser.Id); } - else if (!string.IsNullOrEmpty(user[purchase.fromUser.id.ToString()]["username"] + else if (!string.IsNullOrEmpty(user[purchase.FromUser.Id.ToString()]["username"] .ToString())) { - if (!purchasedTabUsers.ContainsKey(user[purchase.fromUser.id.ToString()]["username"] + if (!purchasedTabUsers.ContainsKey(user[purchase.FromUser.Id.ToString()]["username"] .ToString())) { - purchasedTabUsers.Add(user[purchase.fromUser.id.ToString()]["username"].ToString(), - purchase.fromUser.id); + purchasedTabUsers.Add(user[purchase.FromUser.Id.ToString()]["username"].ToString(), + purchase.FromUser.Id); } } else { - if (!purchasedTabUsers.ContainsKey($"Deleted User - {purchase.fromUser.id}")) + if (!purchasedTabUsers.ContainsKey($"Deleted User - {purchase.FromUser.Id}")) { - purchasedTabUsers.Add($"Deleted User - {purchase.fromUser.id}", - purchase.fromUser.id); + purchasedTabUsers.Add($"Deleted User - {purchase.FromUser.Id}", + purchase.FromUser.Id); } } } } - else if (purchase.author != null) + else if (purchase.Author != null) { - if (users.Values.Contains(purchase.author.id)) + if (users.Values.Contains(purchase.Author.Id)) { - if (!string.IsNullOrEmpty(users.FirstOrDefault(x => x.Value == purchase.author.id).Key)) + if (!string.IsNullOrEmpty(users.FirstOrDefault(x => x.Value == purchase.Author.Id).Key)) { if (!purchasedTabUsers.ContainsKey(users - .FirstOrDefault(x => x.Value == purchase.author.id).Key) && - users.ContainsKey(users.FirstOrDefault(x => x.Value == purchase.author.id).Key)) + .FirstOrDefault(x => x.Value == purchase.Author.Id).Key) && + users.ContainsKey(users.FirstOrDefault(x => x.Value == purchase.Author.Id).Key)) { - purchasedTabUsers.Add(users.FirstOrDefault(x => x.Value == purchase.author.id).Key, - purchase.author.id); + purchasedTabUsers.Add(users.FirstOrDefault(x => x.Value == purchase.Author.Id).Key, + purchase.Author.Id); } } else { - if (!purchasedTabUsers.ContainsKey($"Deleted User - {purchase.author.id}")) + if (!purchasedTabUsers.ContainsKey($"Deleted User - {purchase.Author.Id}")) { - purchasedTabUsers.Add($"Deleted User - {purchase.author.id}", purchase.author.id); + purchasedTabUsers.Add($"Deleted User - {purchase.Author.Id}", purchase.Author.Id); } } } else { - JObject user = await GetUserInfoById($"/users/list?x[]={purchase.author.id}"); + JObject user = await GetUserInfoById($"/users/list?x[]={purchase.Author.Id}"); if (user is null) { if (!configService.CurrentConfig.BypassContentForCreatorsWhoNoLongerExist) { - if (!purchasedTabUsers.ContainsKey($"Deleted User - {purchase.author.id}")) + if (!purchasedTabUsers.ContainsKey($"Deleted User - {purchase.Author.Id}")) { - purchasedTabUsers.Add($"Deleted User - {purchase.author.id}", - purchase.author.id); + purchasedTabUsers.Add($"Deleted User - {purchase.Author.Id}", + purchase.Author.Id); } } - Log.Debug("Content creator not longer exists - {0}", purchase.author.id); + Log.Debug("Content creator not longer exists - {0}", purchase.Author.Id); } - else if (!string.IsNullOrEmpty(user[purchase.author.id.ToString()]["username"].ToString())) + else if (!string.IsNullOrEmpty(user[purchase.Author.Id.ToString()]["username"].ToString())) { - if (!purchasedTabUsers.ContainsKey(user[purchase.author.id.ToString()]["username"] + if (!purchasedTabUsers.ContainsKey(user[purchase.Author.Id.ToString()]["username"] .ToString()) && - users.ContainsKey(user[purchase.author.id.ToString()]["username"].ToString())) + users.ContainsKey(user[purchase.Author.Id.ToString()]["username"].ToString())) { - purchasedTabUsers.Add(user[purchase.author.id.ToString()]["username"].ToString(), - purchase.author.id); + purchasedTabUsers.Add(user[purchase.Author.Id.ToString()]["username"].ToString(), + purchase.Author.Id); } } else { - if (!purchasedTabUsers.ContainsKey($"Deleted User - {purchase.author.id}")) + if (!purchasedTabUsers.ContainsKey($"Deleted User - {purchase.Author.Id}")) { - purchasedTabUsers.Add($"Deleted User - {purchase.author.id}", purchase.author.id); + purchasedTabUsers.Add($"Deleted User - {purchase.Author.Id}", purchase.Author.Id); } } } @@ -2497,16 +2513,16 @@ public class APIService(IAuthService authService, IConfigService configService, return null; } - public async Task> GetPurchasedTab(string endpoint, string folder, + public async Task> GetPurchasedTab(string endpoint, string folder, Dictionary users) { Log.Debug($"Calling GetPurchasedTab - {endpoint}"); try { - Dictionary> userPurchases = new(); - List purchasedTabCollections = new(); - Purchased purchased = new(); + Dictionary> userPurchases = new(); + List purchasedTabCollections = []; + PurchasedEntities.Purchased purchased = new(); int post_limit = 50; Dictionary getParams = new() { @@ -2517,14 +2533,16 @@ public class APIService(IAuthService authService, IConfigService configService, }; string? body = await BuildHeaderAndExecuteRequests(getParams, endpoint, GetHttpClient()); - purchased = JsonConvert.DeserializeObject(body, m_JsonSerializerSettings); - if (purchased != null && purchased.hasMore) + PurchasedDtos.PurchasedDto? purchasedDto = + JsonConvert.DeserializeObject(body, m_JsonSerializerSettings); + purchased = PurchasedMapper.FromDto(purchasedDto); + if (purchased != null && purchased.HasMore) { - getParams["offset"] = purchased.list.Count.ToString(); + getParams["offset"] = purchased.List.Count.ToString(); while (true) { string loopqueryParams = "?" + string.Join("&", getParams.Select(kvp => $"{kvp.Key}={kvp.Value}")); - Purchased newPurchased = new(); + PurchasedEntities.Purchased newPurchased = new(); Dictionary loopheaders = GetDynamicHeaders("/api2/v2" + endpoint, loopqueryParams); HttpClient loopclient = GetHttpClient(); @@ -2540,11 +2558,14 @@ public class APIService(IAuthService authService, IConfigService configService, { loopresponse.EnsureSuccessStatusCode(); string loopbody = await loopresponse.Content.ReadAsStringAsync(); - newPurchased = JsonConvert.DeserializeObject(loopbody, m_JsonSerializerSettings); + PurchasedDtos.PurchasedDto? newPurchasedDto = + JsonConvert.DeserializeObject(loopbody, + m_JsonSerializerSettings); + newPurchased = PurchasedMapper.FromDto(newPurchasedDto); } - purchased.list.AddRange(newPurchased.list); - if (!newPurchased.hasMore) + purchased.List.AddRange(newPurchased.List); + if (!newPurchased.HasMore) { break; } @@ -2553,34 +2574,35 @@ public class APIService(IAuthService authService, IConfigService configService, } } - if (purchased.list != null && purchased.list.Count > 0) + if (purchased.List != null && purchased.List.Count > 0) { - foreach (Purchased.List purchase in purchased.list.OrderByDescending(p => p.postedAt ?? p.createdAt)) + foreach (PurchasedEntities.ListItem purchase in + purchased.List.OrderByDescending(p => p.PostedAt ?? p.CreatedAt)) { - if (purchase.fromUser != null) + if (purchase.FromUser != null) { - if (!userPurchases.ContainsKey(purchase.fromUser.id)) + if (!userPurchases.ContainsKey(purchase.FromUser.Id)) { - userPurchases.Add(purchase.fromUser.id, new List()); + userPurchases.Add(purchase.FromUser.Id, new List()); } - userPurchases[purchase.fromUser.id].Add(purchase); + userPurchases[purchase.FromUser.Id].Add(purchase); } - else if (purchase.author != null) + else if (purchase.Author != null) { - if (!userPurchases.ContainsKey(purchase.author.id)) + if (!userPurchases.ContainsKey(purchase.Author.Id)) { - userPurchases.Add(purchase.author.id, new List()); + userPurchases.Add(purchase.Author.Id, new List()); } - userPurchases[purchase.author.id].Add(purchase); + userPurchases[purchase.Author.Id].Add(purchase); } } } - foreach (KeyValuePair> user in userPurchases) + foreach (KeyValuePair> user in userPurchases) { - PurchasedTabCollection purchasedTabCollection = new(); + PurchasedEntities.PurchasedTabCollection purchasedTabCollection = new(); JObject userObject = await GetUserInfoById($"/users/list?x[]={user.Key}"); purchasedTabCollection.UserId = user.Key; purchasedTabCollection.Username = @@ -2591,26 +2613,26 @@ public class APIService(IAuthService authService, IConfigService configService, string path = Path.Combine(folder, purchasedTabCollection.Username); if (Path.Exists(path)) { - foreach (Purchased.List purchase in user.Value) + foreach (PurchasedEntities.ListItem purchase in user.Value) { - if (purchase.media == null) + if (purchase.Media == null) { Log.Warning( "PurchasedTab purchase media null, setting empty list | userId={UserId} username={Username} purchaseId={PurchaseId} responseType={ResponseType} createdAt={CreatedAt} postedAt={PostedAt}", - user.Key, purchasedTabCollection.Username, purchase.id, purchase.responseType, - purchase.createdAt, purchase.postedAt); - purchase.media = new List(); + user.Key, purchasedTabCollection.Username, purchase.Id, purchase.ResponseType, + purchase.CreatedAt, purchase.PostedAt); + purchase.Media = new List(); } - switch (purchase.responseType) + switch (purchase.ResponseType) { case "post": List previewids = new(); - if (purchase.previews != null) + if (purchase.Previews != null) { - for (int i = 0; i < purchase.previews.Count; i++) + for (int i = 0; i < purchase.Previews.Count; i++) { - if (purchase.previews[i] is long previewId) + if (purchase.Previews[i] is long previewId) { if (!previewids.Contains(previewId)) { @@ -2619,11 +2641,11 @@ public class APIService(IAuthService authService, IConfigService configService, } } } - else if (purchase.preview != null) + else if (purchase.Preview != null) { - for (int i = 0; i < purchase.preview.Count; i++) + for (int i = 0; i < purchase.Preview.Count; i++) { - if (purchase.preview[i] is long previewId) + if (purchase.Preview[i] is long previewId) { if (!previewids.Contains(previewId)) { @@ -2633,16 +2655,15 @@ public class APIService(IAuthService authService, IConfigService configService, } } - await dbService.AddPost(path, purchase.id, - purchase.text != null ? purchase.text : string.Empty, - purchase.price != null ? purchase.price : "0", - purchase.price != null && purchase.isOpened ? true : false, - purchase.isArchived.HasValue ? purchase.isArchived.Value : false, - purchase.createdAt != null ? purchase.createdAt.Value : purchase.postedAt.Value); + await dbService.AddPost(path, purchase.Id, + purchase.Text != null ? purchase.Text : string.Empty, + purchase.Price != null ? purchase.Price : "0", + purchase.Price != null && purchase.IsOpened ? true : false, + purchase.IsArchived.HasValue ? purchase.IsArchived.Value : false, + purchase.CreatedAt != null ? purchase.CreatedAt.Value : purchase.PostedAt.Value); purchasedTabCollection.PaidPosts.PaidPostObjects.Add(purchase); - foreach (MessageDtos.MediumDto medium in purchase.media) + foreach (MessageEntities.Medium medium in purchase.Media) { - MessageEntities.Medium mappedMedium = MessagesMapper.MapMedium(medium); if (medium.Type == "photo" && !configService.CurrentConfig.DownloadImages) { continue; @@ -2671,7 +2692,7 @@ public class APIService(IAuthService authService, IConfigService configService, { if (!purchasedTabCollection.PaidPosts.PaidPosts.ContainsKey(medium.Id)) { - await dbService.AddMedia(path, medium.Id, purchase.id, + await dbService.AddMedia(path, medium.Id, purchase.Id, medium.Files.Full.Url, null, null, null, "Posts", medium.Type == "photo" ? "Images" : medium.Type == "video" || medium.Type == "gif" ? "Videos" : @@ -2679,7 +2700,7 @@ public class APIService(IAuthService authService, IConfigService configService, previewids.Contains(medium.Id), false, null); purchasedTabCollection.PaidPosts.PaidPosts.Add(medium.Id, medium.Files.Full.Url); - purchasedTabCollection.PaidPosts.PaidPostMedia.Add(mappedMedium); + purchasedTabCollection.PaidPosts.PaidPostMedia.Add(medium); } } else if (!has && medium.CanView && medium.Files != null && @@ -2687,15 +2708,15 @@ public class APIService(IAuthService authService, IConfigService configService, { if (!purchasedTabCollection.PaidPosts.PaidPosts.ContainsKey(medium.Id)) { - await dbService.AddMedia(path, medium.Id, purchase.id, + await dbService.AddMedia(path, medium.Id, purchase.Id, medium.Files.Drm.Manifest.Dash, null, null, null, "Posts", medium.Type == "photo" ? "Images" : medium.Type == "video" || medium.Type == "gif" ? "Videos" : medium.Type == "audio" ? "Audios" : null, previewids.Contains(medium.Id), false, null); purchasedTabCollection.PaidPosts.PaidPosts.Add(medium.Id, - $"{medium.Files.Drm.Manifest.Dash},{medium.Files.Drm.Signature.Dash.CloudFrontPolicy},{medium.Files.Drm.Signature.Dash.CloudFrontSignature},{medium.Files.Drm.Signature.Dash.CloudFrontKeyPairId},{medium.Id},{purchase.id}"); - purchasedTabCollection.PaidPosts.PaidPostMedia.Add(mappedMedium); + $"{medium.Files.Drm.Manifest.Dash},{medium.Files.Drm.Signature.Dash.CloudFrontPolicy},{medium.Files.Drm.Signature.Dash.CloudFrontSignature},{medium.Files.Drm.Signature.Dash.CloudFrontKeyPairId},{medium.Id},{purchase.Id}"); + purchasedTabCollection.PaidPosts.PaidPostMedia.Add(medium); } } } @@ -2706,7 +2727,7 @@ public class APIService(IAuthService authService, IConfigService configService, { if (!purchasedTabCollection.PaidPosts.PaidPosts.ContainsKey(medium.Id)) { - await dbService.AddMedia(path, medium.Id, purchase.id, + await dbService.AddMedia(path, medium.Id, purchase.Id, medium.Files.Full.Url, null, null, null, "Posts", medium.Type == "photo" ? "Images" : medium.Type == "video" || medium.Type == "gif" ? "Videos" : @@ -2714,22 +2735,22 @@ public class APIService(IAuthService authService, IConfigService configService, previewids.Contains(medium.Id), false, null); purchasedTabCollection.PaidPosts.PaidPosts.Add(medium.Id, medium.Files.Full.Url); - purchasedTabCollection.PaidPosts.PaidPostMedia.Add(mappedMedium); + purchasedTabCollection.PaidPosts.PaidPostMedia.Add(medium); } } else if (medium.CanView && medium.Files != null && medium.Files.Drm != null) { if (!purchasedTabCollection.PaidPosts.PaidPosts.ContainsKey(medium.Id)) { - await dbService.AddMedia(path, medium.Id, purchase.id, + await dbService.AddMedia(path, medium.Id, purchase.Id, medium.Files.Drm.Manifest.Dash, null, null, null, "Posts", medium.Type == "photo" ? "Images" : medium.Type == "video" || medium.Type == "gif" ? "Videos" : medium.Type == "audio" ? "Audios" : null, previewids.Contains(medium.Id), false, null); purchasedTabCollection.PaidPosts.PaidPosts.Add(medium.Id, - $"{medium.Files.Drm.Manifest.Dash},{medium.Files.Drm.Signature.Dash.CloudFrontPolicy},{medium.Files.Drm.Signature.Dash.CloudFrontSignature},{medium.Files.Drm.Signature.Dash.CloudFrontKeyPairId},{medium.Id},{purchase.id}"); - purchasedTabCollection.PaidPosts.PaidPostMedia.Add(mappedMedium); + $"{medium.Files.Drm.Manifest.Dash},{medium.Files.Drm.Signature.Dash.CloudFrontPolicy},{medium.Files.Drm.Signature.Dash.CloudFrontSignature},{medium.Files.Drm.Signature.Dash.CloudFrontKeyPairId},{medium.Id},{purchase.Id}"); + purchasedTabCollection.PaidPosts.PaidPostMedia.Add(medium); } } } @@ -2737,30 +2758,30 @@ public class APIService(IAuthService authService, IConfigService configService, break; case "message": - if (purchase.postedAt != null) + if (purchase.PostedAt != null) { - await dbService.AddMessage(path, purchase.id, - purchase.text != null ? purchase.text : string.Empty, - purchase.price != null ? purchase.price : "0", true, false, - purchase.postedAt.Value, purchase.fromUser.id); + await dbService.AddMessage(path, purchase.Id, + purchase.Text != null ? purchase.Text : string.Empty, + purchase.Price != null ? purchase.Price : "0", true, false, + purchase.PostedAt.Value, purchase.FromUser.Id); } else { - await dbService.AddMessage(path, purchase.id, - purchase.text != null ? purchase.text : string.Empty, - purchase.price != null ? purchase.price : "0", true, false, - purchase.createdAt.Value, purchase.fromUser.id); + await dbService.AddMessage(path, purchase.Id, + purchase.Text != null ? purchase.Text : string.Empty, + purchase.Price != null ? purchase.Price : "0", true, false, + purchase.CreatedAt.Value, purchase.FromUser.Id); } purchasedTabCollection.PaidMessages.PaidMessageObjects.Add(purchase); - if (purchase.media != null && purchase.media.Count > 0) + if (purchase.Media != null && purchase.Media.Count > 0) { List paidMessagePreviewids = new(); - if (purchase.previews != null) + if (purchase.Previews != null) { - for (int i = 0; i < purchase.previews.Count; i++) + for (int i = 0; i < purchase.Previews.Count; i++) { - if (purchase.previews[i] is long previewId) + if (purchase.Previews[i] is long previewId) { if (!paidMessagePreviewids.Contains(previewId)) { @@ -2769,11 +2790,11 @@ public class APIService(IAuthService authService, IConfigService configService, } } } - else if (purchase.preview != null) + else if (purchase.Preview != null) { - for (int i = 0; i < purchase.preview.Count; i++) + for (int i = 0; i < purchase.Preview.Count; i++) { - if (purchase.preview[i] is long previewId) + if (purchase.Preview[i] is long previewId) { if (!paidMessagePreviewids.Contains(previewId)) { @@ -2783,11 +2804,10 @@ public class APIService(IAuthService authService, IConfigService configService, } } - foreach (MessageDtos.MediumDto medium in purchase.media) + foreach (MessageEntities.Medium medium in purchase.Media) { if (paidMessagePreviewids.Count > 0) { - MessageEntities.Medium mappedMedium = MessagesMapper.MapMedium(medium); bool has = paidMessagePreviewids.Any(cus => cus.Equals(medium.Id)); if (!has && medium.CanView && medium.Files != null && medium.Files.Full != null && @@ -2819,7 +2839,7 @@ public class APIService(IAuthService authService, IConfigService configService, if (!purchasedTabCollection.PaidMessages.PaidMessages.ContainsKey( medium.Id)) { - await dbService.AddMedia(path, medium.Id, purchase.id, + await dbService.AddMedia(path, medium.Id, purchase.Id, medium.Files.Full.Url, null, null, null, "Messages", medium.Type == "photo" ? "Images" : medium.Type == "video" || medium.Type == "gif" ? "Videos" : @@ -2829,7 +2849,7 @@ public class APIService(IAuthService authService, IConfigService configService, purchasedTabCollection.PaidMessages.PaidMessages.Add(medium.Id, medium.Files.Full.Url); purchasedTabCollection.PaidMessages.PaidMessageMedia.Add( - mappedMedium); + medium); } } else if (!has && medium.CanView && medium.Files != null && @@ -2861,7 +2881,7 @@ public class APIService(IAuthService authService, IConfigService configService, if (!purchasedTabCollection.PaidMessages.PaidMessages.ContainsKey( medium.Id)) { - await dbService.AddMedia(path, medium.Id, purchase.id, + await dbService.AddMedia(path, medium.Id, purchase.Id, medium.Files.Drm.Manifest.Dash, null, null, null, "Messages", medium.Type == "photo" ? "Images" : medium.Type == "video" || medium.Type == "gif" ? "Videos" : @@ -2869,15 +2889,14 @@ public class APIService(IAuthService authService, IConfigService configService, paidMessagePreviewids.Contains(medium.Id), false, null); purchasedTabCollection.PaidMessages.PaidMessages.Add(medium.Id, - $"{medium.Files.Drm.Manifest.Dash},{medium.Files.Drm.Signature.Dash.CloudFrontPolicy},{medium.Files.Drm.Signature.Dash.CloudFrontSignature},{medium.Files.Drm.Signature.Dash.CloudFrontKeyPairId},{medium.Id},{purchase.id}"); + $"{medium.Files.Drm.Manifest.Dash},{medium.Files.Drm.Signature.Dash.CloudFrontPolicy},{medium.Files.Drm.Signature.Dash.CloudFrontSignature},{medium.Files.Drm.Signature.Dash.CloudFrontKeyPairId},{medium.Id},{purchase.Id}"); purchasedTabCollection.PaidMessages.PaidMessageMedia.Add( - mappedMedium); + medium); } } } else { - MessageEntities.Medium mappedMedium = MessagesMapper.MapMedium(medium); if (medium.CanView && medium.Files != null && medium.Files.Full != null && !string.IsNullOrEmpty(medium.Files.Full.Url)) { @@ -2907,7 +2926,7 @@ public class APIService(IAuthService authService, IConfigService configService, if (!purchasedTabCollection.PaidMessages.PaidMessages.ContainsKey( medium.Id)) { - await dbService.AddMedia(path, medium.Id, purchase.id, + await dbService.AddMedia(path, medium.Id, purchase.Id, medium.Files.Full.Url, null, null, null, "Messages", medium.Type == "photo" ? "Images" : medium.Type == "video" || medium.Type == "gif" ? "Videos" : @@ -2917,7 +2936,7 @@ public class APIService(IAuthService authService, IConfigService configService, purchasedTabCollection.PaidMessages.PaidMessages.Add(medium.Id, medium.Files.Full.Url); purchasedTabCollection.PaidMessages.PaidMessageMedia.Add( - mappedMedium); + medium); } } else if (medium.CanView && medium.Files != null && medium.Files.Drm != null) @@ -2948,7 +2967,7 @@ public class APIService(IAuthService authService, IConfigService configService, if (!purchasedTabCollection.PaidMessages.PaidMessages.ContainsKey( medium.Id)) { - await dbService.AddMedia(path, medium.Id, purchase.id, + await dbService.AddMedia(path, medium.Id, purchase.Id, medium.Files.Drm.Manifest.Dash, null, null, null, "Messages", medium.Type == "photo" ? "Images" : medium.Type == "video" || medium.Type == "gif" ? "Videos" : @@ -2956,9 +2975,9 @@ public class APIService(IAuthService authService, IConfigService configService, paidMessagePreviewids.Contains(medium.Id), false, null); purchasedTabCollection.PaidMessages.PaidMessages.Add(medium.Id, - $"{medium.Files.Drm.Manifest.Dash},{medium.Files.Drm.Signature.Dash.CloudFrontPolicy},{medium.Files.Drm.Signature.Dash.CloudFrontSignature},{medium.Files.Drm.Signature.Dash.CloudFrontKeyPairId},{medium.Id},{purchase.id}"); + $"{medium.Files.Drm.Manifest.Dash},{medium.Files.Drm.Signature.Dash.CloudFrontPolicy},{medium.Files.Drm.Signature.Dash.CloudFrontSignature},{medium.Files.Drm.Signature.Dash.CloudFrontKeyPairId},{medium.Id},{purchase.Id}"); purchasedTabCollection.PaidMessages.PaidMessageMedia.Add( - mappedMedium); + medium); } } } diff --git a/OF DL/Services/DownloadService.cs b/OF DL/Services/DownloadService.cs index b138344..9f5e7d8 100644 --- a/OF DL/Services/DownloadService.cs +++ b/OF DL/Services/DownloadService.cs @@ -4,13 +4,13 @@ using System.Xml.Linq; using FFmpeg.NET; using FFmpeg.NET.Events; using OF_DL.Models; -using OF_DL.Models.Purchased; using OF_DL.Models.Streams; using OF_DL.Enumerations; using ArchivedEntities = OF_DL.Models.Entities.Archived; using CommonEntities = OF_DL.Models.Entities.Common; using MessageEntities = OF_DL.Models.Entities.Messages; using PostEntities = OF_DL.Models.Entities.Posts; +using PurchasedEntities = OF_DL.Models.Entities.Purchased; using OF_DL.Utils; using Serilog; using Serilog.Events; @@ -1109,15 +1109,15 @@ public class DownloadService( } public async Task DownloadPurchasedMedia(string url, string folder, long media_id, string api_type, - IProgressReporter progressReporter, string? filenameFormat, Purchased.List? messageInfo, + IProgressReporter progressReporter, string? filenameFormat, PurchasedEntities.ListItem? messageInfo, MessageEntities.Medium? messageMedia, - Purchased.FromUser? fromUser, Dictionary users) + CommonEntities.FromUser? fromUser, Dictionary users) { string path; - if (configService.CurrentConfig.FolderPerPaidMessage && messageInfo != null && messageInfo?.id is not null && - messageInfo?.createdAt is not null) + if (configService.CurrentConfig.FolderPerPaidMessage && messageInfo != null && messageInfo?.Id is not null && + messageInfo?.CreatedAt is not null) { - path = $"/Messages/Paid/{messageInfo.id} {messageInfo.createdAt.Value:yyyy-MM-dd HH-mm-ss}"; + path = $"/Messages/Paid/{messageInfo.Id} {messageInfo.CreatedAt.Value:yyyy-MM-dd HH-mm-ss}"; } else { @@ -1161,16 +1161,16 @@ public class DownloadService( string api_type, IProgressReporter progressReporter, string? filenameFormat, - Purchased.List? messageInfo, + PurchasedEntities.ListItem? messageInfo, MessageEntities.Medium? messageMedia, - Purchased.FromUser? fromUser, + CommonEntities.FromUser? fromUser, Dictionary users) { string path; - if (configService.CurrentConfig.FolderPerPaidPost && messageInfo != null && messageInfo?.id is not null && - messageInfo?.postedAt is not null) + if (configService.CurrentConfig.FolderPerPaidPost && messageInfo != null && messageInfo?.Id is not null && + messageInfo?.PostedAt is not null) { - path = $"/Posts/Paid/{messageInfo.id} {messageInfo.postedAt.Value:yyyy-MM-dd HH-mm-ss}"; + path = $"/Posts/Paid/{messageInfo.Id} {messageInfo.PostedAt.Value:yyyy-MM-dd HH-mm-ss}"; } else { @@ -1451,9 +1451,9 @@ public class DownloadService( public async Task DownloadPurchasedMessageDRMVideo(string policy, string signature, string kvp, string url, string decryptionKey, string folder, DateTime lastModified, long media_id, string api_type, - IProgressReporter progressReporter, string? filenameFormat, Purchased.List? messageInfo, + IProgressReporter progressReporter, string? filenameFormat, PurchasedEntities.ListItem? messageInfo, MessageEntities.Medium? messageMedia, - Purchased.FromUser? fromUser, Dictionary users) + CommonEntities.FromUser? fromUser, Dictionary users) { try { @@ -1462,9 +1462,9 @@ public class DownloadService( Uri uri = new(url); string filename = Path.GetFileName(uri.LocalPath).Split(".")[0]; if (configService.CurrentConfig.FolderPerPaidMessage && messageInfo != null && - messageInfo?.id is not null && messageInfo?.createdAt is not null) + messageInfo?.Id is not null && messageInfo?.CreatedAt is not null) { - path = $"/Messages/Paid/{messageInfo.id} {messageInfo.createdAt.Value:yyyy-MM-dd HH-mm-ss}/Videos"; + path = $"/Messages/Paid/{messageInfo.Id} {messageInfo.CreatedAt.Value:yyyy-MM-dd HH-mm-ss}/Videos"; } else { @@ -2095,9 +2095,9 @@ public class DownloadService( public async Task DownloadPurchasedPostDRMVideo(string policy, string signature, string kvp, string url, string decryptionKey, string folder, DateTime lastModified, long media_id, string api_type, - IProgressReporter progressReporter, string? filenameFormat, Purchased.List? postInfo, + IProgressReporter progressReporter, string? filenameFormat, PurchasedEntities.ListItem? postInfo, MessageEntities.Medium? postMedia, - Purchased.FromUser? fromUser, Dictionary users) + CommonEntities.FromUser? fromUser, Dictionary users) { try { @@ -2105,10 +2105,10 @@ public class DownloadService( string path; Uri uri = new(url); string filename = Path.GetFileName(uri.LocalPath).Split(".")[0]; - if (configService.CurrentConfig.FolderPerPaidPost && postInfo != null && postInfo?.id is not null && - postInfo?.postedAt is not null) + if (configService.CurrentConfig.FolderPerPaidPost && postInfo != null && postInfo?.Id is not null && + postInfo?.PostedAt is not null) { - path = $"/Posts/Paid/{postInfo.id} {postInfo.postedAt.Value:yyyy-MM-dd HH-mm-ss}/Videos"; + path = $"/Posts/Paid/{postInfo.Id} {postInfo.PostedAt.Value:yyyy-MM-dd HH-mm-ss}/Videos"; } else { @@ -2712,7 +2712,8 @@ public class DownloadService( public async Task DownloadPaidMessages(string username, string path, Dictionary users, - bool clientIdBlobMissing, bool devicePrivateKeyMissing, PaidMessageCollection paidMessageCollection, + bool clientIdBlobMissing, bool devicePrivateKeyMissing, + PurchasedEntities.PaidMessageCollection paidMessageCollection, IProgressReporter progressReporter) { Log.Debug($"Calling DownloadPaidMessages - {username}"); @@ -2760,14 +2761,14 @@ public class DownloadService( MessageEntities.Medium? mediaInfo = paidMessageCollection.PaidMessageMedia.FirstOrDefault(m => m.Id == kvp.Key); - Purchased.List? messageInfo = + PurchasedEntities.ListItem? messageInfo = paidMessageCollection.PaidMessageObjects.FirstOrDefault(p => - p?.media?.Any(m => m.Id == kvp.Key) == true); + p?.Media?.Any(m => m.Id == kvp.Key) == true); isNew = await DownloadPurchasedMessageDRMVideo(parsed[1], parsed[2], parsed[3], parsed[0], decryptionKey, path, lastModified, kvp.Key, "Messages", progressReporter, configService.CurrentConfig.GetCreatorFileNameFormatConfig(username).MessageFileNameFormat ?? - string.Empty, messageInfo, mediaInfo, messageInfo?.fromUser, users); + string.Empty, messageInfo, mediaInfo, messageInfo?.FromUser, users); } else { @@ -2778,11 +2779,11 @@ public class DownloadService( { MessageEntities.Medium? mediaInfo = paidMessageCollection.PaidMessageMedia.FirstOrDefault(m => m.Id == kvp.Key); - Purchased.List? messageInfo = paidMessageCollection.PaidMessageObjects.FirstOrDefault(p => - p?.media?.Any(m => m.Id == kvp.Key) == true); + PurchasedEntities.ListItem? messageInfo = paidMessageCollection.PaidMessageObjects.FirstOrDefault(p => + p?.Media?.Any(m => m.Id == kvp.Key) == true); isNew = await DownloadPurchasedMedia(kvp.Value, path, kvp.Key, "Messages", progressReporter, configService.CurrentConfig.GetCreatorFileNameFormatConfig(username).MessageFileNameFormat ?? - string.Empty, messageInfo, mediaInfo, messageInfo?.fromUser, users); + string.Empty, messageInfo, mediaInfo, messageInfo?.FromUser, users); } if (isNew) @@ -2992,7 +2993,7 @@ public class DownloadService( public async Task DownloadPaidPosts(string username, long userId, string path, Dictionary users, bool clientIdBlobMissing, bool devicePrivateKeyMissing, - PaidPostCollection purchasedPosts, IProgressReporter progressReporter) + PurchasedEntities.PaidPostCollection purchasedPosts, IProgressReporter progressReporter) { Log.Debug($"Calling DownloadPaidPosts - {username}"); @@ -3038,14 +3039,14 @@ public class DownloadService( MessageEntities.Medium? mediaInfo = purchasedPosts.PaidPostMedia.FirstOrDefault(m => m.Id == postKVP.Key); - Purchased.List? postInfo = + PurchasedEntities.ListItem? postInfo = purchasedPosts.PaidPostObjects.FirstOrDefault(p => - p?.media?.Any(m => m.Id == postKVP.Key) == true); + p?.Media?.Any(m => m.Id == postKVP.Key) == true); isNew = await DownloadPurchasedPostDRMVideo(parsed[1], parsed[2], parsed[3], parsed[0], decryptionKey, path, lastModified, postKVP.Key, "Posts", progressReporter, configService.CurrentConfig.GetCreatorFileNameFormatConfig(username).PostFileNameFormat ?? - string.Empty, postInfo, mediaInfo, postInfo?.fromUser, users); + string.Empty, postInfo, mediaInfo, postInfo?.FromUser, users); } else { @@ -3056,11 +3057,11 @@ public class DownloadService( { MessageEntities.Medium? mediaInfo = purchasedPosts.PaidPostMedia.FirstOrDefault(m => m.Id == postKVP.Key); - Purchased.List? postInfo = - purchasedPosts.PaidPostObjects.FirstOrDefault(p => p?.media?.Any(m => m.Id == postKVP.Key) == true); + PurchasedEntities.ListItem? postInfo = + purchasedPosts.PaidPostObjects.FirstOrDefault(p => p?.Media?.Any(m => m.Id == postKVP.Key) == true); isNew = await DownloadPurchasedPostMedia(postKVP.Value, path, postKVP.Key, "Posts", progressReporter, configService.CurrentConfig.GetCreatorFileNameFormatConfig(username).PostFileNameFormat ?? - string.Empty, postInfo, mediaInfo, postInfo?.fromUser, users); + string.Empty, postInfo, mediaInfo, postInfo?.FromUser, users); } if (isNew) diff --git a/OF DL/Services/IAPIService.cs b/OF DL/Services/IAPIService.cs index 1c77129..14a487c 100644 --- a/OF DL/Services/IAPIService.cs +++ b/OF DL/Services/IAPIService.cs @@ -1,8 +1,8 @@ using Newtonsoft.Json.Linq; using OF_DL.Models; -using OF_DL.Models.Purchased; using OF_DL.Models.Streams; using OF_DL.Enumerations; +using OF_DL.Models.Entities.Purchased; using ArchivedEntities = OF_DL.Models.Entities.Archived; using MessageEntities = OF_DL.Models.Entities.Messages; using PostEntities = OF_DL.Models.Entities.Posts; diff --git a/OF DL/Services/IDownloadService.cs b/OF DL/Services/IDownloadService.cs index b1ff68e..d0979ba 100644 --- a/OF DL/Services/IDownloadService.cs +++ b/OF DL/Services/IDownloadService.cs @@ -1,10 +1,10 @@ using OF_DL.Models; -using OF_DL.Models.Purchased; using OF_DL.Models.Streams; using ArchivedEntities = OF_DL.Models.Entities.Archived; using CommonEntities = OF_DL.Models.Entities.Common; using MessageEntities = OF_DL.Models.Entities.Messages; using PostEntities = OF_DL.Models.Entities.Posts; +using PurchasedEntities = OF_DL.Models.Entities.Purchased; namespace OF_DL.Services; @@ -61,9 +61,9 @@ public interface IDownloadService CommonEntities.Author? author, Dictionary users); Task DownloadPurchasedMedia(string url, string folder, long media_id, string api_type, - IProgressReporter progressReporter, string? filenameFormat, Purchased.List? messageInfo, + IProgressReporter progressReporter, string? filenameFormat, PurchasedEntities.ListItem? messageInfo, MessageEntities.Medium? messageMedia, - Purchased.FromUser? fromUser, Dictionary users); + CommonEntities.FromUser? fromUser, Dictionary users); Task DownloadSinglePurchasedMedia(string url, string folder, long media_id, string api_type, IProgressReporter progressReporter, string? filenameFormat, MessageEntities.SingleMessage? messageInfo, @@ -71,9 +71,9 @@ public interface IDownloadService Task DownloadPurchasedMessageDRMVideo(string policy, string signature, string kvp, string url, string decryptionKey, string folder, DateTime lastModified, long media_id, string api_type, - IProgressReporter progressReporter, string? filenameFormat, Purchased.List? messageInfo, + IProgressReporter progressReporter, string? filenameFormat, PurchasedEntities.ListItem? messageInfo, MessageEntities.Medium? messageMedia, - Purchased.FromUser? fromUser, Dictionary users); + CommonEntities.FromUser? fromUser, Dictionary users); Task DownloadSinglePurchasedMessageDRMVideo(string policy, string signature, string kvp, string url, string decryptionKey, string folder, DateTime lastModified, long media_id, string api_type, @@ -82,14 +82,14 @@ public interface IDownloadService Task DownloadPurchasedPostDRMVideo(string policy, string signature, string kvp, string url, string decryptionKey, string folder, DateTime lastModified, long media_id, string api_type, - IProgressReporter progressReporter, string? filenameFormat, Purchased.List? postInfo, + IProgressReporter progressReporter, string? filenameFormat, PurchasedEntities.ListItem? postInfo, MessageEntities.Medium? postMedia, - Purchased.FromUser? fromUser, Dictionary users); + CommonEntities.FromUser? fromUser, Dictionary users); Task DownloadPurchasedPostMedia(string url, string folder, long media_id, string api_type, - IProgressReporter progressReporter, string? filenameFormat, Purchased.List? messageInfo, + IProgressReporter progressReporter, string? filenameFormat, PurchasedEntities.ListItem? messageInfo, MessageEntities.Medium? messageMedia, - Purchased.FromUser? fromUser, Dictionary users); + CommonEntities.FromUser? fromUser, Dictionary users); Task DownloadStoryMedia(string url, string folder, long media_id, string api_type, IProgressReporter progressReporter); @@ -127,7 +127,8 @@ public interface IDownloadService IProgressReporter progressReporter); Task DownloadPaidMessages(string username, string path, Dictionary users, - bool clientIdBlobMissing, bool devicePrivateKeyMissing, PaidMessageCollection paidMessageCollection, + bool clientIdBlobMissing, bool devicePrivateKeyMissing, + PurchasedEntities.PaidMessageCollection paidMessageCollection, IProgressReporter progressReporter); Task DownloadStreams(string username, long userId, string path, Dictionary users, @@ -139,6 +140,6 @@ public interface IDownloadService IProgressReporter progressReporter); Task DownloadPaidPosts(string username, long userId, string path, Dictionary users, - bool clientIdBlobMissing, bool devicePrivateKeyMissing, PaidPostCollection purchasedPosts, + bool clientIdBlobMissing, bool devicePrivateKeyMissing, PurchasedEntities.PaidPostCollection purchasedPosts, IProgressReporter progressReporter); }