From 04004c7084d4640c9222ae674d9c0a7b9e6fe223 Mon Sep 17 00:00:00 2001 From: whimsical-c4lic0 Date: Tue, 10 Feb 2026 12:01:33 -0600 Subject: [PATCH] Refactor services --- OF DL.Core/Helpers/Constants.cs | 9 +- OF DL.Core/Helpers/VersionHelper.cs | 19 +- OF DL.Core/Services/ApiService.cs | 1305 +++++++++-------- OF DL.Core/Services/DbService.cs | 8 +- .../Services/DownloadOrchestrationService.cs | 12 +- OF DL.Core/Services/DownloadService.cs | 20 +- OF DL.Core/Services/IApiService.cs | 5 +- OF DL.Core/Services/IAuthService.cs | 2 +- OF DL.Core/Services/IDownloadService.cs | 17 - OF DL.Core/Services/IProgressReporter.cs | 6 - OF DL.Core/Utils/HttpUtil.cs | 4 +- OF DL/CLI/SpectreProgressReporter.cs | 6 - 12 files changed, 709 insertions(+), 704 deletions(-) diff --git a/OF DL.Core/Helpers/Constants.cs b/OF DL.Core/Helpers/Constants.cs index 01a410d..2843ee7 100644 --- a/OF DL.Core/Helpers/Constants.cs +++ b/OF DL.Core/Helpers/Constants.cs @@ -2,8 +2,11 @@ namespace OF_DL.Helpers; public static class Constants { - public const string API_URL = "https://onlyfans.com/api2/v2"; + public const string ApiUrl = "https://onlyfans.com/api2/v2"; - public const int WIDEVINE_RETRY_DELAY = 10; - public const int WIDEVINE_MAX_RETRIES = 3; + public const int ApiPageSize = 50; + + public const int WidevineRetryDelay = 10; + + public const int WidevineMaxRetries = 3; } diff --git a/OF DL.Core/Helpers/VersionHelper.cs b/OF DL.Core/Helpers/VersionHelper.cs index 17e01a1..593e74c 100644 --- a/OF DL.Core/Helpers/VersionHelper.cs +++ b/OF DL.Core/Helpers/VersionHelper.cs @@ -6,15 +6,15 @@ namespace OF_DL.Helpers; public static class VersionHelper { - private const string url = "https://git.ofdl.tools/api/v1/repos/sim0n00ps/OF-DL/releases/latest"; - private static readonly HttpClient httpClient = new(); + private const string Url = "https://git.ofdl.tools/api/v1/repos/sim0n00ps/OF-DL/releases/latest"; + private static readonly HttpClient s_httpClient = new(); public static async Task GetLatestReleaseTag(CancellationToken cancellationToken = default) { Log.Debug("Calling GetLatestReleaseTag"); try { - HttpResponseMessage response = await httpClient.GetAsync(url, cancellationToken); + HttpResponseMessage response = await s_httpClient.GetAsync(Url, cancellationToken); if (!response.IsSuccessStatusCode) { @@ -22,21 +22,20 @@ public static class VersionHelper return null; } - string body = await response.Content.ReadAsStringAsync(); + string body = await response.Content.ReadAsStringAsync(cancellationToken); - Log.Debug("GetLatestReleaseTag API Response: "); - Log.Debug(body); + Log.Debug("GetLatestReleaseTag API Response: {Body}", body); LatestReleaseApiResponse? versionCheckResponse = JsonConvert.DeserializeObject(body); - if (versionCheckResponse == null || versionCheckResponse.TagName == "") + if (versionCheckResponse != null && versionCheckResponse.TagName != "") { - Log.Debug("GetLatestReleaseTag did not return a valid tag name"); - return null; + return versionCheckResponse.TagName; } - return versionCheckResponse.TagName; + Log.Debug("GetLatestReleaseTag did not return a valid tag name"); + return null; } catch (OperationCanceledException) { diff --git a/OF DL.Core/Services/ApiService.cs b/OF DL.Core/Services/ApiService.cs index 09017f0..09efb41 100644 --- a/OF DL.Core/Services/ApiService.cs +++ b/OF DL.Core/Services/ApiService.cs @@ -74,7 +74,7 @@ public class ApiService(IAuthService authService, IConfigService configService, } else { - //Get rules from GitHub and fallback to local file + // Get rules from GitHub and fallback to a local file string? dynamicRulesJson = GetDynamicRules(); if (!string.IsNullOrEmpty(dynamicRulesJson)) { @@ -90,7 +90,7 @@ public class ApiService(IAuthService authService, IConfigService configService, Log.Debug("Using dynamic rules from local file"); root = JsonConvert.DeserializeObject(File.ReadAllText("rules.json")); - // Cache the dynamic rules from local file to prevent unnecessary disk + // Cache the dynamic rules from a local file to prevent unnecessary disk // operations and frequent call to GitHub. Since the GitHub dynamic rules // are preferred to the local file, the cache time is shorter than when dynamic rules // are successfully retrieved from GitHub. @@ -160,10 +160,9 @@ public class ApiService(IAuthService authService, IConfigService configService, try { UserEntities.User user = new(); - const int postLimit = 50; Dictionary getParams = new() { - { "limit", postLimit.ToString() }, { "order", "publish_date_asc" } + { "limit", Constants.ApiPageSize.ToString() }, { "order", "publish_date_asc" } }; HttpClient client = new(); @@ -386,20 +385,17 @@ public class ApiService(IAuthService authService, IConfigService configService, /// The endpoint to query. /// Optional username context. /// The creator folder path. - /// Paid post media IDs. /// A mediaId-to-URL map. public async Task?> GetMedia(MediaType mediatype, string endpoint, string? username, - string folder, - List paidPostIds) + string folder) { Log.Debug($"Calling GetMedia - {username}"); try { Dictionary returnUrls = new(); - const int postLimit = 50; const int limit = 5; int offset = 0; @@ -410,7 +406,9 @@ public class ApiService(IAuthService authService, IConfigService configService, case MediaType.Stories: getParams = new Dictionary { - { "limit", postLimit.ToString() }, { "order", "publish_date_desc" }, { "skip_users", "all" } + { "limit", Constants.ApiPageSize.ToString() }, + { "order", "publish_date_desc" }, + { "skip_users", "all" } }; break; @@ -478,9 +476,9 @@ public class ApiService(IAuthService authService, IConfigService configService, continue; } - if (medium.CanView && !returnUrls.ContainsKey(medium.Id)) + if (medium.CanView) { - returnUrls.Add(medium.Id, mediaUrl); + returnUrls.TryAdd(medium.Id, mediaUrl); } } } @@ -555,7 +553,7 @@ public class ApiService(IAuthService authService, IConfigService configService, foreach (HighlightEntities.Story item in highlightMedia.Stories) { - DateTime? createdAt = item.Media != null && item.Media.Count > 0 + DateTime? createdAt = item.Media is { Count: > 0 } ? item.Media[0].CreatedAt : null; @@ -572,24 +570,26 @@ public class ApiService(IAuthService authService, IConfigService configService, await dbService.AddStory(folder, item.Id, "", "0", false, false, DateTime.Now); } - if (item.Media != null && item.Media.Count > 0 && item.Media[0].CanView) + if (item.Media is not { Count: > 0 } || !item.Media[0].CanView) { - string? storyUrl = item.Media[0].Files?.Full?.Url; - string storyUrlValue = storyUrl ?? string.Empty; - foreach (HighlightEntities.Medium medium in item.Media) - { - string mediaType = ResolveMediaType(medium.Type) ?? string.Empty; - await dbService.AddMedia(folder, medium.Id, item.Id, storyUrlValue, null, null, null, - "Stories", mediaType, false, false, null); - if (!IsMediaTypeDownloadEnabled(medium.Type)) - { - continue; - } + continue; + } - if (!returnUrls.ContainsKey(medium.Id) && !string.IsNullOrEmpty(storyUrl)) - { - returnUrls.Add(medium.Id, storyUrl); - } + string? storyUrl = item.Media[0].Files?.Full?.Url; + string storyUrlValue = storyUrl ?? string.Empty; + foreach (HighlightEntities.Medium medium in item.Media) + { + string mediaType = ResolveMediaType(medium.Type) ?? string.Empty; + await dbService.AddMedia(folder, medium.Id, item.Id, storyUrlValue, null, null, null, + "Stories", mediaType, false, false, null); + if (!IsMediaTypeDownloadEnabled(medium.Type)) + { + continue; + } + + if (!returnUrls.ContainsKey(medium.Id) && !string.IsNullOrEmpty(storyUrl)) + { + returnUrls.Add(medium.Id, storyUrl); } } } @@ -625,10 +625,9 @@ public class ApiService(IAuthService authService, IConfigService configService, try { PurchasedEntities.PaidPostCollection paidPostCollection = new(); - const int postLimit = 50; Dictionary getParams = new() { - { "limit", postLimit.ToString() }, + { "limit", Constants.ApiPageSize.ToString() }, { "skip_users", "all" }, { "order", "publish_date_desc" }, { "format", "infinite" }, @@ -657,120 +656,123 @@ public class ApiService(IAuthService authService, IConfigService configService, break; } - getParams["offset"] = Convert.ToString(Convert.ToInt32(getParams["offset"]) + postLimit); + getParams["offset"] = + Convert.ToString(Convert.ToInt32(getParams["offset"]) + Constants.ApiPageSize); } } List paidPostList = paidPosts.List; foreach (PurchasedEntities.ListItem purchase in paidPostList) { - if (purchase.ResponseType == "post" && purchase.Media != null && purchase.Media.Count > 0) + if (purchase.ResponseType != "post" || purchase.Media is not { Count: > 0 }) { - List previewids = new(); - if (purchase.Previews != null) + continue; + } + + List previewIds = []; + 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)) { - if (!previewids.Contains(previewId)) - { - previewids.Add(previewId); - } + previewIds.Add(previewId); } } } - 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)) { - if (!previewids.Contains(previewId)) - { - previewids.Add(previewId); - } + previewIds.Add(previewId); } } } + } - DateTime createdAt = purchase.CreatedAt ?? purchase.PostedAt ?? DateTime.Now; - bool isArchived = purchase.IsArchived ?? false; - await dbService.AddPost(folder, purchase.Id, purchase.Text ?? "", - purchase.Price ?? "0", - purchase.Price != null && purchase.IsOpened, isArchived, createdAt); - paidPostCollection.PaidPostObjects.Add(purchase); - foreach (MessageEntities.Medium medium in purchase.Media) + DateTime createdAt = purchase.CreatedAt ?? purchase.PostedAt ?? DateTime.Now; + bool isArchived = purchase.IsArchived ?? false; + await dbService.AddPost(folder, purchase.Id, purchase.Text ?? "", + purchase.Price ?? "0", + purchase is { Price: not null, IsOpened: true }, isArchived, createdAt); + paidPostCollection.PaidPostObjects.Add(purchase); + foreach (MessageEntities.Medium medium in purchase.Media) + { + if (!previewIds.Contains(medium.Id)) { - if (!previewids.Contains(medium.Id)) - { - paidPostIds.Add(medium.Id); - } + paidPostIds.Add(medium.Id); + } - if (!IsMediaTypeDownloadEnabled(medium.Type)) - { - continue; - } + if (!IsMediaTypeDownloadEnabled(medium.Type)) + { + continue; + } - string mediaType = ResolveMediaType(medium.Type) ?? ""; - string? fullUrl = medium.Files?.Full?.Url; - bool isPreview = previewids.Contains(medium.Id); + string mediaType = ResolveMediaType(medium.Type) ?? ""; + string? fullUrl = medium.Files?.Full?.Url; + bool isPreview = previewIds.Contains(medium.Id); - if (previewids.Count > 0) + if (previewIds.Count > 0) + { + bool has = previewIds.Any(cus => cus.Equals(medium.Id)); + if (!has && medium.CanView && !string.IsNullOrEmpty(fullUrl)) { - bool has = previewids.Any(cus => cus.Equals(medium.Id)); - if (!has && medium.CanView && !string.IsNullOrEmpty(fullUrl)) + if (!paidPostCollection.PaidPosts.ContainsKey(medium.Id)) { - if (!paidPostCollection.PaidPosts.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, purchase.Id, fullUrl, - null, null, null, "Posts", - mediaType, isPreview, false, null); - paidPostCollection.PaidPosts.Add(medium.Id, fullUrl); - paidPostCollection.PaidPostMedia.Add(medium); - } - } - else if (!has && medium.CanView && - TryGetDrmInfo(medium.Files, out string manifestDash, - out string cloudFrontPolicy, out string cloudFrontSignature, - out string cloudFrontKeyPairId)) - { - if (!paidPostCollection.PaidPosts.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, purchase.Id, - manifestDash, null, null, null, "Posts", mediaType, isPreview, false, null); - paidPostCollection.PaidPosts.Add(medium.Id, - $"{manifestDash},{cloudFrontPolicy},{cloudFrontSignature},{cloudFrontKeyPairId},{medium.Id},{purchase.Id}"); - paidPostCollection.PaidPostMedia.Add(medium); - } + await dbService.AddMedia(folder, medium.Id, purchase.Id, fullUrl, + null, null, null, "Posts", + mediaType, isPreview, false, null); + paidPostCollection.PaidPosts.Add(medium.Id, fullUrl); + paidPostCollection.PaidPostMedia.Add(medium); } } - else + else if (!has && medium.CanView && + TryGetDrmInfo(medium.Files, out string manifestDash, + out string cloudFrontPolicy, out string cloudFrontSignature, + out string cloudFrontKeyPairId)) { - if (medium.CanView && !string.IsNullOrEmpty(fullUrl)) + if (!paidPostCollection.PaidPosts.ContainsKey(medium.Id)) { - if (!paidPostCollection.PaidPosts.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, purchase.Id, fullUrl, - null, null, null, "Posts", - mediaType, isPreview, false, null); - paidPostCollection.PaidPosts.Add(medium.Id, fullUrl); - paidPostCollection.PaidPostMedia.Add(medium); - } + await dbService.AddMedia(folder, medium.Id, purchase.Id, + manifestDash, null, null, null, "Posts", mediaType, isPreview, false, null); + paidPostCollection.PaidPosts.Add(medium.Id, + $"{manifestDash},{cloudFrontPolicy},{cloudFrontSignature},{cloudFrontKeyPairId},{medium.Id},{purchase.Id}"); + paidPostCollection.PaidPostMedia.Add(medium); } - else if (medium.CanView && - TryGetDrmInfo(medium.Files, out string manifestDash, - out string cloudFrontPolicy, out string cloudFrontSignature, - out string cloudFrontKeyPairId)) + } + } + else + { + if (medium.CanView && !string.IsNullOrEmpty(fullUrl)) + { + if (!paidPostCollection.PaidPosts.ContainsKey(medium.Id)) { - if (!paidPostCollection.PaidPosts.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, purchase.Id, - manifestDash, null, null, null, "Posts", mediaType, isPreview, false, null); - paidPostCollection.PaidPosts.Add(medium.Id, - $"{manifestDash},{cloudFrontPolicy},{cloudFrontSignature},{cloudFrontKeyPairId},{medium.Id},{purchase.Id}"); - paidPostCollection.PaidPostMedia.Add(medium); - } + await dbService.AddMedia(folder, medium.Id, purchase.Id, fullUrl, + null, null, null, "Posts", + mediaType, isPreview, false, null); + paidPostCollection.PaidPosts.Add(medium.Id, fullUrl); + paidPostCollection.PaidPostMedia.Add(medium); + } + } + else if (medium.CanView && + TryGetDrmInfo(medium.Files, out string manifestDash, + out string cloudFrontPolicy, out string cloudFrontSignature, + out string cloudFrontKeyPairId)) + { + if (!paidPostCollection.PaidPosts.ContainsKey(medium.Id)) + { + await dbService.AddMedia(folder, medium.Id, purchase.Id, + manifestDash, null, null, null, "Posts", mediaType, isPreview, false, null); + paidPostCollection.PaidPosts.Add(medium.Id, + $"{manifestDash},{cloudFrontPolicy},{cloudFrontSignature},{cloudFrontKeyPairId},{medium.Id},{purchase.Id}"); + paidPostCollection.PaidPostMedia.Add(medium); } } } @@ -804,10 +806,9 @@ public class ApiService(IAuthService authService, IConfigService configService, try { PostEntities.PostCollection postCollection = new(); - const int postLimit = 50; Dictionary getParams = new() { - { "limit", postLimit.ToString() }, + { "limit", Constants.ApiPageSize.ToString() }, { "order", "publish_date_desc" }, { "format", "infinite" }, { "skip_users", "all" } @@ -816,8 +817,7 @@ public class ApiService(IAuthService authService, IConfigService configService, DownloadDateSelection downloadDateSelection = DownloadDateSelection.before; DateTime? downloadAsOf = null; - if (configService.CurrentConfig.DownloadOnlySpecificDates && - configService.CurrentConfig.CustomDate.HasValue) + if (configService.CurrentConfig is { DownloadOnlySpecificDates: true, CustomDate: not null }) { downloadDateSelection = configService.CurrentConfig.DownloadDateSelection; downloadAsOf = configService.CurrentConfig.CustomDate; @@ -890,77 +890,83 @@ public class ApiService(IAuthService authService, IConfigService configService, } } - List postPreviewIds = new(); - if (post.Preview != null && post.Preview.Count > 0) + List postPreviewIds = []; + if (post.Preview is { Count: > 0 }) { for (int i = 0; i < post.Preview.Count; i++) { - if (post.Preview[i] is long previewId) + if (post.Preview[i] is not long previewId) { - if (!postPreviewIds.Contains(previewId)) - { - postPreviewIds.Add(previewId); - } + continue; + } + + if (!postPreviewIds.Contains(previewId)) + { + postPreviewIds.Add(previewId); } } } await dbService.AddPost(folder, post.Id, !string.IsNullOrEmpty(post.RawText) ? post.RawText : "", - post.Price ?? "0", post.Price != null && post.IsOpened, + post.Price ?? "0", post is { Price: not null, IsOpened: true }, post.IsArchived, post.PostedAt); + postCollection.PostObjects.Add(post); - if (post.Media != null && post.Media.Count > 0) + + if (post.Media is not { Count: > 0 }) { - foreach (PostEntities.Medium medium in post.Media) + continue; + } + + foreach (PostEntities.Medium medium in post.Media) + { + if (!IsMediaTypeDownloadEnabled(medium.Type)) { - if (!IsMediaTypeDownloadEnabled(medium.Type)) - { - continue; - } + continue; + } - string mediaType = ResolveMediaType(medium.Type) ?? string.Empty; - string? fullUrl = medium.Files?.Full?.Url; - string? previewUrl = medium.Files?.Preview?.Url; - bool isPreview = postPreviewIds.Contains(medium.Id); + string mediaType = ResolveMediaType(medium.Type) ?? string.Empty; + string? fullUrl = medium.Files?.Full?.Url; + string? previewUrl = medium.Files?.Preview?.Url; + bool isPreview = postPreviewIds.Contains(medium.Id); - if (medium.CanView && medium.Files?.Drm == null) + if (medium.CanView && medium.Files?.Drm == null) + { + bool has = paidPostIds.Any(cus => cus.Equals(medium.Id)); + if (!has && !string.IsNullOrEmpty(fullUrl)) { - bool has = paidPostIds.Any(cus => cus.Equals(medium.Id)); - if (!has && !string.IsNullOrEmpty(fullUrl)) + if (!postCollection.Posts.ContainsKey(medium.Id)) { - if (!postCollection.Posts.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, post.Id, fullUrl, null, null, null, - "Posts", mediaType, isPreview, false, null); - postCollection.Posts.Add(medium.Id, fullUrl); - postCollection.PostMedia.Add(medium); - } - } - else if (!has && string.IsNullOrEmpty(fullUrl) && !string.IsNullOrEmpty(previewUrl)) - { - if (!postCollection.Posts.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, post.Id, previewUrl, null, null, null, - "Posts", mediaType, isPreview, false, null); - postCollection.Posts.Add(medium.Id, previewUrl); - postCollection.PostMedia.Add(medium); - } - } - } - else if (medium.CanView && - TryGetDrmInfo(medium.Files, out string manifestDash, out string cloudFrontPolicy, - out string cloudFrontSignature, out string cloudFrontKeyPairId)) - { - bool has = paidPostIds.Any(cus => cus.Equals(medium.Id)); - if (!has && !postCollection.Posts.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, post.Id, manifestDash, null, null, null, + await dbService.AddMedia(folder, medium.Id, post.Id, fullUrl, null, null, null, "Posts", mediaType, isPreview, false, null); - postCollection.Posts.Add(medium.Id, - $"{manifestDash},{cloudFrontPolicy},{cloudFrontSignature},{cloudFrontKeyPairId},{medium.Id},{post.Id}"); + postCollection.Posts.Add(medium.Id, fullUrl); postCollection.PostMedia.Add(medium); } } + else if (!has && string.IsNullOrEmpty(fullUrl) && !string.IsNullOrEmpty(previewUrl)) + { + if (!postCollection.Posts.ContainsKey(medium.Id)) + { + await dbService.AddMedia(folder, medium.Id, post.Id, previewUrl, null, null, null, + "Posts", mediaType, isPreview, false, null); + postCollection.Posts.Add(medium.Id, previewUrl); + postCollection.PostMedia.Add(medium); + } + } + } + else if (medium.CanView && + TryGetDrmInfo(medium.Files, out string manifestDash, out string cloudFrontPolicy, + out string cloudFrontSignature, out string cloudFrontKeyPairId)) + { + bool has = paidPostIds.Any(cus => cus.Equals(medium.Id)); + if (!has && !postCollection.Posts.ContainsKey(medium.Id)) + { + await dbService.AddMedia(folder, medium.Id, post.Id, manifestDash, null, null, null, + "Posts", mediaType, isPreview, false, null); + postCollection.Posts.Add(medium.Id, + $"{manifestDash},{cloudFrontPolicy},{cloudFrontSignature},{cloudFrontKeyPairId},{medium.Id},{post.Id}"); + postCollection.PostMedia.Add(medium); + } } } } @@ -997,17 +1003,19 @@ public class ApiService(IAuthService authService, IConfigService configService, if (singlePostDto != null) { - List postPreviewIds = new(); - if (singlePost.Preview != null && singlePost.Preview.Count > 0) + List postPreviewIds = []; + if (singlePost.Preview is { Count: > 0 }) { for (int i = 0; i < singlePost.Preview.Count; i++) { - if (singlePost.Preview[i] is long previewId) + if (singlePost.Preview[i] is not long previewId) { - if (!postPreviewIds.Contains(previewId)) - { - postPreviewIds.Add(previewId); - } + continue; + } + + if (!postPreviewIds.Contains(previewId)) + { + postPreviewIds.Add(previewId); } } } @@ -1015,92 +1023,95 @@ public class ApiService(IAuthService authService, IConfigService configService, await dbService.AddPost(folder, singlePost.Id, !string.IsNullOrEmpty(singlePost.Text) ? singlePost.Text : "", singlePost.Price ?? "0", - singlePost.Price != null && singlePost.IsOpened, singlePost.IsArchived, + singlePost is { Price: not null, IsOpened: true }, singlePost.IsArchived, singlePost.PostedAt); singlePostCollection.SinglePostObjects.Add(singlePost); - if (singlePost.Media != null && singlePost.Media.Count > 0) + + if (singlePost.Media == null || singlePost.Media.Count <= 0) { - foreach (PostEntities.Medium medium in singlePost.Media) + return singlePostCollection; + } + + foreach (PostEntities.Medium medium in singlePost.Media) + { + if (!IsMediaTypeDownloadEnabled(medium.Type)) { - if (!IsMediaTypeDownloadEnabled(medium.Type)) - { - continue; - } + continue; + } - string mediaType = ResolveMediaType(medium.Type) ?? string.Empty; - bool isPreview = postPreviewIds.Contains(medium.Id); - string? fullUrl = medium.Files?.Full?.Url; - string? previewUrl = medium.Files?.Preview?.Url; + string mediaType = ResolveMediaType(medium.Type) ?? string.Empty; + bool isPreview = postPreviewIds.Contains(medium.Id); + string? fullUrl = medium.Files?.Full?.Url; + string? previewUrl = medium.Files?.Preview?.Url; - if (medium.CanView && medium.Files?.Drm == null) + if (medium.CanView && medium.Files?.Drm == null) + { + switch (configService.CurrentConfig.DownloadVideoResolution) { - switch (configService.CurrentConfig.DownloadVideoResolution) - { - case VideoResolution.source: - if (!string.IsNullOrEmpty(fullUrl)) + case VideoResolution.source: + if (!string.IsNullOrEmpty(fullUrl)) + { + if (!singlePostCollection.SinglePosts.ContainsKey(medium.Id)) { - if (!singlePostCollection.SinglePosts.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, singlePost.Id, - fullUrl, null, null, null, "Posts", mediaType, isPreview, false, null); - singlePostCollection.SinglePosts.Add(medium.Id, fullUrl); - singlePostCollection.SinglePostMedia.Add(medium); - } + await dbService.AddMedia(folder, medium.Id, singlePost.Id, + fullUrl, null, null, null, "Posts", mediaType, isPreview, false, null); + singlePostCollection.SinglePosts.Add(medium.Id, fullUrl); + singlePostCollection.SinglePostMedia.Add(medium); } + } - break; - case VideoResolution._240: - string? video240 = medium.VideoSources?._240; - if (!string.IsNullOrEmpty(video240)) + break; + case VideoResolution._240: + string? video240 = medium.VideoSources?._240; + if (!string.IsNullOrEmpty(video240)) + { + if (!singlePostCollection.SinglePosts.ContainsKey(medium.Id)) { - if (!singlePostCollection.SinglePosts.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, singlePost.Id, video240, null, - null, null, "Posts", mediaType, isPreview, false, null); - singlePostCollection.SinglePosts.Add(medium.Id, video240); - singlePostCollection.SinglePostMedia.Add(medium); - } + await dbService.AddMedia(folder, medium.Id, singlePost.Id, video240, null, + null, null, "Posts", mediaType, isPreview, false, null); + singlePostCollection.SinglePosts.Add(medium.Id, video240); + singlePostCollection.SinglePostMedia.Add(medium); } + } - break; - case VideoResolution._720: - string? video720 = medium.VideoSources?._720; - if (!string.IsNullOrEmpty(video720)) + break; + case VideoResolution._720: + string? video720 = medium.VideoSources?._720; + if (!string.IsNullOrEmpty(video720)) + { + if (!singlePostCollection.SinglePosts.ContainsKey(medium.Id)) { - if (!singlePostCollection.SinglePosts.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, singlePost.Id, video720, null, - null, null, "Posts", mediaType, isPreview, false, null); - singlePostCollection.SinglePosts.Add(medium.Id, video720); - singlePostCollection.SinglePostMedia.Add(medium); - } + await dbService.AddMedia(folder, medium.Id, singlePost.Id, video720, null, + null, null, "Posts", mediaType, isPreview, false, null); + singlePostCollection.SinglePosts.Add(medium.Id, video720); + singlePostCollection.SinglePostMedia.Add(medium); } + } - break; - } + break; } - else if (medium.CanView && - TryGetDrmInfo(medium.Files, out string manifestDash, out string cloudFrontPolicy, - out string cloudFrontSignature, out string cloudFrontKeyPairId)) + } + else if (medium.CanView && + TryGetDrmInfo(medium.Files, out string manifestDash, out string cloudFrontPolicy, + out string cloudFrontSignature, out string cloudFrontKeyPairId)) + { + if (!singlePostCollection.SinglePosts.ContainsKey(medium.Id)) { - if (!singlePostCollection.SinglePosts.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, singlePost.Id, manifestDash, null, null, - null, "Posts", mediaType, isPreview, false, null); - singlePostCollection.SinglePosts.Add(medium.Id, - $"{manifestDash},{cloudFrontPolicy},{cloudFrontSignature},{cloudFrontKeyPairId},{medium.Id},{singlePost.Id}"); - singlePostCollection.SinglePostMedia.Add(medium); - } + await dbService.AddMedia(folder, medium.Id, singlePost.Id, manifestDash, null, null, + null, "Posts", mediaType, isPreview, false, null); + singlePostCollection.SinglePosts.Add(medium.Id, + $"{manifestDash},{cloudFrontPolicy},{cloudFrontSignature},{cloudFrontKeyPairId},{medium.Id},{singlePost.Id}"); + singlePostCollection.SinglePostMedia.Add(medium); } - else if (!string.IsNullOrEmpty(previewUrl) && medium.Files?.Full == null) + } + else if (!string.IsNullOrEmpty(previewUrl) && medium.Files?.Full == null) + { + if (!singlePostCollection.SinglePosts.ContainsKey(medium.Id)) { - if (!singlePostCollection.SinglePosts.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, singlePost.Id, previewUrl, null, null, null, - "Posts", mediaType, isPreview, false, null); - singlePostCollection.SinglePosts.Add(medium.Id, previewUrl); - singlePostCollection.SinglePostMedia.Add(medium); - } + await dbService.AddMedia(folder, medium.Id, singlePost.Id, previewUrl, null, null, null, + "Posts", mediaType, isPreview, false, null); + singlePostCollection.SinglePosts.Add(medium.Id, previewUrl); + singlePostCollection.SinglePostMedia.Add(medium); } } } @@ -1133,18 +1144,16 @@ public class ApiService(IAuthService authService, IConfigService configService, try { StreamEntities.StreamsCollection streamsCollection = new(); - const int postLimit = 50; Dictionary getParams = new() { - { "limit", postLimit.ToString() }, + { "limit", Constants.ApiPageSize.ToString() }, { "order", "publish_date_desc" }, { "format", "infinite" }, { "skip_users", "all" } }; DownloadDateSelection downloadDateSelection = DownloadDateSelection.before; - if (configService.CurrentConfig.DownloadOnlySpecificDates && - configService.CurrentConfig.CustomDate.HasValue) + if (configService.CurrentConfig is { DownloadOnlySpecificDates: true, CustomDate: not null }) { downloadDateSelection = configService.CurrentConfig.DownloadDateSelection; } @@ -1190,67 +1199,73 @@ public class ApiService(IAuthService authService, IConfigService configService, List streamList = streams.List; foreach (StreamEntities.ListItem stream in streamList) { - List streamPreviewIds = new(); - if (stream.Preview != null && stream.Preview.Count > 0) + List streamPreviewIds = []; + if (stream.Preview is { Count: > 0 }) { for (int i = 0; i < stream.Preview.Count; i++) { - if (stream.Preview[i] is long previewId) + if (stream.Preview[i] is not long previewId) { - if (!streamPreviewIds.Contains(previewId)) - { - streamPreviewIds.Add(previewId); - } + continue; + } + + if (!streamPreviewIds.Contains(previewId)) + { + streamPreviewIds.Add(previewId); } } } await dbService.AddPost(folder, stream.Id, !string.IsNullOrEmpty(stream.Text) ? stream.Text : "", - stream.Price ?? "0", stream.Price != null && stream.IsOpened, + stream.Price ?? "0", stream is { Price: not null, IsOpened: true }, stream.IsArchived, stream.PostedAt); + streamsCollection.StreamObjects.Add(stream); - if (stream.Media != null && stream.Media.Count > 0) + + if (stream.Media is not { Count: > 0 }) { - foreach (StreamEntities.Medium medium in stream.Media) + continue; + } + + foreach (StreamEntities.Medium medium in stream.Media) + { + if (!IsMediaTypeDownloadEnabled(medium.Type)) { - if (!IsMediaTypeDownloadEnabled(medium.Type)) - { - continue; - } + continue; + } - string mediaType = ResolveMediaType(medium.Type) ?? string.Empty; - string? fullUrl = medium.Files?.Full?.Url; - bool isPreview = streamPreviewIds.Contains(medium.Id); + string mediaType = ResolveMediaType(medium.Type) ?? string.Empty; + string? fullUrl = medium.Files?.Full?.Url; + bool isPreview = streamPreviewIds.Contains(medium.Id); - if (medium.CanView && medium.Files?.Drm == null) + if (medium.CanView && medium.Files?.Drm == null) + { + bool has = paidPostIds.Any(cus => cus.Equals(medium.Id)); + if (!has && !string.IsNullOrEmpty(fullUrl)) { - bool has = paidPostIds.Any(cus => cus.Equals(medium.Id)); - if (!has && !string.IsNullOrEmpty(fullUrl)) + if (!streamsCollection.Streams.ContainsKey(medium.Id)) { - if (!streamsCollection.Streams.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, stream.Id, fullUrl, null, null, null, - "Posts", mediaType, isPreview, false, null); - streamsCollection.Streams.Add(medium.Id, fullUrl); - streamsCollection.StreamMedia.Add(medium); - } - } - } - else if (medium.CanView && - TryGetDrmInfo(medium.Files, out string manifestDash, out string cloudFrontPolicy, - out string cloudFrontSignature, out string cloudFrontKeyPairId)) - { - bool has = paidPostIds.Any(cus => cus.Equals(medium.Id)); - if (!has && !streamsCollection.Streams.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, stream.Id, manifestDash, null, null, null, + await dbService.AddMedia(folder, medium.Id, stream.Id, fullUrl, null, null, null, "Posts", mediaType, isPreview, false, null); - streamsCollection.Streams.Add(medium.Id, - $"{manifestDash},{cloudFrontPolicy},{cloudFrontSignature},{cloudFrontKeyPairId},{medium.Id},{stream.Id}"); + streamsCollection.Streams.Add(medium.Id, fullUrl); streamsCollection.StreamMedia.Add(medium); } } } + else if (medium.CanView && + TryGetDrmInfo(medium.Files, out string manifestDash, out string cloudFrontPolicy, + out string cloudFrontSignature, out string cloudFrontKeyPairId)) + { + bool has = paidPostIds.Any(cus => cus.Equals(medium.Id)); + if (!has && !streamsCollection.Streams.ContainsKey(medium.Id)) + { + await dbService.AddMedia(folder, medium.Id, stream.Id, manifestDash, null, null, null, + "Posts", mediaType, isPreview, false, null); + streamsCollection.Streams.Add(medium.Id, + $"{manifestDash},{cloudFrontPolicy},{cloudFrontSignature},{cloudFrontKeyPairId},{medium.Id},{stream.Id}"); + streamsCollection.StreamMedia.Add(medium); + } + } } } @@ -1280,10 +1295,9 @@ public class ApiService(IAuthService authService, IConfigService configService, try { ArchivedEntities.ArchivedCollection archivedCollection = new(); - const int postLimit = 50; Dictionary getParams = new() { - { "limit", postLimit.ToString() }, + { "limit", Constants.ApiPageSize.ToString() }, { "order", "publish_date_desc" }, { "skip_users", "all" }, { "format", "infinite" }, @@ -1292,8 +1306,7 @@ public class ApiService(IAuthService authService, IConfigService configService, }; DownloadDateSelection downloadDateSelection = DownloadDateSelection.before; - if (configService.CurrentConfig.DownloadOnlySpecificDates && - configService.CurrentConfig.CustomDate.HasValue) + if (configService.CurrentConfig is { DownloadOnlySpecificDates: true, CustomDate: not null }) { downloadDateSelection = configService.CurrentConfig.DownloadDateSelection; } @@ -1364,43 +1377,47 @@ public class ApiService(IAuthService authService, IConfigService configService, await dbService.AddPost(folder, archive.Id, archive.Text ?? "", archive.Price ?? "0", - archive.Price != null && archive.IsOpened, archive.IsArchived, archive.PostedAt); + archive is { Price: not null, IsOpened: true }, archive.IsArchived, archive.PostedAt); + archivedCollection.ArchivedPostObjects.Add(archive); - if (archive.Media != null && archive.Media.Count > 0) + + if (archive.Media is not { Count: > 0 }) { - foreach (ArchivedEntities.Medium medium in archive.Media) + continue; + } + + foreach (ArchivedEntities.Medium medium in archive.Media) + { + if (!IsMediaTypeDownloadEnabled(medium.Type)) { - if (!IsMediaTypeDownloadEnabled(medium.Type)) - { - continue; - } + continue; + } - string mediaType = ResolveMediaType(medium.Type) ?? string.Empty; - string? fullUrl = medium.Files?.Full?.Url; - bool isPreview = previewids.Contains(medium.Id); + string mediaType = ResolveMediaType(medium.Type) ?? string.Empty; + string? fullUrl = medium.Files?.Full?.Url; + bool isPreview = previewids.Contains(medium.Id); - if (medium.CanView && !string.IsNullOrEmpty(fullUrl)) + if (medium.CanView && !string.IsNullOrEmpty(fullUrl)) + { + if (!archivedCollection.ArchivedPosts.ContainsKey(medium.Id)) { - if (!archivedCollection.ArchivedPosts.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, archive.Id, fullUrl, null, null, null, - "Posts", mediaType, isPreview, false, null); - archivedCollection.ArchivedPosts.Add(medium.Id, fullUrl); - archivedCollection.ArchivedPostMedia.Add(medium); - } + await dbService.AddMedia(folder, medium.Id, archive.Id, fullUrl, null, null, null, + "Posts", mediaType, isPreview, false, null); + archivedCollection.ArchivedPosts.Add(medium.Id, fullUrl); + archivedCollection.ArchivedPostMedia.Add(medium); } - else if (medium.CanView && - TryGetDrmInfo(medium.Files, out string manifestDash, out string cloudFrontPolicy, - out string cloudFrontSignature, out string cloudFrontKeyPairId)) + } + else if (medium.CanView && + TryGetDrmInfo(medium.Files, out string manifestDash, out string cloudFrontPolicy, + out string cloudFrontSignature, out string cloudFrontKeyPairId)) + { + if (!archivedCollection.ArchivedPosts.ContainsKey(medium.Id)) { - if (!archivedCollection.ArchivedPosts.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, archive.Id, manifestDash, null, null, null, - "Posts", mediaType, isPreview, false, null); - archivedCollection.ArchivedPosts.Add(medium.Id, - $"{manifestDash},{cloudFrontPolicy},{cloudFrontSignature},{cloudFrontKeyPairId},{medium.Id},{archive.Id}"); - archivedCollection.ArchivedPostMedia.Add(medium); - } + await dbService.AddMedia(folder, medium.Id, archive.Id, manifestDash, null, null, null, + "Posts", mediaType, isPreview, false, null); + archivedCollection.ArchivedPosts.Add(medium.Id, + $"{manifestDash},{cloudFrontPolicy},{cloudFrontSignature},{cloudFrontKeyPairId},{medium.Id},{archive.Id}"); + archivedCollection.ArchivedPostMedia.Add(medium); } } } @@ -1432,10 +1449,9 @@ public class ApiService(IAuthService authService, IConfigService configService, try { MessageEntities.MessageCollection messageCollection = new(); - const int postLimit = 50; Dictionary getParams = new() { - { "limit", postLimit.ToString() }, { "order", "desc" }, { "skip_users", "all" } + { "limit", Constants.ApiPageSize.ToString() }, { "order", "desc" }, { "skip_users", "all" } }; int currentUserId = GetCurrentUserIdOrDefault(); @@ -1476,115 +1492,122 @@ public class ApiService(IAuthService authService, IConfigService configService, } } - List messagePreviewIds = new(); - if (list.Previews != null && list.Previews.Count > 0) + List messagePreviewIds = []; + + if (list.Previews is { Count: > 0 }) { for (int i = 0; i < list.Previews.Count; i++) { - if (list.Previews[i] is long previewId) + if (list.Previews[i] is not long previewId) { - if (!messagePreviewIds.Contains(previewId)) - { - messagePreviewIds.Add(previewId); - } + continue; + } + + if (!messagePreviewIds.Contains(previewId)) + { + messagePreviewIds.Add(previewId); } } } - if (!configService.CurrentConfig.IgnoreOwnMessages || list.FromUser?.Id != currentUserId) + if (configService.CurrentConfig.IgnoreOwnMessages && list.FromUser?.Id == currentUserId) { - DateTime createdAt = list.CreatedAt ?? DateTime.Now; - await dbService.AddMessage(folder, list.Id, list.Text ?? "", list.Price ?? "0", - list.CanPurchaseReason == "opened" || - (list.CanPurchaseReason == "opened" && ((bool?)null ?? false)), false, - createdAt, - list.FromUser?.Id ?? int.MinValue); - messageCollection.MessageObjects.Add(list); - if (list.CanPurchaseReason != "opened" && list.Media != null && list.Media.Count > 0) + continue; + } + + DateTime createdAt = list.CreatedAt ?? DateTime.Now; + await dbService.AddMessage(folder, list.Id, list.Text ?? "", list.Price ?? "0", + list.CanPurchaseReason == "opened" || + (list.CanPurchaseReason == "opened" && ((bool?)null ?? false)), false, + createdAt, + list.FromUser?.Id ?? int.MinValue); + + messageCollection.MessageObjects.Add(list); + + if (list.CanPurchaseReason != "opened" && list.Media is { Count: > 0 }) + { + foreach (MessageEntities.Medium medium in list.Media ?? []) { - foreach (MessageEntities.Medium medium in list.Media ?? new List()) + string mediaType = ResolveMediaType(medium.Type) ?? string.Empty; + string? fullUrl = medium.Files?.Full?.Url; + bool isPreview = messagePreviewIds.Contains(medium.Id); + + if (medium.CanView && !string.IsNullOrEmpty(fullUrl)) { - string mediaType = ResolveMediaType(medium.Type) ?? string.Empty; - string? fullUrl = medium.Files?.Full?.Url; - bool isPreview = messagePreviewIds.Contains(medium.Id); - - if (medium.CanView && !string.IsNullOrEmpty(fullUrl)) + if (!IsMediaTypeDownloadEnabled(medium.Type)) { - if (!IsMediaTypeDownloadEnabled(medium.Type)) - { - continue; - } - - if (!messageCollection.Messages.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, list.Id, fullUrl, null, null, null, - "Messages", mediaType, isPreview, false, null); - messageCollection.Messages.Add(medium.Id, fullUrl); - messageCollection.MessageMedia.Add(medium); - } + continue; } - else if (medium.CanView && - TryGetDrmInfo(medium.Files, out string manifestDash, - out string cloudFrontPolicy, out string cloudFrontSignature, - out string cloudFrontKeyPairId)) - { - if (!IsMediaTypeDownloadEnabled(medium.Type)) - { - continue; - } - if (!messageCollection.Messages.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, list.Id, manifestDash, null, null, null, - "Messages", mediaType, isPreview, false, null); - messageCollection.Messages.Add(medium.Id, - $"{manifestDash},{cloudFrontPolicy},{cloudFrontSignature},{cloudFrontKeyPairId},{medium.Id},{list.Id}"); - messageCollection.MessageMedia.Add(medium); - } + if (!messageCollection.Messages.ContainsKey(medium.Id)) + { + await dbService.AddMedia(folder, medium.Id, list.Id, fullUrl, null, null, null, + "Messages", mediaType, isPreview, false, null); + messageCollection.Messages.Add(medium.Id, fullUrl); + messageCollection.MessageMedia.Add(medium); + } + } + else if (medium.CanView && + TryGetDrmInfo(medium.Files, out string manifestDash, + out string cloudFrontPolicy, out string cloudFrontSignature, + out string cloudFrontKeyPairId)) + { + if (!IsMediaTypeDownloadEnabled(medium.Type)) + { + continue; + } + + if (!messageCollection.Messages.ContainsKey(medium.Id)) + { + await dbService.AddMedia(folder, medium.Id, list.Id, manifestDash, null, null, null, + "Messages", mediaType, isPreview, false, null); + messageCollection.Messages.Add(medium.Id, + $"{manifestDash},{cloudFrontPolicy},{cloudFrontSignature},{cloudFrontKeyPairId},{medium.Id},{list.Id}"); + messageCollection.MessageMedia.Add(medium); } } } - else if (messagePreviewIds.Count > 0) + } + else if (messagePreviewIds.Count > 0) + { + foreach (MessageEntities.Medium medium in list.Media ?? new List()) { - foreach (MessageEntities.Medium medium in list.Media ?? new List()) + string mediaType = ResolveMediaType(medium.Type) ?? string.Empty; + string? fullUrl = medium.Files?.Full?.Url; + bool isPreview = messagePreviewIds.Contains(medium.Id); + + if (medium.CanView && !string.IsNullOrEmpty(fullUrl) && isPreview) { - string mediaType = ResolveMediaType(medium.Type) ?? string.Empty; - string? fullUrl = medium.Files?.Full?.Url; - bool isPreview = messagePreviewIds.Contains(medium.Id); - - if (medium.CanView && !string.IsNullOrEmpty(fullUrl) && isPreview) + if (!IsMediaTypeDownloadEnabled(medium.Type)) { - if (!IsMediaTypeDownloadEnabled(medium.Type)) - { - continue; - } - - if (!messageCollection.Messages.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, list.Id, fullUrl, null, null, null, - "Messages", mediaType, isPreview, false, null); - messageCollection.Messages.Add(medium.Id, fullUrl); - messageCollection.MessageMedia.Add(medium); - } + continue; } - else if (medium.CanView && isPreview && - TryGetDrmInfo(medium.Files, out string manifestDash, - out string cloudFrontPolicy, out string cloudFrontSignature, - out string cloudFrontKeyPairId)) - { - if (!IsMediaTypeDownloadEnabled(medium.Type)) - { - continue; - } - if (!messageCollection.Messages.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, list.Id, manifestDash, null, null, null, - "Messages", mediaType, isPreview, false, null); - messageCollection.Messages.Add(medium.Id, - $"{manifestDash},{cloudFrontPolicy},{cloudFrontSignature},{cloudFrontKeyPairId},{medium.Id},{list.Id}"); - messageCollection.MessageMedia.Add(medium); - } + if (!messageCollection.Messages.ContainsKey(medium.Id)) + { + await dbService.AddMedia(folder, medium.Id, list.Id, fullUrl, null, null, null, + "Messages", mediaType, isPreview, false, null); + messageCollection.Messages.Add(medium.Id, fullUrl); + messageCollection.MessageMedia.Add(medium); + } + } + else if (medium.CanView && isPreview && + TryGetDrmInfo(medium.Files, out string manifestDash, + out string cloudFrontPolicy, out string cloudFrontSignature, + out string cloudFrontKeyPairId)) + { + if (!IsMediaTypeDownloadEnabled(medium.Type)) + { + continue; + } + + if (!messageCollection.Messages.ContainsKey(medium.Id)) + { + await dbService.AddMedia(folder, medium.Id, list.Id, manifestDash, null, null, null, + "Messages", mediaType, isPreview, false, null); + messageCollection.Messages.Add(medium.Id, + $"{manifestDash},{cloudFrontPolicy},{cloudFrontSignature},{cloudFrontKeyPairId},{medium.Id},{list.Id}"); + messageCollection.MessageMedia.Add(medium); } } } @@ -1614,8 +1637,8 @@ public class ApiService(IAuthService authService, IConfigService configService, try { PurchasedEntities.SinglePaidMessageCollection singlePaidMessageCollection = new(); - const int postLimit = 50; - Dictionary getParams = new() { { "limit", postLimit.ToString() }, { "order", "desc" } }; + Dictionary getParams = + new() { { "limit", Constants.ApiPageSize.ToString() }, { "order", "desc" } }; int currentUserId = GetCurrentUserIdOrDefault(); string? body = await BuildHeaderAndExecuteRequests(getParams, endpoint, GetHttpClient()); @@ -1623,104 +1646,113 @@ public class ApiService(IAuthService authService, IConfigService configService, DeserializeJson(body, s_mJsonSerializerSettings); MessageEntities.SingleMessage message = MessagesMapper.FromDto(messageDto); - if (!configService.CurrentConfig.IgnoreOwnMessages || message.FromUser?.Id != currentUserId) + if (configService.CurrentConfig.IgnoreOwnMessages && message.FromUser?.Id == currentUserId) { - DateTime createdAt = message.CreatedAt ?? DateTime.Now; - await dbService.AddMessage(folder, message.Id, message.Text ?? "", - message.Price?.ToString() ?? "0", true, false, - createdAt, - message.FromUser?.Id ?? int.MinValue); - singlePaidMessageCollection.SingleMessageObjects.Add(message); - List messagePreviewIds = new(); - if (message.Previews != null && message.Previews.Count > 0) + return singlePaidMessageCollection; + } + + DateTime createdAt = message.CreatedAt ?? DateTime.Now; + await dbService.AddMessage(folder, message.Id, message.Text ?? "", + message.Price?.ToString() ?? "0", true, false, + createdAt, + message.FromUser?.Id ?? int.MinValue); + + singlePaidMessageCollection.SingleMessageObjects.Add(message); + + List messagePreviewIds = []; + if (message.Previews is { Count: > 0 }) + { + for (int i = 0; i < message.Previews.Count; i++) { - for (int i = 0; i < message.Previews.Count; i++) + if (message.Previews[i] is not long previewId) { - if (message.Previews[i] is long previewId) - { - if (!messagePreviewIds.Contains(previewId)) - { - messagePreviewIds.Add(previewId); - } - } + continue; + } + + if (!messagePreviewIds.Contains(previewId)) + { + messagePreviewIds.Add(previewId); } } + } - if (message.Media != null && message.Media.Count > 0) + if (message.Media is not { Count: > 0 }) + { + return singlePaidMessageCollection; + } + + foreach (MessageEntities.Medium medium in message.Media) + { + string mediaType = ResolveMediaType(medium.Type) ?? string.Empty; + string? fullUrl = medium.Files?.Full?.Url; + bool isPreview = messagePreviewIds.Contains(medium.Id); + + if (!isPreview && medium.CanView && !string.IsNullOrEmpty(fullUrl)) { - foreach (MessageEntities.Medium medium in message.Media) + if (!IsMediaTypeDownloadEnabled(medium.Type)) { - string mediaType = ResolveMediaType(medium.Type) ?? string.Empty; - string? fullUrl = medium.Files?.Full?.Url; - bool isPreview = messagePreviewIds.Contains(medium.Id); + continue; + } - if (!isPreview && medium.CanView && !string.IsNullOrEmpty(fullUrl)) - { - if (!IsMediaTypeDownloadEnabled(medium.Type)) - { - continue; - } + if (!singlePaidMessageCollection.SingleMessages.TryAdd(medium.Id, fullUrl)) + { + continue; + } - if (!singlePaidMessageCollection.SingleMessages.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, message.Id, fullUrl, null, null, null, - "Messages", mediaType, isPreview, false, null); - singlePaidMessageCollection.SingleMessages.Add(medium.Id, fullUrl); - singlePaidMessageCollection.SingleMessageMedia.Add(medium); - } - } - else if (isPreview && medium.CanView && !string.IsNullOrEmpty(fullUrl)) - { - if (!IsMediaTypeDownloadEnabled(medium.Type)) - { - continue; - } + await dbService.AddMedia(folder, medium.Id, message.Id, fullUrl, null, null, null, + "Messages", mediaType, isPreview, false, null); + singlePaidMessageCollection.SingleMessageMedia.Add(medium); + } + else if (isPreview && medium.CanView && !string.IsNullOrEmpty(fullUrl)) + { + if (!IsMediaTypeDownloadEnabled(medium.Type)) + { + continue; + } - if (!singlePaidMessageCollection.PreviewSingleMessages.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, message.Id, fullUrl, null, null, null, - "Messages", mediaType, isPreview, false, null); - singlePaidMessageCollection.PreviewSingleMessages.Add(medium.Id, fullUrl); - singlePaidMessageCollection.PreviewSingleMessageMedia.Add(medium); - } - } - else if (!isPreview && medium.CanView && - TryGetDrmInfo(medium.Files, out string manifestDash, out string cloudFrontPolicy, - out string cloudFrontSignature, out string cloudFrontKeyPairId)) - { - if (!IsMediaTypeDownloadEnabled(medium.Type)) - { - continue; - } + if (!singlePaidMessageCollection.PreviewSingleMessages.ContainsKey(medium.Id)) + { + await dbService.AddMedia(folder, medium.Id, message.Id, fullUrl, null, null, null, + "Messages", mediaType, isPreview, false, null); + singlePaidMessageCollection.PreviewSingleMessages.Add(medium.Id, fullUrl); + singlePaidMessageCollection.PreviewSingleMessageMedia.Add(medium); + } + } + else if (!isPreview && medium.CanView && + TryGetDrmInfo(medium.Files, out string manifestDash, out string cloudFrontPolicy, + out string cloudFrontSignature, out string cloudFrontKeyPairId)) + { + if (!IsMediaTypeDownloadEnabled(medium.Type)) + { + continue; + } - if (!singlePaidMessageCollection.SingleMessages.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, message.Id, manifestDash, null, null, null, - "Messages", mediaType, isPreview, false, null); - singlePaidMessageCollection.SingleMessages.Add(medium.Id, - $"{manifestDash},{cloudFrontPolicy},{cloudFrontSignature},{cloudFrontKeyPairId},{medium.Id},{message.Id}"); - singlePaidMessageCollection.SingleMessageMedia.Add(medium); - } - } - else if (isPreview && medium.CanView && - TryGetDrmInfo(medium.Files, out string previewManifestDash, - out string previewCloudFrontPolicy, out string previewCloudFrontSignature, - out string previewCloudFrontKeyPairId)) - { - if (!IsMediaTypeDownloadEnabled(medium.Type)) - { - continue; - } + if (!singlePaidMessageCollection.SingleMessages.ContainsKey(medium.Id)) + { + await dbService.AddMedia(folder, medium.Id, message.Id, manifestDash, null, null, null, + "Messages", mediaType, isPreview, false, null); + singlePaidMessageCollection.SingleMessages.Add(medium.Id, + $"{manifestDash},{cloudFrontPolicy},{cloudFrontSignature},{cloudFrontKeyPairId},{medium.Id},{message.Id}"); + singlePaidMessageCollection.SingleMessageMedia.Add(medium); + } + } + else if (isPreview && medium.CanView && + TryGetDrmInfo(medium.Files, out string previewManifestDash, + out string previewCloudFrontPolicy, out string previewCloudFrontSignature, + out string previewCloudFrontKeyPairId)) + { + if (!IsMediaTypeDownloadEnabled(medium.Type)) + { + continue; + } - if (!singlePaidMessageCollection.PreviewSingleMessages.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, message.Id, previewManifestDash, null, null, - null, "Messages", mediaType, isPreview, false, null); - singlePaidMessageCollection.PreviewSingleMessages.Add(medium.Id, - $"{previewManifestDash},{previewCloudFrontPolicy},{previewCloudFrontSignature},{previewCloudFrontKeyPairId},{medium.Id},{message.Id}"); - singlePaidMessageCollection.PreviewSingleMessageMedia.Add(medium); - } - } + if (!singlePaidMessageCollection.PreviewSingleMessages.ContainsKey(medium.Id)) + { + await dbService.AddMedia(folder, medium.Id, message.Id, previewManifestDash, null, null, + null, "Messages", mediaType, isPreview, false, null); + singlePaidMessageCollection.PreviewSingleMessages.Add(medium.Id, + $"{previewManifestDash},{previewCloudFrontPolicy},{previewCloudFrontSignature},{previewCloudFrontKeyPairId},{medium.Id},{message.Id}"); + singlePaidMessageCollection.PreviewSingleMessageMedia.Add(medium); } } } @@ -1753,10 +1785,9 @@ public class ApiService(IAuthService authService, IConfigService configService, try { PurchasedEntities.PaidMessageCollection paidMessageCollection = new(); - const int postLimit = 50; Dictionary getParams = new() { - { "limit", postLimit.ToString() }, + { "limit", Constants.ApiPageSize.ToString() }, { "order", "publish_date_desc" }, { "format", "infinite" }, { "author", username }, @@ -1780,7 +1811,7 @@ public class ApiService(IAuthService authService, IConfigService configService, HttpClient loopclient = GetHttpClient(); HttpRequestMessage looprequest = - new(HttpMethod.Get, $"{Constants.API_URL}{endpoint}{loopqueryParams}"); + new(HttpMethod.Get, $"{Constants.ApiUrl}{endpoint}{loopqueryParams}"); foreach (KeyValuePair keyValuePair in loopheaders) { @@ -1803,7 +1834,8 @@ public class ApiService(IAuthService authService, IConfigService configService, break; } - getParams["offset"] = Convert.ToString(Convert.ToInt32(getParams["offset"]) + postLimit); + getParams["offset"] = + Convert.ToString(Convert.ToInt32(getParams["offset"]) + Constants.ApiPageSize); } } @@ -1816,129 +1848,135 @@ public class ApiService(IAuthService authService, IConfigService configService, .OrderByDescending(p => p.PostedAt ?? p.CreatedAt)) { long fromUserId = purchase.FromUser?.Id ?? long.MinValue; - if (!configService.CurrentConfig.IgnoreOwnMessages || fromUserId != currentUserId) + if (configService.CurrentConfig.IgnoreOwnMessages && fromUserId == currentUserId) { - DateTime createdAt = purchase.PostedAt ?? purchase.CreatedAt ?? DateTime.Now; - await dbService.AddMessage(folder, purchase.Id, - purchase.Text ?? "", - purchase.Price ?? "0", true, false, createdAt, - fromUserId); + continue; + } - paidMessageCollection.PaidMessageObjects.Add(purchase); - if (purchase.Media != null && purchase.Media.Count > 0) + DateTime createdAt = purchase.PostedAt ?? purchase.CreatedAt ?? DateTime.Now; + await dbService.AddMessage(folder, purchase.Id, + purchase.Text ?? "", + purchase.Price ?? "0", true, false, createdAt, + fromUserId); + + paidMessageCollection.PaidMessageObjects.Add(purchase); + if (purchase.Media is not { Count: > 0 }) + { + continue; + } + + List previewIds = []; + if (purchase.Previews != null) + { + for (int i = 0; i < purchase.Previews.Count; i++) { - List previewids = new(); - if (purchase.Previews != null) + if (purchase.Previews[i] is not long previewId) { - for (int i = 0; i < purchase.Previews.Count; i++) - { - if (purchase.Previews[i] is long previewId) - { - if (!previewids.Contains(previewId)) - { - previewids.Add(previewId); - } - } - } - } - else if (purchase.Preview != null) - { - for (int i = 0; i < purchase.Preview.Count; i++) - { - if (purchase.Preview[i] is long previewId) - { - if (!previewids.Contains(previewId)) - { - previewids.Add(previewId); - } - } - } + continue; } - foreach (MessageEntities.Medium medium in purchase.Media) + if (!previewIds.Contains(previewId)) { - string mediaType = ResolveMediaType(medium.Type) ?? string.Empty; - string? fullUrl = medium.Files?.Full?.Url; - bool isPreview = previewids.Contains(medium.Id); - - if (previewids.Count > 0) + previewIds.Add(previewId); + } + } + } + else if (purchase.Preview != null) + { + for (int i = 0; i < purchase.Preview.Count; i++) + { + if (purchase.Preview[i] is long previewId) + { + if (!previewIds.Contains(previewId)) { - bool has = previewids.Any(cus => cus.Equals(medium.Id)); - if (!has && medium.CanView && !string.IsNullOrEmpty(fullUrl)) - { - if (!IsMediaTypeDownloadEnabled(medium.Type)) - { - continue; - } - - if (!paidMessageCollection.PaidMessages.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, purchase.Id, - fullUrl, null, null, null, "Messages", mediaType, isPreview, false, - null); - paidMessageCollection.PaidMessages.Add(medium.Id, fullUrl); - paidMessageCollection.PaidMessageMedia.Add(medium); - } - } - else if (!has && medium.CanView && - TryGetDrmInfo(medium.Files, out string manifestDash, - out string cloudFrontPolicy, out string cloudFrontSignature, - out string cloudFrontKeyPairId)) - { - if (!IsMediaTypeDownloadEnabled(medium.Type)) - { - continue; - } - - if (!paidMessageCollection.PaidMessages.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, purchase.Id, - manifestDash, null, null, null, "Messages", mediaType, isPreview, false, - null); - paidMessageCollection.PaidMessages.Add(medium.Id, - $"{manifestDash},{cloudFrontPolicy},{cloudFrontSignature},{cloudFrontKeyPairId},{medium.Id},{purchase.Id}"); - paidMessageCollection.PaidMessageMedia.Add(medium); - } - } + previewIds.Add(previewId); } - else + } + } + } + + foreach (MessageEntities.Medium medium in purchase.Media) + { + string mediaType = ResolveMediaType(medium.Type) ?? string.Empty; + string? fullUrl = medium.Files?.Full?.Url; + bool isPreview = previewIds.Contains(medium.Id); + + if (previewIds.Count > 0) + { + bool has = previewIds.Any(cus => cus.Equals(medium.Id)); + if (!has && medium.CanView && !string.IsNullOrEmpty(fullUrl)) + { + if (!IsMediaTypeDownloadEnabled(medium.Type)) { - if (medium.CanView && !string.IsNullOrEmpty(fullUrl)) - { - if (!IsMediaTypeDownloadEnabled(medium.Type)) - { - continue; - } + continue; + } - if (!paidMessageCollection.PaidMessages.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, purchase.Id, - fullUrl, null, null, null, "Messages", mediaType, isPreview, false, - null); - paidMessageCollection.PaidMessages.Add(medium.Id, fullUrl); - paidMessageCollection.PaidMessageMedia.Add(medium); - } - } - else if (medium.CanView && - TryGetDrmInfo(medium.Files, out string manifestDash, - out string cloudFrontPolicy, out string cloudFrontSignature, - out string cloudFrontKeyPairId)) - { - if (!IsMediaTypeDownloadEnabled(medium.Type)) - { - continue; - } + if (!paidMessageCollection.PaidMessages.ContainsKey(medium.Id)) + { + await dbService.AddMedia(folder, medium.Id, purchase.Id, + fullUrl, null, null, null, "Messages", mediaType, isPreview, false, + null); + paidMessageCollection.PaidMessages.Add(medium.Id, fullUrl); + paidMessageCollection.PaidMessageMedia.Add(medium); + } + } + else if (!has && medium.CanView && + TryGetDrmInfo(medium.Files, out string manifestDash, + out string cloudFrontPolicy, out string cloudFrontSignature, + out string cloudFrontKeyPairId)) + { + if (!IsMediaTypeDownloadEnabled(medium.Type)) + { + continue; + } - if (!paidMessageCollection.PaidMessages.ContainsKey(medium.Id)) - { - await dbService.AddMedia(folder, medium.Id, purchase.Id, - manifestDash, null, null, null, "Messages", mediaType, isPreview, false, - null); - paidMessageCollection.PaidMessages.Add(medium.Id, - $"{manifestDash},{cloudFrontPolicy},{cloudFrontSignature},{cloudFrontKeyPairId},{medium.Id},{purchase.Id}"); - paidMessageCollection.PaidMessageMedia.Add(medium); - } - } + if (!paidMessageCollection.PaidMessages.ContainsKey(medium.Id)) + { + await dbService.AddMedia(folder, medium.Id, purchase.Id, + manifestDash, null, null, null, "Messages", mediaType, isPreview, false, + null); + paidMessageCollection.PaidMessages.Add(medium.Id, + $"{manifestDash},{cloudFrontPolicy},{cloudFrontSignature},{cloudFrontKeyPairId},{medium.Id},{purchase.Id}"); + paidMessageCollection.PaidMessageMedia.Add(medium); + } + } + } + else + { + if (medium.CanView && !string.IsNullOrEmpty(fullUrl)) + { + if (!IsMediaTypeDownloadEnabled(medium.Type)) + { + continue; + } + + if (!paidMessageCollection.PaidMessages.ContainsKey(medium.Id)) + { + await dbService.AddMedia(folder, medium.Id, purchase.Id, + fullUrl, null, null, null, "Messages", mediaType, isPreview, false, + null); + paidMessageCollection.PaidMessages.Add(medium.Id, fullUrl); + paidMessageCollection.PaidMessageMedia.Add(medium); + } + } + else if (medium.CanView && + TryGetDrmInfo(medium.Files, out string manifestDash, + out string cloudFrontPolicy, out string cloudFrontSignature, + out string cloudFrontKeyPairId)) + { + if (!IsMediaTypeDownloadEnabled(medium.Type)) + { + continue; + } + + if (!paidMessageCollection.PaidMessages.ContainsKey(medium.Id)) + { + await dbService.AddMedia(folder, medium.Id, purchase.Id, + manifestDash, null, null, null, "Messages", mediaType, isPreview, false, + null); + paidMessageCollection.PaidMessages.Add(medium.Id, + $"{manifestDash},{cloudFrontPolicy},{cloudFrontSignature},{cloudFrontKeyPairId},{medium.Id},{purchase.Id}"); + paidMessageCollection.PaidMessageMedia.Add(medium); } } } @@ -1969,10 +2007,9 @@ public class ApiService(IAuthService authService, IConfigService configService, try { Dictionary purchasedTabUsers = new(); - const int postLimit = 50; Dictionary getParams = new() { - { "limit", postLimit.ToString() }, + { "limit", Constants.ApiPageSize.ToString() }, { "order", "publish_date_desc" }, { "format", "infinite" }, { "skip_users", "all" } @@ -1998,7 +2035,7 @@ public class ApiService(IAuthService authService, IConfigService configService, HttpClient loopclient = GetHttpClient(); HttpRequestMessage looprequest = - new(HttpMethod.Get, $"{Constants.API_URL}{endpoint}{loopqueryParams}"); + new(HttpMethod.Get, $"{Constants.ApiUrl}{endpoint}{loopqueryParams}"); foreach (KeyValuePair keyValuePair in loopheaders) { @@ -2020,7 +2057,8 @@ public class ApiService(IAuthService authService, IConfigService configService, break; } - getParams["offset"] = Convert.ToString(Convert.ToInt32(getParams["offset"]) + postLimit); + getParams["offset"] = + Convert.ToString(Convert.ToInt32(getParams["offset"]) + Constants.ApiPageSize); } } @@ -2039,10 +2077,7 @@ public class ApiService(IAuthService authService, IConfigService configService, string? matchedUsername = users.FirstOrDefault(x => x.Value == fromUserId).Key; if (!string.IsNullOrEmpty(matchedUsername)) { - if (!purchasedTabUsers.ContainsKey(matchedUsername)) - { - purchasedTabUsers.Add(matchedUsername, fromUserId); - } + purchasedTabUsers.TryAdd(matchedUsername, fromUserId); } else if (!purchasedTabUsers.ContainsKey($"Deleted User - {fromUserId}")) { @@ -2064,9 +2099,9 @@ public class ApiService(IAuthService authService, IConfigService configService, Log.Debug("Content creator not longer exists - {0}", fromUserId); } - else if (!purchasedTabUsers.ContainsKey(fetchedUsername)) + else { - purchasedTabUsers.Add(fetchedUsername, fromUserId); + purchasedTabUsers.TryAdd(fetchedUsername, fromUserId); } } } @@ -2139,10 +2174,9 @@ public class ApiService(IAuthService authService, IConfigService configService, { Dictionary> userPurchases = new(); List purchasedTabCollections = []; - const int postLimit = 50; Dictionary getParams = new() { - { "limit", postLimit.ToString() }, + { "limit", Constants.ApiPageSize.ToString() }, { "order", "publish_date_desc" }, { "format", "infinite" }, { "skip_users", "all" } @@ -2163,7 +2197,7 @@ public class ApiService(IAuthService authService, IConfigService configService, HttpClient loopclient = GetHttpClient(); HttpRequestMessage looprequest = - new(HttpMethod.Get, $"{Constants.API_URL}{endpoint}{loopqueryParams}"); + new(HttpMethod.Get, $"{Constants.ApiUrl}{endpoint}{loopqueryParams}"); foreach (KeyValuePair keyValuePair in loopheaders) { @@ -2185,7 +2219,8 @@ public class ApiService(IAuthService authService, IConfigService configService, break; } - getParams["offset"] = Convert.ToString(Convert.ToInt32(getParams["offset"]) + postLimit); + getParams["offset"] = + Convert.ToString(Convert.ToInt32(getParams["offset"]) + Constants.ApiPageSize); } } @@ -2274,10 +2309,12 @@ public class ApiService(IAuthService authService, IConfigService configService, await dbService.AddPost(path, purchase.Id, purchase.Text ?? "", purchase.Price ?? "0", - purchase.Price != null && purchase.IsOpened, + purchase is { Price: not null, IsOpened: true }, isArchived, createdAt); + purchasedTabCollection.PaidPosts.PaidPostObjects.Add(purchase); + foreach (MessageEntities.Medium medium in purchase.Media) { if (!IsMediaTypeDownloadEnabled(medium.Type)) @@ -2356,18 +2393,18 @@ public class ApiService(IAuthService authService, IConfigService configService, messageCreatedAt, fromUserId); purchasedTabCollection.PaidMessages.PaidMessageObjects.Add(purchase); - if (purchase.Media != null && purchase.Media.Count > 0) + if (purchase.Media is { Count: > 0 }) { - List paidMessagePreviewids = new(); + List paidMessagePreviewIds = []; if (purchase.Previews != null) { for (int i = 0; i < purchase.Previews.Count; i++) { if (purchase.Previews[i] is long previewId) { - if (!paidMessagePreviewids.Contains(previewId)) + if (!paidMessagePreviewIds.Contains(previewId)) { - paidMessagePreviewids.Add(previewId); + paidMessagePreviewIds.Add(previewId); } } } @@ -2378,9 +2415,9 @@ public class ApiService(IAuthService authService, IConfigService configService, { if (purchase.Preview[i] is long previewId) { - if (!paidMessagePreviewids.Contains(previewId)) + if (!paidMessagePreviewIds.Contains(previewId)) { - paidMessagePreviewids.Add(previewId); + paidMessagePreviewIds.Add(previewId); } } } @@ -2388,12 +2425,12 @@ public class ApiService(IAuthService authService, IConfigService configService, foreach (MessageEntities.Medium medium in purchase.Media) { - if (paidMessagePreviewids.Count > 0) + if (paidMessagePreviewIds.Count > 0) { string mediaType = ResolveMediaType(medium.Type) ?? string.Empty; string? fullUrl = medium.Files?.Full?.Url; - bool isPreview = paidMessagePreviewids.Contains(medium.Id); - bool has = paidMessagePreviewids.Any(cus => cus.Equals(medium.Id)); + bool isPreview = paidMessagePreviewIds.Contains(medium.Id); + bool has = paidMessagePreviewIds.Any(cus => cus.Equals(medium.Id)); if (!has && medium.CanView && !string.IsNullOrEmpty(fullUrl)) { if (!IsMediaTypeDownloadEnabled(medium.Type)) @@ -2440,7 +2477,7 @@ public class ApiService(IAuthService authService, IConfigService configService, { string mediaType = ResolveMediaType(medium.Type) ?? string.Empty; string? fullUrl = medium.Files?.Full?.Url; - bool isPreview = paidMessagePreviewids.Contains(medium.Id); + bool isPreview = paidMessagePreviewIds.Contains(medium.Id); if (medium.CanView && !string.IsNullOrEmpty(fullUrl)) { @@ -2729,9 +2766,9 @@ public class ApiService(IAuthService authService, IConfigService configService, Dictionary headers = GetDynamicHeaders($"/api2/v2{endpoint}", queryParams); - HttpRequestMessage request = new(HttpMethod.Get, $"{Constants.API_URL}{endpoint}{queryParams}"); + HttpRequestMessage request = new(HttpMethod.Get, $"{Constants.ApiUrl}{endpoint}{queryParams}"); - Log.Debug($"Full request URL: {Constants.API_URL}{endpoint}{queryParams}"); + Log.Debug($"Full request URL: {Constants.ApiUrl}{endpoint}{queryParams}"); foreach (KeyValuePair keyValuePair in headers) { @@ -2756,7 +2793,7 @@ public class ApiService(IAuthService authService, IConfigService configService, private HttpClient GetHttpClient() { HttpClient client = new(); - if (configService.CurrentConfig.Timeout != null && configService.CurrentConfig.Timeout > 0) + if (configService.CurrentConfig.Timeout is > 0) { client.Timeout = TimeSpan.FromSeconds(configService.CurrentConfig.Timeout.Value); } diff --git a/OF DL.Core/Services/DbService.cs b/OF DL.Core/Services/DbService.cs index 99d51ef..872118d 100644 --- a/OF DL.Core/Services/DbService.cs +++ b/OF DL.Core/Services/DbService.cs @@ -572,11 +572,13 @@ public class DbService(IConfigService configService) : IDbService while (await reader.ReadAsync()) { - if (reader["name"].ToString() == "record_created_at") + if (reader["name"].ToString() != "record_created_at") { - columnExists = true; - break; + continue; } + + columnExists = true; + break; } if (!columnExists) diff --git a/OF DL.Core/Services/DownloadOrchestrationService.cs b/OF DL.Core/Services/DownloadOrchestrationService.cs index 25497f5..8e7006c 100644 --- a/OF DL.Core/Services/DownloadOrchestrationService.cs +++ b/OF DL.Core/Services/DownloadOrchestrationService.cs @@ -18,10 +18,10 @@ public class DownloadOrchestrationService( /// /// Gets the list of paid post media IDs to avoid duplicates. /// - public List PaidPostIds { get; } = new(); + public List PaidPostIds { get; } = []; /// - /// Retrieves the available users and lists based on current configuration. + /// Retrieves the available users and lists based on the current configuration. /// /// A result containing users, lists, and any errors. public async Task GetAvailableUsersAsync() @@ -235,9 +235,9 @@ public class DownloadOrchestrationService( { eventHandler.OnMessage("Getting Stories"); Dictionary? tempStories = await apiService.GetMedia(MediaType.Stories, - $"/users/{userId}/stories", null, path, PaidPostIds); + $"/users/{userId}/stories", null, path); - if (tempStories != null && tempStories.Count > 0) + if (tempStories is { Count: > 0 }) { eventHandler.OnContentFound("Stories", tempStories.Count, tempStories.Count); @@ -263,9 +263,9 @@ public class DownloadOrchestrationService( { eventHandler.OnMessage("Getting Highlights"); Dictionary? tempHighlights = await apiService.GetMedia(MediaType.Highlights, - $"/users/{userId}/stories/highlights", null, path, PaidPostIds); + $"/users/{userId}/stories/highlights", null, path); - if (tempHighlights != null && tempHighlights.Count > 0) + if (tempHighlights is { Count: > 0 }) { eventHandler.OnContentFound("Highlights", tempHighlights.Count, tempHighlights.Count); diff --git a/OF DL.Core/Services/DownloadService.cs b/OF DL.Core/Services/DownloadService.cs index e1dd837..631fb20 100644 --- a/OF DL.Core/Services/DownloadService.cs +++ b/OF DL.Core/Services/DownloadService.cs @@ -500,15 +500,9 @@ public class DownloadService( client.DefaultRequestHeaders.Add("User-Agent", auth.UserAgent); using HttpResponseMessage response = await client.GetAsync(mpdUrl, HttpCompletionOption.ResponseHeadersRead); - if (response.IsSuccessStatusCode) - { - if (response.Content.Headers.LastModified != null) - { - return response.Content.Headers.LastModified.Value.DateTime; - } - } - - return DateTime.Now; + return response is { IsSuccessStatusCode: true, Content.Headers.LastModified: not null } + ? response.Content.Headers.LastModified.Value.DateTime + : DateTime.Now; } /// @@ -842,7 +836,7 @@ public class DownloadService( /// Author info. /// Known users map. /// True when the media is newly downloaded. - public async Task DownloadMedia(string url, string folder, long mediaId, string apiType, + private async Task DownloadMedia(string url, string folder, long mediaId, string apiType, IProgressReporter progressReporter, string path, string? filenameFormat, object? postInfo, object? postMedia, object? author, Dictionary users) @@ -876,7 +870,7 @@ public class DownloadService( /// Author info. /// Known users map. /// True when the media is newly downloaded. - public async Task DownloadDrmVideo(string policy, string signature, string kvp, string url, + private async Task DownloadDrmVideo(string policy, string signature, string kvp, string url, string decryptionKey, string folder, DateTime lastModified, long mediaId, string apiType, IProgressReporter progressReporter, string path, string? filenameFormat, object? postInfo, object? postMedia, @@ -1028,7 +1022,7 @@ public class DownloadService( Log.Debug($"Calling DownloadHighlights - {username}"); Dictionary? highlights = await apiService.GetMedia(MediaType.Highlights, - $"/users/{userId}/stories/highlights", null, path, paidPostIds.ToList()); + $"/users/{userId}/stories/highlights", null, path); if (highlights == null || highlights.Count == 0) { @@ -1091,7 +1085,7 @@ public class DownloadService( Log.Debug($"Calling DownloadStories - {username}"); Dictionary? stories = await apiService.GetMedia(MediaType.Stories, $"/users/{userId}/stories", - null, path, paidPostIds.ToList()); + null, path); if (stories == null || stories.Count == 0) { diff --git a/OF DL.Core/Services/IApiService.cs b/OF DL.Core/Services/IApiService.cs index 0359153..1a293bc 100644 --- a/OF DL.Core/Services/IApiService.cs +++ b/OF DL.Core/Services/IApiService.cs @@ -39,8 +39,7 @@ public interface IApiService /// /// Retrieves media URLs for stories or highlights. /// - Task?> GetMedia(MediaType mediaType, string endpoint, string? username, string folder, - List paidPostIds); + Task?> GetMedia(MediaType mediaType, string endpoint, string? username, string folder); /// /// Retrieves paid posts and their media. @@ -125,7 +124,7 @@ public interface IApiService Task?> GetExpiredSubscriptions(string endpoint, bool includeRestrictedSubscriptions); /// - /// Retrieves a decryption key via the OFDL fallback service. + /// Retrieves a decryption key via the OF DL fallback service. /// Task GetDecryptionKeyOfdl(Dictionary drmHeaders, string licenceUrl, string pssh); } diff --git a/OF DL.Core/Services/IAuthService.cs b/OF DL.Core/Services/IAuthService.cs index 4ebe1da..432d13f 100644 --- a/OF DL.Core/Services/IAuthService.cs +++ b/OF DL.Core/Services/IAuthService.cs @@ -11,7 +11,7 @@ public interface IAuthService Auth? CurrentAuth { get; set; } /// - /// Loads authentication data from disk. + /// Loads authentication data from the disk. /// Task LoadFromFileAsync(string filePath = "auth.json"); diff --git a/OF DL.Core/Services/IDownloadService.cs b/OF DL.Core/Services/IDownloadService.cs index f41b42f..598b09b 100644 --- a/OF DL.Core/Services/IDownloadService.cs +++ b/OF DL.Core/Services/IDownloadService.cs @@ -20,23 +20,6 @@ public interface IDownloadService Task ProcessMediaDownload(string folder, long mediaId, string apiType, string url, string path, string serverFileName, string resolvedFileName, string extension, IProgressReporter progressReporter); - /// - /// Downloads a single media item. - /// - Task DownloadMedia(string url, string folder, long mediaId, string apiType, - IProgressReporter progressReporter, string path, - string? filenameFormat, object? postInfo, object? postMedia, - object? author, Dictionary users); - - /// - /// Downloads a DRM-protected video. - /// - Task DownloadDrmVideo(string policy, string signature, string kvp, string url, - string decryptionKey, string folder, DateTime lastModified, long mediaId, string apiType, - IProgressReporter progressReporter, string path, - string? filenameFormat, object? postInfo, object? postMedia, - object? author, Dictionary users); - /// /// Retrieves decryption information for a DRM media item. /// diff --git a/OF DL.Core/Services/IProgressReporter.cs b/OF DL.Core/Services/IProgressReporter.cs index d36d1f3..dc59aca 100644 --- a/OF DL.Core/Services/IProgressReporter.cs +++ b/OF DL.Core/Services/IProgressReporter.cs @@ -11,10 +11,4 @@ public interface IProgressReporter /// /// The amount to increment progress by void ReportProgress(long increment); - - /// - /// Reports a status message (optional for implementations). - /// - /// The status message to report - void ReportStatus(string message); } diff --git a/OF DL.Core/Utils/HttpUtil.cs b/OF DL.Core/Utils/HttpUtil.cs index bd0203a..5982964 100644 --- a/OF DL.Core/Utils/HttpUtil.cs +++ b/OF DL.Core/Utils/HttpUtil.cs @@ -111,13 +111,13 @@ internal class HttpUtil int retryCount = 0; - while (retryCount < Constants.WIDEVINE_MAX_RETRIES && response.StatusCode == HttpStatusCode.TooManyRequests) + while (retryCount < Constants.WidevineMaxRetries && response.StatusCode == HttpStatusCode.TooManyRequests) { // // We've hit a rate limit, so we should wait before retrying. // int retryAfterSeconds = - Constants.WIDEVINE_RETRY_DELAY * (retryCount + 1); // Default retry time. Increases with each retry. + Constants.WidevineRetryDelay * (retryCount + 1); // Default retry time. Increases with each retry. if (response.Headers.RetryAfter != null && response.Headers.RetryAfter.Delta.HasValue) { if (response.Headers.RetryAfter.Delta.Value.TotalSeconds > 0) diff --git a/OF DL/CLI/SpectreProgressReporter.cs b/OF DL/CLI/SpectreProgressReporter.cs index a9fbd4a..3a334d6 100644 --- a/OF DL/CLI/SpectreProgressReporter.cs +++ b/OF DL/CLI/SpectreProgressReporter.cs @@ -11,10 +11,4 @@ public class SpectreProgressReporter(ProgressTask task) : IProgressReporter private readonly ProgressTask _task = task ?? throw new ArgumentNullException(nameof(task)); public void ReportProgress(long increment) => _task.Increment(increment); - - public void ReportStatus(string message) - { - // Optionally update task description or handle status messages - // For now, we'll leave this empty as the task description is set when creating the progress bar - } }