expo-libmpv 0.5.4 → 0.5.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -299,7 +299,6 @@ class LibmpvRenderer(
299
299
  try {
300
300
  loadedUrl = url
301
301
  MPVLib.command(arrayOf("loadfile", url, "replace"))
302
- applyContinuousState()
303
302
  } catch (e: Exception) {
304
303
  logException(e)
305
304
  }
@@ -319,22 +318,24 @@ class LibmpvRenderer(
319
318
  }
320
319
 
321
320
  private fun applyDeferredState() {
322
- if (!mpvAlive || shuttingDown) {
321
+ if (!session.hasFileLoaded || !surfaceAttached || state != State.ACTIVE) {
323
322
  return
324
323
  }
325
324
 
326
325
  session.seekToSeconds?.let { target ->
327
326
  if (session.needsApply(LibmpvSession.MpvIntent.SEEK)) {
328
- val timePos = MPVLib.getPropertyDouble("time-pos")
329
327
  val seekable = MPVLib.getPropertyBoolean("seekable") == true
330
328
 
331
- if (seekable && timePos != null && kotlin.math.abs(timePos - target) > 0.5) {
329
+ if (seekable && surfaceAttached && state == State.ACTIVE) {
330
+ MPVLib.command(arrayOf("set", "pause", "yes"))
332
331
  MPVLib.command(arrayOf("seek", target.toString(), "absolute"))
332
+ MPVLib.command(arrayOf("set", "pause", if (session.isPlaying) "no" else "yes"))
333
333
  session.markApplied(LibmpvSession.MpvIntent.SEEK)
334
334
  }
335
335
  }
336
336
  }
337
337
 
338
+
338
339
  session.selectedAudioTrack?.let {
339
340
  if (session.needsApply(LibmpvSession.MpvIntent.AUDIO_TRACK)) {
340
341
  val aid = if (it == -1) "no" else (it + 1).toString()
@@ -382,7 +383,10 @@ class LibmpvRenderer(
382
383
 
383
384
  override fun event(eventId: Int) {
384
385
  when (eventId) {
385
- MPVLib.MpvEvent.MPV_EVENT_FILE_LOADED,
386
+ MPVLib.MpvEvent.MPV_EVENT_FILE_LOADED -> {
387
+ session.hasFileLoaded = true
388
+ }
389
+
386
390
  MPVLib.MpvEvent.MPV_EVENT_PLAYBACK_RESTART -> {
387
391
  session.hasFileLoaded = true
388
392
  applyDeferredState()
@@ -1 +1 @@
1
- {"version":3,"file":"LibmpvView.d.ts","sourceRoot":"","sources":["../src/LibmpvView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAkC7E,eAAO,MAAM,qBAAqB,EAAE,MAA0B,CAAA;AAE9D,eAAO,MAAM,0BAA0B,EAAE,MAAiD,CAAA;AAE1F,eAAO,MAAM,UAAU,8GA0DrB,CAAA;AAEF,eAAe,UAAU,CAAA"}
1
+ {"version":3,"file":"LibmpvView.d.ts","sourceRoot":"","sources":["../src/LibmpvView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAkC7E,eAAO,MAAM,qBAAqB,EAAE,MAA0B,CAAA;AAE9D,eAAO,MAAM,0BAA0B,EAAE,MAAiD,CAAA;AAE1F,eAAO,MAAM,UAAU,8GA2DrB,CAAA;AAEF,eAAe,UAAU,CAAA"}
@@ -40,31 +40,30 @@ export const LibmpvView = React.forwardRef((props, parentRef) => {
40
40
  };
41
41
  }, []);
42
42
  // Pass mpv events and logs back up to the parent
43
- const onLogEvent = (libmpvEvent) => {
44
- if (props.onLibmpvEvent) {
45
- if (libmpvEvent && libmpvEvent.nativeEvent) {
46
- libmpvEvent = libmpvEvent.nativeEvent;
47
- }
48
- if (libmpvEvent.eventId) {
49
- libmpvEvent.value = parseInt(libmpvEvent.eventId, 10);
50
- libmpvEvent.eventKind = EVENT_LOOKUP[libmpvEvent.eventId];
51
- }
52
- else if (libmpvEvent.kind === 'long' || libmpvEvent.kind === 'double') {
53
- libmpvEvent.value = Number(libmpvEvent.value);
54
- }
55
- else if (libmpvEvent.kind === 'boolean') {
56
- libmpvEvent.value = libmpvEvent.value === 'true';
57
- }
58
- return props.onLibmpvEvent(libmpvEvent);
43
+ const onLogEvent = (e) => {
44
+ if (!props.onLibmpvEvent) {
45
+ return;
59
46
  }
47
+ const src = e?.nativeEvent ?? e;
48
+ const libmpvEvent = { ...src };
49
+ if (libmpvEvent.eventId) {
50
+ libmpvEvent.value = parseInt(libmpvEvent.eventId, 10);
51
+ libmpvEvent.eventKind = EVENT_LOOKUP[libmpvEvent.eventId];
52
+ }
53
+ else if (libmpvEvent.kind === 'long' || libmpvEvent.kind === 'double') {
54
+ libmpvEvent.value = Number(libmpvEvent.value);
55
+ }
56
+ else if (libmpvEvent.kind === 'boolean') {
57
+ libmpvEvent.value = libmpvEvent.value === 'true';
58
+ }
59
+ return props.onLibmpvEvent(libmpvEvent);
60
60
  };
61
- const onLibmpvLog = (libmpvLog) => {
62
- if (props.onLibmpvLog) {
63
- if (libmpvLog && libmpvLog.nativeEvent) {
64
- libmpvLog = libmpvLog.nativeEvent;
65
- }
66
- return props.onLibmpvLog(libmpvLog);
61
+ const onLibmpvLog = (e) => {
62
+ if (!props.onLibmpvLog) {
63
+ return;
67
64
  }
65
+ const src = e?.nativeEvent ?? e;
66
+ return props.onLibmpvLog({ ...src });
68
67
  };
69
68
  // The order props are handled in the native code is non-deterministic
70
69
  // Each native prop setter checks to see if all required props are set
@@ -1 +1 @@
1
- {"version":3,"file":"LibmpvView.js","sourceRoot":"","sources":["../src/LibmpvView.tsx"],"names":[],"mappings":"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","sourcesContent":["import { requireNativeView } from 'expo';\nimport * as React from 'react';\nimport { LibmpvViewProps, LibmpvViewNativeMethods } from './LibmpvViewTypes';\n\nconst styles: any = {\n videoPlayer: {\n position: \"absolute\",\n left: 0,\n bottom: 0,\n right: 0,\n top: 0\n }\n};\n\nconst EVENT_LOOKUP: any = {\n 0: 'NONE',\n 1: 'SHUTDOWN',\n 2: 'LOG_MESSAGE',\n 3: 'GET_PROPERTY_REPLY',\n 4: 'SET_PROPERTY_REPLY',\n 5: 'COMMAND_REPLY',\n 6: 'START_FILE',\n 7: 'END_FILE',\n 8: 'FILE_LOADED',\n 16: 'CLIENT_MESSAGE',\n 17: 'VIDEO_RECONFIG',\n 18: 'AUDIO_RECONFIG',\n 20: 'SEEK',\n 21: 'PLAYBACK_RESTART',\n 22: 'PROPERTY_CHANGE',\n 24: 'QUEUE_OVERFLOW',\n 25: 'HOOK'\n}\n\nconst LibmpvViewNative: React.ComponentType<LibmpvViewProps> = requireNativeView('LibmpvView');\n\nexport const DEFAULT_DECODING_MODE: string = \"mediacodec-copy\"\n\nexport const DEFAULT_ACCELERATED_CODECS: string = \"h264,hevc,mpeg4,mpeg2video,vp8,vp9,av1\"\n\nexport const LibmpvView = React.forwardRef<LibmpvViewNativeMethods, LibmpvViewProps>((props: any, parentRef: any) => {\n React.useEffect(() => {\n return () => {\n if (parentRef?.current?.cleanup) {\n parentRef.current.cleanup();\n }\n };\n }, []);\n\n // Pass mpv events and logs back up to the parent\n const onLogEvent = (libmpvEvent: any) => {\n if (props.onLibmpvEvent) {\n if (libmpvEvent && libmpvEvent.nativeEvent) {\n libmpvEvent = libmpvEvent.nativeEvent\n }\n if (libmpvEvent.eventId) {\n libmpvEvent.value = parseInt(libmpvEvent.eventId, 10)\n libmpvEvent.eventKind = EVENT_LOOKUP[libmpvEvent.eventId]\n }\n else if (libmpvEvent.kind === 'long' || libmpvEvent.kind === 'double') {\n libmpvEvent.value = Number(libmpvEvent.value)\n }\n else if (libmpvEvent.kind === 'boolean') {\n libmpvEvent.value = libmpvEvent.value === 'true'\n }\n return props.onLibmpvEvent(libmpvEvent)\n }\n }\n const onLibmpvLog = (libmpvLog: any) => {\n if (props.onLibmpvLog) {\n if (libmpvLog && libmpvLog.nativeEvent) {\n libmpvLog = libmpvLog.nativeEvent\n }\n return props.onLibmpvLog(libmpvLog);\n }\n }\n\n // The order props are handled in the native code is non-deterministic\n // Each native prop setter checks to see if all required props are set\n // Only then will it try to create an instance of mpv\n\n return <LibmpvViewNative\n ref={parentRef}\n style={props.surfaceStyle ? props.surfaceStyle : styles.videoPlayer}\n videoOutput={props.videoOutput}\n playUrl={props.playUrl}\n isPlaying={props.isPlaying}\n decodingMode={props.decodingMode}\n acceleratedCodecs={props.acceleratedCodecs}\n videoSync={props.videoSync}\n surfaceWidth={props.surfaceWidth}\n surfaceHeight={props.surfaceHeight}\n seekToSeconds={props.seekToSeconds}\n selectedAudioTrack={props.selectedAudioTrack}\n selectedSubtitleTrack={props.selectedSubtitleTrack}\n onLibmpvEvent={onLogEvent}\n onLibmpvLog={onLibmpvLog}\n />\n})\n\nexport default LibmpvView"]}
1
+ {"version":3,"file":"LibmpvView.js","sourceRoot":"","sources":["../src/LibmpvView.tsx"],"names":[],"mappings":"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","sourcesContent":["import { requireNativeView } from 'expo';\nimport * as React from 'react';\nimport { LibmpvViewProps, LibmpvViewNativeMethods } from './LibmpvViewTypes';\n\nconst styles: any = {\n videoPlayer: {\n position: \"absolute\",\n left: 0,\n bottom: 0,\n right: 0,\n top: 0\n }\n};\n\nconst EVENT_LOOKUP: any = {\n 0: 'NONE',\n 1: 'SHUTDOWN',\n 2: 'LOG_MESSAGE',\n 3: 'GET_PROPERTY_REPLY',\n 4: 'SET_PROPERTY_REPLY',\n 5: 'COMMAND_REPLY',\n 6: 'START_FILE',\n 7: 'END_FILE',\n 8: 'FILE_LOADED',\n 16: 'CLIENT_MESSAGE',\n 17: 'VIDEO_RECONFIG',\n 18: 'AUDIO_RECONFIG',\n 20: 'SEEK',\n 21: 'PLAYBACK_RESTART',\n 22: 'PROPERTY_CHANGE',\n 24: 'QUEUE_OVERFLOW',\n 25: 'HOOK'\n}\n\nconst LibmpvViewNative: React.ComponentType<LibmpvViewProps> = requireNativeView('LibmpvView');\n\nexport const DEFAULT_DECODING_MODE: string = \"mediacodec-copy\"\n\nexport const DEFAULT_ACCELERATED_CODECS: string = \"h264,hevc,mpeg4,mpeg2video,vp8,vp9,av1\"\n\nexport const LibmpvView = React.forwardRef<LibmpvViewNativeMethods, LibmpvViewProps>((props: any, parentRef: any) => {\n React.useEffect(() => {\n return () => {\n if (parentRef?.current?.cleanup) {\n parentRef.current.cleanup();\n }\n };\n }, []);\n\n // Pass mpv events and logs back up to the parent\n const onLogEvent = (e: any) => {\n if (!props.onLibmpvEvent) {\n return\n }\n\n const src = e?.nativeEvent ?? e;\n const libmpvEvent = { ...src };\n\n if (libmpvEvent.eventId) {\n libmpvEvent.value = parseInt(libmpvEvent.eventId, 10);\n libmpvEvent.eventKind = EVENT_LOOKUP[libmpvEvent.eventId];\n } else if (libmpvEvent.kind === 'long' || libmpvEvent.kind === 'double') {\n libmpvEvent.value = Number(libmpvEvent.value);\n } else if (libmpvEvent.kind === 'boolean') {\n libmpvEvent.value = libmpvEvent.value === 'true';\n }\n\n return props.onLibmpvEvent(libmpvEvent);\n };\n\n const onLibmpvLog = (e: any) => {\n if (!props.onLibmpvLog) {\n return\n }\n const src = e?.nativeEvent ?? e\n return props.onLibmpvLog({ ...src });\n }\n\n // The order props are handled in the native code is non-deterministic\n // Each native prop setter checks to see if all required props are set\n // Only then will it try to create an instance of mpv\n\n return <LibmpvViewNative\n ref={parentRef}\n style={props.surfaceStyle ? props.surfaceStyle : styles.videoPlayer}\n videoOutput={props.videoOutput}\n playUrl={props.playUrl}\n isPlaying={props.isPlaying}\n decodingMode={props.decodingMode}\n acceleratedCodecs={props.acceleratedCodecs}\n videoSync={props.videoSync}\n surfaceWidth={props.surfaceWidth}\n surfaceHeight={props.surfaceHeight}\n seekToSeconds={props.seekToSeconds}\n selectedAudioTrack={props.selectedAudioTrack}\n selectedSubtitleTrack={props.selectedSubtitleTrack}\n onLibmpvEvent={onLogEvent}\n onLibmpvLog={onLibmpvLog}\n />\n})\n\nexport default LibmpvView"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-libmpv",
3
- "version": "0.5.4",
3
+ "version": "0.5.6",
4
4
  "description": "A libmpv Fabric component for Android",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -28,11 +28,11 @@
28
28
  "license": "MIT",
29
29
  "homepage": "https://github.com/XBigTK13X/expo-libmpv#readme",
30
30
  "dependencies": {
31
- "expo-build-properties": "1.0.9"
31
+ "expo-build-properties": "1.0.10"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@types/react": "~19.1.10",
35
- "expo": "54.0.21",
35
+ "expo": "54.0.29",
36
36
  "expo-module-scripts": "^4.1.10",
37
37
  "react": "19.1.0",
38
38
  "react-native": "0.81.5"
@@ -48,31 +48,32 @@ export const LibmpvView = React.forwardRef<LibmpvViewNativeMethods, LibmpvViewPr
48
48
  }, []);
49
49
 
50
50
  // Pass mpv events and logs back up to the parent
51
- const onLogEvent = (libmpvEvent: any) => {
52
- if (props.onLibmpvEvent) {
53
- if (libmpvEvent && libmpvEvent.nativeEvent) {
54
- libmpvEvent = libmpvEvent.nativeEvent
55
- }
56
- if (libmpvEvent.eventId) {
57
- libmpvEvent.value = parseInt(libmpvEvent.eventId, 10)
58
- libmpvEvent.eventKind = EVENT_LOOKUP[libmpvEvent.eventId]
59
- }
60
- else if (libmpvEvent.kind === 'long' || libmpvEvent.kind === 'double') {
61
- libmpvEvent.value = Number(libmpvEvent.value)
62
- }
63
- else if (libmpvEvent.kind === 'boolean') {
64
- libmpvEvent.value = libmpvEvent.value === 'true'
65
- }
66
- return props.onLibmpvEvent(libmpvEvent)
51
+ const onLogEvent = (e: any) => {
52
+ if (!props.onLibmpvEvent) {
53
+ return
67
54
  }
68
- }
69
- const onLibmpvLog = (libmpvLog: any) => {
70
- if (props.onLibmpvLog) {
71
- if (libmpvLog && libmpvLog.nativeEvent) {
72
- libmpvLog = libmpvLog.nativeEvent
73
- }
74
- return props.onLibmpvLog(libmpvLog);
55
+
56
+ const src = e?.nativeEvent ?? e;
57
+ const libmpvEvent = { ...src };
58
+
59
+ if (libmpvEvent.eventId) {
60
+ libmpvEvent.value = parseInt(libmpvEvent.eventId, 10);
61
+ libmpvEvent.eventKind = EVENT_LOOKUP[libmpvEvent.eventId];
62
+ } else if (libmpvEvent.kind === 'long' || libmpvEvent.kind === 'double') {
63
+ libmpvEvent.value = Number(libmpvEvent.value);
64
+ } else if (libmpvEvent.kind === 'boolean') {
65
+ libmpvEvent.value = libmpvEvent.value === 'true';
66
+ }
67
+
68
+ return props.onLibmpvEvent(libmpvEvent);
69
+ };
70
+
71
+ const onLibmpvLog = (e: any) => {
72
+ if (!props.onLibmpvLog) {
73
+ return
75
74
  }
75
+ const src = e?.nativeEvent ?? e
76
+ return props.onLibmpvLog({ ...src });
76
77
  }
77
78
 
78
79
  // The order props are handled in the native code is non-deterministic