Skip to content
Merged
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
93 changes: 9 additions & 84 deletions app/src/main/java/com/github/damontecres/stashapp/Constants.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ import android.util.Log
import android.widget.Toast
import androidx.preference.PreferenceManager
import com.apollographql.apollo3.ApolloClient
import com.apollographql.apollo3.api.ApolloResponse
import com.apollographql.apollo3.api.Optional
import com.apollographql.apollo3.api.http.HttpRequest
import com.apollographql.apollo3.api.http.HttpResponse
import com.apollographql.apollo3.exception.ApolloException
Expand All @@ -16,12 +14,7 @@ import com.apollographql.apollo3.network.http.HttpInterceptor
import com.apollographql.apollo3.network.http.HttpInterceptorChain
import com.bumptech.glide.load.model.GlideUrl
import com.bumptech.glide.load.model.LazyHeaders
import com.github.damontecres.stashapp.api.FindScenesQuery
import com.github.damontecres.stashapp.api.ServerInfoQuery
import com.github.damontecres.stashapp.api.fragment.SlimSceneData
import com.github.damontecres.stashapp.api.type.CriterionModifier
import com.github.damontecres.stashapp.api.type.HierarchicalMultiCriterionInput
import com.github.damontecres.stashapp.api.type.SceneFilterType
import com.github.damontecres.stashapp.data.Scene

object Constants {
Expand Down Expand Up @@ -49,6 +42,15 @@ fun createGlideUrl(url: String, apiKey: String?): GlideUrl {
}
}

/**
* Create a [GlideUrl], adding the API key to the headers if needed
*/
fun createGlideUrl(url: String, context: Context): GlideUrl {
val apiKey = PreferenceManager.getDefaultSharedPreferences(context)
.getString("stashApiKey", "")
return createGlideUrl(url, apiKey)
}

/**
* Add API key to headers for Apollo GraphQL requests
*/
Expand Down Expand Up @@ -101,17 +103,6 @@ fun createApolloClient(context: Context): ApolloClient? {
return createApolloClient(stashUrl, apiKey)
}

suspend fun getStashServerInfo(
stashUrl: String?,
apiKey: String?
): ApolloResponse<ServerInfoQuery.Data>? {
try {
return createApolloClient(stashUrl, apiKey)?.query(ServerInfoQuery())?.execute()
} catch (exception: ApolloException) {
return null
}
}

/**
* Test whether the app can connect to Stash
*
Expand Down Expand Up @@ -179,72 +170,6 @@ suspend fun testStashConnection(context: Context, showToast: Boolean): Boolean {
return false
}

/**
* Get Scene data for a list of scene IDs
*/
suspend fun fetchScenesById(context: Context, sceneIds: List<Int>): List<SlimSceneData> {
val apolloClient = createApolloClient(context)
if (apolloClient != null) {
val results = apolloClient.query(
FindScenesQuery(scene_ids = Optional.present(sceneIds))
).execute()
return results.data?.findScenes?.scenes?.map { it.slimSceneData }.orEmpty()
}
return listOf()
}

/**
* Get a Scene by ID
*/
suspend fun fetchSceneById(context: Context, sceneId: Int): SlimSceneData? {
val results = fetchScenesById(context, listOf(sceneId))
return results.getOrNull(0)
}

suspend fun fetchScenesByTag(context: Context, tagId: Int): List<SlimSceneData> {
val apolloClient = createApolloClient(context)
if (apolloClient != null) {
val results = apolloClient.query(
FindScenesQuery(
scene_filter = Optional.present(
SceneFilterType(
tags = Optional.present(
HierarchicalMultiCriterionInput(
value = Optional.present(listOf(tagId.toString())),
modifier = CriterionModifier.INCLUDES_ALL
)
)
)
)
)
).execute()
return results.data?.findScenes?.scenes?.map { it.slimSceneData }.orEmpty()
}
return listOf()
}

suspend fun fetchScenesByStudio(context: Context, studioId: Int): List<SlimSceneData> {
val apolloClient = createApolloClient(context)
if (apolloClient != null) {
val results = apolloClient.query(
FindScenesQuery(
scene_filter = Optional.present(
SceneFilterType(
studios = Optional.present(
HierarchicalMultiCriterionInput(
value = Optional.present(listOf(studioId.toString())),
modifier = CriterionModifier.INCLUDES_ALL
)
)
)
)
)
).execute()
return results.data?.findScenes?.scenes?.map { it.slimSceneData }.orEmpty()
}
return listOf()
}

