diff --git a/app/build.gradle b/app/build.gradle index c922111a..67c7b7f0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,7 +37,6 @@ android { resValue "string", "app_version", "${defaultConfig.versionName}${versionNameSuffix ?: ""}" buildConfigField("String", "BUILDDATE", "new java.text.SimpleDateFormat(\"yyyy-MM-dd HH:mm\").format(new java.util.Date(" + System.currentTimeMillis() + "L));") - buildConfigField("String", "PRIVATE_BENENE_KEY", "\"${(System.getenv("PRIVATE_BENENE_KEY") ?: "")}\"") testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerFragment.kt index 179c2a9e..213140da 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerFragment.kt @@ -641,15 +641,15 @@ class PlayerFragment : Fragment() { data.isAnimeBased()//(data is AnimeLoadResponse && (data.type == TvType.Anime || data.type == TvType.ONA)) skip_op?.setVis(isAnime && !nextEp) - skip_episode.setVis((!isAnime || nextEp) && hasNext) + skip_episode?.setVis((!isAnime || nextEp) && hasNext) } else { val isAnime = data.isAnimeBased() if (isAnime) { skip_op?.setVis(true) - skip_episode.setVis(false) + skip_episode?.setVis(false) } else { - skip_episode.setVis(data.isEpisodeBased()) + skip_episode?.setVis(data.isEpisodeBased()) skip_op?.setVis(false) } } @@ -795,7 +795,7 @@ class PlayerFragment : Fragment() { //next_episode_btt.isClickable = isClick playback_speed_btt.isClickable = isClick skip_op?.isClickable = isClick - skip_episode.isClickable = isClick + skip_episode?.isClickable = isClick resize_player.isClickable = isClick exo_progress.isEnabled = isClick player_media_route_button.isEnabled = isClick @@ -1409,7 +1409,7 @@ class PlayerFragment : Fragment() { skipOP() } - skip_episode.setOnClickListener { + skip_episode?.setOnClickListener { if (hasNextEpisode()) { skipToNextEpisode() } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt index 4e21a4cb..c57ff895 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt @@ -962,12 +962,12 @@ class ResultFragment : Fragment() { lateFixDownloadButton(true) result_play_movie.setOnClickListener { - val card = currentEpisodes?.first() ?: return@setOnClickListener + val card = currentEpisodes?.firstOrNull() ?: return@setOnClickListener handleAction(EpisodeClickEvent(ACTION_CLICK_DEFAULT, card)) } result_play_movie.setOnLongClickListener { - val card = currentEpisodes?.first() ?: return@setOnLongClickListener true + val card = currentEpisodes?.firstOrNull() ?: return@setOnLongClickListener true handleAction(EpisodeClickEvent(ACTION_SHOW_OPTIONS, card)) return@setOnLongClickListener true } @@ -1004,7 +1004,7 @@ class ResultFragment : Fragment() { ) ) { downloadClickEvent -> if (downloadClickEvent.action == DOWNLOAD_ACTION_DOWNLOAD) { - currentEpisodes?.first()?.let { episode -> + currentEpisodes?.firstOrNull()?.let { episode -> handleAction( EpisodeClickEvent( ACTION_DOWNLOAD_EPISODE, diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/ScoreManager.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/ScoreManager.kt deleted file mode 100644 index e2ba8287..00000000 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/ScoreManager.kt +++ /dev/null @@ -1,43 +0,0 @@ -package com.lagradost.cloudstream3.ui.settings - -import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.module.kotlin.readValue -import com.lagradost.cloudstream3.BuildConfig -import com.lagradost.cloudstream3.mapper - -object ScoreManager { - private const val mainUrl = "http://dreamlo.com" - private const val publicCode = "612d3dcf8f40bb6e98bece15" - var privateCode: String? = BuildConfig.PRIVATE_BENENE_KEY // plz keep it a bit fair - - data class DreamloMain( - @JsonProperty("dreamlo") var dreamlo: Dreamlo - ) - - data class Dreamlo( - @JsonProperty("leaderboard") var leaderboard: Leaderboard - ) - - data class Leaderboard( - @JsonProperty("entry") var entry: List - ) - - data class DreamloEntry( - @JsonProperty("name") var name: String, - @JsonProperty("score") var score: String, - //@JsonProperty("seconds") var seconds: String, - //@JsonProperty("text") var text: String, - // @JsonProperty("date") var date: String - ) - - fun getScore(): List { - val response = khttp.get("$mainUrl/lb/$publicCode/json") - - return mapper.readValue(response.text).dreamlo.leaderboard.entry - } - - fun addScore(name: String, score: Int) { // plz dont cheat - if (score < 0 || score > 100000 || privateCode.isNullOrBlank()) return - khttp.get("$mainUrl/lb/$privateCode/add/$name/$score") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt index c6dc15bb..feea7c23 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt @@ -20,50 +20,6 @@ import kotlin.concurrent.thread class SettingsFragment : PreferenceFragmentCompat() { var count = 0 - private var scoreboard: List? = null - - private var usernameUUID: String? = null - - var ongoingJob: Job? = null - - private fun saveAfterTime() { - ongoingJob?.cancel() - ongoingJob = main { - delay(10000) // dont ddos the scoreboard - saveAndUpload() - } - } - - private fun saveAndUpload() { - if (ScoreManager.privateCode.isNullOrBlank()) return - try { - val settingsManager = PreferenceManager.getDefaultSharedPreferences(context) - val uuid = usernameUUID - if (uuid != null) { - settingsManager.edit() - .putString(getString(R.string.benene_count_uuid), uuid) - .putInt(getString(R.string.benene_count), count) - .apply() - thread { - normalSafeApiCall { - ScoreManager.addScore(uuid, count) - } - } - } - } catch (e: Exception) { - e.printStackTrace() - } - } - - override fun onPause() { - saveAndUpload() - super.onPause() - } - - override fun onDestroy() { - saveAndUpload() - super.onDestroy() - } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { hideKeyboard() @@ -76,15 +32,7 @@ class SettingsFragment : PreferenceFragmentCompat() { val settingsManager = PreferenceManager.getDefaultSharedPreferences(context) count = settingsManager.getInt(getString(R.string.benene_count), 0) - usernameUUID = - settingsManager.getString(getString(R.string.benene_count_uuid), UUID.randomUUID().toString()) - if (count > 20) { - if (!ScoreManager.privateCode.isNullOrBlank()) { - thread { - scoreboard = normalSafeApiCall { ScoreManager.getScore() } - } - } - } + benenePref.summary = if (count <= 0) getString(R.string.benene_count_text_none) else getString(R.string.benene_count_text).format( count @@ -93,18 +41,7 @@ class SettingsFragment : PreferenceFragmentCompat() { try { count++ settingsManager.edit().putInt(getString(R.string.benene_count), count).apply() - var add = "" - val localScoreBoard = scoreboard - if (localScoreBoard != null) { - for ((index, score) in localScoreBoard.withIndex()) { - if (count > (score.score.toIntOrNull() ?: 0)) { - add = " (${index + 1}/${localScoreBoard.size})" - break - } - } - } - it.summary = getString(R.string.benene_count_text).format(count) + add - saveAfterTime() + it.summary = getString(R.string.benene_count_text).format(count) } catch (e: Exception) { e.printStackTrace() } diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/InAppUpdater.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/InAppUpdater.kt index 12517936..60ba7e1f 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/InAppUpdater.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/InAppUpdater.kt @@ -21,6 +21,7 @@ import com.fasterxml.jackson.module.kotlin.readValue import com.lagradost.cloudstream3.BuildConfig import com.lagradost.cloudstream3.MainActivity.Companion.showToast import com.lagradost.cloudstream3.R +import com.lagradost.cloudstream3.mvvm.normalSafeApiCall import java.io.File import kotlin.concurrent.thread @@ -235,7 +236,8 @@ class InAppUpdater { setPositiveButton("Update") { _, _ -> showToast(context, "Download started", Toast.LENGTH_LONG) thread { - val downloadStatus = context.downloadUpdate(update.updateURL) + val downloadStatus = + normalSafeApiCall { context.downloadUpdate(update.updateURL) } ?: false if (!downloadStatus) { runOnUiThread { showToast( diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/VideoDownloadManager.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/VideoDownloadManager.kt index 6184ad33..9805d981 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/VideoDownloadManager.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/VideoDownloadManager.kt @@ -141,6 +141,7 @@ object VideoDownloadManager { private const val SUCCESS_STOPPED = 2 private const val ERROR_DELETING_FILE = 3 // will not download the next one, but is still classified as an error private const val ERROR_CREATE_FILE = -2 + private const val ERROR_UNKNOWN = -10 private const val ERROR_OPEN_FILE = -3 private const val ERROR_TOO_SMALL_CONNECTION = -4 private const val ERROR_WRONG_CONTENT = -5 @@ -756,7 +757,7 @@ object VideoDownloadManager { createNotificationCallback: (CreateNotificationMetadata) -> Unit ): Int { if (link.url.startsWith("magnet") || link.url.endsWith(".torrent")) { - return downloadTorrent(context, link.url, name, folder, extension, parentId, createNotificationCallback) + return normalSafeApiCall { downloadTorrent(context, link.url, name, folder, extension, parentId, createNotificationCallback) } ?: ERROR_UNKNOWN } val relativePath = (Environment.DIRECTORY_DOWNLOADS + '/' + folder + '/').replace('/', File.separatorChar) @@ -880,10 +881,15 @@ object VideoDownloadManager { // ON CONNECTION connection.connect() - val contentLength = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // fuck android - connection.contentLengthLong - } else { - connection.getHeaderField("content-length").toLongOrNull() ?: connection.contentLength.toLong() + val contentLength = try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // fuck android + connection.contentLengthLong ?: 0L + } else { + connection.getHeaderField("content-length").toLongOrNull() ?: connection.contentLength?.toLong() ?: 0L + } + } catch (e: Exception) { + e.printStackTrace() + 0L } val bytesTotal = contentLength + resumeLength @@ -1050,17 +1056,19 @@ object VideoDownloadManager { ): Int { val name = sanitizeFilename(ep.name ?: "Episode ${ep.episode}") - return downloadThing(context, link, name, folder, "mp4", tryResume, ep.id) { meta -> - createNotification( - context, - source, - link.name, - ep, - meta.type, - meta.bytesDownloaded, - meta.bytesTotal - ) - } + return normalSafeApiCall { + downloadThing(context, link, name, folder, "mp4", tryResume, ep.id) { meta -> + createNotification( + context, + source, + link.name, + ep, + meta.type, + meta.bytesDownloaded, + meta.bytesTotal + ) + } + } ?: ERROR_UNKNOWN } private fun downloadCheck(context: Context) { diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml index 3b659888..5edf3ea6 100644 --- a/app/src/main/res/layout/fragment_search.xml +++ b/app/src/main/res/layout/fragment_search.xml @@ -21,7 +21,6 @@ android:layout_marginEnd="30dp" android:layout_height="30dp"> prerelease_update manual_check_update benene_count - benene_count_uuid %d Benenes given to devs No Benenes given