Updated non-interactive list user lookup.
Tweaked order to fully replace users before updating DB.
This commit is contained in:
parent
3fc2e6bea9
commit
6a35d74fba
@ -553,6 +553,66 @@ public class APIHelper : IAPIHelper
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public async Task<Dictionary<string, int>?> GetUsersFromList(string endpoint, bool includeRestricted, IDownloadConfig config)
|
||||||
|
{
|
||||||
|
var model = new { list = new[] { new { id = int.MaxValue, username = string.Empty, isRestricted = false, isBlocked = false } }, nextOffset = 0, hasMore = false };
|
||||||
|
|
||||||
|
Log.Debug($"Calling GetUsersFromList - {endpoint}");
|
||||||
|
|
||||||
|
int limit = 50;
|
||||||
|
int offset = 0;
|
||||||
|
|
||||||
|
Dictionary<string, string> getParams = new()
|
||||||
|
{
|
||||||
|
{ "offset", offset.ToString() },
|
||||||
|
{ "limit", limit.ToString() },
|
||||||
|
{ "format", "infinite" }
|
||||||
|
};
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Dictionary<string, int> users = [];
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
string? body = await BuildHeaderAndExecuteRequests(getParams, endpoint, GetHttpClient(config));
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(body))
|
||||||
|
break;
|
||||||
|
|
||||||
|
var data = JsonConvert.DeserializeAnonymousType(body, model, m_JsonSerializerSettings);
|
||||||
|
|
||||||
|
if (data is null)
|
||||||
|
break;
|
||||||
|
|
||||||
|
foreach (var item in data.list)
|
||||||
|
{
|
||||||
|
if (users.ContainsKey(item.username))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
bool isRestricted = item.isRestricted;
|
||||||
|
bool isRestrictedButAllowed = isRestricted && includeRestricted;
|
||||||
|
|
||||||
|
if (!isRestricted || isRestrictedButAllowed)
|
||||||
|
users.Add(item.username, item.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data.hasMore)
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
offset += data.nextOffset;
|
||||||
|
getParams["offset"] = offset.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
return users;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<Dictionary<long, string>> GetMedia(MediaType mediatype,
|
public async Task<Dictionary<long, string>> GetMedia(MediaType mediatype,
|
||||||
string endpoint,
|
string endpoint,
|
||||||
string? username,
|
string? username,
|
||||||
|
@ -18,6 +18,7 @@ namespace OF_DL.Helpers
|
|||||||
Task<string> GetDRMMPDPSSH(string mpdUrl, string policy, string signature, string kvp);
|
Task<string> GetDRMMPDPSSH(string mpdUrl, string policy, string signature, string kvp);
|
||||||
Task<Dictionary<string, int>> GetLists(string endpoint, IDownloadConfig config);
|
Task<Dictionary<string, int>> GetLists(string endpoint, IDownloadConfig config);
|
||||||
Task<List<string>> GetListUsers(string endpoint, IDownloadConfig config);
|
Task<List<string>> GetListUsers(string endpoint, IDownloadConfig config);
|
||||||
|
Task<Dictionary<string, int>?> GetUsersFromList(string endpoint, bool includeRestricted, IDownloadConfig config);
|
||||||
Task<Dictionary<long, string>> GetMedia(MediaType mediatype, string endpoint, string? username, string folder, IDownloadConfig config, List<long> paid_post_ids);
|
Task<Dictionary<long, string>> GetMedia(MediaType mediatype, string endpoint, string? username, string folder, IDownloadConfig config, List<long> paid_post_ids);
|
||||||
Task<PaidPostCollection> GetPaidPosts(string endpoint, string folder, string username, IDownloadConfig config, List<long> paid_post_ids, StatusContext ctx);
|
Task<PaidPostCollection> GetPaidPosts(string endpoint, string folder, string username, IDownloadConfig config, List<long> paid_post_ids, StatusContext ctx);
|
||||||
Task<PostCollection> GetPosts(string endpoint, string folder, IDownloadConfig config, List<long> paid_post_ids, StatusContext ctx);
|
Task<PostCollection> GetPosts(string endpoint, string folder, IDownloadConfig config, List<long> paid_post_ids, StatusContext ctx);
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
|
using Akka.Configuration;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using OF_DL.Entities;
|
using OF_DL.Entities;
|
||||||
using OF_DL.Entities.Archived;
|
using OF_DL.Entities.Archived;
|
||||||
|
using OF_DL.Entities.Chats;
|
||||||
using OF_DL.Entities.Messages;
|
using OF_DL.Entities.Messages;
|
||||||
using OF_DL.Entities.Post;
|
using OF_DL.Entities.Post;
|
||||||
using OF_DL.Entities.Purchased;
|
using OF_DL.Entities.Purchased;
|
||||||
@ -13,16 +15,12 @@ using Serilog;
|
|||||||
using Serilog.Core;
|
using Serilog.Core;
|
||||||
using Serilog.Events;
|
using Serilog.Events;
|
||||||
using Spectre.Console;
|
using Spectre.Console;
|
||||||
using System.IO;
|
using System.Diagnostics;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Text;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using static OF_DL.Entities.Messages.Messages;
|
using static OF_DL.Entities.Messages.Messages;
|
||||||
using Akka.Configuration;
|
|
||||||
using System.Text;
|
|
||||||
using static Akka.Actor.ProviderSelection;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using OF_DL.Entities.Chats;
|
|
||||||
|
|
||||||
namespace OF_DL;
|
namespace OF_DL;
|
||||||
|
|
||||||
@ -965,28 +963,28 @@ public class Program
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (users.Count <= 0)
|
KeyValuePair<bool, Dictionary<string, int>> hasSelectedUsersKVP = new(false, []);
|
||||||
throw new InvalidOperationException("No users found!");
|
|
||||||
|
|
||||||
await dBHelper.CreateUsersDB(users);
|
|
||||||
KeyValuePair<bool, Dictionary<string, int>> hasSelectedUsersKVP;
|
|
||||||
if (Config.NonInteractiveMode && Config.NonInteractiveModePurchasedTab)
|
if (Config.NonInteractiveMode && Config.NonInteractiveModePurchasedTab)
|
||||||
{
|
{
|
||||||
hasSelectedUsersKVP = new KeyValuePair<bool, Dictionary<string, int>>(true, new Dictionary<string, int> { { "PurchasedTab", 0 } });
|
hasSelectedUsersKVP = new KeyValuePair<bool, Dictionary<string, int>>(true, new Dictionary<string, int> { { "PurchasedTab", 0 } });
|
||||||
}
|
}
|
||||||
else if (Config.NonInteractiveMode && Config.NonInteractiveSpecificLists is not null && Config.NonInteractiveSpecificLists.Length > 0)
|
else if (Config.NonInteractiveMode && Config.NonInteractiveSpecificLists is not null && Config.NonInteractiveSpecificLists.Length > 0)
|
||||||
{
|
{
|
||||||
HashSet<string> listUsernames = [];
|
Dictionary<string, int> usersFromLists = new(StringComparer.OrdinalIgnoreCase);
|
||||||
|
|
||||||
foreach (string listName in Config.NonInteractiveSpecificLists)
|
foreach (string listName in Config.NonInteractiveSpecificLists)
|
||||||
{
|
{
|
||||||
if (!lists.TryGetValue(listName, out int listId))
|
if (!lists.TryGetValue(listName, out int listId))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
List<string> usernames = await m_ApiHelper.GetListUsers($"/lists/{listId}/users", Config);
|
AnsiConsole.Markup($"[green]Getting Users from list '{listName}' (Include Restricted: {Config.IncludeRestrictedSubscriptions})\n[/]");
|
||||||
foreach (string user in usernames)
|
Dictionary<string, int> list = await m_ApiHelper.GetUsersFromList($"/lists/{listId}/users", config.IncludeRestrictedSubscriptions, Config);
|
||||||
listUsernames.Add(user);
|
|
||||||
|
foreach ((string username, int id) in list)
|
||||||
|
usersFromLists.TryAdd(username, id);
|
||||||
}
|
}
|
||||||
users = users.Where(x => listUsernames.Contains(x.Key)).Distinct().ToDictionary(x => x.Key, x => x.Value);
|
|
||||||
|
users = usersFromLists;
|
||||||
hasSelectedUsersKVP = new KeyValuePair<bool, Dictionary<string, int>>(true, users);
|
hasSelectedUsersKVP = new KeyValuePair<bool, Dictionary<string, int>>(true, users);
|
||||||
}
|
}
|
||||||
else if (Config.NonInteractiveMode && Config.NonInteractiveSpecificUsers is not null && Config.NonInteractiveSpecificUsers.Length > 0)
|
else if (Config.NonInteractiveMode && Config.NonInteractiveSpecificUsers is not null && Config.NonInteractiveSpecificUsers.Length > 0)
|
||||||
@ -1002,11 +1000,17 @@ public class Program
|
|||||||
else if (Config.NonInteractiveMode && !string.IsNullOrEmpty(Config.NonInteractiveModeListName))
|
else if (Config.NonInteractiveMode && !string.IsNullOrEmpty(Config.NonInteractiveModeListName))
|
||||||
{
|
{
|
||||||
var listId = lists[Config.NonInteractiveModeListName];
|
var listId = lists[Config.NonInteractiveModeListName];
|
||||||
var listUsernames = await m_ApiHelper.GetListUsers($"/lists/{listId}/users", Config) ?? [];
|
AnsiConsole.Markup($"[green]Getting Users from list '{Config.NonInteractiveModeListName}' (Include Restricted: {Config.IncludeRestrictedSubscriptions})\n[/]");
|
||||||
var selectedUsers = users.Where(x => listUsernames.Contains(x.Key)).Distinct().ToDictionary(x => x.Key, x => x.Value);
|
users = await m_ApiHelper.GetUsersFromList($"/lists/{listId}/users", config.IncludeRestrictedSubscriptions, Config);
|
||||||
hasSelectedUsersKVP = new KeyValuePair<bool, Dictionary<string, int>>(true, selectedUsers);
|
hasSelectedUsersKVP = new KeyValuePair<bool, Dictionary<string, int>>(true, users);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if (users.Count <= 0)
|
||||||
|
throw new InvalidOperationException("No users found!");
|
||||||
|
|
||||||
|
await dBHelper.CreateUsersDB(users);
|
||||||
|
|
||||||
|
if (hasSelectedUsersKVP.Key == false)
|
||||||
{
|
{
|
||||||
var userSelectionResult = await HandleUserSelection(m_ApiHelper, Config, users, lists);
|
var userSelectionResult = await HandleUserSelection(m_ApiHelper, Config, users, lists);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user