Support for default fullscreen and default volume in VLC

This commit is contained in:
Fabio Manganiello 2019-02-21 00:09:02 +01:00
parent c4cd93a6da
commit 9e7f84644b

View file

@ -21,26 +21,25 @@ class MediaVlcPlugin(MediaPlugin):
* **vlc** executable on your system * **vlc** executable on your system
""" """
_default_vlc_args = [] def __init__(self, *args, fullscreen=False, volume=100, **kwargs):
def __init__(self, args=None, *argv, **kwargs):
""" """
Create the vlc wrapper. Create the vlc wrapper.
:param args: Default arguments that will be passed to the vlc executable :param fullscreen: Set to True if you want media files to be opened in
as a list. See `vlc --help` for available options. fullscreen by default (can be overridden by `.play()`) (default: False)
:type args: list[str] :type fullscreen: bool
:param volume: Default media volume (default: 100)
:type volume: int
""" """
super().__init__(*argv, **kwargs) super().__init__(*args, **kwargs)
self.args = self._default_vlc_args
if args:
self.args.update(args)
self._player = None self._player = None
self._playback_rebounce_event = threading.Event() self._playback_rebounce_event = threading.Event()
self._latest_seek = None self._latest_seek = None
self._default_fullscreen = fullscreen
self._default_volume = volume
self._on_stop_callbacks = [] self._on_stop_callbacks = []
@ -58,21 +57,17 @@ class MediaVlcPlugin(MediaPlugin):
'MediaPlayerAudioVolume', 'MediaPlayerAudioVolume',
] if hasattr(vlc.EventType, evt)] ] if hasattr(vlc.EventType, evt)]
def _init_vlc(self, resource, *args): def _init_vlc(self, resource):
import vlc import vlc
if self._player: if self._player:
self._player.stop() self._player.stop()
self._player = None self._player = None
vlc_args = self.args.copy()
if args:
vlc_args.update(args)
for k,v in self._env.items(): for k,v in self._env.items():
os.environ[k] = v os.environ[k] = v
self._player = vlc.MediaPlayer(resource, *vlc_args) self._player = vlc.MediaPlayer(resource)
for evt in self._watched_event_types(): for evt in self._watched_event_types():
self._player.event_manager().event_attach( self._player.event_manager().event_attach(
@ -92,6 +87,7 @@ class MediaVlcPlugin(MediaPlugin):
event.type == EventType.MediaPlayerEndReached: event.type == EventType.MediaPlayerEndReached:
bus.post(MediaStopEvent()) bus.post(MediaStopEvent())
if self._player: if self._player:
self._player.release()
self._player = None self._player = None
self._latest_seek = None self._latest_seek = None
for callback in self._on_stop_callbacks: for callback in self._on_stop_callbacks:
@ -119,7 +115,7 @@ class MediaVlcPlugin(MediaPlugin):
@action @action
def play(self, resource, subtitles=None, *args): def play(self, resource, subtitles=None, fullscreen=None, volume=None):
""" """
Play a resource. Play a resource.
@ -129,9 +125,13 @@ class MediaVlcPlugin(MediaPlugin):
:param subtitles: Path to optional subtitle file :param subtitles: Path to optional subtitle file
:type subtitles: str :type subtitles: str
:param args: Extra runtime arguments that will be passed to the :param fullscreen: Set to explicitly enable/disable fullscreen (default:
vlc executable as a list `fullscreen` configured value or False)
:type args: list[str] :type fullscreen: bool
:param volume: Set to explicitly set the playback volume (default:
`volume` configured value or 100)
:type fullscreen: bool
""" """
get_bus().post(MediaPlayRequestEvent(resource=resource)) get_bus().post(MediaPlayRequestEvent(resource=resource))
@ -143,7 +143,7 @@ class MediaVlcPlugin(MediaPlugin):
self._is_playing_torrent = True self._is_playing_torrent = True
return get_plugin('media.webtorrent').play(resource) return get_plugin('media.webtorrent').play(resource)
self._init_vlc(resource, *args) self._init_vlc(resource)
if subtitles: if subtitles:
if subtitles.startswith('file://'): if subtitles.startswith('file://'):
subtitles = subtitles[len('file://'):] subtitles = subtitles[len('file://'):]
@ -151,6 +151,14 @@ class MediaVlcPlugin(MediaPlugin):
self._is_playing_torrent = False self._is_playing_torrent = False
self._player.play() self._player.play()
if fullscreen or self._default_fullscreen:
self.set_fullscreen(True)
if volume is not None or self._default_volume is not None:
self.set_volume(volume if volume is not None
else self._default_volume)
return self.status() return self.status()
@ -172,9 +180,7 @@ class MediaVlcPlugin(MediaPlugin):
if not self._player: if not self._player:
return (None, 'No vlc instance is running') return (None, 'No vlc instance is running')
# XXX the .stop() call hangs for some reason
self._player.stop() self._player.stop()
self._player.release()
return { 'state': PlayerState.STOP.value } return { 'state': PlayerState.STOP.value }
@action @action
@ -280,6 +286,13 @@ class MediaVlcPlugin(MediaPlugin):
return (None, 'No vlc instance is running') return (None, 'No vlc instance is running')
self._player.toggle_fullscreen() self._player.toggle_fullscreen()
@action
def set_fullscreen(self, fullscreen=True):
""" Set fullscreen mode """
if not self._player:
return (None, 'No vlc instance is running')
self._player.set_fullscreen(fullscreen)
@action @action
def set_subtitles(self, filename): def set_subtitles(self, filename):
""" Sets media subtitles from filename """ """ Sets media subtitles from filename """