diff --git a/.idea/.idea.Abyss/.idea/sqldialects.xml b/.idea/.idea.Abyss/.idea/sqldialects.xml
index dfb59b6..0f6787f 100644
--- a/.idea/.idea.Abyss/.idea/sqldialects.xml
+++ b/.idea/.idea.Abyss/.idea/sqldialects.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/.idea/.idea.Abyss/.idea/workspace.xml b/.idea/.idea.Abyss/.idea/workspace.xml
index bc7eacb..6e27d5c 100644
--- a/.idea/.idea.Abyss/.idea/workspace.xml
+++ b/.idea/.idea.Abyss/.idea/workspace.xml
@@ -9,7 +9,43 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -41,36 +77,32 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
@@ -85,30 +117,30 @@
- {
- "keyToString": {
- ".NET Launch Settings Profile.Abyss: http.executor": "Debug",
- ".NET Launch Settings Profile.Abyss: https.executor": "Debug",
- ".NET Project.AbyssCli.executor": "Run",
- "ASKED_SHARE_PROJECT_CONFIGURATION_FILES": "true",
- "ModuleVcsDetector.initialDetectionPerformed": "true",
- "Publish to folder.Publish Abyss to folder x86.executor": "Run",
- "Publish to folder.Publish Abyss to folder.executor": "Run",
- "RunOnceActivity.ShowReadmeOnStart": "true",
- "RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true",
- "RunOnceActivity.git.unshallow": "true",
- "XThreadsFramesViewSplitterKey": "0.55813956",
- "git-widget-placeholder": "main",
- "last_opened_file_path": "/home/acite/embd/WebProjects/Abyss/README.md",
- "node.js.detected.package.eslint": "true",
- "node.js.detected.package.tslint": "true",
- "node.js.selected.package.eslint": "(autodetect)",
- "node.js.selected.package.tslint": "(autodetect)",
- "nodejs_package_manager_path": "npm",
- "settings.editor.selected.configurable": "com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable",
- "vue.rearranger.settings.migration": "true"
+
+}]]>
@@ -246,6 +278,8 @@
+
+
diff --git a/Abyss.sln.DotSettings.user b/Abyss.sln.DotSettings.user
index 46fdabc..6bd98a5 100644
--- a/Abyss.sln.DotSettings.user
+++ b/Abyss.sln.DotSettings.user
@@ -1,6 +1,7 @@
ForceIncluded
ForceIncluded
+ ForceIncluded
ForceIncluded
ForceIncluded
ForceIncluded
diff --git a/Abyss/Components/Controllers/AbyssController.cs b/Abyss/Components/Controllers/AbyssController.cs
index f73cc5e..311ef93 100644
--- a/Abyss/Components/Controllers/AbyssController.cs
+++ b/Abyss/Components/Controllers/AbyssController.cs
@@ -1,4 +1,5 @@
using Abyss.Components.Services;
+using Abyss.Components.Services.Misc;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Memory;
diff --git a/Abyss/Components/Controllers/Media/ImageController.cs b/Abyss/Components/Controllers/Media/ImageController.cs
index 6e388ad..7131c04 100644
--- a/Abyss/Components/Controllers/Media/ImageController.cs
+++ b/Abyss/Components/Controllers/Media/ImageController.cs
@@ -1,100 +1,56 @@
-using Abyss.Components.Services;
+using Abyss.Components.Services.Media;
using Abyss.Components.Static;
using Abyss.Components.Tools;
-using Abyss.Model;
+using Abyss.Model.Media;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
-using Newtonsoft.Json.Linq;
namespace Abyss.Components.Controllers.Media;
-using System.IO;
-
-using Task = System.Threading.Tasks.Task;
[ApiController]
[Route("api/[controller]")]
-public class ImageController(ResourceService rs, ConfigureService config) : BaseController
+public class ImageController(ComicService comicService) : BaseController
{
- public readonly string ImageFolder = Path.Combine(config.MediaRoot, "Images");
[HttpPost("init")]
public async Task InitAsync(string token, string owner)
{
- var r = await rs.Initialize(ImageFolder, token, owner, Ip);
- if(r) return Ok(r);
- return StatusCode(403, new { message = "403 Denied" });
+ var r = await comicService.InitAsync(token, owner, Ip);
+ return r ? Ok("Initialize Success") : _403;
}
[HttpGet]
public async Task QueryCollections(string token)
{
- var r = await rs.Query(ImageFolder, token, Ip);
-
- if(r == null)
- return StatusCode(401, new { message = "Unauthorized" });
-
- return Ok(r.NaturalSort(x => x));
+ var r = await comicService.QueryCollections(token, Ip);
+ return r != null ? Ok(r.NaturalSort(x => x)) : _403;
}
[HttpGet("{id}")]
public async Task Query(string id, string token)
{
- var d = Helpers.SafePathCombine(ImageFolder, [id, "summary.json"]);
- if (d == null) return StatusCode(403, new { message = "403 Denied" });
-
- var r = await rs.Get(d, token, Ip);
- if (!r) return StatusCode(403, new { message = "403 Denied" });
-
- return Ok(await System.IO.File.ReadAllTextAsync(d));
+ var r = await comicService.Query(id, token, Ip);
+ return r != null ? Ok(r) : _403;
}
[HttpPost("bulkquery")]
public async Task QueryBulk([FromQuery] string token, [FromBody] string[] id)
{
- var db = id.Select(x => Helpers.SafePathCombine(ImageFolder, [x, "summary.json"])).ToArray();
- if (db.Any(x => x == null))
- return BadRequest();
-
- if(!await rs.GetAll(db!, token, Ip))
- return StatusCode(403, new { message = "403 Denied" });
-
- var rc = db.Select(x => System.IO.File.ReadAllTextAsync(x!)).ToArray();
- string[] rcs = await Task.WhenAll(rc);
- var rjs = rcs.Select(JsonConvert.DeserializeObject).Select(x => x!).ToArray();
-
- return Ok(JsonConvert.SerializeObject(rjs));
+ var r = await comicService.QueryBulk(token, id, Ip);
+ return Ok(JsonConvert.SerializeObject(r));
}
[HttpPost("{id}/bookmark")]
public async Task Bookmark(string id, string token, [FromBody] Bookmark bookmark)
{
- var d = Helpers.SafePathCombine(ImageFolder, [id, "summary.json"]);
- if (d == null) return StatusCode(403, new { message = "403 Denied" });
-
- var r = await rs.Update(d, token, Ip);
- if (!r) return StatusCode(403, new { message = "403 Denied" });
-
- Comic c = JsonConvert.DeserializeObject(await System.IO.File.ReadAllTextAsync(d))!;
-
- var bookmarkPage = Helpers.SafePathCombine(ImageFolder, [id, bookmark.Page]);
- if(!System.IO.File.Exists(bookmarkPage))
- return BadRequest();
-
- c.Bookmarks.Add(bookmark);
- var o = JsonConvert.SerializeObject(c);
- await System.IO.File.WriteAllTextAsync(d, o);
- return Ok();
+ var r = await comicService.Bookmark(id, token, bookmark, Ip);
+ return r ? Ok("Success") : _403;
}
[HttpGet("{id}/{file}")]
public async Task Get(string id, string file, string token)
{
- var d = Helpers.SafePathCombine(ImageFolder, [id, file]);
- if (d == null) return StatusCode(403, new { message = "403 Denied" });
-
- var r = await rs.Get(d, token, Ip);
- if (!r) return StatusCode(403, new { message = "403 Denied" });
-
- return PhysicalFile(d, "image/jpeg", enableRangeProcessing: true);
+ var r = await comicService.Page(id, file, token, Ip);
+ return r ?? _403;
}
}
\ No newline at end of file
diff --git a/Abyss/Components/Controllers/Media/LiveController.cs b/Abyss/Components/Controllers/Media/LiveController.cs
index 7e5afcf..89b3102 100644
--- a/Abyss/Components/Controllers/Media/LiveController.cs
+++ b/Abyss/Components/Controllers/Media/LiveController.cs
@@ -1,4 +1,6 @@
using Abyss.Components.Services;
+using Abyss.Components.Services.Media;
+using Abyss.Components.Services.Misc;
using Abyss.Components.Static;
using Microsoft.AspNetCore.Mvc;
@@ -14,11 +16,11 @@ public class LiveController(ResourceService rs, ConfigureService config): BaseCo
public async Task AddLive(string id, string token, int owner)
{
var d = Helpers.SafePathCombine(LiveFolder, [id]);
- if (d == null) return StatusCode(403, new { message = "403 Denied" });
+ if (d == null) return _403;
bool r = await rs.Include(d, token, Ip, owner, "rw,--,--");
- return r ? Ok("Success") : BadRequest();
+ return r ? Ok("Success") : _400;
}
[HttpDelete("{id}")]
@@ -26,31 +28,25 @@ public class LiveController(ResourceService rs, ConfigureService config): BaseCo
{
var d = Helpers.SafePathCombine(LiveFolder, [id]);
if (d == null)
- return StatusCode(403, new { message = "403 Denied" });
+ return _403;
bool r = await rs.Exclude(d, token, Ip);
- return r ? Ok("Success") : BadRequest();
+ return r ? Ok("Success") : _400;
}
[HttpGet("{id}/{token}/{item}")]
public async Task GetLive(string id, string token, string item)
{
var d = Helpers.SafePathCombine(LiveFolder, [id, item]);
- var f = Helpers.SafePathCombine(LiveFolder, [id]);
- if (d == null || f == null) return BadRequest();
+ if (d == null) return _400;
// TODO: (History)ffplay does not add the m3u8 query parameter in ts requests, so special treatment is given to ts here
// TODO: (History)It should be pointed out that this implementation is not secure and should be modified in subsequent updates
// TODO: It's still not very elegant, but it's a bit better to some extent
- bool r = await rs.Valid(f, token, OperationType.Read, Ip);
- if(!r) return StatusCode(403, new { message = "403 Denied" });
-
- if(System.IO.File.Exists(d))
- return PhysicalFile(d, Helpers.GetContentType(d));
- else
- return NotFound();
+ var r = await rs.Get(d, token, Ip, Helpers.GetContentType(d));
+ return r ?? _404;
}
}
\ No newline at end of file
diff --git a/Abyss/Components/Controllers/Media/VideoController.cs b/Abyss/Components/Controllers/Media/VideoController.cs
index f2b889a..4c32d8e 100644
--- a/Abyss/Components/Controllers/Media/VideoController.cs
+++ b/Abyss/Components/Controllers/Media/VideoController.cs
@@ -1,218 +1,79 @@
-using Abyss.Components.Services;
+
+using Abyss.Components.Services.Media;
using Abyss.Components.Static;
-using Abyss.Components.Tools;
-using Abyss.Model;
using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.StaticFiles;
using Newtonsoft.Json;
namespace Abyss.Components.Controllers.Media;
-using Task = System.Threading.Tasks.Task;
-
[ApiController]
[Route("api/[controller]")]
-public class VideoController(ILogger logger, ResourceService rs, ConfigureService config)
+public class VideoController(VideoService videoService)
: BaseController
{
- private ILogger _logger = logger;
- public readonly string VideoFolder = Path.Combine(config.MediaRoot, "Videos");
-
+
[HttpPost("init")]
public async Task InitAsync(string token, string owner)
{
- var r = await rs.Initialize(VideoFolder, token, owner, Ip);
- if (r) return Ok(r);
- return StatusCode(403, new { message = "403 Denied" });
+ if (await videoService.Init(token, owner, Ip))
+ return Ok("Initialized Successfully");
+ return _403;
}
[HttpGet]
public async Task GetClass(string token)
{
- var r = (await rs.Query(VideoFolder, token, Ip))?.SortLikeWindows();
-
- if (r == null)
- return StatusCode(401, new { message = "Unauthorized" });
-
- return Ok(r);
+ var r = await videoService.GetClasses(token, Ip);
+ return r != null ? Ok(r) : _403;
}
[HttpGet("{klass}")]
public async Task QueryClass(string klass, string token)
{
- var d = Helpers.SafePathCombine(VideoFolder, klass);
- if (d == null) return StatusCode(403, new { message = "403 Denied" });
-
- var r = await rs.Query(d, token, Ip);
- if (r == null) return StatusCode(401, new { message = "Unauthorized" });
-
- return Ok(r);
+ var r = await videoService.QueryClass(klass, token, Ip);
+ return r != null ? Ok(r) : _403;
}
[HttpGet("{klass}/{id}")]
public async Task QueryVideo(string klass, string id, string token)
{
- var d = Helpers.SafePathCombine(VideoFolder, [klass, id, "summary.json"]);
- if (d == null) return StatusCode(403, new { message = "403 Denied" });
-
- var r = await rs.Get(d, token, Ip);
- if (!r) return StatusCode(403, new { message = "403 Denied" });
-
- return Ok(await System.IO.File.ReadAllTextAsync(d));
+ var r = await videoService.QueryVideo(klass, id, token, Ip);
+ return r != null ? Ok(r) : _403;
}
[HttpPost("{klass}/bulkquery")]
public async Task QueryBulk([FromQuery] string token, [FromBody] string[] id,
[FromRoute] string klass)
{
- var db = id.Select(x => Helpers.SafePathCombine(VideoFolder, [klass, x, "summary.json"])).ToArray();
- if (db.Any(x => x == null))
- return BadRequest();
-
- if (!await rs.GetAll(db!, token, Ip))
- return StatusCode(403, new { message = "403 Denied" });
-
- var rc = db.Select(x => System.IO.File.ReadAllTextAsync(x!)).ToArray();
- string[] rcs = await Task.WhenAll(rc);
- var rjs = rcs.Select(JsonConvert.DeserializeObject