Compare commits

...

120 Commits

Author SHA1 Message Date
beerpsi
56f64ce41c Rawdevart.art: Fix pagination (#816)
Some checks failed
CI / Prepare job (push) Successful in 3s
CI / Build multisrc modules (push) Failing after 27s
CI / Build individual modules (push) Failing after 7s
CI / Publish repo (push) Has been skipped
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.

19
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,10 +131,13 @@ 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.
@ -144,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #( case $MAX_FD in #(
max*) max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045 # shellcheck disable=SC3045
MAX_FD=$( ulimit -H -n ) || MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit" warn "Could not query maximum file descriptor limit"
esac esac
@ -152,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
'' | soft) :;; #( '' | soft) :;; #(
*) *)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045 # shellcheck disable=SC3045
ulimit -n "$MAX_FD" || ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD" warn "Could not set maximum file descriptor limit to $MAX_FD"
esac esac
@ -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,21 +1,41 @@
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())
}
}
}
} }
private fun parseChapterDate(date: String): Long { private fun parseChapterDate(date: String): Long {
@ -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