Improve embeds

- Use url attribute to add link to title
- Add video thumbnail as embed image
This commit is contained in:
ekzyis 2022-09-26 22:25:13 +02:00
parent 4e1815f3b1
commit 5fe52d480d
3 changed files with 27 additions and 13 deletions

View File

@ -2,8 +2,9 @@ import asyncio
import logging import logging
import os import os
import sys import sys
from dataclasses import dataclass from dataclasses import dataclass, field
from distutils.util import strtobool from distutils.util import strtobool
import re
import discord import discord
import youtube_dl import youtube_dl
@ -25,6 +26,14 @@ class Song:
title: str title: str
webpage_url: str webpage_url: str
audio_url: str audio_url: str
video_id: str = field(init=False)
image_url: str = field(init=False)
def __post_init__(self):
video_url = self.webpage_url
if match := re.search(r'youtube\.com\/watch\?v=(?P<video_id>[a-zA-Z0-9]+)', video_url):
self.video_id = match.group('video_id')
self.image_url = f'https://img.youtube.com/vi/{self.video_id}/hqdefault.jpg'
class Music(commands.Cog): class Music(commands.Cog):
@ -100,7 +109,7 @@ class Music(commands.Cog):
self._next() self._next()
self.logger.info('Now playing: %s (%s)', song.title, song.webpage_url) self.logger.info('Now playing: %s (%s)', song.title, song.webpage_url)
ctx.voice_client.play(audio, after=after) ctx.voice_client.play(audio, after=after)
embed = NowPlayingMessage(title=song.title, url=song.webpage_url) embed = NowPlayingMessage(title=song.title, url=song.webpage_url, image_url=song.image_url)
msg = await ctx.send(embed=embed) msg = await ctx.send(embed=embed)
await self._add_skip_button(msg) await self._add_skip_button(msg)
# pylint: disable=broad-except # pylint: disable=broad-except
@ -142,7 +151,7 @@ class Music(commands.Cog):
self.logger.info('Qeueing song: %s (%s)', song.title, song.webpage_url) self.logger.info('Qeueing song: %s (%s)', song.title, song.webpage_url)
await self._queue.put((ctx, song)) await self._queue.put((ctx, song))
if ctx.voice_client.is_playing(): if ctx.voice_client.is_playing():
embed = QueuedMessage(title=song.title, url=song.webpage_url) embed = QueuedMessage(title=song.title, url=song.webpage_url, image_url=song.image_url)
await ctx.send(embed=embed) await ctx.send(embed=embed)
def _skip(self, voice_client): def _skip(self, voice_client):

View File

@ -13,6 +13,9 @@ class BotMessage(discord.Embed):
**kwargs, **kwargs,
title=title title=title
) )
image_url = kwargs.pop('image_url', None)
if image_url:
super().set_image(url=image_url)
class ErrorMessage(BotMessage): class ErrorMessage(BotMessage):
@ -31,18 +34,20 @@ class ErrorMessage(BotMessage):
class NowPlayingMessage(BotMessage): class NowPlayingMessage(BotMessage):
def __init__(self, title, url): def __init__(self, title, url, image_url):
super().__init__( super().__init__(
title=f'Now playing: {title}', title=f'Now playing: {title}',
description=url, url=url,
image_url=image_url,
color=discord.Color.green() color=discord.Color.green()
) )
class QueuedMessage(BotMessage): class QueuedMessage(BotMessage):
def __init__(self, title, url): def __init__(self, title, url, image_url):
super().__init__( super().__init__(
title=f'Queued: {title}', title=f'Queued: {title}',
description=url, url=url,
image_url=image_url,
color=discord.Color.blue() color=discord.Color.blue()
) )

View File

