示例#1
0
文件: views.py 项目: lidel/mmda
def show_search_result(request, query_type, query_string, query_id):
    """
    Display CachedSearchResult.

    If document is missing create new one using RESTful query redirect.

    @param query_type: a string containing query type
    @param query_string: a string containing query
    @param query_id: a string containing an ID of a CachedSearchResult document

    @return: a HttpResponseRedirect object or rendered search result page
    """
    # TODO: add meta-header for robots: nocahe, norobots etc
    try:
        search_result = CachedSearchResult.get(query_id)
    except ResourceNotFound:
        return HttpResponseRedirect(reverse("create-search-result", args=(query_type, query_string)))

    # SEO check
    seo_query_type = slugify2(search_result.query_type)
    seo_query_string = slugify2(search_result.query_string)
    if query_type != seo_query_type or query_string != seo_query_string:
        return HttpResponseRedirect(reverse("show-search-result", args=(seo_query_type, seo_query_string, query_id)))
    # TODO: if only 1 result, redirect to it directly
    return render_to_response("search/%s_results.html" % search_result.query_type, locals())
示例#2
0
文件: search.py 项目: lidel/mmda
def get_basic_cached_search_result(query_type, query_string):
    """
    Make sure proper CachedSearchResult is present and return its id.

    Method performs local, then optional remote (MusicBrainz) lookup of query result

    @param query_type: a string containing query type
    @param query_string: a string containing query

    @return: a string containing SHA1 hash of a query string (the ID of a CachedSearchResult document)
    """
    query_id        = hashlib.sha1((query_type+query_string).encode('utf-8')).hexdigest()
    search_result   = CachedSearchResult.get_or_create(query_id)
    search_result.query_string  = query_string
    search_result.query_type    = query_type
    if 'mb' not in search_result.cache_state: #TODO: add 14day window check

        try:
            t = mmda_logger('mb','request','search for',query_string)

            if query_type == 'artist':
                filter  = ws.ArtistFilter(name=query_string,limit=RESULTS_LIMIT)
                results = mb_query.getArtists(filter) #TODO: add try, or maybe better in 'create_search' as a global wrapper
                search_result.results = [ {'name':r.artist.name, 'mbid':extractUuid(r.artist.id), 'score':r.score, 'note':r.artist.disambiguation } for r in results ]

            elif query_type == 'release':
                filter  = ws.ReleaseFilter(title=query_string,limit=RESULTS_LIMIT)
                results = mb_query.getReleases(filter) #TODO: add try, or maybe better in 'create_search' as a global wrapper
                search_result.results = [ {'artist':r.release.artist.name, 'title':r.release.title, 'mbid':extractUuid(r.release.id), 'artist_mbid':extractUuid(r.release.artist.id), 'score':r.score, 'tracks_count':r.release.tracksCount, 'year':r.release.getEarliestReleaseEvent().getDate() if r.release.getEarliestReleaseEvent() else None} for r in results ]

            elif query_type == 'tag':
                # TODO: refactor to other packages
                import pylast
                lastfm = pylast.get_lastfm_network(api_key = settings.LASTFM_API_KEY)
                lastfm_similar_tags = lastfm.search_for_tag(query_string).get_next_page()
                search_result.results = [ tag.name for tag in lastfm_similar_tags ]

        except Exception, e:
            # TODO: hard error here
            mmda_logger('search','ERROR',e)
            raise e
        else:
            mmda_logger('mb','result','results',len(search_result.results),t)
            search_result.cache_state['mb'] = [1,datetime.utcnow()]
            search_result.save()