diff --git a/src/all/ninehentai/AndroidManifest.xml b/src/all/ninehentai/AndroidManifest.xml
index 30deb7f79..5ed068961 100644
--- a/src/all/ninehentai/AndroidManifest.xml
+++ b/src/all/ninehentai/AndroidManifest.xml
@@ -1,2 +1,23 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/all/ninehentai/build.gradle b/src/all/ninehentai/build.gradle
index 290075f61..f471c7fb0 100644
--- a/src/all/ninehentai/build.gradle
+++ b/src/all/ninehentai/build.gradle
@@ -1,11 +1,12 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
+apply plugin: 'kotlinx-serialization'
ext {
extName = 'NineHentai'
pkgNameSuffix = 'all.ninehentai'
extClass = '.NineHentai'
- extVersionCode = 12
+ extVersionCode = 13
libVersion = '1.2'
containsNsfw = true
}
diff --git a/src/all/ninehentai/src/eu/kanade/tachiyomi/extension/all/ninehentai/Dto.kt b/src/all/ninehentai/src/eu/kanade/tachiyomi/extension/all/ninehentai/Dto.kt
deleted file mode 100644
index e972c6b22..000000000
--- a/src/all/ninehentai/src/eu/kanade/tachiyomi/extension/all/ninehentai/Dto.kt
+++ /dev/null
@@ -1,31 +0,0 @@
-package eu.kanade.tachiyomi.extension.all.ninehentai
-
-import eu.kanade.tachiyomi.source.model.Filter
-
-data class Manga(
- val id: Int,
- var title: String,
- val image_server: String,
- val tags: List,
- val total_page: Int
-)
-
-class Tag(
- val id: Int,
- name: String,
- val description: String = "null",
- val type: Int = 1
-) : Filter.TriState(name)
-
-data class SearchRequest(
- val text: String,
- val page: Int,
- val sort: Int,
- val pages: Map = mapOf("range" to intArrayOf(0, 2000)),
- val tag: Map
-)
-
-data class Items(
- val included: MutableList,
- val excluded: MutableList
-)
diff --git a/src/all/ninehentai/src/eu/kanade/tachiyomi/extension/all/ninehentai/NHTags.kt b/src/all/ninehentai/src/eu/kanade/tachiyomi/extension/all/ninehentai/NHTags.kt
deleted file mode 100644
index 984214805..000000000
--- a/src/all/ninehentai/src/eu/kanade/tachiyomi/extension/all/ninehentai/NHTags.kt
+++ /dev/null
@@ -1,1523 +0,0 @@
-package eu.kanade.tachiyomi.extension.all.ninehentai
-
-object NHTags {
- fun getTagsList() = listOf(
- Tag(id = 16712, name = "3d"),
- Tag(id = 1054, name = "Abortion"),
- Tag(id = 5198, name = "Absorption"),
- Tag(id = 3576, name = "Adventitious Penis"),
- Tag(id = 9348, name = "Adventitious Vagina"),
- Tag(id = 25549, name = "Afro"),
- Tag(id = 193, name = "Age Progression"),
- Tag(id = 702, name = "Age Regression"),
- Tag(id = 214, name = "Ahegao"),
- Tag(id = 6636, name = "Albino"),
- Tag(id = 10, name = "Alien"),
- Tag(id = 1101, name = "Alien Girl"),
- Tag(id = 215, name = "All The Way Through"),
- Tag(id = 23272, name = "Already Uploaded"),
- Tag(id = 288, name = "Amputee"),
- Tag(id = 30, name = "Anal"),
- Tag(id = 6266, name = "Anal Birth"),
- Tag(id = 10530, name = "Animal On Animal"),
- Tag(id = 11881, name = "Animal On Furry"),
- Tag(id = 17056, name = "Animated"),
- Tag(id = 4770, name = "Anorexic"),
- Tag(id = 15880, name = "Anthology"),
- Tag(id = 24975, name = "Ao No Sunadokei"),
- Tag(id = 209, name = "Apron"),
- Tag(id = 814, name = "Armpit Licking"),
- Tag(id = 815, name = "Armpit Sex"),
- Tag(id = 15974, name = "Artbook"),
- Tag(id = 1705, name = "Asphyxiation"),
- Tag(id = 1755, name = "Ass Expansion"),
- Tag(id = 2148, name = "Assjob"),
- Tag(id = 24352, name = "Atsushima Tetsuya"),
- Tag(id = 673, name = "Aunt"),
- Tag(id = 329, name = "Autofellatio"),
- Tag(id = 5662, name = "Autopaizuri"),
- Tag(id = 602, name = "Bald"),
- Tag(id = 1689, name = "Ball Sucking"),
- Tag(id = 5558, name = "Balljob"),
- Tag(id = 6380, name = "Balls Expansion"),
- Tag(id = 19880, name = "Ban Daiki"),
- Tag(id = 36, name = "Bandages"),
- Tag(id = 3424, name = "Bandaid"),
- Tag(id = 16564, name = "Baphomet"),
- Tag(id = 65, name = "Bbm"),
- Tag(id = 860, name = "Bbw"),
- Tag(id = 147, name = "Bdsm"),
- Tag(id = 1154, name = "Bear"),
- Tag(id = 4259, name = "Bear Boy"),
- Tag(id = 2161, name = "Bear Girl"),
- Tag(id = 744, name = "Beauty Mark"),
- Tag(id = 2349, name = "Bee Girl"),
- Tag(id = 25675, name = "Belial"),
- Tag(id = 230, name = "Bestiality"),
- Tag(id = 768, name = "Big Areolae"),
- Tag(id = 175, name = "Big Ass"),
- Tag(id = 1979, name = "Big Balls"),
- Tag(id = 42, name = "Big Breasts"),
- Tag(id = 559, name = "Big Clit"),
- Tag(id = 5081, name = "Big Lips"),
- Tag(id = 861, name = "Big Nipples"),
- Tag(id = 127, name = "Big Penis"),
- Tag(id = 5387, name = "Big Vagina"),
- Tag(id = 130, name = "Bike Shorts"),
- Tag(id = 201, name = "Bikini"),
- Tag(id = 284, name = "Birth"),
- Tag(id = 121, name = "Bisexual"),
- Tag(id = 104, name = "Blackmail"),
- Tag(id = 1057, name = "Blind"),
- Tag(id = 1004, name = "Blindfold"),
- Tag(id = 330, name = "Blood"),
- Tag(id = 106, name = "Bloomers"),
- Tag(id = 52, name = "Blowjob"),
- Tag(id = 2274, name = "Blowjob Face"),
- Tag(id = 269, name = "Body Modification"),
- Tag(id = 888, name = "Body Painting"),
- Tag(id = 5502, name = "Body Swap"),
- Tag(id = 3385, name = "Body Writing"),
- Tag(id = 4359, name = "Bodystocking"),
- Tag(id = 35, name = "Bodysuit"),
- Tag(id = 107, name = "Bondage"),
- Tag(id = 5101, name = "Brain Fuck"),
- Tag(id = 22629, name = "Brave Kingdom"),
- Tag(id = 194, name = "Breast Expansion"),
- Tag(id = 246, name = "Breast Feeding"),
- Tag(id = 2801, name = "Breast Reduction"),
- Tag(id = 335, name = "Bride"),
- Tag(id = 2216, name = "Brother"),
- Tag(id = 25392, name = "Buddly Love"),
- Tag(id = 131, name = "Bukkake"),
- Tag(id = 561, name = "Bull"),
- Tag(id = 16623, name = "Bump Squad Wolfsbane"),
- Tag(id = 797, name = "Bunny Boy"),
- Tag(id = 76, name = "Bunny Girl"),
- Tag(id = 17169, name = "Burn Out Syndrome"),
- Tag(id = 14027, name = "Burping"),
- Tag(id = 585, name = "Business Suit"),
- Tag(id = 16194, name = "Buso"),
- Tag(id = 20819, name = "Buta Hormone"),
- Tag(id = 1534, name = "Butler"),
- Tag(id = 20149, name = "Byoujo No Sho"),
- Tag(id = 16605, name = "Cacty"),
- Tag(id = 289, name = "Cannibalism"),
- Tag(id = 16362, name = "Canvas 2"),
- Tag(id = 19114, name = "Capsule"),
- Tag(id = 16484, name = "Captain Tsubasa Fcmin Hiroshima"),
- Tag(id = 16028, name = "Caption"),
- Tag(id = 10130, name = "Cashier"),
- Tag(id = 599, name = "Cat"),
- Tag(id = 562, name = "Catboy"),
- Tag(id = 17122, name = "Catch And Release"),
- Tag(id = 3115, name = "Catfight"),
- Tag(id = 77, name = "Catgirl"),
- Tag(id = 1053, name = "Cbt"),
- Tag(id = 25097, name = "Cc6512"),
- Tag(id = 2468, name = "Centaur"),
- Tag(id = 239, name = "Cervix Penetration"),
- Tag(id = 25210, name = "Chakichi"),
- Tag(id = 1049, name = "Chastity Belt"),
- Tag(id = 17123, name = "Chayamachi Mejiro"),
- Tag(id = 211, name = "Cheating"),
- Tag(id = 132, name = "Cheerleader"),
- Tag(id = 19745, name = "Chihiro Nobuki"),
- Tag(id = 20502, name = "Chika Madoka"),
- Tag(id = 22943, name = "Chikadoh"),
- Tag(id = 533, name = "Chikan"),
- Tag(id = 774, name = "Chinese Dress"),
- Tag(id = 25058, name = "Chinpo"),
- Tag(id = 15911, name = "Chitumatsuriya Honpo"),
- Tag(id = 16516, name = "Chloe Wichers"),
- Tag(id = 19312, name = "Chloe Withers"),
- Tag(id = 148, name = "Chloroform"),
- Tag(id = 19538, name = "Chobikuma"),
- Tag(id = 18671, name = "Choiki"),
- Tag(id = 16987, name = "Chou Shiryu"),
- Tag(id = 16075, name = "Chouji Maboroshi"),
- Tag(id = 17135, name = "Chouko"),
- Tag(id = 22986, name = "Chounyuu For You"),
- Tag(id = 23808, name = "Chounyuu Kenkyuushitsu"),
- Tag(id = 1598, name = "Christmas"),
- Tag(id = 21526, name = "Chrono Nanae"),
- Tag(id = 16546, name = "Chu-shin Kuranosuke"),
- Tag(id = 19374, name = "Chubold"),
- Tag(id = 22053, name = "Chuchu"),
- Tag(id = 16443, name = "Chunen"),
- Tag(id = 17036, name = "Clalaclan Philias"),
- Tag(id = 5840, name = "Clamp"),
- Tag(id = 16280, name = "Clara.v"),
- Tag(id = 16140, name = "Classmates"),
- Tag(id = 1178, name = "Clit Growth"),
- Tag(id = 4008, name = "Closed Eyes"),
- Tag(id = 2691, name = "Clothed Female Nude Male"),
- Tag(id = 8975, name = "Clothed Male Nude Female"),
- Tag(id = 5229, name = "Clothed Paizuri"),
- Tag(id = 16661, name = "Clown"),
- Tag(id = 1044, name = "Coach"),
- Tag(id = 5826, name = "Cockslapping"),
- Tag(id = 231, name = "Collar"),
- Tag(id = 16496, name = "Compilation"),
- Tag(id = 179, name = "Condom"),
- Tag(id = 13690, name = "Conjoined"),
- Tag(id = 3064, name = "Coprophagia"),
- Tag(id = 25201, name = "Cor Leonis"),
- Tag(id = 22318, name = "Coribou"),
- Tag(id = 253, name = "Corruption"),
- Tag(id = 796, name = "Corset"),
- Tag(id = 527, name = "Cosplaying"),
- Tag(id = 674, name = "Cousin"),
- Tag(id = 16666, name = "Cousinanon"),
- Tag(id = 14293, name = "Cow"),
- Tag(id = 564, name = "Cowgirl"),
- Tag(id = 7008, name = "Cowman"),
- Tag(id = 25442, name = "Creamytea"),
- Tag(id = 128, name = "Crossdressing"),
- Tag(id = 852, name = "Crotch Tattoo"),
- Tag(id = 4034, name = "Crown"),
- Tag(id = 17534, name = "Cubetype"),
- Tag(id = 4760, name = "Cum Bath"),
- Tag(id = 535, name = "Cum In Eye"),
- Tag(id = 913, name = "Cum Swap"),
- Tag(id = 560, name = "Cunnilingus"),
- Tag(id = 10106, name = "Cuntboy"),
- Tag(id = 17444, name = "Curo-kun"),
- Tag(id = 23878, name = "Cyan Coke"),
- Tag(id = 17323, name = "Cynthia B. Rogers"),
- Tag(id = 16510, name = "Dabi"),
- Tag(id = 18152, name = "Dai Moru Ya"),
- Tag(id = 16120, name = "Daiousamajihen"),
- Tag(id = 16366, name = "Dakouin Saboru"),
- Tag(id = 16008, name = "Danger-j"),
- Tag(id = 23670, name = "Darai."),
- Tag(id = 1306, name = "Dark Nipples"),
- Tag(id = 16662, name = "Dark Princess"),
- Tag(id = 3621, name = "Dark Sclera"),
- Tag(id = 51, name = "Dark Skin"),
- Tag(id = 275, name = "Daughter"),
- Tag(id = 16017, name = "De Kirei Yume"),
- Tag(id = 20305, name = "Deception Iv"),
- Tag(id = 216, name = "Deepthroat"),
- Tag(id = 24670, name = "Deer Boy"),
- Tag(id = 16956, name = "Deer Girl"),
- Tag(id = 67, name = "Defloration"),
- Tag(id = 17321, name = "Gyuo"),
- Tag(id = 15909, name = "Gyupaibyu"),
- Tag(id = 25565, name = "Gyzertoast"),
- Tag(id = 16759, name = "Hachikyu"),
- Tag(id = 20014, name = "Hachimitsu Ouji"),
- Tag(id = 19369, name = "Hadaka"),
- Tag(id = 16772, name = "Hadamurasaki"),
- Tag(id = 16474, name = "Hagiri"),
- Tag(id = 15251, name = "Haigure"),
- Tag(id = 2647, name = "Hairjob"),
- Tag(id = 336, name = "Hairy"),
- Tag(id = 337, name = "Hairy Armpits"),
- Tag(id = 17070, name = "Haitenai"),
- Tag(id = 22944, name = "Halco"),
- Tag(id = 16293, name = "Halftooth"),
- Tag(id = 20445, name = "Halkrom"),
- Tag(id = 24341, name = "Halsione"),
- Tag(id = 15898, name = "Hamu Boshi"),
- Tag(id = 17064, name = "Hanaoka"),
- Tag(id = 16792, name = "Hanatarou"),
- Tag(id = 7088, name = "Handicapped"),
- Tag(id = 352, name = "Handjob"),
- Tag(id = 15919, name = "Hanzaki Ran"),
- Tag(id = 17041, name = "Happy Start"),
- Tag(id = 16376, name = "Haraheridou"),
- Tag(id = 16954, name = "Harapeko Manbou"),
- Tag(id = 20423, name = "Harazumi Tami"),
- Tag(id = 16189, name = "Haredou"),
- Tag(id = 270, name = "Harem"),
- Tag(id = 16115, name = "Harenchi Noon"),
- Tag(id = 22137, name = "Hareta"),
- Tag(id = 15877, name = "Harimaro"),
- Tag(id = 3468, name = "Harness"),
- Tag(id = 616, name = "Harpy"),
- Tag(id = 17537, name = "Hatomile"),
- Tag(id = 16483, name = "Hayase Hidekazu"),
- Tag(id = 17473, name = "Hayato Shibusawa"),
- Tag(id = 16736, name = "Heart Core"),
- Tag(id = 17552, name = "Hebun Irebun"),
- Tag(id = 24170, name = "Hemu"),
- Tag(id = 15905, name = "Henachokopinkizu"),
- Tag(id = 16183, name = "Hentai B"),
- Tag(id = 16072, name = "Hentai The Radical"),
- Tag(id = 21724, name = "Heresy"),
- Tag(id = 3527, name = "Heterochromia"),
- Tag(id = 19908, name = "Hidamaru"),
- Tag(id = 125, name = "Hidden Sex"),
- Tag(id = 16164, name = "Hieda No Anana"),
- Tag(id = 16165, name = "Hieda No Aya"),
- Tag(id = 16005, name = "Hieda Touijin"),
- Tag(id = 15907, name = "Higashizato Kirico"),
- Tag(id = 18131, name = "Higumax"),
- Tag(id = 9356, name = "Hijab"),
- Tag(id = 24155, name = "Hikari Kamigishi"),
- Tag(id = 16632, name = "Hikari Konohana"),
- Tag(id = 15981, name = "Hikaru Hayashi"),
- Tag(id = 22492, name = "Hikkin"),
- Tag(id = 17457, name = "Hikoushi"),
- Tag(id = 17138, name = "Himawari Manjyu"),
- Tag(id = 19581, name = "Himitsu No Hanazono"),
- Tag(id = 15903, name = "Hina Can"),
- Tag(id = 16026, name = "Hiroki Endo"),
- Tag(id = 16336, name = "Hisako Ushigami"),
- Tag(id = 24708, name = "Hisashi Ryuuto"),
- Tag(id = 25200, name = "Hiyori Chan"),
- Tag(id = 23351, name = "Hizuki Haruka"),
- Tag(id = 16982, name = "Hmp"),
- Tag(id = 15978, name = "Hobihobi"),
- Tag(id = 15895, name = "Hokuhokutou Ejiputo Gaisha"),
- Tag(id = 17246, name = "Homigiwa Ichiyou"),
- Tag(id = 15902, name = "Homing Spitz"),
- Tag(id = 16256, name = "Honami Majo"),
- Tag(id = 21678, name = "Honenuki Chicken."),
- Tag(id = 20041, name = "Hong Ban-jang"),
- Tag(id = 21465, name = "Hori Makoto"),
- Tag(id = 1712, name = "Horns"),
- Tag(id = 15899, name = "Horny Animals"),
- Tag(id = 17178, name = "Horobi No Michi"),
- Tag(id = 234, name = "Horse"),
- Tag(id = 1577, name = "Horse Boy"),
- Tag(id = 8480, name = "Horse Cock"),
- Tag(id = 1578, name = "Horse Girl"),
- Tag(id = 1187, name = "Hotpants"),
- Tag(id = 15982, name = "How To"),
- Tag(id = 202, name = "Huge Breasts"),
- Tag(id = 282, name = "Huge Penis"),
- Tag(id = 21295, name = "Hui C"),
- Tag(id = 1095, name = "Human On Furry"),
- Tag(id = 298, name = "Human Pet"),
- Tag(id = 753, name = "Humiliation"),
- Tag(id = 16216, name = "Husky Guy"),
- Tag(id = 16225, name = "Hutamizu Kirin"),
- Tag(id = 20991, name = "Hyakuhachi Kyoukai"),
- Tag(id = 17315, name = "Hys"),
- Tag(id = 24780, name = "Ibarad"),
- Tag(id = 16238, name = "Ibaraki Kasen"),
- Tag(id = 16711, name = "Ice Lee"),
- Tag(id = 16105, name = "Ichinensei Ni Nacchattara"),
- Tag(id = 21720, name = "Idumi"),
- Tag(id = 15874, name = "If Code"),
- Tag(id = 18986, name = "Iiniku Ushijima"),
- Tag(id = 17229, name = "Iisuke"),
- Tag(id = 16788, name = "Ikebukuro"),
- Tag(id = 15998, name = "Ikenie Seminar"),
- Tag(id = 16339, name = "Im Dal-young"),
- Tag(id = 15973, name = "Immoral Maika"),
- Tag(id = 220, name = "Impregnation"),
- Tag(id = 18800, name = "Inazuma Blade"),
- Tag(id = 203, name = "Incest"),
- Tag(id = 15868, name = "Incomplete"),
- Tag(id = 8840, name = "Infantilism"),
- Tag(id = 221, name = "Inflation"),
- Tag(id = 21709, name = "Inijio"),
- Tag(id = 17962, name = "Inner Moka"),
- Tag(id = 16144, name = "Inoue"),
- Tag(id = 236, name = "Insect"),
- Tag(id = 4648, name = "Insect Boy"),
- Tag(id = 2469, name = "Insect Girl"),
- Tag(id = 1252, name = "Inseki"),
- Tag(id = 16978, name = "Inugoya Kakko Kari"),
- Tag(id = 22358, name = "Inuguro Sansei"),
- Tag(id = 24207, name = "Inui Achu"),
- Tag(id = 24994, name = "Inunabe"),
- Tag(id = 23760, name = "Inuzuka Koutarou"),
- Tag(id = 242, name = "Inverted Nipples"),
- Tag(id = 1424, name = "Invisible"),
- Tag(id = 20910, name = "Ireading"),
- Tag(id = 18318, name = "Irukukwu"),
- Tag(id = 16885, name = "Isana Tachibana"),
- Tag(id = 16498, name = "Isobe Mutsumi"),
- Tag(id = 16276, name = "Issei Ryuudou"),
- Tag(id = 16701, name = "Itigosizu Eri Natsume"),
- Tag(id = 17005, name = "Itomari"),
- Tag(id = 15975, name = "Itsuki Sayaka"),
- Tag(id = 23386, name = "Iwapero"),
- Tag(id = 16142, name = "Izawa"),
- Tag(id = 25181, name = "Izu"),
- Tag(id = 17556, name = "Izumi-s"),
- Tag(id = 21941, name = "Izumida Touichirou"),
- Tag(id = 16468, name = "Jace Beleren"),
- Tag(id = 19082, name = "Jack O Lantern"),
- Tag(id = 16157, name = "Jaga Note"),
- Tag(id = 16942, name = "Jake Muller"),
- Tag(id = 16321, name = "Jibakurei"),
- Tag(id = 25577, name = "Jiggly Toons"),
- Tag(id = 17156, name = "Jika"),
- Tag(id = 19874, name = "Joe Hasegawa"),
- Tag(id = 17324, name = "Johnny-do"),
- Tag(id = 16774, name = "Johnnys Jimusho"),
- Tag(id = 16950, name = "Jomy Marquis Shin"),
- Tag(id = 16263, name = "Jonokuchi Joji"),
- Tag(id = 18310, name = "Jony"),
- Tag(id = 18990, name = "Jonylaser R"),
- Tag(id = 17778, name = "Joso No Oji-sama"),
- Tag(id = 2231, name = "Josou Seme"),
- Tag(id = 24084, name = "Jsc"),
- Tag(id = 16495, name = "Juana"),
- Tag(id = 16222, name = "Jun686"),
- Tag(id = 23865, name = "Junior"),
- Tag(id = 16625, name = "Junjou Kurarimondo"),
- Tag(id = 22065, name = "Junkie Daijin"),
- Tag(id = 16078, name = "Juuichijou"),
- Tag(id = 20745, name = "Juurokurou"),
- Tag(id = 23758, name = "K.tomo"),
- Tag(id = 15984, name = "K.z.z."),
- Tag(id = 15985, name = "K.z.z. Force"),
- Tag(id = 15986, name = "K.z.z. Gundan"),
- Tag(id = 17660, name = "K2tomonokai"),
- Tag(id = 22223, name = "Kabi Killer"),
- Tag(id = 17227, name = "Kabutomaru Choko"),
- Tag(id = 24023, name = "Kadarinka"),
- Tag(id = 23374, name = "Kagayakitei"),
- Tag(id = 16267, name = "Kagehara Hanzow"),
- Tag(id = 16976, name = "Kagura Heki"),
- Tag(id = 19909, name = "Kaijuu"),
- Tag(id = 18440, name = "Kaishou Nachi"),
- Tag(id = 17147, name = "Kaitouchuu."),
- Tag(id = 23508, name = "Kakeyu"),
- Tag(id = 16584, name = "Kamadoya"),
- Tag(id = 21085, name = "Kamatsukatei"),
- Tag(id = 20255, name = "Kamiaya"),
- Tag(id = 16315, name = "Kaminobe"),
- Tag(id = 16316, name = "Kaminobe Kanon"),
- Tag(id = 18528, name = "Kamiomi Tsukuyomi"),
- Tag(id = 16606, name = "Kamo Nabako"),
- Tag(id = 17155, name = "Kaname Itsuki"),
- Tag(id = 16274, name = "Kanatofu"),
- Tag(id = 23940, name = "Kancho"),
- Tag(id = 15912, name = "Kankuro"),
- Tag(id = 18378, name = "Kannagi No Tori"),
- Tag(id = 24265, name = "Kano Yattsu Hashi"),
- Tag(id = 16826, name = "Kanran Okawa"),
- Tag(id = 18818, name = "Kanu Uncho"),
- Tag(id = 5660, name = "Kappa"),
- Tag(id = 21307, name = "Kare-nidaikon"),
- Tag(id = 24171, name = "Karhu"),
- Tag(id = 17168, name = "Kasai Yukiha"),
- Tag(id = 18360, name = "Kashinopon"),
- Tag(id = 16519, name = "Katanashi Apollo"),
- Tag(id = 19616, name = "Katou Setsuko"),
- Tag(id = 16831, name = "Katsumi Liqueur"),
- Tag(id = 21010, name = "Kawada"),
- Tag(id = 16456, name = "Kawakita Hiroyuki"),
- Tag(id = 16850, name = "Kazemichi"),
- Tag(id = 15892, name = "Kazoku Yuugi"),
- Tag(id = 24881, name = "Kazumi Araiwa"),
- Tag(id = 15956, name = "Kdft"),
- Tag(id = 23717, name = "Kebiishi"),
- Tag(id = 15972, name = "Keikihei"),
- Tag(id = 15878, name = "Keitaro Arima"),
- Tag(id = 80, name = "Kemonomimi"),
- Tag(id = 16979, name = "Kemonoskey"),
- Tag(id = 16557, name = "Ken Fudou"),
- Tag(id = 23880, name = "Kenesco"),
- Tag(id = 23881, name = "Kenesu"),
- Tag(id = 16558, name = "Kenn Fudou"),
- Tag(id = 20769, name = "Kenta Yumiya"),
- Tag(id = 25043, name = "Kichihachi"),
- Tag(id = 21547, name = "Kien-biu"),
- Tag(id = 1155, name = "Kigurumi"),
- Tag(id = 16633, name = "Kimiaki Shirai"),
- Tag(id = 16340, name = "Kimkwang-hyun"),
- Tag(id = 17199, name = "Kimmie"),
- Tag(id = 689, name = "Kimono"),
- Tag(id = 16627, name = "Kin-tore"),
- Tag(id = 6173, name = "Kindergarten Uniform"),
- Tag(id = 16761, name = "Kinkaku"),
- Tag(id = 17116, name = "Kinmechou Pinku"),
- Tag(id = 22920, name = "Kinnataro"),
- Tag(id = 16834, name = "Kino Asana"),
- Tag(id = 22586, name = "Kinomiya Yutaka"),
- Tag(id = 17842, name = "Kira Asamiya"),
- Tag(id = 16671, name = "Kiri Gami Shima"),
- Tag(id = 16672, name = "Kiri Shin Shima"),
- Tag(id = 16355, name = "Kirimochi Niwe"),
- Tag(id = 724, name = "Kissing"),
- Tag(id = 16793, name = "Kitamakura"),
- Tag(id = 18682, name = "Kitou Chimata"),
- Tag(id = 25255, name = "Kitsunekov"),
- Tag(id = 3473, name = "Kneepit Sex"),
- Tag(id = 21820, name = "Kobamiso"),
- Tag(id = 17109, name = "Koboshi"),
- Tag(id = 21384, name = "Kohako"),
- Tag(id = 16141, name = "Kohe"),
- Tag(id = 18298, name = "Koi Mo Mata Utau"),
- Tag(id = 17325, name = "Koikuchikinako"),
- Tag(id = 25612, name = "Kokitsuma"),
- Tag(id = 15896, name = "Kokuritsu Shounen"),
- Tag(id = 16678, name = "Kokuryu"),
- Tag(id = 17267, name = "Kokuto Nikke"),
- Tag(id = 23694, name = "Konakona"),
- Tag(id = 23872, name = "Konbu Kyoudai"),
- Tag(id = 23151, name = "Konezu"),
- Tag(id = 16851, name = "Konno Kita"),
- Tag(id = 16949, name = "Konoka"),
- Tag(id = 16306, name = "Koridorasu"),
- Tag(id = 19523, name = "Kotarou Katsura"),
- Tag(id = 16922, name = "Kotoe"),
- Tag(id = 19555, name = "Kou-chan"),
- Tag(id = 18799, name = "Koube Iori"),
- Tag(id = 17278, name = "Kozo Youhei"),
- Tag(id = 21828, name = "Kozountoko"),
- Tag(id = 15901, name = "Kudara Naizo"),
- Tag(id = 16424, name = "Kumazaki Satoru"),
- Tag(id = 17658, name = "Kunisaki"),
- Tag(id = 377, name = "Kunoichi"),
- Tag(id = 24057, name = "Kuntakku"),
- Tag(id = 16870, name = "Kurajin"),
- Tag(id = 17086, name = "Kurazushi"),
- Tag(id = 24069, name = "Kurenai Okome"),
- Tag(id = 19039, name = "Kurokami Kujika"),
- Tag(id = 22340, name = "Kuromaru"),
- Tag(id = 17215, name = "Kuromoinu No Kemono"),
- Tag(id = 16138, name = "Kuroshiro"),
- Tag(id = 17002, name = "Kurumigi Kurumi"),
- Tag(id = 20608, name = "Kuryu Josai"),
- Tag(id = 20395, name = "Kusogaki Teikoku"),
- Tag(id = 20572, name = "Kusoge"),
- Tag(id = 24249, name = "Kussie"),
- Tag(id = 23474, name = "Kusu"),
- Tag(id = 16114, name = "Kuu"),
- Tag(id = 16695, name = "Kuukaku"),
- Tag(id = 16265, name = "Kyojinkou"),
- Tag(id = 19338, name = "Kyojitsu Himaku"),
- Tag(id = 20583, name = "Kyoroukan"),
- Tag(id = 16955, name = "Kyougoku Akira"),
- Tag(id = 212, name = "Lab Coat"),
- Tag(id = 204, name = "Lactation"),
- Tag(id = 24573, name = "Landstalker"),
- Tag(id = 22394, name = "Langley"),
- Tag(id = 222, name = "Large Insertions"),
- Tag(id = 15925, name = "Largo"),
- Tag(id = 75, name = "Latex"),
- Tag(id = 1407, name = "Layer Cake"),
- Tag(id = 25125, name = "Leash"),
- Tag(id = 16341, name = "Lee Soo-hyon"),
- Tag(id = 16998, name = "Lee Yo Dong"),
- Tag(id = 1647, name = "Leg Lock"),
- Tag(id = 7978, name = "Legjob"),
- Tag(id = 17052, name = "Lenna"),
- Tag(id = 16985, name = "Leon"),
- Tag(id = 22295, name = "Leonstar"),
- Tag(id = 958, name = "Leotard"),
- Tag(id = 16665, name = "Lhytiss"),
- Tag(id = 19309, name = "Liangshan Bo"),
- Tag(id = 16290, name = "Liaswe No.9"),
- Tag(id = 16517, name = "Lillian Ljungstrom"),
- Tag(id = 17102, name = "Ling"),
- Tag(id = 782, name = "Lingerie"),
- Tag(id = 8995, name = "Lion"),
- Tag(id = 20966, name = "Lioness"),
- Tag(id = 15916, name = "Little Retro"),
- Tag(id = 710, name = "Living Clothes"),
- Tag(id = 3709, name = "Lizard Girl"),
- Tag(id = 2491, name = "Lizard Guy"),
- Tag(id = 54, name = "Lolicon"),
- Tag(id = 16143, name = "Lolita Core"),
- Tag(id = 2742, name = "Long Tongue"),
- Tag(id = 25252, name = "Lordkingu"),
- Tag(id = 17085, name = "Love Junky"),
- Tag(id = 16261, name = "Lovely Kinoko"),
- Tag(id = 3681, name = "Low Bestiality"),
- Tag(id = 94, name = "Low Lolicon"),
- Tag(id = 1938, name = "Low Shotacon"),
- Tag(id = 16943, name = "M Company"),
- Tag(id = 16541, name = "M Works"),
- Tag(id = 16221, name = "M2 Company"),
- Tag(id = 23339, name = "Maako Asagiri"),
- Tag(id = 16931, name = "Macaroni.e"),
- Tag(id = 16957, name = "Machan Nankin"),
- Tag(id = 271, name = "Machine"),
- Tag(id = 23066, name = "Machino Suteinu"),
- Tag(id = 23767, name = "Machio"),
- Tag(id = 13273, name = "Maggot"),
- Tag(id = 640, name = "Magical Girl"),
- Tag(id = 16059, name = "Mahou Shounen Majorian"),
- Tag(id = 55, name = "Maid"),
- Tag(id = 25194, name = "Maita Keikaku"),
- Tag(id = 16243, name = "Majorina"),
- Tag(id = 17572, name = "Makamaka Dou"),
- Tag(id = 25636, name = "Makeup"),
- Tag(id = 16004, name = "Makie Sazaki"),
- Tag(id = 24882, name = "Makoto Araiwa"),
- Tag(id = 16744, name = "Makoto Sako"),
- Tag(id = 15886, name = "Makoto Teteno"),
- Tag(id = 22583, name = "Malboro"),
- Tag(id = 95, name = "Male On Dickgirl"),
- Tag(id = 686, name = "Males Only"),
- Tag(id = 19159, name = "Mami Itou"),
- Tag(id = 15950, name = "Manaka De Ikuno"),
- Tag(id = 25025, name = "Manga Jigoku"),
- Tag(id = 16486, name = "Mangetsu Ujiya"),
- Tag(id = 16208, name = "Mannmaru"),
- Tag(id = 23178, name = "Mao Fa Bao"),
- Tag(id = 22921, name = "Maou Kyuu"),
- Tag(id = 24668, name = "Mari Tamaki"),
- Tag(id = 21395, name = "Marie Ange"),
- Tag(id = 19487, name = "Marika Hoshino"),
- Tag(id = 20235, name = "Marusuke"),
- Tag(id = 19645, name = "Maruya Kae"),
- Tag(id = 16437, name = "Mashiba Kenta"),
- Tag(id = 118, name = "Masked Face"),
- Tag(id = 23319, name = "Master Asia"),
- Tag(id = 90, name = "Masturbation"),
- Tag(id = 16647, name = "Masuda Aura"),
- Tag(id = 23163, name = "Mata Kara Stream"),
- Tag(id = 16307, name = "Matsukazon"),
- Tag(id = 15891, name = "Matsumoto Mimi"),
- Tag(id = 16969, name = "Mazala."),
- Tag(id = 16463, name = "Me Ten"),
- Tag(id = 21432, name = "Mebaeros"),
- Tag(id = 1260, name = "Mecha Boy"),
- Tag(id = 1615, name = "Mecha Girl"),
- Tag(id = 16932, name = "Medetaya"),
- Tag(id = 24450, name = "Meikyukoubou"),
- Tag(id = 16825, name = "Melibe Mukade"),
- Tag(id = 5329, name = "Menstruation"),
- Tag(id = 5201, name = "Mermaid"),
- Tag(id = 5341, name = "Merman"),
- Tag(id = 25382, name = "Merryweather"),
- Tag(id = 959, name = "Metal Armor"),
- Tag(id = 24906, name = "Metameta"),
- Tag(id = 24907, name = "Metametadan"),
- Tag(id = 20406, name = "Metata"),
- Tag(id = 16617, name = "Miakis"),
- Tag(id = 16429, name = "Michiru Katou"),
- Tag(id = 16085, name = "Microgravity"),
- Tag(id = 3289, name = "Midget"),
- Tag(id = 17027, name = "Midoh Tsukasaa"),
- Tag(id = 18452, name = "Mikado Muramasa"),
- Tag(id = 18687, name = "Mikado Sensei"),
- Tag(id = 17065, name = "Mikage Mika"),
- Tag(id = 152, name = "Miko"),
- Tag(id = 22689, name = "Mikumo"),
- Tag(id = 18023, name = "Mikuni Jiou"),
- Tag(id = 16363, name = "Mikupantu"),
- Tag(id = 205, name = "Milf"),
- Tag(id = 17078, name = "Milfeuille Sakuraba"),
- Tag(id = 811, name = "Military"),
- Tag(id = 17476, name = "Dekamarasu Scirocco"),
- Tag(id = 685, name = "Demon"),
- Tag(id = 78, name = "Demon Girl"),
- Tag(id = 17023, name = "Deriken"),
- Tag(id = 17024, name = "Deriya"),
- Tag(id = 16876, name = "Descent Into Darkness"),
- Tag(id = 24824, name = "Detention"),
- Tag(id = 1151, name = "Diaper"),
- Tag(id = 23413, name = "Dic-f41"),
- Tag(id = 149, name = "Dick Growth"),
- Tag(id = 150, name = "Dickgirl On Dickgirl"),
- Tag(id = 16693, name = "Dickgirl On Female"),
- Tag(id = 266, name = "Dickgirl On Male"),
- Tag(id = 3068, name = "Dickgirls Only"),
- Tag(id = 2735, name = "Dicknipples"),
- Tag(id = 24289, name = "Digianko"),
- Tag(id = 111, name = "Dilf"),
- Tag(id = 16926, name = "Dingo Egret"),
- Tag(id = 16927, name = "Dingo Igrit"),
- Tag(id = 7096, name = "Dinosaur"),
- Tag(id = 19202, name = "Dismantling"),
- Tag(id = 17018, name = "Doburoki"),
- Tag(id = 261, name = "Dog"),
- Tag(id = 446, name = "Dog Boy"),
- Tag(id = 296, name = "Dog Girl"),
- Tag(id = 15889, name = "Dogu Bros."),
- Tag(id = 16974, name = "Dojidom"),
- Tag(id = 17952, name = "Doku Ninjin"),
- Tag(id = 5464, name = "Doll Joints"),
- Tag(id = 2506, name = "Dolphin"),
- Tag(id = 5665, name = "Donkey"),
- Tag(id = 18545, name = "Doppel Gangers"),
- Tag(id = 22418, name = "Dorina"),
- Tag(id = 22635, name = "Dosukoi"),
- Tag(id = 1525, name = "Double Anal"),
- Tag(id = 1589, name = "Double Blowjob"),
- Tag(id = 133, name = "Double Penetration"),
- Tag(id = 17249, name = "Double Sensei Life"),
- Tag(id = 217, name = "Double Vaginal"),
- Tag(id = 1229, name = "Dougi"),
- Tag(id = 16490, name = "Doumeki"),
- Tag(id = 5865, name = "Dragon"),
- Tag(id = 24209, name = "Drasna"),
- Tag(id = 23510, name = "Drawg"),
- Tag(id = 19857, name = "Dreamers Fantasy"),
- Tag(id = 108, name = "Drugs"),
- Tag(id = 775, name = "Drunk"),
- Tag(id = 16113, name = "Duga"),
- Tag(id = 24408, name = "Eagle Marin"),
- Tag(id = 4675, name = "Ear Fuck"),
- Tag(id = 19315, name = "Ebio"),
- Tag(id = 18286, name = "Ebipan"),
- Tag(id = 17371, name = "Ebisuya"),
- Tag(id = 1157, name = "Eel"),
- Tag(id = 1273, name = "Eggs"),
- Tag(id = 23385, name = "Eji"),
- Tag(id = 1698, name = "Electric Shocks"),
- Tag(id = 24182, name = "Elephant"),
- Tag(id = 748, name = "Elf"),
- Tag(id = 24369, name = "Elf-san Wa Yaserarenai."),
- Tag(id = 16643, name = "Elizaveta Hedervary"),
- Tag(id = 16929, name = "Emeralda Etuva"),
- Tag(id = 417, name = "Emotionless Sex"),
- Tag(id = 17236, name = "Ena Seishuin"),
- Tag(id = 17237, name = "Ena Seishuuin"),
- Tag(id = 16930, name = "Endou Macaroni"),
- Tag(id = 297, name = "Enema"),
- Tag(id = 19026, name = "Ero Hon"),
- Tag(id = 16815, name = "Erotic Mania"),
- Tag(id = 20271, name = "Etk"),
- Tag(id = 24870, name = "Etori Yuuya"),
- Tag(id = 16417, name = "Ex-driver"),
- Tag(id = 17088, name = "Executant"),
- Tag(id = 17044, name = "Executional"),
- Tag(id = 134, name = "Exhibitionism"),
- Tag(id = 16482, name = "Exorcist Miko"),
- Tag(id = 1815, name = "Eye Penetration"),
- Tag(id = 1699, name = "Eyemask"),
- Tag(id = 1227, name = "Eyepatch"),
- Tag(id = 20744, name = "Eyo"),
- Tag(id = 176, name = "Facesitting"),
- Tag(id = 232, name = "Fairy"),
- Tag(id = 19301, name = "Farron"),
- Tag(id = 974, name = "Farting"),
- Tag(id = 1890, name = "Father"),
- Tag(id = 16027, name = "Faulklin"),
- Tag(id = 16966, name = "Fcnurse"),
- Tag(id = 16861, name = "Femal"),
- Tag(id = 101, name = "Females Only"),
- Tag(id = 240, name = "Femdom"),
- Tag(id = 455, name = "Feminization"),
- Tag(id = 15865, name = "Ffm Threesome"),
- Tag(id = 1406, name = "Fft Threesome"),
- Tag(id = 16337, name = "Figure"),
- Tag(id = 528, name = "Filming"),
- Tag(id = 11, name = "Fingering"),
- Tag(id = 23994, name = "Firing Pin"),
- Tag(id = 376, name = "First Person Perspective"),
- Tag(id = 10947, name = "Fish"),
- Tag(id = 13079, name = "Fishnets"),
- Tag(id = 218, name = "Fisting"),
- Tag(id = 24402, name = "Flaccid"),
- Tag(id = 21373, name = "Flamenco Diamond"),
- Tag(id = 21374, name = "Flamenco Ruby"),
- Tag(id = 21375, name = "Flamenco Sapphire"),
- Tag(id = 536, name = "Foot Insertion"),
- Tag(id = 502, name = "Foot Licking"),
- Tag(id = 355, name = "Footjob"),
- Tag(id = 24432, name = "Forbidden Content"),
- Tag(id = 514, name = "Forniphilia"),
- Tag(id = 9242, name = "Fox"),
- Tag(id = 716, name = "Fox Boy"),
- Tag(id = 1094, name = "Fox Girl"),
- Tag(id = 25605, name = "Foxinshadow"),
- Tag(id = 25286, name = "Foxxx321"),
- Tag(id = 834, name = "Freckles"),
- Tag(id = 22144, name = "Fredrika"),
- Tag(id = 5458, name = "Frog"),
- Tag(id = 7363, name = "Frog Girl"),
- Tag(id = 151, name = "Frottage"),
- Tag(id = 23984, name = "Fuji Potato"),
- Tag(id = 18059, name = "Fujii Sakuya"),
- Tag(id = 18155, name = "Fujikatsupiko"),
- Tag(id = 17505, name = "Fujimoto Go"),
- Tag(id = 16121, name = "Fujitani Sonami"),
- Tag(id = 16421, name = "Fukai Youki"),
- Tag(id = 16975, name = "Fukaumi Tadashito"),
- Tag(id = 17200, name = "Fukuyama San"),
- Tag(id = 791, name = "Full Body Tattoo"),
- Tag(id = 24998, name = "Full Censored"),
- Tag(id = 15866, name = "Full Censorship"),
- Tag(id = 15871, name = "Full Color"),
- Tag(id = 17284, name = "Fumotonoya"),
- Tag(id = 1439, name = "Fundoshi"),
- Tag(id = 563, name = "Furry"),
- Tag(id = 20956, name = "Fushimori Tonkatsu"),
- Tag(id = 79, name = "Futanari"),
- Tag(id = 16756, name = "Futsuka"),
- Tag(id = 21620, name = "Fuuka Kazaguruma"),
- Tag(id = 17696, name = "Fuuzen No Tomoshibi"),
- Tag(id = 16583, name = "Fuwa Kaduki"),
- Tag(id = 19171, name = "Fwpa"),
- Tag(id = 16828, name = "G-maru Edition"),
- Tag(id = 18256, name = "G.to.me"),
- Tag(id = 241, name = "Gag"),
- Tag(id = 24168, name = "Gakuran"),
- Tag(id = 23017, name = "Ganesha"),
- Tag(id = 219, name = "Gaping"),
- Tag(id = 316, name = "Garter Belt"),
- Tag(id = 2778, name = "Gasmask"),
- Tag(id = 22826, name = "Gasper Vladi"),
- Tag(id = 20741, name = "Gass. Mosa"),
- Tag(id = 17257, name = "Gayasabu"),
- Tag(id = 21679, name = "Gekidan Futari"),
- Tag(id = 267, name = "Gender Bender"),
- Tag(id = 15873, name = "Gene Shalit"),
- Tag(id = 16913, name = "Genjuro Kazanari"),
- Tag(id = 16616, name = "Genso Suikoden"),
- Tag(id = 17226, name = "Genso Suikoden 5"),
- Tag(id = 17176, name = "Gesho Ichiro"),
- Tag(id = 16818, name = "Gevanni"),
- Tag(id = 923, name = "Ghost"),
- Tag(id = 2744, name = "Giant"),
- Tag(id = 1706, name = "Giantess"),
- Tag(id = 25288, name = "Giantessamazons"),
- Tag(id = 5218, name = "Gigantic Breasts"),
- Tag(id = 16236, name = "Gijinka"),
- Tag(id = 16760, name = "Ginkaku"),
- Tag(id = 16620, name = "Girlchoco"),
- Tag(id = 22566, name = "Glamorous Sky"),
- Tag(id = 53, name = "Glasses"),
- Tag(id = 3976, name = "Glory Hole"),
- Tag(id = 9628, name = "Goat"),
- Tag(id = 4296, name = "Goblin"),
- Tag(id = 17238, name = "Godou Kusanagi"),
- Tag(id = 17433, name = "Gogogo"),
- Tag(id = 23116, name = "Gohan Oomori"),
- Tag(id = 537, name = "Gokkun"),
- Tag(id = 21383, name = "Goko"),
- Tag(id = 10723, name = "Gorilla"),
- Tag(id = 1330, name = "Gothic Lolita"),
- Tag(id = 23831, name = "Gozenzeuna"),
- Tag(id = 16435, name = "Grace Ishikawa"),
- Tag(id = 24086, name = "Grad Lancia"),
- Tag(id = 23889, name = "Gragas"),
- Tag(id = 1904, name = "Granddaughter"),
- Tag(id = 5121, name = "Grandfather"),
- Tag(id = 16065, name = "Grandia Iii"),
- Tag(id = 4724, name = "Grandmother"),
- Tag(id = 17319, name = "Granny Smith"),
- Tag(id = 17068, name = "Greek Myth"),
- Tag(id = 25439, name = "Groovymidnightshow"),
- Tag(id = 23631, name = "Grop"),
- Tag(id = 695, name = "Group"),
- Tag(id = 7097, name = "Growth"),
- Tag(id = 20957, name = "Grpr"),
- Tag(id = 34, name = "Guro"),
- Tag(id = 1658, name = "Gyaru"),
- Tag(id = 4454, name = "Gyaru-oh"),
- Tag(id = 156, name = "Gymshorts"),
- Tag(id = 17318, name = "Milkcure"),
- Tag(id = 243, name = "Milking"),
- Tag(id = 16602, name = "Millefiori Firianno Biscotti"),
- Tag(id = 23274, name = "Millia"),
- Tag(id = 18027, name = "Mimana Orimoto"),
- Tag(id = 23225, name = "Mina Shirouto"),
- Tag(id = 114, name = "Mind Break"),
- Tag(id = 116, name = "Mind Control"),
- Tag(id = 3724, name = "Minigirl"),
- Tag(id = 5707, name = "Miniguy"),
- Tag(id = 4842, name = "Minotaur"),
- Tag(id = 23177, name = "Miou Ootori"),
- Tag(id = 16345, name = "Mirayia"),
- Tag(id = 16018, name = "Missing Cover"),
- Tag(id = 21546, name = "Misuke"),
- Tag(id = 16377, name = "Mitoukana"),
- Tag(id = 19911, name = "Mitsuhide"),
- Tag(id = 18486, name = "Mitsuko"),
- Tag(id = 22161, name = "Mitsunoho"),
- Tag(id = 19284, name = "Miu Otsuki"),
- Tag(id = 25514, name = "Miyabe Kiwi"),
- Tag(id = 23417, name = "Miyabi Ash"),
- Tag(id = 19158, name = "Miyama Yasuhiro"),
- Tag(id = 17060, name = "Mizupii"),
- Tag(id = 15869, name = "Mmf Threesome"),
- Tag(id = 16095, name = "Mmt Threesome"),
- Tag(id = 16009, name = "Moeharuka Non"),
- Tag(id = 23164, name = "Mohorovicic Matako"),
- Tag(id = 23511, name = "Mokechi"),
- Tag(id = 23765, name = "Moki"),
- Tag(id = 25011, name = "Mokko"),
- Tag(id = 22519, name = "Mokkuafunfun"),
- Tag(id = 23903, name = "Mokottsu"),
- Tag(id = 20625, name = "Momihama"),
- Tag(id = 16346, name = "Momoishi"),
- Tag(id = 24588, name = "Momoka"),
- Tag(id = 16757, name = "Momoya"),
- Tag(id = 7567, name = "Monkey"),
- Tag(id = 6717, name = "Monoeye"),
- Tag(id = 237, name = "Monster"),
- Tag(id = 285, name = "Monster Girl"),
- Tag(id = 18423, name = "Moon Zero"),
- Tag(id = 22080, name = "Moonfishcafe"),
- Tag(id = 17059, name = "Moonlight Panic"),
- Tag(id = 3028, name = "Moral Degeneration"),
- Tag(id = 20001, name = "Mori Udura"),
- Tag(id = 22527, name = "Morizoh"),
- Tag(id = 15867, name = "Mosaic Censorship"),
- Tag(id = 206, name = "Mother"),
- Tag(id = 14906, name = "Mouse"),
- Tag(id = 734, name = "Mouse Boy"),
- Tag(id = 1802, name = "Mouse Girl"),
- Tag(id = 15910, name = "Mtf Threesome"),
- Tag(id = 17083, name = "Mugen Fiammatta"),
- Tag(id = 17124, name = "Mugifumi Tetsudauyo"),
- Tag(id = 15863, name = "Multi-work Series"),
- Tag(id = 3622, name = "Multiple Arms"),
- Tag(id = 272, name = "Multiple Breasts"),
- Tag(id = 21176, name = "Multiple Nipples"),
- Tag(id = 481, name = "Multiple Paizuri"),
- Tag(id = 1100, name = "Multiple Penises"),
- Tag(id = 17228, name = "Mune-mune"),
- Tag(id = 16884, name = "Muratataichi"),
- Tag(id = 119, name = "Muscle"),
- Tag(id = 20643, name = "Muscle Growth"),
- Tag(id = 2197, name = "Mute"),
- Tag(id = 16787, name = "Myon"),
- Tag(id = 25638, name = "Myster Box"),
- Tag(id = 15929, name = "Mystic Cage"),
- Tag(id = 16449, name = "Nabeshima Akira"),
- Tag(id = 16912, name = "Nabu Umedama"),
- Tag(id = 20729, name = "Nagano-n"),
- Tag(id = 16789, name = "Nagumo."),
- Tag(id = 12, name = "Nakadashi"),
- Tag(id = 20242, name = "Nakate Sae"),
- Tag(id = 19813, name = "Nama Wasabi Honten"),
- Tag(id = 16852, name = "Namida"),
- Tag(id = 15958, name = "Nan"),
- Tag(id = 15893, name = "Nanaki"),
- Tag(id = 20068, name = "Nanaki Nanatarou"),
- Tag(id = 16442, name = "Nanako Todoroki"),
- Tag(id = 17096, name = "Nanami-kasuga"),
- Tag(id = 15959, name = "Nann"),
- Tag(id = 16832, name = "Naono Bokera"),
- Tag(id = 16704, name = "Naruga"),
- Tag(id = 20996, name = "Naruse Sakei"),
- Tag(id = 15885, name = "Nase No Go"),
- Tag(id = 22604, name = "Natalie"),
- Tag(id = 17012, name = "Natsu An"),
- Tag(id = 17158, name = "Natsu No Kumo"),
- Tag(id = 15887, name = "Natsumi Takao"),
- Tag(id = 16264, name = "Natsune Tachibana"),
- Tag(id = 5644, name = "Navel Fuck"),
- Tag(id = 1188, name = "Nazi"),
- Tag(id = 16819, name = "Near"),
- Tag(id = 287, name = "Necrophilia"),
- Tag(id = 16123, name = "Negative From The Beginning"),
- Tag(id = 17113, name = "Neji Musume"),
- Tag(id = 16320, name = "Nekomarudou Honpo"),
- Tag(id = 23607, name = "Nekota Shiro"),
- Tag(id = 24552, name = "Nekoweapons"),
- Tag(id = 16514, name = "Nesshisen"),
- Tag(id = 105, name = "Netorare"),
- Tag(id = 20880, name = "New Horizon"),
- Tag(id = 805, name = "Niece"),
- Tag(id = 22906, name = "Nijigen"),
- Tag(id = 2822, name = "Ninja"),
- Tag(id = 23632, name = "Nintai Akira"),
- Tag(id = 10476, name = "Nipple Birth"),
- Tag(id = 4719, name = "Nipple Expansion"),
- Tag(id = 903, name = "Nipple Fuck"),
- Tag(id = 16837, name = "Nishioka Kyoudai"),
- Tag(id = 15906, name = "Nishizuki Chikara"),
- Tag(id = 17174, name = "Nitta"),
- Tag(id = 20829, name = "Nitta Kani"),
- Tag(id = 18637, name = "Nizimu Me"),
- Tag(id = 16572, name = "No Graffiti"),
- Tag(id = 16248, name = "Nomoto Saharu"),
- Tag(id = 25482, name = "Non-nude"),
- Tag(id = 15983, name = "Nonorumia"),
- Tag(id = 17805, name = "Noramushi"),
- Tag(id = 25481, name = "Norman Maggot"),
- Tag(id = 8273, name = "Nose Fuck"),
- Tag(id = 1481, name = "Nose Hook"),
- Tag(id = 15955, name = "Notsu"),
- Tag(id = 16024, name = "Novel"),
- Tag(id = 16155, name = "Nudity Only"),
- Tag(id = 16364, name = "Nuko"),
- Tag(id = 338, name = "Nun"),
- Tag(id = 235, name = "Nurse"),
- Tag(id = 18238, name = "Nururyun"),
- Tag(id = 17035, name = "Nutmeg"),
- Tag(id = 19856, name = "Nyankofujin"),
- Tag(id = 22878, name = "Nyansei-fukko"),
- Tag(id = 19730, name = "O-ide Riko"),
- Tag(id = 19809, name = "Ochazukenori"),
- Tag(id = 20689, name = "Ochine"),
- Tag(id = 1440, name = "Octopus"),
- Tag(id = 16279, name = "Ogiura Tomoko"),
- Tag(id = 18991, name = "Ohkawa Aoi"),
- Tag(id = 21315, name = "Ohno Kogorou"),
- Tag(id = 22307, name = "Oidemase"),
- Tag(id = 3088, name = "Oil"),
- Tag(id = 24399, name = "Ojo Jotaro"),
- Tag(id = 15991, name = "Ojou"),
- Tag(id = 20508, name = "Okano Hajimetei"),
- Tag(id = 16272, name = "Okayu Club"),
- Tag(id = 19112, name = "Okome Takeichi"),
- Tag(id = 8946, name = "Old Lady"),
- Tag(id = 334, name = "Old Man"),
- Tag(id = 22633, name = "Omae Umasou Da Na"),
- Tag(id = 16766, name = "Omya"),
- Tag(id = 1651, name = "Onahole"),
- Tag(id = 1234, name = "Oni"),
- Tag(id = 22587, name = "Oono Saeko"),
- Tag(id = 18200, name = "Ootaki Miura"),
- Tag(id = 17188, name = "Ootsuka Shunji"),
- Tag(id = 20717, name = "Ootsuki Kyouko"),
- Tag(id = 16151, name = "Oppai Brothers"),
- Tag(id = 1013, name = "Oppai Loli"),
- Tag(id = 20320, name = "Opq"),
- Tag(id = 1650, name = "Orc"),
- Tag(id = 17516, name = "Ore P 2-gou"),
- Tag(id = 23659, name = "Ore To Kakuni To Abura Soba"),
- Tag(id = 457, name = "Orgasm Denial"),
- Tag(id = 16585, name = "Oruga Susumu"),
- Tag(id = 16947, name = "Orunito"),
- Tag(id = 15914, name = "Oshioki Yuki-chan"),
- Tag(id = 24995, name = "Osovo"),
- Tag(id = 25227, name = "Ostrich"),
- Tag(id = 16634, name = "Osuneko Shoukai"),
- Tag(id = 17862, name = "Otaku Life Japan"),
- Tag(id = 20726, name = "Otome Kibun"),
- Tag(id = 16941, name = "Otonano Omochiya"),
- Tag(id = 16894, name = "Otosaki Tsubaki"),
- Tag(id = 17152, name = "Otoskai Tsubaki"),
- Tag(id = 17087, name = "Ototoi No Are"),
- Tag(id = 24715, name = "Ougi Production"),
- Tag(id = 16122, name = "Ousama Jihen"),
- Tag(id = 15861, name = "Out Of Order"),
- Tag(id = 23387, name = "Outcount"),
- Tag(id = 24808, name = "Outdoor"),
- Tag(id = 17133, name = "Outdoors"),
- Tag(id = 1334, name = "Oyakodon"),
- Tag(id = 16241, name = "Pacifier"),
- Tag(id = 183, name = "Paizuri"),
- Tag(id = 7823, name = "Panda Girl"),
- Tag(id = 25178, name = "Pandaj"),
- Tag(id = 22688, name = "Pandaya"),
- Tag(id = 10970, name = "Panther"),
- Tag(id = 135, name = "Pantyhose"),
- Tag(id = 136, name = "Pantyjob"),
- Tag(id = 17100, name = "Paopa Ship"),
- Tag(id = 827, name = "Parasite"),
- Tag(id = 17137, name = "Partial Color"),
- Tag(id = 16412, name = "Partially Translated"),
- Tag(id = 1516, name = "Pasties"),
- Tag(id = 23693, name = "Pecora"),
- Tag(id = 456, name = "Pegging"),
- Tag(id = 17153, name = "Pekopon Shinryaku Hyougikai"),
- Tag(id = 7368, name = "Penis Birth"),
- Tag(id = 16563, name = "Peri"),
- Tag(id = 2136, name = "Petrification"),
- Tag(id = 1515, name = "Phimosis"),
- Tag(id = 2432, name = "Phone Sex"),
- Tag(id = 18992, name = "Pied A Terre"),
- Tag(id = 299, name = "Piercing"),
- Tag(id = 600, name = "Pig"),
- Tag(id = 5713, name = "Pig Girl"),
- Tag(id = 4211, name = "Pig Man"),
- Tag(id = 1153, name = "Pillory"),
- Tag(id = 7261, name = "Pirate"),
- Tag(id = 1674, name = "Piss Drinking"),
- Tag(id = 22865, name = "Pisti"),
- Tag(id = 793, name = "Plant Girl"),
- Tag(id = 22520, name = "Poki"),
- Tag(id = 1399, name = "Pole Dancing"),
- Tag(id = 1732, name = "Policeman"),
- Tag(id = 320, name = "Policewoman"),
- Tag(id = 22829, name = "Pometa"),
- Tag(id = 3599, name = "Ponygirl"),
- Tag(id = 760, name = "Ponytail"),
- Tag(id = 15894, name = "Poor Grammar"),
- Tag(id = 16310, name = "Poporo"),
- Tag(id = 16453, name = "Porunamin C"),
- Tag(id = 538, name = "Possession"),
- Tag(id = 268, name = "Pregnant"),
- Tag(id = 503, name = "Prehensile Hair"),
- Tag(id = 11469, name = "Priest"),
- Tag(id = 20497, name = "Principal Kuno"),
- Tag(id = 25407, name = "Project Physalis"),
- Tag(id = 1496, name = "Prolapse"),
- Tag(id = 294, name = "Prostate Massage"),
- Tag(id = 931, name = "Prostitution"),
- Tag(id = 16367, name = "Psycho Soldier"),
- Tag(id = 1482, name = "Pubic Stubble"),
- Tag(id = 2990, name = "Public Use"),
- Tag(id = 16795, name = "Purimu"),
- Tag(id = 16250, name = "Purupyon"),
- Tag(id = 18500, name = "Pythagora Switch"),
- Tag(id = 19115, name = "Quattro"),
- Tag(id = 20138, name = "R-otome"),
- Tag(id = 17110, name = "Rabbit Revelry Inc."),
- Tag(id = 12938, name = "Raccoon Boy"),
- Tag(id = 3567, name = "Raccoon Girl"),
- Tag(id = 6453, name = "Race Queen"),
- Tag(id = 21425, name = "Raichi Hoshimiya"),
- Tag(id = 21955, name = "Rajyaki"),
- Tag(id = 16139, name = "Rakanka Tiger"),
- Tag(id = 23718, name = "Rakuen Tsuihou"),
- Tag(id = 15920, name = "Rakugaki Syachu"),
- Tag(id = 19071, name = "Randamu"),
- Tag(id = 2551, name = "Randoseru"),
- Tag(id = 43, name = "Rape"),
- Tag(id = 17006, name = "Rati"),
- Tag(id = 18186, name = "Rebaudio"),
- Tag(id = 23800, name = "Recording"),
- Tag(id = 15915, name = "Redraw"),
- Tag(id = 17032, name = "Reese"),
- Tag(id = 19632, name = "Reisen Two"),
- Tag(id = 17270, name = "Remilia"),
- Tag(id = 20382, name = "Renekton"),
- Tag(id = 15890, name = "Replaced"),
- Tag(id = 5574, name = "Reptile"),
- Tag(id = 16858, name = "Resi"),
- Tag(id = 16257, name = "Retreat"),
- Tag(id = 24087, name = "Ricardo Gavarni"),
- Tag(id = 16835, name = "Rika Koushu"),
- Tag(id = 16836, name = "Rika Kousyu"),
- Tag(id = 223, name = "Rimjob"),
- Tag(id = 16439, name = "Rinbu"),
- Tag(id = 18907, name = "Ringo Koubou"),
- Tag(id = 17252, name = "Ritomasu"),
- Tag(id = 16659, name = "Rittiri"),
- Tag(id = 56, name = "Robot"),
- Tag(id = 15872, name = "Rock Dou"),
- Tag(id = 24880, name = "Rofu Pukaj"),
- Tag(id = 19929, name = "Roudoc 2-gou"),
- Tag(id = 15960, name = "Route A"),
- Tag(id = 16682, name = "Rurio Nagase"),
- Tag(id = 17810, name = "Ryo Yazaki"),
- Tag(id = 16481, name = "Ryo-ko"),
- Tag(id = 21672, name = "Ryokurin"),
- Tag(id = 224, name = "Ryona"),
- Tag(id = 17179, name = "Ryouji Sawa"),
- Tag(id = 23147, name = "Ryouta Murakami"),
- Tag(id = 16365, name = "Ryu Morikawa"),
- Tag(id = 16457, name = "Ryuho"),
- Tag(id = 16063, name = "Ryuji Kawamoto"),
- Tag(id = 16021, name = "Ryuushika"),
- Tag(id = 16944, name = "Sabatama Yumi"),
- Tag(id = 15897, name = "Sabato Mihashigo"),
- Tag(id = 16996, name = "Sabawo 380"),
- Tag(id = 16518, name = "Sagasile"),
- Tag(id = 16402, name = "Sai Akuto"),
- Tag(id = 24085, name = "Saifu"),
- Tag(id = 16670, name = "Saikare."),
- Tag(id = 17177, name = "Saikoro"),
- Tag(id = 17017, name = "Saikyo Tomomi"),
- Tag(id = 17146, name = "Sailor Aluminum Siren"),
- Tag(id = 16973, name = "Saimin"),
- Tag(id = 16013, name = "Saimin Pikatto House"),
- Tag(id = 16186, name = "Sakazaki"),
- Tag(id = 16252, name = "Saki Watanabe"),
- Tag(id = 15883, name = "Sakino Asuka"),
- Tag(id = 23322, name = "Sakki Okita"),
- Tag(id = 23612, name = "Sakkimita"),
- Tag(id = 24437, name = "Sakura Kagamihara"),
- Tag(id = 23768, name = "Sakurabobu"),
- Tag(id = 423, name = "Saliva"),
- Tag(id = 15881, name = "Sammohung"),
- Tag(id = 15882, name = "Samohanyunpyou"),
- Tag(id = 16125, name = "Sample"),
- Tag(id = 15928, name = "Sangokushi Puzzle Taisen"),
- Tag(id = 17117, name = "Santa Maria"),
- Tag(id = 24336, name = "Sarugaso"),
- Tag(id = 16506, name = "Sasara Somae"),
- Tag(id = 16694, name = "Sata"),
- Tag(id = 16586, name = "Satellite U"),
- Tag(id = 16375, name = "Satoshi Sou"),
- Tag(id = 16824, name = "Satou Kiyotoshi"),
- Tag(id = 23366, name = "Satsuki Marin"),
- Tag(id = 20566, name = "Sautsu"),
- Tag(id = 19124, name = "Sawara Cashy"),
- Tag(id = 16428, name = "Sayuri Hirose"),
- Tag(id = 15876, name = "Scanmark"),
- Tag(id = 1336, name = "Scar"),
- Tag(id = 273, name = "Scat"),
- Tag(id = 68, name = "School Swimsuit"),
- Tag(id = 22, name = "Schoolboy Uniform"),
- Tag(id = 24, name = "Schoolgirl Uniform"),
- Tag(id = 17103, name = "Schwarzkatze"),
- Tag(id = 17104, name = "Schwarzkratze"),
- Tag(id = 6068, name = "Scrotal Lingerie"),
- Tag(id = 17224, name = "Seikan Nekoguruma"),
- Tag(id = 17995, name = "Sekaiju No Anone"),
- Tag(id = 788, name = "Selfcest"),
- Tag(id = 17004, name = "Semaru Taiho"),
- Tag(id = 16440, name = "Sen Renbu"),
- Tag(id = 17171, name = "Senbonzakura"),
- Tag(id = 18677, name = "Sendai Oni"),
- Tag(id = 23873, name = "Sendaiki"),
- Tag(id = 22387, name = "Senhime"),
- Tag(id = 17322, name = "Senki Zesshou"),
- Tag(id = 17809, name = "Setsuko"),
- Tag(id = 109, name = "Sex Toys"),
- Tag(id = 16644, name = "Sexual Sunday"),
- Tag(id = 16438, name = "Shadow Thorn"),
- Tag(id = 331, name = "Shared Senses"),
- Tag(id = 20051, name = "Shark"),
- Tag(id = 3974, name = "Shark Boy"),
- Tag(id = 22443, name = "Sharon"),
- Tag(id = 5823, name = "Shaved Head"),
- Tag(id = 15652, name = "Sheep Boy"),
- Tag(id = 784, name = "Sheep Girl"),
- Tag(id = 458, name = "Shemale"),
- Tag(id = 25341, name = "Sherwood"),
- Tag(id = 21466, name = "Shibainu Lab"),
- Tag(id = 321, name = "Shibari"),
- Tag(id = 17154, name = "Shichimi Hacchin"),
- Tag(id = 23344, name = "Shikiouzi"),
- Tag(id = 22907, name = "Shima Shuu"),
- Tag(id = 21991, name = "Shimada Hisami"),
- Tag(id = 137, name = "Shimapan"),
- Tag(id = 16860, name = "Shimotsuki Kairi"),
- Tag(id = 22950, name = "Shina Mon"),
- Tag(id = 21673, name = "Shinna"),
- Tag(id = 18092, name = "Shinomiya Utai"),
- Tag(id = 16190, name = "Shinooka Fuku Enchou"),
- Tag(id = 20450, name = "Shinoshima Usa"),
- Tag(id = 18494, name = "Shinsuke Inue"),
- Tag(id = 16822, name = "Shinsuke Nishizono"),
- Tag(id = 17370, name = "Shintaro Konno"),
- Tag(id = 24070, name = "Shio Onigiri"),
- Tag(id = 16451, name = "Shiokaze Kaidou"),
- Tag(id = 19727, name = "Shiomeshi"),
- Tag(id = 18973, name = "Shirokuma Sato"),
- Tag(id = 18720, name = "Shirotakurota"),
- Tag(id = 16914, name = "Shirow"),
- Tag(id = 17014, name = "Shisaki Tayuu"),
- Tag(id = 20045, name = "Shizu Shidou"),
- Tag(id = 16014, name = "Short Circuit"),
- Tag(id = 66, name = "Shotacon"),
- Tag(id = 16970, name = "Shounen Kyouso"),
- Tag(id = 18864, name = "Shounen Teacher Group"),
- Tag(id = 17053, name = "Shoutai Fumei"),
- Tag(id = 17054, name = "Shoutai Humei"),
- Tag(id = 711, name = "Shrinking"),
- Tag(id = 17130, name = "Shugetsu"),
- Tag(id = 22637, name = "Shunju"),
- Tag(id = 21905, name = "Shut Hell"),
- Tag(id = 23240, name = "Shuuyu Koukin"),
- Tag(id = 24355, name = "Sibasaki Koh"),
- Tag(id = 15943, name = "Silver Sandial"),
- Tag(id = 16041, name = "Sinyati"),
- Tag(id = 138, name = "Sister"),
- Tag(id = 17329, name = "Sjf"),
- Tag(id = 16020, name = "Ski"),
- Tag(id = 5877, name = "Skinsuit"),
- Tag(id = 19682, name = "Skn"),
- Tag(id = 300, name = "Slave"),
- Tag(id = 153, name = "Sleeping"),
- Tag(id = 1449, name = "Slime"),
- Tag(id = 13461, name = "Slime Boy"),
- Tag(id = 1408, name = "Slime Girl"),
- Tag(id = 22104, name = "Slime King"),
- Tag(id = 23847, name = "Slow Masturbation Research Society"),
- Tag(id = 4597, name = "Slug"),
- Tag(id = 32, name = "Small Breasts"),
- Tag(id = 25364, name = "Small Penis"),
- Tag(id = 429, name = "Smegma"),
- Tag(id = 1254, name = "Smell"),
- Tag(id = 3524, name = "Smoking"),
- Tag(id = 8672, name = "Snail Girl"),
- Tag(id = 4702, name = "Snake"),
- Tag(id = 23232, name = "Snake Boy"),
- Tag(id = 785, name = "Snake Girl"),
- Tag(id = 254, name = "Snuff"),
- Tag(id = 6084, name = "Sockjob"),
- Tag(id = 16849, name = "Softcel Pictures"),
- Tag(id = 16846, name = "Soichiro Arima"),
- Tag(id = 81, name = "Sole Dickgirl"),
- Tag(id = 25, name = "Sole Female"),
- Tag(id = 23, name = "Sole Male"),
- Tag(id = 24229, name = "Solefemale"),
- Tag(id = 608, name = "Solo Action"),
- Tag(id = 18433, name = "Solullaby"),
- Tag(id = 23404, name = "Son-son"),
- Tag(id = 20256, name = "Sorairo Porin"),
- Tag(id = 17197, name = "Sorauta"),
- Tag(id = 24446, name = "Southern Emperor"),
- Tag(id = 1359, name = "Spanking"),
- Tag(id = 23067, name = "Spanner And Camellia"),
- Tag(id = 889, name = "Speculum"),
- Tag(id = 18061, name = "Speedy"),
- Tag(id = 16215, name = "Spicaya"),
- Tag(id = 11905, name = "Spider"),
- Tag(id = 3623, name = "Spider Girl"),
- Tag(id = 16823, name = "Spirit Of Ecsta"),
- Tag(id = 16917, name = "Spon"),
- Tag(id = 16898, name = "Square Rain"),
- Tag(id = 5355, name = "Squid Boy"),
- Tag(id = 1582, name = "Squid Girl"),
- Tag(id = 7230, name = "Squirrel Girl"),
- Tag(id = 786, name = "Squirting"),
- Tag(id = 7371, name = "Ssbbm"),
- Tag(id = 7093, name = "Ssbbw"),
- Tag(id = 23302, name = "Stagger"),
- Tag(id = 20756, name = "Staggio Ton-pierohbee"),
- Tag(id = 16997, name = "Steevejo"),
- Tag(id = 22316, name = "Steward"),
- Tag(id = 884, name = "Stewardess"),
- Tag(id = 57, name = "Stockings"),
- Tag(id = 225, name = "Stomach Deformation"),
- Tag(id = 17126, name = "Story Act"),
- Tag(id = 15864, name = "Story Arc"),
- Tag(id = 139, name = "Strap-on"),
- Tag(id = 6576, name = "Stretching"),
- Tag(id = 3873, name = "Stuck In Wall"),
- Tag(id = 17106, name = "Studio Campus"),
- Tag(id = 21909, name = "Studio Crimson"),
- Tag(id = 17045, name = "Studio Mxh"),
- Tag(id = 20431, name = "Studio Onion"),
- Tag(id = 23602, name = "Suckaline"),
- Tag(id = 17003, name = "Suda Yuriko"),
- Tag(id = 16952, name = "Sui Kayama"),
- Tag(id = 16811, name = "Sui Ren"),
- Tag(id = 23732, name = "Suidoku"),
- Tag(id = 16452, name = "Suina Ruu"),
- Tag(id = 17184, name = "Suiranao"),
- Tag(id = 17069, name = "Suiseimushi"),
- Tag(id = 22021, name = "Sukurinton"),
- Tag(id = 140, name = "Sumata"),
- Tag(id = 141, name = "Sundress"),
- Tag(id = 166, name = "Sunglasses"),
- Tag(id = 25589, name = "Super Smash Bros"),
- Tag(id = 15904, name = "Supertoasted"),
- Tag(id = 16899, name = "Susu Suzumi"),
- Tag(id = 16016, name = "Sutazubu-saku"),
- Tag(id = 25195, name = "Suzuki Senpai"),
- Tag(id = 22531, name = "Suzuki Tenpura"),
- Tag(id = 16491, name = "Suzuku Kururugi"),
- Tag(id = 16663, name = "Suzumi Yuu"),
- Tag(id = 17273, name = "Suzunari"),
- Tag(id = 23674, name = "Suzune Arizono"),
- Tag(id = 696, name = "Sweating"),
- Tag(id = 69, name = "Swimsuit"),
- Tag(id = 635, name = "Swinging"),
- Tag(id = 1955, name = "Syringe"),
- Tag(id = 17011, name = "System Speculation"),
- Tag(id = 754, name = "Table Masturbation"),
- Tag(id = 19556, name = "Tachinami Takajin"),
- Tag(id = 16816, name = "Tadai Yuu"),
- Tag(id = 16664, name = "Tae Anezaki"),
- Tag(id = 24925, name = "Tae Yamada"),
- Tag(id = 17908, name = "Taeko Nonomiya"),
- Tag(id = 25425, name = "Tail"),
- Tag(id = 1156, name = "Tail Plug"),
- Tag(id = 16907, name = "Tail-gun"),
- Tag(id = 2861, name = "Tailjob"),
- Tag(id = 16464, name = "Taimanin"),
- Tag(id = 16465, name = "Taimanin Haiboku"),
- Tag(id = 17797, name = "Taiyoushin"),
- Tag(id = 20077, name = "Takakujyu"),
- Tag(id = 16281, name = "Takakura Row"),
- Tag(id = 16742, name = "Takamura Chinatsu"),
- Tag(id = 24757, name = "Takatou Kei"),
- Tag(id = 23832, name = "Takatsu Rin"),
- Tag(id = 18111, name = "Takimoto Yukari"),
- Tag(id = 16480, name = "Takoyaki Yoshi"),
- Tag(id = 922, name = "Tall Girl"),
- Tag(id = 120, name = "Tall Man"),
- Tag(id = 16626, name = "Tama Shippo"),
- Tag(id = 24669, name = "Tamaki Mari"),
- Tag(id = 20900, name = "Tami Nishimikado"),
- Tag(id = 23735, name = "Tanken Wa Ra 2"),
- Tag(id = 15870, name = "Tankoubon"),
- Tag(id = 303, name = "Tanlines"),
- Tag(id = 17151, name = "Tanukigirl"),
- Tag(id = 22214, name = "Tanukine"),
- Tag(id = 16794, name = "Tanuma"),
- Tag(id = 16698, name = "Tapir"),
- Tag(id = 22323, name = "Tasu"),
- Tag(id = 17057, name = "Tat"),
- Tag(id = 16821, name = "Tateno Makoto"),
- Tag(id = 20524, name = "Tatsuhide"),
- Tag(id = 23415, name = "Tayuri"),
- Tag(id = 112, name = "Teacher"),
- Tag(id = 23459, name = "Tecoya"),
- Tag(id = 16158, name = "Tee Crown"),
- Tag(id = 25562, name = "Teebsly"),
- Tag(id = 16487, name = "Tekorun"),
- Tag(id = 22899, name = "Tenjou Shio"),
- Tag(id = 196, name = "Tentacles"),
- Tag(id = 24136, name = "Tep"),
- Tag(id = 16180, name = "Teru-bee"),
- Tag(id = 18721, name = "Tetsu Hagane"),
- Tag(id = 12900, name = "Thick Eyebrows"),
- Tag(id = 769, name = "Thigh High Boots"),
- Tag(id = 641, name = "Tiara"),
- Tag(id = 2728, name = "Tickling"),
- Tag(id = 12085, name = "Tiger"),
- Tag(id = 960, name = "Tights"),
- Tag(id = 23600, name = "Tigrevurmud Vorn"),
- Tag(id = 23173, name = "Tilia"),
- Tag(id = 15913, name = "Time Stop"),
- Tag(id = 17717, name = "Tobaroku"),
- Tag(id = 20550, name = "Tocori"),
- Tag(id = 495, name = "Toddlercon"),
- Tag(id = 16287, name = "Tohno Hongshi"),
- Tag(id = 16785, name = "Tokage 3gou"),
- Tag(id = 21710, name = "Tokizawa"),
- Tag(id = 20551, name = "Tokori"),
- Tag(id = 24137, name = "Tokyo Survivor"),
- Tag(id = 16928, name = "Tokyo-ya"),
- Tag(id = 19807, name = "Tom Jpn"),
- Tag(id = 16595, name = "Tomadoiki"),
- Tag(id = 13, name = "Tomboy"),
- Tag(id = 129, name = "Tomgirl"),
- Tag(id = 25091, name = "Tomobukiya"),
- Tag(id = 16226, name = "Tomoko Ogura"),
- Tag(id = 15917, name = "Tonboya"),
- Tag(id = 16537, name = "Tongue Job"),
- Tag(id = 23105, name = "Tooku No Mura"),
- Tag(id = 1441, name = "Tooth Brushing"),
- Tag(id = 15888, name = "Tooyama Masuko"),
- Tag(id = 25256, name = "Toriaezu."),
- Tag(id = 752, name = "Torture"),
- Tag(id = 17328, name = "Toshinari Arito"),
- Tag(id = 25478, name = "Toshkarts"),
- Tag(id = 23840, name = "Totomono"),
- Tag(id = 22879, name = "Touma Nigou"),
- Tag(id = 16946, name = "Toyotomi Hideyoshi"),
- Tag(id = 113, name = "Tracksuit"),
- Tag(id = 7331, name = "Trampling"),
- Tag(id = 195, name = "Transformation"),
- Tag(id = 233, name = "Tribadism"),
- Tag(id = 5540, name = "Triple Anal"),
- Tag(id = 226, name = "Triple Penetration"),
- Tag(id = 1526, name = "Triple Vaginal"),
- Tag(id = 16765, name = "Try Hougen"),
- Tag(id = 23845, name = "Tsujiadon"),
- Tag(id = 16106, name = "Tsukasa Kotobuki"),
- Tag(id = 16786, name = "Tsukigara Rosshi"),
- Tag(id = 16560, name = "Tsukigata Rosshi"),
- Tag(id = 23897, name = "Tsuru Kame"),
- Tag(id = 15999, name = "Tsurumanjaro"),
- Tag(id = 15908, name = "Tsuta Hiroko"),
- Tag(id = 18801, name = "Tsuzuki Shiori"),
- Tag(id = 792, name = "Ttf Threesome"),
- Tag(id = 15875, name = "Ttm Threesome"),
- Tag(id = 244, name = "Tube"),
- Tag(id = 22694, name = "Turnover"),
- Tag(id = 10994, name = "Turtle"),
- Tag(id = 780, name = "Tutor"),
- Tag(id = 17021, name = "Twin Bell"),
- Tag(id = 142, name = "Twins"),
- Tag(id = 115, name = "Twintails"),
- Tag(id = 23174, name = "Tyria"),
- Tag(id = 25109, name = "Tzinnxt"),
- Tag(id = 16561, name = "Uekio Aloe"),
- Tag(id = 15884, name = "Uesato Takeharu"),
- Tag(id = 23739, name = "Ujiro"),
- Tag(id = 22521, name = "Umaisake"),
- Tag(id = 20106, name = "Ume Kurumizawa"),
- Tag(id = 18201, name = "Umetsu Yasuomi"),
- Tag(id = 16776, name = "Una777"),
- Tag(id = 712, name = "Unbirth"),
- Tag(id = 15862, name = "Uncensored"),
- Tag(id = 7151, name = "Uncle"),
- Tag(id = 286, name = "Underwater"),
- Tag(id = 21894, name = "Uni Unio"),
- Tag(id = 19786, name = "Unihoge"),
- Tag(id = 16292, name = "Unomaa"),
- Tag(id = 1517, name = "Unusual Pupils"),
- Tag(id = 1565, name = "Unusual Teeth"),
- Tag(id = 16432, name = "Urabata"),
- Tag(id = 16184, name = "Uragiru Kuchibiru"),
- Tag(id = 18434, name = "Urako"),
- Tag(id = 227, name = "Urethra Insertion"),
- Tag(id = 143, name = "Urination"),
- Tag(id = 16624, name = "Uru Fusube In"),
- Tag(id = 16945, name = "Usagiro"),
- Tag(id = 20522, name = "Ustilago Nuda"),
- Tag(id = 17161, name = "Usuk"),
- Tag(id = 18665, name = "Utsu Kawaya"),
- Tag(id = 6045, name = "Vacbed"),
- Tag(id = 2800, name = "Vaginal Sticker"),
- Tag(id = 58, name = "Vampire"),
- Tag(id = 16948, name = "Variant Set"),
- Tag(id = 23976, name = "Virginia Nitouhei"),
- Tag(id = 213, name = "Virginity"),
- Tag(id = 17046, name = "Viriya"),
- Tag(id = 17458, name = "Visual She"),
- Tag(id = 228, name = "Vomit"),
- Tag(id = 238, name = "Vore"),
- Tag(id = 124, name = "Voyeurism"),
- Tag(id = 16192, name = "Wada Tomohiro"),
- Tag(id = 20686, name = "Waio"),
- Tag(id = 2084, name = "Waiter"),
- Tag(id = 374, name = "Waitress"),
- Tag(id = 15879, name = "Walkure"),
- Tag(id = 19824, name = "Wanya Aguda"),
- Tag(id = 16645, name = "Warikka"),
- Tag(id = 16191, name = "Watanabe Enchou"),
- Tag(id = 16212, name = "Watari Naomi"),
- Tag(id = 16182, name = "Watermarked"),
- Tag(id = 16007, name = "Webtoon"),
- Tag(id = 16507, name = "Wedding Ring"),
- Tag(id = 1756, name = "Weight Gain"),
- Tag(id = 16197, name = "Welkin Gunther"),
- Tag(id = 4703, name = "Wet Clothes"),
- Tag(id = 3719, name = "Whip"),
- Tag(id = 264, name = "Widow"),
- Tag(id = 17058, name = "Will Powers"),
- Tag(id = 16994, name = "Wingjob"),
- Tag(id = 404, name = "Wings"),
- Tag(id = 926, name = "Witch"),
- Tag(id = 1560, name = "Wolf"),
- Tag(id = 2066, name = "Wolf Boy"),
- Tag(id = 1551, name = "Wolf Girl"),
- Tag(id = 2868, name = "Wooden Horse"),
- Tag(id = 828, name = "Worm"),
- Tag(id = 332, name = "Wormhole"),
- Tag(id = 17066, name = "Wrestle Angels Survivor"),
- Tag(id = 1990, name = "Wrestling"),
- Tag(id = 17042, name = "X-boy"),
- Tag(id = 144, name = "X-ray"),
- Tag(id = 20575, name = "Xera"),
- Tag(id = 16249, name = "Yada Masaka"),
- Tag(id = 16883, name = "Yagami"),
- Tag(id = 17084, name = "Yagami Baneri"),
- Tag(id = 16967, name = "Yahiko"),
- Tag(id = 24447, name = "Yamada Botan"),
- Tag(id = 18806, name = "Yamada Kana"),
- Tag(id = 17470, name = "Yamada Tasaku"),
- Tag(id = 16275, name = "Yamamomo Kajitsu"),
- Tag(id = 16511, name = "Yamamoto Hideo"),
- Tag(id = 18257, name = "Yamane Akira"),
- Tag(id = 16006, name = "Yamane Amano"),
- Tag(id = 16877, name = "Yami No Matsuri"),
- Tag(id = 968, name = "Yandere"),
- Tag(id = 283, name = "Yaoi"),
- Tag(id = 23158, name = "Yarou Tomo No Bansankai"),
- Tag(id = 16015, name = "Yasou Shigeru"),
- Tag(id = 16508, name = "Yasu G"),
- Tag(id = 22667, name = "Yasuhara Osamu"),
- Tag(id = 23460, name = "Yatsugi Teco"),
- Tag(id = 17040, name = "Yokohama-ya"),
- Tag(id = 16965, name = "Yokotaya"),
- Tag(id = 16273, name = "Yoshiki Aya"),
- Tag(id = 17459, name = "Yoshizuki Minoru"),
- Tag(id = 16817, name = "Youna"),
- Tag(id = 18367, name = "Yousei Kanin"),
- Tag(id = 22257, name = "Yshtola"),
- Tag(id = 20770, name = "Yu Tendo"),
- Tag(id = 16862, name = "Yubel"),
- Tag(id = 15997, name = "Yui Narumi"),
- Tag(id = 17115, name = "Yukai Sachiko"),
- Tag(id = 17850, name = "Yukata Kobayakawa"),
- Tag(id = 16117, name = "Yuki Hiiragi"),
- Tag(id = 21680, name = "Yukiruru"),
- Tag(id = 19205, name = "Yume No Omutsu Kissa"),
- Tag(id = 16916, name = "Yumego"),
- Tag(id = 16454, name = "Yumemigotoki"),
- Tag(id = 17542, name = "Yumesaki Ai"),
- Tag(id = 24592, name = "Yumeutsutsu Hideki"),
- Tag(id = 15900, name = "Yumiko"),
- Tag(id = 16420, name = "Yunisuke"),
- Tag(id = 14, name = "Yuri"),
- Tag(id = 24046, name = "Yuriyura"),
- Tag(id = 17798, name = "Yuugaitosho"),
- Tag(id = 16130, name = "Yuugi Yami"),
- Tag(id = 20140, name = "Yuzurizaki Nero"),
- Tag(id = 20767, name = "Zeitaku Zanmai"),
- Tag(id = 24430, name = "Ziggurat"),
- Tag(id = 21354, name = "Zinkurou"),
- Tag(id = 290, name = "Zombie")
- ).sortedBy { it.name }
-}
diff --git a/src/all/ninehentai/src/eu/kanade/tachiyomi/extension/all/ninehentai/NineHentai.kt b/src/all/ninehentai/src/eu/kanade/tachiyomi/extension/all/ninehentai/NineHentai.kt
index fef8bdd68..18347ca97 100644
--- a/src/all/ninehentai/src/eu/kanade/tachiyomi/extension/all/ninehentai/NineHentai.kt
+++ b/src/all/ninehentai/src/eu/kanade/tachiyomi/extension/all/ninehentai/NineHentai.kt
@@ -1,12 +1,5 @@
package eu.kanade.tachiyomi.extension.all.ninehentai
-import com.github.salomonbrys.kotson.array
-import com.github.salomonbrys.kotson.fromJson
-import com.github.salomonbrys.kotson.int
-import com.github.salomonbrys.kotson.string
-import com.google.gson.Gson
-import com.google.gson.JsonElement
-import com.google.gson.JsonParser
import eu.kanade.tachiyomi.annotations.Nsfw
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.POST
@@ -19,12 +12,22 @@ import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.util.asJsoup
+import kotlinx.serialization.json.Json
+import kotlinx.serialization.json.buildJsonObject
+import kotlinx.serialization.json.decodeFromJsonElement
+import kotlinx.serialization.json.encodeToJsonElement
+import kotlinx.serialization.json.jsonArray
+import kotlinx.serialization.json.jsonObject
+import kotlinx.serialization.json.put
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.OkHttpClient
import okhttp3.Request
-import okhttp3.RequestBody
+import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response
+import org.jsoup.nodes.Element
import rx.Observable
+import rx.schedulers.Schedulers
+import uy.kohesive.injekt.injectLazy
import java.util.Calendar
@Nsfw
@@ -40,67 +43,102 @@ class NineHentai : HttpSource() {
override val client: OkHttpClient = network.cloudflareClient
- private val gson = Gson()
+ private val json: Json by injectLazy()
- override fun popularMangaRequest(page: Int): Request {
- return POST(baseUrl + SEARCH_URL, headers, buildRequestBody(page = page, sort = 1))
+ // Builds request for /api/getBooks endpoint
+ private fun buildSearchRequest(
+ searchText: String = "",
+ page: Int,
+ sort: Int = 0,
+ range: List = listOf(0, 2000),
+ includedTags: List = listOf(),
+ excludedTags: List = listOf()
+ ): Request {
+ val request = SearchRequest(
+ text = searchText,
+ page = page - 1, // Source starts counting from 0, not 1
+ sort = sort,
+ pages = Range(range),
+ tag = Items(
+ items = TagArrays(
+ included = includedTags,
+ excluded = excludedTags
+ )
+ )
+ )
+ val jsonString = buildJsonObject {
+ put("search", json.encodeToJsonElement(request))
+ }.toString()
+ return POST("$baseUrl$SEARCH_URL", headers, jsonString.toRequestBody(MEDIA_TYPE))
}
- override fun latestUpdatesRequest(page: Int): Request {
- return POST(baseUrl + SEARCH_URL, headers, buildRequestBody(page = page))
+ // Builds request for /api/getBookById endpoint
+ private fun buildDetailRequest(id: Int): Request {
+ val jsonString = buildJsonObject { put("id", id) }.toString()
+ return POST("$baseUrl$MANGA_URL", headers, jsonString.toRequestBody(MEDIA_TYPE))
}
- override fun fetchPopularManga(page: Int): Observable {
- return client.newCall(popularMangaRequest(page))
- .asObservableSuccess()
- .map { response ->
- getMangaList(response, page)
+ // Popular and Latest
+
+ override fun popularMangaRequest(page: Int): Request = buildSearchRequest(page = page, sort = 1)
+
+ override fun popularMangaParse(response: Response): MangasPage {
+ val results = json.parseToJsonElement(response.body!!.string()).jsonObject["results"]!!.jsonArray
+ if (results.isEmpty()) return MangasPage(listOf(), false)
+ return MangasPage(
+ results.map {
+ val manga = json.decodeFromJsonElement(it)
+ SManga.create().apply {
+ setUrlWithoutDomain("/g/${manga.id}")
+ title = manga.title
+ thumbnail_url = "${manga.image_server + manga.id}/cover.jpg"
+ }
+ },
+ true
+ )
+ }
+
+ override fun latestUpdatesRequest(page: Int): Request = buildSearchRequest(page = page)
+
+ override fun latestUpdatesParse(response: Response): MangasPage = popularMangaParse(response)
+
+ // Manga Details
+
+ override fun mangaDetailsParse(response: Response): SManga {
+ return SManga.create().apply {
+ response.asJsoup().selectFirst("div#bigcontainer").let { info ->
+ title = info.select("h1").text()
+ thumbnail_url = info.selectFirst("div#cover v-lazy-image").attr("abs:src")
+ status = SManga.COMPLETED
+ artist = info.selectTextOrNull("div.field-name:contains(Artist:) a.tag")
+ author = info.selectTextOrNull("div.field-name:contains(Group:) a.tag") ?: artist
+ genre = info.selectTextOrNull("div.field-name:contains(Tag:) a.tag")
+ // Additional details
+ description = listOf(
+ Pair("Alternative Title", info.selectTextOrNull("h2")),
+ Pair("Pages", info.selectTextOrNull("div#info > div:contains(pages)")),
+ Pair("Parody", info.selectTextOrNull("div.field-name:contains(Parody:) a.tag")),
+ Pair("Category", info.selectTextOrNull("div.field-name:contains(Category:) a.tag")),
+ Pair("Language", info.selectTextOrNull("div.field-name:contains(Language:) a.tag")),
+ ).filterNot { it.second.isNullOrEmpty() }.joinToString("\n\n") { "${it.first}: ${it.second}" }
}
- }
-
- override fun fetchLatestUpdates(page: Int): Observable {
- return client.newCall(latestUpdatesRequest(page))
- .asObservableSuccess()
- .map { response ->
- getMangaList(response, page)
- }
- }
-
- override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable {
- return client.newCall(searchMangaRequest(page, query, filters))
- .asObservableSuccess()
- .map { response ->
- getMangaList(response, page)
- }
- }
-
- private fun getMangaList(response: Response, page: Int): MangasPage {
- val jsonData = response.body!!.string()
- val jsonObject = JsonParser().parse(jsonData).asJsonObject
- val totalPages = jsonObject["total_count"].int
- val results = jsonObject["results"].array
- return MangasPage(parseSearch(results.toList()), page < totalPages)
- }
-
- private fun parseSearch(jsonArray: List): List {
- val mutableList = mutableListOf()
- jsonArray.forEach { json ->
- val manga = SManga.create()
- val gsonManga = gson.fromJson(json)
- manga.url = "/g/${gsonManga.id}"
- manga.title = gsonManga.title
- manga.thumbnail_url = gsonManga.image_server + gsonManga.id + "/cover.jpg"
- manga.genre = gsonManga.tags.filter { it.type == 1 }.joinToString { it.name }
- manga.artist = gsonManga.tags.firstOrNull { it.type == 4 }?.name
- manga.initialized = true
- mutableList.add(manga)
}
- return mutableList
}
+ // Ensures no exceptions are thrown when scraping additional details
+ private fun Element.selectTextOrNull(selector: String): String? {
+ val list = this.select(selector)
+ return if (list.isEmpty()) {
+ null
+ } else {
+ list.joinToString(", ") { it.text() }
+ }
+ }
+
+ // Chapter
+
override fun chapterListParse(response: Response): List {
- val document = response.asJsoup()
- val time = document.select("div#info div time").text()
+ val time = response.asJsoup().select("div#info div time").text()
return listOf(
SChapter.create().apply {
name = "Chapter"
@@ -142,58 +180,19 @@ class NineHentai : HttpSource() {
}
}
- override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
- val includedTags = mutableListOf()
- val excludedTags = mutableListOf()
- var sort = 0
- for (filter in if (filters.isEmpty()) getFilterList() else filters) {
- when (filter) {
- is GenreList -> {
- filter.state.forEach { f ->
- if (!f.isIgnored()) {
- if (f.isExcluded())
- excludedTags.add(f)
- else
- includedTags.add(f)
- }
- }
- }
- is Sorting -> {
- sort = filter.state!!.index
- }
- }
- }
- return POST(baseUrl + SEARCH_URL, headers, buildRequestBody(query, page, sort, includedTags, excludedTags))
- }
-
- override fun mangaDetailsParse(response: Response): SManga {
- return SManga.create().apply {
- response.asJsoup().select("div.card-body").firstOrNull()?.let { info ->
- title = info.select("h1").text()
- genre = info.select("div.field-name:contains(Tag:) a.tag").joinToString { it.text() }
- artist = info.select("div.field-name:contains(Artist:) a.tag").joinToString { it.text() }
- thumbnail_url = info.select("div#cover v-lazy-image").attr("abs:src")
- }
- }
- }
+ // Page List
override fun pageListRequest(chapter: SChapter): Request {
val mangaId = chapter.url.substringAfter("/g/").toInt()
- return POST(baseUrl + MANGA_URL, headers, buildIdBody(mangaId))
+ return buildDetailRequest(mangaId)
}
override fun pageListParse(response: Response): List {
- val jsonData = response.body!!.string()
- val jsonObject = JsonParser().parse(jsonData).asJsonObject
- val jsonArray = jsonObject.getAsJsonObject("results")
- var imageUrl: String
- var totalPages: Int
- var mangaId: String
- jsonArray.let { json ->
- mangaId = json["id"].string
- imageUrl = json["image_server"].string + mangaId
- totalPages = json["total_page"].int
- }
+ val resultsObj = json.parseToJsonElement(response.body!!.string()).jsonObject["results"]!!
+ val manga = json.decodeFromJsonElement(resultsObj)
+ val imageUrl = manga.image_server + manga.id
+ var totalPages = manga.total_page
+
val pages = mutableListOf()
client.newCall(
@@ -212,39 +211,158 @@ class NineHentai : HttpSource() {
return pages
}
- private fun buildRequestBody(searchText: String = "", page: Int, sort: Int = 0, includedTags: MutableList = arrayListOf(), excludedTags: MutableList = arrayListOf()): RequestBody {
- val json = gson.toJson(mapOf("search" to SearchRequest(text = searchText, page = page - 1, sort = sort, tag = mapOf("items" to Items(includedTags, excludedTags)))))
- return RequestBody.create(MEDIA_TYPE, json)
+ // Search
+
+ override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
+ val filterList = if (filters.isEmpty()) getFilterList() else filters
+ var sort = 0
+ val range = mutableListOf(0, 2000)
+ val includedTags = mutableListOf()
+ val excludedTags = mutableListOf()
+ for (filter in filterList) {
+ when (filter) {
+ is SortFilter -> {
+ sort = filter.state!!.index
+ }
+ is MinPagesFilter -> {
+ try {
+ range[0] = filter.state.toInt()
+ } catch (_: NumberFormatException) {
+ // Suppress and retain default value
+ }
+ }
+ is MaxPagesFilter -> {
+ try {
+ range[1] = filter.state.toInt()
+ } catch (_: NumberFormatException) {
+ // Suppress and retain default value
+ }
+ }
+ is IncludedFilter -> {
+ includedTags += getTags(filter.state, 1)
+ }
+ is ExcludedFilter -> {
+ excludedTags += getTags(filter.state, 1)
+ }
+ is GroupFilter -> {
+ includedTags += getTags(filter.state, 2)
+ }
+ is ParodyFilter -> {
+ includedTags += getTags(filter.state, 3)
+ }
+ is ArtistFilter -> {
+ includedTags += getTags(filter.state, 4)
+ }
+ is CharacterFilter -> {
+ includedTags += getTags(filter.state, 5)
+ }
+ is CategoryFilter -> {
+ includedTags += getTags(filter.state, 6)
+ }
+ }
+ }
+ return buildSearchRequest(
+ searchText = query,
+ page = page,
+ sort = sort,
+ range = range,
+ includedTags = includedTags,
+ excludedTags = excludedTags
+ )
}
- private fun buildIdBody(id: Int): RequestBody {
- return RequestBody.create(MEDIA_TYPE, gson.toJson(mapOf("id" to id)))
+ private fun getTags(queries: String, type: Int): List {
+ return queries.split(",").map(String::trim)
+ .filterNot(String::isBlank).mapNotNull { query ->
+ val jsonString = buildJsonObject {
+ put("tag_name", query)
+ put("tag_type", type)
+ }.toString()
+ lookupTags(jsonString)
+ }
}
- private class GenreList(tags: List) : Filter.Group("Tags", tags)
+ // Based on HentaiHand ext
+ private fun lookupTags(request: String): Tag? {
+ return client.newCall(POST("$baseUrl$TAG_URL", headers, request.toRequestBody(MEDIA_TYPE)))
+ .asObservableSuccess()
+ .subscribeOn(Schedulers.io())
+ .map { response ->
+ // Returns the first matched tag, or null if there are no results
+ val tagList = json.parseToJsonElement(response.body!!.string()).jsonObject["results"]!!.jsonArray.map {
+ json.decodeFromJsonElement(it)
+ }
+ if (tagList.isEmpty()) return@map null
+ else tagList.first()
+ }.toBlocking().first()
+ }
- private class Sorting : Filter.Sort(
- "Sorting",
+ override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable {
+ if (query.startsWith("id:")) {
+ val id = query.substringAfter("id:").toInt()
+ return client.newCall(buildDetailRequest(id))
+ .asObservableSuccess()
+ .map { response ->
+ fetchSingleManga(response)
+ }
+ }
+ return super.fetchSearchManga(page, query, filters)
+ }
+
+ private fun fetchSingleManga(response: Response): MangasPage {
+ val resultsObj = json.parseToJsonElement(response.body!!.string()).jsonObject["results"]!!
+ val manga = json.decodeFromJsonElement(resultsObj)
+ val list = listOf(
+ SManga.create().apply {
+ setUrlWithoutDomain("/g/${manga.id}")
+ title = manga.title
+ thumbnail_url = "${manga.image_server + manga.id}/cover.jpg"
+ }
+ )
+ return MangasPage(list, false)
+ }
+
+ override fun searchMangaParse(response: Response): MangasPage = popularMangaParse(response)
+
+ // Filters
+
+ private class SortFilter : Filter.Sort(
+ "Sort by",
arrayOf("Newest", "Popular Right now", "Most Fapped", "Most Viewed", "By Title"),
Selection(1, false)
)
+ private class MinPagesFilter : Filter.Text("Minimum Pages")
+ private class MaxPagesFilter : Filter.Text("Maximum Pages")
+ private class IncludedFilter : Filter.Text("Included Tags")
+ private class ExcludedFilter : Filter.Text("Excluded Tags")
+ private class ArtistFilter : Filter.Text("Artist")
+ private class GroupFilter : Filter.Text("Group")
+ private class ParodyFilter : Filter.Text("Parody")
+ private class CharacterFilter : Filter.Text("Character")
+ private class CategoryFilter : Filter.Text("Category")
+
override fun getFilterList() = FilterList(
- Sorting(),
- GenreList(NHTags.getTagsList())
+ Filter.Header("Search by id with \"id:\" in front of query"),
+ Filter.Separator(),
+ SortFilter(),
+ MinPagesFilter(),
+ MaxPagesFilter(),
+ IncludedFilter(),
+ ExcludedFilter(),
+ ArtistFilter(),
+ GroupFilter(),
+ ParodyFilter(),
+ CharacterFilter(),
+ CategoryFilter(),
)
override fun imageUrlParse(response: Response): String = throw Exception("Not Used")
- override fun popularMangaParse(response: Response): MangasPage = throw Exception("Not Used")
-
- override fun latestUpdatesParse(response: Response): MangasPage = throw Exception("Not Used")
-
- override fun searchMangaParse(response: Response): MangasPage = throw Exception("Not Used")
-
companion object {
private val MEDIA_TYPE = "application/json; charset=utf-8".toMediaTypeOrNull()
private const val SEARCH_URL = "/api/getBook"
private const val MANGA_URL = "/api/getBookByID"
+ private const val TAG_URL = "/api/getTag"
}
}
diff --git a/src/all/ninehentai/src/eu/kanade/tachiyomi/extension/all/ninehentai/NineHentaiDto.kt b/src/all/ninehentai/src/eu/kanade/tachiyomi/extension/all/ninehentai/NineHentaiDto.kt
new file mode 100644
index 000000000..1c08191e2
--- /dev/null
+++ b/src/all/ninehentai/src/eu/kanade/tachiyomi/extension/all/ninehentai/NineHentaiDto.kt
@@ -0,0 +1,72 @@
+package eu.kanade.tachiyomi.extension.all.ninehentai
+
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class Manga(
+ val id: Int,
+ val title: String,
+ val image_server: String,
+ val total_page: Int
+)
+
+/*
+The basic search request JSON object looks like this:
+{
+ "search": {
+ "text": "",
+ "page": 1,
+ "sort": 1,
+ "pages": {
+ "range": [0, 2000]
+ },
+ "tag": {
+ "items": {
+ "included": [],
+ "excluded": []
+ }
+ }
+ }
+}
+*/
+
+/*
+ Sort = 0, Newest
+ Sort = 1, Popular right now
+ Sort = 2, Most Fapped
+ Sort = 3, Most Viewed
+ Sort = 4, By title
+ */
+
+@Serializable
+data class SearchRequest(
+ val text: String,
+ val page: Int,
+ val sort: Int,
+ val pages: Range,
+ val tag: Items
+)
+
+@Serializable
+data class Range(
+ val range: List
+)
+
+@Serializable
+data class Items(
+ val items: TagArrays
+)
+
+@Serializable
+data class TagArrays(
+ val included: List,
+ val excluded: List
+)
+
+@Serializable
+data class Tag(
+ val id: Int,
+ val name: String,
+ val description: String? = null,
+ val type: Int = 1
+)
diff --git a/src/all/ninehentai/src/eu/kanade/tachiyomi/extension/all/ninehentai/NineHentaiUrlActivity.kt b/src/all/ninehentai/src/eu/kanade/tachiyomi/extension/all/ninehentai/NineHentaiUrlActivity.kt
new file mode 100644
index 000000000..87f3ea5e3
--- /dev/null
+++ b/src/all/ninehentai/src/eu/kanade/tachiyomi/extension/all/ninehentai/NineHentaiUrlActivity.kt
@@ -0,0 +1,38 @@
+package eu.kanade.tachiyomi.extension.all.ninehentai
+
+import android.app.Activity
+import android.content.ActivityNotFoundException
+import android.content.Intent
+import android.os.Bundle
+import android.util.Log
+import kotlin.system.exitProcess
+
+/**
+ * Springboard that accepts https://9hentai.to/g/xxxxxx intents and redirects them to
+ * the main Tachiyomi process.
+ */
+class NineHentaiUrlActivity : Activity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ val pathSegments = intent?.data?.pathSegments
+ if (pathSegments != null && pathSegments.size > 1) {
+ val id = pathSegments[1]
+ val mainIntent = Intent().apply {
+ action = "eu.kanade.tachiyomi.SEARCH"
+ putExtra("query", "id:$id")
+ putExtra("filter", packageName)
+ }
+
+ try {
+ startActivity(mainIntent)
+ } catch (e: ActivityNotFoundException) {
+ Log.e("NineHentaiUrlActivity", e.toString())
+ }
+ } else {
+ Log.e("NineHentaiUrlActivity", "could not parse uri from intent $intent")
+ }
+
+ finish()
+ exitProcess(0)
+ }
+}