예제 #1
0
    def search(self, album, artists=u'', limit=40):
        if time.time() - self.__lasttime < 1000:
            time.sleep(1)

        ret = []
        check_matches = False
        if isempty(artists):
            artist = None
        if len(artists) > 1:
            artist = u'Various Artists'
        elif artists:
            if hasattr(artists, 'items'):
                artist = artists.keys()[0]
            else:
                artist = artists[0]

        if not album and not artist:
            raise RetrievalError('Album or Artist required.')

        write_log(u'Searching for %s' % album)

        if hasattr(artists, "items"):
            album_id = find_id(chain(*artists.values()), "mbrainz_album_id")
            if album_id:
                try:
                    write_log(translate("MusicBrainz",
                        "Found album id %s in tracks. Retrieving") % album_id)
                    return [retrieve_album(album_id)]
                except RetrievalError, e:
                    msg = translate("MusicBrainz",
                        "<b>Error:</b> While retrieving Album ID %1 (%2)")
                    write_log(msg.arg(album_id).arg(escape(e)))
예제 #2
0
파일: funcs.py 프로젝트: keithgg/puddletag
def update_status(enable = True):
    files = status['selectedfiles']
    pattern = status['patterntext']
    tf = lambda *args, **kwargs: encode_fn(findfunc.tagtofilename(*args, **kwargs))
    if not files:
        return
    tag = files[0]

    state = {'__counter': u'1', '__total_files': unicode(len(files))}

    x = findfunc.filenametotag(pattern, tag[PATH], True)
    emit('ftstatus', display_tag(x))

    bold_error = translate("Status Bar", "<b>%s</b>")
    
    try:
        newfilename = functions.move(tag, pattern, tag, state=state.copy())
        if newfilename:
            newfilename = newfilename['__path']
            emit('tfstatus', translate("Status Bar",
                "New Filename: <b>%1</b>").arg(
                    decode_fn(newfilename)))
        else:
            emit('tfstatus', u'<b>No change</b>')
    except findfunc.ParseError, e:
        emit('tfstatus', bold_error % e.message)
예제 #3
0
def urlopen(url, mask=True, code=False):
    try:
        request = urllib2.Request(url)
        if useragent:
            request.add_header('User-Agent', useragent)
        page = urllib2.build_opener().open(request)
        if page.code == 403:
            raise RetrievalError(
                translate("Tag Sources", 'HTTPError 403: Forbidden'))
        elif page.code == 404:
            raise RetrievalError(
                translate("Tag Sources", "Page doesn't exist"))
        if code:
            return page.read(), page.code
        else:
            return page.read()
    except urllib2.URLError as e:
        try:
            msg = u'%s (%s)' % (e.reason.strerror, e.reason.errno)
        except AttributeError:
            msg = unicode(e)
        try:
            raise RetrievalError(msg, e.code)
        except AttributeError:
            raise RetrievalError(
                translate("Defaults", "Connection Error: %s ") % e.args[1])
    except socket.error as e:
        msg = u'%s (%s)' % (e.strerror, e.code)
        raise RetrievalError(msg)
    except EnvironmentError as e:
        msg = u'%s (%s)' % (e.strerror, e.code)
        raise RetrievalError(msg)
예제 #4
0
    def search(self):
        if not self.searchButton.isEnabled():
            return
        files = self._status['selectedfiles']
        if self.curSource.group_by:
            group = split_by_field(files, *self.curSource.group_by)
        self.label.setText(translate("WebDB", 'Searching...'))
        text = None
        if self.searchEdit.text() and self.searchEdit.isEnabled():
            text = unicode(self.searchEdit.text())
        elif not files:
            self.label.setText(translate("WebDB",
                '<b>Select some files or enter search paramaters.</b>'))
            return

        def search():
            try:
                ret = []
                if text:
                    return self.curSource.keyword_search(text), None
                else:
                    return tag_source_search(self.curSource, group, files)
            except RetrievalError, e:
                return translate('WebDB',
                    'An error occured: %1').arg(unicode(e))
            except Exception, e:
                traceback.print_exc()
                return translate('WebDB',
                    'An unhandled error occurred: %1').arg(unicode(e))
예제 #5
0
    def search(self, album, artists=u'', limit=40):
        if time.time() - self.__lasttime < 1000:
            time.sleep(1)

        ret = []
        check_matches = False
        if isempty(artists):
            artist = None
        if len(artists) > 1:
            artist = u'Various Artists'
        elif artists:
            if hasattr(artists, 'items'):
                artist = artists.keys()[0]
            else:
                artist = artists[0]

        if not album and not artist:
            raise RetrievalError('Album or Artist required.')

        write_log(u'Searching for %s' % album)

        if hasattr(artists, "items"):
            album_id = find_id(chain(*artists.values()), "mbrainz_album_id")
            if album_id:
                try:
                    write_log(
                        translate("MusicBrainz",
                                  "Found album id %s in tracks. Retrieving") %
                        album_id)
                    return [retrieve_album(album_id)]
                except RetrievalError, e:
                    msg = translate(
                        "MusicBrainz",
                        "<b>Error:</b> While retrieving Album ID %1 (%2)")
                    write_log(msg.arg(album_id).arg(escape(e)))
예제 #6
0
def parse_album_xml(text, album=None):
    """Parses the retrieved xml for an album and get's the track listing."""
    doc = minidom.parseString(text)
    
    album_item = doc.getElementsByTagName('Item')[0]
    try:
        tracklist = album_item.getElementsByTagName('Tracks')[0]
    except IndexError:
        write_log(translate('Amazon',
            'Invalid XML returned. No tracks listed.'))
        write_log(text)
        raise RetrievalError(translate('Amazon',
            'Invalid XML returned. No tracks listed.'))
    tracks = []
    discs = [disc for disc in tracklist.childNodes if 
        not disc.nodeType == disc.TEXT_NODE]
    if not (len(discs) > 1 and album):
        album = None
    for discnum, disc in enumerate(discs):
        for track_node in disc.childNodes:
            if track_node.nodeType == track_node.TEXT_NODE:
                continue
            title = get_text(track_node)
            tracknumber = track_node.attributes['Number'].value
            if album:
                tracks.append({'track': tracknumber, 'title': title,
                    'album': u'%s (Disc %s)' % (album, discnum + 1)})
            else:
                tracks.append({'track': tracknumber, 'title': title})
    return tracks
