From 4a193d5d27449e232387e929d2645104aa1e8dc8 Mon Sep 17 00:00:00 2001 From: reduplicated <110570621+reduplicated@users.noreply.github.com> Date: Wed, 2 Nov 2022 21:41:39 +0100 Subject: [PATCH 01/13] small fix --- .../cloudstream3/extractors/BullStream.kt | 2 +- .../extractors/YoutubeExtractor.kt | 1 - .../cloudstream3/ui/home/HomeFragment.kt | 5 ++ .../ui/player/FullScreenPlayer.kt | 8 +-- .../ui/result/ResultTrailerPlayer.kt | 49 ++++++++++++++++++- app/src/main/res/layout/fragment_result.xml | 25 +++++----- app/src/main/res/layout/fragment_trailer.xml | 2 +- .../main/res/layout/trailer_custom_layout.xml | 2 +- app/src/main/res/values/styles.xml | 1 + 9 files changed, 71 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/BullStream.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/BullStream.kt index d4f87f4c..e5368bc3 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/BullStream.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/BullStream.kt @@ -18,7 +18,7 @@ class BullStream : ExtractorApi() { ?: return null val m3u8 = "$mainUrl/m3u8/${data[1]}/${data[2]}/master.txt?s=1&cache=${data[4]}" - println("shiv : $m3u8") + //println("shiv : $m3u8") return M3u8Helper.generateM3u8( name, m3u8, diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/YoutubeExtractor.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/YoutubeExtractor.kt index 572d93a3..23704e90 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/YoutubeExtractor.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/YoutubeExtractor.kt @@ -46,7 +46,6 @@ open class YoutubeExtractor : ExtractorApi() { subtitleCallback: (SubtitleFile) -> Unit, callback: (ExtractorLink) -> Unit ) { - println("TRYING TO ExTRACT: $url") if (ytVideos[url].isNullOrEmpty()) { val link = YoutubeStreamLinkHandlerFactory.getInstance().fromUrl( diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt index 4b9dd5be..a73fc873 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt @@ -585,6 +585,11 @@ class HomeFragment : Fragment() { setPageTransformer(HomeScrollTransformer()) val callback: OnPageChangeCallback = object : OnPageChangeCallback() { override fun onPageSelected(position: Int) { + + // home_search?.isIconified = true + //home_search?.isVisible = true + //home_search?.clearFocus() + (home_preview_viewpager?.adapter as? HomeScrollAdapter)?.apply { if (position >= itemCount - 1 && hasMoreItems) { hasMoreItems = false // dont make two requests diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/FullScreenPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/FullScreenPlayer.kt index 1ddd752f..52125c68 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/FullScreenPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/FullScreenPlayer.kt @@ -587,7 +587,7 @@ open class FullScreenPlayer : AbstractPlayerFragment() { updateLockUI() } - private fun updateUIVisibility() { + fun updateUIVisibility() { val isGone = isLocked || !isShowing var togglePlayerTitleGone = isGone context?.let { @@ -1306,12 +1306,6 @@ open class FullScreenPlayer : AbstractPlayerFragment() { showTracksDialogue() } - player_intro_play?.setOnClickListener { - player_intro_play?.isGone = true - player.handleEvent(CSPlayerEvent.Play) - updateUIVisibility() - } - // it is !not! a bug that you cant touch the right side, it does not register inputs on navbar or status bar player_holder?.setOnTouchListener { callView, event -> return@setOnTouchListener handleMotionEvent(callView, event) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultTrailerPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultTrailerPlayer.kt index 8a6e5b37..bf47209a 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultTrailerPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultTrailerPlayer.kt @@ -1,5 +1,6 @@ package com.lagradost.cloudstream3.ui.result +import android.animation.ValueAnimator import android.content.Context import android.content.res.Configuration import android.graphics.Rect @@ -7,9 +8,11 @@ import android.os.Bundle import android.view.View import android.view.ViewGroup import android.widget.FrameLayout +import androidx.core.view.isGone import androidx.core.view.isVisible import com.discord.panels.PanelsChildGestureRegionObserver import com.lagradost.cloudstream3.R +import com.lagradost.cloudstream3.ui.player.CSPlayerEvent import com.lagradost.cloudstream3.ui.player.SubtitleData import com.lagradost.cloudstream3.utils.IOnBackPressed import kotlinx.android.synthetic.main.fragment_result.* @@ -19,6 +22,7 @@ import kotlinx.android.synthetic.main.fragment_result_tv.* import kotlinx.android.synthetic.main.fragment_trailer.* import kotlinx.android.synthetic.main.trailer_custom_layout.* + open class ResultTrailerPlayer : com.lagradost.cloudstream3.ui.player.FullScreenPlayer(), PanelsChildGestureRegionObserver.GestureRegionsListener, IOnBackPressed { @@ -60,14 +64,43 @@ open class ResultTrailerPlayer : com.lagradost.cloudstream3.ui.player.FullScreen result_smallscreen_holder?.isVisible = !isFullScreenPlayer result_fullscreen_holder?.isVisible = isFullScreenPlayer + val to = sw * h / w + player_background?.apply { isVisible = true layoutParams = FrameLayout.LayoutParams( FrameLayout.LayoutParams.MATCH_PARENT, - if (isFullScreenPlayer) FrameLayout.LayoutParams.MATCH_PARENT else sw * h / w + if (isFullScreenPlayer) FrameLayout.LayoutParams.MATCH_PARENT else to ) } + + player_intro_play?.apply { + layoutParams = + FrameLayout.LayoutParams( + FrameLayout.LayoutParams.MATCH_PARENT, + result_top_holder?.measuredHeight ?: FrameLayout.LayoutParams.MATCH_PARENT + ) + } + + if (player_intro_play?.isGone == true) { + result_top_holder?.apply { + + val anim = ValueAnimator.ofInt( + measuredHeight, + if (isFullScreenPlayer) ViewGroup.LayoutParams.MATCH_PARENT else to + ) + anim.addUpdateListener { valueAnimator -> + val `val` = valueAnimator.animatedValue as Int + val layoutParams: ViewGroup.LayoutParams = + layoutParams + layoutParams.height = `val` + setLayoutParams(layoutParams) + } + anim.duration = 200 + anim.start() + } + } } } @@ -79,7 +112,12 @@ open class ResultTrailerPlayer : com.lagradost.cloudstream3.ui.player.FullScreen override fun showMirrorsDialogue() {} override fun showTracksDialogue() {} - override fun openOnlineSubPicker(context: Context, imdbId: Long?, dismissCallback: () -> Unit) {} + override fun openOnlineSubPicker( + context: Context, + imdbId: Long?, + dismissCallback: () -> Unit + ) { + } override fun subtitlesChanged() {} @@ -124,6 +162,13 @@ open class ResultTrailerPlayer : com.lagradost.cloudstream3.ui.player.FullScreen } updateFullscreen(isFullScreenPlayer) uiReset() + + player_intro_play?.setOnClickListener { + player_intro_play?.isGone = true + player.handleEvent(CSPlayerEvent.Play) + updateUIVisibility() + fixPlayerSize() + } } override fun onBackPressed(): Boolean { diff --git a/app/src/main/res/layout/fragment_result.xml b/app/src/main/res/layout/fragment_result.xml index ed2ec6bd..f88fc173 100644 --- a/app/src/main/res/layout/fragment_result.xml +++ b/app/src/main/res/layout/fragment_result.xml @@ -267,10 +267,10 @@ --> - + - - + + + @@ -330,6 +332,7 @@ android:contentDescription="@string/result_poster_img_des" android:foreground="@drawable/outline_drawable" android:scaleType="centerCrop" + android:layout_gravity="bottom" tools:src="@drawable/example_poster" /> diff --git a/app/src/main/res/layout/fragment_trailer.xml b/app/src/main/res/layout/fragment_trailer.xml index fd348760..ff477118 100644 --- a/app/src/main/res/layout/fragment_trailer.xml +++ b/app/src/main/res/layout/fragment_trailer.xml @@ -3,7 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="0dp" + android:layout_height="match_parent" android:visibility="visible" android:orientation="horizontal" android:id="@+id/player_background" diff --git a/app/src/main/res/layout/trailer_custom_layout.xml b/app/src/main/res/layout/trailer_custom_layout.xml index 854855ef..0dd19a5b 100644 --- a/app/src/main/res/layout/trailer_custom_layout.xml +++ b/app/src/main/res/layout/trailer_custom_layout.xml @@ -62,7 +62,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="start|bottom" - android:padding="10dp" + android:padding="15dp" android:text="@string/trailer" android:textColor="@android:color/white" android:textSize="20sp" diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 13089cc2..9c2f62fc 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -83,6 +83,7 @@ @color/chip_color_text @color/chip_color_text @font/google_sans + @color/chip_color_text @font/google_sans From c09b6881e5ac00fc7b2b9a4b096cd96e6076bde6 Mon Sep 17 00:00:00 2001 From: reduplicated <110570621+reduplicated@users.noreply.github.com> Date: Wed, 2 Nov 2022 22:56:03 +0100 Subject: [PATCH 02/13] bump --- app/build.gradle.kts | 4 ++-- .../lagradost/cloudstream3/ui/home/HomeFragment.kt | 12 ++++++++++-- app/src/main/res/layout/fragment_home.xml | 6 +++++- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 99eec423..a2c31d0b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -47,8 +47,8 @@ android { minSdk = 21 targetSdk = 30 - versionCode = 52 - versionName = "3.1.6" + versionCode = 53 + versionName = "3.2.0" resValue("string", "app_version", "${defaultConfig.versionName}${versionNameSuffix ?: ""}") diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt index a73fc873..ac6daa53 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt @@ -74,8 +74,10 @@ import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showOptionSelectSt import com.lagradost.cloudstream3.utils.SubtitleHelper.getFlagFromIso import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar +import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbarView import com.lagradost.cloudstream3.utils.UIHelper.getResourceColor import com.lagradost.cloudstream3.utils.UIHelper.getSpanCount +import com.lagradost.cloudstream3.utils.UIHelper.getStatusBarHeight import com.lagradost.cloudstream3.utils.UIHelper.popupMenuNoIconsAndNoStringRes import com.lagradost.cloudstream3.utils.UIHelper.setImage import com.lagradost.cloudstream3.utils.UIHelper.setImageBlur @@ -548,7 +550,13 @@ class HomeFragment : Fragment() { observe(homeViewModel.preview) { preview -> // Always reset the padding, otherwise the will move lower and lower - home_watch_holder?.setPadding(0, 0, 0, 0) + // home_fix_padding?.setPadding(0, 0, 0, 0) + home_fix_padding?.let { v -> + val params = v.layoutParams + params.height = 0 + v.layoutParams = params + } + when (preview) { is Resource.Success -> { home_preview?.isVisible = true @@ -569,7 +577,7 @@ class HomeFragment : Fragment() { false ) home_preview?.isVisible = false - context?.fixPaddingStatusbar(home_watch_holder) + context?.fixPaddingStatusbarView(home_fix_padding) } } } diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 4eb7b9ee..e6270a77 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -405,7 +405,11 @@ - + + + android:id="@+id/player_view" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@android:color/black" + app:auto_show="true" + app:backgroundTint="@android:color/black" + app:controller_layout_id="@layout/player_custom_layout" + app:hide_on_touch="false" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:show_timeout="0" /> + android:id="@+id/player_loading_overlay" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@android:color/black" + android:backgroundTint="@android:color/black" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + android:text="@string/skip_loading" + android:textAllCaps="false" + android:textColor="?attr/textColor" + android:visibility="gone" + app:cornerRadius="4dp" + app:icon="@drawable/ic_baseline_skip_next_24" + app:iconTint="?attr/textColor" + app:rippleColor="?attr/colorPrimary" + tools:visibility="visible" /> + android:id="@+id/main_load" + android:layout_width="50dp" + android:layout_height="50dp" + android:layout_gravity="center" /> + android:id="@+id/video_go_back_holder_holder" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_margin="5dp" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + android:layout_width="30dp" + android:layout_height="30dp" + android:layout_gravity="center" + android:contentDescription="@string/go_back_img_des" + android:src="@drawable/ic_baseline_arrow_back_24" + app:tint="@android:color/white" /> + android:id="@+id/player_loading_go_back" + android:layout_width="70dp" + android:layout_height="70dp" + android:layout_gravity="center" + android:background="@drawable/video_tap_button_always_white" + android:clickable="true" + android:contentDescription="@string/go_back_img_des" + android:focusable="true" /> + + + android:layout_height="wrap_content" + android:layout_marginTop="15dp" + android:gravity="start" + android:textColor="@color/white" + android:textStyle="bold" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:text="78% at 18kb/s" /> - - + android:id="@+id/video_torrent_seeders" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="0dp" + android:gravity="start" + android:textColor="@color/white" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintTop_toBottomOf="@+id/player_video_title" + tools:text="17 seeders" /> \ No newline at end of file diff --git a/app/src/main/res/layout/player_custom_layout.xml b/app/src/main/res/layout/player_custom_layout.xml index 9bbded4e..2cdcbf22 100644 --- a/app/src/main/res/layout/player_custom_layout.xml +++ b/app/src/main/res/layout/player_custom_layout.xml @@ -318,6 +318,25 @@ + + #66000000 #C0121212 + #4D121212 #121212 #66B5B5B5 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5665ea5c..144d2477 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -638,4 +638,13 @@ Browser App not found All Languages + + Skip %s + Opening + Ending + Recap + Mixed ending + Mixed opening + Credits + Intro From 9e67e856a0d12d326bcab23edc5925c881f9a496 Mon Sep 17 00:00:00 2001 From: reduplicated <110570621+reduplicated@users.noreply.github.com> Date: Sat, 5 Nov 2022 00:40:31 +0100 Subject: [PATCH 07/13] small fix for multi request --- .../com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt index e1f1d99d..f4d2cd2f 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt @@ -166,7 +166,8 @@ class GeneratorPlayer : FullScreenPlayer() { isActive = true setPlayerDimen(null) setTitle() - hasRequestedStamps = false + if (!sameEpisode) + hasRequestedStamps = false loadExtractorJob(link.first) // load player @@ -186,7 +187,8 @@ class GeneratorPlayer : FullScreenPlayer() { ), ) } - player.addTimeStamps(listOf()) // clear stamps + if (!sameEpisode) + player.addTimeStamps(listOf()) // clear stamps } private fun sortLinks(useQualitySettings: Boolean = true): List> { From 60a2f7c1c51456d025f92c191b51cf38e411ae21 Mon Sep 17 00:00:00 2001 From: reduplicated <110570621+reduplicated@users.noreply.github.com> Date: Sat, 5 Nov 2022 01:27:35 +0100 Subject: [PATCH 08/13] clear history --- .../cloudstream3/ui/search/SearchFragment.kt | 39 ++++++++++++++++++- app/src/main/res/drawable/delete_all.xml | 9 +++++ app/src/main/res/layout/fragment_search.xml | 19 +++++++++ app/src/main/res/values/strings.xml | 3 ++ 4 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/drawable/delete_all.xml diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt index bcb36f7e..e6e290c1 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt @@ -1,5 +1,6 @@ package com.lagradost.cloudstream3.ui.search +import android.content.DialogInterface import android.content.res.Configuration import android.os.Bundle import android.view.LayoutInflater @@ -10,6 +11,7 @@ import android.widget.AbsListView import android.widget.ArrayAdapter import android.widget.ImageView import android.widget.ListView +import androidx.appcompat.app.AlertDialog import androidx.appcompat.widget.SearchView import androidx.core.view.isVisible import androidx.fragment.app.Fragment @@ -28,6 +30,7 @@ import com.lagradost.cloudstream3.APIHolder.getApiProviderLangSettings import com.lagradost.cloudstream3.APIHolder.getApiSettings import com.lagradost.cloudstream3.AcraApplication.Companion.getKey import com.lagradost.cloudstream3.AcraApplication.Companion.removeKey +import com.lagradost.cloudstream3.AcraApplication.Companion.removeKeys import com.lagradost.cloudstream3.AcraApplication.Companion.setKey import com.lagradost.cloudstream3.MainActivity.Companion.afterPluginsLoadedEvent import com.lagradost.cloudstream3.mvvm.Resource @@ -343,7 +346,7 @@ class SearchFragment : Fragment() { searchViewModel.updateHistory() } - search_history_recycler?.isVisible = showHistory + search_history_holder?.isVisible = showHistory search_master_recycler?.isVisible = !showHistory && isAdvancedSearch search_autofit_results?.isVisible = !showHistory && !isAdvancedSearch @@ -352,7 +355,41 @@ class SearchFragment : Fragment() { } }) + search_clear_call_history?.setOnClickListener { + activity?.let { ctx -> + val builder: AlertDialog.Builder = AlertDialog.Builder(ctx) + val dialogClickListener = + DialogInterface.OnClickListener { _, which -> + when (which) { + DialogInterface.BUTTON_POSITIVE -> { + removeKeys(SEARCH_HISTORY_KEY) + searchViewModel.updateHistory() + } + DialogInterface.BUTTON_NEGATIVE -> { + } + } + } + + try { + builder.setTitle(R.string.clear_history).setMessage( + ctx.getString(R.string.delete_message).format( + ctx.getString(R.string.history) + ) + ) + .setPositiveButton(R.string.sort_clear, dialogClickListener) + .setNegativeButton(R.string.cancel, dialogClickListener) + .show() + } catch (e: Exception) { + logError(e) + // ye you somehow fucked up formatting did you? + } + } + + + } + observe(searchViewModel.currentHistory) { list -> + search_clear_call_history?.isVisible = list.isNotEmpty() (search_history_recycler.adapter as? SearchHistoryAdaptor?)?.updateList(list) } diff --git a/app/src/main/res/drawable/delete_all.xml b/app/src/main/res/drawable/delete_all.xml new file mode 100644 index 00000000..a5e8775c --- /dev/null +++ b/app/src/main/res/drawable/delete_all.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml index 083cd64e..6df5837f 100644 --- a/app/src/main/res/layout/fragment_search.xml +++ b/app/src/main/res/layout/fragment_search.xml @@ -112,6 +112,11 @@ android:nextFocusLeft="@id/nav_rail_view" android:visibility="gone" tools:listitem="@layout/homepage_parent" /> + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 144d2477..e3ef9f6b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -647,4 +647,7 @@ Mixed opening Credits Intro + + Clear history + History From 60bcbf0060750f661f5ae53f197b29b71eae365c Mon Sep 17 00:00:00 2001 From: Blatzar <46196380+Blatzar@users.noreply.github.com> Date: Sat, 5 Nov 2022 19:54:04 +0100 Subject: [PATCH 09/13] A lil cache fixing & search fixes --- app/build.gradle.kts | 6 +++--- .../main/java/com/lagradost/cloudstream3/CommonActivity.kt | 2 ++ .../com/lagradost/cloudstream3/ui/search/SearchFragment.kt | 6 +++--- .../ui/settings/extensions/ExtensionsFragment.kt | 4 +++- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 4a1fcada..f72eb321 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -47,8 +47,8 @@ android { minSdk = 21 targetSdk = 30 - versionCode = 54 - versionName = "3.2.2" + versionCode = 55 + versionName = "3.2.3" resValue("string", "app_version", "${defaultConfig.versionName}${versionNameSuffix ?: ""}") @@ -190,7 +190,7 @@ dependencies { // Networking // implementation("com.squareup.okhttp3:okhttp:4.9.2") // implementation("com.squareup.okhttp3:okhttp-dnsoverhttps:4.9.1") - implementation("com.github.Blatzar:NiceHttp:0.3.4") + implementation("com.github.Blatzar:NiceHttp:0.3.5") // Util to skip the URI file fuckery 🙏 implementation("com.github.tachiyomiorg:unifile:17bec43") diff --git a/app/src/main/java/com/lagradost/cloudstream3/CommonActivity.kt b/app/src/main/java/com/lagradost/cloudstream3/CommonActivity.kt index af04a1a2..342dc6f7 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/CommonActivity.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/CommonActivity.kt @@ -61,6 +61,7 @@ object CommonActivity { } } + @MainThread fun showToast(act: Activity?, @StringRes message: Int, duration: Int) { if (act == null) return showToast(act, act.getString(message), duration) @@ -69,6 +70,7 @@ object CommonActivity { const val TAG = "COMPACT" /** duration is Toast.LENGTH_SHORT if null*/ + @MainThread fun showToast(act: Activity?, message: String?, duration: Int? = null) { if (act == null || message == null) { Log.w(TAG, "invalid showToast act = $act message = $message") diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt index e6e290c1..4da88af7 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt @@ -131,9 +131,9 @@ class SearchFragment : Fragment() { context?.let { ctx -> val default = enumValues().sorted().filter { it != TvType.NSFW } .map { it.ordinal.toString() }.toSet() - val preferredTypes = PreferenceManager.getDefaultSharedPreferences(ctx) - .getStringSet(this.getString(R.string.prefer_media_type_key), default) - ?.mapNotNull { it.toIntOrNull() ?: return@mapNotNull null } ?: default + val preferredTypes = (PreferenceManager.getDefaultSharedPreferences(ctx) + .getStringSet(this.getString(R.string.prefer_media_type_key), default)?.ifEmpty { default } ?: default) + .mapNotNull { it.toIntOrNull() ?: return@mapNotNull null } val settings = ctx.getApiSettings() diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt index 49f40879..fbf10499 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt @@ -200,7 +200,9 @@ class ExtensionsFragment : Fragment() { val url = dialog.repo_url_input?.text?.toString() ?.let { it1 -> RepositoryManager.parseRepoUrl(it1) } if (url.isNullOrBlank()) { - showToast(activity, R.string.error_invalid_data, Toast.LENGTH_SHORT) + main { + showToast(activity, R.string.error_invalid_data, Toast.LENGTH_SHORT) + } } else { val fixedName = if (!name.isNullOrBlank()) name else RepositoryManager.parseRepository(url)?.name ?: "No name" From 4fb65e724290a5a130f10c665e45acf0c8f20a99 Mon Sep 17 00:00:00 2001 From: Sdarfeesh <50188628+Sdarfeesh@users.noreply.github.com> Date: Sun, 6 Nov 2022 04:55:41 +0800 Subject: [PATCH 10/13] Update Simplified Chinese Translation (#198) --- app/src/main/res/values-zh/strings.xml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 8f436fe9..a9cc91b7 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -577,4 +577,17 @@ 投屏 浏览器 未找到应用 + 所有语言 + + 跳过 %s + 片头 + 片尾 + 前情回顾 + 混合片尾 + 混合片头 + 致谢名单 + 介绍 + + 清除历史记录 + 历史记录 From 8fa00f4ca902683430d1f12f128edb645a09e78d Mon Sep 17 00:00:00 2001 From: reduplicated <110570621+reduplicated@users.noreply.github.com> Date: Sat, 5 Nov 2022 22:15:34 +0100 Subject: [PATCH 11/13] added setting for skip op and changed key for player seek amount --- .../cloudstream3/ui/player/GeneratorPlayer.kt | 11 +- app/src/main/res/values/strings.xml | 5 +- app/src/main/res/xml/settings_player.xml | 190 +++++++++--------- 3 files changed, 112 insertions(+), 94 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt index f4d2cd2f..95a9393f 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt @@ -187,6 +187,7 @@ class GeneratorPlayer : FullScreenPlayer() { ), ) } + if (!sameEpisode) player.addTimeStamps(listOf()) // clear stamps } @@ -874,7 +875,15 @@ class GeneratorPlayer : FullScreenPlayer() { if (duration <= 0L) return // idk how you achieved this, but div by zero crash if (!hasRequestedStamps) { hasRequestedStamps = true - viewModel.loadStamps(duration) + val fetchStamps = context?.let { ctx -> + val settingsManager = PreferenceManager.getDefaultSharedPreferences(ctx) + settingsManager.getBoolean( + ctx.getString(R.string.enable_skip_op_from_database), + true + ) + } ?: true + if (fetchStamps) + viewModel.loadStamps(duration) } viewModel.getId()?.let { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e3ef9f6b..e2ebf0ab 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -28,7 +28,7 @@ pip_enabled_key double_tap_enabled_key double_tap_pause_enabled_key - double_tap_seek_time_key + double_tap_seek_time_key2 swipe_vertical_enabled_key autoplay_next_key display_sub_key @@ -57,6 +57,7 @@ filter_sub_lang_key pref_filter_search_quality_key enable_nsfw_on_providers_key + enable_skip_op_from_database %d %s | %s @@ -650,4 +651,6 @@ Clear history History + Show skip popups for opening/ending + diff --git a/app/src/main/res/xml/settings_player.xml b/app/src/main/res/xml/settings_player.xml index 6946a5c9..0be6313f 100644 --- a/app/src/main/res/xml/settings_player.xml +++ b/app/src/main/res/xml/settings_player.xml @@ -1,126 +1,132 @@ + xmlns:app="http://schemas.android.com/apk/res-auto"> + android:icon="@drawable/ic_outline_subtitles_24" + android:key="@string/subtitle_settings_key" + android:title="@string/player_subtitles_settings" + app:summary="@string/player_subtitles_settings_des" /> + android:icon="@drawable/ic_outline_subtitles_24" + android:key="@string/subtitle_settings_chromecast_key" + android:title="@string/chromecast_subtitles_settings" + app:summary="@string/chromecast_subtitles_settings_des" /> + android:icon="@drawable/ic_baseline_hd_24" + android:key="@string/quality_pref_key" + android:title="@string/watch_quality_pref" /> + android:icon="@drawable/netflix_play" + android:key="@string/player_pref_key" + android:title="@string/player_pref" /> + android:icon="@drawable/ic_baseline_text_format_24" + android:key="@string/prefer_limit_title_key" + android:title="@string/limit_title" /> + android:icon="@drawable/ic_baseline_text_format_24" + android:key="@string/prefer_limit_title_rez_key" + android:title="@string/limit_title_rez" /> + android:icon="@drawable/ic_baseline_picture_in_picture_alt_24" + android:summary="@string/picture_in_picture_des" + android:title="@string/picture_in_picture" + app:defaultValue="true" + app:key="@string/pip_enabled_key" /> + android:icon="@drawable/ic_baseline_aspect_ratio_24" + android:summary="@string/player_size_settings_des" + android:title="@string/player_size_settings" + app:defaultValue="true" + app:key="@string/player_resize_enabled_key" /> + android:icon="@drawable/ic_baseline_speed_24" + android:summary="@string/eigengraumode_settings_des" + android:title="@string/eigengraumode_settings" + app:defaultValue="false" + app:key="@string/playback_speed_enabled_key" /> + android:icon="@drawable/ic_baseline_ondemand_video_24" + android:summary="@string/swipe_to_seek_settings_des" + android:title="@string/swipe_to_seek_settings" + app:defaultValue="true" + app:key="@string/swipe_enabled_key" /> - + android:icon="@drawable/ic_baseline_ondemand_video_24" + android:summary="@string/swipe_to_change_settings_des" + android:title="@string/swipe_to_change_settings" + app:defaultValue="true" + app:key="@string/swipe_vertical_enabled_key" /> + android:icon="@drawable/ic_baseline_skip_next_24" + android:summary="@string/autoplay_next_settings_des" + android:title="@string/autoplay_next_settings" + app:defaultValue="true" + app:key="@string/autoplay_next_key" /> + android:icon="@drawable/ic_baseline_skip_next_24" + android:title="@string/video_skip_op" + app:defaultValue="true" + android:summary="@string/enable_skip_op_from_database_des" + app:key="@string/enable_skip_op_from_database" /> + + + android:defaultValue="10" + android:max="60" + android:title="@string/double_tap_to_seek_amount_settings" + app:adjustable="true" + app:defaultValue="10" + app:icon="@drawable/go_forward_30" + app:key="@string/double_tap_seek_time_key" + app:min="5" + app:seekBarIncrement="5" + app:showSeekBarValue="true" /> + android:icon="@drawable/baseline_sync_24" + android:summary="@string/episode_sync_settings_des" + android:title="@string/episode_sync_settings" + app:defaultValue="true" + app:key="@string/episode_sync_enabled_key" /> + android:icon="@drawable/ic_baseline_storage_24" + android:key="@string/video_buffer_disk_key" + android:summary="@string/video_disk_description" + android:title="@string/video_buffer_disk_settings" /> + android:icon="@drawable/ic_baseline_storage_24" + android:key="@string/video_buffer_size_key" + android:summary="@string/video_ram_description" + android:title="@string/video_buffer_size_settings" /> + android:icon="@drawable/ic_baseline_storage_24" + android:key="@string/video_buffer_length_key" + android:summary="@string/video_ram_description" + android:title="@string/video_buffer_length_settings" /> + android:icon="@drawable/ic_baseline_delete_outline_24" + android:key="@string/video_buffer_clear_key" + android:title="@string/video_buffer_clear_settings" /> \ No newline at end of file From aef6f93efe212837e0009035c082c6ea3f2bcb08 Mon Sep 17 00:00:00 2001 From: darkdemon Date: Sun, 6 Nov 2022 16:43:45 +0530 Subject: [PATCH 12/13] - Open all extractor classes - Add StreamTape clones[Streamtape.net, ShaveTape.cash] - optimize imports for AstreamHub, GMplayer --- .../lagradost/cloudstream3/extractors/AStreamHub.kt | 7 ++++--- .../lagradost/cloudstream3/extractors/Acefile.kt | 2 +- .../lagradost/cloudstream3/extractors/AsianLoad.kt | 2 +- .../lagradost/cloudstream3/extractors/Blogger.kt | 2 +- .../lagradost/cloudstream3/extractors/BullStream.kt | 2 +- .../lagradost/cloudstream3/extractors/Embedgram.kt | 2 +- .../lagradost/cloudstream3/extractors/Fastream.kt | 2 +- .../lagradost/cloudstream3/extractors/Filesim.kt | 2 +- .../lagradost/cloudstream3/extractors/GMPlayer.kt | 3 +-- .../lagradost/cloudstream3/extractors/Linkbox.kt | 2 +- .../com/lagradost/cloudstream3/extractors/Mcloud.kt | 7 ------- .../lagradost/cloudstream3/extractors/Mp4Upload.kt | 2 +- .../cloudstream3/extractors/MultiQuality.kt | 2 +- .../com/lagradost/cloudstream3/extractors/Mvidoo.kt | 2 +- .../lagradost/cloudstream3/extractors/Pelisplus.kt | 2 +- .../lagradost/cloudstream3/extractors/PlayLtXyz.kt | 2 +- .../lagradost/cloudstream3/extractors/Solidfiles.kt | 2 +- .../lagradost/cloudstream3/extractors/StreamTape.kt | 13 +++++++++++-- .../lagradost/cloudstream3/extractors/Streamhub.kt | 2 +- .../lagradost/cloudstream3/extractors/Streamplay.kt | 2 +- .../lagradost/cloudstream3/extractors/Supervideo.kt | 11 ++++++----- .../cloudstream3/extractors/UpstreamExtractor.kt | 2 +- .../lagradost/cloudstream3/extractors/VideoVard.kt | 2 +- .../lagradost/cloudstream3/extractors/WcoStream.kt | 6 ++++++ .../lagradost/cloudstream3/extractors/YourUpload.kt | 2 +- .../lagradost/cloudstream3/extractors/Zorofile.kt | 2 +- .../lagradost/cloudstream3/utils/ExtractorApi.kt | 2 ++ 27 files changed, 50 insertions(+), 39 deletions(-) delete mode 100644 app/src/main/java/com/lagradost/cloudstream3/extractors/Mcloud.kt diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/AStreamHub.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/AStreamHub.kt index 18602664..b0051ba7 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/AStreamHub.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/AStreamHub.kt @@ -2,10 +2,11 @@ package com.lagradost.cloudstream3.extractors import android.util.Log import com.lagradost.cloudstream3.app -import com.lagradost.cloudstream3.base64Decode -import com.lagradost.cloudstream3.utils.* +import com.lagradost.cloudstream3.utils.ExtractorApi +import com.lagradost.cloudstream3.utils.ExtractorLink +import com.lagradost.cloudstream3.utils.Qualities -class AStreamHub : ExtractorApi() { +open class AStreamHub : ExtractorApi() { override val name = "AStreamHub" override val mainUrl = "https://astreamhub.com" override val requiresReferer = true diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/Acefile.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/Acefile.kt index fe46791b..18198f44 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/Acefile.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/Acefile.kt @@ -4,7 +4,7 @@ import com.lagradost.cloudstream3.app import com.lagradost.cloudstream3.base64Decode import com.lagradost.cloudstream3.utils.* -class Acefile : ExtractorApi() { +open class Acefile : ExtractorApi() { override val name = "Acefile" override val mainUrl = "https://acefile.co" override val requiresReferer = false diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/AsianLoad.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/AsianLoad.kt index cf16f200..7a62fb52 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/AsianLoad.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/AsianLoad.kt @@ -7,7 +7,7 @@ import com.lagradost.cloudstream3.utils.M3u8Helper import com.lagradost.cloudstream3.utils.getQualityFromName import java.net.URI -class AsianLoad : ExtractorApi() { +open class AsianLoad : ExtractorApi() { override var name = "AsianLoad" override var mainUrl = "https://asianembed.io" override val requiresReferer = true diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/Blogger.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/Blogger.kt index cae77322..44e700b1 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/Blogger.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/Blogger.kt @@ -5,7 +5,7 @@ import com.lagradost.cloudstream3.app import com.lagradost.cloudstream3.utils.* import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson -class Blogger : ExtractorApi() { +open class Blogger : ExtractorApi() { override val name = "Blogger" override val mainUrl = "https://www.blogger.com" override val requiresReferer = false diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/BullStream.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/BullStream.kt index e5368bc3..71fa7066 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/BullStream.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/BullStream.kt @@ -5,7 +5,7 @@ import com.lagradost.cloudstream3.utils.ExtractorApi import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.M3u8Helper -class BullStream : ExtractorApi() { +open class BullStream : ExtractorApi() { override val name = "BullStream" override val mainUrl = "https://bullstream.xyz" override val requiresReferer = false diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/Embedgram.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/Embedgram.kt index 35569663..45a06dcc 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/Embedgram.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/Embedgram.kt @@ -7,7 +7,7 @@ import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.getQualityFromName import com.lagradost.cloudstream3.utils.httpsify -class Embedgram : ExtractorApi() { +open class Embedgram : ExtractorApi() { override val name = "Embedgram" override val mainUrl = "https://embedgram.com" override val requiresReferer = true diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/Fastream.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/Fastream.kt index 0d5a5c78..f813d7ea 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/Fastream.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/Fastream.kt @@ -6,7 +6,7 @@ import com.lagradost.cloudstream3.utils.ExtractorApi import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.M3u8Helper.Companion.generateM3u8 -class Fastream: ExtractorApi() { +open class Fastream: ExtractorApi() { override var mainUrl = "https://fastream.to" override var name = "Fastream" override val requiresReferer = false diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/Filesim.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/Filesim.kt index 5c8af1c5..8e3dc730 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/Filesim.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/Filesim.kt @@ -5,7 +5,7 @@ import com.lagradost.cloudstream3.app import com.lagradost.cloudstream3.utils.* import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson -class Filesim : ExtractorApi() { +open class Filesim : ExtractorApi() { override val name = "Filesim" override val mainUrl = "https://files.im" override val requiresReferer = false diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/GMPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/GMPlayer.kt index af02ee8a..52c45096 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/GMPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/GMPlayer.kt @@ -3,10 +3,9 @@ package com.lagradost.cloudstream3.extractors import com.lagradost.cloudstream3.app import com.lagradost.cloudstream3.utils.ExtractorApi import com.lagradost.cloudstream3.utils.ExtractorLink -import com.lagradost.cloudstream3.utils.M3u8Helper import com.lagradost.cloudstream3.utils.Qualities -class GMPlayer : ExtractorApi() { +open class GMPlayer : ExtractorApi() { override val name = "GM Player" override val mainUrl = "https://gmplayer.xyz" override val requiresReferer = true diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/Linkbox.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/Linkbox.kt index 52fc5532..73734e2a 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/Linkbox.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/Linkbox.kt @@ -6,7 +6,7 @@ import com.lagradost.cloudstream3.utils.ExtractorApi import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.getQualityFromName -class Linkbox : ExtractorApi() { +open class Linkbox : ExtractorApi() { override val name = "Linkbox" override val mainUrl = "https://www.linkbox.to" override val requiresReferer = true diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/Mcloud.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/Mcloud.kt deleted file mode 100644 index 29d98557..00000000 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/Mcloud.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.lagradost.cloudstream3.extractors - -open class Mcloud : WcoStream() { - override var name = "Mcloud" - override var mainUrl = "https://mcloud.to" - override val requiresReferer = true -} \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/Mp4Upload.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/Mp4Upload.kt index 68a4a103..93a280ed 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/Mp4Upload.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/Mp4Upload.kt @@ -6,7 +6,7 @@ import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.Qualities import com.lagradost.cloudstream3.utils.getAndUnpack -class Mp4Upload : ExtractorApi() { +open class Mp4Upload : ExtractorApi() { override var name = "Mp4Upload" override var mainUrl = "https://www.mp4upload.com" private val srcRegex = Regex("""player\.src\("(.*?)"""") diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/MultiQuality.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/MultiQuality.kt index 0c0b5c68..44657196 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/MultiQuality.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/MultiQuality.kt @@ -7,7 +7,7 @@ import com.lagradost.cloudstream3.utils.Qualities import com.lagradost.cloudstream3.utils.getQualityFromName import java.net.URI -class MultiQuality : ExtractorApi() { +open class MultiQuality : ExtractorApi() { override var name = "MultiQuality" override var mainUrl = "https://gogo-play.net" private val sourceRegex = Regex("""file:\s*['"](.*?)['"],label:\s*['"](.*?)['"]""") diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/Mvidoo.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/Mvidoo.kt index c00df942..9e5f5e74 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/Mvidoo.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/Mvidoo.kt @@ -6,7 +6,7 @@ import com.lagradost.cloudstream3.utils.ExtractorApi import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.Qualities -class Mvidoo : ExtractorApi() { +open class Mvidoo : ExtractorApi() { override val name = "Mvidoo" override val mainUrl = "https://mvidoo.com" override val requiresReferer = true diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/Pelisplus.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/Pelisplus.kt index de469b22..45ec4c2f 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/Pelisplus.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/Pelisplus.kt @@ -14,7 +14,7 @@ import org.jsoup.Jsoup * overrideMainUrl is necessary for for other vidstream clones like vidembed.cc * If they diverge it'd be better to make them separate. * */ -class Pelisplus(val mainUrl: String) { +open class Pelisplus(val mainUrl: String) { val name: String = "Vidstream" private fun getExtractorUrl(id: String): String { diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/PlayLtXyz.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/PlayLtXyz.kt index 9a031556..2b286abb 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/PlayLtXyz.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/PlayLtXyz.kt @@ -6,7 +6,7 @@ import com.lagradost.cloudstream3.app import com.lagradost.cloudstream3.utils.* import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson -class PlayLtXyz: ExtractorApi() { +open class PlayLtXyz: ExtractorApi() { override val name: String = "PlayLt" override val mainUrl: String = "https://play.playlt.xyz" override val requiresReferer = true diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/Solidfiles.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/Solidfiles.kt index 849f5fc8..cc34781c 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/Solidfiles.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/Solidfiles.kt @@ -8,7 +8,7 @@ import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.getQualityFromName -class Solidfiles : ExtractorApi() { +open class Solidfiles : ExtractorApi() { override val name = "Solidfiles" override val mainUrl = "https://www.solidfiles.com" override val requiresReferer = false diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/StreamTape.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/StreamTape.kt index af436ff3..ece8dc4b 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/StreamTape.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/StreamTape.kt @@ -5,7 +5,15 @@ import com.lagradost.cloudstream3.utils.ExtractorApi import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.Qualities -class StreamTape : ExtractorApi() { +class StreamTapeNet : StreamTape() { + override var mainUrl = "https://streamtape.net" +} + +class ShaveTape : StreamTape(){ + override var mainUrl = "https://shavetape.cash" +} + +open class StreamTape : ExtractorApi() { override var name = "StreamTape" override var mainUrl = "https://streamtape.com" override val requiresReferer = false @@ -16,7 +24,8 @@ class StreamTape : ExtractorApi() { override suspend fun getUrl(url: String, referer: String?): List? { with(app.get(url)) { linkRegex.find(this.text)?.let { - val extractedUrl = "https:${it.groups[1]!!.value + it.groups[2]!!.value.substring(3,)}" + val extractedUrl = + "https:${it.groups[1]!!.value + it.groups[2]!!.value.substring(3)}" return listOf( ExtractorLink( name, diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/Streamhub.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/Streamhub.kt index 2765ae17..c7689c58 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/Streamhub.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/Streamhub.kt @@ -7,7 +7,7 @@ import com.lagradost.cloudstream3.utils.JsUnpacker import com.lagradost.cloudstream3.utils.Qualities import java.net.URI -class Streamhub : ExtractorApi() { +open class Streamhub : ExtractorApi() { override var mainUrl = "https://streamhub.to" override var name = "Streamhub" override val requiresReferer = false diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/Streamplay.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/Streamplay.kt index 3f5e5bd6..e6bbfeba 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/Streamplay.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/Streamplay.kt @@ -9,7 +9,7 @@ import com.lagradost.cloudstream3.utils.* import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson import java.net.URI -class Streamplay : ExtractorApi() { +open class Streamplay : ExtractorApi() { override val name = "Streamplay" override val mainUrl = "https://streamplay.to" override val requiresReferer = true diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/Supervideo.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/Supervideo.kt index 955345aa..dd49d994 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/Supervideo.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/Supervideo.kt @@ -11,7 +11,7 @@ data class Files( @JsonProperty("label") val label: String? = null, ) - open class Supervideo : ExtractorApi() { +open class Supervideo : ExtractorApi() { override var name = "Supervideo" override var mainUrl = "https://supervideo.tv" override val requiresReferer = false @@ -20,10 +20,13 @@ data class Files( val response = app.get(url).text val jstounpack = Regex("eval((.|\\n)*?)").find(response)?.groups?.get(1)?.value val unpacjed = JsUnpacker(jstounpack).unpack() - val extractedUrl = unpacjed?.let { Regex("""sources:((.|\n)*?)image""").find(it) }?.groups?.get(1)?.value.toString().replace("file",""""file"""").replace("label",""""label"""").substringBeforeLast(",") + val extractedUrl = + unpacjed?.let { Regex("""sources:((.|\n)*?)image""").find(it) }?.groups?.get(1)?.value.toString() + .replace("file", """"file"""").replace("label", """"label"""") + .substringBeforeLast(",") val parsedlinks = parseJson>(extractedUrl) parsedlinks.forEach { data -> - if (data.label.isNullOrBlank()){ // mp4 links (with labels) are slow. Use only m3u8 link. + if (data.label.isNullOrBlank()) { // mp4 links (with labels) are slow. Use only m3u8 link. M3u8Helper.generateM3u8( name, data.id, @@ -34,8 +37,6 @@ data class Files( } } } - - return extractedLinksList } } \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/UpstreamExtractor.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/UpstreamExtractor.kt index 1eb384c4..09e47d03 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/UpstreamExtractor.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/UpstreamExtractor.kt @@ -6,7 +6,7 @@ import com.lagradost.cloudstream3.utils.ExtractorApi import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.M3u8Helper -class UpstreamExtractor : ExtractorApi() { +open class UpstreamExtractor : ExtractorApi() { override val name: String = "Upstream" override val mainUrl: String = "https://upstream.to" override val requiresReferer = true diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/VideoVard.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/VideoVard.kt index 41e77967..30a1d8fe 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/VideoVard.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/VideoVard.kt @@ -11,7 +11,7 @@ class VideovardSX : WcoStream() { override var mainUrl = "https://videovard.sx" } -class VideoVard : ExtractorApi() { +open class VideoVard : ExtractorApi() { override var name = "Videovard" // Cause works for animekisa and wco override var mainUrl = "https://videovard.to" override val requiresReferer = false diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/WcoStream.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/WcoStream.kt index d99485ea..6cc486cd 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/WcoStream.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/WcoStream.kt @@ -53,6 +53,12 @@ class VizcloudSite : WcoStream() { override var mainUrl = "https://vizcloud.site" } +class Mcloud : WcoStream() { + override var name = "Mcloud" + override var mainUrl = "https://mcloud.to" + override val requiresReferer = true +} + open class WcoStream : ExtractorApi() { override var name = "VidStream" // Cause works for animekisa and wco override var mainUrl = "https://vidstream.pro" diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/YourUpload.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/YourUpload.kt index 3c564f67..c7aa989d 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/YourUpload.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/YourUpload.kt @@ -7,7 +7,7 @@ import com.lagradost.cloudstream3.utils.ExtractorApi import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.getQualityFromName -class YourUpload: ExtractorApi() { +open class YourUpload: ExtractorApi() { override val name = "Yourupload" override val mainUrl = "https://www.yourupload.com" override val requiresReferer = false diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/Zorofile.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/Zorofile.kt index 84785b6c..43c4eefb 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/Zorofile.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/Zorofile.kt @@ -10,7 +10,7 @@ import com.lagradost.cloudstream3.utils.ExtractorApi import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.M3u8Helper -class Zorofile : ExtractorApi() { +open class Zorofile : ExtractorApi() { override val name = "Zorofile" override val mainUrl = "https://zorofile.com" override val requiresReferer = true diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt index 1a1afb68..24708e99 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt @@ -205,6 +205,8 @@ val extractorApis: MutableList = arrayListOf( VideovardSX(), Mp4Upload(), StreamTape(), + StreamTapeNet(), + ShaveTape(), //mixdrop extractors MixDropBz(), From 1226426389ac327514f3189826b8712516dd9270 Mon Sep 17 00:00:00 2001 From: Blatzar <46196380+Blatzar@users.noreply.github.com> Date: Sun, 6 Nov 2022 20:16:48 +0100 Subject: [PATCH 13/13] More crash fixes --- .../lagradost/cloudstream3/CommonActivity.kt | 3 ++- .../com/lagradost/cloudstream3/MainAPI.kt | 11 +++++++++-- .../ui/settings/SettingsUpdates.kt | 19 +++++++++++++------ app/src/main/res/values/strings.xml | 2 +- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/CommonActivity.kt b/app/src/main/java/com/lagradost/cloudstream3/CommonActivity.kt index 342dc6f7..47a195d1 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/CommonActivity.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/CommonActivity.kt @@ -61,8 +61,9 @@ object CommonActivity { } } + /** duration is Toast.LENGTH_SHORT if null*/ @MainThread - fun showToast(act: Activity?, @StringRes message: Int, duration: Int) { + fun showToast(act: Activity?, @StringRes message: Int, duration: Int? = null) { if (act == null) return showToast(act, act.getString(message), duration) } diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt b/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt index 4b271192..5c9f3071 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt @@ -81,7 +81,8 @@ object APIHolder { synchronized(allProviders) { initMap() return apiMap?.get(apiName)?.let { apis.getOrNull(it) } - ?: allProviders.firstOrNull { it.name == apiName } + // Leave the ?. null check, it can crash regardless + ?: allProviders.firstOrNull { it?.name == apiName } } } @@ -244,11 +245,17 @@ object APIHolder { fun Context.filterProviderByPreferredMedia(hasHomePageIsRequired: Boolean = true): List { // We are getting the weirdest crash ever done: // java.lang.ClassCastException: com.lagradost.cloudstream3.TvType cannot be cast to com.lagradost.cloudstream3.TvType - // enumValues() might be the cause, hence I am trying TvType.values() + // Trying fixing using classloader fuckery + val oldLoader = Thread.currentThread().contextClassLoader + Thread.currentThread().contextClassLoader = TvType::class.java.classLoader + val default = TvType.values() .sorted() .filter { it != TvType.NSFW } .map { it.ordinal } + + Thread.currentThread().contextClassLoader = oldLoader + val defaultSet = default.map { it.toString() }.toSet() val currentPrefMedia = try { PreferenceManager.getDefaultSharedPreferences(this) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsUpdates.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsUpdates.kt index 6b19042a..78f6d628 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsUpdates.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsUpdates.kt @@ -4,12 +4,14 @@ import android.content.ClipData import android.content.ClipboardManager import android.content.Context import android.os.Bundle +import android.os.TransactionTooLargeException import android.view.View import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.navigation.fragment.findNavController import androidx.preference.PreferenceFragmentCompat import com.lagradost.cloudstream3.CommonActivity +import com.lagradost.cloudstream3.CommonActivity.showToast import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.getPref @@ -81,12 +83,17 @@ class SettingsUpdates : PreferenceFragmentCompat() { dialog.text1?.text = text dialog.copy_btt?.setOnClickListener { - val serviceClipboard = - (activity?.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager?) - ?: return@setOnClickListener - val clip = ClipData.newPlainText("logcat", text) - serviceClipboard.setPrimaryClip(clip) - dialog.dismissSafe(activity) + // Can crash on too much text + try { + val serviceClipboard = + (activity?.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager?) + ?: return@setOnClickListener + val clip = ClipData.newPlainText("logcat", text) + serviceClipboard.setPrimaryClip(clip) + dialog.dismissSafe(activity) + } catch (e: TransactionTooLargeException) { + showToast(activity, R.string.clipboard_too_large) + } } dialog.clear_btt?.setOnClickListener { Runtime.getRuntime().exec("logcat -c") diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e2ebf0ab..9381372c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -652,5 +652,5 @@ Clear history History Show skip popups for opening/ending - + Too much text. Unable to save to clipboard.