mirror of
https://github.com/Kareadita/Kavita.git
synced 2025-07-31 14:33:50 -04:00
* Adding automated docker version tag for stable releases - Added set to parse version to x.x.x format for tag. (This is the same way we parse for sentry release maps) - Added additional build and push step for docker with parse version as tag. * Bugfix/reader progress (#435) Fixed: Fixed an issue where marking a series as Unread when the DB gets skewed with duplicate progress rows for that item, would break. Now we cleanup any extra rows we see during the operation. * Feature/manual db backup (#437) Added: New button in manage server to manually create a backup of DB (Fixes Add on demand DB backup from Admin Dashboard #322) * Performance/cache epub (#438) Changed: (Performance) Added the ability for epubs to cache, allowing faster page load for users with network mounted storage. (Fixes Investigate caching epubs (benefit for network mounted users) #433 ) * Ignore Mac metadata hidden files ._* (#443) * Implemented the ability to completely ignore all MacOS ._ files. They are ignored for all I/O operations (on all OSes) * Filtering First Pass (#442) # Added - Added: Added "In Progress" view to see everything you are currently reading - Added: Added the ability to filter series based on format from "In Progress", "Recently Added", "Library Detail" pages. - Added: Added total items to the above pages to showcase total series within Kavita ============================== * Added filtering to recently added * Cleaned up the documentation on the APIs and removed params no longer needed. * Implemented Filtering on library detail, in progress, and recently added for format. UI is non-final. * Moved filtering to an expander panel * Cleaned up filtering UI a bit * Cleaned up some code and added titles on touched pages * Fixed recently added not re-rendering page * Removed commented out code * Version bump * Added an animation to the filtering section * Stashing changes, needing to switch lazy loading libraries out due to current version not trigging on dom mutation events * Finally fixed all the lazy loading issues and made it so pagination works without reloading the whole page. * Supress max page error on bookmark api and just adjust the pages for the user. (#445) # Changed - Changed: Suppress max page error on bookmark api and just adjust the pages for the user. * Filtering Bugs (#447) # Fixed - Fixed: Fixed an issue with filtering, after applying a filter, the cards on screen did not update with the correct information - Fixed: Pagination is now slighlty smaller (only 8 pages) as on mobile, it was cutting off screen. # Changed - Changed: During library scan and series updates, Series names for Epubs will now trim excess white space =============================================== * Fixed issue where some formats could get returned with another format filter. * Filtering was not properly flushing DOM on filter change, updated trackbyidentity to account for filter * One more fix for the filtering bug * Made pagination UI slightly smaller to better fit on mobile phones. Trim() series names for Epub files and Trim() on series update for appropriate fields. * Removed a no longer needed animation. * Refactored logs to use a logs/ folder and also roll over after 10MB. … (#448) # Changed - Changed: Log files now roll (kavita, kavita1, etc) up to 5 files, each with a max of 10MB each. After all 5 files fill up, they will roll over. (Closes #446 ) ============================= * Refactored logs to use a logs/ folder and also roll over after 10MB. A maximum of 5 logs will persist (50MB of log data). * Updated entrypoint to accommodate rolling logs Co-authored-by: Chris Plaatjes <kizaing@gmail.com> * Bugfix/in progress (#452) # Fixed - Fixed: Fixed an issue in In Progress where it would not pull the series with correct pagination due to the unique situation with the query. All series that are in progress should now return. ============================ * Fixed In Progress not showing for all series due to pagination bug * Version bump * Adding version bump workflow * Updating version-bump.yml * Fixed the In progress API returning back series that didn't belong (#453) * Fixed the In progress API returning back series that had another users progress on them. Added SplitQuery which speeds up query significantly. * Try out putting PR body into notification * Feature/version bump test (#449) ## Changes - Reconfigured Github workflow for better visibility - Added automated version bump on merge push to Develop branch * Updating workflow * Workflow fixes * Updating workflow, removing branch creation * Feature/version bump (#456) ** Changes - Workflow changes * Feature/version bump (#457) ## Changes - Unprotected dev branch - Added automated version bump on pushes to develop (merge PRs) * Bump versions by dotnet-bump-version. * Consolidating Stable Docker Tags ## Changes - Combined stable and version tags into 1 task for workflow efficency * Bump versions by dotnet-bump-version. * Feature/docker cleanup (#459) ## Changes - Cleaned up and fixed old docker files * Bump versions by dotnet-bump-version. * Update Notifier (#464) # Added - Added: Ability to check for updates (stable-only) and be notified with a changelog. This is a first pass implementation. - Added: Ability to use SignalR within Kavita (websockets) ===================================== * (some debug code present). Implemented the ability to check and log if the server is up to date or not. * Fixed a bug for dark mode where anchor buttons wouldn't have the correct font color. Suppress filter/sort button if there is no filters to show. Debug: Active indicators for users currently on your server. Refactored code to send update notification only to admins. Admins now get a popup where they can open the Github release (docker users can just close). * Fixed an issue where getLibraryNames on first load would call for as many cards there was on the screen. Now we call it much earlier and the data is cached faster. * Fixed a dark mode bug from previous commit * Release notes is now rendered markdown * Implemented the ability to check for an update ad-hoc. Response will come via websocket to all admins. * Fixed a missing padding * Cleanup, added some temp code to carousel * Cleaned up old stat stuff from dev config and added debug only flow for checking for update * Misc cleanup * Added readonly to one variable * Fixed In Progress not showing for all series due to pagination bug * Fixed the In progress API returning back series that had another users progress on them. Added SplitQuery which speeds up query significantly. * SplitQuery in GetRecentlyAdded for a speed increase on API. Fixed the logic on VersionUpdaterService to properly send on non-dev systems. Disable the check button once it's triggered once since the API does a task, so it can't return anything. * Cleaned up the admin actions to be more friendly on mobile. * Cleaned up the message as we wait for SingalR to notify the user * more textual changes * Code smells * Bump versions by dotnet-bump-version. * Bookmarking Pages within the Reader (#469) # Added - Added: Added the ability to bookmark certain pages within the manga (image) reader and later download them from the series context menu. # Fixed - Fixed: Fixed an issue where after adding a new folder to an existing library, a scan wouldn't be kicked off - Fixed: In some cases, after clicking the background of a modal, the modal would close, but state wouldn't be handled as if cancel was pushed # Changed - Changed: Admin contextual actions on cards will now be separated by a line to help differentiate. - Changed: Performance enhancement on an API used before reading # Dev - Bumped dependencies to latest versions ============================================= * Bumped versions of dependencies and refactored bookmark to progress. * Refactored method names in UI from bookmark to progress to prepare for new bookmark entity * Basic code is done, user can now bookmark a page (currently image reader only). * Comments and pipes * Some accessibility for new bookmark button * Fixed up the APIs to work correctly, added a new modal to quickly explore bookmarks (not implemented, not final). * Cleanup on the UI side to get the modal to look decent * Added dismissed handlers for modals where appropriate * Refactored UI to only show number of bookmarks across files to simplify delivery. Admin actionables are now separated by hr vs non-admin actions. * Basic API implemented, now to implement the ability to actually extract files. * Implemented the ability to download bookmarks. * Fixed a bug where adding a new folder to an existing library would not trigger a scan library task. * Fixed an issue that could cause bookmarked pages to get copied out of order. * Added handler from series-card component * Bump versions by dotnet-bump-version. * Scan Issues (#470) * Fixed an oversight where unique file extensions for KavitaStats wouldn't ignore case. * Fixed an issue where series were getting removed then re-added due to bad logic when comparing if the series from disk matched the series in DB based on format. * Bump versions by dotnet-bump-version. * Updating docker workflow (#467) * Updating docker action * adding version to message * adding way to get PR title and body * Adding input pass to workflows Workflow dispatches may not get push header info. Switching logic to pass needed title and body info through just in case. * Bump versions by dotnet-bump-version. * Updating Docker Workflow (#471) * Updating docker action * adding version to message * adding way to get PR title and body * Adding input pass to workflows Workflow dispatches may not get push header info. Switching logic to pass needed title and body info through just in case. * adding token The description on this action is awful, it didn't mention needing a token. I found this solution from the repo's issues * Bump versions by dotnet-bump-version. * Updating discord workflow (#472) * Updating docker action * adding version to message * adding way to get PR title and body * Adding input pass to workflows Workflow dispatches may not get push header info. Switching logic to pass needed title and body info through just in case. * adding token The description on this action is awful, it didn't mention needing a token. I found this solution from the repo's issues * parsing pr body * Bump versions by dotnet-bump-version. * Updating discord workflow (#474) * Updating docker action * adding version to message * adding way to get PR title and body * Adding input pass to workflows Workflow dispatches may not get push header info. Switching logic to pass needed title and body info through just in case. * adding token The description on this action is awful, it didn't mention needing a token. I found this solution from the repo's issues * parsing pr body * Updating parsing * Bump versions by dotnet-bump-version. * Updating discord workflow (#475) * Updating docker action * adding version to message * adding way to get PR title and body * Adding input pass to workflows Workflow dispatches may not get push header info. Switching logic to pass needed title and body info through just in case. * adding token The description on this action is awful, it didn't mention needing a token. I found this solution from the repo's issues * parsing pr body * Updating parsing * Updating docker workflow * Bump versions by dotnet-bump-version. * Updating discord workflow (#477) ## Changes - Changed github action to allow for discord notification to use markdown styling ## Added - Added version to discord notification - Added ability to use PR body instead of commit body for discord notification description. * Bump versions by dotnet-bump-version. * Updating discord action (#478) ## Changes - Changed github action to allow for discord notification to use markdown styling ## Added - Added version to discord notification - Added ability to use PR body instead of commit body for discord notification description. * Bump versions by dotnet-bump-version. * Updating discord action (#479) * Updating docker action * adding version to message * adding way to get PR title and body * Adding input pass to workflows Workflow dispatches may not get push header info. Switching logic to pass needed title and body info through just in case. * adding token The description on this action is awful, it didn't mention needing a token. I found this solution from the repo's issues * parsing pr body * Updating parsing * Updating docker workflow * Reverting back to default variables * fixing syntax error * removing heading syntax * Bump versions by dotnet-bump-version. * Update discord action (#480) * Updating docker action * adding version to message * adding way to get PR title and body * Adding input pass to workflows Workflow dispatches may not get push header info. Switching logic to pass needed title and body info through just in case. * adding token The description on this action is awful, it didn't mention needing a token. I found this solution from the repo's issues * parsing pr body * Updating parsing * Updating docker workflow * Reverting back to default variables * fixing syntax error * removing heading syntax * updating parse * Bump versions by dotnet-bump-version. * Update discord action (#481) * Updating docker action * adding version to message * adding way to get PR title and body * Adding input pass to workflows Workflow dispatches may not get push header info. Switching logic to pass needed title and body info through just in case. * adding token The description on this action is awful, it didn't mention needing a token. I found this solution from the repo's issues * parsing pr body * Updating parsing * Updating docker workflow * Reverting back to default variables * fixing syntax error * removing heading syntax * updating parse * Updating parsing * Bump versions by dotnet-bump-version. * Update discord action (#482) * Updating docker action * adding version to message * adding way to get PR title and body * Adding input pass to workflows Workflow dispatches may not get push header info. Switching logic to pass needed title and body info through just in case. * adding token The description on this action is awful, it didn't mention needing a token. I found this solution from the repo's issues * parsing pr body * Updating parsing * Updating docker workflow * Reverting back to default variables * fixing syntax error * removing heading syntax * updating parse * Updating parsing * Updating docker workflow * Bump versions by dotnet-bump-version. * Download Refactor (#483) # Added - New: Cards when processing a download shows a spinner for the progress of the download # Changed - Changed: Downloads now always take the backend filename and are streamed in a more optimal manner, reducing the javascript processing that was needed previously. ================================== * Started refactor of downloader to be more UX friendly and much faster. * Completed refactor of Volume download to use a new mechanism. Downloads are streamed over and filename used exclusively from header. Backend has additional DB calls to get the Series Name information to make filenames nice. * download service has been updated so all download functions use new event based observable. Duplicates code for downloading, but much cleaner and faster. * Small code cleanup * Bump versions by dotnet-bump-version. * Update discord action (#486) * Updating docker action * adding version to message * adding way to get PR title and body * Adding input pass to workflows Workflow dispatches may not get push header info. Switching logic to pass needed title and body info through just in case. * adding token The description on this action is awful, it didn't mention needing a token. I found this solution from the repo's issues * parsing pr body * Updating parsing * Updating docker workflow * Reverting back to default variables * fixing syntax error * removing heading syntax * updating parse * Updating parsing * Updating docker workflow * trying to remove newline * Bump versions by dotnet-bump-version. * Update discord action (#487) * Updating docker action * adding version to message * adding way to get PR title and body * Adding input pass to workflows Workflow dispatches may not get push header info. Switching logic to pass needed title and body info through just in case. * adding token The description on this action is awful, it didn't mention needing a token. I found this solution from the repo's issues * parsing pr body * Updating parsing * Updating docker workflow * Reverting back to default variables * fixing syntax error * removing heading syntax * updating parse * Updating parsing * Updating docker workflow * trying to remove newline * updating parsing * Replacement in parsing * Update sonar-scan.yml * Bump versions by dotnet-bump-version. * Feature/new discord action (#489) * Updating docker action * adding version to message * adding way to get PR title and body * Adding input pass to workflows Workflow dispatches may not get push header info. Switching logic to pass needed title and body info through just in case. * adding token The description on this action is awful, it didn't mention needing a token. I found this solution from the repo's issues * parsing pr body * Updating parsing * Updating docker workflow * Reverting back to default variables * fixing syntax error * removing heading syntax * updating parse * Updating parsing * Updating docker workflow * trying to remove newline * updating parsing * Replacement in parsing * Update sonar-scan.yml * testing passing pr body via artifact * Updating syntax * Bump versions by dotnet-bump-version. * Update Discord Action (#490) * Updating docker action * adding version to message * adding way to get PR title and body * Adding input pass to workflows Workflow dispatches may not get push header info. Switching logic to pass needed title and body info through just in case. * adding token The description on this action is awful, it didn't mention needing a token. I found this solution from the repo's issues * parsing pr body * Updating parsing * Updating docker workflow * Reverting back to default variables * fixing syntax error * removing heading syntax * updating parse * Updating parsing * Updating docker workflow * trying to remove newline * updating parsing * Replacement in parsing * Update sonar-scan.yml * testing passing pr body via artifact * Updating action version * syntax fix * Bump versions by dotnet-bump-version. * Updating discord action (#492) * Updating docker action * adding version to message * adding way to get PR title and body * Adding input pass to workflows Workflow dispatches may not get push header info. Switching logic to pass needed title and body info through just in case. * adding token The description on this action is awful, it didn't mention needing a token. I found this solution from the repo's issues * parsing pr body * Updating parsing * Updating docker workflow * Reverting back to default variables * fixing syntax error * removing heading syntax * updating parse * Updating parsing * Updating docker workflow * trying to remove newline * updating parsing * Replacement in parsing * Update sonar-scan.yml * testing passing pr body via artifact * Updating action version * syntax fix * Updating write * Bump versions by dotnet-bump-version. * Update discord action (#493) * Updating docker action * adding version to message * adding way to get PR title and body * Adding input pass to workflows Workflow dispatches may not get push header info. Switching logic to pass needed title and body info through just in case. * adding token The description on this action is awful, it didn't mention needing a token. I found this solution from the repo's issues * parsing pr body * Updating parsing * Updating docker workflow * Reverting back to default variables * fixing syntax error * removing heading syntax * updating parse * Updating parsing * Updating docker workflow * trying to remove newline * updating parsing * Replacement in parsing * Update sonar-scan.yml * testing passing pr body via artifact * Updating action version * syntax fix * Updating write * Updating write * Bump versions by dotnet-bump-version. * Updating discord action (#494) * Updating docker action * adding version to message * adding way to get PR title and body * Adding input pass to workflows Workflow dispatches may not get push header info. Switching logic to pass needed title and body info through just in case. * adding token The description on this action is awful, it didn't mention needing a token. I found this solution from the repo's issues * parsing pr body * Updating parsing * Updating docker workflow * Reverting back to default variables * fixing syntax error * removing heading syntax * updating parse * Updating parsing * Updating docker workflow * trying to remove newline * updating parsing * Replacement in parsing * Update sonar-scan.yml * testing passing pr body via artifact * Updating action version * syntax fix * Updating write * Updating write * testing artifact * consolidating nightly-docker into main workflow * Bump versions by dotnet-bump-version. * Updating docker workflows (#495) * Updating docker action * adding version to message * adding way to get PR title and body * Adding input pass to workflows Workflow dispatches may not get push header info. Switching logic to pass needed title and body info through just in case. * adding token The description on this action is awful, it didn't mention needing a token. I found this solution from the repo's issues * parsing pr body * Updating parsing * Updating docker workflow * Reverting back to default variables * fixing syntax error * removing heading syntax * updating parse * Updating parsing * Updating docker workflow * trying to remove newline * updating parsing * Replacement in parsing * Update sonar-scan.yml * testing passing pr body via artifact * Updating action version * syntax fix * Updating write * Updating write * testing artifact * consolidating nightly-docker into main workflow * pulling stable into main * Bump versions by dotnet-bump-version. * Custom Cover Images (#499) * Added some documentation. Removed Require Admin Role from Search Tags. Added Summary to be updated on UpdateTag. * Added Swagger xml doc generation to beef up the documentation. Started adding xml comments to the APIs. This is a needed, slow task for upcoming Plugins system. * Implemented the ability to upload a custom series image to override the existing cover image. Refactored some code out to use ImageService and added more documentation * When a page cache fails, delete cache directory so user can try to reload. * Implemented the ability to lock a series cover image such that after user uploads something, it wont get refreshed by Kavita. * Implemented the ability to reset cover image for series by unlocking * Kick off a series refresh after a cover is unlocked. * Ability to press enter to load a url * Ability to reset selection * Cleaned up cover chooser such that reset is nicer, errors inform user to use file upload, series edit modal now doesn't use scrollable body. Mobile tweaks. CoverImageLocked is now sent to the UI. * More css changes to look better * When no bookmarks, don't show both markups * Fixed issues where images wouldn't refresh after cover image was changed. * Implemented the ability to change the cover images for collection tags. * Added property and API for chapter cover image update * Added UI code to prepare for updating cover image for chapters. need to rearrange components * Moved a ton of code around to separate card related screens into their own module. * Implemented the ability to update a chapter/volume cover image * Refactored action for volume to say edit to reflect modal action * Fixed issue where after editing chapter cover image, the underlying card wouldn't update * Fixed an issue where we were passing volumeId to the reset chapter lock. Changed some logic in volume cover image generation. * Automatically apply when you hit reset cover image * Bump versions by dotnet-bump-version. * Bump versions by dotnet-bump-version. * Bump versions by dotnet-bump-version. * Bump versions by dotnet-bump-version. * Collection Redesign (#500) * Setup UI for the collection redesign. * Implemented collection details page * Bump versions by dotnet-bump-version. * Close any open modals when a route change occurs (#501) * Bump versions by dotnet-bump-version. * Added manga/book routes back in (#503) * Bump versions by dotnet-bump-version. * Misc Bugfixes and Enhancements (#507) * Removed some extra spam for the console * Implemented the code to update RowVersion, which is our concurrency check * Fixed a critical issue where more than one bookmark could occur for a given chapter due to a race condition. Now we use concurrency checks and we also gracefully allow more than one row, by only grabbing first. * Cleaned up the logic for IHasConcurencyToken and updated the setters to be private. * Lots of comments and when deleting a library, remove any user progress items for which chapters don't exist. * When deleting a Series, cleanup user progress rows. * Now after a scan of library, if a series is removed, collection tags are pruned as well if there are no longer any series bound to it. * Updated the image on the Readme to show a better picture * Small code cleanup to remove null check modifier as I check for null just before then * Fixed images loading multiple times due to using function in binding with random. You can now click chapter images to read that chapter specifically. * Fixed cards being different sizes when read vs unread * Moved over Robbie's workflow changes from notifier. Commented out activity indicators as that is not shipping with this release. * Remove code that isn't needed * Reverted GA * Changed GA to trigger only when HEAD is updated * Bump versions by dotnet-bump-version. * Feature/bookmark feedback (#508) * ImageService had a stream reset before writting out to array. Added logging statment for updating series metadata. Removed ConcurencyCheck due to bad update issue for CollectionTag. * Added a new screen which lets you quickly see all your bookmarks for a given user. * Built user bookmark page in user settings. Moved user settings to it's own lazy loaded module. Removed unneded debouncing from downloader and just used throttleTime instead. * Removed a not-yet implemented tab from series modal * Fixed a bug in clear bookmarks and adjusted icons within anchors to have proper styling * Bump versions by dotnet-bump-version. * Misc Bugs (#510) * Don't show bookmark context actionable for books * Fixed an issue where when adding a collection tag, the logic wouldn't assume the tag already existed in DB and would reset it. * After editing a series on library page, ensure we refresh collection tags. * Reload recently added section after changing a series * Moved all Stat logger events to Debug * Refactored scroll logic into a single service to keep the code consistent. * Bump versions by dotnet-bump-version. * Bump versions by dotnet-bump-version. * Update Notification Refactor (#511) * Replaced profile links to anchors so we can open in new tab if we like * Refactored how update checking works. We now explicitly check and send back on the same API. We have a weekly job that will push an update to the user. * Implemented a changelog tab * Ported over a GA fix for using ' in PR bodies. * Don't check cert for Github * Bump versions by dotnet-bump-version. * Bugfix/release cleanup (#512) * Lots of cleanup on the warnings in the solution. Deprecated IsLastWriteLessThan and made a new method HasFileBeenModifiedSince. * Added some tests for the new extension method. * Changed filter import to use correct import * Scan Series now uses Refresh Metadata for Series, rather than library one. * Fixed an issue where cover generation wasn't properly taking forced update into consideration. Removed a case of cover generation for no reason. * Fixed series downloads not triggering backend call * Bump versions by dotnet-bump-version. * Bump versions by dotnet-bump-version. * Bump versions by dotnet-bump-version. * Parsing out cover images (#513) - Fixing workflow - Adding test case * Bump versions by dotnet-bump-version. * Prevent cover images showing as a series (#514) * Parsing out cover images - Fixing workflow - Adding test case * Fixing workflow * Bump versions by dotnet-bump-version. * v0.4.4 polishing (#515) * Fixed a bad comparision between JsonElement and null. * Removed console.logs. Fixed bug in edit collection detail page where summary wouldn't update after editing it. * Removed a UI package that is no longer used. Fixed an issue where MarkVolumeAsUnread was using an old set of APIs and now uses the new, faster API. * Bump versions by dotnet-bump-version. * Cover generation issue on first scan flow (#517) * Cover generation issue on first scan flow - Fixed logic around whether a chapter cover image should be generated. New logic adds grouping priority, changes an AND to an OR and adds an additional check to see if the cover image has been lock (custom image uploaded) * Sonar update * Refactored out the cover image updating logic to a new call (ShouldUpdateCoverImage) and updated ONLY chapters. Added a blank slate unit test to build out conditions. * Fixed up unit case * Fixed some logic on when to update a cover image * Fixed an issue where 1) we were refreshing metadata anytime we adjusted cover image on a series and 2) Cover generation wasn't properly being handled on first run. * Cleaned up the code for when a cover image change needs to trigger a refresh metadata task Co-authored-by: Joseph Milazzo <joseph.v.milazzo@gmail.com> * Update issue templates * Bump versions by dotnet-bump-version. * Bump versions by dotnet-bump-version. * Version release (#519) * Bump versions by dotnet-bump-version. Co-authored-by: Robbie Davis <robbie@therobbiedavis.com> Co-authored-by: Chris Plaatjes <kizaing@gmail.com>
444 lines
27 KiB
C#
444 lines
27 KiB
C#
using System.Collections.Generic;
|
|
using API.Entities.Enums;
|
|
using API.Parser;
|
|
using Xunit;
|
|
using Xunit.Abstractions;
|
|
|
|
namespace API.Tests.Parser
|
|
{
|
|
public class MangaParserTests
|
|
{
|
|
private readonly ITestOutputHelper _testOutputHelper;
|
|
|
|
public MangaParserTests(ITestOutputHelper testOutputHelper)
|
|
{
|
|
_testOutputHelper = testOutputHelper;
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("Killing Bites Vol. 0001 Ch. 0001 - Galactica Scanlations (gb)", "1")]
|
|
[InlineData("My Girlfriend Is Shobitch v01 - ch. 09 - pg. 008.png", "1")]
|
|
[InlineData("Historys Strongest Disciple Kenichi_v11_c90-98.zip", "11")]
|
|
[InlineData("B_Gata_H_Kei_v01[SlowManga&OverloadScans]", "1")]
|
|
[InlineData("BTOOOM! v01 (2013) (Digital) (Shadowcat-Empire)", "1")]
|
|
[InlineData("Gokukoku no Brynhildr - c001-008 (v01) [TrinityBAKumA]", "1")]
|
|
[InlineData("Dance in the Vampire Bund v16-17 (Digital) (NiceDragon)", "16-17")]
|
|
[InlineData("Akame ga KILL! ZERO v01 (2016) (Digital) (LuCaZ).cbz", "1")]
|
|
[InlineData("v001", "1")]
|
|
[InlineData("Vol 1", "1")]
|
|
[InlineData("No Volume", "0")]
|
|
[InlineData("U12 (Under 12) Vol. 0001 Ch. 0001 - Reiwa Scans (gb)", "1")]
|
|
[InlineData("[Suihei Kiki]_Kasumi_Otoko_no_Ko_[Taruby]_v1.1.zip", "1")]
|
|
[InlineData("Tonikaku Cawaii [Volume 11].cbz", "11")]
|
|
[InlineData("[WS]_Ichiban_Ushiro_no_Daimaou_v02_ch10.zip", "2")]
|
|
[InlineData("[xPearse] Kyochuu Rettou Volume 1 [English] [Manga] [Volume Scans]", "1")]
|
|
[InlineData("Tower Of God S01 014 (CBT) (digital).cbz", "1")]
|
|
[InlineData("Tenjou_Tenge_v17_c100[MT].zip", "17")]
|
|
[InlineData("Shimoneta - Manmaru Hen - c001-006 (v01) [Various].zip", "1")]
|
|
[InlineData("Future Diary v02 (2009) (Digital) (Viz).cbz", "2")]
|
|
[InlineData("Mujaki no Rakuen Vol12 ch76", "12")]
|
|
[InlineData("Ichinensei_ni_Nacchattara_v02_ch11_[Taruby]_v1.3.zip", "2")]
|
|
[InlineData("Dorohedoro v01 (2010) (Digital) (LostNerevarine-Empire).cbz", "1")]
|
|
[InlineData("Dorohedoro v11 (2013) (Digital) (LostNerevarine-Empire).cbz", "11")]
|
|
[InlineData("Dorohedoro v12 (2013) (Digital) (LostNerevarine-Empire).cbz", "12")]
|
|
[InlineData("Yumekui_Merry_v01_c01[Bakayarou-Kuu].rar", "1")]
|
|
[InlineData("Yumekui-Merry_DKThias_Chapter11v2.zip", "0")]
|
|
[InlineData("Itoshi no Karin - c001-006x1 (v01) [Renzokusei Scans]", "1")]
|
|
[InlineData("Kedouin Makoto - Corpse Party Musume, Chapter 12", "0")]
|
|
[InlineData("VanDread-v01-c001[MD].zip", "1")]
|
|
[InlineData("Ichiban_Ushiro_no_Daimaou_v04_ch27_[VISCANS].zip", "4")]
|
|
[InlineData("Mob Psycho 100 v02 (2019) (Digital) (Shizu).cbz", "2")]
|
|
[InlineData("Kodomo no Jikan vol. 1.cbz", "1")]
|
|
[InlineData("Kodomo no Jikan vol. 10.cbz", "10")]
|
|
[InlineData("Kedouin Makoto - Corpse Party Musume, Chapter 12 [Dametrans][v2]", "0")]
|
|
[InlineData("Vagabond_v03", "3")]
|
|
[InlineData("Mujaki No Rakune Volume 10.cbz", "10")]
|
|
[InlineData("Umineko no Naku Koro ni - Episode 3 - Banquet of the Golden Witch #02.cbz", "0")]
|
|
[InlineData("Volume 12 - Janken Boy is Coming!.cbz", "12")]
|
|
[InlineData("[dmntsf.net] One Piece - Digital Colored Comics Vol. 20 Ch. 177 - 30 Million vs 81 Million.cbz", "20")]
|
|
[InlineData("Gantz.V26.cbz", "26")]
|
|
[InlineData("NEEDLESS_Vol.4_-Simeon_6_v2[SugoiSugoi].rar", "4")]
|
|
[InlineData("[Hidoi]_Amaenaideyo_MS_vol01_chp02.rar", "1")]
|
|
[InlineData("NEEDLESS_Vol.4_-_Simeon_6_v2_[SugoiSugoi].rar", "4")]
|
|
[InlineData("Okusama wa Shougakusei c003 (v01) [bokuwaNEET]", "1")]
|
|
[InlineData("Sword Art Online Vol 10 - Alicization Running [Yen Press] [LuCaZ] {r2}.epub", "10")]
|
|
[InlineData("Noblesse - Episode 406 (52 Pages).7z", "0")]
|
|
[InlineData("X-Men v1 #201 (September 2007).cbz", "1")]
|
|
[InlineData("Hentai Ouji to Warawanai Neko. - Vol. 06 Ch. 034.5", "6")]
|
|
public void ParseVolumeTest(string filename, string expected)
|
|
{
|
|
Assert.Equal(expected, API.Parser.Parser.ParseVolume(filename));
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("Killing Bites Vol. 0001 Ch. 0001 - Galactica Scanlations (gb)", "Killing Bites")]
|
|
[InlineData("My Girlfriend Is Shobitch v01 - ch. 09 - pg. 008.png", "My Girlfriend Is Shobitch")]
|
|
[InlineData("Historys Strongest Disciple Kenichi_v11_c90-98.zip", "Historys Strongest Disciple Kenichi")]
|
|
[InlineData("B_Gata_H_Kei_v01[SlowManga&OverloadScans]", "B Gata H Kei")]
|
|
[InlineData("BTOOOM! v01 (2013) (Digital) (Shadowcat-Empire)", "BTOOOM!")]
|
|
[InlineData("Gokukoku no Brynhildr - c001-008 (v01) [TrinityBAKumA]", "Gokukoku no Brynhildr")]
|
|
[InlineData("Dance in the Vampire Bund v16-17 (Digital) (NiceDragon)", "Dance in the Vampire Bund")]
|
|
[InlineData("v001", "")]
|
|
[InlineData("U12 (Under 12) Vol. 0001 Ch. 0001 - Reiwa Scans (gb)", "U12")]
|
|
[InlineData("Akame ga KILL! ZERO (2016-2019) (Digital) (LuCaZ)", "Akame ga KILL! ZERO")]
|
|
[InlineData("APOSIMZ 017 (2018) (Digital) (danke-Empire).cbz", "APOSIMZ")]
|
|
[InlineData("Akiiro Bousou Biyori - 01.jpg", "Akiiro Bousou Biyori")]
|
|
[InlineData("Beelzebub_172_RHS.zip", "Beelzebub")]
|
|
[InlineData("Dr. STONE 136 (2020) (Digital) (LuCaZ).cbz", "Dr. STONE")]
|
|
[InlineData("Cynthia the Mission 29.rar", "Cynthia the Mission")]
|
|
[InlineData("Darling in the FranXX - Volume 01.cbz", "Darling in the FranXX")]
|
|
[InlineData("Darwin's Game - Volume 14 (F).cbz", "Darwin's Game")]
|
|
[InlineData("[BAA]_Darker_than_Black_c7.zip", "Darker than Black")]
|
|
[InlineData("Kedouin Makoto - Corpse Party Musume, Chapter 19 [Dametrans].zip", "Kedouin Makoto - Corpse Party Musume")]
|
|
[InlineData("Kedouin Makoto - Corpse Party Musume, Chapter 01", "Kedouin Makoto - Corpse Party Musume")]
|
|
[InlineData("[WS]_Ichiban_Ushiro_no_Daimaou_v02_ch10.zip", "Ichiban Ushiro no Daimaou")]
|
|
[InlineData("[xPearse] Kyochuu Rettou Volume 1 [English] [Manga] [Volume Scans]", "Kyochuu Rettou")]
|
|
[InlineData("Loose_Relation_Between_Wizard_and_Apprentice_c07[AN].zip", "Loose Relation Between Wizard and Apprentice")]
|
|
[InlineData("Tower Of God S01 014 (CBT) (digital).cbz", "Tower Of God")]
|
|
[InlineData("Tenjou_Tenge_c106[MT].zip", "Tenjou Tenge")]
|
|
[InlineData("Tenjou_Tenge_v17_c100[MT].zip", "Tenjou Tenge")]
|
|
[InlineData("Shimoneta - Manmaru Hen - c001-006 (v01) [Various].zip", "Shimoneta - Manmaru Hen")]
|
|
[InlineData("Future Diary v02 (2009) (Digital) (Viz).cbz", "Future Diary")]
|
|
[InlineData("Tonikaku Cawaii [Volume 11].cbz", "Tonikaku Cawaii")]
|
|
[InlineData("Mujaki no Rakuen Vol12 ch76", "Mujaki no Rakuen")]
|
|
[InlineData("Knights of Sidonia c000 (S2 LE BD Omake - BLAME!) [Habanero Scans]", "Knights of Sidonia")]
|
|
[InlineData("Vol 1.cbz", "")]
|
|
[InlineData("Ichinensei_ni_Nacchattara_v01_ch01_[Taruby]_v1.1.zip", "Ichinensei ni Nacchattara")]
|
|
[InlineData("Chrno_Crusade_Dragon_Age_All_Stars[AS].zip", "")]
|
|
[InlineData("Ichiban_Ushiro_no_Daimaou_v04_ch34_[VISCANS].zip", "Ichiban Ushiro no Daimaou")]
|
|
[InlineData("Rent a Girlfriend v01.cbr", "Rent a Girlfriend")]
|
|
[InlineData("Yumekui_Merry_v01_c01[Bakayarou-Kuu].rar", "Yumekui Merry")]
|
|
[InlineData("Itoshi no Karin - c001-006x1 (v01) [Renzokusei Scans]", "Itoshi no Karin")]
|
|
[InlineData("Tonikaku Kawaii Vol-1 (Ch 01-08)", "Tonikaku Kawaii")]
|
|
[InlineData("Tonikaku Kawaii (Ch 59-67) (Ongoing)", "Tonikaku Kawaii")]
|
|
[InlineData("7thGARDEN v01 (2016) (Digital) (danke).cbz", "7thGARDEN")]
|
|
[InlineData("Kedouin Makoto - Corpse Party Musume, Chapter 12", "Kedouin Makoto - Corpse Party Musume")]
|
|
[InlineData("Kedouin Makoto - Corpse Party Musume, Chapter 09", "Kedouin Makoto - Corpse Party Musume")]
|
|
[InlineData("Goblin Slayer Side Story - Year One 025.5", "Goblin Slayer Side Story - Year One")]
|
|
[InlineData("Goblin Slayer - Brand New Day 006.5 (2019) (Digital) (danke-Empire)", "Goblin Slayer - Brand New Day")]
|
|
[InlineData("Kedouin Makoto - Corpse Party Musume, Chapter 01 [Dametrans][v2]", "Kedouin Makoto - Corpse Party Musume")]
|
|
[InlineData("Vagabond_v03", "Vagabond")]
|
|
[InlineData("[AN] Mahoutsukai to Deshi no Futekisetsu na Kankei Chp. 1", "Mahoutsukai to Deshi no Futekisetsu na Kankei")]
|
|
[InlineData("Beelzebub_Side_Story_02_RHS.zip", "Beelzebub Side Story")]
|
|
[InlineData("[BAA]_Darker_than_Black_Omake-1.zip", "Darker than Black")]
|
|
[InlineData("Baketeriya ch01-05.zip", "Baketeriya")]
|
|
[InlineData("[PROzess]Kimi_ha_midara_na_Boku_no_Joou_-_Ch01", "Kimi ha midara na Boku no Joou")]
|
|
[InlineData("[SugoiSugoi]_NEEDLESS_Vol.2_-_Disk_The_Informant_5_[ENG].rar", "NEEDLESS")]
|
|
[InlineData("Fullmetal Alchemist chapters 101-108.cbz", "Fullmetal Alchemist")]
|
|
[InlineData("To Love Ru v09 Uncensored (Ch.071-079).cbz", "To Love Ru")]
|
|
[InlineData("[dmntsf.net] One Piece - Digital Colored Comics Vol. 20 Ch. 177 - 30 Million vs 81 Million.cbz", "One Piece - Digital Colored Comics")]
|
|
//[InlineData("Corpse Party -The Anthology- Sachikos game of love Hysteric Birthday 2U Extra Chapter", "Corpse Party -The Anthology- Sachikos game of love Hysteric Birthday 2U")]
|
|
[InlineData("Corpse Party -The Anthology- Sachikos game of love Hysteric Birthday 2U Chapter 01", "Corpse Party -The Anthology- Sachikos game of love Hysteric Birthday 2U")]
|
|
[InlineData("Vol03_ch15-22.rar", "")]
|
|
[InlineData("Love Hina - Special.cbz", "")] // This has to be a fallback case
|
|
[InlineData("Ani-Hina Art Collection.cbz", "")] // This has to be a fallback case
|
|
[InlineData("Magi - Ch.252-005.cbz", "Magi")]
|
|
[InlineData("Umineko no Naku Koro ni - Episode 1 - Legend of the Golden Witch #1", "Umineko no Naku Koro ni")]
|
|
[InlineData("Kimetsu no Yaiba - Digital Colored Comics c162 Three Victorious Stars.cbz", "Kimetsu no Yaiba - Digital Colored Comics")]
|
|
[InlineData("[Hidoi]_Amaenaideyo_MS_vol01_chp02.rar", "Amaenaideyo MS")]
|
|
[InlineData("NEEDLESS_Vol.4_-_Simeon_6_v2_[SugoiSugoi].rar", "NEEDLESS")]
|
|
[InlineData("Okusama wa Shougakusei c003 (v01) [bokuwaNEET]", "Okusama wa Shougakusei")]
|
|
[InlineData("VanDread-v01-c001[MD].zip", "VanDread")]
|
|
[InlineData("Momo The Blood Taker - Chapter 027 Violent Emotion.cbz", "Momo The Blood Taker")]
|
|
[InlineData("Kiss x Sis - Ch.15 - The Angst of a 15 Year Old Boy.cbz", "Kiss x Sis")]
|
|
[InlineData("Green Worldz - Chapter 112 Final Chapter (End).cbz", "Green Worldz")]
|
|
[InlineData("Noblesse - Episode 406 (52 Pages).7z", "Noblesse")]
|
|
[InlineData("X-Men v1 #201 (September 2007).cbz", "X-Men")]
|
|
[InlineData("Kodoja #001 (March 2016)", "Kodoja")]
|
|
[InlineData("Boku No Kokoro No Yabai Yatsu - Chapter 054 I Prayed At The Shrine (V0).cbz", "Boku No Kokoro No Yabai Yatsu")]
|
|
[InlineData("Kiss x Sis - Ch.36 - A Cold Home Visit.cbz", "Kiss x Sis")]
|
|
[InlineData("Seraph of the End - Vampire Reign 093 (2020) (Digital) (LuCaZ)", "Seraph of the End - Vampire Reign")]
|
|
[InlineData("Grand Blue Dreaming - SP02 Extra (2019) (Digital) (danke-Empire).cbz", "Grand Blue Dreaming")]
|
|
[InlineData("Yuusha Ga Shinda! - Vol.tbd Chapter 27.001 V2 Infection ①.cbz", "Yuusha Ga Shinda!")]
|
|
[InlineData("Seraph of the End - Vampire Reign 093 (2020) (Digital) (LuCaZ).cbz", "Seraph of the End - Vampire Reign")]
|
|
[InlineData("Getsuyoubi no Tawawa - Ch. 001 - Ai-chan, Part 1", "Getsuyoubi no Tawawa")]
|
|
[InlineData("Please Go Home, Akutsu-San! - Chapter 038.5 - Volume Announcement.cbz", "Please Go Home, Akutsu-San!")]
|
|
[InlineData("Killing Bites - Vol 11 Chapter 050 Save Me, Nunupi!.cbz", "Killing Bites")]
|
|
[InlineData("Mad Chimera World - Volume 005 - Chapter 026.cbz", "Mad Chimera World")]
|
|
[InlineData("Hentai Ouji to Warawanai Neko. - Vol. 06 Ch. 034.5", "Hentai Ouji to Warawanai Neko.")]
|
|
public void ParseSeriesTest(string filename, string expected)
|
|
{
|
|
Assert.Equal(expected, API.Parser.Parser.ParseSeries(filename));
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("Killing Bites Vol. 0001 Ch. 0001 - Galactica Scanlations (gb)", "1")]
|
|
[InlineData("My Girlfriend Is Shobitch v01 - ch. 09 - pg. 008.png", "9")]
|
|
[InlineData("Historys Strongest Disciple Kenichi_v11_c90-98.zip", "90-98")]
|
|
[InlineData("B_Gata_H_Kei_v01[SlowManga&OverloadScans]", "0")]
|
|
[InlineData("BTOOOM! v01 (2013) (Digital) (Shadowcat-Empire)", "0")]
|
|
[InlineData("Gokukoku no Brynhildr - c001-008 (v01) [TrinityBAKumA]", "1-8")]
|
|
[InlineData("Dance in the Vampire Bund v16-17 (Digital) (NiceDragon)", "0")]
|
|
[InlineData("c001", "1")]
|
|
[InlineData("[Suihei Kiki]_Kasumi_Otoko_no_Ko_[Taruby]_v1.12.zip", "12")]
|
|
[InlineData("Adding volume 1 with File: Ana Satsujin Vol. 1 Ch. 5 - Manga Box (gb).cbz", "5")]
|
|
[InlineData("Hinowa ga CRUSH! 018 (2019) (Digital) (LuCaZ).cbz", "18")]
|
|
[InlineData("Cynthia The Mission - c000-006 (v06) [Desudesu&Brolen].zip", "0-6")]
|
|
[InlineData("[WS]_Ichiban_Ushiro_no_Daimaou_v02_ch10.zip", "10")]
|
|
[InlineData("Loose_Relation_Between_Wizard_and_Apprentice_c07[AN].zip", "7")]
|
|
[InlineData("Tower Of God S01 014 (CBT) (digital).cbz", "14")]
|
|
[InlineData("Tenjou_Tenge_c106[MT].zip", "106")]
|
|
[InlineData("Tenjou_Tenge_v17_c100[MT].zip", "100")]
|
|
[InlineData("Shimoneta - Manmaru Hen - c001-006 (v01) [Various].zip", "1-6")]
|
|
[InlineData("Mujaki no Rakuen Vol12 ch76", "76")]
|
|
[InlineData("Beelzebub_01_[Noodles].zip", "1")]
|
|
[InlineData("Yumekui-Merry_DKThias_Chapter21.zip", "21")]
|
|
[InlineData("Yumekui_Merry_v01_c01[Bakayarou-Kuu].rar", "1")]
|
|
[InlineData("Yumekui-Merry_DKThias_Chapter11v2.zip", "11")]
|
|
[InlineData("Yumekui-Merry DKThiasScanlations Chapter51v2", "51")]
|
|
[InlineData("Yumekui-Merry_DKThiasScanlations&RenzokuseiScans_Chapter61", "61")]
|
|
[InlineData("Goblin Slayer Side Story - Year One 017.5", "17.5")]
|
|
[InlineData("Beelzebub_53[KSH].zip", "53")]
|
|
[InlineData("Black Bullet - v4 c20.5 [batoto]", "20.5")]
|
|
[InlineData("Itoshi no Karin - c001-006x1 (v01) [Renzokusei Scans]", "1-6")]
|
|
[InlineData("APOSIMZ 040 (2020) (Digital) (danke-Empire).cbz", "40")]
|
|
[InlineData("Kedouin Makoto - Corpse Party Musume, Chapter 12", "12")]
|
|
[InlineData("Vol 1", "0")]
|
|
[InlineData("VanDread-v01-c001[MD].zip", "1")]
|
|
[InlineData("Goblin Slayer Side Story - Year One 025.5", "25.5")]
|
|
[InlineData("Kedouin Makoto - Corpse Party Musume, Chapter 01", "1")]
|
|
[InlineData("To Love Ru v11 Uncensored (Ch.089-097+Omake)", "89-97")]
|
|
[InlineData("To Love Ru v18 Uncensored (Ch.153-162.5)", "153-162.5")]
|
|
[InlineData("[AN] Mahoutsukai to Deshi no Futekisetsu na Kankei Chp. 1", "1")]
|
|
[InlineData("Beelzebub_Side_Story_02_RHS.zip", "2")]
|
|
[InlineData("[PROzess]Kimi_ha_midara_na_Boku_no_Joou_-_Ch01", "1")]
|
|
[InlineData("Fullmetal Alchemist chapters 101-108.cbz", "101-108")]
|
|
[InlineData("Umineko no Naku Koro ni - Episode 3 - Banquet of the Golden Witch #02.cbz", "2")]
|
|
[InlineData("To Love Ru v09 Uncensored (Ch.071-079).cbz", "71-79")]
|
|
[InlineData("Corpse Party -The Anthology- Sachikos game of love Hysteric Birthday 2U Extra Chapter.rar", "0")]
|
|
[InlineData("Beelzebub_153b_RHS.zip", "153.5")]
|
|
[InlineData("Beelzebub_150-153b_RHS.zip", "150-153.5")]
|
|
[InlineData("Transferred to another world magical swordsman v1.1", "1")]
|
|
[InlineData("Transferred to another world magical swordsman v1.2", "2")]
|
|
[InlineData("Kiss x Sis - Ch.15 - The Angst of a 15 Year Old Boy.cbz", "15")]
|
|
[InlineData("Kiss x Sis - Ch.12 - 1 , 2 , 3P!.cbz", "12")]
|
|
[InlineData("Umineko no Naku Koro ni - Episode 1 - Legend of the Golden Witch #1", "1")]
|
|
[InlineData("Kiss x Sis - Ch.00 - Let's Start from 0.cbz", "0")]
|
|
[InlineData("[Hidoi]_Amaenaideyo_MS_vol01_chp02.rar", "2")]
|
|
[InlineData("Okusama wa Shougakusei c003 (v01) [bokuwaNEET]", "3")]
|
|
[InlineData("Tomogui Kyoushitsu - Chapter 006 Game 005 - Fingernails On Right Hand (Part 002).cbz", "6")]
|
|
[InlineData("Noblesse - Episode 406 (52 Pages).7z", "406")]
|
|
[InlineData("X-Men v1 #201 (September 2007).cbz", "201")]
|
|
[InlineData("Kodoja #001 (March 2016)", "1")]
|
|
[InlineData("Noblesse - Episode 429 (74 Pages).7z", "429")]
|
|
[InlineData("Boku No Kokoro No Yabai Yatsu - Chapter 054 I Prayed At The Shrine (V0).cbz", "54")]
|
|
[InlineData("Ijousha No Ai - Vol.01 Chapter 029 8 Years Ago", "29")]
|
|
[InlineData("Kedouin Makoto - Corpse Party Musume, Chapter 09.cbz", "9")]
|
|
[InlineData("Hentai Ouji to Warawanai Neko. - Vol. 06 Ch. 034.5", "34.5")]
|
|
public void ParseChaptersTest(string filename, string expected)
|
|
{
|
|
Assert.Equal(expected, API.Parser.Parser.ParseChapter(filename));
|
|
}
|
|
|
|
|
|
[Theory]
|
|
[InlineData("Tenjou Tenge Omnibus", "Omnibus")]
|
|
[InlineData("Tenjou Tenge {Full Contact Edition}", "Full Contact Edition")]
|
|
[InlineData("Tenjo Tenge {Full Contact Edition} v01 (2011) (Digital) (ASTC).cbz", "Full Contact Edition")]
|
|
[InlineData("Wotakoi - Love is Hard for Otaku Omnibus v01 (2018) (Digital) (danke-Empire)", "Omnibus")]
|
|
[InlineData("To Love Ru v01 Uncensored (Ch.001-007)", "Uncensored")]
|
|
[InlineData("Chobits Omnibus Edition v01 [Dark Horse]", "Omnibus Edition")]
|
|
[InlineData("[dmntsf.net] One Piece - Digital Colored Comics Vol. 20 Ch. 177 - 30 Million vs 81 Million.cbz", "")]
|
|
[InlineData("AKIRA - c003 (v01) [Full Color] [Darkhorse].cbz", "Full Color")]
|
|
public void ParseEditionTest(string input, string expected)
|
|
{
|
|
Assert.Equal(expected, API.Parser.Parser.ParseEdition(input));
|
|
}
|
|
[Theory]
|
|
[InlineData("Beelzebub Special OneShot - Minna no Kochikame x Beelzebub (2016) [Mangastream].cbz", true)]
|
|
[InlineData("Beelzebub_Omake_June_2012_RHS", true)]
|
|
[InlineData("Beelzebub_Side_Story_02_RHS.zip", false)]
|
|
[InlineData("Darker than Black Shikkoku no Hana Special [Simple Scans].zip", true)]
|
|
[InlineData("Darker than Black Shikkoku no Hana Fanbook Extra [Simple Scans].zip", true)]
|
|
[InlineData("Corpse Party -The Anthology- Sachikos game of love Hysteric Birthday 2U Extra Chapter", true)]
|
|
[InlineData("Ani-Hina Art Collection.cbz", true)]
|
|
[InlineData("Gifting The Wonderful World With Blessings! - 3 Side Stories [yuNS][Unknown]", true)]
|
|
[InlineData("A Town Where You Live - Bonus Chapter.zip", true)]
|
|
[InlineData("Yuki Merry - 4-Komga Anthology", false)]
|
|
[InlineData("Beastars - SP01", false)]
|
|
[InlineData("Beastars SP01", false)]
|
|
public void ParseMangaSpecialTest(string input, bool expected)
|
|
{
|
|
Assert.Equal(expected, !string.IsNullOrEmpty(API.Parser.Parser.ParseMangaSpecial(input)));
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("image.png", MangaFormat.Image)]
|
|
[InlineData("image.cbz", MangaFormat.Archive)]
|
|
[InlineData("image.txt", MangaFormat.Unknown)]
|
|
public void ParseFormatTest(string inputFile, MangaFormat expected)
|
|
{
|
|
Assert.Equal(expected, API.Parser.Parser.ParseFormat(inputFile));
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("Gifting The Wonderful World With Blessings! - 3 Side Stories [yuNS][Unknown].epub", "Side Stories")]
|
|
public void ParseSpecialTest(string inputFile, string expected)
|
|
{
|
|
Assert.Equal(expected, API.Parser.Parser.ParseMangaSpecial(inputFile));
|
|
}
|
|
|
|
/*
|
|
private static ParserInfo CreateParserInfo(string series, string chapter, string volume, bool isSpecial = false)
|
|
{
|
|
return new ParserInfo()
|
|
{
|
|
Chapters = chapter,
|
|
Volumes = volume,
|
|
IsSpecial = isSpecial,
|
|
Series = series,
|
|
};
|
|
}
|
|
*/
|
|
|
|
[Theory]
|
|
[InlineData("/manga/Btooom!/Vol.1/Chapter 1/1.cbz", "Btooom!~1~1")]
|
|
[InlineData("/manga/Btooom!/Vol.1 Chapter 2/1.cbz", "Btooom!~1~2")]
|
|
public void ParseFromFallbackFoldersTest(string inputFile, string expectedParseInfo)
|
|
{
|
|
const string rootDirectory = "/manga/";
|
|
var tokens = expectedParseInfo.Split("~");
|
|
var actual = new ParserInfo {Chapters = "0", Volumes = "0"};
|
|
API.Parser.Parser.ParseFromFallbackFolders(inputFile, rootDirectory, LibraryType.Manga, ref actual);
|
|
Assert.Equal(tokens[0], actual.Series);
|
|
Assert.Equal(tokens[1], actual.Volumes);
|
|
Assert.Equal(tokens[2], actual.Chapters);
|
|
|
|
}
|
|
|
|
[Fact]
|
|
public void ParseInfoTest()
|
|
{
|
|
const string rootPath = @"E:/Manga/";
|
|
var expected = new Dictionary<string, ParserInfo>();
|
|
var filepath = @"E:/Manga/Mujaki no Rakuen/Mujaki no Rakuen Vol12 ch76.cbz";
|
|
expected.Add(filepath, new ParserInfo
|
|
{
|
|
Series = "Mujaki no Rakuen", Volumes = "12",
|
|
Chapters = "76", Filename = "Mujaki no Rakuen Vol12 ch76.cbz", Format = MangaFormat.Archive,
|
|
FullFilePath = filepath
|
|
});
|
|
|
|
filepath = @"E:/Manga/Shimoneta to Iu Gainen ga Sonzai Shinai Taikutsu na Sekai Man-hen/Vol 1.cbz";
|
|
expected.Add(filepath, new ParserInfo
|
|
{
|
|
Series = "Shimoneta to Iu Gainen ga Sonzai Shinai Taikutsu na Sekai Man-hen", Volumes = "1",
|
|
Chapters = "0", Filename = "Vol 1.cbz", Format = MangaFormat.Archive,
|
|
FullFilePath = filepath
|
|
});
|
|
|
|
filepath = @"E:\Manga\Beelzebub\Beelzebub_01_[Noodles].zip";
|
|
expected.Add(filepath, new ParserInfo
|
|
{
|
|
Series = "Beelzebub", Volumes = "0",
|
|
Chapters = "1", Filename = "Beelzebub_01_[Noodles].zip", Format = MangaFormat.Archive,
|
|
FullFilePath = filepath
|
|
});
|
|
|
|
filepath = @"E:\Manga\Ichinensei ni Nacchattara\Ichinensei_ni_Nacchattara_v01_ch01_[Taruby]_v1.1.zip";
|
|
expected.Add(filepath, new ParserInfo
|
|
{
|
|
Series = "Ichinensei ni Nacchattara", Volumes = "1",
|
|
Chapters = "1", Filename = "Ichinensei_ni_Nacchattara_v01_ch01_[Taruby]_v1.1.zip", Format = MangaFormat.Archive,
|
|
FullFilePath = filepath
|
|
});
|
|
|
|
filepath = @"E:\Manga\Tenjo Tenge (Color)\Tenjo Tenge {Full Contact Edition} v01 (2011) (Digital) (ASTC).cbz";
|
|
expected.Add(filepath, new ParserInfo
|
|
{
|
|
Series = "Tenjo Tenge", Volumes = "1", Edition = "Full Contact Edition",
|
|
Chapters = "0", Filename = "Tenjo Tenge {Full Contact Edition} v01 (2011) (Digital) (ASTC).cbz", Format = MangaFormat.Archive,
|
|
FullFilePath = filepath
|
|
});
|
|
|
|
filepath = @"E:\Manga\Akame ga KILL! ZERO (2016-2019) (Digital) (LuCaZ)\Akame ga KILL! ZERO v01 (2016) (Digital) (LuCaZ).cbz";
|
|
expected.Add(filepath, new ParserInfo
|
|
{
|
|
Series = "Akame ga KILL! ZERO", Volumes = "1", Edition = "",
|
|
Chapters = "0", Filename = "Akame ga KILL! ZERO v01 (2016) (Digital) (LuCaZ).cbz", Format = MangaFormat.Archive,
|
|
FullFilePath = filepath
|
|
});
|
|
|
|
filepath = @"E:\Manga\Dorohedoro\Dorohedoro v01 (2010) (Digital) (LostNerevarine-Empire).cbz";
|
|
expected.Add(filepath, new ParserInfo
|
|
{
|
|
Series = "Dorohedoro", Volumes = "1", Edition = "",
|
|
Chapters = "0", Filename = "Dorohedoro v01 (2010) (Digital) (LostNerevarine-Empire).cbz", Format = MangaFormat.Archive,
|
|
FullFilePath = filepath
|
|
});
|
|
|
|
filepath = @"E:\Manga\APOSIMZ\APOSIMZ 040 (2020) (Digital) (danke-Empire).cbz";
|
|
expected.Add(filepath, new ParserInfo
|
|
{
|
|
Series = "APOSIMZ", Volumes = "0", Edition = "",
|
|
Chapters = "40", Filename = "APOSIMZ 040 (2020) (Digital) (danke-Empire).cbz", Format = MangaFormat.Archive,
|
|
FullFilePath = filepath
|
|
});
|
|
|
|
filepath = @"E:\Manga\Corpse Party Musume\Kedouin Makoto - Corpse Party Musume, Chapter 09.cbz";
|
|
expected.Add(filepath, new ParserInfo
|
|
{
|
|
Series = "Kedouin Makoto - Corpse Party Musume", Volumes = "0", Edition = "",
|
|
Chapters = "9", Filename = "Kedouin Makoto - Corpse Party Musume, Chapter 09.cbz", Format = MangaFormat.Archive,
|
|
FullFilePath = filepath
|
|
});
|
|
|
|
filepath = @"E:\Manga\Goblin Slayer\Goblin Slayer - Brand New Day 006.5 (2019) (Digital) (danke-Empire).cbz";
|
|
expected.Add(filepath, new ParserInfo
|
|
{
|
|
Series = "Goblin Slayer - Brand New Day", Volumes = "0", Edition = "",
|
|
Chapters = "6.5", Filename = "Goblin Slayer - Brand New Day 006.5 (2019) (Digital) (danke-Empire).cbz", Format = MangaFormat.Archive,
|
|
FullFilePath = filepath
|
|
});
|
|
|
|
filepath = @"E:\Manga\Summer Time Rendering\Specials\Record 014 (between chapter 083 and ch084) SP11.cbr";
|
|
expected.Add(filepath, new ParserInfo
|
|
{
|
|
Series = "Summer Time Rendering", Volumes = "0", Edition = "",
|
|
Chapters = "0", Filename = "Record 014 (between chapter 083 and ch084) SP11.cbr", Format = MangaFormat.Archive,
|
|
FullFilePath = filepath, IsSpecial = true
|
|
});
|
|
|
|
filepath = @"E:\Manga\Seraph of the End\Seraph of the End - Vampire Reign 093 (2020) (Digital) (LuCaZ).cbz";
|
|
expected.Add(filepath, new ParserInfo
|
|
{
|
|
Series = "Seraph of the End - Vampire Reign", Volumes = "0", Edition = "",
|
|
Chapters = "93", Filename = "Seraph of the End - Vampire Reign 093 (2020) (Digital) (LuCaZ).cbz", Format = MangaFormat.Archive,
|
|
FullFilePath = filepath, IsSpecial = false
|
|
});
|
|
|
|
// If an image is cover exclusively, ignore it
|
|
filepath = @"E:\Manga\Seraph of the End\cover.png";
|
|
expected.Add(filepath, null);
|
|
|
|
|
|
foreach (var file in expected.Keys)
|
|
{
|
|
var expectedInfo = expected[file];
|
|
var actual = API.Parser.Parser.Parse(file, rootPath);
|
|
if (expectedInfo == null)
|
|
{
|
|
Assert.Null(actual);
|
|
return;
|
|
}
|
|
Assert.NotNull(actual);
|
|
_testOutputHelper.WriteLine($"Validating {file}");
|
|
_testOutputHelper.WriteLine("Format");
|
|
Assert.Equal(expectedInfo.Format, actual.Format);
|
|
_testOutputHelper.WriteLine("Series");
|
|
Assert.Equal(expectedInfo.Series, actual.Series);
|
|
_testOutputHelper.WriteLine("Chapters");
|
|
Assert.Equal(expectedInfo.Chapters, actual.Chapters);
|
|
_testOutputHelper.WriteLine("Volumes");
|
|
Assert.Equal(expectedInfo.Volumes, actual.Volumes);
|
|
_testOutputHelper.WriteLine("Edition");
|
|
Assert.Equal(expectedInfo.Edition, actual.Edition);
|
|
_testOutputHelper.WriteLine("Filename");
|
|
Assert.Equal(expectedInfo.Filename, actual.Filename);
|
|
_testOutputHelper.WriteLine("FullFilePath");
|
|
Assert.Equal(expectedInfo.FullFilePath, actual.FullFilePath);
|
|
}
|
|
}
|
|
}
|
|
}
|