This commit is contained in:
rebelonion 2024-06-01 08:25:12 -05:00
commit fdc1b31c44
6 changed files with 83 additions and 26 deletions

View file

@ -102,7 +102,7 @@ class AnilistMutations {
?: (currContext()?.getString(ani.dantotsu.R.string.success) ?: "Success") ?: (currContext()?.getString(ani.dantotsu.R.string.success) ?: "Success")
} }
suspend fun postMessage(userId: Int, text: String, edit: Int? = null,isPrivate: Boolean = false): String { suspend fun postMessage(userId: Int, text: String, edit: Int? = null,isPrivate: Boolean = false): String {
val encodedText = text.stringSanitizer() val encodedText = text.replace("","").stringSanitizer()
val query = "mutation{SaveMessageActivity(${if (edit != null) "id:$edit," else ""} recipientId:$userId,message:$encodedText,private:$isPrivate){id}}" val query = "mutation{SaveMessageActivity(${if (edit != null) "id:$edit," else ""} recipientId:$userId,message:$encodedText,private:$isPrivate){id}}"
val result = executeQuery<JsonObject>(query) val result = executeQuery<JsonObject>(query)
val errors = result?.get("errors") val errors = result?.get("errors")

View file

@ -33,9 +33,6 @@ class CharacterAdapter(
binding.itemCompactRelation.text = whitespace binding.itemCompactRelation.text = whitespace
binding.itemCompactImage.loadImage(character.image) binding.itemCompactImage.loadImage(character.image)
binding.itemCompactTitle.text = character.name binding.itemCompactTitle.text = character.name
binding.root.setOnClickListener {
copyToClipboard(character.name ?: "")
}
} }
override fun getItemCount(): Int = characterList.size override fun getItemCount(): Int = characterList.size
@ -59,6 +56,7 @@ class CharacterAdapter(
).toBundle() ).toBundle()
) )
} }
itemView.setOnLongClickListener { copyToClipboard(characterList[bindingAdapterPosition].name ?: ""); true }
} }
} }
} }

View file

@ -13,6 +13,7 @@ import ani.dantotsu.media.anime.Episode
import ani.dantotsu.media.anime.SelectorDialogFragment import ani.dantotsu.media.anime.SelectorDialogFragment
import ani.dantotsu.media.manga.MangaChapter import ani.dantotsu.media.manga.MangaChapter
import ani.dantotsu.others.AniSkip import ani.dantotsu.others.AniSkip
import ani.dantotsu.others.Anify
import ani.dantotsu.others.Jikan import ani.dantotsu.others.Jikan
import ani.dantotsu.others.Kitsu import ani.dantotsu.others.Kitsu
import ani.dantotsu.parsers.AnimeSources import ani.dantotsu.parsers.AnimeSources
@ -99,6 +100,15 @@ class MediaDetailsViewModel : ViewModel() {
if (kitsuEpisodes.value == null) kitsuEpisodes.postValue(Kitsu.getKitsuEpisodesDetails(s)) if (kitsuEpisodes.value == null) kitsuEpisodes.postValue(Kitsu.getKitsuEpisodesDetails(s))
} }
} }
private val anifyEpisodes: MutableLiveData<Map<String, Episode>> =
MutableLiveData<Map<String, Episode>>(null)
fun getAnifyEpisodes(): LiveData<Map<String, Episode>> = anifyEpisodes
suspend fun loadAnifyEpisodes(s: Int) {
tryWithSuspend {
if (anifyEpisodes.value == null) anifyEpisodes.postValue(Anify.fetchAndParseMetadata(s))
}
}
private val fillerEpisodes: MutableLiveData<Map<String, Episode>> = private val fillerEpisodes: MutableLiveData<Map<String, Episode>> =
MutableLiveData<Map<String, Episode>>(null) MutableLiveData<Map<String, Episode>>(null)

View file

@ -26,4 +26,5 @@ data class Anime(
var slug: String? = null, var slug: String? = null,
var kitsuEpisodes: Map<String, Episode>? = null, var kitsuEpisodes: Map<String, Episode>? = null,
var fillerEpisodes: Map<String, Episode>? = null, var fillerEpisodes: Map<String, Episode>? = null,
var anifyEpisodes: Map<String, Episode>? = null,
) : Serializable ) : Serializable

View file

