mirror of
https://github.com/recloudstream/cloudstream.git
synced 2024-08-15 01:53:11 +00:00
feat: add mpv+ytdl app
This commit is contained in:
parent
4d3ab40093
commit
6fcbf27b23
6 changed files with 72 additions and 5 deletions
|
@ -34,6 +34,7 @@
|
||||||
<package android:name="org.videolan.vlc" />
|
<package android:name="org.videolan.vlc" />
|
||||||
<package android:name="com.instantbits.cast.webvideo" />
|
<package android:name="com.instantbits.cast.webvideo" />
|
||||||
<package android:name="is.xyz.mpv" />
|
<package android:name="is.xyz.mpv" />
|
||||||
|
<package android:name="is.xyz.mpv.ytdl" />
|
||||||
</queries>
|
</queries>
|
||||||
|
|
||||||
<!-- Without the large heap Exoplayer buffering gets reset due to OOM. -->
|
<!-- Without the large heap Exoplayer buffering gets reset due to OOM. -->
|
||||||
|
@ -220,4 +221,4 @@
|
||||||
</provider>
|
</provider>
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|
|
@ -192,10 +192,12 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener, BiometricCa
|
||||||
companion object {
|
companion object {
|
||||||
const val VLC_PACKAGE = "org.videolan.vlc"
|
const val VLC_PACKAGE = "org.videolan.vlc"
|
||||||
const val MPV_PACKAGE = "is.xyz.mpv"
|
const val MPV_PACKAGE = "is.xyz.mpv"
|
||||||
|
const val MPV_YTDL_PACKAGE = "is.xyz.mpv.ytdl"
|
||||||
const val WEB_VIDEO_CAST_PACKAGE = "com.instantbits.cast.webvideo"
|
const val WEB_VIDEO_CAST_PACKAGE = "com.instantbits.cast.webvideo"
|
||||||
|
|
||||||
val VLC_COMPONENT = ComponentName(VLC_PACKAGE, "$VLC_PACKAGE.gui.video.VideoPlayerActivity")
|
val VLC_COMPONENT = ComponentName(VLC_PACKAGE, "$VLC_PACKAGE.gui.video.VideoPlayerActivity")
|
||||||
val MPV_COMPONENT = ComponentName(MPV_PACKAGE, "$MPV_PACKAGE.MPVActivity")
|
val MPV_COMPONENT = ComponentName(MPV_PACKAGE, "$MPV_PACKAGE.MPVActivity")
|
||||||
|
val MPV_YTDL_COMPONENT = ComponentName(MPV_YTDL_PACKAGE, "is.xyz.mpv.ytdl/is.xyz.mpv.MPVActivity")
|
||||||
|
|
||||||
//TODO REFACTOR AF
|
//TODO REFACTOR AF
|
||||||
open class ResultResume(
|
open class ResultResume(
|
||||||
|
@ -267,10 +269,27 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener, BiometricCa
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val MPV_YTDL = object : ResultResume(
|
||||||
|
MPV_YTDL_PACKAGE,
|
||||||
|
//"is.xyz.mpv.ytdl/is.xyz.mpv.MPVActivity.result", // resume not working :pensive:
|
||||||
|
position = "position",
|
||||||
|
duration = "duration",
|
||||||
|
) {
|
||||||
|
override fun getPosition(intent: Intent?): Long {
|
||||||
|
return intent?.getIntExtra(this.position, defaultTime.toInt())?.toLong()
|
||||||
|
?: defaultTime
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getDuration(intent: Intent?): Long {
|
||||||
|
return intent?.getIntExtra(this.duration, defaultTime.toInt())?.toLong()
|
||||||
|
?: defaultTime
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
val WEB_VIDEO = ResultResume(WEB_VIDEO_CAST_PACKAGE)
|
val WEB_VIDEO = ResultResume(WEB_VIDEO_CAST_PACKAGE)
|
||||||
|
|
||||||
val resumeApps = arrayOf(
|
val resumeApps = arrayOf(
|
||||||
VLC, MPV, WEB_VIDEO
|
VLC, MPV, MPV_YTDL, WEB_VIDEO
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1861,4 +1880,4 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener, BiometricCa
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,6 +54,7 @@ const val ACTION_DOWNLOAD_EPISODE_SUBTITLE_MIRROR = 14
|
||||||
|
|
||||||
const val ACTION_PLAY_EPISODE_IN_WEB_VIDEO = 16
|
const val ACTION_PLAY_EPISODE_IN_WEB_VIDEO = 16
|
||||||
const val ACTION_PLAY_EPISODE_IN_MPV = 17
|
const val ACTION_PLAY_EPISODE_IN_MPV = 17
|
||||||
|
const val ACTION_PLAY_EPISODE_IN_MPV_YTDL = 20
|
||||||
|
|
||||||
const val ACTION_MARK_AS_WATCHED = 18
|
const val ACTION_MARK_AS_WATCHED = 18
|
||||||
const val ACTION_FCAST = 19
|
const val ACTION_FCAST = 19
|
||||||
|
@ -81,6 +82,7 @@ class EpisodeAdapter(
|
||||||
3 -> ACTION_PLAY_EPISODE_IN_BROWSER
|
3 -> ACTION_PLAY_EPISODE_IN_BROWSER
|
||||||
4 -> ACTION_PLAY_EPISODE_IN_WEB_VIDEO
|
4 -> ACTION_PLAY_EPISODE_IN_WEB_VIDEO
|
||||||
5 -> ACTION_PLAY_EPISODE_IN_MPV
|
5 -> ACTION_PLAY_EPISODE_IN_MPV
|
||||||
|
6 -> ACTION_PLAY_EPISODE_IN_MPV_YTDL
|
||||||
else -> ACTION_PLAY_EPISODE_IN_PLAYER
|
else -> ACTION_PLAY_EPISODE_IN_PLAYER
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,9 @@ import com.lagradost.cloudstream3.LoadResponse.Companion.readIdFromString
|
||||||
import com.lagradost.cloudstream3.MainActivity.Companion.MPV
|
import com.lagradost.cloudstream3.MainActivity.Companion.MPV
|
||||||
import com.lagradost.cloudstream3.MainActivity.Companion.MPV_COMPONENT
|
import com.lagradost.cloudstream3.MainActivity.Companion.MPV_COMPONENT
|
||||||
import com.lagradost.cloudstream3.MainActivity.Companion.MPV_PACKAGE
|
import com.lagradost.cloudstream3.MainActivity.Companion.MPV_PACKAGE
|
||||||
|
import com.lagradost.cloudstream3.MainActivity.Companion.MPV_YTDL
|
||||||
|
import com.lagradost.cloudstream3.MainActivity.Companion.MPV_YTDL_COMPONENT
|
||||||
|
import com.lagradost.cloudstream3.MainActivity.Companion.MPV_YTDL_PACKAGE
|
||||||
import com.lagradost.cloudstream3.MainActivity.Companion.VLC
|
import com.lagradost.cloudstream3.MainActivity.Companion.VLC
|
||||||
import com.lagradost.cloudstream3.MainActivity.Companion.VLC_COMPONENT
|
import com.lagradost.cloudstream3.MainActivity.Companion.VLC_COMPONENT
|
||||||
import com.lagradost.cloudstream3.MainActivity.Companion.VLC_PACKAGE
|
import com.lagradost.cloudstream3.MainActivity.Companion.VLC_PACKAGE
|
||||||
|
@ -1454,6 +1457,25 @@ class ResultViewModel2 : ViewModel() {
|
||||||
putExtra("position", position.toInt())
|
putExtra("position", position.toInt())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun playWithMpvYtdl(
|
||||||
|
activity: Activity?,
|
||||||
|
id: Int,
|
||||||
|
link: ExtractorLink,
|
||||||
|
subtitles: List<SubtitleData>,
|
||||||
|
resume: Boolean = true,
|
||||||
|
) = launchActivity(activity, MPV_YTDL, id) {
|
||||||
|
putExtra("subs", subtitles.map { it.url.toUri() }.toTypedArray())
|
||||||
|
putExtra("subs.name", subtitles.map { it.name }.toTypedArray())
|
||||||
|
putExtra("subs.filename", subtitles.map { it.name }.toTypedArray())
|
||||||
|
setDataAndType(Uri.parse(link.url), "video/*")
|
||||||
|
component = MPV_YTDL_COMPONENT
|
||||||
|
putExtra("secure_uri", true)
|
||||||
|
putExtra("return_result", true)
|
||||||
|
val position = getViewPos(id)?.position
|
||||||
|
if (resume && position != null)
|
||||||
|
putExtra("position", position.toInt())
|
||||||
|
}
|
||||||
|
|
||||||
// https://wiki.videolan.org/Android_Player_Intents/
|
// https://wiki.videolan.org/Android_Player_Intents/
|
||||||
private fun playWithVlc(
|
private fun playWithVlc(
|
||||||
activity: Activity?,
|
activity: Activity?,
|
||||||
|
@ -1538,6 +1560,11 @@ class ResultViewModel2 : ViewModel() {
|
||||||
MPV_PACKAGE,
|
MPV_PACKAGE,
|
||||||
R.string.player_settings_play_in_mpv,
|
R.string.player_settings_play_in_mpv,
|
||||||
ACTION_PLAY_EPISODE_IN_MPV
|
ACTION_PLAY_EPISODE_IN_MPV
|
||||||
|
),
|
||||||
|
ExternalApp(
|
||||||
|
MPV_YTDL_PACKAGE,
|
||||||
|
R.string.player_settings_play_in_mpvytdl,
|
||||||
|
ACTION_PLAY_EPISODE_IN_MPV_YTDL
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -1849,6 +1876,22 @@ class ResultViewModel2 : ViewModel() {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ACTION_PLAY_EPISODE_IN_MPV_YTDL -> acquireSingleLink(
|
||||||
|
click.data,
|
||||||
|
LoadType.Chromecast,
|
||||||
|
txt(
|
||||||
|
R.string.episode_action_play_in_format,
|
||||||
|
txt(R.string.player_settings_play_in_mpvytdl)
|
||||||
|
)
|
||||||
|
) { (result, index) ->
|
||||||
|
playWithMpvYtdl(
|
||||||
|
activity,
|
||||||
|
click.data.id,
|
||||||
|
result.links[index],
|
||||||
|
result.subs
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
ACTION_PLAY_EPISODE_IN_PLAYER -> {
|
ACTION_PLAY_EPISODE_IN_PLAYER -> {
|
||||||
val data = currentResponse?.syncData?.toList() ?: emptyList()
|
val data = currentResponse?.syncData?.toList() ?: emptyList()
|
||||||
val list =
|
val list =
|
||||||
|
@ -2861,4 +2904,4 @@ class ResultViewModel2 : ViewModel() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,6 +54,7 @@
|
||||||
<item>@string/player_settings_play_in_app</item>
|
<item>@string/player_settings_play_in_app</item>
|
||||||
<item>@string/player_settings_play_in_vlc</item>
|
<item>@string/player_settings_play_in_vlc</item>
|
||||||
<item>@string/player_settings_play_in_mpv</item>
|
<item>@string/player_settings_play_in_mpv</item>
|
||||||
|
<item>@string/player_settings_play_in_mpvytdl</item>
|
||||||
<item>@string/player_settings_play_in_web</item>
|
<item>@string/player_settings_play_in_web</item>
|
||||||
<item>@string/player_settings_play_in_browser</item>
|
<item>@string/player_settings_play_in_browser</item>
|
||||||
</array>
|
</array>
|
||||||
|
|
|
@ -664,6 +664,7 @@
|
||||||
<string name="player_settings_play_in_app">Internal player</string>
|
<string name="player_settings_play_in_app">Internal player</string>
|
||||||
<string name="player_settings_play_in_vlc">VLC</string>
|
<string name="player_settings_play_in_vlc">VLC</string>
|
||||||
<string name="player_settings_play_in_mpv">MPV</string>
|
<string name="player_settings_play_in_mpv">MPV</string>
|
||||||
|
<string name="player_settings_play_in_mpvytdl">MPV YTDL</string>
|
||||||
<string name="player_settings_play_in_web">Web Video Cast</string>
|
<string name="player_settings_play_in_web">Web Video Cast</string>
|
||||||
<string name="player_settings_play_in_fcast">Fcast</string>
|
<string name="player_settings_play_in_fcast">Fcast</string>
|
||||||
<string name="player_settings_play_in_browser">Web browser</string>
|
<string name="player_settings_play_in_browser">Web browser</string>
|
||||||
|
@ -814,4 +815,4 @@
|
||||||
<string name="preview_seekbar_key" translatable="false">preview_seekbar_key</string>
|
<string name="preview_seekbar_key" translatable="false">preview_seekbar_key</string>
|
||||||
<string name="preview_seekbar">Seekbar preview</string>
|
<string name="preview_seekbar">Seekbar preview</string>
|
||||||
<string name="preview_seekbar_desc">Enable preview thumbnail on seekbar</string>
|
<string name="preview_seekbar_desc">Enable preview thumbnail on seekbar</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
Loading…
Reference in a new issue