Edm0nd/edmond/plugins/youtube.py
2022-08-15 13:39:50 +02:00

83 lines
2.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

try:
from googleapiclient.discovery import build as gapi_discovery_build
from googleapiclient.errors import Error as GoogleApiError
DEPENDENCIES_FOUND = True
except ImportError:
DEPENDENCIES_FOUND = False
from edmond.plugin import Plugin
class YoutubePlugin(Plugin):
REQUIRED_CONFIGS = ["commands", "api_key"]
VIDEO_URL_FMT = "https://www.youtube.com/watch?v={}"
CHANNEL_URL_FMT = "https://www.youtube.com/channel/{}"
PLAYLIST_URL_FMT = "https://www.youtube.com/playlist?list={}"
def __init__(self, bot):
super().__init__(bot)
self._youtube = None
@property
def youtube(self):
if self._youtube is None:
self._youtube = gapi_discovery_build(
"youtube", "v3", developerKey=self.config["api_key"]
)
return self._youtube
def has_api_key(self):
return self.config["api_key"] != ""
def on_pubmsg(self, event):
if not self.has_api_key():
return False
if self.should_handle_command(event.arguments[0]):
self.handle_commands(event.target)
return True
return False
def handle_commands(self, target):
if self.command.ident != self.config["commands"][0]:
return
try:
search_response = (
self.youtube.search()
.list(
q=self.command.content,
part="id,snippet",
maxResults=1,
)
.execute()
)
except GoogleApiError:
self.signal_failure(target)
return
link = ""
icon = ""
title = ""
for result in search_response.get("items", []):
kind = result["id"]["kind"]
if kind == "youtube#video":
video_id = result["id"]["videoId"]
link = self.VIDEO_URL_FMT.format(video_id)
icon = "📼"
elif kind == "youtube#channel":
channel_id = result["id"]["channelId"]
link = self.CHANNEL_URL_FMT.format(channel_id)
icon = "📺"
elif kind == "youtube#playlist":
playlist_id = result["id"]["playlistId"]
link = self.PLAYLIST_URL_FMT.format(playlist_id)
icon = ""
if link:
title = result["snippet"]["title"]
break
else:
self.signal_failure(target)
return
self.bot.say(target, f"{icon} {link} {title}")