@ -49,6 +49,7 @@ import ani.dantotsu.media.MediaType
import ani.dantotsu.navBarHeight import ani.dantotsu.navBarHeight
import ani.dantotsu.notifications.subscription.SubscriptionHelper import ani.dantotsu.notifications.subscription.SubscriptionHelper
import ani.dantotsu.notifications.subscription.SubscriptionHelper.Companion.saveSubscription import ani.dantotsu.notifications.subscription.SubscriptionHelper.Companion.saveSubscription
import ani.dantotsu.others.Anify
import ani.dantotsu.others.LanguageMapper import ani.dantotsu.others.LanguageMapper
import ani.dantotsu.parsers.AnimeParser import ani.dantotsu.parsers.AnimeParser
import ani.dantotsu.parsers.AnimeSources import ani.dantotsu.parsers.AnimeSources
@ -213,10 +214,11 @@ class AnimeWatchFragment : Fragment() {
if (offline) { if (offline) {
media.selected!!.sourceIndex = model.watchSources!!.list.lastIndex media.selected!!.sourceIndex = model.watchSources!!.list.lastIndex
} else { } else {
awaitAll( val kitsuEpisodes = async { model.loadKitsuEpisodes(media) }
async { model.loadKitsuEpisodes(media) }, val anifyEpisodes = async { model.loadAnifyEpisodes(media.id) }
async { model.loadFillerEpisodes(media) } val fillerEpisodes = async { model.loadFillerEpisodes(media) }
)
awaitAll(kitsuEpisodes, anifyEpisodes, fillerEpisodes)
} }
model.loadEpisodes(media, media.selected!!.sourceIndex) model.loadEpisodes(media, media.selected!!.sourceIndex)
} }
@ -231,19 +233,18 @@ class AnimeWatchFragment : Fragment() {
val episodes = loadedEpisodes[media.selected!!.sourceIndex] val episodes = loadedEpisodes[media.selected!!.sourceIndex]
if (episodes != null) { if (episodes != null) {
episodes.forEach { (i, episode) -> episodes.forEach { (i, episode) ->
fun getThumbnail(episodes: List<MediaStreamingEpisode>): List<Pair<String, FileUrl?>> { if (media.anime?.anifyEpisodes != null) {
return episodes.mapNotNull { episode -> if (media.anime!!.anifyEpisodes!!.containsKey(i)) {
val regex = Regex("""Episode\s*(\d+)\s*-\s*(.*)""") episode.desc = media.anime!!.anifyEpisodes!![i]?.desc ?: episode.desc
val number = episode.title?.let { episode.title = if (MediaNameAdapter.removeEpisodeNumberCompletely(
val matchResult = regex.matchEntire(it) episode.title ?: ""
matchResult?.destructured?.component1() ).isBlank()
} ) media.anime!!.anifyEpisodes!![i]?.title ?: episode.title else episode.title
number?.let { number to FileUrl[episode.thumbnail] } ?: media.anime!!.anifyEpisodes!![i]?.title ?: episode.title
} episode.thumb = media.anime!!.anifyEpisodes!![i]?.thumb ?: episode.thumb
}
val getThumbnail = getThumbnail(media.streamingEpisodes ?: emptyList())
}
}
if (media.anime?.fillerEpisodes != null) { if (media.anime?.fillerEpisodes != null) {
if (media.anime!!.fillerEpisodes!!.containsKey(i)) { if (media.anime!!.fillerEpisodes!!.containsKey(i)) {
episode.title = episode.title =
@ -253,16 +254,13 @@ class AnimeWatchFragment : Fragment() {
} }
if (media.anime?.kitsuEpisodes != null) { if (media.anime?.kitsuEpisodes != null) {
if (media.anime!!.kitsuEpisodes!!.containsKey(i)) { if (media.anime!!.kitsuEpisodes!!.containsKey(i)) {
episode.desc = episode.desc = media.anime!!.kitsuEpisodes!![i]?.desc ?: episode.desc
media.anime!!.kitsuEpisodes!![i]?.desc ?: episode.desc
episode.title = if (MediaNameAdapter.removeEpisodeNumberCompletely( episode.title = if (MediaNameAdapter.removeEpisodeNumberCompletely(
episode.title ?: "" episode.title ?: ""
).isBlank() ).isBlank()
) media.anime!!.kitsuEpisodes!![i]?.title ) media.anime!!.kitsuEpisodes!![i]?.title ?: episode.title else episode.title
?: episode.title else episode.title
?: media.anime!!.kitsuEpisodes!![i]?.title ?: episode.title ?: media.anime!!.kitsuEpisodes!![i]?.title ?: episode.title
episode.thumb = getThumbnail.find { it.first == i }?.second episode.thumb = media.anime!!.kitsuEpisodes!![i]?.thumb ?: episode.thumb
?: media.anime!!.kitsuEpisodes!![i]?.thumb ?: episode.thumb
} }
} }
} }
@ -309,6 +307,10 @@ class AnimeWatchFragment : Fragment() {
if (i != null) if (i != null)
media.anime?.fillerEpisodes = i media.anime?.fillerEpisodes = i
} }
model.getAnifyEpisodes().observe(viewLifecycleOwner) { i ->
if (i != null)
media.anime?.anifyEpisodes = i
}
} }
fun onSourceChange(i: Int): AnimeParser { fun onSourceChange(i: Int): AnimeParser {

View file

@ -0,0 +1,46 @@
package ani.dantotsu.others
import ani.dantotsu.FileUrl
import ani.dantotsu.Mapper
import ani.dantotsu.client
import ani.dantotsu.media.anime.Episode
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonArray
import kotlinx.serialization.json.decodeFromJsonElement
object Anify {
suspend fun fetchAndParseMetadata(id :Int): Map<String, Episode> {
val response = client.get("https://api.anify.tv/content-metadata/$id")
.parsed<JsonArray>().map {
Mapper.json.decodeFromJsonElement<AnifyElement>(it)
}
return response.firstOrNull()?.data?.associate {
it.number.toString() to Episode(
number = it.number.toString(),
title = it.title,
desc = it.description,
thumb = FileUrl[it.img],
)
} ?: emptyMap()
}
@Serializable
data class AnifyElement (
@SerialName("providerId")
val providerID: String? = null,
val data: List<Datum>? = null
)
@Serializable
data class Datum (
val id: String? = null,
val description: String? = null,
val hasDub: Boolean? = null,
val img: String? = null,
val isFiller: Boolean? = null,
val number: Long? = null,
val title: String? = null,
val updatedAt: Long? = null,
val rating: Double? = null
)
}