Changeset 18

Show
Ignore:
Timestamp:
07/03/07 19:25:58 (5 years ago)
Author:
dlefevre
Message:

Added:
- add song to playlist
- now playins view to control the player

Updated:
- audio queries
- opcode updated
- language dictionary

Location:
mymrc/trunk/mymrc/src
Files:
1 removed
7 modified

Legend:

Unmodified
Added
Removed
  • mymrc/trunk/mymrc/src/db/audioqueries.py

    r16 r18  
    115115     
    116116    ## Get all available playlists. 
    117     def playlists(self): 
    118         query="""SELECT name FROM audio_playlist ORDER BY name;""" 
     117    def playlists(self, raw=False): 
     118        if raw: 
     119            query="""SELECT * FROM audio_playlist ORDER BY name;""" 
     120        else: 
     121            query="""SELECT name FROM audio_playlist ORDER BY name;""" 
    119122        return self._iDB.execute(query) 
    120123     
     
    122125    #  ID, determined after the playlist was selected). 
    123126    #  NOTE: this is not tested, just a guess. 
    124     def playlistSongs(self): 
     127    def playlistSongs(self, aPlaylist): 
    125128        query="""SELECT audio_song.id AS id, 
    126129       audio_song.path AS path, 
     
    136139      audio_song.genre_id = audio_genre.id AND 
    137140      audio_song.id = audio_playlist_data.song_id AND 
    138       audio_playlist_data.playlist_id = <ID of the selected playlist> 
     141      audio_playlist_data.playlist_id = (SELECT id FROM audio_playlist WHERE name='%s') 
    139142ORDER BY audio_artist.name, audio_album.title, audio_song.title;""" 
    140         return self._iDB.execute(query) 
     143        return self._iDB.execute(query%(aPlaylist)) 
    141144     
    142145    def songById(self, aId): 
    143146        query = """ SELECT path FROM audio_song WHERE id=%s""" %(aId) 
    144147        return self._iDB.execute(query).fetchall() 
     148     
     149     
     150    def addSongToPlaylist(self, aPlaylistId, aSongId): 
     151        query = """ INSERT INTO audio_playlist_data(playlist_id, song_id)  
     152values('%s', '%s')""" 
     153        return self._iDB.execute(query%(aPlaylistId, aSongId)) 
     154 
    145155 
    146156     
  • mymrc/trunk/mymrc/src/db/dbdriver.py

    r16 r18  
    181181INSERT INTO audio_genre(id, name) VALUES(124, 'Euro-House'); 
    182182INSERT INTO audio_genre(id, name) VALUES(125, 'Dance Hall'); 
     183 
     184INSERT INTO audio_playlist(name) values ('Favourites') 
    183185""" 
    184186 
  • mymrc/trunk/mymrc/src/lang.conf

    r14 r18  
    2828AllVideos = All videos 
    2929AllPlaylists = All playlists 
    30 Play = Play         
     30PlayingNow = Playing Now 
     31Play = Play      
     32PlayPause = Play/Pause 
     33Stop = Stop   
     34Forward = Forward  
     35Backward = Backward 
     36Next = Next 
     37Previous = Previous 
     38VolumeUp = Volume up 
     39VolumeDown = Volume down 
     40FullScreen = Full screen 
     41ToogleControls = Toogle controls 
     42Close = Close 
    3143         
    32          
  • mymrc/trunk/mymrc/src/mobileclient/appuifw.py

    r14 r18  
    2626     
    2727     
    28     def addString(self, aLabel, aText): 
     28    def addString(self, aLabel=None, aText=None): 
    2929        self._iForm += """    <string label="%s" text="%s"/>\n""" % (aLabel, aText) 
    3030     
     
    4444         
    4545     
    46     def addCommand(self): 
    47         self._iForm += """    <command label="text" opcode="opcode"/>\n""" 
     46    def addCommand(self, aType, aLabel, aOpcode): 
     47        self._iForm += """    <command type="%s" label="%s" opcode="%s"/>\n"""\ 
     48            % (aType, aLabel, aOpcode) 
    4849     
    4950     
    5051    def getForm(self): 
    51         self._iForm += """</form>""" 
    52         return self._iForm 
     52        #self._iForm += """</form>""" 
     53        return self._iForm + """</form>""" 
    5354     
    5455         
  • mymrc/trunk/mymrc/src/mobileclient/clientengine.py

    r14 r18  
    88from db.audioqueries import AudioQueries 
    99from controllers.audiocontroller import AudioController 
     10from mobileclient.opcode import OPCode 
     11from mobileclient.opcode import OPCode 
    1012 
    1113 
     
    6870        lb.addLabel(Lang().label('AllSongs')) 
    6971        actions.append( self.allSongs ) 
     72        id_list.append(0) 
    7073 
    7174        lb.addLabel(Lang().label('Playlists')) 
    7275        actions.append( self.playlists ) 
     76        id_list.append(1) 
    7377 
    7478        lb.addLabel(Lang().label('Artists')) 
    7579        actions.append( self.artists ) 
     80        id_list.append(2) 
    7681         
    7782        lb.addLabel(Lang().label('Albums')) 
    7883        actions.append( self.albums ) 
     84        id_list.append(3) 
    7985         
    8086        lb.addLabel(Lang().label('Genres')) 
    8187        actions.append( self.genres ) 
     88        id_list.append(4) 
    8289         
    8390        # Feed options menu 
     
    110117        # Feed options menu 
    111118        lb.addCommand('options', Lang().label('Play'), OPCode()['PLAY']) 
    112         lb.addCommand('options', Lang().label('AddToPlaylist'), OPCode()['DISCONNECT']) 
     119        lb.addCommand('options', Lang().label('AddToPlaylist'), OPCode()['PLADDSONG']) 
    113120        lb.addCommand('options', Lang().label('NowPlaying'), OPCode()['NOWPLAYING']) 
    114121        lb.addCommand('options', Lang().label('Back'), OPCode()['BACK']) 
     
    134141            lb.addLabel(artist) 
    135142            actions.append(lambda:self.artistAlbums(artist)) 
     143            id_list.append(artist) 
    136144         
    137145        # Feed options menu 
     
    166174            lb.addLabel(album) 
    167175            actions.append(lambda:self.artistAlbumSongs(album)) 
     176            id_list.append(album) 
    168177                         
    169178        # Feed options menu 
     
    192201        for song in resultset.fetchall(): 
    193202            lb.addLabel(song[3]) 
     203            id_list.append(song[0]) 
    194204             
    195205        # Feed options menu 
     
    218228        for song in resultset.fetchall(): 
    219229            lb.addLabel(song[3]) 
     230            id_list.append(song[0]) 
    220231             
    221232        # Feed options menu 
     
    245256            lb.addLabel(album) 
    246257            actions.append(lambda:self.albumSongs(album)) 
     258            id_list.append(album) 
    247259             
    248260        # Feed options menu 
     
    272284            lb.addLabel(song[3]) 
    273285            actions.append(lambda:None) 
     286            id_list.append(song[0]) 
    274287             
    275288        # Feed options menu 
     
    283296        self._iActionStack.append(actions) 
    284297        self._iViewStack.append(lb.getList()) 
     298        self._iListStack.append(id_list) 
    285299         
    286300     
     
    298312            lb.addLabel(genre) 
    299313            actions.append(lambda:self.genreSongs(genre)) 
     314            id_list.append(genre) 
    300315         
    301316        # Feed options menu 
     
    324339        for song in resultset.fetchall(): 
    325340            lb.addLabel(song[3]) 
     341            id_list.append(song[0]) 
    326342             
    327343        # Feed options menu 
     
    350366        for playlist in resultset.fetchall(): 
    351367            lb.addLabel(playlist) 
     368            id_list.append(playlist) 
     369            actions.append(lambda:self.playlistSongs(playlist)) 
    352370         
    353371        # Feed options menu 
     
    363381     
    364382     
    365     def playlistSongs(self): 
     383    def playlistSongs(self, aPlaylist): 
    366384        print "Audio playlist" 
    367         playlistName="" 
    368         lb = ListBox(playlistName) 
    369         actions = [] 
    370         id_list = [] 
    371          
    372         db = AudioQueries() 
    373         resultset = db.genreSongs( playlistName ) 
     385        lb = ListBox(aPlaylist) 
     386        actions = [] 
     387        id_list = [] 
     388         
     389        db = AudioQueries() 
     390        resultset = db.playlistSongs(aPlaylist) 
    374391         
    375392        # feed list 
    376393        for song in resultset.fetchall(): 
    377394            lb.addLabel(song[3]) 
     395            id_list.append(song[0]) 
    378396             
    379397        # Feed options menu 
     
    438456        lb.addCommand('options', Lang().label('Select'), OPCode()['SELECT']) 
    439457        lb.addCommand('options', Lang().label('Disconnect'), OPCode()['DISCONNECT']) 
    440         lb.addCommand('options', Lang().label('Settings'), OPCode()['SETTINGS']) 
     458        # lb.addCommand('options', Lang().label('Settings'), OPCode()['SETTINGS']) 
    441459        lb.addCommand('options', Lang().label('About'), OPCode()['ABOUT']) 
    442460        lb.addCommand('options', Lang().label('Exit'), OPCode()['EXIT']) 
     
    445463        self._iViewStack.append(lb.getList()) 
    446464        self._iActionStack.append(action) 
     465    
     466     
     467    def nowPlaying(self): 
     468        lb = ListBox(Lang().label('NowPlaying')) 
     469        actions = [] 
     470        id_list = [] 
     471        lb.addLabel(Lang().label('PlayPause')) 
     472        actions.append(lambda:AudioController().pause()) 
     473         
     474        lb.addLabel(Lang().label('Stop')) 
     475        actions.append(lambda:AudioController().stop()) 
     476         
     477        lb.addLabel(Lang().label('Forward')) 
     478        actions.append(lambda:AudioController().forward()) 
     479         
     480        lb.addLabel(Lang().label('Backward')) 
     481        actions.append(lambda:AudioController().backward()) 
     482         
     483        lb.addLabel(Lang().label('Next')) 
     484        actions.append(lambda:AudioController().next()) 
     485         
     486        lb.addLabel(Lang().label('Previous')) 
     487        actions.append(lambda:AudioController().previous()) 
     488         
     489        lb.addLabel(Lang().label('VolumeUp')) 
     490        actions.append(lambda:AudioController().volume_up()) 
     491         
     492        lb.addLabel(Lang().label('VolumeDown')) 
     493        actions.append(lambda:AudioController().volume_down()) 
     494         
     495        lb.addLabel(Lang().label('FullScreen')) 
     496        actions.append(lambda:AudioController().fullscreen()) 
     497         
     498        lb.addLabel(Lang().label('ToogleControls')) 
     499        actions.append(lambda:AudioController().hide_show_controls()) 
     500 
     501        lb.addLabel(Lang().label('Close')) 
     502        actions.append(lambda:AudioController().close()) 
     503         
     504        lb.addCommand('options', Lang().label('Select'), OPCode()['PLAYER'])  
     505        lb.addCommand('options', Lang().label('Back'), OPCode()['BACK']) 
     506        lb.addCommand('back', Lang().label('Back'), OPCode()['BACK']) 
     507        lb.addCommand('select', Lang().label('Select'), OPCode()['PLAYER'])  
     508        self._iViewStack.append(lb.getList()) 
     509        self._iActionStack.append(actions) 
     510        self._iListStack.append(id_list) 
     511         
     512    def chosePlaylist(self): 
     513        print "Choose playlist"  
     514        lb = ListBox(Lang().label('Playlists')) 
     515        actions = [] 
     516        id_list = [] 
     517         
     518        db = AudioQueries() 
     519        rs = db.playlists(True) 
     520         
     521        for playlist in rs.fetchall(): 
     522            print "playlist: ", playlist[1] 
     523            lb.addLabel(playlist[1]) 
     524            actions.append(lambda:None) 
     525            id_list.append(playlist[0]) 
     526             
     527        lb.addCommand('options', Lang().label('Select'), OPCode()['PLID']) 
     528        lb.addCommand('options', Lang().label('Back'), OPCode()['BACK']) 
     529        lb.addCommand('back', Lang().label('Cancel'), OPCode()['BACK']) 
     530        lb.addCommand('select', Lang().label('Select'), OPCode()['PLID']) 
     531         
     532        print lb.getList() 
     533         
     534        self._iViewStack.append(lb.getList()) 
     535        self._iActionStack.append(actions) 
     536        self._iListStack.append(id_list) 
     537         
     538         
    447539     
    448540    def _audio(self): 
     
    461553    def _TV(self): 
    462554        print "TV" 
     555         
     556     
    463557         
    464558    def getResultset(self): 
     
    478572            self._iViewStack.pop() 
    479573            self._iActionStack.pop() 
     574            self._iListStack.pop() 
    480575        print len(self._iViewStack) 
    481576        return self._iViewStack[-1] 
     
    486581        self.send = aSendCb 
    487582        DBDriver( '/home/dlefevre/workspace/mymrc/src' ) 
     583        self._iSongId = None 
    488584        #self.handle_event(PacketBuilder().build('0000', '')) 
    489585     
    490     def handle_event(self, aEvent): 
    491         print "Event received: ", aEvent 
    492         opcode, length, value = PacketParser().parse(aEvent) 
     586    def handle_event(self, opcode): 
     587        print "Event received: ", opcode 
     588        opcode, length, value = PacketParser().parse(opcode) 
    493589         
    494590        ## UI 
     
    499595        elif opcode == OPCode()['SELECT']: 
    500596            actions = self._iViewEngine.getActions() 
     597            print 'value: ', value 
    501598            actions[int(value)]() 
    502599            retVal = self._iViewEngine.getView() 
     
    506603            retVal = self._iViewEngine.back() 
    507604            self.send(PacketBuilder().build(OPCode()['PARSELS'], retVal)) 
    508          
    509          
     605             
     606        elif opcode == OPCode()['NOWPLAYING']: 
     607            self._iViewEngine.nowPlaying() 
     608            retVal = self._iViewEngine.getView() 
     609            self.send(PacketBuilder().build(OPCode()['PARSELS'], retVal)) 
     610 
     611        elif opcode == OPCode()['PLAYER']: 
     612            action = self._iViewEngine.getActions() 
     613            action[int(value)]() 
     614            self.send(PacketBuilder().build(OPCode()['DUMMY'], '')) 
     615             
     616        ## Playlist 
     617        elif opcode == OPCode()['PLADDSONG']: 
     618            self._iSongId = int(self._iViewEngine.getStack()[int(value)]) 
     619            self._iViewEngine.chosePlaylist() 
     620            retVal = self._iViewEngine.getView() 
     621            self.send(PacketBuilder().build(OPCode()['PARSELS'], retVal)) 
     622             
     623        elif opcode == OPCode()['PLID']: 
     624            db = AudioQueries() 
     625            id = self._iViewEngine.getStack() 
     626            rs = db.addSongToPlaylist(id[int(value)], self._iSongId) 
     627            retVal = self._iViewEngine.back() 
     628            self.send(PacketBuilder().build(OPCode()['PARSELS'], retVal)) 
     629 
     630             
     631             
     632             
     633             
     634         
     635        ## audio player controls 
    510636        # controller 
    511637        elif opcode == OPCode()['PLAY']: 
     
    518644            except: 
    519645                pass 
     646        elif opcode ==  OPCode()["STOP"]: 
     647            AudioController().stop() 
     648            self.send(PacketBuilder().build(OPCode()['DUMMY'], '')) 
     649         
     650        elif opcode ==  OPCode()["PAUSE"]: 
     651            AudioController().pause() 
     652            self.send(PacketBuilder().build(OPCode()['DUMMY'], '')) 
     653         
     654        elif opcode ==  OPCode()["NEXT"]: 
     655            AudioController().next() 
     656            self.send(PacketBuilder().build(OPCode()['DUMMY'], '')) 
     657         
     658        elif opcode ==  OPCode()["CLOSE"]: 
     659            AudioController().close() 
     660            self.send(PacketBuilder().build(OPCode()['DUMMY'], '')) 
     661                     
     662        elif opcode ==  OPCode()["PREVIOUS"]: 
     663            AudioController().previous() 
     664            self.send(PacketBuilder().build(OPCode()['DUMMY'], '')) 
     665         
     666        elif opcode ==  OPCode()["FORWARD"]: 
     667            AudioController().forward() 
     668            self.send(PacketBuilder().build(OPCode()['DUMMY'], '')) 
     669         
     670        elif opcode ==  OPCode()["BACKWARD"]: 
     671            AudioController().backward() 
     672            self.send(PacketBuilder().build(OPCode()['DUMMY'], '')) 
     673         
     674        elif opcode ==  OPCode()["VINC"]: 
     675            AudioController().volume_up() 
     676            self.send(PacketBuilder().build(OPCode()['DUMMY'], '')) 
     677         
     678        elif opcode ==  OPCode()["VDEC"]: 
     679            AudioController().volume_down() 
     680            self.send(PacketBuilder().build(OPCode()['DUMMY'], '')) 
     681         
     682        elif opcode ==  OPCode()["FULL"]: 
     683            AudioController().fullscreen() 
     684            self.send(PacketBuilder().build(OPCode()['DUMMY'], '')) 
     685         
     686        elif opcode ==  OPCode()["TOGG"]: 
     687            AudioController().hide_show_controls() 
     688            self.send(PacketBuilder().build(OPCode()['DUMMY'], '')) 
     689             
     690         
     691         
     692 
    520693         
    521694         
     
    563736    #print AudioView().playlistSongs() 
    564737     
    565     query = """ INSERT INTO song (title, path) values ('Gin Blossoms - Allison Road', '/home/storage/Music/Gin Blossoms - Allison Road.mp3')""" 
    566     query = """SELECT * FROM song""" 
     738    query = """SELECT * FROM audio_playlist_data""" 
    567739    rs = DBDriver().execute(query) 
    568740    print rs.fetchall() 
    569  
    570      
     741     
     742    query = """SELECT * FROM audio_playlist""" 
     743    rs = DBDriver().execute(query) 
     744    print rs.fetchall() 
     745 
     746    query = """SELECT * FROM audio_song""" 
     747    rs = DBDriver().execute(query) 
     748    print rs.fetchall() 
     749 
     750 
     751    db = AudioQueries() 
     752    rs = db.playlists() 
     753    print rs.fetchall() 
     754     
     755    
    571756    def send(aData): 
    572757        print aData 
     
    576761    while True: 
    577762        entry = raw_input('>>>').strip() 
    578         if entry == 'hello': 
     763        if entry == 'h': 
    579764            engine.handle_event(PacketBuilder().build(OPCode()['HELLO'],'')) 
    580         elif entry == 'select': 
     765        elif entry == 's': 
    581766            entry = raw_input('Index >>>').strip() 
    582767            engine.handle_event(PacketBuilder().build(OPCode()['SELECT'], entry) ) 
    583         elif entry == 'back': 
     768        elif entry == 'o': 
     769            entry = raw_input('Index >>>').strip() 
     770            engine.handle_event(PacketBuilder().build(OPCode()['NOWPLAYING'], ''))  
     771        elif entry == 'b': 
    584772            engine.handle_event(OPCode()['BACK']) 
     773         
     774         
     775         
     776         
    585777        elif entry == 'q': 
    586778            break 
  • mymrc/trunk/mymrc/src/mobileclient/opcode.py

    r14 r18  
    1818        self['PAUSE']='0103' 
    1919        self['NEXT']='0104' 
    20         self['LAST']='0105' 
    21         self['FORW']='0106' 
    22         self['BACKW']='0107' 
     20        self['PREVIOUS']='0105' 
     21        self['FORWARD']='0106' 
     22        self['BACKWARD']='0107' 
    2323        self['VINC']='0108' 
    24         self['VDEV']='0109' 
     24        self['VDEC']='0109' 
    2525        self['MUTE']='0110' 
    2626        self['FULL']='0111' 
    2727        self['TOGG']='0112' 
    28         self['ADDPL']='0113' 
     28        self['CLOSE'] = '0113' 
     29        self['PLAYER'] = '0114' 
    2930         
    3031        # internal client event' 
     
    3738        # Playlist events 
    3839        self['PLNEW']='0200' 
    39         self['PLADDSONG']='0201' 
    40         self['PLADDARTIST'] = '0202' 
    41         self['PLADDGENRE'] = '0203' 
    42         self['PLADDALBUM'] = '0204' 
     40        self['PLID'] = '0201' 
     41        self['PLADDSONG']='0202' 
     42        self['PLADDARTIST'] = '0203' 
     43        self['PLADDGENRE'] = '0204' 
     44        self['PLADDALBUM'] = '0205' 
    4345         
    44         self['PLREMOVESONG'] = '0205' 
     46        self['PLREMOVESONG'] = '020' 
     47         
     48        self['DUMMY'] = '9999' 
  • mymrc/trunk/mymrc/src/mymrc.conf

    r14 r18  
    11[inet] 
    22#interface=eth0 
    3 port=1234 
     3port=1235 
    44host=11.2.1.4 
    55maxclient=5