2022-02-02 04:44:42 +00:00
|
|
|
|
# -*- 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")
|
2022-03-03 15:10:13 +00:00
|
|
|
|
like_count=0
|
2022-03-03 15:02:25 +00:00
|
|
|
|
try:
|
|
|
|
|
view_count = int(video_info.get("statistics").get("viewCount"))
|
|
|
|
|
except:
|
|
|
|
|
like_count = int(video_info.get("statistics").get("likeCount"))
|
2022-02-02 04:44:42 +00:00
|
|
|
|
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)
|
2022-03-03 15:13:42 +00:00
|
|
|
|
if like_count == 0:
|
2022-03-03 15:18:59 +00:00
|
|
|
|
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)
|
2022-03-03 15:10:13 +00:00
|
|
|
|
else:
|
2022-03-03 15:18:59 +00:00
|
|
|
|
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)
|
2022-02-02 04:44:42 +00:00
|
|
|
|
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")
|
2022-03-03 15:13:42 +00:00
|
|
|
|
like_count=0
|
2022-03-03 15:10:13 +00:00
|
|
|
|
try:
|
|
|
|
|
view_count = int(video_info.get("statistics").get("viewCount"))
|
|
|
|
|
except:
|
|
|
|
|
like_count = int(video_info.get("statistics").get("likeCount"))
|
2022-02-02 04:44:42 +00:00
|
|
|
|
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)
|
2022-03-03 15:13:42 +00:00
|
|
|
|
if like_count == 0:
|
2022-03-03 15:18:59 +00:00
|
|
|
|
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)
|
2022-03-03 15:10:13 +00:00
|
|
|
|
else:
|
2022-03-03 15:18:59 +00:00
|
|
|
|
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)
|
2022-02-02 04:44:42 +00:00
|
|
|
|
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)
|
|
|
|
|
#######################################################################################
|
|
|
|
|
#######################################################################################
|
|
|
|
|
###########################################################################################
|
|
|
|
|
###########################################################################################
|