Rule34Video: Added Filters, HentaiMama: Icon update. (#762)
Co-authored-by: jmir1 <jhmiramon@gmail.com>
@ -1,5 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<background android:drawable="@color/ic_launcher_background"/>
|
|
||||||
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
|
||||||
</adaptive-icon>
|
|
@ -1,5 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<background android:drawable="@color/ic_launcher_background"/>
|
|
||||||
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
|
||||||
</adaptive-icon>
|
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 6.1 KiB |
Before Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 9.6 KiB |
Before Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 9.5 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 17 KiB |
@ -1,4 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<resources>
|
|
||||||
<color name="ic_launcher_background">#0F0F0F</color>
|
|
||||||
</resources>
|
|
@ -5,7 +5,7 @@ ext {
|
|||||||
extName = 'Rule34Video'
|
extName = 'Rule34Video'
|
||||||
pkgNameSuffix = 'en.rule34video'
|
pkgNameSuffix = 'en.rule34video'
|
||||||
extClass = '.Rule34Video'
|
extClass = '.Rule34Video'
|
||||||
extVersionCode = 1
|
extVersionCode = 2
|
||||||
libVersion = '13'
|
libVersion = '13'
|
||||||
containsNsfw = true
|
containsNsfw = true
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,6 @@ package eu.kanade.tachiyomi.animeextension.en.rule34video
|
|||||||
|
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import android.media.tv.TvContract
|
|
||||||
import androidx.preference.ListPreference
|
import androidx.preference.ListPreference
|
||||||
import androidx.preference.PreferenceScreen
|
import androidx.preference.PreferenceScreen
|
||||||
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
||||||
@ -44,6 +43,7 @@ class Rule34Video : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
override fun popularAnimeSelector(): String = "div.item.thumb"
|
override fun popularAnimeSelector(): String = "div.item.thumb"
|
||||||
|
|
||||||
override fun popularAnimeRequest(page: Int): Request =
|
override fun popularAnimeRequest(page: Int): Request =
|
||||||
|
|
||||||
GET("$baseUrl/latest-updates/$page/")
|
GET("$baseUrl/latest-updates/$page/")
|
||||||
|
|
||||||
override fun popularAnimeFromElement(element: Element): SAnime {
|
override fun popularAnimeFromElement(element: Element): SAnime {
|
||||||
@ -51,6 +51,7 @@ class Rule34Video : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
anime.setUrlWithoutDomain(element.select("a.th").attr("href"))
|
anime.setUrlWithoutDomain(element.select("a.th").attr("href"))
|
||||||
anime.title = element.select("a.th div.thumb_title").text()
|
anime.title = element.select("a.th div.thumb_title").text()
|
||||||
anime.thumbnail_url = element.select("a.th div.img img").attr("data-original")
|
anime.thumbnail_url = element.select("a.th div.img img").attr("data-original")
|
||||||
|
|
||||||
return anime
|
return anime
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -59,8 +60,6 @@ class Rule34Video : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
override fun episodeListParse(response: Response): List<SEpisode> {
|
override fun episodeListParse(response: Response): List<SEpisode> {
|
||||||
val episodes = mutableListOf<SEpisode>()
|
val episodes = mutableListOf<SEpisode>()
|
||||||
|
|
||||||
val jsoup = response.asJsoup()
|
|
||||||
|
|
||||||
val episode = SEpisode.create().apply {
|
val episode = SEpisode.create().apply {
|
||||||
name = "Video"
|
name = "Video"
|
||||||
date_upload = System.currentTimeMillis()
|
date_upload = System.currentTimeMillis()
|
||||||
@ -78,30 +77,15 @@ class Rule34Video : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
override fun videoListParse(response: Response): List<Video> {
|
override fun videoListParse(response: Response): List<Video> {
|
||||||
val document = response.asJsoup()
|
val document = response.asJsoup()
|
||||||
|
|
||||||
val VideoLinks = document.select("div.video_tools div:nth-child(3) div a.tag_item")
|
val videoLinks = document.select("div.video_tools div:nth-child(3) div a.tag_item")
|
||||||
.map {
|
.map {
|
||||||
it.attr("href") + it.text()
|
it.attr("href") + it.text()
|
||||||
.replace("MP4", "")
|
.replace("MP4", "")
|
||||||
}
|
}
|
||||||
|
|
||||||
val videoList = mutableListOf<Video>()
|
val videoList = mutableListOf<Video>()
|
||||||
|
for (video in videoLinks) {
|
||||||
for (i in VideoLinks) {
|
videoList.add(Video(video.split(" ")[0], video.split(" ")[1], video.split(" ")[0]))
|
||||||
if (i.split(" ")[1] == "2160p") {
|
|
||||||
videoList.add(Video(i.split(" ")[0], "2160p", i.split(" ")[0]))
|
|
||||||
}
|
|
||||||
if (i.split(" ")[1] == "1080p") {
|
|
||||||
videoList.add(Video(i.split(" ")[0], "1080p", i.split(" ")[0]))
|
|
||||||
}
|
|
||||||
if (i.split(" ")[1] == "720p") {
|
|
||||||
videoList.add(Video(i.split(" ")[0], "720p", i.split(" ")[0]))
|
|
||||||
}
|
|
||||||
if (i.split(" ")[1] == "480p") {
|
|
||||||
videoList.add(Video(i.split(" ")[0], "480p", i.split(" ")[0]))
|
|
||||||
}
|
|
||||||
if (i.split(" ")[1] == "360p") {
|
|
||||||
videoList.add(Video(i.split(" ")[0], "360p", i.split(" ")[0]))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return videoList
|
return videoList
|
||||||
@ -131,8 +115,36 @@ class Rule34Video : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Search
|
||||||
|
|
||||||
|
private var cat = false
|
||||||
|
|
||||||
override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request {
|
override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request {
|
||||||
return GET("$baseUrl/search/$query/?from_videos=$page", headers)
|
|
||||||
|
val sortedBy = getSearchParameters(filters).split(":")[0]
|
||||||
|
val catBy = getSearchParameters(filters).split(":")[1]
|
||||||
|
|
||||||
|
return if (query.isNotEmpty()) {
|
||||||
|
|
||||||
|
cat = false
|
||||||
|
var newSort = ""
|
||||||
|
when (sortedBy) {
|
||||||
|
"latest-updates" -> {
|
||||||
|
newSort = "post_date"
|
||||||
|
}
|
||||||
|
"most-popular" -> {
|
||||||
|
newSort = "video_viewed"
|
||||||
|
}
|
||||||
|
"top-rated" -> {
|
||||||
|
newSort = "rating"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GET("$baseUrl/search/$query/?flag1=$catBy&sort_by=$newSort&from_videos=$page", headers) // with search
|
||||||
|
} else {
|
||||||
|
cat = true
|
||||||
|
GET("$baseUrl/$sortedBy/$page/?flag1=$catBy", headers) // without search
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun searchAnimeSelector(): String = "div.item.thumb"
|
override fun searchAnimeSelector(): String = "div.item.thumb"
|
||||||
@ -173,8 +185,8 @@ class Rule34Video : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
val videoQualityPref = ListPreference(screen.context).apply {
|
val videoQualityPref = ListPreference(screen.context).apply {
|
||||||
key = "preferred_quality"
|
key = "preferred_quality"
|
||||||
title = "Preferred quality"
|
title = "Preferred quality"
|
||||||
entries = arrayOf("1080p", "720p", "480p", "360p")
|
entries = arrayOf("2160p", "1080p", "720p", "480p", "360p")
|
||||||
entryValues = arrayOf("1080p", "720p", "480p", "360p")
|
entryValues = arrayOf("2160p", "1080p", "720p", "480p", "360p")
|
||||||
setDefaultValue("1080p")
|
setDefaultValue("1080p")
|
||||||
summary = "%s"
|
summary = "%s"
|
||||||
|
|
||||||
@ -190,4 +202,57 @@ class Rule34Video : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
|
|
||||||
// Filters
|
// Filters
|
||||||
|
|
||||||
|
private data class View(val name: String, val id: String)
|
||||||
|
private class ViewList(Views: Array<String>) : AnimeFilter.Select<String>("Order", Views)
|
||||||
|
private val viewBy = getView().map {
|
||||||
|
it.name
|
||||||
|
}.toTypedArray()
|
||||||
|
private fun getView() = listOf(
|
||||||
|
View("Latest", "latest-updates"),
|
||||||
|
View("Most Viewed", "most-popular"),
|
||||||
|
View("Top Rated", "top-rated"),
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
private data class Category(val name: String, val id: String)
|
||||||
|
private class CategoryList(Categories: Array<String>) : AnimeFilter.Select<String>("Category", Categories)
|
||||||
|
private val categoryBy = getCategory().map {
|
||||||
|
it.name
|
||||||
|
}.toTypedArray()
|
||||||
|
private fun getCategory() = listOf(
|
||||||
|
Category("All", ""),
|
||||||
|
Category("Futa", "15"),
|
||||||
|
Category("Gay", "192"),
|
||||||
|
)
|
||||||
|
|
||||||
|
override fun getFilterList(): AnimeFilterList = AnimeFilterList(
|
||||||
|
AnimeFilter.Header("Might not work in first try."),
|
||||||
|
AnimeFilter.Separator(),
|
||||||
|
ViewList(viewBy),
|
||||||
|
CategoryList(categoryBy),
|
||||||
|
)
|
||||||
|
|
||||||
|
private fun getSearchParameters(filters: AnimeFilterList): String {
|
||||||
|
var viewBy = ""
|
||||||
|
var categoryBy = ""
|
||||||
|
|
||||||
|
filters.forEach { filter ->
|
||||||
|
when (filter) {
|
||||||
|
|
||||||
|
is ViewList -> { // ---Order
|
||||||
|
viewBy = getView()[filter.state].id
|
||||||
|
}
|
||||||
|
|
||||||
|
is CategoryList -> { // ---Category
|
||||||
|
if (cat) {
|
||||||
|
categoryBy = getCategory()[filter.state].id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else -> {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "$viewBy:$categoryBy"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|