예제 #7
0
 def keyword_search(self, s):
     if s.startswith(':a'):
         artist_id = s[len(':a'):].strip()
         try:
             url = search_album('arid:' + solr_escape(artist_id),
                                limit=100,
                                own=True)
             return parse_album_search(urlopen(url))
         except RetrievalError as e:
             msg = translate("MusicBrainz",
                             '<b>Error:</b> While retrieving %1: %2')
             write_log(msg.arg(artist_id).arg(escape(e)))
             raise
     elif s.startswith(':b'):
         r_id = s[len(':b'):].strip()
         try:
             return [self.retrieve(r_id)]
         except RetrievalError as e:
             msg = translate(
                 "MusicBrainz",
                 "<b>Error:</b> While retrieving Album ID %1 (%2)")
             write_log(msg.arg(r_id).arg(escape(e)))
             raise
     else:
         try:
             params = parse_searchstring(s)
         except RetrievalError as e:
             return parse_album_search(urlopen(search_album(s, limit=100)))
         if not params:
             return
         artist = params[0][0]
         album = params[0][1]
         return self.search(album, [artist], 100)
예제 #8
0
파일: funcs.py 프로젝트: keithgg/puddletag
def number_tracks(tags, offset, numtracks, restartdirs, padlength, split_field='__dirpath', output_field='track', by_group=False):
    """Numbers the selected tracks sequentially in the range
    between the indexes.
    The first item of indices is the starting track.
    The second item of indices is the number of tracks."""

    if not split_field:
        QMessageBox.critical(parent, translate("Autonumbering Wizard", 'Field empty...'),
                             translate("Autonumbering Wizard",
                                       "The field specified to use as a directory splitter was invalid. "
                                       "Please check your values."))
        return

    if not output_field:
        QMessageBox.critical(parent, translate("Autonumbering Wizard", 'Field empty...'),
                             translate("Autonumbering Wizard",
                                       "The output field specified was invalid. "
                                       "Please check your values."))
        return

    if restartdirs: #Restart dir numbering
        folders = OrderedDict()
        for tag_index, tag in enumerate(tags):
            key = findfunc.parsefunc(split_field, tag)
            if not isinstance(key, basestring):
                key = tag.stringtags().get(split_field)
            
            if key in folders:
                folders[key].append(tag_index)
            else:
                folders[key] = [tag_index]
    else:
        folders = {'fol': [i for i, t in enumerate(tags)]}


    taglist = {}
    for group_num, tags in enumerate(folders.itervalues()):
        if numtracks == -2:
            total = len(tags)
        elif numtracks is -1:
            total = None
        elif numtracks >= 0:
            total = numtracks
        for trknum, index in enumerate(tags):
            if by_group:
                trknum = group_num + offset
            else:
                trknum += offset
                
            text = _pad(trknum, total, padlength)
            taglist[index] = {output_field: text}

    taglist = [v for k,v in sorted(taglist.items(), key=lambda x: x[0])]

    emit('writeselected', taglist)
예제 #9
0
def retrieve_cover_links(album_id, extra=None):
    if extra is None:
        url = "http://coverartarchive.org/release/" + album_id
    else:
        url = "http://coverartarchive.org/release/%s/%s" % (album_id, extra)
    write_log(translate("MusicBrainz", "Retrieving cover: %s") % url)
    try:
        data, code = urlopen(url, code=True)
    except RetrievalError, e:
        if e.code == 404:
            raise RetrievalError(translate("MusicBrainz",
                "No images exist for this album."), 404)
        raise e
예제 #10
0
파일: funcs.py 프로젝트: keithgg/puddletag
def load_musiclib(parent=None):
    try:
        m = puddlestuff.musiclib.LibChooseDialog(parent)
    except puddlestuff.musiclib.MusicLibError:
        QMessageBox.critical(parent, translate("MusicLib", 'No libraries found'),
           translate("MusicLib", "No supported music libraries were found. Most likely "
            "the required dependencies aren't installed. Visit the "
            "puddletag website, <a href='http://puddletag.sourceforge.net'>"
            "puddletag.sourceforge.net</a> for more details."))
        return
    m.setModal(True)
    obj.connect(m, SIGNAL('adddock'), emit_received('adddock'))
    m.show()
예제 #11
0
def load_mp3tag_sources(dirpath=MTAG_SOURCE_DIR):
    "Loads Mp3tag tag sources from dirpath and return the tag source classes."
    files = glob.glob(os.path.join(dirpath, '*.src'))
    classes = []
    for f in files:
        try:
            idents, search, album = mp3tag.open_script(f)
            classes.append(mp3tag.Mp3TagSource(idents, search, album))
        except:
            print translate("WebDB", "Couldn't load Mp3tag Tag Source %s") % f
            traceback.print_exc()
            continue
    return classes
예제 #12
0
def retrieve_cover_links(album_id, extra=None):
    if extra is None:
        url = "http://coverartarchive.org/release/" + album_id
    else:
        url = "http://coverartarchive.org/release/%s/%s" % (album_id, extra)
    write_log(translate("MusicBrainz", "Retrieving cover: %s") % url)
    try:
        data, code = urlopen(url, code=True)
    except RetrievalError, e:
        if e.code == 404:
            raise RetrievalError(
                translate("MusicBrainz", "No images exist for this album."),
                404)
        raise e
