mirror of
https://github.com/recloudstream/cloudstream.git
synced 2024-08-15 01:53:11 +00:00
added trailer animation
This commit is contained in:
parent
5f542ec81a
commit
f64b2f7f1b
6 changed files with 102 additions and 29 deletions
|
@ -31,6 +31,7 @@ import com.google.android.exoplayer2.upstream.cache.SimpleCache
|
||||||
import com.google.android.exoplayer2.util.MimeTypes
|
import com.google.android.exoplayer2.util.MimeTypes
|
||||||
import com.google.android.exoplayer2.video.VideoSize
|
import com.google.android.exoplayer2.video.VideoSize
|
||||||
import com.lagradost.cloudstream3.APIHolder.getApiFromName
|
import com.lagradost.cloudstream3.APIHolder.getApiFromName
|
||||||
|
import com.lagradost.cloudstream3.ErrorLoadingException
|
||||||
import com.lagradost.cloudstream3.USER_AGENT
|
import com.lagradost.cloudstream3.USER_AGENT
|
||||||
import com.lagradost.cloudstream3.app
|
import com.lagradost.cloudstream3.app
|
||||||
import com.lagradost.cloudstream3.mvvm.logError
|
import com.lagradost.cloudstream3.mvvm.logError
|
||||||
|
@ -923,6 +924,8 @@ class CS3IPlayer : IPlayer {
|
||||||
yt?.let { ytf ->
|
yt?.let { ytf ->
|
||||||
ytVideos[ytLink] = ytf
|
ytVideos[ytLink] = ytf
|
||||||
loadYtFile(context, ytf)
|
loadYtFile(context, ytf)
|
||||||
|
} ?: run {
|
||||||
|
playerError?.invoke(ErrorLoadingException("No Link"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -229,6 +229,15 @@ open class FullScreenPlayer : AbstractPlayerFragment() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val playerSourceMove = if (isShowing) 0f else -50.toPx.toFloat()
|
||||||
|
player_open_source?.let {
|
||||||
|
ObjectAnimator.ofFloat(it, "translationY", playerSourceMove).apply {
|
||||||
|
duration = 200
|
||||||
|
start()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!isLocked) {
|
if (!isLocked) {
|
||||||
player_ffwd_holder?.alpha = 1f
|
player_ffwd_holder?.alpha = 1f
|
||||||
player_rew_holder?.alpha = 1f
|
player_rew_holder?.alpha = 1f
|
||||||
|
@ -251,6 +260,7 @@ open class FullScreenPlayer : AbstractPlayerFragment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bottom_player_bar?.startAnimation(fadeAnimation)
|
bottom_player_bar?.startAnimation(fadeAnimation)
|
||||||
|
player_open_source?.startAnimation(fadeAnimation)
|
||||||
player_top_holder?.startAnimation(fadeAnimation)
|
player_top_holder?.startAnimation(fadeAnimation)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,6 +50,7 @@ import com.lagradost.cloudstream3.ui.download.DOWNLOAD_ACTION_DOWNLOAD
|
||||||
import com.lagradost.cloudstream3.ui.download.DOWNLOAD_NAVIGATE_TO
|
import com.lagradost.cloudstream3.ui.download.DOWNLOAD_NAVIGATE_TO
|
||||||
import com.lagradost.cloudstream3.ui.download.DownloadButtonSetup.handleDownloadClick
|
import com.lagradost.cloudstream3.ui.download.DownloadButtonSetup.handleDownloadClick
|
||||||
import com.lagradost.cloudstream3.ui.download.EasyDownloadButton
|
import com.lagradost.cloudstream3.ui.download.EasyDownloadButton
|
||||||
|
import com.lagradost.cloudstream3.ui.player.CSPlayerEvent
|
||||||
import com.lagradost.cloudstream3.ui.player.GeneratorPlayer
|
import com.lagradost.cloudstream3.ui.player.GeneratorPlayer
|
||||||
import com.lagradost.cloudstream3.ui.player.RepoLinkGenerator
|
import com.lagradost.cloudstream3.ui.player.RepoLinkGenerator
|
||||||
import com.lagradost.cloudstream3.ui.player.SubtitleData
|
import com.lagradost.cloudstream3.ui.player.SubtitleData
|
||||||
|
@ -88,8 +89,10 @@ import com.lagradost.cloudstream3.utils.VideoDownloadManager.getFileName
|
||||||
import com.lagradost.cloudstream3.utils.VideoDownloadManager.sanitizeFilename
|
import com.lagradost.cloudstream3.utils.VideoDownloadManager.sanitizeFilename
|
||||||
import kotlinx.android.synthetic.main.fragment_result.*
|
import kotlinx.android.synthetic.main.fragment_result.*
|
||||||
import kotlinx.android.synthetic.main.fragment_result_swipe.*
|
import kotlinx.android.synthetic.main.fragment_result_swipe.*
|
||||||
|
import kotlinx.android.synthetic.main.fragment_trailer.*
|
||||||
import kotlinx.android.synthetic.main.result_recommendations.*
|
import kotlinx.android.synthetic.main.result_recommendations.*
|
||||||
import kotlinx.android.synthetic.main.result_sync.*
|
import kotlinx.android.synthetic.main.result_sync.*
|
||||||
|
import kotlinx.android.synthetic.main.trailer_custom_layout.*
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
|
@ -608,36 +611,42 @@ class ResultFragment : ResultTrailerPlayer() {
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun playerError(exception: Exception) {
|
override fun playerError(exception: Exception) {
|
||||||
if (player.getIsPlaying()) // because we dont want random toasts in player
|
if (player.getIsPlaying()) { // because we dont want random toasts in player
|
||||||
super.playerError(exception)
|
super.playerError(exception)
|
||||||
|
} else {
|
||||||
|
nextMirror()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun loadTrailer(index: Int? = null) {
|
private fun loadTrailer(index: Int? = null) {
|
||||||
currentTrailers.getOrNull(index ?: currentTrailerIndex)?.let { trailer ->
|
val isSuccess =
|
||||||
//if(trailer.contains("youtube.com")) { // wont load in exo
|
currentTrailers.getOrNull(index ?: currentTrailerIndex)?.let { trailer ->
|
||||||
// nextMirror()
|
context?.let { ctx ->
|
||||||
// return
|
player.onPause()
|
||||||
//}
|
player.loadPlayer(
|
||||||
context?.let { ctx ->
|
ctx,
|
||||||
player.onPause()
|
false,
|
||||||
player.loadPlayer(
|
ExtractorLink(
|
||||||
ctx,
|
"",
|
||||||
false,
|
"Trailer",
|
||||||
ExtractorLink(
|
trailer,
|
||||||
"",
|
"",
|
||||||
"Trailer",
|
Qualities.Unknown.value
|
||||||
trailer,
|
),
|
||||||
"",
|
null,
|
||||||
Qualities.Unknown.value
|
startPosition = 0L,
|
||||||
),
|
subtitles = emptySet(),
|
||||||
null,
|
subtitle = null,
|
||||||
startPosition = 0L,
|
autoPlay = false
|
||||||
subtitles = emptySet(),
|
)
|
||||||
subtitle = null,
|
true
|
||||||
autoPlay = false
|
} ?: run {
|
||||||
)
|
false
|
||||||
|
}
|
||||||
|
} ?: run {
|
||||||
|
false
|
||||||
}
|
}
|
||||||
}
|
result_trailer_loading?.isVisible = isSuccess
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setTrailers(trailers: List<String>?) {
|
private fun setTrailers(trailers: List<String>?) {
|
||||||
|
@ -758,6 +767,12 @@ class ResultFragment : ResultTrailerPlayer() {
|
||||||
result_overlapping_panels?.setStartPanelLockState(OverlappingPanelsLayout.LockState.CLOSE)
|
result_overlapping_panels?.setStartPanelLockState(OverlappingPanelsLayout.LockState.CLOSE)
|
||||||
result_overlapping_panels?.setEndPanelLockState(OverlappingPanelsLayout.LockState.CLOSE)
|
result_overlapping_panels?.setEndPanelLockState(OverlappingPanelsLayout.LockState.CLOSE)
|
||||||
|
|
||||||
|
player_open_source?.setOnClickListener {
|
||||||
|
currentTrailers.getOrNull(currentTrailerIndex)?.let {
|
||||||
|
context?.openBrowser(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
updateUIListener = ::updateUI
|
updateUIListener = ::updateUI
|
||||||
|
|
||||||
val restart = arguments?.getBoolean(RESTART_BUNDLE) ?: false
|
val restart = arguments?.getBoolean(RESTART_BUNDLE) ?: false
|
||||||
|
@ -828,6 +843,12 @@ class ResultFragment : ResultTrailerPlayer() {
|
||||||
} else if (dy < -5) {
|
} else if (dy < -5) {
|
||||||
result_bookmark_fab?.extend()
|
result_bookmark_fab?.extend()
|
||||||
}
|
}
|
||||||
|
if (!isFullScreenPlayer && player.getIsPlaying()) {
|
||||||
|
if (scrollY > (player_background?.height ?: scrollY)) {
|
||||||
|
player.handleEvent(CSPlayerEvent.Pause)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//result_poster_blur_holder?.translationY = -scrollY.toFloat()
|
//result_poster_blur_holder?.translationY = -scrollY.toFloat()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,7 @@ open class ResultTrailerPlayer : com.lagradost.cloudstream3.ui.player.FullScreen
|
||||||
screenHeight
|
screenHeight
|
||||||
}
|
}
|
||||||
|
|
||||||
|
result_trailer_loading?.isVisible = false
|
||||||
player_background?.apply {
|
player_background?.apply {
|
||||||
isVisible = true
|
isVisible = true
|
||||||
layoutParams =
|
layoutParams =
|
||||||
|
|
|
@ -138,6 +138,34 @@
|
||||||
android:background="?attr/primaryBlackBackground"
|
android:background="?attr/primaryBlackBackground"
|
||||||
android:orientation="vertical">
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<com.facebook.shimmer.ShimmerFrameLayout
|
||||||
|
android:visibility="gone"
|
||||||
|
android:id="@+id/result_trailer_loading"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:orientation="vertical"
|
||||||
|
app:shimmer_auto_start="true"
|
||||||
|
app:shimmer_base_alpha="0.2"
|
||||||
|
app:shimmer_duration="@integer/loading_time"
|
||||||
|
app:shimmer_highlight_alpha="0.3"
|
||||||
|
tools:visibility="visible">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="@dimen/result_padding"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<androidx.cardview.widget.CardView
|
||||||
|
android:background="@color/grayShimmer"
|
||||||
|
app:cardCornerRadius="@dimen/loading_radius"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="150dp"
|
||||||
|
android:foreground="@drawable/outline_drawable" />
|
||||||
|
</LinearLayout>
|
||||||
|
</com.facebook.shimmer.ShimmerFrameLayout>
|
||||||
|
|
||||||
<FrameLayout
|
<FrameLayout
|
||||||
android:id="@+id/result_smallscreen_holder"
|
android:id="@+id/result_smallscreen_holder"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
|
|
|
@ -58,7 +58,6 @@
|
||||||
android:background="@color/black_overlay" />
|
android:background="@color/black_overlay" />
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
|
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
android:id="@+id/player_video_holder"
|
android:id="@+id/player_video_holder"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
@ -273,6 +272,17 @@
|
||||||
android:layout_width="0dp" />
|
android:layout_width="0dp" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:background="?android:attr/selectableItemBackgroundBorderless"
|
||||||
|
android:id="@+id/player_open_source"
|
||||||
|
app:tint="@color/white"
|
||||||
|
android:src="@drawable/ic_baseline_public_24"
|
||||||
|
android:layout_margin="20dp"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:id="@+id/bottom_player_bar"
|
android:id="@+id/bottom_player_bar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
@ -343,9 +353,9 @@
|
||||||
app:tint="@color/white"
|
app:tint="@color/white"
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_gravity="center_vertical"
|
||||||
android:src="@drawable/baseline_fullscreen_24"
|
android:src="@drawable/baseline_fullscreen_24"
|
||||||
android:layout_marginEnd="10dp"
|
android:layout_marginEnd="20dp"
|
||||||
android:layout_width="24dp"
|
android:layout_width="30dp"
|
||||||
android:layout_height="24dp" />
|
android:layout_height="30dp" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue