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 os
import sys
from dataclasses import dataclass
from dataclasses import dataclass, field
from distutils.util import strtobool
import re
import discord
import youtube_dl
@ -25,6 +26,14 @@ class Song:
title: str
webpage_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):
@ -100,7 +109,7 @@ class Music(commands.Cog):
self._next()
self.logger.info('Now playing: %s (%s)', song.title, song.webpage_url)
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)
await self._add_skip_button(msg)
# pylint: disable=broad-except
@ -142,7 +151,7 @@ class Music(commands.Cog):
self.logger.info('Qeueing song: %s (%s)', song.title, song.webpage_url)
await self._queue.put((ctx, song))
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)
def _skip(self, voice_client):

View File

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

View File

@ -21,8 +21,8 @@ async def test_bot_ensure_voice(mbot, ctx):
await mbot.ensure_voice(ctx)
def mock_ytdl_extract_info(ytdl, url, title):
ytdl.extract_info.return_value = {'entries': [{'url': url, 'title': title}]}
def mock_ytdl_extract_info(ytdl, *, title, webpage_url, audio_url):
ytdl.extract_info.return_value = {'entries': [{'title': title, 'webpage_url': webpage_url, 'url': audio_url}]}
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
url = 'https://www.youtube.com/watch?v=Wr9LZ1hAFpQ'
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)
query = 'in flames deliver us'
# 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
url = 'https://www.youtube.com/watch?v=pMDcYX2wRSg'
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)
# pylint: disable=too-many-function-args
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
url = 'https://www.youtube.com/watch?v=Wr9LZ1hAFpQ'
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)
query = 'in flames deliver us'
# 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
url = 'https://www.youtube.com/watch?v=pMDcYX2wRSg'
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)
# pylint: disable=too-many-function-args
query = 'three days grace time of dying'