; YouTube v5.5 - (11/19/21) by entropy 2021
; You will need a GOOGLE API (Youtube) Key for the youtube search to work.
; Get one here: https://developers.google.com/youtube/v3/getting-started
; For channels, you can use "#" as all channels, or a list of channels: #test,#test2,#test3 etc.
; ============================ YouTube Events
#youtube on
on *:input:%yt_chans:{ if (/* !iswm $1 && $server) { triggeryt # $strip($1-) } }
on *:text:*:%yt_chans:{ %done = triggeryt # $strip($1-) | %done }
on *:action:*:%yt_chans:{ %done = triggeryt # $strip($1-) | %done }
#youtube end
; ============================ YouTube Menus
menu channel,status,menubar {
-
YouTube v5.5
.YouTube Status $chr(9) $replace($group(#youtube).status,o,O) {
$iif($group(#youtube).status == on,.disable,.enable) #youtube
echo 4 -a * YouTube is now: $replace($group(#youtube).status,o,O)
}
.-
.Channels $chr(9) %yt_chans { %yt_chans = $input(Channels (sep by comma)?,5,Channels,%yt_chans) | if ($! != $null) { %yt_chans = $! } }
.-
.API Key $chr(9) %yt_key { var %a = $input(Input API Key?,5) | if ($! != $null) { %yt_key = $! } }
-
}
; ============================ Lookup Aliases
on *:unload:{
unset %yt_chans %yt_key
}
alias -l triggeryt {
if ($wildtok($2-,*https://www.youtube.com/watch?v=*,1,32) || $wildtok($2-,*https://youtube.com/watch?v=*,1,32)) { you $1 $gettok($v1,2,61) }
elseif ($wildtok($2-,*https://youtu.be/*,1,32)) { you $1 $gettok($v1,-1,47) }
elseif (?yt iswm $2 && $left($2,1) isin @!. && $3) { ytsearch $1 $3- }
}
alias -l you {
sockclose youtube
sockopen -e4 youtube youtube.com 443
sockmark youtube $replace($2-,$chr(32),+)
%_title = ""
%_length = ""
%_views = ""
%_likes = ""
%_dislikes = ""
%_chan = $1
%_uploaded = ""
}
;============================= YouTube Play
on *:sockopen:youtube:{
if ($sockerr) { return }
sockwrite -nt $sockname GET https://www.youtube.com/watch?v= $+ $sock($sockname).mark HTTP/1.1
sockwrite -nt $sockname Host: youtube.com
sockwrite -nt $sockname Connection: Close
sockwrite -nt $sockname Accept-Language: en-us
sockwrite -nt $sockname Content-Type: text/html; charset=utf-8
sockwrite -nt $sockname $str($crlf,2)
}
on *:sockread:youtube:{
if ($sockerr) { return }
sockread -f &b
var %a = 1, %b, %c = $bvar(&b,1-).text
if (*"status":"ERROR","reason":"Video unavailable"* iswm %c) { msg %_chan [YouTube] $c No such video! | sockclose $sockname | return }
while ($gettok(%c,%a,123)) {
%b = $v1
if (*<title>*</title>* iswm %b) { %b = $replace(%b,<,$+($chr(32),<),>,$+(>,$chr(32))) | var %one = $findtok(%b,<title>,1,32), %two = $findtok(%b,</title>,1,32) | %_title = $remove($gettok(%b,$+(%one,-,%two),32),<title>,</title>,- YouTube) }
if (*"label":"like this video * iswm %b && !%_likes) { %_likes = $gettok(%b,6,32) }
if (*"label":"dislike this video * iswm %b && !%_dislikes) { %_dislikes = $gettok(%b,6,32) }
if (*<link itemprop="name" content="*">* iswm %b) { %b = $replace(%b,<,$+($chr(32),<),>,$+(>,$chr(32))) | var %total = $wildtok(%b,itemprop="name",0,32) | var %one = $findtok(%b,itemprop="name",%total,32), %two = $findtok(%b,</span>,1,32) | %_uploaded = $remove($gettok($gettok(%b,$+(%one,-,%two),32),2-,32),content=",">,</span>) }
if ("text":"* views"}]}}}}}*"overlay":* iswm %b) { %b = $remove($gettok(%b,3,$asc(")),views) | %_views = %b | sockclose $sockname | endit | return }
if (*"lengthSeconds"* iswm %b && !%_length) { %b = $remove($gettok($wildtok(%b,"lengthSeconds":"*",1,44),2,$asc(:)),") | if (%b) { %_length = $duration(%b,3) } }
inc %a
}
}
on *:sockclose:youtube:{ endit }
alias -l endit {
if (!%_views) { %done | return }
msg %_chan [YouTube] $c $replace(%_title,',',",",&,&,\u0026,&) $c Views: %_views $c Length: $iif(%_length,%_length,NA) $c Up: $iif(%_likes != $null,%_likes,NA) $c Down: $iif(%_dislikes != $null,%_dislikes,NA) $c Uploaded by: %_uploaded
unset %done %_chan %_title %_views %_length %_likes %_dislikes %_uploaded
}
alias -l nohtml { return $regsubex($1, /<[^>]+(?:>|$)|^[^<>]+>/g,) }
alias -l c { return $chr(9679) }
;============================= YouTube Search
alias -l ytsearch {
sockclose yout
sockopen -e4 yout googleapis.com 443
set -u5 %_chan $1
sockmark yout $replace($2-,$chr(32),+)
}
on *:sockopen:yout:{
if ($sockerr) { return }
sockwrite -nt $sockname GET $+(https://www.googleapis.com/youtube/v3/search?part=snippet&q=,$sock($sockname).mark,&key=,%yt_key) HTTP/1.1
sockwrite -nt $sockname Host: googleapis.com
sockwrite -nt $sockname Connection: Close
sockwrite -nt $sockname Accept-Language: en-us
sockwrite -nt $sockname Content-Type: text/html; charset=utf-8
sockwrite -nt $sockname $str($crlf,2)
}
on *:sockread:yout:{
if ($sockerr) { return }
var %a
sockread -f %a
tokenize 32 %a
if ($1) {
if (*"reason": "keyInvalid"* iswm $1- || !%yt_key) { msg %_chan [YouTube Search] $c Invalid Key! | sockclose $sockname | return }
if (*"title": "*",* iswm $1-) { set -u5 %_title $replace($remove($gettok($1-,2-,32),',$chr(44)),',',',',",",&,&,",$null,\u0026,&) }
if (*"url": "*",* iswm $1-) { set -u5 %_link $+(https://www.youtube.com/watch?v=,$gettok($gettok($1-,2,32),-2,47)) | msg %_chan [YouTube Search] $c %_title $c Link: %_link | sockclose $sockname }
}
}