예제 #13
0
 def editItem(self, row=None):
     if row is None:
         row = self.listbox.currentRow()
     l = self.listbox.item
     patterns = [unicode(l(z).text()) for z in range(self.listbox.count())]
     (text, ok) = QInputDialog().getItem(self,
         translate("WebDB", 'Edit sort option'),
         translate("WebDB",
             'Enter a sorting option (a comma-separated list of fields. '
             'Eg. "artist, title")'), patterns, row)
     if ok:
         item = l(row)
         item.setText(text)
         self.listbox.setItemSelected(item, True)
예제 #14
0
    def __init__(self):
        super(MusicBrainz, self).__init__()
        self.__lasttime = time.time()
        self.__image_size = LARGE
        self.__num_images = 0
        self.__get_images = True

        self.preferences = [
            [translate('MusicBrainz', 'Retrieve Cover'), CHECKBOX, True],
            [
                translate('MusicBrainz', 'Cover size to retrieve:'), COMBO,
                [[
                    translate('Amazon', 'Small'),
                    translate('Amazon', 'Large'),
                    translate('Amazon', 'Original Size')
                ], 1]
            ],
            [
                translate('MusicBrainz', 'Amount of images to retrieve:'),
                COMBO,
                [[
                    translate('MusicBrainz', 'Just the front cover'),
                    translate('MusicBrainz', 'All (can take a while)')
                ], 0]
            ],
        ]
예제 #15
0
파일: webdb.py 프로젝트: korala1968/tago
 def editItem(self, row=None):
     if row is None:
         row = self.listbox.currentRow()
     l = self.listbox.item
     patterns = [unicode(l(z).text()) for z in range(self.listbox.count())]
     (text, ok) = QInputDialog().getItem(
         self, translate("WebDB", 'Edit sort option'),
         translate(
             "WebDB",
             'Enter a sorting option (a comma-separated list of fields. '
             'Eg. "artist, title")'), patterns, row)
     if ok:
         item = l(row)
         item.setText(text)
         self.listbox.setItemSelected(item, True)
예제 #16
0
 def addPattern(self):
     l = self.listbox.item
     patterns = [unicode(l(z).text()) for z in range(self.listbox.count())]
     row = self.listbox.currentRow()
     if row < 0:
         row = 0
     (text, ok) = QInputDialog().getItem(self, translate("WebDB",
         'Add sort option'),
         translate("WebDB",
             'Enter a sorting option (a comma-separated list of fields. '
             'Eg. "artist, title")'), patterns, row)
     if ok:
         self.listbox.clearSelection()
         self.listbox.addItem(text)
         self.listbox.setCurrentRow(self.listbox.count() - 1)
예제 #17
0
def retrieve_covers(cover_links, size=LARGE):
    ret = []
    for cover in cover_links['images']:
        desc = cover.get('comment', u"")
        cover_type = cover['types'][0]
        if cover_type in mb_imagetypes:
            cover_type = imagetypes[mb_imagetypes[cover_type]]
        else:
            cover_type = imagetypes[u"Other"]
        if cover == SMALL:
            image_url = cover['thumbnails']['small']
        elif cover == LARGE:
            image_url = cover['thumbnails']['large']
        else:
            image_url = cover['image']

        write_log(translate("MusicBrainz", "Retrieving image %s") % image_url)
        image_data = urlopen(image_url)

        ret.append({
            'desc': desc,
            'mime': get_mime(image_data),
            "imagetype": cover_type,
            "data": image_data
        })

    return ret
예제 #18
0
파일: webdb.py 프로젝트: korala1968/tago
 def addPattern(self):
     l = self.listbox.item
     patterns = [unicode(l(z).text()) for z in range(self.listbox.count())]
     row = self.listbox.currentRow()
     if row < 0:
         row = 0
     (text, ok) = QInputDialog().getItem(
         self, translate("WebDB", 'Add sort option'),
         translate(
             "WebDB",
             'Enter a sorting option (a comma-separated list of fields. '
             'Eg. "artist, title")'), patterns, row)
     if ok:
         self.listbox.clearSelection()
         self.listbox.addItem(text)
         self.listbox.setCurrentRow(self.listbox.count() - 1)
예제 #19
0
파일: discogs.py 프로젝트: kryger/puddletag
def keyword_search(keywords):
    write_log(translate("Discogs",
        'Retrieving search results for keywords: %s') % keywords)
    keywords = re.sub('(\s+)', u'+', keywords)
    url = search_url % keywords
    text = urlopen(url)
    return parse_search_json(json.loads(text))
예제 #20
0
def parse_search_json(data):
    """Parses the xml retrieved after entering a search query. Returns a
    list of the albums found.
    """

    results = data.get('results', []) + data.get('exactresults', [])

    if not results:
        return []

    albums = []

    for result in results:
        info = result.copy()
        try:
            artist, album = result['title'].split(u' - ')
        except ValueError:
            album = result['title']
            artist = u''

        info = convert_dict(info, ALBUM_KEYS)

        info['artist'] = artist
        info['album'] = album

        info['discogs_id'] = info['#r_id']

        info['#extrainfo'] = (
            translate('Discogs', '%s at Discogs.com') % info['album'],
            SITE_URL + info['discogs_uri'])

        albums.append(check_values(info))

    return albums
예제 #21
0
def parse_album_xml(text, album=None):
    """Parses the retrieved xml for an album and get's the track listing."""
    doc = minidom.parseString(text)
    album_item = doc.getElementsByTagName('Item')[0]
    try:
        tracklist = album_item.getElementsByTagName('Tracks')[0]
    except IndexError:
        write_log(translate('Amazon',
                            'No tracks found in listing.'))
        write_log(text)
        return None
    tracks = []
    discs = [disc for disc in tracklist.childNodes if
             not disc.nodeType == disc.TEXT_NODE]
    if not (len(discs) > 1 and album):
        album = None
    for discnum, disc in enumerate(discs):
        for track_node in disc.childNodes:
            if track_node.nodeType == track_node.TEXT_NODE:
                continue
            title = get_text(track_node)
            tracknumber = track_node.attributes['Number'].value
            if album:
                tracks.append({'track': tracknumber, 'title': title,
                               'album': '%s (Disc %s)' % (album, discnum + 1)})
            else:
                tracks.append({'track': tracknumber, 'title': title})
    return tracks
