Added youtube search functionality, code sucks btw

This commit is contained in:
mrhanky 2017-05-29 14:43:04 +02:00
parent db8b0a4d4c
commit b0dafcfef9
No known key found for this signature in database
GPG Key ID: 67D772C481CB41B8

View File

@ -4,12 +4,16 @@ import os
import re import re
import requests import requests
from docopt import Dict as DocOptDict
from irc3 import event, IrcBot from irc3 import event, IrcBot
from irc3.plugins.command import command
from irc3.utils import IrcString
from . import Plugin from . import Plugin
from ..utils import fmt, date_from_iso from ..utils import fmt, date_from_iso
# TODO: write better code lol
@irc3.plugin @irc3.plugin
class YouTube(Plugin): class YouTube(Plugin):
requires = ['irc3.plugins.command'] requires = ['irc3.plugins.command']
@ -22,21 +26,18 @@ class YouTube(Plugin):
super().__init__(bot) super().__init__(bot)
self.GOOGLE_API_KEY = os.environ['GOOGLE_API_KEY'] self.GOOGLE_API_KEY = os.environ['GOOGLE_API_KEY']
@event(r'(?i)^:.* PRIVMSG (?P<target>.*) :.*(?:youtube.*?(?:v=|/v/)' def get_video_data(self, item: dict):
r'|youtu\.be/)(?P<video_id>[-_a-zA-Z0-9]+).*')
def youtube_parser(self, target: str, video_id: str):
req = requests.get(self.API, params={
'key': self.GOOGLE_API_KEY,
'id': video_id})
data = req.json()
if not data['items']:
return
item = data['items'][0]
date = date_from_iso(item['snippet']['publishedAt']) date = date_from_iso(item['snippet']['publishedAt'])
try:
length = item['contentDetails']['duration'] length = item['contentDetails']['duration']
length = re.findall('(\d+[DHMS])', length) length = [l.lower() for l in re.findall('(\d+[DHMS])', length)]
length = ' - length {}'.format(' '.join(length))
except KeyError:
length = ''
try:
views = int(item['statistics'].get('viewCount', 0))
likes = int(item['statistics'].get('likeCount', 0)) likes = int(item['statistics'].get('likeCount', 0))
dislikes = int(item['statistics'].get('dislikeCount', 0)) dislikes = int(item['statistics'].get('dislikeCount', 0))
@ -45,15 +46,51 @@ class YouTube(Plugin):
except ZeroDivisionError: except ZeroDivisionError:
score = 0 score = 0
text = fmt('{title} - length {length} -{color}{green} {likes:,}{reset}' stats = fmt(' -{color}{green} {likes:,}{reset} /{color}{maroon} '
' /{color}{maroon} {dislikes:,}{reset} ({score:,.1f}%) - ' '{dislikes:,}{reset} ({score:,.1f}%) '
'{views:,} views - {channel} on {date}', '- {views:,} views',
title=item['snippet']['localized']['title'],
channel=item['snippet']['channelTitle'],
length=' '.join([l.lower() for l in length]),
date=date.strftime('%Y.%m.%d'),
views=int(item['statistics'].get('viewCount', 0)),
likes=likes, likes=likes,
dislikes=dislikes, dislikes=dislikes,
score=score) score=score,
self.bot.privmsg(target, text) views=views)
except KeyError:
stats = ''
return fmt('{title}{length}{stats} - {channel} on {date}',
title=item['snippet']['title'],
channel=item['snippet']['channelTitle'],
length=length,
date=date.strftime('%Y.%m.%d'),
stats=stats)
@event(r'(?i)^:.* PRIVMSG (?P<target>.*) :.*(?:youtube.*?(?:v=|/v/)'
r'|youtu\.be/)(?P<video_id>[-_a-zA-Z0-9]+).*')
def youtube_parser(self, target: str, video_id: str):
req = requests.get(self.API, params={
'key': self.GOOGLE_API_KEY,
'id': video_id})
data = req.json()
if data['items']:
self.bot.privmsg(target, self.get_video_data(data['items'][0]))
@command
def yt(self, mask: IrcString, channel: IrcString, args: DocOptDict):
"""Searches for query on YouTube and returns first result.
%%yt <query>...
"""
req = requests.get(self.SEARCH, params={
'key': self.GOOGLE_API_KEY,
'q': ' '.join(args['<query>'])})
data = req.json()
if 'error' in data:
return '[YouTube] Error performing search'
elif data['pageInfo']['totalResults'] is 0:
return '[YouTube] No results found'
else:
item = data['items'][0]
return '{response} - https://youtu.be/{video_id}'.format(
response=self.get_video_data(item),
video_id=item['id']['videoId'])