mirror of
https://github.com/streamyfin/streamyfin.git
synced 2025-08-20 18:37:18 +02:00
WIP
This commit is contained in:
@@ -17,7 +17,7 @@ import { getStreamUrl } from "@/utils/jellyfin/media/getStreamUrl";
|
|||||||
import { writeToLog } from "@/utils/log";
|
import { writeToLog } from "@/utils/log";
|
||||||
import native from "@/utils/profiles/native";
|
import native from "@/utils/profiles/native";
|
||||||
import android from "@/utils/profiles/android";
|
import android from "@/utils/profiles/android";
|
||||||
import { msToTicks, ticksToMs } from "@/utils/time";
|
import { msToTicks, ticksToSeconds } from "@/utils/time";
|
||||||
import { Api } from "@jellyfin/sdk";
|
import { Api } from "@jellyfin/sdk";
|
||||||
import { BaseItemDto } from "@jellyfin/sdk/lib/generated-client";
|
import { BaseItemDto } from "@jellyfin/sdk/lib/generated-client";
|
||||||
import {
|
import {
|
||||||
@@ -301,8 +301,9 @@ export default function page() {
|
|||||||
|
|
||||||
if (!stream || !item) return null;
|
if (!stream || !item) return null;
|
||||||
|
|
||||||
|
console.log("AudioIndex", audioIndex);
|
||||||
const startPosition = item?.UserData?.PlaybackPositionTicks
|
const startPosition = item?.UserData?.PlaybackPositionTicks
|
||||||
? ticksToMs(item.UserData.PlaybackPositionTicks)
|
? ticksToSeconds(item.UserData.PlaybackPositionTicks)
|
||||||
: 0;
|
: 0;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -327,7 +328,11 @@ export default function page() {
|
|||||||
autoplay: true,
|
autoplay: true,
|
||||||
isNetwork: true,
|
isNetwork: true,
|
||||||
startPosition,
|
startPosition,
|
||||||
initOptions: ["--sub-text-scale=60"],
|
initOptions: [
|
||||||
|
"--sub-text-scale=60",
|
||||||
|
`--sub-track=${subtitleIndex - 2}`, // This refers to the subtitle position index in the subtitles list.
|
||||||
|
// `--audio-track=${audioIndex - 1}`, // This refers to the audio position index in the audio list.
|
||||||
|
],
|
||||||
}}
|
}}
|
||||||
style={{ width: "100%", height: "100%" }}
|
style={{ width: "100%", height: "100%" }}
|
||||||
onVideoProgress={onProgress}
|
onVideoProgress={onProgress}
|
||||||
|
|||||||
@@ -10,9 +10,7 @@ class VlcPlayerView: ExpoView {
|
|||||||
private var currentGeometryCString: [CChar]?
|
private var currentGeometryCString: [CChar]?
|
||||||
private var lastReportedState: VLCMediaPlayerState?
|
private var lastReportedState: VLCMediaPlayerState?
|
||||||
private var lastReportedIsPlaying: Bool?
|
private var lastReportedIsPlaying: Bool?
|
||||||
private var isMediaReady: Bool = false
|
|
||||||
private var customSubtitles: [(internalName: String, originalName: String)] = []
|
private var customSubtitles: [(internalName: String, originalName: String)] = []
|
||||||
private var startPosition: Int32?
|
|
||||||
|
|
||||||
// MARK: - Initialization
|
// MARK: - Initialization
|
||||||
|
|
||||||
@@ -104,12 +102,13 @@ class VlcPlayerView: ExpoView {
|
|||||||
guard let self = self else { return }
|
guard let self = self else { return }
|
||||||
|
|
||||||
let mediaOptions = source["mediaOptions"] as? [String: Any] ?? [:]
|
let mediaOptions = source["mediaOptions"] as? [String: Any] ?? [:]
|
||||||
let initOptions = source["initOptions"] as? [Any] ?? []
|
var initOptions = source["initOptions"] as? [Any] ?? []
|
||||||
|
let startPosition = source["startPosition"] as? Int32 ?? 0
|
||||||
|
initOptions.append("--start-time=\(startPosition)")
|
||||||
|
|
||||||
let uri = source["uri"] as? String
|
let uri = source["uri"] as? String
|
||||||
let autoplay = source["autoplay"] as? Bool ?? false
|
let autoplay = source["autoplay"] as? Bool ?? false
|
||||||
let isNetwork = source["isNetwork"] as? Bool ?? false
|
let isNetwork = source["isNetwork"] as? Bool ?? false
|
||||||
let startPosition = source["startPosition"] as? Int32 ?? 0
|
|
||||||
self.startPosition = startPosition
|
|
||||||
|
|
||||||
guard let uri = uri, !uri.isEmpty else {
|
guard let uri = uri, !uri.isEmpty else {
|
||||||
print("Error: Invalid or empty URI")
|
print("Error: Invalid or empty URI")
|
||||||
@@ -162,10 +161,6 @@ class VlcPlayerView: ExpoView {
|
|||||||
if autoplay {
|
if autoplay {
|
||||||
print("Playing...")
|
print("Playing...")
|
||||||
self.play()
|
self.play()
|
||||||
// if startPosition > 0 {
|
|
||||||
// print("Debug: Starting at position: \(startPosition)")
|
|
||||||
// self.seekTo(startPosition)
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -584,11 +579,10 @@ extension VlcPlayerView: VLCMediaPlayerDelegate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Dermine if the media has finished loading
|
// Dermine if the media has finished loading
|
||||||
if player.isPlaying && !self.isMediaReady {
|
// if player.isPlaying && !self.isMediaReady {
|
||||||
self.isMediaReady = true
|
// self.isMediaReady = true
|
||||||
self.onVideoLoadEnd?(stateInfo)
|
// self.onVideoLoadEnd?(stateInfo)
|
||||||
self.seekToStartTime()
|
// }
|
||||||
}
|
|
||||||
|
|
||||||
if self.lastReportedState != currentState
|
if self.lastReportedState != currentState
|
||||||
|| self.lastReportedIsPlaying != player.isPlaying
|
|| self.lastReportedIsPlaying != player.isPlaying
|
||||||
@@ -600,21 +594,21 @@ extension VlcPlayerView: VLCMediaPlayerDelegate {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func seekToStartTime() {
|
// func seekToStartTime() {
|
||||||
DispatchQueue.main.async { [weak self] in
|
// DispatchQueue.main.async { [weak self] in
|
||||||
guard let self = self, let player = self.mediaPlayer else { return }
|
// guard let self = self, let player = self.mediaPlayer else { return }
|
||||||
|
|
||||||
if let startPosition = self.startPosition, startPosition > 0 {
|
// if let startPosition = self.startPosition, startPosition > 0 {
|
||||||
print("Debug: Seeking to start position: \(startPosition)")
|
// print("Debug: Seeking to start position: \(startPosition)")
|
||||||
player.time = VLCTime(int: Int32(startPosition))
|
// player.time = VLCTime(int: Int32(startPosition))
|
||||||
|
|
||||||
// Ensure the player continues playing after seeking
|
// // Ensure the player continues playing after seeking
|
||||||
if !player.isPlaying {
|
// if !player.isPlaying {
|
||||||
player.play()
|
// player.play()
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
func mediaPlayerTimeChanged(_ aNotification: Notification) {
|
func mediaPlayerTimeChanged(_ aNotification: Notification) {
|
||||||
DispatchQueue.main.async { [weak self] in
|
DispatchQueue.main.async { [weak self] in
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import MediaTypes from "../../constants/MediaTypes";
|
|||||||
* Device profile for Native video player
|
* Device profile for Native video player
|
||||||
*/
|
*/
|
||||||
export default {
|
export default {
|
||||||
Name: "1. Native iOS Video Profile",
|
Name: "1. Vlc Player",
|
||||||
MaxStaticBitrate: 100000000,
|
MaxStaticBitrate: 100000000,
|
||||||
MaxStreamingBitrate: 120000000,
|
MaxStreamingBitrate: 120000000,
|
||||||
MusicStreamingTranscodingBitrate: 384000,
|
MusicStreamingTranscodingBitrate: 384000,
|
||||||
@@ -47,6 +47,7 @@ export default {
|
|||||||
MaxAudioChannels: "8",
|
MaxAudioChannels: "8",
|
||||||
MinSegments: "2",
|
MinSegments: "2",
|
||||||
BreakOnNonKeyFrames: true,
|
BreakOnNonKeyFrames: true,
|
||||||
|
EnableSubtitlesInManifest: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Type: MediaTypes.Audio,
|
Type: MediaTypes.Audio,
|
||||||
@@ -142,5 +143,10 @@ export default {
|
|||||||
{ Format: "vplayer", Method: "Embed" },
|
{ Format: "vplayer", Method: "Embed" },
|
||||||
{ Format: "vplayer", Method: "External" },
|
{ Format: "vplayer", Method: "External" },
|
||||||
{ Format: "vplayer", Method: "Encode" },
|
{ Format: "vplayer", Method: "Encode" },
|
||||||
|
{ Format: "vtt", Method: "Embed" },
|
||||||
|
{ Format: "vtt", Method: "External" },
|
||||||
|
{ Format: "vtt", Method: "Encode" },
|
||||||
|
{ Format: "webvtt", Method: "Embed" },
|
||||||
|
{ Format: "webvtt", Method: "External" },
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user