1
Fork 0
mirror of https://github.com/RYGhub/royalnet.git synced 2024-11-23 19:44:20 +00:00

**Add queue mode "continue with next related video"**

This commit is contained in:
Steffo 2019-01-04 18:39:48 +01:00
parent a89f95817c
commit be591ba63e
2 changed files with 35 additions and 6 deletions

View file

@ -25,6 +25,7 @@ import coloredlogs
import errors import errors
import math import math
import enum import enum
import requests
logging.getLogger().disabled = True logging.getLogger().disabled = True
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -107,7 +108,7 @@ class Video:
"""Create an AudioSource to be played through Discord, and store and return it.""" """Create an AudioSource to be played through Discord, and store and return it."""
raise NotImplementedError() raise NotImplementedError()
def get_suggestion(self): def get_suggestion(self) -> typing.Optional["Video"]:
"""Get the next suggested video, to be used when the queue is in LoopMode.FOLLOW_SUGGESTION""" """Get the next suggested video, to be used when the queue is in LoopMode.FOLLOW_SUGGESTION"""
raise NotImplementedError() raise NotImplementedError()
@ -115,10 +116,11 @@ class Video:
class YoutubeDLVideo(Video): class YoutubeDLVideo(Video):
"""A file sourcing from YoutubeDL.""" """A file sourcing from YoutubeDL."""
def __init__(self, url, enqueuer: typing.Optional[discord.Member] = None): def __init__(self, url, enqueuer: typing.Optional[discord.Member] = None, *, youtube_api_key: str = None):
super().__init__(enqueuer) super().__init__(enqueuer)
self.url = url self.url = url
self.info = None self.info = None
self.youtube_api_key = youtube_api_key
def get_info(self): def get_info(self):
"""Get info about the video.""" """Get info about the video."""
@ -184,8 +186,31 @@ class YoutubeDLVideo(Video):
self.audio_source = discord.PCMVolumeTransformer(discord.FFmpegPCMAudio(self.get_filename(), **ffmpeg_settings)) self.audio_source = discord.PCMVolumeTransformer(discord.FFmpegPCMAudio(self.get_filename(), **ffmpeg_settings))
return self.audio_source return self.audio_source
def get_suggestion(self): def get_suggestion(self) -> typing.Optional["YoutubeDLVideo"]:
if self.info["extractor"] != "youtube":
# TODO: add more websites?
return None return None
if self.youtube_api_key is None:
raise errors.MissingAPIKeyError()
# Ensure the video has info
self.get_info()
# Request search data (costs 100 API units)
r = requests.get("https://www.googleapis.com/youtube/v3/search?part=snippet", params={
"part": "snippet",
"type": "video",
"key": self.youtube_api_key,
"relatedToVideoId": self.info["id"]
})
r.raise_for_status()
# Parse the request data
j = r.json()
# Find the suggested video
if len(j["items"]) < 1:
raise errors.NotFoundError()
first_video_id = j["items"][0]["id"]["videoId"]
return YoutubeDLVideo(f"https://www.youtube.com/watch?v={first_video_id}",
enqueuer=None,
youtube_api_key=self.youtube_api_key)
class LoopMode(enum.Enum): class LoopMode(enum.Enum):
@ -1180,8 +1205,8 @@ class RoyalDiscordBot(discord.Client):
self.video_queue.loop_mode = LoopMode.LOOP_QUEUE self.video_queue.loop_mode = LoopMode.LOOP_QUEUE
await channel.send("🔁 Modalità di coda impostata: **Ripeti intera coda**") await channel.send("🔁 Modalità di coda impostata: **Ripeti intera coda**")
elif params[1] == "suggest": elif params[1] == "suggest":
# self.video_queue.loop_mode = LoopMode.FOLLOW_SUGGESTIONS self.video_queue.loop_mode = LoopMode.FOLLOW_SUGGESTIONS
await channel.send("⚠️ La modalità **Continua con video suggeriti** non è ancora stata implementata.") await channel.send("🌈️ Modalità di coda impostata: **Continua con video suggeriti**")
elif params[1] == "random": elif params[1] == "random":
self.video_queue.loop_mode = LoopMode.AUTO_SHUFFLE self.video_queue.loop_mode = LoopMode.AUTO_SHUFFLE
await channel.send("🔀 Modalità di coda impostata: **Video casuale dalla coda**") await channel.send("🔀 Modalità di coda impostata: **Video casuale dalla coda**")

View file

@ -52,3 +52,7 @@ class PrivateError(Exception):
class PastDateError(Exception): class PastDateError(Exception):
pass pass
class MissingAPIKeyError(Exception):
pass