From 71f3532e04e5c76327363a3fd36b506f54e5043d Mon Sep 17 00:00:00 2001
From: Přemysl Janouch <p.janouch@gmail.com>
Date: Sat, 21 Nov 2015 22:47:52 +0100
Subject: degesch: add the first Lua plugin to distribution

This required separate plugin directories for both pluginized executables.
---
 plugins/zyklonb/youtube | 111 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 111 insertions(+)
 create mode 100755 plugins/zyklonb/youtube

(limited to 'plugins/zyklonb/youtube')

diff --git a/plugins/zyklonb/youtube b/plugins/zyklonb/youtube
new file mode 100755
index 0000000..5614860
--- /dev/null
+++ b/plugins/zyklonb/youtube
@@ -0,0 +1,111 @@
+#!/usr/bin/env python3
+#
+# ZyklonB YouTube plugin, displaying info about YouTube links
+#
+# Copyright 2014 - 2015, Přemysl Janouch <p.janouch@gmail.com>
+# See the file LICENSE for licensing information.
+#
+
+import sys
+import io
+import re
+import json
+import urllib.request
+
+class Plugin:
+	re_msg = re.compile ('(?::([^! ]*)(?:!([^@]*)@([^ ]*))? +)?'
+		'([^ ]+)(?: +(.*))?\r\n$')
+	re_args = re.compile (':?((?<=:).*|[^ ]+) *')
+
+	def parse (self, line):
+		m = self.re_msg.match (line)
+		if m is None:
+			return None
+
+		(nick, user, host, command, args) = m.groups ()
+		args = [] if args is None else self.re_args.findall (args)
+		return (nick, user, host, command, args)
+
+	def get_config (self, key):
+		print ("ZYKLONB get_config :%s" % key)
+		(_, _, _, _, args) = self.parse (sys.stdin.readline ())
+		return args[0]
+
+	def bot_print (self, what):
+		print ('ZYKLONB print :%s' % what)
+
+class YouTube (Plugin):
+	re_videos = [re.compile (x) for x in [
+		r'youtube\.[a-z]+/[^ ]*[&?]v=([-\w]+)',
+		r'youtube\.[a-z]+/v/([-\w]+)',
+		r'youtu\.be/([-\w]+)'
+	]]
+	re_playlists = [re.compile (x) for x in [
+		r'youtube\.[a-z]+/playlist[&?][^ ]*(?<=&|\?)list=([-\w]+)',
+	]]
+
+	def print_info (self, channel, url, cb):
+		try:
+			data = json.loads (urllib.request.urlopen
+				(url, None, 30).read ().decode ('utf-8'))
+
+			for line in map (lambda x: "YouTube: " + cb (x), data['items']):
+				print ("PRIVMSG %s :%s" % (channel,
+					line.encode ('utf-8').decode ('iso8859-1')))
+
+		except Exception as err:
+			self.bot_print ('youtube: %s' % (err))
+
+	def print_video_info (self, channel, video_id):
+		url = 'https://www.googleapis.com/youtube/v3/' \
+			+ 'videos?id=%s&key=%s&part=snippet,contentDetails,statistics' \
+			% (video_id, self.youtube_api_key)
+		self.print_info (channel, url, lambda x: "%s | %s | %sx" % (
+			x['snippet']['title'],
+			x['contentDetails']['duration'][2:].lower (),
+			x['statistics']['viewCount']))
+
+	def print_playlist_info (self, channel, playlist_id):
+		url = 'https://www.googleapis.com/youtube/v3/' \
+			+ 'playlists?id=%s&key=%s&part=snippet,contentDetails' \
+			% (playlist_id, self.youtube_api_key)
+		self.print_info (channel, url, lambda x: "%s | %d videos" % (
+			x['snippet']['title'],
+			x['contentDetails']['itemCount']))
+
+	def process_line (self, line):
+		msg = self.parse (line)
+		if msg is None:
+			return
+
+		(nick, user, host, command, args) = msg
+		if command != 'PRIVMSG' or len (args) < 2:
+			return
+
+		ctx = args[0]
+		if not ctx.startswith (('#', '+', '&', '!')):
+			ctx = nick
+
+		for regex in self.re_videos:
+			for i in regex.findall (args[1]):
+				self.print_video_info (ctx, i)
+		for regex in self.re_playlists:
+			for i in regex.findall (args[1]):
+				self.print_playlist_info (ctx, i)
+
+	def run (self):
+		self.youtube_api_key = self.get_config ('youtube_api_key')
+		if self.youtube_api_key == "":
+			self.bot_print ("youtube: missing `youtube_api_key'")
+
+		print ("ZYKLONB register")
+
+		for line in sys.stdin:
+			self.process_line (line)
+
+sys.stdin = io.TextIOWrapper (sys.__stdin__.buffer,
+	encoding = 'iso8859-1', newline = '\r\n', line_buffering = True)
+sys.stdout = io.TextIOWrapper (sys.__stdout__.buffer,
+	encoding = 'iso8859-1', newline = '\r\n', line_buffering = True)
+
+YouTube ().run ()
-- 
cgit v1.2.3-70-g09d2