Compare commits

...

120 Commits

Author SHA1 Message Date
beerpsi 56f64ce41c Rawdevart.art: Fix pagination (#816)
CI / Prepare job (push) Successful in 3s Details
CI / Build multisrc modules (push) Failing after 27s Details
CI / Build individual modules (push) Failing after 7s Details
CI / Publish repo (push) Has been skipped Details
2024-01-30 22:11:53 +00:00
stevenyomi 280d7eb814 Clean up and remove misplaced dead overrides (#814)
* Clean up and fix misplaced overrides

* Remove Pikiran Wibu

* Remove AkuManga

* Remove SobatManku

Overrides with misplaced files turn out to be all dead.

* Bump Hikari Scan
2024-01-30 22:11:53 +00:00
beerpsi dccbfba8a6 Add Rawdevart.art (#813)
* Add Rawdevart.art

* Optimize icons
2024-01-30 22:11:53 +00:00
stevenyomi a548a4fb4a Fix isNsfw flag (#810) 2024-01-30 22:11:53 +00:00
stevenyomi 4f1e8b8c4f Remove ineffective `libVersion` from extension config (#808) 2024-01-30 22:11:53 +00:00
AwkwardPeak7 9f21ec0d06 fix Hitomi method conflict with ext-lib 1.5 methods (#806)
* maybe fix private fun conflict with ext-lib 1.5 interface methods

* add pages in description

* slight refactor

* bump

* make search default order same as site

some entries don't show up on popular sort
2024-01-30 22:11:53 +00:00
beerpsi 46c51293c7 MangaHub: Update API and CDN URLs (#807) 2024-01-30 22:11:53 +00:00
AwkwardPeak7 c1c0886c0d remove unneeded properties from core manifest (#805)
extFactory, hasReadme, hasChangelog
2024-01-30 22:11:53 +00:00
Claudemirovsky 3f2882c523 New source: tr/Manga Kings (#802)
* feat: Add Manga Kings to mangathemesia

* feat: Add rate limit

* fix: Fix chapter dates

* fix: Fix some selectors in manga details page

* chore: Add source icon
2024-01-30 22:11:53 +00:00
Claudemirovsky 73be84037b New source: pt/Taiyō (#799)
* feat: Create Taiyō base

* feat: Implement popular manga page

* feat: Implement latest updates page

* feat: Implement search manga page

* feat: (finally) Implement manga details page

i hate it

* feat: Implement chapter list

* feat: Parse page list

* feat: Rate-limit requests to image CDN

* fix: Fix crash when using URL intent handler

* chore: Add source icon

* Optimize icons with pingo

---------

Co-authored-by: beerpiss <lacvtg.a1.2023@gmail.com>
2024-01-30 22:11:53 +00:00
Mike 95fc651011 Mangaworld - update domain (#801) 2024-01-30 22:11:53 +00:00
Mike 2805da863a Update Manga1000 (#800)
* Update Manga1000

* delete lines
2024-01-30 22:11:53 +00:00
stevenyomi 9db6152418 Update docs on manifest files (#792)
* Update docs on manifest files

* Delete multisrc/overrides/mangaworld/default/AndroidManifest.xml
2024-01-30 22:11:51 +00:00
stevenyomi 12e864f85f Remove placeholder manifest files (#790) 2024-01-30 22:11:47 +00:00
beerpiss 52c1b103cb TM: Fix headers (3) 2024-01-30 22:11:05 +00:00
beerpsi 512fb0053a TM: Fix headers (#783)
* TM: Fix headers

* more proper header value regex
2024-01-30 22:11:05 +00:00
beerpsi 7cc72c3fe7 NetTruyen: Update base URL (#781) 2024-01-30 22:11:05 +00:00
beerpsi c5e7cad6a8 TM: Fix headers (#778) 2024-01-30 22:11:05 +00:00
beerpsi acad777e6b Add PeachScan (#759)
* Add PeachScan

* I love linting

* Also remove old WickedWitchScan

* It's not novo anymore

* Remove unneeded className declaration

* Filter light novel entries from latest view (because we can here)

* ACTUALLY filter light novel entries from latest view (because we can here)

* Fix icon path + add Dango Scan

* Move image-decoder dependency to multisrc project

* shut up android studio

* fix dep specifier in additional.gradle

* Update multisrc/overrides/peachscan/default/additional.gradle

Co-authored-by: stevenyomi <95685115+stevenyomi@users.noreply.github.com>

* Revert "Update multisrc/overrides/peachscan/default/additional.gradle"

This reverts commit 6b8722193a2181a8e9d8f6b65fb24afd30e5a548.
The comment serves as an explanation for why the dependency shouldn't
be in the Gradle version catalog; because no one else cares about this
dependency.

* Optimize icons

---------

Co-authored-by: stevenyomi <95685115+stevenyomi@users.noreply.github.com>
2024-01-30 22:11:05 +00:00
Mike 8e712cc062 Hikariscan (#776)
* Hikariscan

* alpha
2024-01-30 22:11:05 +00:00
stevenyomi e3638b172f Update deprecated AGP properties (#770)
* Update deprecated AGP properties

* Remove unused suppression
2024-01-30 22:11:05 +00:00
Mike c587983c99 Prune MangaThemesia (#767) 2024-01-30 22:11:05 +00:00
Fermín Cirella 00f2eddb58 HN: Show only entire images (#768)
HN - Show only entire images
2024-01-30 22:11:05 +00:00
beerpsi bcfc74ef31 TM: Fix requests (#765) 2024-01-30 22:11:05 +00:00
beerpsi cabade3e41 TruyenGiHot: Update base URL and a lot of fixes (#747) 2024-01-30 22:11:05 +00:00
beerpsi 45c6f6a2b9 TruyenQQ: Update base URL (#749) 2024-01-30 22:11:05 +00:00
beerpsi 8504999a5c Remove MangaXY (#748) 2024-01-30 22:11:05 +00:00
AwkwardPeak7 96775f8190 add MangaStorm (#746)
* MangaStorm

* MangaStorm: icons
2024-01-30 22:11:05 +00:00
beerpsi 43c5cd4943 A3Manga: Update base URL (#744) 2024-01-30 22:11:05 +00:00
beerpsi 37866f48f2 Tsuki Mangas: Fix page ordering and chapter WebView (#742)
* Tsuki Mangas: Fix page ordering and chapter WebView

* bump version
2024-01-30 22:11:05 +00:00
AwkwardPeak7 3b998e9766 Update Synchrony (#741)
`2.4.5.1`
2024-01-30 22:11:05 +00:00
beerpsi 28b71a2648 Clean up HentaiNexus (#737) 2024-01-30 22:11:05 +00:00
beerpsi 0d1497285f HentaiNexus: Fix length=7; index=7 (#736) 2024-01-30 22:11:05 +00:00
stevenyomi 2a287d7398 Clean up AndroidManifest files (#735) 2024-01-30 22:11:05 +00:00
stevenyomi 308d68dce1 Update `buildFeatures` in build scripts (#730) 2024-01-30 22:11:05 +00:00
Mike 9ca3646702 Mangatown - longstrip parsing (#721) 2024-01-30 22:11:05 +00:00
stevenyomi cf9f358af1 Revert "Prune MCCMS (#690)" (#720)
This reverts commit 93284b9a7efad5bab60a5bc4af647d13543fd5f7.
2024-01-30 22:11:05 +00:00
beerpsi d70973dbf7 Add LANraragi (#702)
* Add LANraragi

* clean up build.gradle

* use buildList

Co-authored-by: stevenyomi <95685115+stevenyomi@users.noreply.github.com>

---------

Co-authored-by: stevenyomi <95685115+stevenyomi@users.noreply.github.com>
2024-01-30 22:11:03 +00:00
felixfon 72283a476a Fix manhuaren No value for response (#701)
fix(manhuaren): store the token to avoid being blocked
2024-01-30 22:09:36 +00:00
beerpsi eb364ada84 Add HentaiNexus (#719)
* Add HentaiNexus

* icons

* add parody filter

* Apply reviews
2024-01-30 22:09:36 +00:00
Chopper 1cf4e97133 Add Ler Mangás Online (#657)
* Add latestUpdates

* Fix source name

* Add manga details and chapter parse

* Add manga/webtoom filter

* Fix code style. Closes #403

* Fix Genre name

* Fix slug name

* Remove chapter_number settings

Co-authored-by: beerpsi <92439990+beerpiss@users.noreply.github.com>

* Remove chapter name custom handling

Co-authored-by: beerpsi <92439990+beerpiss@users.noreply.github.com>

* Remove override getMangaUrl

Co-authored-by: beerpsi <92439990+beerpiss@users.noreply.github.com>

* Remove dead code

Co-authored-by: beerpsi <92439990+beerpiss@users.noreply.github.com>

* Remove `initialized` settings

Co-authored-by: beerpsi <92439990+beerpiss@users.noreply.github.com>

* Remove redundant code

Co-authored-by: beerpsi <92439990+beerpiss@users.noreply.github.com>

* Remove redundant settings

Co-authored-by: beerpsi <92439990+beerpiss@users.noreply.github.com>

* Remove unneeded code settings

Co-authored-by: beerpsi <92439990+beerpiss@users.noreply.github.com>

* Add popularManga implementation

* Add 'query' in intent search

* Add fetch manga implementation

* Remove variable instance

---------

Co-authored-by: beerpsi <92439990+beerpiss@users.noreply.github.com>
2024-01-30 22:09:36 +00:00
beerpsi 94e268186f Add ARESManga/ARESNOV (#699)
* Add ARESManga

* Fix author selector

* Split ARESManga and ARESNOV

* remove unused imports
2024-01-30 22:09:36 +00:00
beerpsi 4eb24b350b Add BlogTruyen.vn (unoriginal) (#686)
* Add BlogTruyen.vn (unoriginal)

* refactor a thing

* Add final newline

* Epic lint fail

* Move date format out of constructor arguments

* Remove manifest file in override

* Don't display genre list if empty

* Apply rate limit only to real BlogTruyen
2024-01-30 22:09:36 +00:00
beerpsi 259e12ad25 HentaiFox: Fix thumbnails on mobile UAs (#691) 2024-01-30 22:09:36 +00:00
Mike 34bc7e7a7a Prune ZeistManga (#694) 2024-01-30 22:09:36 +00:00
Mike 8264837faa Prune Paprika (#693) 2024-01-30 22:09:36 +00:00
Mike 57a90845b2 Prune MCCMS (#690)
* Prune MCCMS

* overrides
2024-01-30 22:09:36 +00:00
Mike 8b007abea8 Prune MangaCatalog (#689) 2024-01-30 22:09:36 +00:00
Mike 4ebbed3da5 Prune Foolslide (#685)
* Prune Foolslide

* comma
2024-01-30 22:09:36 +00:00
Mike 5f58182844 Prune HentaiHand (#687)
* Prune HentaiHand

* comma
2024-01-30 22:09:36 +00:00
Mike 21991147c7 Prune FMReader (#683) 2024-01-30 22:09:36 +00:00
beerpsi a1d4f70db4 Ler Manga: Filter out empty page URLs (#680) 2024-01-30 22:09:36 +00:00
Claudemirovsky 5325cad42d pt/Bakai: Prevent http 429 when searching (#677)
* fix: Prevent http 429 on search - remove limiting cookie

* fix: Fix artist on manga details page

* chore: Bump version
2024-01-30 22:09:36 +00:00
Secozzi dbeab15596 mangathemesia: add culturedworks (#666) 2024-01-30 22:09:32 +00:00
Mike 4d211ad7c1 Remove MangaMainac (#664) 2024-01-30 22:09:32 +00:00
Mike f868bc5562 Remove comicastle (#661) 2024-01-30 22:09:32 +00:00
beerpsi 8933c61115 Asura Scans: Fix Brotli interceptor for J2K (#655) 2024-01-30 22:09:32 +00:00
AwkwardPeak7 6acac9416c RC: fix referer (#653)
fix referer
2024-01-30 22:09:32 +00:00
beerpsi 0a0251c9d7 Add Twicomi (#641)
* Add Twicomi

* isNsfw = true

* ja.twicomi -> all.twicomi

* extract the paginated chapter list into a method

* fix 4am code

* just don't hardcode the page limit
2024-01-30 22:09:32 +00:00
bapeey fdc8131482 Add Knight No Scanlation to Madara (#645)
* Add KnightNoScanlation

* Add icon

* Missing import

* Fix status
2024-01-30 22:09:32 +00:00
bapeey 7f8350e669 ReaperScans (en): Fix thumbnails on mobile UA (#644)
Smh
2024-01-30 22:09:32 +00:00
beerpsi 01e27823f6 Mangas Chan: Fix Cloudflare block (#637)
* Mangas Chan: Fix Cloudflare block

* Add an interceptor to remove X-Requested-With

* use CharArray instead of List

Co-authored-by: stevenyomi <95685115+stevenyomi@users.noreply.github.com>

---------

Co-authored-by: stevenyomi <95685115+stevenyomi@users.noreply.github.com>
2024-01-30 22:09:32 +00:00
beerpsi d63bd90ef9 Komga: Fix invalid URL when fetching details (#638) 2024-01-30 22:09:32 +00:00
AwkwardPeak7 5da654c4fc add hitomi.la (#581)
* hitomi.la

* source factory

* suggestions

* sort filter
2024-01-30 22:09:32 +00:00
Secozzi 235f279d4b Move Nicomanga to fmreader multisrc theme (#627) 2024-01-30 22:09:32 +00:00
beerpsi 2da54739eb Add Komga (#579)
* Add Komga

* Bump version

* icons

* clean up filter code

* what happened here
2024-01-30 22:09:27 +00:00
beerpsi 5d22f256b3 Rename Imperio Scans to Neroxus (#618) 2024-01-30 22:07:13 +00:00
beerpsi a6dc08eb88 MangaGeko: Update base URL (#622) 2024-01-30 22:07:13 +00:00
Claudemirovsky 4254b88c40 New source: pt/Tsuki Mangás (#597)
* feat: Create Tsuki Mangás base

* feat: Implement popular manga page

* feat: Implement latest updates page

* feat: Implement search page

* feat: Implement manga details page

* fix: Fix URL intent handler

* fix: Fix webview url

* feat: Implement chapter list page

* feat: Implement page list

* fix: Fix chapter URLs

Kotlinx-serialization moment

* feat: Apply rate limit to image CDNs

* refactor: Make the API path a separate constant

* chore: Add source icon

... Actually they don't have a icon yet, they're just using the "TSUKI"
text, so I did the same in the icon. it may be updated later, when they
create a proper icon.

* fix: Fix random http 404 in pages

* fix: Prevent multiple wrong requests

* refactor: Apply suggestion - set custom interceptor before ratelimit
2024-01-30 22:07:13 +00:00
stevenyomi 01c097b7e6 [skip ci] Update Gradle Wrapper files (#594)
- Updated wrapper scripts to 8.3 with `./gradlew wrapper`
- Duped `gradle-wrapper.properties` in `buildSrc` to trick "Android Studio - Clean Project" into using the same version
2024-01-30 22:07:13 +00:00
Mike 968d1cb0ac Remove lirescan.me (#609) 2024-01-30 22:07:13 +00:00
Mike 6432a9abd7 Delete purplecress.com (#608) 2024-01-30 22:07:13 +00:00
Luqman 583197e12c MangaTale: fix null error (#602)
closes #596
cant reproduce the images issue. probably site issue
2024-01-30 22:07:13 +00:00
Luqman a75f8b2428 sngm: lower rate limit, tweak code (#598) 2024-01-30 22:07:13 +00:00
Mike 619bcf6002 Remove rawdevart.com (#607) 2024-01-30 22:07:13 +00:00
Mike 3fe2a0e70c Remove demonceleste.it (#606) 2024-01-30 22:07:13 +00:00
Mike 401c4672e2 Remove komikfan.com (#605) 2024-01-30 22:07:13 +00:00
Mike 10fda994f0 Remove raw-manga.org (#604) 2024-01-30 22:07:13 +00:00
Mike 3361fe2437 Remove mangarok.mobi (#603) 2024-01-30 22:07:13 +00:00
beerpsi 1d563cd3ca sngm: fix missing chapters (#593)
* sngm: fix missing chapters

* add back comment
2024-01-30 22:07:13 +00:00
NotBlankyu 8938b92e09 Add ManhuaPlusOrg (#578) 2024-01-30 22:07:13 +00:00
Claudemirovsky 85af4c5f97 en/AscalonScans: Fix http 403 (#577)
* fix: Fix http 403 - Bypass JS Challenge

* chore: Bump version

* refactor: Apply suggestion - Explicitly close response

* refactor: Apply suggestion - add tailrec modifier

* fix: Prevent future headaches - Use the same delay as the challenge

* fix: Apply suggestion - Prevent throwing without closing response
2024-01-30 22:07:13 +00:00
Secozzi 96c6804ede komikcast: fix referer (#588)
komikcast: fix baseurl referer
2024-01-30 22:07:13 +00:00
Johannes Jöns e3362fd497 Setsu Scans: Fix some more pages not loading (#590) 2024-01-30 22:07:13 +00:00
Johannes Jöns ae32103858 Setsu Scans: fix pages loading (#575) 2024-01-30 22:07:13 +00:00
Deivid Gabriel Pereira de Oliveira 1c34c9e56f Add Icons MangasChan (#576) 2024-01-30 22:07:13 +00:00
Secozzi a3e5bcf32c Add burning scans to madara (#559)
* Add burning scans to madara

* fix lint errors
2024-01-30 22:07:13 +00:00
Luqman 5c12784375 Remove: Komikita (#558)
dead since may 2023
2024-01-30 22:07:01 +00:00
Luqman 04f5090aec KomikMama: update domain (#557) 2024-01-30 22:07:01 +00:00
Luqman 9db2ef2f59 Remove: DuniaKomik.id (#555)
redirect to disbanded announcement
2024-01-30 22:07:01 +00:00
Luqman 912f197ab6 Mangakyo: update domain (#552) 2024-01-30 22:07:01 +00:00
Claudemirovsky fa359b535b zh/BoyLove: Fix scrambled images (#548)
* fix: Fix scrambled images

* chore: Bump version

* refactor: Apply code suggestions

* refactor: Remove unnecessary .use block
2024-01-30 22:07:01 +00:00
Luqman d55b796c50 Remove: World Romance Translation (#550)
they move to mangadex now
2024-01-30 22:07:01 +00:00
Chopper 2860c07078 Add Portuga mangas (#471)
* Add Portuga mangas

Closes #61

* Removing inconsistent code

* Remove guard clause in page query parameter setup

* Remove 'initialized' attribute setting

* Fix lateste update request

* Update src/pt/portugamangas/src/eu/kanade/tachiyomi/extension/pt/portugamangas/PortugaMangas.kt

Co-authored-by: AwkwardPeak7 <48650614+AwkwardPeak7@users.noreply.github.com>

* Remove gradle settings

Co-authored-by: AwkwardPeak7 <48650614+AwkwardPeak7@users.noreply.github.com>

* Remove pkgNameSufix

Co-authored-by: AwkwardPeak7 <48650614+AwkwardPeak7@users.noreply.github.com>

* Remove optional manga title and add thumbnail url optional

Co-authored-by: AwkwardPeak7 <48650614+AwkwardPeak7@users.noreply.github.com>

* Remove 'this' keyword

Co-authored-by: AwkwardPeak7 <48650614+AwkwardPeak7@users.noreply.github.com>

* Remove optional manga title

Co-authored-by: AwkwardPeak7 <48650614+AwkwardPeak7@users.noreply.github.com>

* Set thumbnail URL as optional

Co-authored-by: AwkwardPeak7 <48650614+AwkwardPeak7@users.noreply.github.com>

* Adds function to handle thumbnails in manga search

* Remove manga's name optional

* Remove manga page settings by html element

* Remove incorrect update strategy

* Add asJsoup function and remove parseAsDocument

* Remove optional manga name

Co-authored-by: AwkwardPeak7 <48650614+AwkwardPeak7@users.noreply.github.com>

---------

Co-authored-by: AwkwardPeak7 <48650614+AwkwardPeak7@users.noreply.github.com>
2024-01-30 22:07:01 +00:00
Claudemirovsky a1090d63d7 Remove dead source: Project Scanlator (#549)
chore: Purge project scanlator
2024-01-30 22:07:01 +00:00
Claudemirovsky bb7d02c94f pt/Diskus scan: Fix http 403 + fix manga status (#545)
* fix: Fix http 403 - Remove error-triggering headers

* fix: Fix manga status

* chore: Bump version
2024-01-30 22:07:01 +00:00
beerpsi 56c2069e05 Remove BaixarHentai (#544) 2024-01-30 22:07:01 +00:00
beerpsi 8ba3b24363 Remove MangaTX (#543) 2024-01-30 22:07:01 +00:00
beerpsi 75387c7d98 Remove CatOnHeadTranslations (#542)
remove CatOnHeadTranslations
2024-01-30 22:07:01 +00:00
beerpsi 521808940f Remove Epik Manga (#541) 2024-01-30 22:07:01 +00:00
beerpsi f2658d0619 Remove Reaper Scans (Turkish) (#540) 2024-01-30 22:07:01 +00:00
beerpsi 608ed393bd Remove Fallen Angels (#538) 2024-01-30 22:07:01 +00:00
beerpsi e9fe2131e7 Remove Ama Scans (#537)
* Remove Ama Scans

* Delete overrides
2024-01-30 22:07:01 +00:00
beerpsi 49c8180aa1 Adult Webtoon: Fix manga path (#536)
* Adult Webtoon: Fix manga path

* Remove unused imports
2024-01-30 22:07:01 +00:00
beerpiss 61f58db749 fix Lura Toon icons 2024-01-30 22:07:01 +00:00
Deivid Gabriel Pereira de Oliveira 815d8ba8d9 RandomScan to LuraToon (#524)
* RandomScan to LuraToon

* Fix icons

* Update multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/madara/MadaraGenerator.kt

Co-authored-by: beerpsi <92439990+beerpiss@users.noreply.github.com>

* fix ?

* Update multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/madara/MadaraGenerator.kt

Co-authored-by: AwkwardPeak7 <48650614+AwkwardPeak7@users.noreply.github.com>

* Update multisrc/overrides/madara/randomscan/src/luratoon.kt

Co-authored-by: AwkwardPeak7 <48650614+AwkwardPeak7@users.noreply.github.com>

* rename

* class name

* fix class name MadaraGenerator

* change name, and class name

* add override val id

---------

Co-authored-by: beerpsi <92439990+beerpiss@users.noreply.github.com>
Co-authored-by: AwkwardPeak7 <48650614+AwkwardPeak7@users.noreply.github.com>
2024-01-30 22:07:01 +00:00
Claudemirovsky f505654fe7 New source: all/Hentai Cafe (#534)
* feat: Create HentaiCafe base

* feat: Implement popular manga page

* feat: Implement latest updates page

* feat: Implement search page

* feat: Implement manga details page

* feat: Add single-chapter page

* feat: Parse chapter pages

* chore: Add rate-limit to images CDN

* chore: Add source icon
2024-01-30 22:07:01 +00:00
beerpsi 5710e5634e MangAdventure: Add more statuses in search filters + general cleanup (#533) 2024-01-30 22:07:01 +00:00
beerpsi d976177365 vgperson: fix chapter name (#531) 2024-01-30 22:07:01 +00:00
happywillow0 7ae0c27e21 Update MyReadingManga (#511)
* Update Filter Parsing

Update filter parsing behavior from the okhttp cache to a mutableMap

* Bump User Agent Version

* Update pageListParse

Update pageListParse to select for "entry-content" only

* Remove Deprecated cloudflareClient

* Bump extVersionCode

* Revert "Remove Deprecated cloudflareClient"

This reverts commit c97c479dca056b6bdd432291910389579d9962c5.
2024-01-30 22:07:01 +00:00
Mike d631818f99 Fix vgperson (#527) 2024-01-30 22:07:01 +00:00
Secozzi 179f70e77c Topmanhua: fix browse (#523)
update mangaSubString
2024-01-30 22:07:01 +00:00
Mike fa3fc7188f Remove Kouhai Work (#525) 2024-01-30 22:07:01 +00:00
anenasa a4c0420bf7 Add Dm5 (#492) 2024-01-30 22:07:01 +00:00
Secozzi f3b39d57ef Add global bloging to madara (#519) 2024-01-30 22:07:01 +00:00
Mike 800c9d416e Update TencentComics (#518) 2024-01-30 22:07:01 +00:00
beerpsi 0bb60c35a6 Add JapScan (again) (#510)
* Add JapScan (again)

* remove unusued dep

* fix search thumbnails
2024-01-30 22:07:01 +00:00
Luqman 405bff2301 Clean Multisrc Generator (#504)
clean generator
2024-01-30 22:07:01 +00:00
AwkwardPeak7 863c51dec6 Earlym fix latest updates & some fixes (#491)
* change latest update request

* remove non-functional sort filters

* more nulls

* cleanup

* filter ico files from pages
2024-01-30 22:04:05 +00:00
Luqman 9759754b13 Mangaku: fix latest, add more manga details (#489) 2024-01-30 22:03:57 +00:00
884 changed files with 7872 additions and 5664 deletions

2
.gitattributes vendored Normal file
View File

@ -0,0 +1,2 @@
/gradlew linguist-generated
/gradlew.bat linguist-generated

View File

@ -198,7 +198,7 @@ The simplest extension structure looks like this:
```console ```console
$ tree src/<lang>/<mysourcename>/ $ tree src/<lang>/<mysourcename>/
src/<lang>/<mysourcename>/ src/<lang>/<mysourcename>/
├── AndroidManifest.xml ├── AndroidManifest.xml (optional)
├── build.gradle ├── build.gradle
├── res ├── res
│   ├── mipmap-hdpi │   ├── mipmap-hdpi
@ -227,15 +227,14 @@ src/<lang>/<mysourcename>/
should be adapted from the site name, and can only contain lowercase ASCII letters and digits. should be adapted from the site name, and can only contain lowercase ASCII letters and digits.
Your extension code must be placed in the package `eu.kanade.tachiyomi.extension.<lang>.<mysourcename>`. Your extension code must be placed in the package `eu.kanade.tachiyomi.extension.<lang>.<mysourcename>`.
#### AndroidManifest.xml #### AndroidManifest.xml (optional)
A minimal [Android manifest file](https://developer.android.com/guide/topics/manifest/manifest-intro) You only need to create this file if you want to add deep linking to your extension.
is needed for Android to recognize an extension when it's compiled into an APK file. You can also add See [URL intent filter](#url-intent-filter) for more information.
intent filters inside this file (see [URL intent filter](#url-intent-filter) for more information).
#### build.gradle #### build.gradle
Make sure that your new extension's `build.gradle` file follows the following structure: Make sure that your new extension's `build.gradle` file follows the following structure:
```gradle ```groovy
ext { ext {
extName = '<My source name>' extName = '<My source name>'
extClass = '.<MySourceName>' extClass = '.<MySourceName>'
@ -251,10 +250,9 @@ apply from: "$rootDir/common.gradle"
| `extName` | The name of the extension. Should be romanized if site name is not in English. | | `extName` | The name of the extension. Should be romanized if site name is not in English. |
| `extClass` | Points to the class that implements `Source`. You can use a relative path starting with a dot (the package name is the base path). This is used to find and instantiate the source(s). | | `extClass` | Points to the class that implements `Source`. You can use a relative path starting with a dot (the package name is the base path). This is used to find and instantiate the source(s). |
| `extVersionCode` | The extension version code. This must be a positive integer and incremented with any change to the code. | | `extVersionCode` | The extension version code. This must be a positive integer and incremented with any change to the code. |
| `libVersion` | (Optional, defaults to `1.4`) The version of the [extensions library](https://github.com/tachiyomiorg/extensions-lib) used. |
| `isNsfw` | (Optional, defaults to `false`) Flag to indicate that a source contains NSFW content. | | `isNsfw` | (Optional, defaults to `false`) Flag to indicate that a source contains NSFW content. |
The extension's version name is generated automatically by concatenating `libVersion` and `extVersionCode`. The extension's version name is generated automatically by concatenating `1.4` and `extVersionCode`.
With the example used above, the version would be `1.4.1`. With the example used above, the version would be `1.4.1`.
### Core dependencies ### Core dependencies
@ -272,7 +270,7 @@ Referencing the actual implementation will help with understanding extensions' c
for handling [base 64 encoded image data](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs) for handling [base 64 encoded image data](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs)
using an [OkHttp interceptor](https://square.github.io/okhttp/interceptors/). using an [OkHttp interceptor](https://square.github.io/okhttp/interceptors/).
```gradle ```groovy
dependencies { dependencies {
implementation(project(':lib-dataimage')) implementation(project(':lib-dataimage'))
} }
@ -284,7 +282,7 @@ dependencies {
internationalization in the sources. It allows loading `.properties` files with messages located under internationalization in the sources. It allows loading `.properties` files with messages located under
the `assets/i18n` folder of each extension, that can be used to translate strings under the source. the `assets/i18n` folder of each extension, that can be used to translate strings under the source.
```gradle ```groovy
dependencies { dependencies {
implementation(project(':lib-i18n')) implementation(project(':lib-i18n'))
} }

View File

@ -19,7 +19,3 @@ allprojects {
maven(url = "https://jitpack.io") maven(url = "https://jitpack.io")
} }
} }
tasks.register<Delete>("clean") {
delete(rootProject.layout.buildDirectory.asFile.get())
}

View File

@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@ -1,6 +1,5 @@
object AndroidConfig { object AndroidConfig {
const val compileSdk = 34 const val compileSdk = 34
const val minSdk = 21 const val minSdk = 21
@Suppress("UNUSED")
const val targetSdk = 34 const val targetSdk = 34
} }

View File

@ -3,8 +3,11 @@ apply plugin: 'kotlin-android'
apply plugin: 'kotlinx-serialization' apply plugin: 'kotlinx-serialization'
apply plugin: 'org.jmailen.kotlinter' apply plugin: 'org.jmailen.kotlinter'
assert !ext.has("pkgNameSuffix")
assert !ext.has("libVersion")
android { android {
compileSdkVersion AndroidConfig.compileSdk compileSdk AndroidConfig.compileSdk
namespace "eu.kanade.tachiyomi.extension" namespace "eu.kanade.tachiyomi.extension"
sourceSets { sourceSets {
@ -14,39 +17,22 @@ android {
res.srcDirs = ['res'] res.srcDirs = ['res']
assets.srcDirs = ['assets'] assets.srcDirs = ['assets']
} }
release {
manifest.srcFile "AndroidManifest.xml"
}
debug {
manifest.srcFile "AndroidManifest.xml"
}
} }
defaultConfig { defaultConfig {
minSdkVersion AndroidConfig.minSdk minSdk AndroidConfig.minSdk
targetSdkVersion AndroidConfig.targetSdk targetSdk AndroidConfig.targetSdk
applicationIdSuffix project.parent.name + "." + project.name applicationIdSuffix project.parent.name + "." + project.name
versionCode extVersionCode versionCode extVersionCode
versionName project.ext.properties.getOrDefault("libVersion", "1.4") + ".$extVersionCode" versionName "1.4.$versionCode"
base { base {
archivesName = "tachiyomi-$applicationIdSuffix-v$versionName" archivesName = "tachiyomi-$applicationIdSuffix-v$versionName"
} }
def readmes = project.projectDir.listFiles({ File file -> assert extClass.startsWith(".")
file.name == "README.md" || file.name == "CHANGELOG.md"
} as FileFilter)
def hasReadme = readmes != null && readmes.any { File file ->
file.name.startsWith("README")
}
def hasChangelog = readmes != null && readmes.any { File file ->
file.name.startsWith("CHANGELOG")
}
manifestPlaceholders = [ manifestPlaceholders = [
appName : "Tachiyomi: $extName", appName : "Tachiyomi: $extName",
extClass: extClass, extClass: extClass,
extFactory: project.ext.properties.getOrDefault("extFactory", ""), nsfw: project.ext.find("isNsfw") ? 1 : 0,
nsfw: project.ext.properties.getOrDefault("isNsfw", false) ? 1 : 0,
hasReadme: hasReadme ? 1 : 0,
hasChangelog: hasChangelog ? 1 : 0,
] ]
} }
@ -71,9 +57,6 @@ android {
} }
buildFeatures { buildFeatures {
// Disable unused AGP features
aidl false
renderScript false
resValues false resValues false
shaders false shaders false
buildConfig true buildConfig true
@ -107,5 +90,20 @@ dependencies {
compileOnly(libs.bundles.common) compileOnly(libs.bundles.common)
} }
preBuild.dependsOn(lintKotlin) tasks.register("writeManifestFile") {
doLast {
def manifest = android.sourceSets.getByName("main").manifest
if (!manifest.srcFile.exists()) {
File tempFile = layout.buildDirectory.get().file("tempAndroidManifest.xml").getAsFile()
if (!tempFile.exists()) {
tempFile.withWriter {
it.write('<?xml version="1.0" encoding="utf-8"?>\n<manifest />\n')
}
}
manifest.srcFile(tempFile.path)
}
}
}
preBuild.dependsOn(writeManifestFile, lintKotlin)
lintKotlin.dependsOn(formatKotlin) lintKotlin.dependsOn(formatKotlin)

View File

@ -6,10 +6,7 @@
<application android:icon="@mipmap/ic_launcher" android:allowBackup="false" android:label="${appName}"> <application android:icon="@mipmap/ic_launcher" android:allowBackup="false" android:label="${appName}">
<meta-data android:name="tachiyomi.extension.class" android:value="${extClass}" /> <meta-data android:name="tachiyomi.extension.class" android:value="${extClass}" />
<meta-data android:name="tachiyomi.extension.factory" android:value="${extFactory}" />
<meta-data android:name="tachiyomi.extension.nsfw" android:value="${nsfw}" /> <meta-data android:name="tachiyomi.extension.nsfw" android:value="${nsfw}" />
<meta-data android:name="tachiyomi.extension.hasReadme" android:value="${hasReadme}" />
<meta-data android:name="tachiyomi.extension.hasChangelog" android:value="${hasChangelog}" />
</application> </application>

View File

@ -11,7 +11,6 @@ android {
namespace = "eu.kanade.tachiyomi.extension.core" namespace = "eu.kanade.tachiyomi.extension.core"
@Suppress("UnstableApiUsage")
sourceSets { sourceSets {
named("main") { named("main") {
manifest.srcFile("AndroidManifest.xml") manifest.srcFile("AndroidManifest.xml")
@ -19,9 +18,8 @@ android {
} }
} }
libraryVariants.all { buildFeatures {
generateBuildConfigProvider?.configure { resValues = false
enabled = false shaders = false
}
} }
} }

Binary file not shown.

15
gradlew generated vendored
View File

@ -83,10 +83,8 @@ done
# This is normally unused # This is normally unused
# shellcheck disable=SC2034 # shellcheck disable=SC2034
APP_BASE_NAME=${0##*/} APP_BASE_NAME=${0##*/}
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum MAX_FD=maximum
@ -133,11 +131,14 @@ location of your Java installation."
fi fi
else else
JAVACMD=java JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the Please set the JAVA_HOME variable in your environment to match the
location of your Java installation." location of your Java installation."
fi fi
fi
# Increase the maximum file descriptors if we can. # Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
@ -197,6 +198,10 @@ if "$cygwin" || "$msys" ; then
done done
fi fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command; # Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in # shell script including quotes and variable substitutions, so put them in

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -39,4 +39,4 @@ object Deobfuscator {
} }
// Update this when the script is updated! // Update this when the script is updated!
private const val SCRIPT_NAME = "synchrony-v2.4.2.1.js" private const val SCRIPT_NAME = "synchrony-v2.4.5.1.js"

View File

@ -31,6 +31,10 @@ configurations {
dependencies { dependencies {
compileOnly(libs.bundles.common) compileOnly(libs.bundles.common)
// Only PeachScan sources uses the image-decoder dependency.
//noinspection UseTomlInstead
compileOnly("com.github.tachiyomiorg:image-decoder:fbd6601290")
// Implements all :lib libraries on the multisrc generator // Implements all :lib libraries on the multisrc generator
// Note that this does not mean that generated sources are going to // Note that this does not mean that generated sources are going to
// implement them too; this is just to be able to compile and generate sources. // implement them too; this is just to be able to compile and generate sources.

View File

@ -27,9 +27,15 @@ class BilibiliManga : Bilibili(
return emptyList() return emptyList()
} }
return result.data!!.episodeList val data = result.data!!
.filter { episode -> episode.isInFree || !episode.isLocked } val id = data.id
.map { ep -> chapterFromObject(ep, result.data.id) } return data.episodeList.mapNotNull { episode ->
if (episode.isInFree || !episode.isLocked) {
chapterFromObject(episode, id)
} else {
null
}
}
} }
override val defaultPopularSort: Int = 0 override val defaultPopularSort: Int = 0

View File

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -0,0 +1,67 @@
package eu.kanade.tachiyomi.extension.vi.blogtruyen
import eu.kanade.tachiyomi.multisrc.blogtruyen.BlogTruyen
import eu.kanade.tachiyomi.network.interceptor.rateLimit
class BlogTruyenMoi : BlogTruyen("BlogTruyen", "https://blogtruyenmoi.com", "vi") {
override val client = super.client.newBuilder()
.rateLimit(2)
.build()
override fun getGenreList() = listOf(
Genre("Action", "1"),
Genre("Adventure", "3"),
Genre("Comedy", "5"),
Genre("Comic", "6"),
Genre("Doujinshi", "7"),
Genre("Drama", "49"),
Genre("Ecchi", "48"),
Genre("Event BT", "60"),
Genre("Fantasy", "50"),
Genre("Full màu", "64"),
Genre("Game", "61"),
Genre("Gender Bender", "51"),
Genre("Harem", "12"),
Genre("Historical", "13"),
Genre("Horror", "14"),
Genre("Isekai/Dị giới/Trọng sinh", "63"),
Genre("Josei", "15"),
Genre("Live action", "16"),
Genre("Magic", "46"),
Genre("manga", "55"),
Genre("Manhua", "17"),
Genre("Manhwa", "18"),
Genre("Martial Arts", "19"),
Genre("Mecha", "21"),
Genre("Mystery", "22"),
Genre("Nấu Ăn", "56"),
Genre("Ngôn Tình", "65"),
Genre("NTR", "62"),
Genre("One shot", "23"),
Genre("Psychological", "24"),
Genre("Romance", "25"),
Genre("School Life", "26"),
Genre("Sci-fi", "27"),
Genre("Seinen", "28"),
Genre("Shoujo", "29"),
Genre("Shoujo Ai", "30"),
Genre("Shounen", "31"),
Genre("Shounen Ai", "32"),
Genre("Slice of life", "33"),
Genre("Smut", "34"),
Genre("Soft Yaoi", "35"),
Genre("Soft Yuri", "36"),
Genre("Sports", "37"),
Genre("Supernatural", "38"),
Genre("Tạp chí truyện tranh", "39"),
Genre("Tragedy", "40"),
Genre("Trap (Crossdressing)", "58"),
Genre("Trinh Thám", "57"),
Genre("Truyện scan", "41"),
Genre("Tu chân - tu tiên", "66"),
Genre("Video Clip", "53"),
Genre("VnComic", "42"),
Genre("Webtoon", "52"),
Genre("Yuri", "59"),
)
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

View File

@ -0,0 +1,56 @@
package eu.kanade.tachiyomi.extension.vi.blogtruyenvn
import eu.kanade.tachiyomi.multisrc.blogtruyen.BlogTruyen
class BlogTruyenVn : BlogTruyen("BlogTruyen.vn (unoriginal)", "https://blogtruyenvn.com", "vi") {
override fun getGenreList() = listOf(
Genre("Action", "1"),
Genre("Adventure", "3"),
Genre("Comedy", "5"),
Genre("Comic", "6"),
Genre("Doujinshi", "7"),
Genre("Drama", "49"),
Genre("Ecchi", "48"),
Genre("Event BT", "60"),
Genre("Fantasy", "50"),
Genre("Full màu", "64"),
Genre("Game", "61"),
Genre("Harem", "12"),
Genre("Historical", "13"),
Genre("Horror", "14"),
Genre("Isekai/Dị giới/Trọng sinh", "63"),
Genre("Josei", "15"),
Genre("Live action", "16"),
Genre("Magic", "46"),
Genre("manga", "55"),
Genre("Manhua", "17"),
Genre("Manhwa", "18"),
Genre("Martial Arts", "19"),
Genre("Mecha", "21"),
Genre("Mystery", "22"),
Genre("Nấu Ăn", "56"),
Genre("Ngôn Tình", "65"),
Genre("NTR", "62"),
Genre("One shot", "23"),
Genre("Psychological", "24"),
Genre("Romance", "25"),
Genre("School Life", "26"),
Genre("Sci-fi", "27"),
Genre("Seinen", "28"),
Genre("Shoujo", "29"),
Genre("Shounen", "31"),
Genre("Shounen Ai", "32"),
Genre("Slice of life", "33"),
Genre("Smut", "34"),
Genre("Sports", "37"),
Genre("Supernatural", "38"),
Genre("Tạp chí truyện tranh", "39"),
Genre("Tragedy", "40"),
Genre("Trinh Thám", "57"),
Genre("Truyện scan", "41"),
Genre("Tu chân - tu tiên", "66"),
Genre("Video Clip", "53"),
Genre("VnComic", "42"),
Genre("Webtoon", "52"),
)
}

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application> <application>
<activity android:name=".vi.blogtruyen.BlogTruyenUrlActivity" <activity android:name="eu.kanade.tachiyomi.multisrc.blogtruyen.BlogTruyenUrlActivity"
android:excludeFromRecents="true" android:excludeFromRecents="true"
android:exported="true" android:exported="true"
android:theme="@android:style/Theme.NoDisplay"> android:theme="@android:style/Theme.NoDisplay">
@ -11,9 +11,9 @@
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.BROWSABLE" />
<data android:host="blogtruyenmoi.com" /> <data android:host="${SOURCEHOST}" />
<data android:host="m.blogtruyenmoi.com" /> <data android:host="m.${SOURCEHOST}" />
<data android:scheme="https" /> <data android:scheme="${SOURCESCHEME}" />
<data android:pathPattern="/tac-gia/..*" /> <data android:pathPattern="/tac-gia/..*" />
<data android:pathPattern="/nhom-dich/..*" /> <data android:pathPattern="/nhom-dich/..*" />

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

View File

@ -1,56 +0,0 @@
package eu.kanade.tachiyomi.extension.tr.epikmanga
import eu.kanade.tachiyomi.multisrc.fmreader.FMReader
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.asObservableSuccess
import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.MangasPage
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Request
import okhttp3.Response
import org.jsoup.nodes.Document
import rx.Observable
class EpikManga : FMReader("Epik Manga", "https://www.epikmanga.com", "tr") {
override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/seri-listesi?sorting=views&sorting-type=DESC&Sayfa=$page", headers)
override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/seri-listesi?sorting=lastUpdate&sorting-type=DESC&Sayfa=$page", headers)
override fun popularMangaNextPageSelector() = "ul.pagination li.active + li:not(.disabled)"
override val headerSelector = "h4 a"
// search wasn't working on source's website
override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> {
return client.newCall(searchMangaRequest(page, query, filters))
.asObservableSuccess()
.map { response ->
searchMangaParse(response, query)
}
}
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = GET("$baseUrl/seri-listesi?type=text", headers)
private fun searchMangaParse(response: Response, query: String): MangasPage {
val mangas = response.asJsoup().select("div.char.col-lg-4 a").toList()
.filter { it.text().contains(query, ignoreCase = true) }
.map {
SManga.create().apply {
setUrlWithoutDomain(it.attr("href"))
title = it.text()
}
}
return MangasPage(mangas, false)
}
override fun mangaDetailsParse(document: Document): SManga {
val infoElement = document.select("div.col-md-9 div.row").first()!!
return SManga.create().apply {
status = parseStatus(infoElement.select("h4:contains(Durum:)").firstOrNull()?.ownText())
author = infoElement.select("h4:contains(Yazar:)").firstOrNull()?.ownText()
artist = infoElement.select("h4:contains(Çizer:)").firstOrNull()?.ownText()
genre = infoElement.select("h4:contains(Türler:) a").joinToString { it.text() }
thumbnail_url = infoElement.select("img.thumbnail").imgAttr()
description = document.select("div.col-md-12 p").text()
}
}
override fun chapterListSelector() = "table.table tbody tr"
override fun getFilterList(): FilterList = FilterList()
}

View File

@ -1,20 +1,40 @@
package eu.kanade.tachiyomi.extension.ja.manga1000 package eu.kanade.tachiyomi.extension.ja.manga1000
import eu.kanade.tachiyomi.multisrc.fmreader.FMReader import eu.kanade.tachiyomi.multisrc.fmreader.FMReader
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.asObservableSuccess
import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SChapter
import org.jsoup.nodes.Element import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Request
import org.jsoup.nodes.Document
import rx.Observable
import java.util.Calendar import java.util.Calendar
class Manga1000 : FMReader("Manga1000", "https://manga1000.top", "ja") { class Manga1000 : FMReader("Manga1000", "https://manga1000.top", "ja") {
override fun chapterFromElement(element: Element, mangaTitle: String): SChapter { // source is picky about URL format
return SChapter.create().apply { private fun mangaRequest(sortBy: String, page: Int): Request {
element.let { return GET("$baseUrl/manga-list.html?listType=pagination&page=$page&artist=&author=&group=&m_status=&name=&genre=&ungenre=&magazine=&sort=$sortBy&sort_type=DESC", headers)
setUrlWithoutDomain(it.attr("abs:href"))
name = it.attr("title")
} }
date_upload = element.select(chapterTimeSelector) override fun popularMangaRequest(page: Int): Request = mangaRequest("views", page)
.let { if (it.hasText()) parseChapterDate(it.text()) else 0 }
override fun latestUpdatesRequest(page: Int): Request = mangaRequest("last_update", page)
override fun fetchChapterList(manga: SManga): Observable<List<SChapter>> {
val slug = manga.url.substringAfter("manga-").substringBefore(".html")
return client.newCall(GET("$baseUrl/app/manga/controllers/cont.Listchapterapi.php?slug=$slug", headers))
.asObservableSuccess()
.map { res ->
res.asJsoup().select(".at-series a").map {
SChapter.create().apply {
name = it.select(".chapter-name").text()
url = it.attr("abs:href").substringAfter("controllers")
date_upload = parseChapterDate(it.select(".chapter-time").text())
}
}
} }
} }
@ -37,4 +57,18 @@ class Manga1000 : FMReader("Manga1000", "https://manga1000.top", "ja") {
return chapterDate.timeInMillis return chapterDate.timeInMillis
} }
override fun pageListParse(document: Document): List<Page> {
return document.select("script:containsData(imgsListchap)")
.html()
.substringAfter("(")
.substringBefore(",")
.let { cid ->
client.newCall(GET("$baseUrl/app/manga/controllers/cont.imgsList.php?cid=$cid", headers)).execute().asJsoup()
}
.select(".lazyload")
.mapIndexed { i, e ->
Page(i, "", e.attr("abs:data-src"))
}
}
} }

View File

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -0,0 +1,82 @@
package eu.kanade.tachiyomi.extension.ja.nicomanga
import eu.kanade.tachiyomi.multisrc.fmreader.FMReader
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request
import okhttp3.Response
import org.jsoup.nodes.Element
class Nicomanga : FMReader("Nicomanga", "https://nicomanga.com", "ja") {
override val client = super.client.newBuilder()
.rateLimit(2)
.build()
override fun headersBuilder() = super.headersBuilder()
.add("Referer", "$baseUrl/")
// =========================== Manga Details ============================
override val infoElementSelector = ".card-body > div.row"
override val mangaDetailsSelectorGenre = "li:has(b:contains(Genre)) a.btn-danger"
// ============================== Chapters ==============================
override fun chapterListRequest(manga: SManga): Request {
val slug = urlRegex.find(manga.url)?.groupValues?.get(1) ?: throw Exception("Unable to get slug")
val headers = headersBuilder().apply {
add("Accept", "*/*")
add("Host", baseUrl.toHttpUrl().host)
set("Referer", baseUrl + manga.url)
}.build()
return GET("$baseUrl/app/manga/controllers/cont.Listchapterapi.php?slug=$slug", headers)
}
override fun chapterFromElement(element: Element, mangaTitle: String): SChapter = SChapter.create().apply {
element.select(chapterUrlSelector).first()!!.let {
setUrlWithoutDomain("$baseUrl/${it.attr("href")}")
name = it.attr("title")
}
date_upload = element.select(chapterTimeSelector)
.let { if (it.hasText()) parseRelativeDate(it.text()) else 0 }
}
// =============================== Pages ================================
override fun pageListParse(response: Response): List<Page> {
val id = chapterIdRegex.find(response.use { it.body.string() })?.groupValues?.get(1) ?: throw Exception("chapter-id not found")
val doc = client.newCall(
GET("$baseUrl/app/manga/controllers/cont.imgsList.php?cid=$id", headers),
).execute().asJsoup()
return doc.select("img.chapter-img[data-src]").mapIndexed { i, page ->
Page(i + 1, imageUrl = page.attr("data-src"))
}
}
// ============================= Utilities ==============================
override fun getImgAttr(element: Element?): String? {
return when {
element?.attr("style")?.contains("background-image") == true -> {
val url = thumbnailURLRegex.find(element.attr("style"))?.groupValues?.get(1)
when {
url?.startsWith("/") == true -> baseUrl + url
else -> url
}
}
else -> super.getImgAttr(element)
}
}
companion object {
private val thumbnailURLRegex = Regex("background-image:[^;]?url\\s*\\(\\s*'?([^')]+?)'?(\\)|\$)")
private val urlRegex = Regex("manga-([^/]+)\\.html\$")
private val chapterIdRegex = Regex("imgsListchap\\((\\d+)")
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

View File

@ -1,32 +0,0 @@
package eu.kanade.tachiyomi.extension.vi.saytruyen
import eu.kanade.tachiyomi.multisrc.fmreader.FMReader
import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Response
import org.jsoup.nodes.Document
class SayTruyen : FMReader("Say Truyen", "https://saytruyenvip.com", "vi") {
override fun mangaDetailsParse(document: Document): SManga {
val info = document.select("div.row").first()!!
return SManga.create().apply {
author = info.select("div.row li:has(b:contains(Tác giả)) small").text()
genre = info.select("div.row li:has(b:contains(Thể loại)) small a").joinToString { it.text() }
status = parseStatus(info.select("div.row li:has(b:contains(Tình trạng)) a").text())
description = document.select("div.description").text()
thumbnail_url = info.select("img.thumbnail").attr("abs:src")
}
}
override fun chapterListParse(response: Response): List<SChapter> {
return response.asJsoup().let { document ->
document.select(chapterListSelector()).map {
chapterFromElement(it).apply {
scanlator = document.select("div.row li:has(b:contains(Nhóm dịch)) small").text()
}
}
}
}
override fun pageListParse(document: Document): List<Page> = super.pageListParse(document).onEach { it.imageUrl!!.trim() }
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

View File

@ -1,27 +0,0 @@
package eu.kanade.tachiyomi.extension.pt.baixarhentai
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import eu.kanade.tachiyomi.source.model.SManga
import org.jsoup.nodes.Document
import java.util.concurrent.TimeUnit
class BaixarHentai : FoolSlide("Baixar Hentai", "https://leitura.baixarhentai.net", "pt-BR") {
// Hardcode the id because the language wasn't specific.
override val id = 8908032188831949972
override val client = super.client.newBuilder()
.rateLimit(1, 2, TimeUnit.SECONDS)
.build()
override fun mangaDetailsParse(document: Document) = SManga.create().apply {
title = document.select("h1.title").text()
thumbnail_url = getDetailsThumbnail(document, "div.title a")
}
// Always show adult content
override val allowAdult = true
override fun setupPreferenceScreen(screen: PreferenceScreen) {}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

View File

@ -1,15 +0,0 @@
package eu.kanade.tachiyomi.extension.fr.lecercleduscan
import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide
import java.util.Locale
class LeCercleDuScan : FoolSlide("Le Cercle du Scan", "https://lel.lecercleduscan.com", "fr") {
override fun parseChapterDate(date: String) = super.parseChapterDate(
when (val lcDate = date.lowercase(Locale.FRENCH)) {
"hier" -> "yesterday"
"aujourd'hui" -> "today"
"demain" -> "tomorrow"
else -> lcDate
},
)
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

View File

@ -1,10 +0,0 @@
package eu.kanade.tachiyomi.extension.en.hentaisphere
import eu.kanade.tachiyomi.multisrc.hentaihand.HentaiHand
import okhttp3.OkHttpClient
class HentaiSphere : HentaiHand("HentaiSphere", "https://hentaisphere.com", "en", false) {
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
.addInterceptor { authIntercept(it) }
.build()
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

View File

@ -1,10 +0,0 @@
package eu.kanade.tachiyomi.extension.en.readmanhwa
import eu.kanade.tachiyomi.multisrc.hentaihand.HentaiHand
import okhttp3.OkHttpClient
class ReadManhwa : HentaiHand("ReadManhwa", "https://readmanhwa.com", "en", true) {
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
.addInterceptor { authIntercept(it) }
.build()
}

View File

@ -1,25 +1,7 @@
package eu.kanade.tachiyomi.extension.en.adultwebtoon package eu.kanade.tachiyomi.extension.en.adultwebtoon
import eu.kanade.tachiyomi.multisrc.madara.Madara import eu.kanade.tachiyomi.multisrc.madara.Madara
import eu.kanade.tachiyomi.network.GET
import okhttp3.CacheControl
import okhttp3.Request
class AdultWebtoon : Madara("Adult Webtoon", "https://adultwebtoon.com", "en") { class AdultWebtoon : Madara("Adult Webtoon", "https://adultwebtoon.com", "en") {
override fun popularMangaRequest(page: Int): Request { override val mangaSubString = "adult-webtoon"
val pageSuffix = if (page != 1) "page/$page/" else ""
return GET(
"$baseUrl/manga/$pageSuffix?m_orderby=trending",
headers,
CacheControl.FORCE_NETWORK,
)
}
override fun latestUpdatesRequest(page: Int): Request {
val pageSuffix = if (page != 1) "page/$page/" else ""
return GET(
"$baseUrl/manga/$pageSuffix?m_orderby=latest",
headers,
CacheControl.FORCE_NETWORK,
)
}
} }

View File

@ -1,10 +0,0 @@
package eu.kanade.tachiyomi.extension.en.akumanga
import eu.kanade.tachiyomi.multisrc.madara.Madara
class AkuManga : Madara("AkuManga", "https://akumanga.com", "en") {
override val id: Long = 107810123708352143
override val chapterUrlSuffix = ""
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Some files were not shown because too many files have changed in this diff Show More