async def tracks_search(query: types.InlineQuery):
    q = query.query
    if await utils.answer_empty_inline_query(query, q):
        return
    offset = int(query.offset) if query.offset.isdecimal() else 0

    search_results = await deezer_api.search(q=q)
    inline_results = []

    for result in search_results[offset:offset + 10]:
        file_id = await db_utils.get_track(result.id)
        if file_id:
            inline_results.append(
                types.InlineQueryResultCachedAudio(id='done:' +
                                                   utils.random_string(),
                                                   audio_file_id=file_id))
        elif result.preview:
            inline_results.append(
                types.InlineQueryResultAudio(
                    id=f'finish_download:{result.id}:{utils.random_string(4)}',
                    audio_url=result.preview,
                    title=result.title,
                    performer=result.artist.name,
                    audio_duration=30,
                    reply_markup=inline_keyboards.finish_download_keyboard))

    if offset + 11 < len(search_results):
        next_offset = str(offset + 10)
    else:
        next_offset = 'done'
    await bot.answer_inline_query(inline_query_id=query.id,
                                  results=inline_results,
                                  next_offset=next_offset,
                                  cache_time=30)
Beispiel #2
0
async def inline_search(inline_query):
    name = inline_query.query
    music = await music_api.search(name)
    if not music:
        return await bot.answer_inline_query(inline_query.id, [])

    articles = []
    for i in range(min(50, len(music))):
        audio = music[i]
        if not audio or not audio['url']:
            continue
        articles.append(types.InlineQueryResultAudio(
            id=str(hash(audio['url'])),
            audio_url=music_api.get_download_url(audio['url'], audio['artist'], audio['title']),
            performer=audio['artist'],
            title=audio['title']
        ))
    await bot.answer_inline_query(inline_query.id, articles)
async def inline_handler(query):
    q = query.query.replace('.a', '').replace('.ar', '').strip()
    results = []
    if not q:
        return await bot.answer_inline_query(inline_query_id=query.id,
                                             results=results,
                                             switch_pm_text='Search',
                                             switch_pm_parameter='0')
    if query.offset == 'done':
        return await bot.answer_inline_query(inline_query_id=query.id,
                                             results=results)

    if q:
        search_results = await deezer_api.search(q=q)

    if not search_results:
        return await bot.answer_inline_query(
            inline_query_id=query.id,
            results=results,
            switch_pm_text='Nothing was found',
            switch_pm_parameter='0')

    offset = int(query.offset) if query.offset.isdecimal() else 0

    if '.a' in query.query:
        already_in_list = []
        for result in search_results[offset:offset + 5]:
            if result.album.id in already_in_list:
                continue
            already_in_list.append(result.album.id)
            results.append(
                types.InlineQueryResultArticle(
                    id=result.link,
                    title=result.album.title,
                    description=result.artist.name,
                    thumb_url=result.album.cover_small,
                    thumb_width=56,
                    thumb_height=56,
                    input_message_content=types.InputTextMessageContent(
                        f'https://deezer.com/album/{result.album.id}')))
    else:
        for result in search_results[offset:offset + 5]:
            file_id = await db_utils.get_track(result.id)
            if file_id:
                results.append(
                    types.InlineQueryResultCachedAudio(id='done:' +
                                                       utils.random_string(),
                                                       audio_file_id=file_id))
            elif result.preview:
                results.append(
                    types.InlineQueryResultAudio(
                        id=
                        f'finish_download:{result.id}:{utils.random_string(4)}',
                        audio_url=result.preview,
                        title=f'⏳{result.title}',
                        performer=result.artist.name,
                        audio_duration=30,
                        reply_markup=inline_keyboards.finish_download_keyboard)
                )

    if offset + 6 < len(search_results):
        next_offset = str(offset + 5)
    else:
        next_offset = 'done'
    await bot.answer_inline_query(inline_query_id=query.id,
                                  results=results,
                                  next_offset=next_offset,
                                  cache_time=30)
Beispiel #4
0
        await message.answer(texts.ERROR, reply_markup=kb.START)
    except Exception as ex:
        logging.exception(ex)
        await message.answer(texts.ERROR, reply_markup=kb.START)


async def inline_search(inline_query: types.InlineQuery):
    name = inline_query.query
    if not name or not (audios := await music.search(name, inline=True)):
        return await inline_query.answer([])

    # noinspection PyUnboundLocalVariable
    articles = [
        types.InlineQueryResultAudio(id=audio.id,
                                     audio_url=audio.url,
                                     performer=audio.performer,
                                     title=audio.title,
                                     audio_duration=audio.duration)
        for audio in audios[:50]
    ]

    try:
        return await inline_query.answer(articles)
    except exceptions.NetworkError as ex:
        logging.warning(f"inline_search file too large {ex}")
        return await inline_query.answer([], cache_time=0)
    except exceptions.BadRequest as ex:
        logging.warning(f"inline_search error {ex}")
        return await inline_query.answer([], cache_time=0)