예제 #22
0
def parse_search_xml(text):
    """Parses the xml retrieved after entering a search query. Returns a
    list of the albums found.
    """
    doc = minidom.parseString(text)
    items = doc.getElementsByTagName('Item')
    ret = []

    for item in items:
        info = {}
        for attrib in item.getElementsByTagName('ItemAttributes'):
            if not check_binding(attrib):
                continue
            for child in attrib.childNodes:
                if child.nodeType == child.TEXT_NODE:
                    continue
                if child.tagName in XMLKEYS:
                    text_node = child.firstChild
                    if text_node.nodeType == text_node.TEXT_NODE:
                        info[XMLKEYS[child.tagName]] = text_node.data
        if not info:
            continue
        for key in IMAGEKEYS:
            image_items = item.getElementsByTagName(key)
            if image_items:
                info[IMAGEKEYS[key]] = get_image_url(image_items[0])
        info['#extrainfo'] = (translate('Amazon', '%s at Amazon.com') %
                              info.get('album', ''), get_site_url(item))
        info['#asin'] = get_asin(item)
        info['asin'] = info['#asin']
        ret.append(info)
    return ret
예제 #23
0
파일: webdb.py 프로젝트: korala1968/tago
 def setResults(self, retval):
     self.searchButton.setEnabled(True)
     if isinstance(retval, (basestring, QString)):
         self.label.setText(retval)
     else:
         releases, files = retval
         if releases:
             self.label.setText(translate("WebDB", 'Searching complete.'))
         else:
             self.label.setText(
                 translate("WebDB", 'No matching albums were found.'))
         if files and self.__autoRetrieve.isChecked():
             self.listbox.setReleases(releases, files)
         else:
             self.listbox.setReleases(releases)
         self.listbox.emit(SIGNAL('infoChanged'), '')
예제 #24
0
파일: freedb.py 프로젝트: korala1968/tago
class FreeDB(object):
    name = 'FreeDB'
    tooltip = translate("FreeDB",
                        '<b>FreeDB does not support text-based searches.</b>')
    group_by = ['album', None]

    def __init__(self):
        object.__init__(self)
        self.__retrieved = {}
        self.__lasttime = time.time()

    def search(self, album, files):
        if time.time() - self.__lasttime < 1000:
            time.sleep(1)
        if files:
            results = search(files)
            self.__lasttime = time.time()
            if results:
                results[0] = self.retrieve(results[0][0])
            return results
        else:
            return []

    def retrieve(self, info):
        if time.time() - self.__lasttime < 1000:
            time.sleep(1)
        discid = info['#discid']
        if discid in self.__retrieved:
            return self.__retrieved[discid]
        else:
            info, tracks = retrieve_from_info(info)
            self.__retrieved[info['#discid']] = [info, tracks]
            return info, tracks

        return info
예제 #25
0
 def library(self):
     dbpath = self.dbpath.text().toLocal8Bit()
     try:
         return QuodLibet(dbpath)
     except (IOError, OSError), e:
         raise MusicLibError(0, translate(
             "QuodLibet", '%1 (%2)').arg(e.strerror).arg(e.filename))
예제 #26
0
def parse_search_xml(text):
    """Parses the xml retrieved after entering a search query. Returns a
    list of the albums found.
    """
    doc = minidom.parseString(text)
    items = doc.getElementsByTagName('Item')
    ret = []
    for item in items:
        info = {}
        for attrib in item.getElementsByTagName('ItemAttributes'):
            if not check_binding(attrib):
                continue
            for child in attrib.childNodes:
                if child.nodeType == child.TEXT_NODE:
                    continue
                if child.tagName in XMLKEYS:
                    text_node = child.firstChild
                    if text_node.nodeType == text_node.TEXT_NODE:
                        info[XMLKEYS[child.tagName]] = text_node.data
        if not info:
            continue
        for key in IMAGEKEYS:
            image_items = item.getElementsByTagName(key)
            if image_items:
                info[IMAGEKEYS[key]] = get_image_url(image_items[0])
        info['#extrainfo'] = (translate('Amazon', '%s at Amazon.com') %
            info.get('album', u''), get_site_url(item))
        info['#asin'] = get_asin(item)
        info['asin'] = info['#asin']
        ret.append(info)
    return ret
예제 #27
0
파일: webdb.py 프로젝트: korala1968/tago
 def submit():
     try:
         self.curSource.submit(files)
     except SubmissionError, e:
         traceback.print_exc()
         return translate('WebDB',
                          'An error occured: %1').arg(unicode(e))
예제 #28
0
파일: funcs.py 프로젝트: korala1968/tago
def load_musiclib(parent=None):
    try:
        m = puddlestuff.musiclib.LibChooseDialog(parent)
    except puddlestuff.musiclib.MusicLibError:
        QMessageBox.critical(
            parent, translate("MusicLib", 'No libraries found'),
            translate(
                "MusicLib",
                "No supported music libraries were found. Most likely "
                "the required dependencies aren't installed. Visit the "
                "puddletag website, <a href='http://puddletag.sourceforge.net'>"
                "puddletag.sourceforge.net</a> for more details."))
        return
    m.setModal(True)
    obj.connect(m, SIGNAL('adddock'), emit_received('adddock'))
    m.show()
예제 #29
0
 def select_db(self):
     filedlg = QFileDialog()
     filename = filedlg.getOpenFileName(
         self, translate("QuodLibet", 'Select QuodLibet library file...'),
         self.dbpath.text())
     if filename:
         self.dbpath.setText(filename)
