1 # -*- coding: ISO-8859-1 -*-
2 #===============================================================================
3 # VLC Player Plugin by A. Lätsch 2007
4 # modified by Volker Christian 2008
6 # This is free software; you can redistribute it and/or modify it under
7 # the terms of the GNU General Public License as published by the Free
8 # Software Foundation; either version 2, or (at your option) any later
10 #===============================================================================
13 from Components.ActionMap import ActionMap
14 from Components.Label import Label
15 from Components.Button import Button
16 from Components.Pixmap import Pixmap
17 from Screens.MessageBox import MessageBox
18 from Screens.Screen import Screen
20 from pyexpat import ExpatError
22 from VlcFileList import VlcFileList
23 from VlcPlayList import VlcPlayList
24 from VlcPlayer import VlcPlayer
28 class VlcMediaListScreen(Screen):
30 <screen size="560,400" position="80,100" name="VlcMediaListScreen" >
31 <ePixmap name="red" position="0,355" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
32 <ePixmap name="green" position="140,355" zPosition="4" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
33 <ePixmap name="yellow" position="280,355" zPosition="4" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" />
34 <ePixmap name="blue" position="420,355" zPosition="4" size="140,40" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" />
35 <widget name="key_red" position="0,355" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
36 <widget name="key_green" position="140,355" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
37 <widget name="key_yellow" position="280,355" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
38 <widget name="key_blue" position="420,355" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
39 <ePixmap size="551,325" alphatest="on" position="5,30" pixmap="skin_default/border_epg.png" />
40 <widget size="320,25" alphatest="on" position="5,10" zPosition="1" name="filelist_button_sel" pixmap="skin_default/epg_now.png" />
41 <widget size="320,25" alphatest="on" position="5,10" zPosition="1" name="playlist_button_sel" pixmap="skin_default/epg_next.png" />
42 <widget valign="center" transparent="1" size="108,22" backgroundColor="#25062748" position="5,10" zPosition="2" name="filelist_text" halign="center" font="Regular;18" />
43 <widget valign="center" transparent="1" size="108,22" backgroundColor="#25062748" position="111,10" zPosition="2" name="playlist_text" halign="center" font="Regular;18" />
44 <widget size="540,320" scrollbarMode="showOnDemand" position="11,35" name="filelist" />
45 <widget size="540,320" scrollbarMode="showOnDemand" position="11,35" name="playlist" />
48 defaultFilter = "(?i)\.(avi|mpeg|mpg|divx|xvid|mp4|mov|ts|vob|wmv|mkv|iso|m3u|pls|xspf)$"
50 def __init__(self, session, server):
51 Screen.__init__(self, session)
52 self.session = session
54 self["filelist"] = VlcFileList(self.getFilesAndDirsCB, server.getBasedir(), self.defaultFilter)
55 self["playlist"] = VlcPlayList(self.getPlaylistEntriesCB)
56 self["key_red"] = Button(_("filter off"))
57 self["key_green"] = Button(_("refresh"))
58 self["key_yellow"] = Button("")
59 self["key_blue"] = Button(_("play DVD"))
60 self["filelist_button_sel"] = Pixmap()
61 self["playlist_button_sel"] = Pixmap()
62 self["more_button_sel"] = Pixmap()
63 self["filelist_text"] = Label(_("Filelist"))
64 self["playlist_text"] = Label(_("Playlist"))
65 self["server_name"] = Label(server.getName())
66 self["current_dir"] = Label()
68 self["actions"] = ActionMap(["WizardActions", "MenuActions", "ShortcutActions", "MoviePlayerActions", "EPGSelectActions"],
71 "red": self.keyFilter,
73 "yellow": self.switchLists,
80 "prevBouquet": self.switchToFileList,
81 "nextBouquet": self.switchToPlayList,
83 self.currentList = None
86 self.onClose.append(self.__onClose)
87 self.onFirstExecBegin.append(self.__onFirstExecBegin)
89 def __onFirstExecBegin(self):
90 self.setTitle("vlc://" + (self.server.getName() or self.server.getHost()) + "/" + self.server.getBasedir())
91 self["current_dir"].setText(self.server.getBasedir())
95 for id in self.playlistIds:
96 self.server.delete(id)
101 self.updateFilelist()
102 self.updatePlaylist()
103 if self.currentList == self["playlist"]:
104 self.switchToPlayList()
106 self.switchToFileList()
108 def updatePlaylist(self):
109 self["playlist"].update()
111 def updateFilelist(self):
112 self["filelist"].update()
115 if self["filelist"].regex is None:
116 self["filelist"].changeRegex(self.defaultFilter)
117 self["key_red"].setText(_("filter off"))
119 self["filelist"].changeRegex(None)
120 self["key_red"].setText(_("filter on"))
122 self.updateFilelist()
125 MessageBox, _("Error updating filelist from server %s:\n%s" % (
126 self.server.getName(), e)
127 ), MessageBox.TYPE_ERROR)
130 self.play("dvdsimple://" + self.server.getDvdPath(), "DVD")
133 self.currentList.up()
136 self.currentList.down()
139 self.currentList.pageUp()
142 self.currentList.pageDown()
144 def play(self, media, name):
145 dlg = self.session.open(VlcPlayer, self.server, self.currentList)
146 dlg.playfile(media, name)
149 media, name = self.currentList.activate()
150 if media is not None:
151 if media.lower().endswith(".m3u") or media.lower().endswith(".pls") or media.lower().endswith(".xspf"):
153 id = self.server.loadPlaylist(media)
155 self.playlistIds.append(id)
156 self.updatePlaylist()
157 self.switchToPlayList()
160 MessageBox, _("Error loading playlist %s into server %s:\n%s" % (
161 media, self.server.getName(), e)
162 ), MessageBox.TYPE_ERROR)
163 elif media.lower().endswith(".iso"):
164 self.play("dvdsimple://" + media, "DVD")
166 self.play(media, name)
167 elif name is not None:
168 self.setTitle("vlc://" + (self.server.getName() or self.server.getHost()) + "/" + name)
169 self["current_dir"].setText(name)
171 def getFilesAndDirsCB(self, currentDirectory, regex):
173 return self.server.getFilesAndDirs(currentDirectory, regex)
174 except ExpatError, e:
176 MessageBox, _("Error loading playlist into server %s:\n%s" % (
177 self.server.getName(), e)
178 ), MessageBox.TYPE_ERROR)
182 MessageBox, _("Error loading filelist into server %s:\n%s" % (
183 self.server.getName(), e)
184 ), MessageBox.TYPE_ERROR)
187 def getPlaylistEntriesCB(self):
189 return self.server.getPlaylistEntries()
190 except ExpatError, e:
192 MessageBox, _("Error loading playlist into server %s:\n%s" % (
193 self.server.getName(), e)
194 ), MessageBox.TYPE_ERROR)
197 MessageBox, _("Error loading playlist into server %s:\n%s" % (
198 self.server.getName(), e)
199 ), MessageBox.TYPE_ERROR)
202 def switchLists(self):
203 if self.currentList == self["filelist"]:
204 self.switchToPlayList()
206 self.switchToFileList()
208 def switchToFileList(self):
209 self["filelist"].selectionEnabled(1)
210 self["filelist"].show()
211 self["filelist_button_sel"].show()
212 self["playlist"].selectionEnabled(0)
213 self["playlist"].hide()
214 self["playlist_button_sel"].hide()
215 self.currentList = self["filelist"]
216 self["key_yellow"].setText(_("show playlist"))
218 def switchToPlayList(self):
219 self["filelist"].selectionEnabled(0)
220 self["filelist"].hide()
221 self["filelist_button_sel"].hide()
222 self["playlist"].selectionEnabled(1)
223 self["playlist"].show()
224 self["playlist_button_sel"].show()
225 self.currentList = self["playlist"]
226 self["key_yellow"].setText(_("show filelist"))