156 lines
8.7 KiB
Python
156 lines
8.7 KiB
Python
# -*- coding: utf-8 -*-
|
||
from irc3.plugins.command import command
|
||
import irc3
|
||
import os
|
||
import re
|
||
import datetime
|
||
import dateutil.parser
|
||
import timeago
|
||
import isodate
|
||
from apiclient.discovery import build
|
||
dir_path = os.path.dirname(os.path.realpath(__file__))
|
||
DEVELOPER_KEY = os.environ['DEVELOPER_KEY']
|
||
YOUTUBE_API_SERVICE_NAME = "youtube"
|
||
YOUTUBE_API_VERSION = "v3"
|
||
YOUTUBE_REGEX = re.compile('http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(&(amp;)?[\w\?=]*)?', re.IGNORECASE)
|
||
youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION, developerKey=DEVELOPER_KEY)
|
||
###########################################################################################
|
||
###########################################################################################
|
||
@irc3.plugin
|
||
class Plugin:
|
||
#######################################################################################
|
||
#######################################################################################
|
||
def __init__(self, bot):
|
||
self.bot = bot
|
||
self.bot.channel_live = []
|
||
#######################################################################################
|
||
#######################################################################################
|
||
@irc3.extend
|
||
def youtube_search(self, q=None, eventType=None, max_results=1, order="relevance", channelId=None, token=None, location=None, location_radius=None):
|
||
search_response = youtube.search().list(
|
||
q=q,
|
||
channelId=channelId,
|
||
type="video",
|
||
pageToken=token,
|
||
order=order,
|
||
eventType=eventType,
|
||
part="id,snippet",
|
||
maxResults=max_results,
|
||
location=location,
|
||
locationRadius=location_radius
|
||
).execute()
|
||
for search_result in search_response.get("items", []):
|
||
if search_result["id"]["kind"] == "youtube#video":
|
||
return(search_result)
|
||
#######################################################################################
|
||
#######################################################################################
|
||
@irc3.event(irc3.rfc.PRIVMSG)
|
||
def on_privmsg_search_for_youtube(self, mask=None, target=None, data=None, **kw):
|
||
if data.startswith("?"): return
|
||
if self.bot.check_if_ignored(mask): return
|
||
self.__check_for_youtube(mask, data, target)
|
||
#######################################################################################
|
||
#######################################################################################
|
||
def __check_for_youtube(self, mask, msg, target):
|
||
match_list = YOUTUBE_REGEX.findall(msg)
|
||
if match_list:
|
||
video_id = match_list.pop()
|
||
if int(len(video_id)) == 3:
|
||
video_id = video_id[0]
|
||
video_info = self.videos_list_by_id(id=video_id)
|
||
title = video_info.get("snippet",{}).get("title")
|
||
published_at = video_info.get("snippet",{}).get("publishedAt")
|
||
like_count=0
|
||
try:
|
||
view_count = int(video_info.get("statistics").get("viewCount"))
|
||
except:
|
||
like_count = int(video_info.get("statistics").get("likeCount"))
|
||
if published_at:
|
||
published_at = dateutil.parser.parse(published_at)
|
||
published_at = timeago.format(published_at.replace(tzinfo=None), datetime.datetime.now())
|
||
try:
|
||
topics = video_info.get("topicDetails",{}).get("topicCategories")
|
||
topics[:] = [i.replace("https://en.wikipedia.org/wiki/", "").replace("_"," ").title() for i in topics]
|
||
except:
|
||
topics = []
|
||
duration = isodate.parse_duration(video_info.get("contentDetails").get("duration"))
|
||
msg = "\x02\x0302{nick:}\x0F\x02\x0304 ▶▶ \x02\x0303\x1D\x1F{title:}\x0F".format(nick=mask.nick, title=title)
|
||
msg = msg + "\x02\x1D\x0304 ▶ \x0F\x1D\x0314Duration: \x0F\x1D{duration:} \x0F".format(duration=duration)
|
||
if like_count == 0:
|
||
msg = msg + "\x0F\x1D\x0314Published: \x0F\x1D{published:} \x0F\x1D\x0314Views: \x0F\x1D{views:,} \x0F\x1D\x0314Type: \x0F\x1DVideo\x0F".format(published=published_at, views=view_count)
|
||
else:
|
||
msg = msg + "\x0F\x1D\x0314Published: \x0F\x1D{published:} \x0F\x1D\x0314Likes: \x0F\x1D{views:,} \x0F\x1D\x0314Type: \x0F\x1DMovie\x0F".format(published=published_at, views=like_count)
|
||
msg = msg + "\x0F\x02\x0312 ♫ \x0F\x02\x0313\x1D{topics:}\x0F\x02\x0312".format(topics=", ".join(topics))
|
||
msg = msg
|
||
msg = self.bot.emo(msg)
|
||
self.bot.privmsg(target,msg)
|
||
#######################################################################################
|
||
#######################################################################################
|
||
@irc3.extend
|
||
def videos_list_by_id(self, id):
|
||
search_response = youtube.videos().list(part="id,snippet,statistics,topicDetails,contentDetails", id=id).execute()
|
||
for search_result in search_response.get("items", []):
|
||
if search_result["kind"] == "youtube#video":
|
||
return(search_result)
|
||
#######################################################################################
|
||
#######################################################################################
|
||
@command(permission='view', public=True, show_in_help_list=True)
|
||
def y(self, *args, **kwargs):
|
||
"""Search for youtube video
|
||
%%y <keyword>...
|
||
"""
|
||
return self.yt(*args)
|
||
#######################################################################################
|
||
#######################################################################################
|
||
@irc3.extend
|
||
@command(permission='view')
|
||
def yt(self, mask, target, args):
|
||
"""Search for youtube video
|
||
%%yt <keyword>...
|
||
"""
|
||
keyword = ' '.join(args['<keyword>'])
|
||
video = self.youtube_search(q=keyword)
|
||
if video:
|
||
video_id = video.get("id",{}).get("videoId")
|
||
video = video.get("snippet")
|
||
video_info = self.videos_list_by_id(id=video_id)
|
||
title = video_info.get("snippet",{}).get("title")
|
||
published_at = video_info.get("snippet",{}).get("publishedAt")
|
||
like_count=0
|
||
try:
|
||
view_count = int(video_info.get("statistics").get("viewCount"))
|
||
except:
|
||
like_count = int(video_info.get("statistics").get("likeCount"))
|
||
if published_at:
|
||
published_at = dateutil.parser.parse(published_at)
|
||
published_at = timeago.format(published_at.replace(tzinfo=None), datetime.datetime.now())
|
||
try:
|
||
topics = video_info.get("topicDetails",{}).get("topicCategories")
|
||
topics[:] = [i.replace("https://en.wikipedia.org/wiki/", "").replace("_"," ").title() for i in topics]
|
||
except:
|
||
topics = []
|
||
duration = isodate.parse_duration(video_info.get("contentDetails").get("duration"))
|
||
url = "https://youtu.be/{}".format(video_id)
|
||
_nick = ""
|
||
try:
|
||
if len(self.bot.madjust) > 0:
|
||
_nick = self.bot.madjust
|
||
else:
|
||
_nick = mask.nick
|
||
except:
|
||
_nick = mask.nick
|
||
msg = "\x02\x0302{nick:}\x0F\x02\x0304 ▶▶ \x02\x0303\x1D\x1F{title:}\x0F".format(nick=_nick, title=title)
|
||
msg = msg + "\x02\x1D\x0304 ▶ \x0F\x1D\x0314Duration: \x0F\x1D{duration:} \x0F".format(duration=duration)
|
||
if like_count == 0:
|
||
msg = msg + "\x0F\x1D\x0314Published: \x0F\x1D{published:} \x0F\x1D\x0314Views: \x0F\x1D{views:,} \x0F\x1D\x0314Type: \x0F\x1DVideo\x0F".format(published=published_at, views=view_count)
|
||
else:
|
||
msg = msg + "\x0F\x1D\x0314Published: \x0F\x1D{published:} \x0F\x1D\x0314Likes: \x0F\x1D{views:,} \x0F\x1D\x0314Type: \x0F\x1DMovie\x0F".format(published=published_at, views=like_count)
|
||
msg = msg + "\x0F\x02\x0312 ♫ \x0F\x02\x0313\x1D{topics:}\x0F\x02\x0312 ".format(topics=", ".join(topics))
|
||
msg = msg + url
|
||
msg = self.bot.emo(msg)
|
||
self.bot.privmsg(target, msg)
|
||
#######################################################################################
|
||
#######################################################################################
|
||
###########################################################################################
|
||
###########################################################################################
|