예제 #30
0
 def select_db(self):
     filedlg = QFileDialog()
     filename = filedlg.getOpenFileName(self,
         translate("QuodLibet", 'Select QuodLibet library file...'),
         self.dbpath.text())
     if filename:
         self.dbpath.setText(filename)
예제 #31
0
파일: funcs.py 프로젝트: korala1968/tago
def search_replace(parent=None):

    selectedfiles = status['selectedfiles']
    audio, selected = status['firstselection']

    try:
        text = to_string(selected.values()[0])
    except IndexError:
        text = translate('Defaults', u'')

    func = puddlestuff.findfunc.Function('replace')
    func.args = [text, text, False, False]
    func.tag = ['__selected']

    dialog = actiondlg.CreateFunction(prevfunc=func,
                                      parent=parent,
                                      selected_fields=selected.keys(),
                                      example=audio,
                                      text=text)

    dialog.connect(dialog, SIGNAL("valschanged"),
                   partial(run_func, selectedfiles))
    dialog.setModal(True)
    dialog.controls[0].combo.setFocus()
    dialog.show()
예제 #32
0
def parse_search_json(data):
    """Parses the xml retrieved after entering a search query. Returns a
    list of the albums found.
    """

    results = data.get('results', []) + data.get('exactresults', [])

    if not results:
        return []

    albums = []

    for result in results:
        info = result.copy()
        try:
            artist, album = result['title'].split(u' - ')
        except ValueError:
            album = result['title']
            artist = u''

        info = convert_dict(info, ALBUM_KEYS)

        info['artist'] = artist
        info['album'] = album

        info['discogs_id'] = info['#r_id']

        info['#extrainfo'] = (
            translate('Discogs', '%s at Discogs.com') % info['album'],
            SITE_URL + info['discogs_uri'])

        albums.append(check_values(info))

    return albums
예제 #33
0
class Discogs(object):
    name = 'Discogs.com'
    group_by = [u'album', u'artist']
    tooltip = translate("Discogs", """<p><b>Discogs only support searching by release id</b></p>
        <p>Enter the release id Eg. "1257896" to search.</p>""")

    def __init__(self):
        super(Discogs, self).__init__()
        self._getcover = True
        self.covertype = 1

        self.preferences = [
            [translate('Discogs', 'Retrieve Cover'), CHECKBOX, True],
            [translate("Discogs", 'Cover size to retrieve'), COMBO,
                [[translate("Discogs", 'Small'),
                    translate("Discogs", 'Large')], 1]],
            [translate("Discogs", 'Field to use for discogs_id'), TEXT, R_ID],
            [translate("Discogs", 'API Key (Stored as plain-text.'
                                  'Leave empty to use default.)'), TEXT, ''],
            ]

    def keyword_search(self, text):

        try:
            r_id = int(text.strip())
        except (TypeError, ValueError):
            raise RetrievalError(translate(
                "Discogs", 'Discogs release id should be an integer.'))

        try:
            return [self.retrieve(r_id)]
        except Exception, e:
            raise RetrievalError(unicode(e))
예제 #34
0
 def submit():
     try:
         self.curSource.submit(files)
     except SubmissionError, e:
         traceback.print_exc()
         return translate('WebDB',
             'An error occured: %1').arg(unicode(e))
예제 #35
0
 def setResults(self, retval):
     self.searchButton.setEnabled(True)
     if isinstance(retval, (basestring, QString)):
         self.label.setText(retval)
     else:
         releases, files = retval
         if releases:
             self.label.setText(translate("WebDB",
                 'Searching complete.'))
         else:
             self.label.setText(translate("WebDB",
                 'No matching albums were found.'))
         if files and self.__autoRetrieve.isChecked():
             self.listbox.setReleases(releases, files)
         else:
             self.listbox.setReleases(releases)
         self.listbox.emit(SIGNAL('infoChanged'), '')
예제 #36
0
def parse_searchstring(text):
    try:
        text = [z.split(u';') for z in text.split(u'|') if z]
        return [(z.strip(), v.strip()) for z, v in text]
    except ValueError:
        raise RetrievalError(translate('Tag Sources',
            '<b>Error parsing artist/album combinations.</b>'))
    return []
예제 #37
0
def keyword_search(keywords):
    write_log(
        translate("Discogs",
                  'Retrieving search results for keywords: %s') % keywords)
    keywords = re.sub('(\s+)', u'+', keywords)
    url = SEARCH_URL % keywords
    text = urlopen(url)
    return parse_search_json(json.loads(text))
예제 #38
0
    def search(self, album, artists='', limit=40):
        if time.time() - self.__lasttime < 1000:
            time.sleep(1)

        ret = []
        check_matches = False
        if isempty(artists):
            artist = None
        if len(artists) > 1:
            artist = 'Various Artists'
        elif artists:
            if hasattr(artists, 'items'):
                artist = list(artists.keys())[0]
            else:
                artist = artists[0]

        if not album and not artist:
            raise RetrievalError('Album or Artist required.')

        write_log('Searching for %s' % album)

        if hasattr(artists, "items"):
            album_id = find_id(chain(*list(artists.values())),
                               "mbrainz_album_id")
            if album_id:
                try:
                    write_log(
                        translate("MusicBrainz",
                                  "Found album id %s in tracks. Retrieving") %
                        album_id)
                    return [retrieve_album(album_id)]
                except RetrievalError as e:
                    msg = translate(
                        "MusicBrainz",
                        "<b>Error:</b> While retrieving Album ID %1 (%2)")
                    write_log(msg.arg(album_id).arg(escape(e)))

        try:
            xml = urlopen(search_album(album, artist, limit))
        except urllib.error.URLError as e:
            write_log('Error: While retrieving search page %s' % str(e))
            raise RetrievalError(str(e))
        write_log('Retrieved search results.')
        self.__lasttime = time.time()
        return parse_album_search(xml)