@ -21,8 +21,8 @@ async def test_bot_ensure_voice(mbot, ctx):
await mbot.ensure_voice(ctx) await mbot.ensure_voice(ctx)
def mock_ytdl_extract_info(ytdl, url, title): def mock_ytdl_extract_info(ytdl, *, title, webpage_url, audio_url):
ytdl.extract_info.return_value = {'entries': [{'url': url, 'title': title}]} ytdl.extract_info.return_value = {'entries': [{'title': title, 'webpage_url': webpage_url, 'url': audio_url}]}
def mock_ffmpeg_pcm_audio(ffmpeg_pcm_audio): def mock_ffmpeg_pcm_audio(ffmpeg_pcm_audio):
@ -40,7 +40,7 @@ async def test_bot_playback(mbot, ctx):
ctx.voice_client.is_playing.return_value = False ctx.voice_client.is_playing.return_value = False
url = 'https://www.youtube.com/watch?v=Wr9LZ1hAFpQ' url = 'https://www.youtube.com/watch?v=Wr9LZ1hAFpQ'
title = 'In Flames - Deliver Us (Official Video)' title = 'In Flames - Deliver Us (Official Video)'
mock_ytdl_extract_info(ytdl, url, title) mock_ytdl_extract_info(ytdl, title=title, webpage_url=url, audio_url=url)
deliver_us_audio = mock_ffmpeg_pcm_audio(ffmpeg_pcm_audio) deliver_us_audio = mock_ffmpeg_pcm_audio(ffmpeg_pcm_audio)
query = 'in flames deliver us' query = 'in flames deliver us'
# pylint: disable=too-many-function-args # pylint: disable=too-many-function-args
@ -71,7 +71,7 @@ async def test_bot_playback(mbot, ctx):
ctx.voice_client.is_playing.return_value = True ctx.voice_client.is_playing.return_value = True
url = 'https://www.youtube.com/watch?v=pMDcYX2wRSg' url = 'https://www.youtube.com/watch?v=pMDcYX2wRSg'
title = 'Three Days Grace - Time of Dying (lyrics)' title = 'Three Days Grace - Time of Dying (lyrics)'
mock_ytdl_extract_info(ytdl, url, title) mock_ytdl_extract_info(ytdl, title=title, webpage_url=url, audio_url=url)
time_of_dying_audio = mock_ffmpeg_pcm_audio(ffmpeg_pcm_audio) time_of_dying_audio = mock_ffmpeg_pcm_audio(ffmpeg_pcm_audio)
# pylint: disable=too-many-function-args # pylint: disable=too-many-function-args
query = 'three days grace time of dying' query = 'three days grace time of dying'
@ -111,7 +111,7 @@ async def test_bot_skip(mbot, ctx):
ctx.voice_client.is_playing.return_value = False ctx.voice_client.is_playing.return_value = False
url = 'https://www.youtube.com/watch?v=Wr9LZ1hAFpQ' url = 'https://www.youtube.com/watch?v=Wr9LZ1hAFpQ'
title = 'In Flames - Deliver Us (Official Video)' title = 'In Flames - Deliver Us (Official Video)'
mock_ytdl_extract_info(ytdl, url, title) mock_ytdl_extract_info(ytdl, title=title, webpage_url=url, audio_url=url)
deliver_us_audio = mock_ffmpeg_pcm_audio(ffmpeg_pcm_audio) deliver_us_audio = mock_ffmpeg_pcm_audio(ffmpeg_pcm_audio)
query = 'in flames deliver us' query = 'in flames deliver us'
# pylint: disable=too-many-function-args # pylint: disable=too-many-function-args
@ -125,7 +125,7 @@ async def test_bot_skip(mbot, ctx):
ctx.voice_client.is_playing.return_value = True ctx.voice_client.is_playing.return_value = True
url = 'https://www.youtube.com/watch?v=pMDcYX2wRSg' url = 'https://www.youtube.com/watch?v=pMDcYX2wRSg'
title = 'Three Days Grace - Time of Dying (lyrics)' title = 'Three Days Grace - Time of Dying (lyrics)'
mock_ytdl_extract_info(ytdl, url, title) mock_ytdl_extract_info(ytdl, title=title, webpage_url=url, audio_url=url)
time_of_dying_audio = mock_ffmpeg_pcm_audio(ffmpeg_pcm_audio) time_of_dying_audio = mock_ffmpeg_pcm_audio(ffmpeg_pcm_audio)
# pylint: disable=too-many-function-args # pylint: disable=too-many-function-args
query = 'three days grace time of dying' query = 'three days grace time of dying'