mirror of
https://github.com/C9Glax/tranga.git
synced 2025-07-07 11:21:35 +02:00
Compare commits
24 Commits
201773af50
...
0.7
Author | SHA1 | Date | |
---|---|---|---|
32dc58715e | |||
add0583776 | |||
6fed0e5473 | |||
a0636ac7a2 | |||
7aeb78e2f6 | |||
5cf512f2b2 | |||
7d96b0901f | |||
68e80bc066 | |||
ad971fb065 | |||
86052472bc | |||
ec30bb40fa | |||
2fa96e9793 | |||
78e44b7704 | |||
8bf9df4419 | |||
4bd54f096d | |||
877daf0a1e | |||
6d0fcc13fb | |||
f0256494fd | |||
39fa905733 | |||
c557389967 | |||
a966bd788d | |||
947b521163 | |||
5674adbd5e | |||
0d0b68a8f9 |
@ -3,6 +3,7 @@ using Tranga;
|
|||||||
|
|
||||||
string applicationFolderPath =
|
string applicationFolderPath =
|
||||||
Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "Tranga-API");
|
Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "Tranga-API");
|
||||||
|
string downloadFolderPath = Path.Join(applicationFolderPath, "Manga");
|
||||||
string logsFolderPath = Path.Join(applicationFolderPath, "logs");
|
string logsFolderPath = Path.Join(applicationFolderPath, "logs");
|
||||||
string logFilePath = Path.Join(logsFolderPath, $"log-{DateTime.Now:dd-M-yyyy-HH-mm-ss}.txt");
|
string logFilePath = Path.Join(logsFolderPath, $"log-{DateTime.Now:dd-M-yyyy-HH-mm-ss}.txt");
|
||||||
string settingsFilePath = Path.Join(applicationFolderPath, "settings.json");
|
string settingsFilePath = Path.Join(applicationFolderPath, "settings.json");
|
||||||
@ -20,7 +21,7 @@ TrangaSettings settings;
|
|||||||
if (File.Exists(settingsFilePath))
|
if (File.Exists(settingsFilePath))
|
||||||
settings = TrangaSettings.LoadSettings(settingsFilePath);
|
settings = TrangaSettings.LoadSettings(settingsFilePath);
|
||||||
else
|
else
|
||||||
settings = new TrangaSettings(Directory.GetCurrentDirectory(), applicationFolderPath, null);
|
settings = new TrangaSettings(downloadFolderPath, applicationFolderPath, null);
|
||||||
|
|
||||||
TaskManager taskManager = new (settings, logger);
|
TaskManager taskManager = new (settings, logger);
|
||||||
|
|
||||||
@ -28,17 +29,31 @@ var builder = WebApplication.CreateBuilder(args);
|
|||||||
builder.Services.AddEndpointsApiExplorer();
|
builder.Services.AddEndpointsApiExplorer();
|
||||||
builder.Services.AddSwaggerGen();
|
builder.Services.AddSwaggerGen();
|
||||||
builder.Services.AddControllers().AddNewtonsoftJson();
|
builder.Services.AddControllers().AddNewtonsoftJson();
|
||||||
|
|
||||||
|
string corsHeader = "Tranga";
|
||||||
|
builder.Services.AddCors(options =>
|
||||||
|
{
|
||||||
|
options.AddPolicy(name: corsHeader,
|
||||||
|
policy =>
|
||||||
|
{
|
||||||
|
policy.WithOrigins("http://localhost", "http://127.0.0.1", "http://localhost:63342");
|
||||||
|
policy.WithMethods("GET", "POST", "DELETE");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
app.UseSwagger();
|
app.UseSwagger();
|
||||||
app.UseSwaggerUI();
|
app.UseSwaggerUI();
|
||||||
app.UseSwagger();
|
app.UseSwagger();
|
||||||
app.UseSwaggerUI();
|
app.UseSwaggerUI();
|
||||||
|
|
||||||
app.MapGet("/GetAvailableControllers", () => taskManager.GetAvailableConnectors());
|
app.UseCors(corsHeader);
|
||||||
|
|
||||||
app.MapGet("/GetKnownPublications", () => taskManager.GetAllPublications());
|
app.MapGet("/Tranga/GetAvailableControllers", () => taskManager.GetAvailableConnectors().Keys.ToArray());
|
||||||
|
|
||||||
app.MapGet("/GetPublicationsFromConnector", (string connectorName, string title) =>
|
app.MapGet("/Tranga/GetKnownPublications", () => taskManager.GetAllPublications());
|
||||||
|
|
||||||
|
app.MapGet("/Tranga/GetPublicationsFromConnector", (string connectorName, string title) =>
|
||||||
{
|
{
|
||||||
Connector? connector = taskManager.GetAvailableConnectors().FirstOrDefault(con => con.Key == connectorName).Value;
|
Connector? connector = taskManager.GetAvailableConnectors().FirstOrDefault(con => con.Key == connectorName).Value;
|
||||||
if (connector is null)
|
if (connector is null)
|
||||||
@ -65,7 +80,16 @@ app.MapDelete("/Tasks/Delete", (string taskType, string? connectorName, string?
|
|||||||
taskManager.DeleteTask(task, connectorName, publication);
|
taskManager.DeleteTask(task, connectorName, publication);
|
||||||
});
|
});
|
||||||
|
|
||||||
app.MapGet("/Tasks/GetList", () => taskManager.GetAllTasks());
|
app.MapGet("/Tasks/Get", (string taskType, string? connectorName, string? searchString) =>
|
||||||
|
{
|
||||||
|
TrangaTask.Task task = Enum.Parse<TrangaTask.Task>(taskType);
|
||||||
|
if (searchString is null)
|
||||||
|
return taskManager.GetAllTasks().Where(tTask => tTask.task == task && tTask.connectorName == connectorName);
|
||||||
|
else
|
||||||
|
return taskManager.GetAllTasks().Where(tTask =>
|
||||||
|
tTask.task == task && tTask.connectorName == connectorName && tTask.ToString()
|
||||||
|
.Contains(searchString, StringComparison.InvariantCultureIgnoreCase));
|
||||||
|
});
|
||||||
|
|
||||||
app.MapPost("/Tasks/Start", (string taskType, string? connectorName, string? publicationId) =>
|
app.MapPost("/Tasks/Start", (string taskType, string? connectorName, string? publicationId) =>
|
||||||
{
|
{
|
||||||
|
@ -52,8 +52,8 @@ async function GetRunningTasks(){
|
|||||||
return json;
|
return json;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function GetTasks(){
|
async function GetDownloadTasks(){
|
||||||
var uri = apiUri + "/Tasks/GetList";
|
var uri = apiUri + "/Tasks/Get?taskType=DownloadNewChapters";
|
||||||
let json = await GetData(uri);
|
let json = await GetData(uri);
|
||||||
return json;
|
return json;
|
||||||
}
|
}
|
||||||
@ -64,6 +64,12 @@ async function GetSettings(){
|
|||||||
return json;
|
return json;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function GetKomgaTask(){
|
||||||
|
var uri = apiUri + "/Tasks/Get?taskType=UpdateKomgaLibrary";
|
||||||
|
let json = await GetData(uri);
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
|
||||||
function CreateTask(taskType, reoccurrence, connectorName, publicationId, language){
|
function CreateTask(taskType, reoccurrence, connectorName, publicationId, language){
|
||||||
var uri = apiUri + `/Tasks/Create?taskType=${taskType}&connectorName=${connectorName}&publicationId=${publicationId}&reoccurrenceTime=${reoccurrence}&language=${language}`;
|
var uri = apiUri + `/Tasks/Create?taskType=${taskType}&connectorName=${connectorName}&publicationId=${publicationId}&reoccurrenceTime=${reoccurrence}&language=${language}`;
|
||||||
PostData(uri);
|
PostData(uri);
|
||||||
@ -80,7 +86,7 @@ function EnqueueTask(taskType, connectorName, publicationId){
|
|||||||
}
|
}
|
||||||
|
|
||||||
function UpdateSettings(downloadLocation, komgaUrl, komgaAuth){
|
function UpdateSettings(downloadLocation, komgaUrl, komgaAuth){
|
||||||
var uri = apiUri + `/Settings/Update?downloadLocation=${downloadLocation}&komgaUrl=${komgaAuth}&komgaAuth=${komgaAuth}`;
|
var uri = apiUri + `/Settings/Update?downloadLocation=${downloadLocation}&komgaUrl=${komgaUrl}&komgaAuth=${komgaAuth}`;
|
||||||
PostData(uri);
|
PostData(uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,8 +37,8 @@
|
|||||||
</publication>
|
</publication>
|
||||||
</content>
|
</content>
|
||||||
|
|
||||||
<popup>
|
<popup id="addTaskPopup">
|
||||||
<blur-background></blur-background>
|
<blur-background id="blurBackgroundTaskPopup"></blur-background>
|
||||||
<addtask-window>
|
<addtask-window>
|
||||||
<window-titlebar>
|
<window-titlebar>
|
||||||
<p>Add Task</p>
|
<p>Add Task</p>
|
||||||
@ -46,7 +46,6 @@
|
|||||||
</window-titlebar>
|
</window-titlebar>
|
||||||
<window-content>
|
<window-content>
|
||||||
<addtask-settings>
|
<addtask-settings>
|
||||||
<addtask-setting><label for="taskTypes">TaskType</label><select id="taskTypes"></select></addtask-setting>
|
|
||||||
<addtask-setting><label for="selectReccurrence">Recurrence</label><input id="selectReccurrence" type="time" value="01:00" step="3600"></addtask-setting>
|
<addtask-setting><label for="selectReccurrence">Recurrence</label><input id="selectReccurrence" type="time" value="01:00" step="3600"></addtask-setting>
|
||||||
<addtask-setting><label for="connectors">Connector</label>
|
<addtask-setting><label for="connectors">Connector</label>
|
||||||
<select id="connectors">
|
<select id="connectors">
|
||||||
@ -54,10 +53,14 @@
|
|||||||
</select>
|
</select>
|
||||||
</addtask-setting>
|
</addtask-setting>
|
||||||
<addtask-setting><label for="searchPublicationQuery">Search Title</label><input id="searchPublicationQuery" type="text"></addtask-setting>
|
<addtask-setting><label for="searchPublicationQuery">Search Title</label><input id="searchPublicationQuery" type="text"></addtask-setting>
|
||||||
|
<input type="submit" value="Search" onclick="NewSearch();">
|
||||||
</addtask-settings>
|
</addtask-settings>
|
||||||
<div id="taskSelectOutput"></div>
|
<div id="taskSelectOutput"></div>
|
||||||
</window-content>
|
</window-content>
|
||||||
</addtask-window>
|
</addtask-window>
|
||||||
|
</popup>
|
||||||
|
<popup id="publicationViewerPopup">
|
||||||
|
<blur-background id="blurBackgroundPublicationPopup"></blur-background>
|
||||||
<publication-viewer>
|
<publication-viewer>
|
||||||
<img id="pubviewcover" src="media/cover.jpg" alt="cover">
|
<img id="pubviewcover" src="media/cover.jpg" alt="cover">
|
||||||
<publication-information>
|
<publication-information>
|
||||||
@ -69,6 +72,7 @@
|
|||||||
Pandemic love comedy!
|
Pandemic love comedy!
|
||||||
</publication-description>
|
</publication-description>
|
||||||
<publication-delete>Delete Task ❌</publication-delete>
|
<publication-delete>Delete Task ❌</publication-delete>
|
||||||
|
<publication-add>Add Task ➕</publication-add>
|
||||||
</publication-information>
|
</publication-information>
|
||||||
</publication-viewer>
|
</publication-viewer>
|
||||||
</popup>
|
</popup>
|
||||||
@ -76,7 +80,17 @@
|
|||||||
</viewport>
|
</viewport>
|
||||||
|
|
||||||
<settingstab id="settingstab">
|
<settingstab id="settingstab">
|
||||||
|
<span class="title">Download Location:</span>
|
||||||
|
<span id="downloadLocation"></span>
|
||||||
|
<komga-settings>
|
||||||
|
<span class="title">Komga</span>
|
||||||
|
<div>Configured: <span id="komgaConfigured">✅❌</span></div>
|
||||||
|
<label for="komgaUrl"></label><input placeholder="URL" id="komgaUrl" type="text">
|
||||||
|
<label for="komgaUsername"></label><input placeholder="Username" id="komgaUsername" type="text">
|
||||||
|
<label for="komgaPassword"></label><input placeholder="Password" id="komgaPassword" type="password">
|
||||||
|
<div><label for="komgaUpdateTime" style="margin-right: 5px;">Update Time</label><input id="komgaUpdateTime" type="time" value="00:01"></div>
|
||||||
|
<input type="submit" value="Update" onclick="UpdateSettingsClick()">
|
||||||
|
</komga-settings>
|
||||||
</settingstab>
|
</settingstab>
|
||||||
|
|
||||||
<script src="apiConnector.js"></script>
|
<script src="apiConnector.js"></script>
|
||||||
|
@ -20,8 +20,8 @@ const slideOutRightTiming = {
|
|||||||
|
|
||||||
let publications = [];
|
let publications = [];
|
||||||
let tasks = [];
|
let tasks = [];
|
||||||
|
let toEditId;
|
||||||
|
|
||||||
const taskTypesSelect = document.querySelector("#taskTypes")
|
|
||||||
const searchPublicationQuery = document.querySelector("#searchPublicationQuery");
|
const searchPublicationQuery = document.querySelector("#searchPublicationQuery");
|
||||||
const selectPublication = document.querySelector("#taskSelectOutput");
|
const selectPublication = document.querySelector("#taskSelectOutput");
|
||||||
const connectorSelect = document.querySelector("#connectors");
|
const connectorSelect = document.querySelector("#connectors");
|
||||||
@ -29,35 +29,34 @@ const settingsTab = document.querySelector("#settingstab");
|
|||||||
const settingsCog = document.querySelector("#settingscog");
|
const settingsCog = document.querySelector("#settingscog");
|
||||||
const selectRecurrence = document.querySelector("#selectReccurrence");
|
const selectRecurrence = document.querySelector("#selectReccurrence");
|
||||||
const tasksContent = document.querySelector("content");
|
const tasksContent = document.querySelector("content");
|
||||||
const generalPopup = document.querySelector("popup");
|
const addTaskPopup = document.querySelector("#addTaskPopup");
|
||||||
const addTaskWindow = document.querySelector("addtask-window");
|
const publicationViewerPopup = document.querySelector("#publicationViewerPopup");
|
||||||
const publicationViewer = document.querySelector("publication-viewer");
|
const publicationViewerWindow = document.querySelector("publication-viewer");
|
||||||
const publicationViewerDescription = document.querySelector("#publicationViewerDescription");
|
const publicationViewerDescription = document.querySelector("#publicationViewerDescription");
|
||||||
const publicationViewerName = document.querySelector("#publicationViewerName");
|
const publicationViewerName = document.querySelector("#publicationViewerName");
|
||||||
const publicationViewerAuthor = document.querySelector("#publicationViewerAuthor");
|
const publicationViewerAuthor = document.querySelector("#publicationViewerAuthor");
|
||||||
const pubviewcover = document.querySelector("#pubviewcover");
|
const pubviewcover = document.querySelector("#pubviewcover");
|
||||||
const publicationDelete = document.querySelector("publication-delete");
|
const publicationDelete = document.querySelector("publication-delete");
|
||||||
|
const publicationAdd = document.querySelector("publication-add");
|
||||||
const closetaskpopup = document.querySelector("#closePopupImg");
|
const closetaskpopup = document.querySelector("#closePopupImg");
|
||||||
|
const settingDownloadLocation = document.querySelector("#downloadLocation");
|
||||||
|
const settingKomgaUrl = document.querySelector("#komgaUrl");
|
||||||
|
const settingKomgaUser = document.querySelector("#komgaUsername");
|
||||||
|
const settingKomgaPass = document.querySelector("#komgaPassword");
|
||||||
|
const settingKomgaTime = document.querySelector("#komgaUpdateTime");
|
||||||
|
const settingKomgaConfigured = document.querySelector("#komgaConfigured");
|
||||||
|
|
||||||
settingsCog.addEventListener("click", () => slide());
|
|
||||||
closetaskpopup.addEventListener("click", () => HidePopup())
|
|
||||||
document.querySelector("blur-background").addEventListener("click", () => HidePopup());
|
|
||||||
|
|
||||||
let availableTaskTypes;
|
settingsCog.addEventListener("click", () => OpenSettings());
|
||||||
GetTaskTypes()
|
closetaskpopup.addEventListener("click", () => HideAddTaskPopup());
|
||||||
.then(json => availableTaskTypes = json)
|
document.querySelector("#blurBackgroundTaskPopup").addEventListener("click", () => HideAddTaskPopup());
|
||||||
.then(json =>
|
document.querySelector("#blurBackgroundPublicationPopup").addEventListener("click", () => HidePublicationPopup());
|
||||||
json.forEach(taskType => {
|
publicationDelete.addEventListener("click", () => DeleteTaskClick());
|
||||||
var option = document.createElement('option');
|
publicationAdd.addEventListener("click", () => AddTaskClick());
|
||||||
option.value = taskType;
|
|
||||||
option.innerText = taskType;
|
|
||||||
taskTypesSelect.appendChild(option);
|
|
||||||
}));
|
|
||||||
|
|
||||||
let availableConnectors;
|
let availableConnectors;
|
||||||
GetAvailableControllers()
|
GetAvailableControllers()
|
||||||
.then(json => availableConnectors = json)
|
.then(json => availableConnectors = json)
|
||||||
//.then(json => console.log(json))
|
|
||||||
.then(json =>
|
.then(json =>
|
||||||
json.forEach(connector => {
|
json.forEach(connector => {
|
||||||
var option = document.createElement('option');
|
var option = document.createElement('option');
|
||||||
@ -69,22 +68,37 @@ GetAvailableControllers()
|
|||||||
|
|
||||||
searchPublicationQuery.addEventListener("keypress", (event) => {
|
searchPublicationQuery.addEventListener("keypress", (event) => {
|
||||||
if(event.key === "Enter"){
|
if(event.key === "Enter"){
|
||||||
selectPublication.replaceChildren();
|
NewSearch();
|
||||||
GetPublication(connectorSelect.value, searchPublicationQuery.value)
|
|
||||||
//.then(json => console.log(json));
|
|
||||||
.then(json =>
|
|
||||||
json.forEach(publication => {
|
|
||||||
var option = CreatePublication(publication, connectorSelect.value);
|
|
||||||
option.addEventListener("click", () => {
|
|
||||||
CreateTask(taskTypesSelect.value, selectRecurrence.value, connectorSelect.value, publication.internalId, "en");
|
|
||||||
selectPublication.replaceChildren();
|
|
||||||
});
|
|
||||||
selectPublication.appendChild(option);
|
|
||||||
}
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function NewSearch(){
|
||||||
|
//Disable inputs
|
||||||
|
selectRecurrence.disabled = true;
|
||||||
|
connectorSelect.disabled = true;
|
||||||
|
searchPublicationQuery.disabled = true;
|
||||||
|
|
||||||
|
//Empty previous results
|
||||||
|
selectPublication.replaceChildren();
|
||||||
|
GetPublication(connectorSelect.value, searchPublicationQuery.value)
|
||||||
|
.then(json =>
|
||||||
|
json.forEach(publication => {
|
||||||
|
var option = CreatePublication(publication, connectorSelect.value);
|
||||||
|
option.addEventListener("click", (mouseEvent) => {
|
||||||
|
ShowPublicationViewerWindow(publication.internalId, mouseEvent, true);
|
||||||
|
});
|
||||||
|
selectPublication.appendChild(option);
|
||||||
|
}
|
||||||
|
))
|
||||||
|
.then(() => {
|
||||||
|
//Re-enable inputs
|
||||||
|
selectRecurrence.disabled = false;
|
||||||
|
connectorSelect.disabled = false;
|
||||||
|
searchPublicationQuery.disabled = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
//Returns a new "Publication" Item to display in the tasks section
|
||||||
function CreatePublication(publication, connector){
|
function CreatePublication(publication, connector){
|
||||||
var publicationElement = document.createElement('publication');
|
var publicationElement = document.createElement('publication');
|
||||||
publicationElement.setAttribute("id", publication.internalId);
|
publicationElement.setAttribute("id", publication.internalId);
|
||||||
@ -105,11 +119,19 @@ function CreatePublication(publication, connector){
|
|||||||
return publicationElement;
|
return publicationElement;
|
||||||
}
|
}
|
||||||
|
|
||||||
function DeleteTask(taskType, connectorName, publicationId){
|
function DeleteTaskClick(){
|
||||||
|
taskToDelete = tasks.filter(tTask => tTask.publication.internalId === toEditId)[0];
|
||||||
|
DeleteTask("DownloadNewChapters", taskToDelete.connectorName, toEditId);
|
||||||
|
HidePublicationPopup();
|
||||||
}
|
}
|
||||||
|
|
||||||
var slideIn = true;
|
function AddTaskClick(){
|
||||||
|
CreateTask("DownloadNewChapters", selectRecurrence.value, connectorSelect.value, toEditId, "en")
|
||||||
|
HideAddTaskPopup();
|
||||||
|
HidePublicationPopup();
|
||||||
|
}
|
||||||
|
|
||||||
|
let slideIn = true;
|
||||||
function slide() {
|
function slide() {
|
||||||
if (slideIn)
|
if (slideIn)
|
||||||
settingsTab.animate(slideInRight, slideInRightTiming);
|
settingsTab.animate(slideInRight, slideInRightTiming);
|
||||||
@ -119,7 +141,10 @@ function slide() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function ResetContent(){
|
function ResetContent(){
|
||||||
|
//Delete everything
|
||||||
tasksContent.replaceChildren();
|
tasksContent.replaceChildren();
|
||||||
|
|
||||||
|
//Add "Add new Task" Button
|
||||||
var add = document.createElement("div");
|
var add = document.createElement("div");
|
||||||
add.setAttribute("id", "addPublication")
|
add.setAttribute("id", "addPublication")
|
||||||
var plus = document.createElement("p");
|
var plus = document.createElement("p");
|
||||||
@ -128,39 +153,46 @@ function ResetContent(){
|
|||||||
add.addEventListener("click", () => ShowNewTaskWindow());
|
add.addEventListener("click", () => ShowNewTaskWindow());
|
||||||
tasksContent.appendChild(add);
|
tasksContent.appendChild(add);
|
||||||
}
|
}
|
||||||
|
function ShowPublicationViewerWindow(publicationId, event, add){
|
||||||
function ShowPopup(){
|
//Set position to mouse-position
|
||||||
generalPopup.style.display = "block";
|
publicationViewerWindow.style.top = `${event.clientY - 60}px`;
|
||||||
generalPopup.animate(fadeIn, fadeInTiming);
|
publicationViewerWindow.style.left = `${event.clientX}px`;
|
||||||
}
|
|
||||||
|
|
||||||
let toRemoveId;
|
|
||||||
function ShowPublicationViewerWindow(publicationId, event){
|
|
||||||
publicationViewer.style.top = `${event.clientY - 60}px`;
|
|
||||||
publicationViewer.style.left = `${event.clientX}px`;
|
|
||||||
var publication = publications.filter(pub => pub.internalId === publicationId)[0];
|
|
||||||
|
|
||||||
|
//Edit information inside the window
|
||||||
|
var publication = publications.filter(pub => pub.internalId === publicationId)[0];
|
||||||
publicationViewerName.innerText = publication.sortName;
|
publicationViewerName.innerText = publication.sortName;
|
||||||
publicationViewerDescription.innerText = publication.description;
|
publicationViewerDescription.innerText = publication.description;
|
||||||
publicationViewerAuthor.innerText = publication.author;
|
publicationViewerAuthor.innerText = publication.author;
|
||||||
pubviewcover.src = publication.posterUrl;
|
pubviewcover.src = publication.posterUrl;
|
||||||
|
toEditId = publicationId;
|
||||||
|
|
||||||
toRemoveId = publicationId;
|
//Check what action should be listed
|
||||||
publicationViewer.style.display = "block";
|
if(add){
|
||||||
ShowPopup();
|
publicationAdd.style.display = "block";
|
||||||
|
publicationDelete.style.display = "none";
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
publicationAdd.style.display = "none";
|
||||||
|
publicationDelete.style.display = "block";
|
||||||
|
}
|
||||||
|
|
||||||
|
//Show popup
|
||||||
|
publicationViewerPopup.style.display = "block";
|
||||||
|
}
|
||||||
|
|
||||||
|
function HidePublicationPopup(){
|
||||||
|
publicationViewerPopup.style.display = "none";
|
||||||
}
|
}
|
||||||
|
|
||||||
function ShowNewTaskWindow(){
|
function ShowNewTaskWindow(){
|
||||||
selectPublication.replaceChildren();
|
selectPublication.replaceChildren();
|
||||||
addTaskWindow.style.display = "flex";
|
addTaskPopup.style.display = "block";
|
||||||
ShowPopup();
|
|
||||||
}
|
}
|
||||||
function HidePopup(){
|
function HideAddTaskPopup(){
|
||||||
generalPopup.style.display = "none";
|
addTaskPopup.style.display = "none";
|
||||||
addTaskWindow.style.display = "none";
|
|
||||||
publicationViewer.style.display = "none";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const fadeIn = [
|
const fadeIn = [
|
||||||
{ opacity: "0" },
|
{ opacity: "0" },
|
||||||
{ opacity: "1" }
|
{ opacity: "1" }
|
||||||
@ -172,28 +204,74 @@ const fadeInTiming = {
|
|||||||
fill: "forwards"
|
fill: "forwards"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function OpenSettings(){
|
||||||
|
GetSettingsClick();
|
||||||
|
slide();
|
||||||
|
}
|
||||||
|
|
||||||
|
function GetSettingsClick(){
|
||||||
|
settingKomgaUrl.value = "";
|
||||||
|
settingKomgaUser.value = "";
|
||||||
|
settingKomgaPass.value = "";
|
||||||
|
|
||||||
|
GetSettings().then(json => {
|
||||||
|
settingDownloadLocation.innerText = json.downloadLocation;
|
||||||
|
if(json.komga != null)
|
||||||
|
settingKomgaUrl.placeholder = json.komga.baseUrl;
|
||||||
|
});
|
||||||
|
|
||||||
|
GetKomgaTask().then(json => {
|
||||||
|
if(json.length > 0)
|
||||||
|
settingKomgaConfigured.innerText = "✅";
|
||||||
|
else
|
||||||
|
settingKomgaConfigured.innerText = "❌";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function UpdateSettingsClick(){
|
||||||
|
var auth = utf8_to_b64(`${settingKomgaUser.value}:${settingKomgaPass.value}`);
|
||||||
|
console.log(auth);
|
||||||
|
UpdateSettings("", settingKomgaUrl.value, auth);
|
||||||
|
CreateTask("UpdateKomgaLibrary", settingKomgaTime.value, "","","");
|
||||||
|
setTimeout(() => GetSettingsClick(), 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
function utf8_to_b64( str ) {
|
||||||
|
return window.btoa(unescape(encodeURIComponent( str )));
|
||||||
|
}
|
||||||
|
|
||||||
|
//Resets the tasks shown
|
||||||
ResetContent();
|
ResetContent();
|
||||||
GetTasks()
|
//Get Tasks and show them
|
||||||
//.then(json => console.log(json))
|
GetDownloadTasks()
|
||||||
.then(json => json.forEach(task => {
|
.then(json => json.forEach(task => {
|
||||||
var publication = CreatePublication(task.publication, task.connectorName);
|
var publication = CreatePublication(task.publication, task.connectorName);
|
||||||
publication.addEventListener("click", (event) => ShowPublicationViewerWindow(task.publication.internalId, event));
|
publication.addEventListener("click", (event) => ShowPublicationViewerWindow(task.publication.internalId, event, false));
|
||||||
tasksContent.appendChild(publication);
|
tasksContent.appendChild(publication);
|
||||||
|
tasks.push(task);
|
||||||
if(tasks.filter(task => task.publication.internalId === publication.internalId) < 1)
|
|
||||||
tasks.push(task);
|
|
||||||
}));
|
}));
|
||||||
|
|
||||||
setInterval(() => {
|
setInterval(() => {
|
||||||
ResetContent();
|
//Tasks from API
|
||||||
GetTasks()
|
var cTasks = [];
|
||||||
//.then(json => console.log(json))
|
GetDownloadTasks()
|
||||||
.then(json => json.forEach(task => {
|
.then(json => json.forEach(task => cTasks.push(task)))
|
||||||
var publication = CreatePublication(task.publication, task.connectorName);
|
.then(() => {
|
||||||
publication.addEventListener("click", (event) => ShowPublicationViewerWindow(task.publication.internalId, event));
|
//Only update view if tasks-amount has changed
|
||||||
tasksContent.appendChild(publication);
|
if(tasks.length != cTasks.length) {
|
||||||
|
//Resets the tasks shown
|
||||||
|
ResetContent();
|
||||||
|
//Add all currenttasks to view
|
||||||
|
cTasks.forEach(task => {
|
||||||
|
var publication = CreatePublication(task.publication, task.connectorName);
|
||||||
|
publication.addEventListener("click", (event) => ShowPublicationViewerWindow(task.publication.internalId, event, false));
|
||||||
|
tasksContent.appendChild(publication);
|
||||||
|
})
|
||||||
|
|
||||||
if(tasks.filter(task => task.publication.internalId === publication.internalId) < 1)
|
tasks = cTasks;
|
||||||
tasks.push(task);
|
}
|
||||||
}));
|
}
|
||||||
}, 5000);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
}, 1000);
|
@ -123,6 +123,36 @@ settingstab{
|
|||||||
height: calc(100% - var(--topbar-height) - 40px);
|
height: calc(100% - var(--topbar-height) - 40px);
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
border-radius: 5px 0 0 5px;
|
border-radius: 5px 0 0 5px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
settingstab > * {
|
||||||
|
margin: 0 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
settingstab .title {
|
||||||
|
font-size: 14pt;
|
||||||
|
font-weight: bolder;
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
komga-settings {
|
||||||
|
margin-top: 20px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
komga-settings > * {
|
||||||
|
margin: 2px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
komga-settings input {
|
||||||
|
padding: 3px;
|
||||||
|
border-radius: 3px;
|
||||||
|
border: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#addPublication {
|
#addPublication {
|
||||||
@ -226,7 +256,7 @@ blur-background {
|
|||||||
}
|
}
|
||||||
|
|
||||||
addtask-window {
|
addtask-window {
|
||||||
display: none;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
flex-wrap: nowrap;
|
flex-wrap: nowrap;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@ -307,8 +337,12 @@ addtask-settings addtask-setting{
|
|||||||
align-content: start;
|
align-content: start;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#publicationViewerPopup{
|
||||||
|
z-index: 6;
|
||||||
|
}
|
||||||
|
|
||||||
publication-viewer{
|
publication-viewer{
|
||||||
display: none;
|
display: block;
|
||||||
width: 500px;
|
width: 500px;
|
||||||
height: 300px;
|
height: 300px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@ -375,4 +409,13 @@ publication-viewer publication-information publication-delete {
|
|||||||
color: red;
|
color: red;
|
||||||
margin: 20px;
|
margin: 20px;
|
||||||
font-size: 16pt;
|
font-size: 16pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
publication-viewer publication-information publication-add {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0px;
|
||||||
|
right: 0px;
|
||||||
|
color: limegreen;
|
||||||
|
margin: 20px;
|
||||||
|
font-size: 16pt;
|
||||||
}
|
}
|
Reference in New Issue
Block a user