예제 #39
0
def parse_searchstring(text):
    try:
        text = [z.split(u';') for z in text.split(u'|') if z]
        return [(z.strip(), v.strip()) for z, v in text]
    except ValueError:
        raise RetrievalError(
            translate('Tag Sources',
                      '<b>Error parsing artist/album combinations.</b>'))
    return []
예제 #40
0
 def library(self):
     dbpath = self.dbpath.text().toLocal8Bit()
     try:
         return QuodLibet(dbpath)
     except (IOError, OSError), e:
         raise MusicLibError(
             0,
             translate("QuodLibet",
                       '%1 (%2)').arg(e.strerror).arg(e.filename))
예제 #41
0
class MusicBrainz(object):
    name = u'MusicBrainz'

    group_by = [u'album', 'artist']

    def __init__(self):
        super(MusicBrainz, self).__init__()
        self.__lasttime = time.time()
        self.__image_size = LARGE
        self.__num_images = 0
        self.__get_images = True

        self.preferences = [
            [translate('MusicBrainz', 'Retrieve Cover'), CHECKBOX, True],
            [
                translate('MusicBrainz', 'Cover size to retrieve:'), COMBO,
                [[
                    translate('Amazon', 'Small'),
                    translate('Amazon', 'Large'),
                    translate('Amazon', 'Original Size')
                ], 1]
            ],
            [
                translate('MusicBrainz', 'Amount of images to retrieve:'),
                COMBO,
                [[
                    translate('MusicBrainz', 'Just the front cover'),
                    translate('MusicBrainz', 'All (can take a while)')
                ], 0]
            ],
        ]

    def keyword_search(self, s):
        if s.startswith(u':a'):
            artist_id = s[len(':a'):].strip()
            try:
                url = search_album('arid:' +
                                   solr_escape(artist_id.encode('utf8')),
                                   limit=100,
                                   own=True)
                return parse_album_search(urlopen(url))
            except RetrievalError, e:
                msg = translate("MusicBrainz",
                                '<b>Error:</b> While retrieving %1: %2')
                write_log(msg.arg(artist_id).arg(escape(e)))
                raise
        elif s.startswith(u':b'):
            r_id = s[len(u':b'):].strip()
            try:
                return [self.retrieve(r_id)]
            except RetrievalError, e:
                msg = translate(
                    "MusicBrainz",
                    "<b>Error:</b> While retrieving Album ID %1 (%2)")
                write_log(msg.arg(r_id).arg(escape(e)))
                raise
예제 #42
0
 def search():
     try:
         ret = []
         if text:
             return self.curSource.keyword_search(text), None
         else:
             return tag_source_search(self.curSource, group, files)
     except RetrievalError, e:
         return translate('WebDB',
             'An error occured: %1').arg(unicode(e))
예제 #43
0
파일: webdb.py 프로젝트: korala1968/tago
 def search():
     try:
         ret = []
         if text:
             return self.curSource.keyword_search(text), None
         else:
             return tag_source_search(self.curSource, group, files)
     except RetrievalError, e:
         return translate('WebDB',
                          'An error occured: %1').arg(unicode(e))
예제 #44
0
파일: funcs.py 프로젝트: korala1968/tago
def check_copy_data(data):
    #0 = yes
    #1 = no
    #2 = no images
    if len(data) > 5242880:
        msgbox = QMessageBox()
        msgbox.setText(
            translate(
                "Messages", "That's a large amount of data to copy.\n"
                "It may cause your system to lock up.\n\n"
                "Do you want to go ahead?"))

        msgbox.setIcon(QMessageBox.Question)
        msgbox.addButton(translate("Defaults", "&Yes"), QMessageBox.YesRole)
        msgbox.addButton(translate("Defaults", "No"), QMessageBox.NoRole)
        msgbox.addButton(translate("Messages", "Copy without images."),
                         QMessageBox.ApplyRole)
        return msgbox.exec_()
    else:
        return 0
예제 #45
0
def run_format_func(funcname,
                    arguments,
                    m_audio,
                    s_audio=None,
                    extra=None,
                    state=None):
    '''Runs the function function using the arguments specified from pudlestuff.function.

    Arguments:
    funcname  -- String with the function name. Looked up using the
                 dictionary pudlestuff.function.functions
    arguments -- List of arguments to pass to the function. Patterns
                 should not be evaluated. They'll be evaluated here.
    m_audio   -- Audio file containg multiple multiple values per key.
                 Eg. {'artist': [u'Artist1': 'Artist2']}

    Keyword Arguments
    s_audio -- Same as m_audio, but containing strings as values.
               Generated on each run unless also passed.
    extra -- Dictionary containing extra fields that are to be used
             when matching fields.
    state -- Dictionary that hold state. Like {'__count': 15}.
             Used by some functions in puddlestuff.functions
    
    '''

    #Get function
    try:
        if isinstance(funcname, basestring):
            func = functions[funcname]
        else:
            func = funcname
    except KeyError:
        raise ParseError(
            SYNTAX_ERROR.arg(funcname).arg(
                translate('Defaults', 'function does not exist.')))

    extra = {} if extra is None else extra
    s_audio = stringtags(m_audio) if s_audio is None else s_audio

    reserved = {'tags': s_audio, 'm_tags': m_audio, 'state': state}
    dicts = [s_audio, extra, state]
    topass = get_function_arguments(funcname, func, arguments, reserved, True,
                                    *dicts)

    try:
        ret = func(**topass)
        if ret is None:
            return u''
        return ret
    except TypeError, e:
        message = SYNTAX_ERROR.arg(funcname)
        message = message.arg(arglen_error(e, topass, func, False))
        raise ParseError(message)
