def __init__(self): super(save_and_rewrite_header, self).__init__() register_file_action(self) register_track_action(self) register_album_action(self) register_cluster_action(self) register_clusterlist_action(self)
def __init__(self): super(NiCeFileAction, self).__init__() register_file_action(self) register_track_action(self) register_album_action(self) register_cluster_action(self) register_clusterlist_action(self)
options = [ IntOption("setting", "bpm_slider_parameter", 1) ] def __init__(self, parent=None): super(BPMOptionsPage, self).__init__(parent) self.ui = Ui_BPMOptionsPage() self.ui.setupUi(self) self.ui.slider_parameter.valueChanged.connect(self.update_parameters) def load(self): cfg = self.config.setting self.ui.slider_parameter.setValue(cfg["bpm_slider_parameter"]) def save(self): cfg = self.config.setting cfg["bpm_slider_parameter"] = self.ui.slider_parameter.value() def update_parameters(self): val = self.ui.slider_parameter.value() samplerate, buf_size, hop_size = [unicode(v) for v in bpm_slider_settings[val]] self.ui.samplerate_value.setText(samplerate) self.ui.win_s_value.setText(buf_size) self.ui.hop_s_value.setText(hop_size) register_file_action(FileBPM()) register_options_page(BPMOptionsPage)
try: atoms = mp4.Atoms(fileobj) try: path = atoms.path("moov", "udta", "meta") except KeyError: pass else: for atom in reversed(path): size = (sum(c.length for c in atom.children) + 8 + mp4._SKIP_SIZE.get(atom.name, 0)) if size != atom.length: fileobj.seek(atom.offset) fileobj.write(struct.pack(">I", size)) atom.length = size modified = True finally: fileobj.close() return modified def callback(self, objs): files = [o for o in objs if isinstance(o, File)] for file in files: if self.fix(encode_filename(file.filename)): self.log.info("fix_mp4_meta: %s - Fixed", file.filename) else: self.log.info("fix_mp4_meta: %s - Not needed", file.filename) QtCore.QCoreApplication.processEvents() register_file_action(FixMp4Meta())
TextOption("setting", "moodbar_wav_command", "moodbar"), TextOption("setting", "moodbar_wav_options", "-o") ] def __init__(self, parent=None): super(MoodbarOptionsPage, self).__init__(parent) self.ui = Ui_MoodbarOptionsPage() self.ui.setupUi(self) def load(self): self.ui.vorbis_command.setText( self.config.setting["moodbar_vorbis_command"]) self.ui.mp3_command.setText(self.config.setting["moodbar_mp3_command"]) self.ui.flac_command.setText( self.config.setting["moodbar_flac_command"]) self.ui.wav_command.setText(self.config.setting["moodbar_wav_command"]) def save(self): self.config.setting["moodbar_vorbis_command"] = unicode( self.ui.vorbis_command.text()) self.config.setting["moodbar_mp3_command"] = unicode( self.ui.mp3_command.text()) self.config.setting["moodbar_flac_command"] = unicode( self.ui.flac_command.text()) self.config.setting["moodbar_wav_command"] = unicode( self.ui.wav_command.text()) register_file_action(MoodBar()) register_options_page(MoodbarOptionsPage)
nv("edit-recording.length", track.metadata["~length"]) class AddFileAsRelease(AddObjectAsEntity): NAME = "Add File As Release..." objtype = File submit_url = 'http://musicbrainz.org/release/add' def set_form_values(self, track): nv = self.add_form_value # Main album attributes if track.metadata["albumartist"]: nv("artist_credit.names.0.artist.name", track.metadata["albumartist"]) else: nv("artist_credit.names.0.artist.name", track.metadata["artist"]) if track.metadata["album"]: nv("name", track.metadata["album"]) else: nv("name", track.metadata["title"]) # Tracklist nv("mediums.0.track.0.name", track.metadata["title"]) nv("mediums.0.track.0.artist_credit.names.0.name", track.metadata["artist"]) nv("mediums.0.track.0.length", str(track.metadata.length)) register_cluster_action(AddClusterAsRelease()) register_file_action(AddFileAsRecording()) register_file_action(AddFileAsRelease())
NAME = "Open file" def callback(self, objs): for obj in objs: if isinstance(obj, File): startfile(obj.filename) break elif isinstance(obj, Track): for linked in obj.linked_files: startfile(linked.filename) return class OpenFolder(BaseAction): NAME = "Open folder" def callback(self, objs): folders = set() for obj in objs: if isinstance(obj, File): folders.add(os.path.dirname(obj.filename)) elif isinstance(obj, Track): for linked in obj.linked_files: folders.add(os.path.dirname(linked.filename)) for folder in folders: startfile(folder) register_file_action(OpenFile()) register_file_action(OpenFolder())
from picard.metadata import register_track_metadata_processor class SearchAMGR(BaseAction): NAME = "Search AMG for Release" def callback(self, objs): cluster = objs[0] url = "http://wc10.allmusic.com/cg/amg.dll?P=amg&opt1=2&sql=" url += QtCore.QUrl.toPercentEncoding(cluster.metadata["album"]) webbrowser2.open(url) register_cluster_action(SearchAMGR()) register_album_action(SearchAMGR()) class SearchAMGA(BaseAction): NAME = "Search AMG for Artist" def callback(self, objs): cluster = objs[0] url = "http://wc09.allmusic.com/cg/amg.dll?P=amg&opt1=1&sql=" url += QtCore.QUrl.toPercentEncoding(cluster.metadata["artist"]) webbrowser2.open(url) register_cluster_action(SearchAMGA()) register_album_action(SearchAMGA()) class SearchAMGT(BaseAction): NAME = "Search AMG for Track" def callback(self, objs): file = objs[0] url = "http://wc10.allmusic.com/cg/amg.dll?P=amg&opt1=3&sql=" url += QtCore.QUrl.toPercentEncoding(file.metadata["title"]) webbrowser2.open(url) register_file_action(SearchAMGT())
register_cluster_action(SearchAMGR()) register_album_action(SearchAMGR()) class SearchAMGA(BaseAction): NAME = "Search AMG for Artist" def callback(self, objs): cluster = objs[0] url = "http://www.allmusic.com/search/artist/" url += QtCore.QUrl.toPercentEncoding(cluster.metadata["albumartist"]) webbrowser2.open(url) register_cluster_action(SearchAMGA()) register_album_action(SearchAMGA()) class SearchAMGTc(BaseAction): NAME = "Search AMG (non-classical music) for Track" def callback(self, objs): file = objs[0] url = "http://www.allmusic.com/search/song/" url += QtCore.QUrl.toPercentEncoding(file.metadata["title"]) webbrowser2.open(url) register_file_action(SearchAMGTc()) class SearchAMGT(BaseAction): NAME = "Search AMG (classical music) for Track" def callback(self, objs): file = objs[0] url = "http://www.allmusic.com/search/work/" url += QtCore.QUrl.toPercentEncoding(file.metadata["title"]) webbrowser2.open(url) register_file_action(SearchAMGT())
self.spacer = QtWidgets.QSpacerItem(0, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.box.addItem(self.spacer) def load(self): self.appendReleaseTypeToAlbum.setChecked( config.setting[r'appendReleaseTypeToAlbum']) self.includeBarcode.setChecked(config.setting[r'includeBarcode']) # self.includeISRC.setChecked(config.setting[r'includeISRC']) self.includeASIN.setChecked(config.setting[r'includeASIN']) self.includeDiscID.setChecked(config.setting[r'includeDiscID']) self.removeMBIDs.setChecked(config.setting[r'removeMBIDs']) def save(self): config.setting[ r'appendReleaseTypeToAlbum'] = self.appendReleaseTypeToAlbum.isChecked( ) config.setting[r'includeBarcode'] = self.includeBarcode.isChecked() # config.setting[r'includeISRC'] = self.includeISRC.isChecked() config.setting[r'includeASIN'] = self.includeASIN.isChecked() config.setting[r'includeDiscID'] = self.includeDiscID.isChecked() config.setting[r'removeMBIDs'] = self.removeMBIDs.isChecked() register_file_action(SuperComment()) register_file_post_addition_to_track_processor(SuperComment().processFile) # register_track_action(SuperComment()) # register_track_metadata_processor(SuperComment().process) register_options_page(SuperCommentOptionsPage)
# -*- coding: utf-8 -*- PLUGIN_NAME = u"Detele Files" PLUGIN_AUTHOR = u"Ovidiu-Florin Bogdan" PLUGIN_DESCRIPTION = "Adds a context menu item that gives the possibility to delete the selected file(s) or track(s) from the filesystem." PLUGIN_VERSION = "0.1" PLUGIN_API_VERSIONS = ["1.0.0"] import os from picard.file import File from picard.track import Track from picard.ui.itemviews import BaseAction, register_file_action class DeleteTheSelectedFiles(BaseAction): NAME = "Delete from filesystem" def callback(self, objs): if len(objs) < 1: return for obj in objs: if isinstance(obj, File): os.remove(obj.filename) obj.remove() elif isinstance(obj, Track): for linked in obj.linked_files: os.remove(linked.filemane) linked.remove() register_file_action(DeleteTheSelectedFiles())
TextOption("setting", "moodbar_wav_options", "-o") ] def __init__(self, parent=None): super(MoodbarOptionsPage, self).__init__(parent) self.ui = Ui_MoodbarOptionsPage() self.ui.setupUi(self) def load(self): self.ui.vorbis_command.setText( self.config.setting["moodbar_vorbis_command"]) self.ui.mp3_command.setText( self.config.setting["moodbar_mp3_command"]) self.ui.flac_command.setText( self.config.setting["moodbar_flac_command"]) self.ui.wav_command.setText( self.config.setting["moodbar_wav_command"]) def save(self): self.config.setting["moodbar_vorbis_command"] = unicode( self.ui.vorbis_command.text()) self.config.setting["moodbar_mp3_command"] = unicode( self.ui.mp3_command.text()) self.config.setting["moodbar_flac_command"] = unicode( self.ui.flac_command.text()) self.config.setting["moodbar_wav_command"] = unicode( self.ui.wav_command.text()) register_file_action(MoodBar()) register_options_page(MoodbarOptionsPage)
self.spacer3 = QtWidgets.QSpacerItem( 0, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.box.addItem(self.spacer3) def load(self): self.apiKeyInput.setText(config.setting[r'gcsAPIKey']) self.idInput.setText(config.setting[r'gcsEngineID']) self.autoFetch.setChecked(config.setting[r'autoFetch']) def save(self): config.setting[r'gcsAPIKey'] = self.apiKeyInput.text() config.setting[r'gcsEngineID'] = self.idInput.text() config.setting[r'autoFetch'] = self.autoFetch.isChecked() register_file_action(OmniLyrics()) register_file_post_addition_to_track_processor(OmniLyrics().processFile, priority=PluginPriority.LOW) # register_track_action(OmniLyrics()) # register_track_metadata_processor(OmniLyrics().processTrack, priority=PluginPriority.LOW) register_options_page(OmniLyricsOptionsPage) else: omnilyrics = OmniLyrics() lyrics = r'' url = re.compile(r'^(https?://|www\.)[\w.-]+/.*$', re.IGNORECASE) if ((len(argv) == 2) and (url.match(argv[-1]))): lyrics = omnilyrics.fetchLyricsFrom(argv[-1]) elif (len(argv) == 4): lyrics = omnilyrics.fetchLyrics(argv[-3], argv[-2], argv[-1])
value = dict.get(metadata, key) if len(value) == 1 and value[0] != '': value = value[0] else: value = repr(value) value_item.setText(value) def add_separator_row(self, table, i, title): key_item, value_item = self.get_table_items(table, i) font = key_item.font() font.setBold(True) key_item.setFont(font) key_item.setText(title) def get_table_items(self, table, i): key_item = table.item(i, 0) value_item = table.item(i, 1) if not key_item: key_item = QtGui.QTableWidgetItem() key_item.setFlags(self.key_flags) table.setItem(i, 0, key_item) if not value_item: value_item = QtGui.QTableWidgetItem() value_item.setFlags(self.value_flags) table.setItem(i, 1, value_item) return key_item, value_item vv = ViewVariables() register_file_action(vv) register_track_action(vv)
class Foobar2000ReplayGainRemove(BaseAction): NAME = _("Foobar2000: &Remove ReplayGain information from files...") def callback(self, objs): run_foobar2000('remove', get_files(objs), self.tagger) class Foobar2000ReplayGainOptionsPage(OptionsPage): NAME = "f2k_rgscan" TITLE = "Foobar2000 ReplayGain" PARENT = "plugins" options = [ TextOption('setting', 'f2k_rgscan_foobar2000_path', get_foobar2000_path()), ] def __init__(self, parent=None): super(Foobar2000ReplayGainOptionsPage, self).__init__(parent) self.ui = Ui_Foobar2000ReplayGainOptionsPage() self.ui.setupUi(self) def load(self): self.ui.foobar2000_path.setText(self.config.setting['f2k_rgscan_foobar2000_path']) def save(self): self.config.setting['f2k_rgscan_foobar2000_path'] = unicode(self.ui.foobar2000_path.text()) register_file_action(Foobar2000ReplayGainScanTrack()) register_file_action(Foobar2000ReplayGainRemove()) register_album_action(Foobar2000ReplayGainScanAlbumByTags()) register_album_action(Foobar2000ReplayGainRemove()) register_options_page(Foobar2000ReplayGainOptionsPage)
if len(value) == 1 and value[0] != '': value = value[0] else: value = repr(value) value_item.setText(value) def add_separator_row(self, table, i, title): key_item, value_item = self.get_table_items(table, i) font = key_item.font() font.setBold(True) key_item.setFont(font) key_item.setText(title) def get_table_items(self, table, i): key_item = table.item(i, 0) value_item = table.item(i, 1) if not key_item: key_item = QtWidgets.QTableWidgetItem() key_item.setFlags(self.key_flags) table.setItem(i, 0, key_item) if not value_item: value_item = QtWidgets.QTableWidgetItem() value_item.setFlags(self.value_flags) table.setItem(i, 1, value_item) return key_item, value_item vv = ViewVariables() register_file_action(vv) register_track_action(vv)
class SearchPUID(BaseAction): NAME = "Lookup PUID" def callback(self, objs): cluster = objs[0] url = "http://musicbrainz.org/show/puid/?puid=" url += QtCore.QUrl.toPercentEncoding(cluster.metadata["musicip_puid"]) if len(cluster.metadata["musicip_puid"]) > 1: webbrowser2.open(url) else: global w w = NoPUID() w.show() register_file_action(SearchPUID()) class NoPUID(QtGui.QDialog): def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) self.setWindowTitle(_("No PUID found")) self.doc = QtGui.QTextDocument(self) self.textCursor = QtGui.QTextCursor(self.doc) font = QtGui.QFont() font.setFixedPitch(True) font.setPointSize(8) font.setWeight(QtGui.QFont.Normal) font.setFamily("") self.textFormat = QtGui.QTextCharFormat() self.textFormat.setFont(font)
class AddFileAsRelease(AddObjectAsEntity): NAME = "Add File As Release..." objtype = File submit_url = 'http://musicbrainz.org/release/add' def set_form_values(self, track): nv = self.add_form_value # Main album attributes if track.metadata["albumartist"]: nv("artist_credit.names.0.artist.name", track.metadata["albumartist"]) else: nv("artist_credit.names.0.artist.name", track.metadata["artist"]) if track.metadata["album"]: nv("name", track.metadata["album"]) else: nv("name", track.metadata["title"]) # Tracklist nv("mediums.0.track.0.name", track.metadata["title"]) nv("mediums.0.track.0.artist_credit.names.0.name", track.metadata["artist"]) nv("mediums.0.track.0.length", str(track.metadata.length)) register_cluster_action(AddClusterAsRelease()) register_file_action(AddFileAsRecording()) register_file_action(AddFileAsRelease())
def convert(self, source, target, file): for field in ['title', 'artist', 'album']: f = file.metadata[field] f = f.encode(source, 'backslashreplace') f = f.decode(target, 'replace') file.metadata[field] = f file.update() def callback(self, objs): dialog = EncodingDialog(self.tagger.window) if dialog.exec_(): for o in objs: if isinstance(o, File): self.convert(dialog.source, dialog.target, o) register_file_action(ConvertFileEncoding()) class ConvertClusterEncoding(ConvertFileEncoding): def convert(self, source, target, cluster): for file in cluster.files: ConvertFileEncoding.convert(self, source, target, file) for field in ['artist', 'album']: f = cluster.metadata[field] f = f.encode(source, 'backslashreplace') f = f.decode(target, 'replace') cluster.metadata[field] = f cluster.update() def callback(self, objs): dialog = EncodingDialog(self.tagger.window)
from picard.util import webbrowser2 from picard.ui.itemviews import BaseAction, register_cluster_action from picard.ui.itemviews import BaseAction, register_album_action from picard.ui.itemviews import BaseAction, register_file_action from picard.metadata import register_track_metadata_processor class SearchGoogle(BaseAction): NAME = "Search with Google" def callback(self, objs): cluster = objs[0] url = "http://www.google.com/search?hl=en&q=" url += QtCore.QUrl.toPercentEncoding(cluster.metadata["artist"]) url += " " url += QtCore.QUrl.toPercentEncoding(cluster.metadata["album"]) webbrowser2.open(url) register_cluster_action(SearchGoogle()) register_album_action(SearchGoogle()) class SearchGoogleTrack(BaseAction): NAME = "Search with Google" def callback(self, objs): file = objs[0] url = "http://www.google.com/search?hl=en&q=" url += QtCore.QUrl.toPercentEncoding(file.metadata["artist"]) url += " " url += QtCore.QUrl.toPercentEncoding(file.metadata["album"]) url += " " url += QtCore.QUrl.toPercentEncoding(file.metadata["title"]) webbrowser2.open(url) register_file_action(SearchGoogleTrack())
class MetaFlacReplayGainRemove(BaseAction): NAME = _("MetaFlac:: &Remove ReplayGain information from files...") def callback(self, objs): run_MetaFlac('--remove-replay-gain', get_files(objs), self.tagger) class MetaFlacReplayGainOptionsPage(OptionsPage): NAME = "metaflac_rgscan" TITLE = "MetaFlac ReplayGain" PARENT = "plugins" options = [ TextOption('setting', 'metaflac_rgscan_metaflac_path', get_metaflac_path()), ] def __init__(self, parent=None): super(MetaFlacReplayGainOptionsPage, self).__init__(parent) self.ui = Ui_MetaFlacReplayGainOptionsPage() self.ui.setupUi(self) def load(self): self.ui.metaflac_path.setText(self.config.setting['metaflac_rgscan_metaflac_path']) def save(self): self.config.setting['metaflac_rgscan_metaflac_path'] = unicode(self.ui.metaflac_path.text()) register_file_action(MetaFlacReplayGainScanTrack()) register_file_action(MetaFlacReplayGainRemove()) register_album_action(MetaFlacReplayGainScanAlbumByTags()) register_album_action(MetaFlacReplayGainRemove()) register_options_page(MetaFlacReplayGainOptionsPage)
NAME = "Search with Google" def callback(self, objs): cluster = objs[0] url = "http://www.google.com/search?hl=en&q=" url += QtCore.QUrl.toPercentEncoding(cluster.metadata["artist"]) url += " " url += QtCore.QUrl.toPercentEncoding(cluster.metadata["album"]) webbrowser2.open(url) register_cluster_action(SearchGoogle()) register_album_action(SearchGoogle()) class SearchGoogleTrack(BaseAction): NAME = "Search with Google" def callback(self, objs): file = objs[0] url = "http://www.google.com/search?hl=en&q=" url += QtCore.QUrl.toPercentEncoding(file.metadata["artist"]) url += " " url += QtCore.QUrl.toPercentEncoding(file.metadata["album"]) url += " " url += QtCore.QUrl.toPercentEncoding(file.metadata["title"]) webbrowser2.open(url) register_file_action(SearchGoogleTrack())
self.purgeAcoustID.setChecked(False) self.purgeAcoustID.setText(r'Purge AcoustID tags') self.box.addWidget(self.purgeAcoustID) self.spacer = QtWidgets.QSpacerItem(0, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.box.addItem(self.spacer) def load(self): self.purgeMBIDs.setChecked(config.setting[r'purgeMBIDs']) self.purgeiTunes.setChecked(config.setting[r'purgeiTunes']) self.purgeLastFM.setChecked(config.setting[r'purgeLastFM']) self.purgeMusicIP.setChecked(config.setting[r'purgeMusicIP']) self.purgeAcoustID.setChecked(config.setting[r'purgeAcoustID']) def save(self): config.setting[r'purgeMBIDs'] = self.purgeMBIDs.isChecked() config.setting[r'purgeiTunes'] = self.purgeiTunes.isChecked() config.setting[r'purgeLastFM'] = self.purgeLastFM.isChecked() config.setting[r'purgeMusicIP'] = self.purgeMusicIP.isChecked() config.setting[r'purgeAcoustID'] = self.purgeAcoustID.isChecked() register_file_action(OriginsOblivion()) register_file_post_addition_to_track_processor(OriginsOblivion().processFile, priority=PluginPriority.LOW) register_file_post_load_processor(OriginsOblivion().processFileOnLoad) # register_track_action(OriginsOblivion()) # register_track_metadata_processor(OriginsOblivion().process) register_options_page(OriginsOblivionOptionsPage)
TextOption("setting", "replaygain_vorbisgain_command", "vorbisgain"), TextOption("setting", "replaygain_vorbisgain_options", "-asf"), TextOption("setting", "replaygain_mp3gain_command", "mp3gain"), TextOption("setting", "replaygain_mp3gain_options", "-a -s i"), TextOption("setting", "replaygain_metaflac_command", "metaflac"), TextOption("setting", "replaygain_metaflac_options", "--add-replay-gain"), TextOption("setting", "replaygain_wvgain_command", "wvgain"), TextOption("setting", "replaygain_wvgain_options", "-a") ] def __init__(self, parent=None): super(ReplayGainOptionsPage, self).__init__(parent) self.ui = Ui_ReplayGainOptionsPage() self.ui.setupUi(self) def load(self): self.ui.vorbisgain_command.setText(self.config.setting["replaygain_vorbisgain_command"]) self.ui.mp3gain_command.setText(self.config.setting["replaygain_mp3gain_command"]) self.ui.metaflac_command.setText(self.config.setting["replaygain_metaflac_command"]) self.ui.wvgain_command.setText(self.config.setting["replaygain_wvgain_command"]) def save(self): self.config.setting["replaygain_vorbisgain_command"] = unicode(self.ui.vorbisgain_command.text()) self.config.setting["replaygain_mp3gain_command"] = unicode(self.ui.mp3gain_command.text()) self.config.setting["replaygain_metaflac_command"] = unicode(self.ui.metaflac_command.text()) self.config.setting["replaygain_wvgain_command"] = unicode(self.ui.wvgain_command.text()) register_file_action(ReplayGain()) register_album_action(AlbumGain()) register_options_page(ReplayGainOptionsPage)
from picard.ui.itemviews import BaseAction, register_file_action from picard.metadata import register_track_metadata_processor class SearchPUID(BaseAction): NAME = "Lookup PUID" def callback(self, objs): cluster = objs[0] url = "http://musicbrainz.org/show/puid/?puid=" url += QtCore.QUrl.toPercentEncoding(cluster.metadata["musicip_puid"]) if len(cluster.metadata["musicip_puid"]) > 1: webbrowser2.open(url) else: global w w = NoPUID() w.show() register_file_action(SearchPUID()) class NoPUID(QtGui.QDialog): def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) self.setWindowTitle(_("No PUID found")) self.doc = QtGui.QTextDocument(self) self.textCursor = QtGui.QTextCursor(self.doc) font = QtGui.QFont() font.setFixedPitch(True) font.setPointSize(8) font.setWeight(QtGui.QFont.Normal) font.setFamily("") self.textFormat = QtGui.QTextCharFormat() self.textFormat.setFont(font) self.browser = QtGui.QTextBrowser(self)