knefas l33t
Joined: 21 Dec 2003 Posts: 828
|
Posted: Sun Jan 09, 2005 2:00 pm Post subject: [FVWM TIP] menu "music player" |
|
|
L'altro giorno mi sono messo a smanettare con i menu di fvwm, sono veramente potenti. Mi e' venuto in mente di usarli per avere una specie di "player", usando mpc e mpd.
In pratica e' un menu dinamico che consente di aggiungere e togliere mp3 alla playlist di mpd, vedere la playlist, fare play/stop/pause ecc...ecc...
Il tutto si compone di alcune righe da aggiungere a .fvwm2rc e di uno scriptino in python (il mio primo scriptino in python, quindi sara' pieno di errori -> ogni suggerimento e' ben accetto!)
Righe da aggiungere a .fvwm2rc
Code: | DestroyMenu MenuMpc
AddToMenu MenuMpc
+ DynamicPopupAction PipeRead `fvwm-menu-mpc -c`
### Stile del menu, ho dovuto metterlo per rallentare un po' il delay dei popup che altrimenti
### 'poppavano" troppo velocemente e con la tastiera non ci stavo dietro ;)
MenuStyle MpcMenu TitleUnderlines0,Hilight3DThin, PopupOffset 0 100, PopupDelay 2000
MenuStyle MpcMenu MenuColorset 0, HilightBack, ActiveColorset 1,BorderWidth 1
MenuStyle MpcMenu Font "Shadow=0 1 SE:xft:Sans:size=11", ItemFormat "%.2|%.5i%.5l%.5i%2.3>%2|",AnimationOff
####### PopUpMancanti.
DestroyFunc FuncFvwmMenuDirectory
AddToFunc FuncFvwmMenuDirectory
+ I PipeRead `case "$0" in \
$[fvwm_audio_dir]*) fvwm-menu-directory --menu-style="MpcMenu" --dir "$0" --command-title='Exec exec ls -dp1 "%d/"* |grep -v "\/$"| sed \"s|$[fvwm_audio_dir]/||\" |mpc add' \
--command-file='Exec exec mpc add "$(echo \"%f\" | sed \"s|$[fvwm_audio_dir]/||\")"' ;; \
"playlist") fvwm-menu-mpc --playlist;; \
esac; `
DestroyFunc FuncFvwmMenuPlaylist
AddToFunc FuncFvwmMenuPlaylist
+ I PipeRead `fvwm-menu-mpc -n \"$0\"`
|
ovviamente bisogna aggiungere da qualche parte nei menu un "popup MenuMpc", ad esempio io ho aggiunto in MenuFvwmRoot la riga
Code: | + %cdaudio_mount.png%"MusicPlayer" Popup MenuMpc
|
poi c'e' bisogno dello script in python fvwm-menu-mpc, che io ho messo in /usr/bin come fvwm-menu-directory, ma basta che sia da qualche parte del PATH e che sia resto eseguibile
Code: | chmod +x /usr/bin/fvwm-menu-mpc
|
qui c'e' lo script (l'ho detto, essendo il mio primo probabilmente e' molto poco ottimizzato e potrebbe essere molto migliorato... )
Code: | #! /usr/bin/env python
import os,string,re,sys,getopt
def printHelp():
print "usage:\n\
-h\t--help\t\tprints this help and exit\n\
-n #xx\t--traknum\treturns the menu for xx track\n\
-p\t--playlist\treturns the menu for the playlist\n\
-c\t--curret\treturns the menu with the current song at the top\n"
def getCommandOutput(command):
child = os.popen(command)
data = child.read()
err = child.close()
if err:
raise RuntimeError, '%s failed w/ exit code %d' % (command, err)
return data
def popAction(trakn):
menu = getCommandOutput("mpc playlist")
menu = menu[0:-1].split('\n')
menuActHeader = "DestroyMenu \"%s\"\nAddToMenu \"%s\"\n+ DynamicPopDownAction DestroyMenu \"%s\"\n" % (trakn,trakn,trakn)
trnum = int(re.search("#\d*",trakn).group()[1:])
menu = '+ %%player_play.png%%"Play" Exec exec mpc play %d' % trnum \
+ '\n+ %%editdelete.png%%"Delete" Exec exec mpc del %d' % trnum \
+ "\n+ \"\" Nop" \
+ '\n+ %%up.png%%"Move up" Exec exec mpc move %d %d' % (trnum, trnum - 1) \
+ '\n+ %%down.png%%"Move down" Exec exec mpc move %d %d' % (trnum, trnum + 1)
print menuActHeader + menu
def popPlay():
menu = getCommandOutput("mpc playlist")
menu = menu[0:-1].split('\n')
menuPlHeader = "DestroyMenu recreate \"playlist\"\nAddToMenu \"playlist\"\n+ DynamicPopDownAction DestroyMenu \"playlist\"\n\
+MissingSubmenuFunction FuncFvwmMenuPlaylist\n"
menu = ["+ %%knob.png%%\"%s\" popup \"playActions%s\" item +100 c" % (elem,elem) for elem in menu]
menu = '\n'.join(menu)
print menuPlHeader + menu
def getcurrent():
current = getCommandOutput("mpc")
current = current[0:-1].split('\n')
if len(current) > 2:
currentSong = "DestroyMenu recreate MenuMpc\nAddToMenu MenuMpc\n+ \"%s\" Title\n+ \"%s\" Title\n+ \"\" Nop\n"\
% (current[0],current[1].replace('%','%%'))
else:
currentSong= "DestroyMenu recreate MenuMpc\nAddToMenu MenuMpc\n+ \"None\" Title\n"
print currentSong + "+ MissingSubmenuFunction FuncFvwmMenuDirectory\n\
+ %player_playlist_2.png%\"Add\" Popup $[fvwm_audio_dir]\n\
+ %player_playlist.png%\"Playlist\" Popup playlist\n\
+ %editdelete.png%\"Clear\" Exec exec mpc clear\n\
+ \"\" Nop\n\
+ %player_play.png%\"Play\" Exec exec mpc play\n\
+ %player_pause.png%\"Pause\" Exec exec mpc pause\n\
+ %player_stop.png%\"Stop\" Exec exec mpc stop\n\
+ \"\" Nop\n\
+ %player_fwd.png%\"Next\" Exec exec mpc next\n\
+ %player_rew.png%\"Prev\" Exec exec mpc prev\n\
+ \"\" Nop\n\
+ %reload.png%\"Repeat\" Exec exec mpc repeat\n\
+ %roll.png%\"Random\" Exec exec mpc random\n\
+ %rebuild.png%\"Shuffle\" Exec exec mpc shuffle\n"
def main(argv):
try:
opts, args = getopt.getopt(argv, "n:cph",["traknum", "current","playlist","help"])
except getopt.GetoptError:
print "unknown argument,quitting"
sys.exit(2)
for opt, arg in opts:
if opt in ("-n","--traknum"):
popAction(arg)
sys.exit(0)
elif opt in ("-c","--current"):
getcurrent()
sys.exit(0)
elif opt in ("-p","--playlist"):
popPlay()
sys.exit(0)
elif opt in ("-h","--help"):
printHelp()
sys.exit(0)
if __name__ == "__main__":
main(sys.argv[1:])
|
per comodita' ho anche messo dei keybindings a mpc, i miei sono questi:
Code: | #mpc commands
Key Space A 4 Exec exec mpc play
Key Space A M Exec exec mpc pause
Key S A 4 Exec exec mpc stop
Key N A 4 Exec exec mpc next
Key P A 4 Exec exec mpc prev
#popup MenuMpc 1 fa il popup per aggiungere un mp3
Key A A 4 popup MenuMpc 1
Key Menu A N popup MenuMpc
|
ah, aggiungo un paio di screen shots (sono di altervista, per cui se non vanno taglia&incolla nella barra degli indirizzi)
http://knefas.altervista.org/img/add.jpg
http://knefas.altervista.org/img/menu.jpg
http://knefas.altervista.org/img/play.jpg
le icone sono prese da quelle del kde o di gnome, se qualcuno le volesse posso fare un tar
con cio' dovrebbe essere tutto, spero di non aver fatto errori copiando e incollando (spero che le righe lunghe non si siano spezzate...) e che magari qualcuno lo trovi utile!
ciao! |
|