main.py 文件源码

python
阅读 17 收藏 0 点赞 0 评论 0

项目:cosette 作者: sepeth 项目源码 文件源码
def tracks():
    """Event Source endpoint for search queries."""
    query = request.args.get('q') or 'pink floyd'
    query = query.lower()

    artists = set()
    if Tag.is_tag(query):
        log.info('Query "%s" seems a tag', query)
        artists.update(Tag(name=query).top_artists)
    elif Artist.is_artist(query):
        log.info('Query "%s" seems an artist name', query)
        artists.update(Artist(name=query).similar_artists)
    else:
        log.info('Query "%s" might be tag or artist', query)
        artists.update(Artist(name=query).similar_artists)
        artists.update(Tag(name=query).top_artists)

    def fetch_artist(artist):
        """Fetch helper to run inside greenlet."""
        hit = artist.hit_track
        if hit:
            if not hit.youtube_id:
                log.info("Couldn't find youtube id, skipping track %s", hit)
                return
            hit_queue.put({
                'name': str(hit),
                'youtubeId': hit.youtube_id,
                'thumbnailUrl': hit.thumbnail_url,
            })

    hit_queue = queue.Queue()
    fetch_pool = pool.Pool(10)
    glet = fetch_pool.map_async(fetch_artist, artists)

    def gen():
        """Generate response by yielding to event source."""
        hits = []
        tried = 0
        while glet:
            try:
                hit = hit_queue.get(timeout=1)
            except queue.Empty:
                tried += 1
                if tried >= 30:
                    log.info('Query "%s" took too much, giving up', query)
                    fetch_pool.kill()
                    break
                if glet:
                    continue
                else:
                    break
            hits.append(hit)
            yield ('event: song\ndata: %s\n\n' % json.dumps(hit)).encode('utf-8')
        Track.save_hits(hits)
        yield 'event: finish\ndata: finish\n\n'.encode('utf-8')

    return Response(gen(), mimetype='text/event-stream')
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号