コード例 #1
0
ファイル: smart_playlist_editor.py プロジェクト: unkie/exaile
    def edit(cls, pl, collection, smart_manager, parent=None):
        """
        Shows a dialog to edit a smart playlist

        :param collection:    Collection object
        :param smart_manager: SmartPlaylistManager object
        :param parent:        Dialog parent

        :returns: New smart playlist, or None
        """
        if not isinstance(pl, playlist.SmartPlaylist):
            return

        from xl.metadata.tags import tag_data

        params = pl.search_params
        state = []

        for param in params:
            (field, op, value) = param
            rev_field = _REV_NMAP[field]

            # because there are duplicates in _TRANS, cannot create a reverse
            # mapping. Instead, search in set of criteria defined for the type
            data_type = field
            data = tag_data.get(field)
            if data is not None:
                data_type = data.type

            for ct in _criteria_types[data_type]:
                rev_op = ct[0]
                if _TRANS[rev_op] == op:
                    break
            else:
                dialogs.error(parent,
                              "Invalid operand for %s, omitting" % rev_field)
                continue

            state.append(([rev_field, rev_op], value))

        state.reverse()

        dialog = FilterDialog(_('Edit Smart Playlist'), parent, CRITERIA)

        dialog.set_transient_for(parent)
        dialog.set_name(pl.name)
        dialog.set_match_any(pl.get_or_match())
        dialog.set_limit(pl.get_return_limit())
        dialog.set_random(pl.get_random_sort())
        dialog.set_state(state)

        cls._attach_sort_widgets(dialog, *pl.get_sort_tags())

        pl = cls._run_edit_dialog(dialog,
                                  collection,
                                  smart_manager,
                                  parent,
                                  orig_pl=pl)
        dialog.destroy()
        return pl
コード例 #2
0
    def edit(cls, pl, collection, smart_manager, parent=None):
        """
            Shows a dialog to edit a smart playlist

            :param collection:    Collection object
            :param smart_manager: SmartPlaylistManager object
            :param parent:        Dialog parent

            :returns: New smart playlist, or None
        """
        if not isinstance(pl, playlist.SmartPlaylist):
            return

        from xl.metadata.tags import tag_data

        params = pl.search_params
        state = []

        for param in params:
            (field, op, value) = param
            rev_field = _REV_NMAP[field]

            # because there are duplicates in _TRANS, cannot create a reverse
            # mapping. Instead, search in set of criteria defined for the type
            data_type = field
            data = tag_data.get(field)
            if data is not None:
                data_type = data.type

            for ct in _criteria_types[data_type]:
                rev_op = ct[0]
                if _TRANS[rev_op] == op:
                    break
            else:
                dialogs.error(parent, "Invalid operand for %s, omitting" % rev_field)
                continue

            state.append(([rev_field, rev_op], value))

        state.reverse()

        dialog = FilterDialog(_('Edit Smart Playlist'), parent, CRITERIA)

        dialog.set_transient_for(parent)
        dialog.set_name(pl.name)
        dialog.set_match_any(pl.get_or_match())
        dialog.set_limit(pl.get_return_limit())
        dialog.set_random(pl.get_random_sort())
        dialog.set_state(state)

        cls._attach_sort_widgets(dialog, *pl.get_sort_tags())

        pl = cls._run_edit_dialog(dialog, collection, smart_manager, parent, orig_pl=pl)
        dialog.destroy()
        return pl
コード例 #3
0
    def get_tag(self, track, tagname, extra):

        data = tag_data.get(tagname)

        if data is not None:
            if data.type == 'int':
                ret = track.get_tag_raw(tagname, join=True)
                if ret is not None:
                    if extra == 0:
                        return int(ret)
                    else:
                        return int(ret) - (int(ret) % extra)
                return

            if data.use_disk:
                return track.get_tag_disk(tagname)

        if tagname == '__grouptagger':
            return list(self.get_track_groups(track))

        return track.get_tag_raw(tagname, join=True)
コード例 #4
0
ファイル: __init__.py プロジェクト: Zarokka/exaile
 def get_tag(self, track, tagname, extra):
     
     data = tag_data.get(tagname)
     
     if data is not None:
         if data.type == 'int':
             ret = track.get_tag_raw(tagname, join=True)
             if ret is not None:
                 if extra == 0:
                     return int(ret)
                 else:
                     return int(ret) - (int(ret) % extra)
             return
         
         if data.use_disk:
             return track.get_tag_disk(tagname)
     
     if tagname == '__grouptagger':
         return list(self.get_track_groups(track))
     
     return track.get_tag_raw(tagname, join=True)
コード例 #5
0
ファイル: properties.py プロジェクト: twa022/exaile
    def _tags_copy(self, tracks):
        l = []
        for track in tracks:
            t = {}
            for tag, tag_info in self.def_tags.items():
                if tag_info.use_disk:
                    tagval = track.get_tag_disk(tag)
                else:
                    tagval = track.get_tag_raw(tag)

                if tagval:
                    if isinstance(tagval, list):
                        t[tag] = tagval[:]
                    else:
                        t[tag] = [tagval]
                else:
                    t[tag] = ['']

                if tag_info.type == 'dblnum':
                    for i, entry in enumerate(t[tag]):
                        if len(entry.split('/')) < 2:
                            t[tag][i] += '/0'

            for tag in track.list_tags():
                if tag not in self.def_tags:
                    tag_info = tag_data.get(tag)
                    if not tag_info or not tag_info.use_disk:
                        tagval = track.get_tag_raw(tag)
                    else:
                        tagval = track.get_tag_disk(tag)
                    if isinstance(tagval, list):
                        t[tag] = tagval[:]
                    else:
                        t[tag] = [tagval]

            l.append(t)

        return l
コード例 #6
0
ファイル: properties.py プロジェクト: exaile/exaile
    def _tags_copy(self, tracks):
        l = []
        for track in tracks:
            t = {}
            for tag, tag_info in self.def_tags.iteritems():
                if tag_info.use_disk:
                    tagval = track.get_tag_disk(tag)
                else:
                    tagval = track.get_tag_raw(tag)

                if tagval:
                    if isinstance(tagval, list):
                        t[tag] = tagval[:]
                    else:
                        t[tag] = [tagval]
                else:
                    t[tag] = ['']

                if tag_info.type == 'dblnum':
                    for i, entry in enumerate(t[tag]):
                        if len(entry.split('/')) < 2:
                            t[tag][i] += '/0'

            for tag in track.list_tags():
                if tag not in self.def_tags:
                    tag_info = tag_data.get(tag)
                    if not tag_info or not tag_info.use_disk:
                        tagval = track.get_tag_raw(tag)
                    else:
                        tagval = track.get_tag_disk(tag)
                    if isinstance(tagval, list):
                        t[tag] = tagval[:]
                    else:
                        t[tag] = [tagval]

            l.append(t)

        return l
コード例 #7
0
ファイル: properties.py プロジェクト: twa022/exaile
 def _write_tag(self, track, tag, value):
     tag_info = tag_data.get(tag)
     if not tag_info or not tag_info.use_disk:
         track.set_tag_raw(tag, value)
     else:
         track.set_tag_disk(tag, value)
コード例 #8
0
ファイル: properties.py プロジェクト: exaile/exaile
 def _write_tag(self, track, tag, value):
     tag_info = tag_data.get(tag)
     if not tag_info or not tag_info.use_disk:
         track.set_tag_raw(tag, value)
     else:
         track.set_tag_disk(tag, value)