Changeset d9e3495e90c4

Show
Ignore:
Timestamp:
03/30/08 22:59:42 (8 months ago)
Author:
milosz@…
Branch:
trunk
Message:

* New rating graphcis
* Add .desktop file, DBus .service files
* Cleanup Python code for trackinfo

Files:
5 added
8 modified

Legend:

Unmodified
Added
Removed
  • mpx/mpx.cc

    r117 r118  
    5858using namespace boost::python; 
    5959 
     60// TODO: Saner API for sources 
    6061#define SOURCE_NONE (-1) 
     62 
     63namespace  
     64{ 
     65        void 
     66        delete_delete_event (GObject * object, GdkEvent*, gpointer data) 
     67        { 
     68                boost::python::object * obj = static_cast<boost::python::object*>(data); 
     69                boost::python::object window = extract<boost::python::object>(obj->attr("window")); 
     70                GObject * cobj_window = ((PyGObject*)(window.ptr()))->obj; 
     71                gtk_widget_destroy(GTK_WIDGET(cobj_window)); 
     72                delete obj; 
     73        } 
     74 
     75        void 
     76        delete_clicked (GObject * object, gpointer data)  
     77        { 
     78                boost::python::object * obj = static_cast<boost::python::object*>(data); 
     79                boost::python::object window = extract<boost::python::object>(obj->attr("window")); 
     80                GObject * cobj_window = ((PyGObject*)(window.ptr()))->obj; 
     81                gtk_widget_destroy(GTK_WIDGET(cobj_window)); 
     82                delete obj; 
     83        } 
     84} 
    6185 
    6286namespace 
     
    970994                        mpx_py_init ();  
    971995 
    972                         m_TrackInfoMain = object((handle<>(borrowed(PyImport_AddModule("__main__"))))); 
    973                         m_TrackInfoDict = m_TrackInfoMain.attr("__dict__"); 
    974  
    975                         std::string script = build_filename(build_filename(DATA_DIR,"scripts"),"trackinfo.py"); 
    976  
    977                         if(file_test(script, FILE_TEST_EXISTS)) 
    978                                 object ignored = exec_file(script.c_str(), 
    979                                      m_TrackInfoDict, 
    980                                      m_TrackInfoDict); 
     996                        m_TrackInfoScript = build_filename(build_filename(DATA_DIR,"scripts"),"trackinfo.py"); 
     997 
    981998                } catch( error_already_set ) { 
    982999                        g_warning("%s; Python Error:", G_STRFUNC); 
     
    14471464        Player::on_cover_clicked () 
    14481465        { 
    1449                 if(m_TrackInfo.ptr()) 
     1466                if(m_TrackInfoScript.empty()) 
     1467                        return; 
     1468 
     1469                object main = object((handle<>(borrowed(PyImport_AddModule("__main__"))))); 
     1470                object dict = main.attr("__dict__"); 
     1471                object obj  = exec_file(m_TrackInfoScript.c_str(), dict, dict); 
     1472 
     1473                if(obj.ptr()) 
    14501474                { 
    14511475                        using namespace boost::python; 
    14521476                        try{ 
    1453                                 object info = m_TrackInfoDict["info"]; 
     1477                                object * info = new object(dict["info"]); 
     1478                                object window = extract<object>(info->attr("window")); 
     1479                                object button = extract<object>(info->attr("close")); 
     1480                                GObject * cobj_window = ((PyGObject*)(window.ptr()))->obj; 
     1481                                GObject * cobj_button = ((PyGObject*)(button.ptr()))->obj; 
     1482 
     1483                                g_signal_connect(cobj_window, "delete-event", G_CALLBACK(delete_delete_event), info); 
     1484                                g_signal_connect(cobj_button, "clicked", G_CALLBACK(delete_clicked), info); 
     1485                                 
    14541486                                // Create a Py Pixbuf 
    14551487                                PyObject *pypixbuf = NULL;  
     
    14611493                                        pypixbufcc = object((handle<>(pypixbuf))); 
    14621494                                } 
    1463                                 info.attr("show")(m_Metadata, pypixbufcc); 
     1495                                info->attr("show")(m_Metadata, pypixbufcc); 
    14641496                        } catch ( error_already_set ) { 
    14651497                                PyErr_Print(); 
    14661498                        } 
    14671499                } 
     1500                else 
     1501                        g_message ("%s: No object", G_STRLOC); 
    14681502        } 
    14691503 
  • mpx/mpx.hh

    r117 r118  
    110110                DBusObjectsT DBusObjects; 
    111111 
     112#if 0 
    112113                boost::python::object m_TrackInfo; 
    113114                boost::python::object m_TrackInfoMain; 
    114115                boost::python::object m_TrackInfoDict; 
     116#endif 
     117 
     118                std::string m_TrackInfoScript; 
    115119 
    116120        Sources *m_Sources; 
  • python/trackinfo.py

    r117 r118  
    2525                self.image = self.xml.get_widget("image") 
    2626                self.close = self.xml.get_widget("close") 
    27                 self.close.connect("clicked",self.close_clicked) 
    28                 self.window.connect("delete-event",self.delete_event) 
     27                #self.close.connect("clicked",self.close_clicked) 
     28                #self.window.connect("delete-event",self.delete_event) 
    2929 
    3030                self.buf = self.textview.get_buffer() 
     
    7070                        rels = mbtrack.getRelations() 
    7171 
     72                        relobj = [] 
     73                        for i in range(7): 
     74                                relobj.append([]) 
     75 
    7276                        # Check if it's a cover 
    7377                        for rel in rels: 
    74                                 if rel.getType() == "http://musicbrainz.org/ns/rel-1.0#Cover": 
    75                                         self.printCover(track, mbtrack, rel) 
    76                                 if rel.getType() == "http://musicbrainz.org/ns/rel-1.0#Composer": 
    77                                         self.printComposer(track, mbtrack, rel) 
    78                                 if rel.getType() == "http://musicbrainz.org/ns/rel-1.0#Instrument": 
    79                                         self.printInstrument(track, mbtrack, rel) 
    80                                 if rel.getType() == "http://musicbrainz.org/ns/rel-1.0#SamplesMaterial": 
    81                                         self.printSamplesMaterial(track, mbtrack, rel) 
    82                                 if rel.getType() == "http://musicbrainz.org/ns/rel-1.0#Remixer": 
    83                                         self.printRemixer(track, mbtrack, rel) 
    84                                 if rel.getType() == "http://musicbrainz.org/ns/rel-1.0#Lyricist": 
    85                                         self.printLyricist(track, mbtrack, rel) 
    86                                 if rel.getType() == "http://musicbrainz.org/ns/rel-1.0#Producer": 
    87                                         self.printProducer(track, mbtrack, rel) 
    88  
     78                                if rel.getDirection() != "backward": 
     79                                        if rel.getType() == "http://musicbrainz.org/ns/rel-1.0#Cover": 
     80                                                relobj[0].append(rel)    
     81                                        if rel.getType() == "http://musicbrainz.org/ns/rel-1.0#Composer": 
     82                                                relobj[1].append(rel)    
     83                                        if rel.getType() == "http://musicbrainz.org/ns/rel-1.0#Instrument": 
     84                                                relobj[2].append(rel)    
     85                                        if rel.getType() == "http://musicbrainz.org/ns/rel-1.0#SamplesMaterial": 
     86                                                relobj[3].append(rel)    
     87                                        if rel.getType() == "http://musicbrainz.org/ns/rel-1.0#Remixer": 
     88                                                relobj[4].append(rel)    
     89                                        if rel.getType() == "http://musicbrainz.org/ns/rel-1.0#Lyricist": 
     90                                                relobj[5].append(rel)    
     91                                        if rel.getType() == "http://musicbrainz.org/ns/rel-1.0#Producer": 
     92                                                relobj[6].append(rel)    
     93 
     94                        funcs = [] 
     95                        funcs.append(self.printCover) 
     96                        funcs.append(self.printComposer) 
     97                        funcs.append(self.printInstrument) 
     98                        funcs.append(self.printSamplesMaterial) 
     99                        funcs.append(self.printRemixer) 
     100                        funcs.append(self.printLyricist) 
     101                        funcs.append(self.printProducer) 
     102 
     103                        for i in range(7): 
     104                                if len(relobj[i]) > 0: 
     105                                        funcs[i](track, mbtrack, relobj[i]) 
    89106 
    90107                self.buf.insert(self.buf.get_end_iter(), "\n\n") 
     
    109126                                print "Couldn't get Last.fm artist info for '" + track.get(AttributeId.attr_artist).val().get_string()  
    110127 
    111         def printCover(self, track, mbtrack, rel): 
    112                 # Workaround for buggy pymusicbrainzl; getTarget() on this rel returns None 
    113                 url = rel.getTargetId() 
    114                 id = url[url.rindex("/")+1:] 
    115  
    116                 cover = self.q.getTrackById(id, self.tinc)       
    117                 coverartist = cover.getArtist() 
    118  
    119                 self.buf.insert_with_tags(self.buf.get_end_iter(), "...is a cover of ") 
    120                 self.buf.insert_with_tags(self.buf.get_end_iter(), cover.getTitle(), self.textTagBold) 
    121                 self.buf.insert_with_tags(self.buf.get_end_iter(), " by ") 
    122                 self.buf.insert_with_tags(self.buf.get_end_iter(), coverartist.getName(), self.textTagBold) 
    123                 self.buf.insert_with_tags(self.buf.get_end_iter(), "") 
    124                 self.buf.insert(self.buf.get_end_iter(), "\n")  
    125                 return True 
    126  
    127         def printComposer(self, track, mbtrack, rel): 
    128                 composer = rel.getTarget() 
    129                 self.buf.insert_with_tags(self.buf.get_end_iter(), "..was originally composed by ") 
    130                 self.buf.insert_with_tags(self.buf.get_end_iter(), composer.getName(), self.textTagBold)  
    131                 self.buf.insert(self.buf.get_end_iter(), "\n")  
    132                 return True 
    133  
    134         def printSamplesMaterial(self, track, mbtrack, rel): 
    135                 url = rel.getTargetId() 
    136                 id = url[url.rindex("/")+1:] 
    137                 sampled = self.q.getTrackById(id, self.tinc) 
    138                 sampledartist = sampled.getArtist() 
     128        def printCover(self, track, mbtrack, rels): 
     129 
     130                for rel in rels: 
     131 
     132                        # Workaround for buggy pymusicbrainzl; getTarget() on this rel returns None 
     133                        url = rel.getTargetId() 
     134                        id = url[url.rindex("/")+1:] 
     135 
     136                        cover = self.q.getTrackById(id, self.tinc)       
     137                        coverartist = cover.getArtist() 
     138 
     139                        self.buf.insert_with_tags(self.buf.get_end_iter(), "...is a cover of ") 
     140                        self.buf.insert_with_tags(self.buf.get_end_iter(), cover.getTitle(), self.textTagBold) 
     141                        self.buf.insert_with_tags(self.buf.get_end_iter(), " by ") 
     142                        self.buf.insert_with_tags(self.buf.get_end_iter(), coverartist.getName(), self.textTagBold) 
     143                        self.buf.insert_with_tags(self.buf.get_end_iter(), "") 
     144                        self.buf.insert(self.buf.get_end_iter(), "\n")  
     145 
     146                return True 
     147 
     148        def printComposer(self, track, mbtrack, rels): 
     149 
     150                self.buf.insert_with_tags(self.buf.get_end_iter(), "...was composed by ") 
     151 
     152                composers = [] 
     153 
     154                for rel in rels: 
     155                        composer = rel.getTarget() 
     156                        composers.append(composer.getName()) 
     157 
     158                 
     159                self.buf.insert_with_tags(self.buf.get_end_iter(), ", ".join(composers), self.textTagBold)  
     160                self.buf.insert(self.buf.get_end_iter(), "\n")  
     161                return True 
     162 
     163        def printSamplesMaterial(self, track, mbtrack, rels): 
     164 
     165                sampled = [] 
     166 
     167                for rel in rels: 
     168                        url = rel.getTargetId() 
     169                        id = url[url.rindex("/")+1:] 
     170                        sampled = self.q.getTrackById(id, self.tinc) 
     171                        sampledartist = sampled.getArtist() 
     172                        sampled.append(sampled.getTitle() + " by " + sampledartist.getName()) 
    139173 
    140174                self.buf.insert_with_tags(self.buf.get_end_iter(), "...contains samples from ") 
    141                 self.buf.insert_with_tags(self.buf.get_end_iter(), sampled.getTitle(), self.textTagBold)  
    142                 self.buf.insert_with_tags(self.buf.get_end_iter(), " by ") 
    143                 self.buf.insert_with_tags(self.buf.get_end_iter(), sampledartist.getTitle(), self.textTagBold)  
    144                 self.buf.insert(self.buf.get_end_iter(), "\n")  
    145                 return True 
    146  
    147         def printRemixer(self, track, mbtrack, rel): 
    148                 url = rel.getTargetId() 
    149                 id = url[url.rindex("/")+1:] 
    150                 remixer = self.q.getArtistById(id, self.tinc) 
     175                self.buf.insert_with_tags(self.buf.get_end_iter(), ", ".join(sampled), self.textTagBold)  
     176                self.buf.insert(self.buf.get_end_iter(), "\n")  
     177                return True 
     178 
     179        def printRemixer(self, track, mbtrack, rels): 
     180 
     181                remixers = [] 
     182 
     183                for rel in rels: 
     184                        url = rel.getTargetId() 
     185                        id = url[url.rindex("/")+1:] 
     186                        remixer = self.q.getArtistById(id, self.tinc) 
     187                        remixers.append(remixer.getName()) 
    151188 
    152189                self.buf.insert_with_tags(self.buf.get_end_iter(), "...was remixed by ") 
    153                 self.buf.insert_with_tags(self.buf.get_end_iter(), remixer.getName(), self.textTagBold)  
    154                 self.buf.insert(self.buf.get_end_iter(), "\n")  
    155                 return True 
    156  
    157         def printProducer(self, track, mbtrack, rel): 
    158                 url = rel.getTargetId() 
    159                 id = url[url.rindex("/")+1:] 
    160                 remixer = self.q.getArtistById(id, self.tinc) 
    161  
     190                self.buf.insert_with_tags(self.buf.get_end_iter(), ", ".join(remixers), self.textTagBold)  
     191                self.buf.insert(self.buf.get_end_iter(), "\n")  
     192                return True 
     193 
     194        def printProducer(self, track, mbtrack, rels): 
     195 
     196                producers = [] 
     197 
     198                for rel in rels: 
     199                        url = rel.getTargetId() 
     200                        id = url[url.rindex("/")+1:] 
     201                        producer = self.q.getArtistById(id, self.tinc) 
     202                        producers.append(producer.getName()) 
     203                         
    162204                self.buf.insert_with_tags(self.buf.get_end_iter(), "...was produced by ") 
    163                 self.buf.insert_with_tags(self.buf.get_end_iter(), remixer.getName(), self.textTagBold)  
    164                 self.buf.insert(self.buf.get_end_iter(), "\n")  
    165                 return True 
    166  
    167         def printLyricist(self, track, mbtrack, rel): 
    168                 lyricist = rel.getTarget()  
    169  
    170                 self.buf.insert_with_tags(self.buf.get_end_iter(), "...has lyrics written by ") 
    171                 self.buf.insert_with_tags(self.buf.get_end_iter(), lyricist.getName(), self.textTagBold)  
    172                 self.buf.insert(self.buf.get_end_iter(), "\n")  
    173                 return True 
    174  
    175         def printProducer(self, track, mbtrack, rel): 
    176                 producer = rel.getTarget()  
     205                self.buf.insert_with_tags(self.buf.get_end_iter(), ", ".join(producers), self.textTagBold)  
     206                self.buf.insert(self.buf.get_end_iter(), "\n")  
     207                return True 
     208 
     209        def printLyricist(self, track, mbtrack, rels): 
     210 
     211                lyricists = [] 
     212 
     213                for rel in rels: 
     214                        lyricist = rel.getTarget()  
     215                        lyricists.append(lyricist.getName()) 
     216 
     217                self.buf.insert_with_tags(self.buf.get_end_iter(), "...has lyrics by ") 
     218                self.buf.insert_with_tags(self.buf.get_end_iter(), ", ".join(lyricists), self.textTagBold)  
     219                self.buf.insert(self.buf.get_end_iter(), "\n")  
     220                return True 
     221 
     222        def printProducer(self, track, mbtrack, rels): 
     223 
     224                producers = [] 
     225 
     226                for rel in rels: 
     227                        producer = rel.getTarget()  
     228                        producers.append(producer.getName()) 
    177229 
    178230                self.buf.insert_with_tags(self.buf.get_end_iter(), "...was produced by ") 
    179                 self.buf.insert_with_tags(self.buf.get_end_iter(), producer.getName(), self.textTagBold)  
    180                 self.buf.insert(self.buf.get_end_iter(), "\n")  
    181                 return True 
    182  
    183         def printInstrument(self, track, mbtrack, rel): 
    184                 return True 
    185  
    186         def close_clicked(self, button): 
    187                 self.window.hide() 
    188                 return True 
    189  
    190         def delete_event(self, window, event): 
    191                 self.window.hide() 
    192                 return True 
    193  
    194  
    195  
     231                self.buf.insert_with_tags(self.buf.get_end_iter(), ", ".join(producers), self.textTagBold)  
     232                self.buf.insert(self.buf.get_end_iter(), "\n")  
     233                return True 
     234 
     235        def printInstrument(self, track, mbtrack, rels): 
     236                return True 
    196237 
    197238info = TrackInfo()