mirror of
https://github.com/C9Glax/tranga.git
synced 2025-06-14 07:17:54 +02:00
Compare commits
15 Commits
Author | SHA1 | Date | |
---|---|---|---|
e72efa3731 | |||
597eedb6d4 | |||
8829132046 | |||
32467191f6 | |||
fe52d2c3b5 | |||
554f6b4acc | |||
9d0fc18051 | |||
e02b00e0ef | |||
06a8e4e895 | |||
a557f8cab5 | |||
e564be08f5 | |||
b8bf7bdf30 | |||
d6af014cb7 | |||
2dcaaf4d66 | |||
e3ec5420c0 |
@ -14,6 +14,13 @@ public class FileLogger : LoggerBase
|
||||
|
||||
protected override void Write(LogMessage logMessage)
|
||||
{
|
||||
File.AppendAllText(logFilePath, logMessage.ToString());
|
||||
try
|
||||
{
|
||||
File.AppendAllText(logFilePath, logMessage.ToString());
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
stdOut?.WriteLine(e);
|
||||
}
|
||||
}
|
||||
}
|
@ -9,13 +9,12 @@ public class Logger : TextWriter
|
||||
public enum LoggerType
|
||||
{
|
||||
FileLogger,
|
||||
ConsoleLogger,
|
||||
MemoryLogger
|
||||
ConsoleLogger
|
||||
}
|
||||
|
||||
private FileLogger? _fileLogger;
|
||||
private FormattedConsoleLogger? _formattedConsoleLogger;
|
||||
private MemoryLogger? _memoryLogger;
|
||||
private MemoryLogger _memoryLogger;
|
||||
private TextWriter? stdOut;
|
||||
|
||||
public Logger(LoggerType[] enabledLoggers, TextWriter? stdOut, Encoding? encoding, string? logFilePath)
|
||||
@ -30,7 +29,7 @@ public class Logger : TextWriter
|
||||
throw new ArgumentException($"logFilePath can not be null for LoggerType {LoggerType.FileLogger}");
|
||||
}
|
||||
_formattedConsoleLogger = enabledLoggers.Contains(LoggerType.ConsoleLogger) ? new FormattedConsoleLogger(null, encoding) : null;
|
||||
_memoryLogger = enabledLoggers.Contains(LoggerType.MemoryLogger) ? new MemoryLogger(null, encoding) : null;
|
||||
_memoryLogger = new MemoryLogger(null, encoding);
|
||||
}
|
||||
|
||||
public void WriteLine(string caller, string? value)
|
||||
@ -46,9 +45,14 @@ public class Logger : TextWriter
|
||||
return;
|
||||
|
||||
_fileLogger?.Write(caller, value);
|
||||
_memoryLogger?.Write(caller, value);
|
||||
_formattedConsoleLogger?.Write(caller, value);
|
||||
|
||||
_memoryLogger.Write(caller, value);
|
||||
stdOut?.Write(value);
|
||||
}
|
||||
|
||||
public string[] Tail(uint? lines)
|
||||
{
|
||||
return _memoryLogger.Tail(lines);
|
||||
}
|
||||
}
|
@ -5,7 +5,7 @@ namespace Logging;
|
||||
public abstract class LoggerBase : TextWriter
|
||||
{
|
||||
public override Encoding Encoding { get; }
|
||||
private TextWriter? stdOut { get; }
|
||||
protected TextWriter? stdOut { get; }
|
||||
|
||||
public LoggerBase(TextWriter? stdOut, Encoding? encoding = null)
|
||||
{
|
||||
@ -52,7 +52,7 @@ public abstract class LoggerBase : TextWriter
|
||||
public override string ToString()
|
||||
{
|
||||
string dateTimeString = $"{logTime.ToShortDateString()} {logTime.ToLongTimeString()}";
|
||||
return $"[{dateTimeString}] {caller,-30} | {value}";
|
||||
return $"[{dateTimeString}] {caller,30} | {value}";
|
||||
}
|
||||
}
|
||||
}
|
@ -18,25 +18,22 @@ public class MemoryLogger : LoggerBase
|
||||
|
||||
public string[] GetLogMessage()
|
||||
{
|
||||
string[] ret = new string[logMessages.Count];
|
||||
for (int logMessageIndex = 0; logMessageIndex < ret.Length; logMessageIndex++)
|
||||
{
|
||||
DateTime logTime = logMessages.GetValueAtIndex(logMessageIndex).logTime;
|
||||
string dateTimeString = $"{logTime.ToShortDateString()} {logTime.ToShortTimeString()}";
|
||||
string callerString = logMessages.GetValueAtIndex(logMessageIndex).caller.ToString();
|
||||
string value = $"[{dateTimeString}] {callerString} | {logMessages.GetValueAtIndex(logMessageIndex).value}";
|
||||
ret[logMessageIndex] = value;
|
||||
}
|
||||
return Tail(Convert.ToUInt32(logMessages.Count));
|
||||
}
|
||||
|
||||
public string[] Tail(uint? length)
|
||||
{
|
||||
int retLength;
|
||||
if (length is null || length > logMessages.Count)
|
||||
retLength = logMessages.Count;
|
||||
else
|
||||
retLength = (int)length;
|
||||
|
||||
string[] ret = new string[retLength];
|
||||
|
||||
for (int logMessageIndex = logMessages.Count - retLength; logMessageIndex < logMessages.Count; logMessageIndex++)
|
||||
ret[logMessageIndex + retLength - logMessages.Count] = logMessages.GetValueAtIndex(logMessageIndex).ToString();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
public string[] Tail(uint length)
|
||||
{
|
||||
string[] ret = new string[length];
|
||||
for (int logMessageIndex = logMessages.Count - 1; logMessageIndex > logMessageIndex - length; logMessageIndex--)
|
||||
ret[logMessageIndex] = logMessages.GetValueAtIndex(logMessageIndex).ToString();
|
||||
|
||||
return ret.Reverse().ToArray();
|
||||
}
|
||||
}
|
@ -65,7 +65,6 @@ app.MapGet("/RemoveTask", (TrangaTask.Task task, string? connectorName, string?
|
||||
case TrangaTask.Task.UpdateKomgaLibrary:
|
||||
taskManager.RemoveTask(TrangaTask.Task.UpdateKomgaLibrary, null, null);
|
||||
return JsonSerializer.Serialize("Success");
|
||||
break;
|
||||
case TrangaTask.Task.DownloadNewChapters:
|
||||
Publication? publication = taskManager.GetAllPublications().FirstOrDefault(pub => pub.downloadUrl == publicationName);
|
||||
if (publication is null)
|
||||
|
@ -14,7 +14,7 @@ public static class Tranga_Cli
|
||||
{
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
Logger logger = new(new[] { Logger.LoggerType.FileLogger, Logger.LoggerType.MemoryLogger }, null, null,
|
||||
Logger logger = new(new[] { Logger.LoggerType.FileLogger }, null, null,
|
||||
Path.Join(Directory.GetCurrentDirectory(), $"log-{DateTime.Now:dd-M-yyyy-HH-mm-ss}.txt"));
|
||||
|
||||
logger.WriteLine("Tranga_CLI", "Loading Settings.");
|
||||
@ -110,6 +110,16 @@ public static class Tranga_Cli
|
||||
Console.WriteLine("Press any key.");
|
||||
Console.ReadKey();
|
||||
break;
|
||||
case ConsoleKey.K:
|
||||
PrintTasks(taskManager.GetAllTasks().Where(qTask => qTask.state is TrangaTask.ExecutionState.Enqueued).ToArray(), logger);
|
||||
Console.WriteLine("Press any key.");
|
||||
Console.ReadKey();
|
||||
break;
|
||||
case ConsoleKey.F:
|
||||
ShowLastLoglines(logger);
|
||||
Console.WriteLine("Press any key.");
|
||||
Console.ReadKey();
|
||||
break;
|
||||
}
|
||||
selection = PrintMenu(taskManager, settings.downloadLocation, logger);
|
||||
}
|
||||
@ -135,12 +145,14 @@ public static class Tranga_Cli
|
||||
taskManager.GetAllTasks().Count(task => task.state == TrangaTask.ExecutionState.Enqueued);
|
||||
Console.Clear();
|
||||
Console.WriteLine($"Download Folder: {folderPath}");
|
||||
Console.WriteLine($"Tasks (Running/Queue/Total));: {taskRunningCount}/{taskEnqueuedCount}/{taskCount}");
|
||||
Console.WriteLine($"Tasks (Running/Queue/Total)): {taskRunningCount}/{taskEnqueuedCount}/{taskCount}");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine($"{"C: Create Task",-30}{"L: List tasks",-30}");
|
||||
Console.WriteLine($"{"D: Delete Task",-30}{"R: List Running Tasks", -30}");
|
||||
Console.WriteLine($"{"E: Execute Task now",-30}{"S: Search Tasks", -30}");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine($"{"",-30}{"K: List Task Queue", -30}");
|
||||
//Console.WriteLine();
|
||||
Console.WriteLine($"{"F: Show Log",-30}{"",-30}");
|
||||
Console.WriteLine($"{"U: Update this Screen",-30}{"Q: Exit",-30}");
|
||||
ConsoleKey selection = Console.ReadKey().Key;
|
||||
logger.WriteLine("Tranga_CLI", $"Menu selection: {selection}");
|
||||
@ -164,6 +176,40 @@ public static class Tranga_Cli
|
||||
Console.WriteLine($"{tIndex++:000}: {trangaTask}");
|
||||
}
|
||||
|
||||
private static void ShowLastLoglines(Logger logger)
|
||||
{
|
||||
Console.Clear();
|
||||
logger.WriteLine("Tranga_CLI", "Menu: Show Log-lines");
|
||||
|
||||
Console.WriteLine("Enter q to abort");
|
||||
Console.WriteLine($"Number of lines:");
|
||||
|
||||
string? chosenNumber = Console.ReadLine();
|
||||
while(chosenNumber is null || chosenNumber.Length < 1)
|
||||
chosenNumber = Console.ReadLine();
|
||||
|
||||
if (chosenNumber.Length == 1 && chosenNumber.ToLower() == "q")
|
||||
{
|
||||
Console.Clear();
|
||||
Console.WriteLine("aborted.");
|
||||
logger.WriteLine("Tranga_CLI", "aborted");
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
string[] lines = logger.Tail(Convert.ToUInt32(chosenNumber));
|
||||
Console.Clear();
|
||||
foreach (string message in lines)
|
||||
Console.Write(message);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Console.WriteLine($"Exception: {e.Message}");
|
||||
logger.WriteLine("Tranga_CLI", e.Message);
|
||||
}
|
||||
}
|
||||
|
||||
private static void CreateTask(TaskManager taskManager, TaskManager.SettingsData settings, Logger logger)
|
||||
{
|
||||
logger.WriteLine("Tranga_CLI", "Menu: Creating Task");
|
||||
@ -414,8 +460,10 @@ public static class Tranga_Cli
|
||||
private static void SearchTasks(TaskManager taskManager, Logger logger)
|
||||
{
|
||||
logger.WriteLine("Tranga_CLI", "Menu: Search task");
|
||||
Console.Clear();
|
||||
Console.WriteLine("Enter search query:");
|
||||
string? query = Console.ReadLine();
|
||||
while (query is null || query.Length < 1)
|
||||
while (query is null || query.Length < 4)
|
||||
query = Console.ReadLine();
|
||||
PrintTasks(taskManager.GetAllTasks().Where(qTask =>
|
||||
qTask.ToString().ToLower().Contains(query, StringComparison.OrdinalIgnoreCase)).ToArray(), logger);
|
||||
|
@ -21,7 +21,7 @@ public class MangaDex : Connector
|
||||
|
||||
public override Publication[] GetPublications(string publicationTitle = "")
|
||||
{
|
||||
logger?.WriteLine(this.GetType().ToString(), $"Getting Publications");
|
||||
logger?.WriteLine(this.GetType().ToString(), $"Getting Publications (title={publicationTitle})");
|
||||
const int limit = 100; //How many values we want returned at once
|
||||
int offset = 0; //"Page"
|
||||
int total = int.MaxValue; //How many total results are there, is updated on first request
|
||||
@ -128,7 +128,7 @@ public class MangaDex : Connector
|
||||
|
||||
public override Chapter[] GetChapters(Publication publication, string language = "")
|
||||
{
|
||||
logger?.WriteLine(this.GetType().ToString(), $"Getting Chapters");
|
||||
logger?.WriteLine(this.GetType().ToString(), $"Getting Chapters {publication.sortName} (language={language})");
|
||||
const int limit = 100; //How many values we want returned at once
|
||||
int offset = 0; //"Page"
|
||||
int total = int.MaxValue; //How many total results are there, is updated on first request
|
||||
@ -183,7 +183,7 @@ public class MangaDex : Connector
|
||||
|
||||
public override void DownloadChapter(Publication publication, Chapter chapter)
|
||||
{
|
||||
logger?.WriteLine(this.GetType().ToString(), $"Download Chapter {publication.sortName} {chapter.sortNumber}");
|
||||
logger?.WriteLine(this.GetType().ToString(), $"Download Chapter {publication.sortName} {chapter.volumeNumber}-{chapter.chapterNumber}");
|
||||
//Request URLs for Chapter-Images
|
||||
DownloadClient.RequestResult requestResult =
|
||||
downloadClient.MakeRequest($"https://api.mangadex.org/at-home/server/{chapter.url}?forcePort443=false'");
|
||||
|
@ -15,6 +15,7 @@ public static class TaskExecutor
|
||||
/// <param name="taskManager">Parent</param>
|
||||
/// <param name="trangaTask">Task to execute</param>
|
||||
/// <param name="chapterCollection">Current chapterCollection to update</param>
|
||||
/// <param name="logger"></param>
|
||||
/// <exception cref="ArgumentException">Is thrown when there is no Connector available with the name of the TrangaTask.connectorName</exception>
|
||||
public static void Execute(TaskManager taskManager, TrangaTask trangaTask, Dictionary<Publication, List<Chapter>> chapterCollection, Logger? logger)
|
||||
{
|
||||
@ -25,7 +26,7 @@ public static class TaskExecutor
|
||||
return;
|
||||
}
|
||||
trangaTask.state = TrangaTask.ExecutionState.Running;
|
||||
logger?.WriteLine("TaskExecutor", $"Executing Task {trangaTask}");
|
||||
logger?.WriteLine("TaskExecutor", $"Starting Task {trangaTask}");
|
||||
|
||||
//Connector is not needed for all tasks
|
||||
Connector? connector = null;
|
||||
@ -49,9 +50,9 @@ public static class TaskExecutor
|
||||
break;
|
||||
}
|
||||
|
||||
logger?.WriteLine("TaskExecutor", $"Task executed! {trangaTask}");
|
||||
trangaTask.state = TrangaTask.ExecutionState.Waiting;
|
||||
logger?.WriteLine("TaskExecutor", $"Task finished! {trangaTask}");
|
||||
trangaTask.lastExecuted = DateTime.Now;
|
||||
trangaTask.state = TrangaTask.ExecutionState.Waiting;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -60,13 +60,16 @@ public class TaskManager
|
||||
/// </summary>
|
||||
private void TaskCheckerThread()
|
||||
{
|
||||
logger?.WriteLine(this.GetType().ToString(), "Starting TaskCheckerThread.");
|
||||
while (_continueRunning)
|
||||
{
|
||||
//Check if previous tasks have finished and execute new tasks
|
||||
foreach (KeyValuePair<Connector, List<TrangaTask>> connectorTaskQueue in tasksToExecute)
|
||||
{
|
||||
connectorTaskQueue.Value.RemoveAll(task => task.state == TrangaTask.ExecutionState.Waiting);
|
||||
if (connectorTaskQueue.Value.Count > 0 && !connectorTaskQueue.Value.All(task => task.state is TrangaTask.ExecutionState.Running or TrangaTask.ExecutionState.Enqueued))
|
||||
if(connectorTaskQueue.Value.RemoveAll(task => task.state == TrangaTask.ExecutionState.Waiting) > 0)
|
||||
ExportData(Directory.GetCurrentDirectory());
|
||||
|
||||
if (connectorTaskQueue.Value.Count > 0 && connectorTaskQueue.Value.All(task => task.state is TrangaTask.ExecutionState.Enqueued))
|
||||
ExecuteTaskNow(connectorTaskQueue.Value.First());
|
||||
}
|
||||
|
||||
@ -116,7 +119,7 @@ public class TaskManager
|
||||
public TrangaTask AddTask(TrangaTask.Task task, string? connectorName, Publication? publication, TimeSpan reoccurrence,
|
||||
string language = "")
|
||||
{
|
||||
logger?.WriteLine(this.GetType().ToString(), $"Adding new Task");
|
||||
logger?.WriteLine(this.GetType().ToString(), $"Adding new Task {task} {connectorName} {publication?.sortName}");
|
||||
if (task != TrangaTask.Task.UpdateKomgaLibrary && connectorName is null)
|
||||
throw new ArgumentException($"connectorName can not be null for task {task}");
|
||||
|
||||
@ -150,7 +153,7 @@ public class TaskManager
|
||||
_allTasks.Add(newTask);
|
||||
}
|
||||
}
|
||||
logger?.WriteLine(this.GetType().ToString(), newTask.ToString());
|
||||
logger?.WriteLine(this.GetType().ToString(), $"Added new Task {newTask.ToString()}");
|
||||
ExportData(Directory.GetCurrentDirectory());
|
||||
|
||||
return newTask;
|
||||
@ -164,15 +167,23 @@ public class TaskManager
|
||||
/// <param name="publication">Publication that was used</param>
|
||||
public void RemoveTask(TrangaTask.Task task, string? connectorName, Publication? publication)
|
||||
{
|
||||
logger?.WriteLine(this.GetType().ToString(), $"Removing Task {task}");
|
||||
logger?.WriteLine(this.GetType().ToString(), $"Removing Task {task} {publication?.sortName}");
|
||||
if (task == TrangaTask.Task.UpdateKomgaLibrary)
|
||||
{
|
||||
_allTasks.RemoveWhere(uTask => uTask.task == TrangaTask.Task.UpdateKomgaLibrary);
|
||||
logger?.WriteLine(this.GetType().ToString(), $"Removed Task {task}");
|
||||
}
|
||||
else if (connectorName is null)
|
||||
throw new ArgumentException($"connectorName can not be null for Task {task}");
|
||||
else
|
||||
_allTasks.RemoveWhere(trangaTask =>
|
||||
{
|
||||
if(_allTasks.RemoveWhere(trangaTask =>
|
||||
trangaTask.task == task && trangaTask.connectorName == connectorName &&
|
||||
trangaTask.publication?.downloadUrl == publication?.downloadUrl);
|
||||
trangaTask.publication?.downloadUrl == publication?.downloadUrl) > 0)
|
||||
logger?.WriteLine(this.GetType().ToString(), $"Removed Task {task} {publication?.sortName} {publication?.downloadUrl}.");
|
||||
else
|
||||
logger?.WriteLine(this.GetType().ToString(), $"No Task {task} {publication?.sortName} {publication?.downloadUrl} could be found.");
|
||||
}
|
||||
ExportData(Directory.GetCurrentDirectory());
|
||||
}
|
||||
|
||||
@ -201,7 +212,7 @@ public class TaskManager
|
||||
/// </summary>
|
||||
/// <param name="connectorName">Connector-name (exact)</param>
|
||||
/// <exception cref="Exception">If Connector is not available</exception>
|
||||
public Connector GetConnector(string connectorName)
|
||||
public Connector GetConnector(string? connectorName)
|
||||
{
|
||||
if(connectorName is null)
|
||||
throw new Exception($"connectorName can not be null");
|
||||
@ -227,6 +238,7 @@ public class TaskManager
|
||||
//Wait for tasks to finish
|
||||
while(_allTasks.Any(task => task.state is TrangaTask.ExecutionState.Running or TrangaTask.ExecutionState.Enqueued))
|
||||
Thread.Sleep(10);
|
||||
logger?.WriteLine(this.GetType().ToString(), "Tasks finished. Bye!");
|
||||
Environment.Exit(0);
|
||||
}
|
||||
|
||||
@ -257,6 +269,7 @@ public class TaskManager
|
||||
|
||||
string exportPath = Path.Join(exportFolderPath, "data.json");
|
||||
string serializedData = JsonConvert.SerializeObject(data);
|
||||
File.Delete(exportPath);
|
||||
File.WriteAllText(exportPath, serializedData);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user