fun selectStream(scene: Scene?): String? {
if (scene == null) {
return null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,10 @@ class ErrorFragment : ErrorSupportFragment() {

internal fun setErrorContent() {
imageDrawable =
ContextCompat.getDrawable(requireActivity(), androidx.leanback.R.drawable.lb_ic_sad_cloud)
ContextCompat.getDrawable(
requireActivity(),
androidx.leanback.R.drawable.lb_ic_sad_cloud
)
message = resources.getString(R.string.error_fragment_message)
setDefaultBackground(TRANSLUCENT)

Expand Down
57 changes: 20 additions & 37 deletions app/src/main/java/com/github/damontecres/stashapp/MainFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,12 @@ import com.apollographql.apollo3.api.Optional
import com.bumptech.glide.Glide
import com.bumptech.glide.request.target.SimpleTarget
import com.bumptech.glide.request.transition.Transition
import com.github.damontecres.stashapp.api.FindPerformersQuery
import com.github.damontecres.stashapp.api.FindScenesQuery
import com.github.damontecres.stashapp.api.FindStudiosQuery
import com.github.damontecres.stashapp.api.type.FindFilterType
import com.github.damontecres.stashapp.api.type.SortDirectionEnum
import com.github.damontecres.stashapp.presenters.PerformerPresenter
import com.github.damontecres.stashapp.presenters.ScenePresenter
import com.github.damontecres.stashapp.presenters.StudioPresenter
import kotlinx.coroutines.async
import kotlinx.coroutines.launch
import java.util.Timer
import java.util.TimerTask
Expand Down Expand Up @@ -119,7 +117,8 @@ class MainFragment : BrowseSupportFragment() {

mBackgroundManager = BackgroundManager.getInstance(activity)
mBackgroundManager.attach(requireActivity().window)
mDefaultBackground = ContextCompat.getDrawable(requireActivity(), R.drawable.default_background)
mDefaultBackground =
ContextCompat.getDrawable(requireActivity(), R.drawable.default_background)
mMetrics = DisplayMetrics()
requireActivity().windowManager.defaultDisplay.getMetrics(mMetrics)
}
Expand Down Expand Up @@ -229,66 +228,50 @@ class MainFragment : BrowseSupportFragment() {
viewLifecycleOwner.lifecycleScope.launch {
if (testStashConnection(requireContext(), false)) {
addRowsIfNeeded()
val apolloClient = createApolloClient(requireContext())
try {
val queryEngine = QueryEngine(requireContext(), showToasts = true)

viewLifecycleOwner.lifecycleScope.launch {
val results = apolloClient!!.query(
FindScenesQuery(
filter = Optional.present(
viewLifecycleOwner.lifecycleScope.async {
sceneAdapter.addAll(
0, queryEngine.findScenes(
FindFilterType(
sort = Optional.present("date"),
direction = Optional.present(SortDirectionEnum.DESC),
per_page = Optional.present(25)
)
)
)
).execute()
val scenes = results.data?.findScenes?.scenes?.map {
it.slimSceneData
}
if (scenes != null) {
sceneAdapter.addAll(0, scenes)
}
}

viewLifecycleOwner.lifecycleScope.launch {
val results = apolloClient!!.query(
FindPerformersQuery(
filter = Optional.present(
viewLifecycleOwner.lifecycleScope.async {
performerAdapter.addAll(
0, queryEngine.findPerformers(
FindFilterType(
sort = Optional.present("created_at"),
direction = Optional.present(SortDirectionEnum.DESC),
per_page = Optional.present(25)
)
)
)
).execute()
val performers = results.data?.findPerformers?.performers?.map {
it.performerData
}
if (performers != null) {
performerAdapter.addAll(0, performers)
}
}

viewLifecycleOwner.lifecycleScope.launch {
val results = apolloClient!!.query(
FindStudiosQuery(
filter = Optional.present(
viewLifecycleOwner.lifecycleScope.async {
studioAdapter.addAll(
0, queryEngine.findStudios(
FindFilterType(
sort = Optional.present("created_at"),
direction = Optional.present(SortDirectionEnum.DESC),
per_page = Optional.present(25)
)
)
)
).execute()
val studios = results.data?.findStudios?.studios?.map {
it.studioData
}
if (studios != null) {
studioAdapter.addAll(0, studios)
}
} catch (ex: QueryEngine.StashNotConfiguredException) {
Toast.makeText(
requireContext(),
"Stash not configured. Please enter the URL in settings!",
Toast.LENGTH_LONG
).show()
}
} else {
rowsAdapter.clear()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,10 @@ import androidx.fragment.app.Fragment
import androidx.leanback.widget.ArrayObjectAdapter
import androidx.leanback.widget.ListRowView
import androidx.lifecycle.lifecycleScope
import androidx.preference.PreferenceManager
import com.apollographql.apollo3.api.Optional
import com.bumptech.glide.Glide
import com.github.damontecres.stashapp.api.FindPerformersQuery
import com.github.damontecres.stashapp.data.Performer
import com.github.damontecres.stashapp.presenters.ScenePresenter
import kotlinx.coroutines.launch
import kotlinx.coroutines.async

class PerformerFragment : Fragment(R.layout.performer_view) {

Expand All @@ -37,32 +34,20 @@ class PerformerFragment : Fragment(R.layout.performer_view) {
mPerformerName.text = performer.name
mPerformerDisambiguation.text = performer.disambiguation

val apolloClient = createApolloClient(requireContext())
if (apolloClient != null) {
viewLifecycleOwner.lifecycleScope.launch {
val performers = apolloClient.query(
FindPerformersQuery(
performer_ids = Optional.present(
listOf(
performer.id.toInt()
)
)
)
).execute().data?.findPerformers?.performers;
if (performers != null && !performers.isEmpty()) {
val performer = performers.first().performerData
val apiKey = PreferenceManager.getDefaultSharedPreferences(requireContext())
.getString("stashApiKey", "")
if (performer.image_path != null) {
val url = createGlideUrl(performer.image_path, apiKey)
Glide.with(requireActivity())
.load(url)
.centerCrop()
.error(R.drawable.default_background)
.into(mPerformerImage)
}
val queryEngine = QueryEngine(requireContext(), true)
viewLifecycleOwner.lifecycleScope.async {
val performers =
queryEngine.findPerformers(performerIds = listOf(performer.id.toInt()))
if (performers.isNotEmpty()) {
val performerData = performers.first()
if (performerData.image_path != null) {
val url = createGlideUrl(performerData.image_path, requireContext())
Glide.with(requireActivity())
.load(url)
.centerCrop()
.error(R.drawable.default_background)
.into(mPerformerImage)
}

}
}
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package com.github.damontecres.stashapp
import android.os.Bundle
import android.widget.TextView
import androidx.fragment.app.FragmentActivity
import com.github.damontecres.stashapp.data.Performer
import com.github.damontecres.stashapp.suppliers.PerformerDataSupplier

class PerformerListActivity : FragmentActivity() {
Expand Down
Loading