mirror of
https://github.com/libre-tube/LibreTube.git
synced 2025-04-29 00:10:32 +05:30
commit
cdcf307498
@ -1,3 +1,5 @@
|
|||||||
|
import java.time.Instant
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id 'com.android.application'
|
id 'com.android.application'
|
||||||
id 'kotlin-android'
|
id 'kotlin-android'
|
||||||
@ -25,9 +27,8 @@ android {
|
|||||||
// use the date as version for debug builds
|
// use the date as version for debug builds
|
||||||
if (variant.name == 'debug') {
|
if (variant.name == 'debug') {
|
||||||
variant.outputs.each { output ->
|
variant.outputs.each { output ->
|
||||||
def date = getDate()
|
output.versionCodeOverride = getUnixTime()
|
||||||
output.versionCodeOverride = date
|
output.versionNameOverride = getUnixTime()
|
||||||
output.versionNameOverride = date
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -104,8 +105,6 @@ dependencies {
|
|||||||
implementation libs.coil
|
implementation libs.coil
|
||||||
}
|
}
|
||||||
|
|
||||||
static def getDate() {
|
static def getUnixTime() {
|
||||||
def date = new Date()
|
return Instant.now().getEpochSecond()
|
||||||
def formattedDate = date.format('yyyyMMddHH')
|
|
||||||
return Integer.parseInt(formattedDate)
|
|
||||||
}
|
}
|
@ -19,6 +19,7 @@ import android.os.PowerManager
|
|||||||
import android.support.v4.media.session.MediaSessionCompat
|
import android.support.v4.media.session.MediaSessionCompat
|
||||||
import android.text.Html
|
import android.text.Html
|
||||||
import android.text.TextUtils
|
import android.text.TextUtils
|
||||||
|
import android.text.format.DateUtils
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.MotionEvent
|
import android.view.MotionEvent
|
||||||
@ -118,6 +119,7 @@ class PlayerFragment : Fragment() {
|
|||||||
private var playlistId: String? = null
|
private var playlistId: String? = null
|
||||||
private var channelId: String? = null
|
private var channelId: String? = null
|
||||||
private var isSubscribed: Boolean = false
|
private var isSubscribed: Boolean = false
|
||||||
|
private var isLive = false
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* for the transition
|
* for the transition
|
||||||
@ -522,7 +524,6 @@ class PlayerFragment : Fragment() {
|
|||||||
val playbackSpeedValues =
|
val playbackSpeedValues =
|
||||||
context?.resources?.getStringArray(R.array.playbackSpeedValues)!!
|
context?.resources?.getStringArray(R.array.playbackSpeedValues)!!
|
||||||
exoPlayer.setPlaybackSpeed(playbackSpeed.toFloat())
|
exoPlayer.setPlaybackSpeed(playbackSpeed.toFloat())
|
||||||
Log.e(TAG, playbackSpeed)
|
|
||||||
val speedIndex = playbackSpeedValues.indexOf(playbackSpeed)
|
val speedIndex = playbackSpeedValues.indexOf(playbackSpeed)
|
||||||
playerBinding.speedText.text = playbackSpeeds[speedIndex]
|
playerBinding.speedText.text = playbackSpeeds[speedIndex]
|
||||||
|
|
||||||
@ -769,6 +770,12 @@ class PlayerFragment : Fragment() {
|
|||||||
// save related streams for autoplay
|
// save related streams for autoplay
|
||||||
relatedStreams = response.relatedStreams
|
relatedStreams = response.relatedStreams
|
||||||
|
|
||||||
|
// duration that's not greater than 0 indicates that the video is live
|
||||||
|
if (!(response.duration!! > 0)) {
|
||||||
|
isLive = true
|
||||||
|
handleLiveVideo()
|
||||||
|
}
|
||||||
|
|
||||||
runOnUiThread {
|
runOnUiThread {
|
||||||
// set media sources for the player
|
// set media sources for the player
|
||||||
setResolutionAndSubtitles(response)
|
setResolutionAndSubtitles(response)
|
||||||
@ -793,6 +800,34 @@ class PlayerFragment : Fragment() {
|
|||||||
run()
|
run()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun handleLiveVideo() {
|
||||||
|
playerBinding.exoTime.visibility = View.GONE
|
||||||
|
playerBinding.liveLL.visibility = View.VISIBLE
|
||||||
|
refreshLiveStatus()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun refreshLiveStatus() {
|
||||||
|
// switch back to normal speed when on the end of live stream
|
||||||
|
Log.e(exoPlayer.duration.toString(), exoPlayer.currentPosition.toString())
|
||||||
|
if (isLive && (exoPlayer.duration - exoPlayer.currentPosition < 10000)) {
|
||||||
|
exoPlayer.setPlaybackSpeed(1F)
|
||||||
|
playerBinding.speedText.text = "1x"
|
||||||
|
playerBinding.liveSeparator.visibility = View.GONE
|
||||||
|
playerBinding.liveDiff.text = ""
|
||||||
|
} else if (isLive) {
|
||||||
|
Log.e(TAG, "changing the time")
|
||||||
|
// live stream but not watching at the end/live position
|
||||||
|
playerBinding.liveSeparator.visibility = View.VISIBLE
|
||||||
|
val diffText = DateUtils.formatElapsedTime(
|
||||||
|
(exoPlayer.duration - exoPlayer.currentPosition) / 1000
|
||||||
|
)
|
||||||
|
playerBinding.liveDiff.text = "-$diffText"
|
||||||
|
}
|
||||||
|
// call it again
|
||||||
|
Handler(Looper.getMainLooper())
|
||||||
|
.postDelayed(this@PlayerFragment::refreshLiveStatus, 100)
|
||||||
|
}
|
||||||
|
|
||||||
private fun seekToWatchPosition() {
|
private fun seekToWatchPosition() {
|
||||||
// seek to saved watch position if available
|
// seek to saved watch position if available
|
||||||
val watchPositions = PreferenceHelper.getWatchPositions()
|
val watchPositions = PreferenceHelper.getWatchPositions()
|
||||||
@ -946,7 +981,8 @@ class PlayerFragment : Fragment() {
|
|||||||
binding.apply {
|
binding.apply {
|
||||||
playerViewsInfo.text =
|
playerViewsInfo.text =
|
||||||
context?.getString(R.string.views, response.views.formatShort()) +
|
context?.getString(R.string.views, response.views.formatShort()) +
|
||||||
" • " + response.uploadDate
|
if (!isLive) " • " + response.uploadDate else ""
|
||||||
|
|
||||||
textLike.text = response.likes.formatShort()
|
textLike.text = response.likes.formatShort()
|
||||||
textDislike.text = response.dislikes.formatShort()
|
textDislike.text = response.dislikes.formatShort()
|
||||||
ConnectionHelper.loadImage(response.uploaderAvatar, binding.playerChannelImage)
|
ConnectionHelper.loadImage(response.uploaderAvatar, binding.playerChannelImage)
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<merge xmlns:android="http://schemas.android.com/apk/res/android"
|
<merge xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
|
||||||
<View
|
<View
|
||||||
@ -175,13 +176,42 @@
|
|||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@id/exo_position"
|
android:id="@id/exo_position"
|
||||||
style="@style/ExoStyledControls.TimeText.Position" />
|
style="@style/TimeString" />
|
||||||
|
|
||||||
<TextView style="@style/ExoStyledControls.TimeText.Separator" />
|
<TextView
|
||||||
|
android:text=" • "
|
||||||
|
style="@style/TimeString"
|
||||||
|
tools:ignore="HardcodedText" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@id/exo_duration"
|
android:id="@id/exo_duration"
|
||||||
style="@style/ExoStyledControls.TimeText.Duration" />
|
style="@style/TimeString" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/liveLL"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:layout_marginStart="5dp"
|
||||||
|
android:visibility="gone">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/liveDiff"
|
||||||
|
style="@style/TimeString" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/liveSeparator"
|
||||||
|
style="@style/TimeString"
|
||||||
|
android:text=" • "
|
||||||
|
android:visibility="gone"
|
||||||
|
tools:ignore="HardcodedText" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/liveIndicator"
|
||||||
|
android:text="@string/live"
|
||||||
|
style="@style/TimeString" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
@ -135,5 +135,16 @@
|
|||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<style name="TimeString">
|
||||||
|
<item name="android:gravity">center</item>
|
||||||
|
<item name="android:layout_gravity">center_vertical</item>
|
||||||
|
<item name="android:layout_height">wrap_content</item>
|
||||||
|
<item name="android:layout_width">wrap_content</item>
|
||||||
|
<item name="paddingStart">4dp</item>
|
||||||
|
<item name="paddingEnd">4dp</item>
|
||||||
|
<item name="android:textSize">14sp</item>
|
||||||
|
<item name="android:textStyle">bold</item>
|
||||||
|
<item name="android:textColor">@android:color/white</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
Loading…
x
Reference in New Issue
Block a user