예제 #46
0
    def keyword_search(self, text):

        try:
            r_id = int(text.strip())
        except (TypeError, ValueError):
            raise RetrievalError(translate(
                "Discogs", 'Discogs release id should be an integer.'))

        try:
            return [self.retrieve(r_id)]
        except Exception, e:
            raise RetrievalError(unicode(e))
예제 #47
0
파일: webdb.py 프로젝트: korala1968/tago
def display_tag(tag):
    """Used to display tags in in a human parseable format."""
    tag = dict((k, v) for k, v in tag.iteritems()
               if not k.startswith('#') and not isempty(v))

    if not tag:
        return translate("WebDB", "<b>Nothing to display.</b>")
    fmt = u"<b>%s</b>: %s<br />"
    text = pprint_tag(tag, fmt, True)
    if text.endswith(u'<br />'):
        text = text[:-len(u'<br />')]
    return text
예제 #48
0
 def keyword_search(self, s):
     if s.startswith(u':a'):
         artist_id = s[len(':a'):].strip()
         try:
             url = search_album('arid:' +
                 solr_escape(artist_id.encode('utf8')), limit=100, own=True)
             return parse_album_search(urlopen(url))
         except RetrievalError, e:
             msg = translate("MusicBrainz",
                 '<b>Error:</b> While retrieving %1: %2')
             write_log(msg.arg(artist_id).arg(escape(e)))
             raise
예제 #49
0
    def keyword_search(self, text):

        try:
            r_id = int(text.strip())
        except (TypeError, ValueError):
            raise RetrievalError(translate(
                "Discogs", 'Discogs release id should be an integer.'))

        try:
            return [self.retrieve(r_id)]
        except Exception, e:
            raise RetrievalError(unicode(e))
예제 #50
0
def display_tag(tag):
    """Used to display tags in in a human parseable format."""
    tag = dict((k,v) for k,v in tag.iteritems() if
        not k.startswith('#') and not isempty(v))

    if not tag:
        return translate("WebDB", "<b>Nothing to display.</b>")
    fmt = u"<b>%s</b>: %s<br />"
    text = pprint_tag(tag, fmt, True)
    if text.endswith(u'<br />'):
        text = text[:-len(u'<br />')]
    return text
예제 #51
0
파일: funcs.py 프로젝트: keithgg/puddletag
def check_copy_data(data):
    #0 = yes
    #1 = no
    #2 = no images
    if len(data) > 5242880:
        msgbox = QMessageBox()
        msgbox.setText(translate("Messages",
            "That's a large amount of data to copy.\n"
            "It may cause your system to lock up.\n\n"
            "Do you want to go ahead?"))

        msgbox.setIcon(QMessageBox.Question)
        msgbox.addButton(translate("Defaults", "&Yes"),
            QMessageBox.YesRole)
        msgbox.addButton(translate("Defaults", "No"),
            QMessageBox.NoRole)
        msgbox.addButton(translate("Messages", "Copy without images."),
            QMessageBox.ApplyRole)
        return msgbox.exec_()
    else:
        return 0
예제 #52
0
def retrieve_cover_links(album_id, extra=None):
    if extra is None:
        url = "http://coverartarchive.org/release/" + album_id
    else:
        url = "http://coverartarchive.org/release/%s/%s" % (album_id, extra)
    write_log(translate("MusicBrainz", "Retrieving cover: %s") % url)
    try:
        data, code = urlopen(url, code=True)
    except RetrievalError as e:
        if e.code == 404:
            raise RetrievalError(
                translate("MusicBrainz", "No images exist for this album."),
                404)
        raise e

    if code == 200:
        if extra is None:
            return json.loads(data)
        else:
            return data
    elif code == 400:
        raise RetrievalError(translate("MusicBrainz", "Invalid UUID"))
    elif code in (405, 406):
        raise RetrievalError(translate("MusicBrainz", "Invalid query sent."))
    elif code == 503:
        raise RetrievalError(
            translate("MusicBrainz", "You have exceeded your rate limit."))
    elif code == 404:
        raise RetrievalError(translate("MusicBrainz", "Image does not exist."))
예제 #53
0
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.dbpath = DirLineEdit(os.path.join(HOMEDIR, u".quodlibet/songs"))
        self.configpath = DirLineEdit(os.path.join(HOMEDIR, u".quodlibet/config"))

        vbox = QVBoxLayout()
        def label(text, control):
            l = QLabel(text)
            l.setBuddy(control)
            return l

        vbox.addWidget(label(translate("QuodLibet", '&Library Path'), self.dbpath))

        hbox = QHBoxLayout()
        select_db = QPushButton(translate("QuodLibet", "..."))
        self.connect(select_db, SIGNAL('clicked()'), self.select_db)
        hbox.addWidget(self.dbpath)
        hbox.addWidget(select_db)
        vbox.addLayout(hbox)

        vbox.addStretch(1)
        self.setLayout(vbox)
예제 #54
0
    def search(self, album, artists):

        if len(artists) > 1:
            artist = u'Various Artists'
        else:
            artist = [z for z in artists][0]

        if hasattr(artists, 'values'):
            write_log(
                translate("Discogs", 'Checking tracks for Discogs Album ID.'))
            tracks = []
            [tracks.extend(z) for z in artists.values()]
            album_id = find_id(tracks, R_ID)
            if not album_id:
                write_log(
                    translate("Discogs", 'No Discogs ID found in tracks.'))
            else:
                write_log(
                    translate("Discogs", 'Found Discogs ID: %s') % album_id)
                return [self.retrieve(album_id)]

        return []
예제 #55
0
    def search(self, album, artists):

        if len(artists) > 1:
            artist = u'Various Artists'
        else:
            artist = [z for z in artists][0]

        if hasattr(artists, 'values'):
            write_log(
                translate("Discogs", 'Checking tracks for Discogs Album ID.'))
            tracks = []
            [tracks.extend(z) for z in artists.values()]
            album_id = find_id(tracks, R_ID)
            if not album_id:
                write_log(
                    translate("Discogs", 'No Discogs ID found in tracks.'))
            else:
                write_log(
                    translate("Discogs", 'Found Discogs ID: %s') % album_id)
                return [self.retrieve(album_id)]

        return []
