2015-05-30 13:17:46 +00:00
from urllib . parse import urlparse
2015-06-11 05:06:44 +00:00
import re , json , subprocess
2015-05-30 13:17:46 +00:00
2015-05-29 11:54:00 +00:00
from nemubot . exception import IRCException
from nemubot . hooks import hook
from nemubot . tools . web import getURLContent
from more import Response
2015-05-30 13:17:46 +00:00
""" Get information of youtube videos """
2015-05-29 11:54:00 +00:00
2015-05-30 13:17:46 +00:00
nemubotversion = 3.4
2015-05-29 11:54:00 +00:00
def help_full ( ) :
2015-05-30 13:17:46 +00:00
return " !yt [<url>]: with an argument, get information about the given link; without arguments, use the latest youtube link seen on the current channel. "
2015-06-11 05:06:44 +00:00
def _get_ytdl ( links ) :
cmd = ' youtube-dl -j -- ' . split ( )
cmd . extend ( links )
res = [ ]
with subprocess . Popen ( cmd , stdout = subprocess . PIPE ) as p :
if p . wait ( ) > 0 :
raise IRCException ( " Error while retrieving video information. " )
for line in p . stdout . read ( ) . split ( b " \n " ) :
localres = ' '
if not line :
continue
info = json . loads ( line . decode ( ' utf-8 ' ) )
if info . get ( ' fulltitle ' ) :
localres + = info [ ' fulltitle ' ]
elif info . get ( ' title ' ) :
localres + = info [ ' title ' ]
else :
continue
if info . get ( ' duration ' ) :
d = info [ ' duration ' ]
localres + = ' [ {0} : {1:06.3f} ] ' . format ( int ( d / 60 ) , d % 60 )
if info . get ( ' age_limit ' ) :
localres + = ' [- {} ] ' . format ( info [ ' age_limit ' ] )
if info . get ( ' uploader ' ) :
localres + = ' by {} ' . format ( info [ ' uploader ' ] )
if info . get ( ' upload_date ' ) :
localres + = ' on {} ' . format ( info [ ' upload_date ' ] )
if info . get ( ' description ' ) :
localres + = ' : ' + info [ ' description ' ]
if info . get ( ' webpage_url ' ) :
localres + = ' | ' + info [ ' webpage_url ' ]
res . append ( localres )
if not res :
raise IRCException ( " No video information to retrieve about this. Sorry! " )
return res
2015-05-30 13:17:46 +00:00
LAST_URLS = dict ( )
2015-05-29 11:54:00 +00:00
2015-06-11 05:06:44 +00:00
2015-05-29 11:54:00 +00:00
@hook ( " cmd_hook " , " yt " )
def get_info_yt ( msg ) :
2015-05-30 13:17:46 +00:00
links = list ( )
2015-05-29 11:54:00 +00:00
if len ( msg . args ) < = 0 :
2015-05-30 13:17:46 +00:00
global LAST_URLS
if msg . channel in LAST_URLS and len ( LAST_URLS [ msg . channel ] ) > 0 :
links . append ( LAST_URLS [ msg . channel ] . pop ( ) )
else :
raise IRCException ( " I don ' t have any youtube URL for now, please provide me one to get information! " )
else :
for url in msg . args :
links . append ( url )
2015-06-11 05:06:44 +00:00
data = _get_ytdl ( links )
2015-05-30 13:17:46 +00:00
res = Response ( channel = msg . channel )
2015-06-11 05:06:44 +00:00
for msg in data :
res . append_message ( msg )
2015-05-30 13:17:46 +00:00
return res
@hook ( " msg_default " )
def parselisten ( msg ) :
parseresponse ( msg )
return None
@hook ( " all_post " )
def parseresponse ( msg ) :
global LAST_URLS
urls = re . findall ( " ([a-zA-Z0-9+.-]+:(?://)?[^ ]+) " , msg . text )
for url in urls :
o = urlparse ( url )
if o . scheme != " " :
if o . netloc == " " and len ( o . path ) < 10 :
continue
2015-06-11 05:06:44 +00:00
if msg . channel not in LAST_URLS :
LAST_URLS [ msg . channel ] = list ( )
LAST_URLS [ msg . channel ] . append ( url )
2015-05-30 13:17:46 +00:00
return msg