Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,4 @@
.cxx
/app/src/main/java/com/axiel7/moelist/private/ClientId.kt
/app/release
*.salive
10 changes: 10 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ android {
)
buildConfigField("String", "CLIENT_ID", privateProps.getProperty("CLIENT_ID"))
resValue("string", "app_name", "MoeList Debug")
buildConfigField("String", "ANILIST_CLIENT_ID", privateProps.getProperty("ANILIST_CLIENT_ID"))
buildConfigField("String", "ANILIST_CLIENT_SECRET", privateProps.getProperty("ANILIST_CLIENT_SECRET"))
}
release {
isDebuggable = false
Expand All @@ -65,6 +67,8 @@ android {
"proguard-rules.pro"
)
buildConfigField("String", "CLIENT_ID", privateProps.getProperty("CLIENT_ID"))
buildConfigField("String", "ANILIST_CLIENT_ID", privateProps.getProperty("ANILIST_CLIENT_ID"))
buildConfigField("String", "ANILIST_CLIENT_SECRET", privateProps.getProperty("ANILIST_CLIENT_SECRET"))
}
}
splits {
Expand Down Expand Up @@ -170,4 +174,10 @@ dependencies {
implementation("androidx.room:room-runtime:$roomVersion")
implementation("androidx.room:room-ktx:$roomVersion")
ksp("androidx.room:room-compiler:$roomVersion")

//kache
// For in-memory cache
implementation("com.mayakapps.kache:kache:2.1.0")
// For persistent cache
implementation("com.mayakapps.kache:file-kache:2.1.0")
}
9 changes: 9 additions & 0 deletions app/src/main/java/com/axiel7/moelist/App.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,17 @@ import coil3.disk.DiskCache
import coil3.disk.directory
import coil3.memory.MemoryCache
import coil3.request.crossfade
import com.axiel7.moelist._GitHubPRs.Anilist.AnilistQuery
import com.axiel7.moelist.data.model.media.TitleLanguage
import com.axiel7.moelist.di.dataStoreModule
import com.axiel7.moelist.di.databaseModule
import com.axiel7.moelist.di.networkModule
import com.axiel7.moelist.di.repositoryModule
import com.axiel7.moelist.di.viewModelModule
import com.axiel7.moelist.di.workerModule
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import org.koin.android.ext.koin.androidContext
import org.koin.android.ext.koin.androidLogger
import org.koin.androidx.workmanager.koin.workManagerFactory
Expand All @@ -40,6 +44,11 @@ class App : Application(), KoinComponent, KoinStartup, SingletonImageLoader.Fact
workerModule,
databaseModule,
)

GlobalScope.launch(Dispatchers.IO) {
AnilistQuery.cache = AnilistQuery.New_ObjectKache()
}

}

override fun newImageLoader(context: PlatformContext) =
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
package com.axiel7.moelist._GitHubPRs.Anilist

import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.res.stringResource
import com.axiel7.moelist.R
import com.axiel7.moelist.data.model.anime.AnimeNode
import com.axiel7.moelist.data.model.anime.Broadcast
import com.axiel7.moelist.data.model.media.BaseMediaNode
import com.axiel7.moelist.data.model.media.BaseUserMediaList
import com.axiel7.moelist.utils.StringExtensions.toStringOrEmpty
import kotlinx.serialization.Serializable
import kotlinx.serialization.SerialName

@Serializable
data class ALNextAiringEpisode(
val data: Data,
)
@Serializable
data class Data(
@SerialName("Page" ) val Page: Page,
)
@Serializable
data class Page(
val pageInfo: PageInfo,
val media: List<Media>,
)
@Serializable
data class PageInfo(
val total: Long,
val currentPage: Long,
val lastPage: Long,
val hasNextPage: Boolean,
val perPage: Long,
)
@Serializable
data class Media(
val id: Long,
val idMal: Long,
val nextAiringEpisode: NextAiringEpisode?,
val title: Title,
)
@Serializable
data class NextAiringEpisode(
val episode: Long,
val timeUntilAiring: Long,
)
{
fun EpN_in_Mdays_ToString():String
{
var days = secondsToDays_AsString(timeUntilAiring)
var str = """Ep ${episode} in ${days}"""
return str
}


}
@Serializable
data class Title(
val english: String?,
)
{

}

/**
* ALl Funcs Below are Helper. they Makes date Human Readable.
*/

/**
* Supports Days , Hours , Minutes. less than a minute will be 0
*/
fun secondsToDays_AsString(seconds: Long): String {
val _1month :Long = 30 *24 * 60 * 60
val _1day :Long = 24 * 60 * 60
val _1hour :Long = 60 * 60
val _1min :Long = 60

var HumanReadbleTime =""

HumanReadbleTime =
GetNLDatesString_OrNull(seconds, _1month , "months" ,"month" )
?: GetNLDatesString_OrNull(seconds, _1day , "days" ,"day" )
?: GetNLDatesString_OrNull(seconds, _1hour , "hours" ,"hour" )
?: GetNLDatesString_OrNull(seconds, _1min , "mins" ,"min" )
?: "? sec" ;

return HumanReadbleTime;
}

private fun GetNLDatesString_OrNull(
seconds: Long,
_1Period: Long,
PluaralText:String,
SingularText:String,
): String? {
var HumanReadbleTime: String? = null

if (seconds > _1Period) {
val days = seconds / _1Period; HumanReadbleTime = "${days} ${PluaralText}"
} else if (seconds == _1Period) {
val days = seconds / _1Period; HumanReadbleTime = "${days} ${SingularText}"
}
return HumanReadbleTime;
}


@Composable
fun AiringEpN_in_Ndays_ToString(
broadcast: Broadcast?,
item: BaseUserMediaList<out BaseMediaNode>
): String {
val isAiring = remember { item.isAiring }

// var textCompact = broadcast?.airingInString() ?: stringResource(R.string.airing)
var text =
if (isAiring ) broadcast?.airingInString() ?: stringResource(R.string.airing)
else item.node.mediaFormat?.localized().orEmpty()

if (item.node is AnimeNode)
text = (item.node as AnimeNode)?.al_nextAiringEpisode.toStringOrEmpty()
return text
}

/**
* For Grid - ie: 8d
*/
@Composable
fun AiringEpN_in_Ndays_ToShortString(
broadcast: Broadcast?,
item: BaseUserMediaList<out BaseMediaNode>
): String {
val isAiring = remember { item.isAiring }

var text = broadcast?.airingInShortString() ?: stringResource(R.string.airing)

if (item.node is AnimeNode)
text = (item.node as AnimeNode)?.al_nextAiringEpisode.toStringOrEmpty()
return text
}

Loading