diff --git a/.gitignore b/.gitignore index 24d4aa2..aa6117f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1 @@ -__pycache__ -*.pyc -tags +docs/tags diff --git a/README.md b/README.md index 9012614..ffdb107 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,8 @@ that lazy ![vimedia statusline](statusline.png) In addition to displaying track/artist information in your statusline, you can also navigate -through your media libraries, control volume, etc. using the following commands. +through your media libraries, control volume, etc. using the following commands. Still slightly +experimental until all base functionality has been implemented. ## Usage - `:Play` => Begin playback from active media player @@ -13,7 +14,6 @@ through your media libraries, control volume, etc. using the following commands. - `:PauseAll` => Pause playback from all running media players - `:Skip` => Skip to next song - `:Prev` => Go back to previous song -- `:Restart` => Replay current song from the beginning - `:Shuffle` => Toggle shuffle for the media player - `:Mute` => Mute audio for all media players - `:Unmute` => Unmute audio for all media players @@ -36,6 +36,8 @@ from within Vim to get a list of options (remember the players need to be runnin ## Coming soon - Seek forward/backwards +- Restart +- Hard previous (instead of just restarting when playback is past a certain point) - Make status bar optional Suggestions/contributions welcome. @@ -43,6 +45,4 @@ Suggestions/contributions welcome. ## Installation Using your preferred plugin manager or if all else fails: -`git clone https://github.com/alyosha/vimedia ~/.vim/bundle/vimedia` - -You may need to install a newer version of Vim if yours wasn't built with python3. +`git clone https://github.com/alyosha/vimedia ~/.vim/bundle/vimedia` \ No newline at end of file diff --git a/dbus/control_playback b/dbus/control_playback new file mode 100755 index 0000000..659f134 --- /dev/null +++ b/dbus/control_playback @@ -0,0 +1,7 @@ +#!/bin/bash + +dbus-send --session \ +--dest=$1 \ +--print-reply \ +/org/mpris/MediaPlayer2 \ +org.mpris.MediaPlayer2.Player.$2 \ No newline at end of file diff --git a/dbus/get_active_players b/dbus/get_active_players new file mode 100755 index 0000000..1422c2d --- /dev/null +++ b/dbus/get_active_players @@ -0,0 +1,8 @@ +#!/bin/bash + +dbus-send --session \ +--dest=org.freedesktop.DBus \ +--type=method_call \ +--print-reply \ +/org/freedesktop/DBus \ +org.freedesktop.DBus.ListNames | sed -ne '/MediaPlayer/{s/string//;s/^\s*//g;p}' | xargs | sed 's/\s/,/g' \ No newline at end of file diff --git a/dbus/get_metadata b/dbus/get_metadata new file mode 100755 index 0000000..4619385 --- /dev/null +++ b/dbus/get_metadata @@ -0,0 +1,22 @@ +#!/bin/bash + +case $2 in +"Title") + sed_pattern="/title/{n;s/string //;s/variant//;s/\"//g;s/^\s*//g;p}" + ;; +"Artist") + sed_pattern="/artist/{n;n;s/string //;s/\"//g;s/^\s*//g;p}" + ;; +esac + +if [ -z "$sed_pattern" ]; then + exit 1 +fi + +dbus-send \ +--print-reply \ +--dest=$1 \ +/org/mpris/MediaPlayer2 \ +org.freedesktop.DBus.Properties.Get \ +string:'org.mpris.MediaPlayer2.Player' \ +string:'Metadata' | sed -ne "$sed_pattern" \ No newline at end of file diff --git a/dbus/get_property b/dbus/get_property new file mode 100755 index 0000000..6a83b21 --- /dev/null +++ b/dbus/get_property @@ -0,0 +1,25 @@ +#!/bin/bash + +case $2 in +"Volume") + sed_pattern="/double/{s/[[:alpha:]-]//g;s/^\s*//g;p}" + ;; +"Shuffle") + sed_pattern="/boolean/{s/variant//g;s/boolean//g;s/^\s*//g;p}" + ;; +"Position") + sed_pattern="s/^.*int64 //p" + ;; +esac + +if [ -z "$sed_pattern" ]; then + exit 1 +fi + +dbus-send \ +--print-reply \ +--dest=$1 \ +/org/mpris/MediaPlayer2 \ +org.freedesktop.DBus.Properties.Get \ +string:'org.mpris.MediaPlayer2.Player' \ +string:$2 | sed -ne "$sed_pattern" \ No newline at end of file diff --git a/dbus/quit b/dbus/quit new file mode 100755 index 0000000..a4ae236 --- /dev/null +++ b/dbus/quit @@ -0,0 +1,7 @@ +#!/bin/bash + +dbus-send --session \ +--dest=$1 \ +--print-reply \ +/org/mpris/MediaPlayer2 \ +org.mpris.MediaPlayer2.Quit \ No newline at end of file diff --git a/plugin/jobs/get_position b/dbus/set_property similarity index 58% rename from plugin/jobs/get_position rename to dbus/set_property index 88e9b13..4cc5651 100755 --- a/plugin/jobs/get_position +++ b/dbus/set_property @@ -4,6 +4,7 @@ dbus-send \ --print-reply \ --dest=$1 \ /org/mpris/MediaPlayer2 \ -org.freedesktop.DBus.Properties.Get \ +org.freedesktop.DBus.Properties.Set \ string:'org.mpris.MediaPlayer2.Player' \ -string:'Position' | sed -n -e 's/^.*int64 //p' \ No newline at end of file +string:$2 \ +variant:$3:$4 \ No newline at end of file diff --git a/plugin/jobs/get_artist b/plugin/jobs/get_artist deleted file mode 100755 index ea82423..0000000 --- a/plugin/jobs/get_artist +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -dbus-send \ ---print-reply \ ---dest=$1 \ -/org/mpris/MediaPlayer2 \ -org.freedesktop.DBus.Properties.Get \ -string:'org.mpris.MediaPlayer2.Player' \ -string:'Metadata' | sed -ne '/artist/{n;n;s/string //;s/"//g;s/^\s*//g;p}' \ No newline at end of file diff --git a/plugin/jobs/get_title b/plugin/jobs/get_title deleted file mode 100755 index cd6530a..0000000 --- a/plugin/jobs/get_title +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -dbus-send \ ---print-reply \ ---dest=$1 \ -/org/mpris/MediaPlayer2 \ -org.freedesktop.DBus.Properties.Get \ -string:'org.mpris.MediaPlayer2.Player' \ -string:'Metadata' | sed -ne '/title/{n;s/string //;s/variant//;s/"//g;s/^\s*//g;p}' \ No newline at end of file diff --git a/plugin/vimedia.vim b/plugin/vimedia.vim index 4695069..eb46f1a 100644 --- a/plugin/vimedia.vim +++ b/plugin/vimedia.vim @@ -1,81 +1,172 @@ if !has("python3") - echom "vimedia only supported for vim versions built with python3" - finish + echom "vimedia only supported for vim versions built with python3" + finish endif if exists('g:vimedia_plugin_loaded') - finish + finish endif set timeout timeoutlen=1000 ttimeoutlen=0 -"" Point to location of python code -let s:plugin_root_dir = fnamemodify(resolve(expand(':p')), ':h') +let s:plugin_root_dir = fnamemodify(resolve(expand(':p:h')), ':h') -fu! s:init_player_config() - let s:selected_player_suffix = $DEFAULT_VIMEDIA_PLAYER - let s:selected_player_configured = 0 +" *************************************************************************** " +" *************************** D-Bus Commands **************************** " +" *************************************************************************** " + +fu! s:GetActivePlayersCmd() + return s:plugin_root_dir . '/dbus/get_active_players' endfu -call s:init_player_config() +fu! s:GetArtistCmd(player) + return s:plugin_root_dir . '/dbus/get_metadata ' . a:player . " Artist" +endfu -python3 << EOF -import sys -import vim -from os.path import normpath, join +fu! s:GetTitleCmd(player) + return s:plugin_root_dir . '/dbus/get_metadata ' . a:player . " Title" +endfu + +fu! s:GetPositionCmd(player) + return s:plugin_root_dir . '/dbus/get_property ' . a:player . ' Position' +endfu + +fu! s:GetShuffleCmd(player) + return s:plugin_root_dir . '/dbus/get_property ' . a:player . ' Shuffle' +endfu + +fu! s:GetVolumeCmd(player) + return s:plugin_root_dir . '/dbus/get_property ' . a:player . ' Volume' +endfu -plugin_root_dir = vim.eval('s:plugin_root_dir') -python_root_dir = normpath(join(plugin_root_dir, '..', 'python')) -sys.path.insert(0, python_root_dir) +fu! s:SetVolumeCmd(player, volume) + return s:plugin_root_dir . '/dbus/set_property ' . a:player . ' Volume double ' . string(a:volume) +endfu + +fu! s:SetShuffleCmd(player, shuffle_status) + return s:plugin_root_dir . '/dbus/set_property ' . a:player . ' Shuffle boolean ' . a:shuffle_status +endfu + +fu! s:PlayCmd(player) + return s:plugin_root_dir . '/dbus/control_playback ' . a:player . ' Play' +endfu + +fu! s:PauseCmd(player) + return s:plugin_root_dir . '/dbus/control_playback ' . a:player . ' Pause' +endfu + +fu! s:NextCmd(player) + return s:plugin_root_dir . '/dbus/control_playback ' . a:player . ' Next' +endfu + +fu! s:PreviousCmd(player) + return s:plugin_root_dir . '/dbus/control_playback ' . a:player . ' Previous' +endfu -import vimedia -vmd = vimedia.Vimedia() -EOF +fu! s:QuitCmd(player) + return s:plugin_root_dir . '/dbus/quit ' . a:player +endfu " *************************************************************************** " -" *********************** Background Functions ************************** " +" ********************** D-Bus Command Callbacks ************************ " " *************************************************************************** " -fu! s:init_now_playing_config() - let s:current_track_name = "N/A" - let s:current_artist_name = "N/A" - let s:ticker_microseconds = 0 - let s:quit_in_progress = 0 +fu! s:SetPlayerCallback(channel, msg) + for player in split(a:msg, ",") + if stridx(player, s:selected_player_abbrev) != -1 + let s:selected_player = player + endif + endfor endfu -call s:init_now_playing_config() - -fu! GetPositionCallback(channel, msg) - if a:msg == "0" || s:quit_in_progress == 1 +fu! s:GetPositionCallback(channel, msg) + if a:msg == "0" return endif let s:ticker_microseconds = a:msg endfu -fu! GetTitleCallback(channel, msg) - if a:msg == "" || s:quit_in_progress == 1 +fu! s:GetTitleCallback(channel, msg) + if a:msg == "" return endif let s:current_track_name = a:msg endfu -fu! GetArtistCallback(channel, msg) - if a:msg == "" || s:quit_in_progress == 1 +fu! s:GetArtistCallback(channel, msg) + if a:msg == "" return endif let s:current_artist_name = a:msg endfu +fu! s:PlayCallback(channel, msg) + call s:PauseAllPlayers(a:msg) + sleep 5m + call job_start(s:PlayCmd(s:selected_player)) +endfu + +fu! s:PauseAllCallback(channel, msg) + call s:PauseAllPlayers(a:msg) +endfu + +fu! s:MuteCallback(channel, msg) + call s:SetVolumeAll(a:msg, 0.0) +endfu + +fu! s:UnmuteCallback(channel, msg) + call s:SetVolumeAll(a:msg, s:previous_volume) +endfu + +fu! s:ShuffleCallback(channel, msg) + if a:msg == "false" + call job_start(s:SetShuffleCmd(s:selected_player, "true")) + echom "Shuffle status: on" + elseif a:msg == "true" + call job_start(s:SetShuffleCmd(s:selected_player, "false")) + echom "Shuffle status: off" + endif +endfu + +fu! s:SelectPlayerCallback(channel, msg) + let s:abbreviated_names = [] + for player in split(a:msg, ",") + let l:abbreviated_name = substitute(player, "org.mpris.MediaPlayer2.", "", "") + if stridx(l:abbreviated_name, "chromium") != -1 + call add(s:abbreviated_names, "chromium") + else + call add(s:abbreviated_names, l:abbreviated_name) + endif + endfor + let s:active_player_names = s:abbreviated_names + call s:PresentOptions(s:interaction_type_select_player) +endfu + +fu! s:QuitCallback(channel, msg) + call s:init_player_config() + set statusline= +endfu + +" *************************************************************************** " +" ************************** Timer Functions **************************** " +" *************************************************************************** " + +fu! s:init_now_playing_config() + let s:current_track_name = "N/A" + let s:current_artist_name = "N/A" + let s:ticker_microseconds = 0 +endfu + +call s:init_now_playing_config() + fu! s:Refresh(timer) - if s:selected_player_configured == 0 + if s:selected_player == "N/A" return endif - "" DBus system calls will block if not processed as jobs, so we - "" update the now playing properties via async shell script execution. - call job_start(s:plugin_root_dir . '/jobs/get_position ' . s:dest, {"out_cb": "GetPositionCallback"}) - call job_start(s:plugin_root_dir . '/jobs/get_title ' . s:dest, {"out_cb": "GetTitleCallback"}) - call job_start(s:plugin_root_dir . '/jobs/get_artist ' . s:dest, {"out_cb": "GetArtistCallback"}) + call job_start(s:GetPositionCmd(s:selected_player), {"out_cb": function("s:GetPositionCallback")}) + call job_start(s:GetTitleCmd(s:selected_player), {"out_cb": function("s:GetTitleCallback")}) + call job_start(s:GetArtistCmd(s:selected_player), {"out_cb": function("s:GetArtistCallback")}) endfu fu! NowPlayingText() @@ -90,7 +181,7 @@ fu! PlaybackTicker() endfu fu! s:UpdateStatusline(timer) - if s:current_track_name == "N/A" || s:current_artist_name == "N/A" + if s:selected_player == "N/A" || s:current_artist_name == "N/A" || s:current_track_name == "N/A" return endif @@ -100,15 +191,24 @@ fu! s:UpdateStatusline(timer) set statusline+=\%{PlaybackTicker()} endfu -"" Refresh track/artist name and playback ticker every half-second (async) +"" Refresh track/artist name and playback ticker every half-second let timer = timer_start(500, function('s:Refresh'), {'repeat':-1}) -"" Update the status line each second with the latest playback info +"" Update the status line each second with the latest playback info let timer = timer_start(1000, function('s:UpdateStatusline'), {'repeat':-1}) " *************************************************************************** " " ************************* Base Functionality ************************** " " *************************************************************************** " +fu! s:init_player_config() + let s:selected_player_abbrev = $DEFAULT_VIMEDIA_PLAYER + let s:selected_player = "N/A" + + call job_start(s:GetActivePlayersCmd(), {"out_cb": function("s:SetPlayerCallback")}) +endfu + +call s:init_player_config() + let s:interaction_type_select_player = "select_player_interaction" let s:interaction_type_toggle_volume = "toggle_volume_interaction" @@ -120,57 +220,79 @@ let s:toggle_volume_opt_done = "Done" let s:toggle_volume_options = [s:toggle_volume_opt_up, s:toggle_volume_opt_down, s:toggle_volume_opt_done] +fu! s:PauseAllPlayers(players_str) + for player in split(a:players_str, ",") + call job_start(s:PauseCmd(player)) + endfor +endfu + fu! s:Play() abort - python3 vmd.pause_all(False) - python3 vmd.selected_player.play() + call job_start(s:GetActivePlayersCmd(), {"out_cb": function("s:PlayCallback")}) endfu fu! s:Pause() abort - python3 vmd.selected_player.pause() + call job_start(s:PauseCmd(s:selected_player)) endfu fu! s:PauseAll() abort - python3 vmd.pause_all(False) + call job_start(s:GetActivePlayersCmd(), {"out_cb": function("s:PauseAllCallback")}) endfu fu! s:Skip() abort - python3 vmd.selected_player.next() + call job_start(s:NextCmd(s:selected_player)) endfu fu! s:Previous() abort - python3 vmd.selected_player.previous() -endfu - -fu! s:Restart() abort - python3 vmd.selected_player.restart() + call job_start(s:PreviousCmd(s:selected_player)) endfu fu! s:Shuffle() abort - python3 vmd.selected_player.shuffle() + call job_start(s:GetShuffleCmd(s:selected_player), {"out_cb": function("s:ShuffleCallback")}) endfu fu! s:ActivePlayer() abort - if s:selected_player_suffix != "" - echom s:selected_player_configured == 1 ? s:selected_player_suffix : s:selected_player_suffix . " selected but not active" + if s:selected_player_abbrev != "" + echom s:selected_player != "N/A" ? s:selected_player_abbrev : s:selected_player_abbrev . " selected but not active" else echom "No media player configured" endif endfu +fu! s:SetVolumeAll(players_str, volume) abort + for player in split(a:players_str, ",") + call job_start(s:SetVolumeCmd(s:selected_player, a:volume)) + endfor +endfu + +fu! s:ToggleVolume() abort + let l:selected_opt = expand("") + if l:selected_opt == s:toggle_volume_opt_up + let l:next_volume = s:previous_volume + 0.1 + let s:previous_volume = l:next_volume + call job_start(s:SetVolumeCmd(s:selected_player, l:next_volume)) + elseif l:selected_opt == s:toggle_volume_opt_down + let l:next_volume = s:previous_volume - 0.1 + let s:previous_volume = l:next_volume + call job_start(s:SetVolumeCmd(s:selected_player, l:next_volume)) + elseif l:selected_opt == s:toggle_volume_opt_done + close + endif +endfu + +fu! s:AdjustVolume() abort + call s:PresentOptions(s:interaction_type_toggle_volume) +endfu + fu! s:Mute() abort - python3 vmd.set_volume_global(0.0) + call job_start(s:GetActivePlayersCmd(), {"out_cb": function("s:MuteCallback")}) endfu fu! s:Unmute() abort - python3 vmd.set_volume_global(vim.eval("s:previous_volume")) + call job_start(s:GetActivePlayersCmd(), {"out_cb": function("s:UnmuteCallback")}) endfu fu! s:Quit() abort - let s:quit_in_progress = 1 - python3 vmd.base.quit() - call s:init_player_config() - set statusline= - let s:quit_in_progress = 0 + call job_start(s:QuitCmd(s:selected_player), {"out_cb": function("s:QuitCallback")}) endfu fu! s:PresentOptions(interaction_type) abort @@ -178,7 +300,6 @@ fu! s:PresentOptions(interaction_type) abort setl bh=wipe bt=nofile nobl noswf nowrap if a:interaction_type == s:interaction_type_select_player - python3 vmd.update_player_options() sil! 0put = s:active_player_names nno :callSetSelectedPlayer() elseif a:interaction_type == s:interaction_type_toggle_volume @@ -188,31 +309,20 @@ fu! s:PresentOptions(interaction_type) abort sil! $d_ setl noma ro - nno q :close + nno q :close endfu fu! s:SetSelectedPlayer() abort - let s:selected_player_suffix = expand("") - python3 vmd = vimedia.Vimedia() + let s:selected_player_abbrev = expand("") + call job_start(s:GetActivePlayersCmd(), {"out_cb": function("s:SetPlayerCallback")}) call s:init_now_playing_config() set statusline= echom "Updated active player" close endfu -fu! s:ToggleVolume() abort - let l:selected_opt = expand("") - if l:selected_opt == s:toggle_volume_opt_up - python3 vmd.adjust_volume_global(0.1) - elseif l:selected_opt == s:toggle_volume_opt_down - python3 vmd.adjust_volume_global(-0.1) - elseif l:selected_opt == s:toggle_volume_opt_done - close - endif -endfu - -fu! s:CheckPlayer(fn, ...) abort - if s:selected_player_configured == 0 +fu! s:CheckPlayer(fn) abort + if s:selected_player == "N/A" echom "Please select an active media player" return endif @@ -230,14 +340,14 @@ com! -nargs=0 Skip call s:CheckPlayer(function("s:Skip")) com! -nargs=0 Prev call s:CheckPlayer(function("s:Previous")) com! -nargs=0 Restart call s:CheckPlayer(function("s:Restart")) com! -nargs=0 Shuffle call s:CheckPlayer(function("s:Shuffle")) +com! -nargs=0 Vol call s:CheckPlayer(function("s:AdjustVolume")) com! -nargs=0 Quit call s:CheckPlayer(function("s:Quit")) "" Do not require selected media player com! -nargs=0 PauseAll call s:PauseAll() com! -nargs=0 Mute call s:Mute() -com! -nargs=0 Unmute call s:Unmute() -com! -nargs=0 Vol call s:PresentOptions(s:interaction_type_toggle_volume) -com! -nargs=0 SelectPlayer call s:PresentOptions(s:interaction_type_select_player) +com! -nargs=0 Unmute call s:Unmute() +com! -nargs=0 SelectPlayer call job_start(s:GetActivePlayersCmd(), {"out_cb": function("s:SelectPlayerCallback")}) com! -nargs=0 ActivePlayer call s:ActivePlayer() -let g:vimedia_plugin_loaded = 1 +let g:vimedia_plugin_loaded = 1 \ No newline at end of file diff --git a/python/base.py b/python/base.py deleted file mode 100644 index eac0445..0000000 --- a/python/base.py +++ /dev/null @@ -1,12 +0,0 @@ -from mpris import Mpris - - -class Base(Mpris): - - INTERFACE_NAME = "org.mpris.MediaPlayer2" - - def __init__(self, name): - super().__init__(name) - - def quit(self): - self.iface.Quit() diff --git a/python/mpris.py b/python/mpris.py deleted file mode 100644 index e8a0410..0000000 --- a/python/mpris.py +++ /dev/null @@ -1,22 +0,0 @@ -from util import normalize_player_name -import dbus - - -class Mpris(): - - def __init__(self, name): - self.system_name = name - self.name = normalize_player_name(name) - self.bus = dbus.SessionBus(private=True) - self.dbus_object = self.bus.get_object(name, "/org/mpris/MediaPlayer2") - self.iface = dbus.Interface(self.dbus_object, self.INTERFACE_NAME) - self.properties = dbus.Interface( - self.dbus_object, - "org.freedesktop.DBus.Properties", - ) - - def get_property(self, prop_name): - return self.properties.Get(self.INTERFACE_NAME, prop_name) - - def set_property(self, prop_name, value): - return self.properties.Set(self.INTERFACE_NAME, prop_name, value) diff --git a/python/player.py b/python/player.py deleted file mode 100644 index 50e008e..0000000 --- a/python/player.py +++ /dev/null @@ -1,86 +0,0 @@ -from mpris import Mpris -from time import sleep -import vim -import dbus - - -class Player(Mpris): - - INTERFACE_NAME = "org.mpris.MediaPlayer2.Player" - - def __init__(self, name): - super().__init__(name) - - def play(self): - try: - self.iface.Play() - except dbus.exceptions.DBusException: - print("Must start first song from media player to set the play source") - - def pause(self): - self.iface.Pause() - - def next(self): - try: - self.iface.Next() - except: - return - - def previous(self): - start_track = self.get_title() - try: - self.set_volume(dbus.Double(0.0)) - self.iface.Previous() - except: - return - sleep(0.5) # Need to sleep a bit to ensure new metadata has arrived. - if self.get_title() == start_track: - try: - self.set_volume(dbus.Double(vim.eval("s:previous_volume"))) - self.iface.Previous() - except: - return - - def restart(self): - start_track = self.get_title() - self.iface.Previous() - sleep(0.5) # Need to sleep a bit or the Next call will be ignored. - if self.get_title() == start_track: - return - self.iface.Next() - - def set_volume(self, value): - self.set_property('Volume', value) - - def adjust_volume(self, value): - previous_volume = self.get_property('Volume') - self.set_property('Volume', previous_volume + value) - - # If these are equal, volume must not be configurable for the player. - if self.get_property('Volume') != previous_volume: - vim.command('let s:previous_volume = ' + str(previous_volume)) - - def shuffle(self): - try: - previous_status = self.get_property('Shuffle') - self.set_property('Shuffle', not previous_status) - print("Shuffle status: " + ("on" if previous_status == 0 else "off")) - except: - print(self.name + " has not implemented Shuffle yet") - - def get_title(self): - metadata = self.get_metadata() - - if metadata != None: - try: - title = metadata["xesam:title"] - except: - return "" - - return str(title) - - def get_metadata(self): - try: - return self.get_property('Metadata') - except: - return None diff --git a/python/util.py b/python/util.py deleted file mode 100644 index 886d582..0000000 --- a/python/util.py +++ /dev/null @@ -1,33 +0,0 @@ -import dbus - -MPRIS_PREFIX = "org.mpris.MediaPlayer2." -CHROMIUM_PATTERN = "chromium" - - -def get_active_player_names(): - names = dbus.SessionBus(private=True).list_names() - return list(filter(lambda name: name.startswith(MPRIS_PREFIX), names)) - - -def get_selected_player_name(selected_player_suffix): - if selected_player_suffix == "": - return "" - - for active_player_name in get_active_player_names(): - if selected_player_suffix in active_player_name: - return active_player_name - - return "" - - -def normalize_player_name(dbus_name): - name = str(dbus_name).replace(MPRIS_PREFIX, "", 1) - - if CHROMIUM_PATTERN in name: - return CHROMIUM_PATTERN - - return name - - -def to_vim_string(val): - return '\"' + val + '\"' diff --git a/python/vimedia.py b/python/vimedia.py deleted file mode 100644 index 11aed3c..0000000 --- a/python/vimedia.py +++ /dev/null @@ -1,44 +0,0 @@ -from player import Player -from base import Base -from util import get_selected_player_name, get_active_player_names, normalize_player_name, to_vim_string -import vim -import dbus - - -class Vimedia(): - - def __init__(self): - selected_player_name = get_selected_player_name( - vim.eval('s:selected_player_suffix')) - - if selected_player_name == "": - return - - self.base = Base(selected_player_name) - self.selected_player = Player(selected_player_name) - - if self.selected_player: - dest = to_vim_string(self.selected_player.system_name) - vim.command('let s:selected_player_configured = ' + str(1)) - vim.command('let s:dest = ' + dest) - - def update_player_options(self): - options = list(map(normalize_player_name, get_active_player_names())) - vim.command('let s:active_player_names = ' + str(options)) - - def pause_all(self, exclude_selected): - selected_player_name = get_selected_player_name( - vim.eval('s:selected_player_suffix')) - - for player in list(map(Player, get_active_player_names())): - if player.name == selected_player_name and exclude_selected: - continue - player.pause() - - def set_volume_global(self, value): - for player in list(map(Player, get_active_player_names())): - player.set_volume(dbus.Double(value)) - - def adjust_volume_global(self, value): - for player in list(map(Player, get_active_player_names())): - player.adjust_volume(dbus.Double(value))