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
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)
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
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
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)