Ejemplo n.º 1
0
Archivo: views.py Proyecto: jkal/sndidx
def search(request):
    """
    Find songs by searching on their fields.

    Query Mongo to get all matching documents. Return the ID, title
    and artist values of each match.
    """
    query_dict = {}
    for k, v in request.GET.iteritems():
        if v:
            query_dict[k] = re.compile('.*%s.*' % v, re.IGNORECASE)

    res = col.find(query_dict, {
        'song_id': 1, 'title': 1, 'artist': 1
    })

    return render(request, 'results.html', {
        'results': [i for i in res]
    })
Ejemplo n.º 2
0
Archivo: views.py Proyecto: jkal/sndidx
def results(request, code):
    k = int(request.GET.get('k', 1))

    query = queries.find_one({
        'md5': code
    })

    if not query:
        raise Http404

    segments = query['segments']

    all_song_ids = []
    q_timbre_values = []
    q_loudness_values = []
    q_pitch_values = []

    for segment in segments:
        loudness = segment['loudness_max']
        timbre = scipy.array(segment['timbre']).var()
        pitch = scipy.array(segment['pitches']).mean()

        q_timbre_values.append(timbre)
        q_loudness_values.append(loudness)
        q_pitch_values.append(pitch)

        bbox = (
            timbre, loudness, pitch,
            timbre, loudness, pitch
        )

        nearest = idx.nearest(bbox, 1, objects=True)
        node_ids = [x.object for x in nearest]
        all_song_ids.extend(node_ids)

    # Drop duplicates.
    ids = set(all_song_ids)

    # Fetch the nearest documents from Mongo.
    res = col.find({
        'song_id': {'$in': list(ids)}
    }, {
        'song_id': 1, 'title': 1, 'artist': 1, 'features': 1
    })

    # Compute distances.
    results = []
    for doc in res:
        features = doc['features']
        timbre_values = map(lambda x: x['timbre'], features)
        loudness_values = map(lambda x: x['loudness'], features)
        pitch_values = map(lambda x: x['pitch'], features)

        # Calculate distances
        timbre_dis = distance(timbre_values, q_timbre_values)
        loudness_dis = distance(loudness_values, q_loudness_values)
        pitch_dis = distance(pitch_values, q_pitch_values)

        doc['timbre_dis'] = timbre_dis
        doc['loudness_dis'] = loudness_dis
        doc['pitch_dis'] = pitch_dis
        doc['all'] = (timbre_dis * pitch_dis) + 100*loudness_dis

        results.append(doc)

    sorted_res = sorted(results, key=operator.itemgetter('all'))

    return render(request, 'results_content.html', {
        'results': sorted_res[:k],
        'query': query
    })