예제 #56
0
파일: webdb.py 프로젝트: korala1968/tago
def load_mp3tag_sources(dirpath=MTAG_SOURCE_DIR):
    "Loads Mp3tag tag sources from dirpath and return the tag source classes."
    files = glob.glob(os.path.join(dirpath, '*.src'))
    classes = []
    for f in files:
        try:
            idents, search, album = mp3tag.open_script(f)
            classes.append(mp3tag.Mp3TagSource(idents, search, album))
        except:
            logging.exception(
                translate("WebDB", "Couldn't load Mp3tag Tag Source %s") % f)
            continue
    return classes
예제 #57
0
파일: discogs.py 프로젝트: kryger/puddletag
def retrieve_album(info, image=LARGEIMAGE, rls_type=None):
    """Retrieves album from the information in info.
    image must be either one of image_types or None.
    If None, no image is retrieved."""
    if isinstance(info, (int, long)):
        r_id = unicode(info)
        info = {}
        write_log(
            translate("Discogs", 'Retrieving using Release ID: %s') % r_id)
        rls_type = u'release'
    elif isinstance(info, basestring):
        r_id = info
        info = {}
        write_log(
            translate("Discogs", 'Retrieving using Release ID: %s') % r_id)
        rls_type = u'release'
    else:
        if rls_type is None and '#release_type' in info:
            rls_type = info['#release_type']
        r_id = info['#r_id']
        write_log(
            translate("Discogs", 'Retrieving album %s') % (info['album']))

    site_url = SITE_MASTER_URL if rls_type == MASTER else SITE_RELEASE_URL
    site_url += r_id.encode('utf8')
            
    url = master_url % r_id if rls_type == MASTER else release_url % r_id

    x = urlopen(url)
    ret = parse_album_json(json.loads(x))

    info = deepcopy(info)
    info.update(ret[0])

    if image in image_types and '#cover-url' in info:
        data = []
        for large, small in info['#cover-url']:
            if image == LARGEIMAGE and large:
                write_log(
                    translate("Discogs", 'Retrieving cover: %s') % large)
                try:
                    data.append({DATA: urlopen(large)})
                except RetrievalError, e:
                    write_log(translate('Discogs',
                        u'Error retrieving image:') + unicode(e))
            else:
                write_log(
                    translate("Discogs", 'Retrieving cover: %s') % small)
                try:
                    data.append({DATA: urlopen(small)})
                except RetrievalError, e:
                    write_log(translate('Discogs',
                        u'Error retrieving image:') + unicode(e))
예제 #58
0
def keyword_search(keywords):
    write_log(translate('Amazon',
        'Retrieving search results for keywords: %s') % keywords)
    query_pairs = {
            "Operation": u"ItemSearch",
            'SearchIndex': u'Music',
            "ResponseGroup":u"ItemAttributes,Images",
            "Service":u"AWSECommerceService",
            'ItemPage': u'1',
            'Keywords': keywords,
            'AssociateTag': u'puddletag-20'}
    url = create_aws_url(access_key, secret_key, query_pairs)
    xml = urlopen(url)
    return parse_search_xml(xml)
예제 #59
0
파일: funcs.py 프로젝트: keithgg/puddletag
def in_lib(state, parent=None):
    if state:
        if not status['library']:
            QMessageBox.critical(parent, translate("MusicLib", 'No libraries found'),
                translate("MusicLib", "Load a lib first."))
            return False
        files = status['allfiles']
        lib = status['library']
        libartists = status['library'].artists
        to_highlight = []
        for artist, tracks in split_by_tag(files, 'artist', None).items():
            if artist in libartists:
                libtracks = lib.get_tracks('artist', artist)
                titles = [track['title'][0].lower() 
                    if 'title' in track else '' for track in libtracks]
                for track in tracks:
                    if track.get('title', [u''])[0].lower() in titles:
                        to_highlight.append(track)
        emit('highlight', to_highlight)
        return True
    else:
        emit('highlight', [])
        return False
예제 #60
0
def run_format_func(funcname, arguments, m_audio, s_audio=None, extra=None,
    state=None):
    '''Runs the function function using the arguments specified from pudlestuff.function.

    Arguments:
    funcname  -- String with the function name. Looked up using the
                 dictionary pudlestuff.function.functions
    arguments -- List of arguments to pass to the function. Patterns
                 should not be evaluated. They'll be evaluated here.
    m_audio   -- Audio file containg multiple multiple values per key.
                 Eg. {'artist': [u'Artist1': 'Artist2']}

    Keyword Arguments
    s_audio -- Same as m_audio, but containing strings as values.
               Generated on each run unless also passed.
    extra -- Dictionary containing extra fields that are to be used
             when matching fields.
    state -- Dictionary that hold state. Like {'__count': 15}.
             Used by some functions in puddlestuff.functions
    
    '''
    
    #Get function
    try:
        if isinstance(funcname, basestring):
            func = functions[funcname]
        else:
            func = funcname
    except KeyError:
        raise ParseError(SYNTAX_ERROR.arg(funcname).arg(
            translate('Defaults', 'function does not exist.')))

    extra = {} if extra is None else extra
    s_audio = stringtags(m_audio) if s_audio is None else s_audio
    
    reserved = {'tags': s_audio, 'm_tags': m_audio, 'state': state}
    dicts = [s_audio, extra, state]
    topass = get_function_arguments(funcname, func, arguments, 
        reserved, True, *dicts)

    try:
        ret = func(**topass)
        if ret is None:
            return u''
        return ret
    except TypeError, e:
        message = SYNTAX_ERROR.arg(funcname)
        message = message.arg(arglen_error(e, topass, func, False))
        raise ParseError(message)