Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- setudef flag ourtubeXTRA
- global ourtubeXTRA tcl_platform
- #Flood Protection: after show a link, will ignore all links few seconds
- # This means 1 link per 10 seconds.
- set ourtubeXTRA(rest) 10
- #What language you can receive the youTube data? (if works heh)
- set ourtubeXTRA(lang) en
- #Limit of links at same time
- set ourtubeXTRA(max) 5
- #youtube logo
- set ourtubeXTRA(youtubelogo) "\002\00304,00You\00300,04Tube\017"
- set ourtubeXTRA(output) "$ourtubeXTRA(youtubelogo) \00311:: \002\00309<title> \002\00311:: \00308Author: \00314<author> \00311:: \00308Added: \00314<added> \00311:: \00308Views:
- \00314<views> \00311:: \00308Duration: \00314<duration> \00311:: \00308Likes: \00309<likes> \00311:: \00308Dislikes: \00304<dislikes> \00311::\002\00312 <badgelist>
- \017\00314<description>"
- set ourtubeXTRA(outputsearch) "\00309<title> \00311:: \00312\037<link>\003\037 \00311:: \00308Author: \00314<author> \00311:: \00308Added: \00314<added> \00311:: \00308Views:
- \00314<views> \00311:: \00308Duration: \00314<duration> \00311::\002\00312 <badgelist>\017\00314<description>"
- set ourtubeXTRA(author) "WazzaUK"
- set ourtubeXTRA(contact) "WazzaUK <wallison_uk@yahoo.co.uk>"
- set ourtubeXTRA(originalauthor) "HackeMate"
- set ourtubeXTRA(originalcontact) "HackeMate <Sentencia@eggdrop.es>"
- set ourtubeXTRA(name) "ourtubeXTRA"
- set ourtubeXTRA(projectName) "ourtubeXTRA"
- set ourtubeXTRA(version) "1.0"
- set ourtubeXTRA(package.http) [package require http]
- set ourtubeXTRA(protection) ""
- if {$tcl_platform(os) eq "Linux"} {
- set platfrm "X11"
- } else {
- set platfrm $tcl_platform(os)
- }
- http::config -useragent "Mozilla/5.0 ($platfrm; U; $tcl_platform(os) $tcl_platform(machine); $ourtubeXTRA(lang); rv:1.9.0.3) ourtubeXTRA 1.0" -accept
- "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
- bind pub - !youtube otYoutube
- bind pubm - *http://www.youtube.com/watch?* otPub
- proc create_badgelist {badges} {
- set badgelist ""
- if { [string length $badges] > 1} {
- foreach badge [split $badges] {
- if { $badge ne " " } {
- append badgelist "\[$badge\] "
- }
- }
- }
- return $badgelist
- }
- proc url_search {maxlen color styles text} {
- set i 0
- set newtext ""
- set style_ul ""
- set style_bd ""
- if {![string is integer -strict $maxlen]} {set maxlen [ string length $text ] }
- if {($maxlen == "") || ($maxlen < 1)} {set maxlen [ string length $text ]}
- if {![string is alpha -strict $styles]} {set styles "style_ul"}
- if {[string match -nocase style_ul $styles]} {set style_ul "\037"}
- if {[string match -nocase style_bd $styles]} {set style_bd "\002"}
- if {![string is integer -strict $color]} {set color "07"}
- if {($color < 0) || ($color > 15)} {set color 07}
- foreach word [split $text] {
- set urlindex -1
- if {[string length $word] >= 5 && [regexp {(f|ht)tp(s|)://} $word] && ![regexp {://([^/:]*:([^/]*@|\d+(/|$))|.*/\.)} $word]} {
- set wprotocol ""
- regexp {(f|ht)tp(s|)://} $word "" wprotocol
- set urlindex [string first $wprotocol $word 0]
- set newword [string range $word $urlindex [string length $word]]
- set oldlen [expr [string first $wprotocol $word 0] -1 ]
- set oldword [string range $word 0 $oldlen]
- incr i
- if { $urlindex > 0 } { append oldword " " }
- set word "$oldword\003${color}${style_bd}${style_ul}$newword\00314${style_bd}${style_ul}"
- }
- append newtext $word " "
- }
- return $newtext
- }
- proc utfdecodeclean {string} {
- regsub -all -- {([\(\)\[\]\{\}\$\"\\])} $string {\\\1} string
- return $string
- }
- proc utfdecode {content} {
- if {![regexp -- & $content]} {
- return $content
- }
- set escapes {
- \xa0 ¡ \xa1 ¢ \xa2 £ \xa3 ¤ \xa4
- ¥ \xa5 ¦ \xa6 § \xa7 ¨ \xa8 © \xa9
- ª \xaa « \xab ¬ \xac ­ \xad ® \xae
- ¯ \xaf ° \xb0 ± \xb1 ² \xb2 ³ \xb3
- ´ \xb4 µ \xb5 ¶ \xb6 · \xb7 ¸ \xb8
- ¹ \xb9 º \xba » \xbb ¼ \xbc ½ \xbd
- ¾ \xbe ¿ \xbf À \xc0 Á \xc1 Â \xc2
- Ã \xc3 Ä \xc4 Å \xc5 Æ \xc6 Ç \xc7
- È \xc8 É \xc9 Ê \xca Ë \xcb Ì \xcc
- Í \xcd Î \xce Ï \xcf Ð \xd0 Ñ \xd1
- Ò \xd2 Ó \xd3 Ô \xd4 Õ \xd5 Ö \xd6
- × \xd7 Ø \xd8 Ù \xd9 Ú \xda Û \xdb
- Ü \xdc Ý \xdd Þ \xde ß \xdf à \xe0
- á \xe1 â \xe2 ã \xe3 ä \xe4 å \xe5
- æ \xe6 ç \xe7 è \xe8 é \xe9 ê \xea
- ë \xeb ì \xec í \xed î \xee ï \xef
- ð \xf0 ñ \xf1 ò \xf2 ó \xf3 ô \xf4
- õ \xf5 ö \xf6 ÷ \xf7 ø \xf8 ù \xf9
- ú \xfa û \xfb ü \xfc ý \xfd þ \xfe
- ÿ \xff ƒ \u192 Α \u391 Β \u392 Γ \u393 Δ \u394
- Ε \u395 Ζ \u396 Η \u397 Θ \u398 Ι \u399
- Κ \u39A Λ \u39B Μ \u39C Ν \u39D Ξ \u39E
- Ο \u39F Π \u3A0 Ρ \u3A1 Σ \u3A3 Τ \u3A4
- Υ \u3A5 Φ \u3A6 Χ \u3A7 Ψ \u3A8 Ω \u3A9
- α \u3B1 β \u3B2 γ \u3B3 δ \u3B4 ε \u3B5
- ζ \u3B6 η \u3B7 θ \u3B8 ι \u3B9 κ \u3BA
- λ \u3BB μ \u3BC ν \u3BD ξ \u3BE ο \u3BF
- π \u3C0 ρ \u3C1 ς \u3C2 σ \u3C3 τ \u3C4
- υ \u3C5 φ \u3C6 χ \u3C7 ψ \u3C8 ω \u3C9
- ϑ \u3D1 ϒ \u3D2 ϖ \u3D6 • \u2022
- … \u2026 ′ \u2032 ″ \u2033 ‾ \u203E
- ⁄ \u2044 ℘ \u2118 ℑ \u2111 ℜ \u211C
- ™ \u2122 ℵ \u2135 ← \u2190 ↑ \u2191
- → \u2192 ↓ \u2193 ↔ \u2194 ↵ \u21B5
- ⇐ \u21D0 ⇑ \u21D1 ⇒ \u21D2 ⇓ \u21D3 ⇔ \u21D4
- ∀ \u2200 ∂ \u2202 ∃ \u2203 ∅ \u2205
- ∇ \u2207 ∈ \u2208 ∉ \u2209 ∋ \u220B ∏ \u220F
- ∑ \u2211 − \u2212 ∗ \u2217 √ \u221A
- ∝ \u221D ∞ \u221E ∠ \u2220 ∧ \u2227 ∨ \u2228
- ∩ \u2229 ∪ \u222A ∫ \u222B ∴ \u2234 ∼ \u223C
- ≅ \u2245 ≈ \u2248 ≠ \u2260 ≡ \u2261 ≤ \u2264
- ≥ \u2265 ⊂ \u2282 ⊃ \u2283 ⊄ \u2284 ⊆ \u2286
- ⊇ \u2287 ⊕ \u2295 ⊗ \u2297 ⊥ \u22A5
- ⋅ \u22C5 ⌈ \u2308 ⌉ \u2309 ⌊ \u230A
- ⌋ \u230B ⟨ \u2329 ⟩ \u232A ◊ \u25CA
- ♠ \u2660 ♣ \u2663 ♥ \u2665 ♦ \u2666
- " \x22 & \x26 < \x3C > \x3E O&Elig; \u152 œ \u153
- Š \u160 š \u161 Ÿ \u178 ˆ \u2C6
- ˜ \u2DC   \u2002   \u2003   \u2009
- ‌ \u200C ‍ \u200D ‎ \u200E ‏ \u200F – \u2013
- — \u2014 ‘ \u2018 ’ \u2019 ‚ \u201A
- “ \u201C ” \u201D „ \u201E † \u2020
- ‡ \u2021 ‰ \u2030 ‹ \u2039 › \u203A
- € \u20AC ' \u0027 ‎ "" ‏ "" ‬ "" ‭ ""
- ‮ "" — \u2014
- }
- set content [string map $escapes $content]
- regsub -all -- {&[a-zA-Z]+?;} [utfdecodeclean $content] {?} content
- regsub -all -- {&#(\d{1,3});} $content {[format %c [scan \1 %d]]} content
- return [subst $content]
- }
- proc otYoutube {nick uhost hand chan text} {
- global ourtubeXTRA
- if {![channel get $chan ourtubeXTRA]} {
- if {$text eq "enable"} {
- channel set $chan +ourtubeXTRA
- return
- } else {
- putquick "NOTICE $nick :$ourtubeXTRA(youtubelogo) \00311:: \00315$chan has this command disabled."
- }
- if {[matchattr $hand n]} {
- putquick "NOTICE $nick :You can enable it directly typing: /msg $chan !youtube enable"
- }
- return
- }
- #This is a generic protection to prevent flood
- #No utimer required
- if {![info exists ourtubeXTRA(protection)]} {
- set ourtubeXTRA(protection) [clock seconds]
- } else {
- if {![string is digit -strict $ourtubeXTRA(protection)]} {
- set ourtubeXTRA(protection) [clock seconds]
- } else {
- set time [expr [clock seconds]-$ourtubeXTRA(protection)]
- if {$time >= $ourtubeXTRA(rest)} {
- set ourtubeXTRA(protection) [clock seconds]
- } else {
- set floodsecs [expr [clock seconds]-$ourtubeXTRA(protection)]
- putserv "NOTICE $nick :$ourtubeXTRA(youtubelogo) \00311:: \00315Flood protection triggered: $floodsecs second(s) remaining."
- return
- }
- }
- }
- if {$text eq ""} {
- putquick "NOTICE $nick :$ourtubeXTRA(youtubelogo) \00311:: \00315Usage: !youtube <search criteria>"
- return
- }
- if {[string length $text] <= 3} {
- putquick "NOTICE $nick :$ourtubeXTRA(youtubelogo) \00311:: \00315Error - Search parameter '$text' is too short."
- return
- }
- set data [ourtubeXTRAGet $text]
- if {[string length $data] == 0} {
- set data "I was unable to connect to that website. Probably I get timeout."
- return
- }
- #Display results
- foreach line $data {
- putquick "PRIVMSG $chan :$line"
- }
- }
- proc ourtubeXTRAGet {ask} {
- global ourtubeXTRA
- set resultcount "0"
- regsub -all -- {\s+} $ask "" search
- set search [http::formatQuery $search]
- set token [http::geturl http://www.youtube.com/results?search_query=$search&sm=12]
- upvar #0 $token state
- set data $state(body)
- #regsub -all {\s|\n|\r|\t|\f} $data "" data
- regsub -all {\n|\t|\r} $data "" data
- set ncode ""
- regexp {[0-9]{3}} $state(http) ncode
- if {$ncode eq ""} {
- set ncode $state(http)
- }
- set list {}
- switch -- $ncode {
- "200" {
- regexp {<p class=\"num-results\">About <strong>(.*?)</strong>} $data "" uresultcount
- regexp -- {<ol id=\"search-results\" class=\"result-list\">(.*?)$} $data -> data
- set videos [ regexp -all -inline {<li class=\"yt-lockup clearfix yt-uix-tile result-item-padding yt-lockup-video yt-lockup-tile\"(.*?)<li class=\"yt-lockup clearfix yt-uix-tile
- result-item-padding yt-lockup-video yt-lockup-tile\"} $data ]
- regsub -all {,} $uresultcount "" resultcount
- set total [expr [llength $videos] /2]
- if {$total >= $ourtubeXTRA(max)} {
- set numitems $ourtubeXTRA(max)
- } else {
- set numitems $total
- }
- if {$resultcount == 0} {
- set numitems 0
- set list [list "$ourtubeXTRA(youtubelogo) \00311:: \00315$uresultcount \00315result(s) found for items matching '$ask'."]
- } else {
- set list [list "$ourtubeXTRA(youtubelogo) \00311:: \00315Showing \00300$numitems \00315of \00300$uresultcount \00315result(s) found for
- items matching '$ask'."]
- }
- putlog "Search URL: http://www.youtube.com/results?search_query=$search&sm=12"
- set i 2
- if {$resultcount > 0} {
- foreach {id line} $videos {
- set map {}
- set title ""
- set title_parsed ""
- set description "This video does not have any description"
- set description_parsed ""
- set added "Unknown"
- set viewcount "0"
- set author "Unknown"
- set link ""
- set duration ""
- set item_info ""
- set item_badges ""
- set badge_info ""
- set badge ""
- set badge1 ""
- set badge2 ""
- set badgelist ""
- foreach {entity number} [regexp -all -inline {&#(\d+);} $line] {
- lappend map $entity [format \\u%04x [scan $number %d]]
- }
- set line [string map [subst -nocomm -novar $map] $line]
- regexp -all -- {<div class=\"yt-lockup-content\">(.*?)$} $line "" item_info
- regexp {title=\"(.*?)\"} $item_info "" title
- set tlen [ string length $title ]
- set title_parsed [url_search $tlen "07" "style_ul" $title]
- regexp {href=\"(.*?)\"} $item_info "" link
- regexp {<div class=\"yt-lockup-description yt-ui-ellipsis yt-ui-ellipsis-2\" dir=\"ltr\">(.*?)</div>} $item_info "" description
- set description [string trimleft $description " "]
- regexp {<span class=\"video-time\">(.*?)</span>} $line "" duration
- regexp {data-name=\"\">(.*?)</a></li><li>(.*?)</li><li>(.*?) view} $line "" author added viewcount
- regexp -all -- {li class=\"yt-lockup-badge-item\">(.*?)$} $line "" item_info
- while {[regexp {<span class=\"yt-badge \" >(.*?)</span></li>} $item_info "" badge1]} {
- if { $badge1 != "" } {
- if {[ string first $badge1 $badgelist 0] == -1 } {
- set badgelist [ append badgelist "$badge1 " ]
- }
- regsub -- {<span class=\"yt-badge \" >(.*?)</span></li>} $item_info "" item_info
- set badge1 ""
- }
- }
- set badgelist [ string trimright $badgelist " " ]
- set badgelist [ create_badgelist $badgelist ]
- set tlen [ string length $description ]
- regsub -all -- {\<[^\>]*\>|\t} $description "" description
- set description_parsed [url_search $tlen "07" "style_ul" $description]
- set yturl "http://www.youtube.com$link"
- set output [string map [list "<title>" $title_parsed "<link>" $yturl "<author>" $author "<added>" $added "<views>" $viewcount
- "<duration>" $duration "<badgelist>" $badgelist "<description>" $description_parsed] $ourtubeXTRA(outputsearch)]
- lappend list $output
- if {$i > $ourtubeXTRA(max)} {
- break
- }
- incr i
- }
- }
- return [ utfdecode [encoding convertto utf-8 $list] ]
- }
- "404" {
- http::cleanup $token
- return [list "No such file or webpage."]
- }
- default {
- http::cleanup $token
- return [list "unforeseen circumstance. Server responded: $ncode"]
- }
- }
- }
- proc otPub {nick uhost hand chan text} {
- if {![channel get $chan ourtubeXTRA]} {
- return
- }
- global ourtubeXTRA
- set webTarget [lsearch -inline [split $text] {*http://*.youtube.*/watch?*}]
- if {([info exists ourtubeXTRA(protection)]) && ([string is digit -strict $ourtubeXTRA(protection)])} {
- set rest [expr [clock seconds]-$ourtubeXTRA(protection)]
- if {$rest >= $ourtubeXTRA(rest)} {
- set ourtubeXTRA(protection) ""
- }
- } else {
- set ourtubeXTRA(protection) ""
- }
- if {$webTarget ne ""} {
- if {! [regexp -nocase {^(http://)?([^/:]+)(:([0-9]+))?(/.*)?$} $webTarget]} {
- return
- }
- if {$ourtubeXTRA(protection) ne ""} {
- set floodsecs [expr [clock seconds]-$ourtubeXTRA(protection)]
- putserv "NOTICE $nick :$ourtubeXTRA(youtubelogo) \00311:: \00315Flood protection triggered: $floodsecs second(s) remaining."
- return
- }
- set ourtubeXTRA(protection) [clock seconds]
- set data [otGet $webTarget]
- if {[string length $data] == 0} {
- set data "I was not able to reach Youtube's link. Probably I get a timeout. Try again."
- }
- foreach line [ split $data \n ] {
- putquick "PRIVMSG $chan :$line"
- }
- utimer $ourtubeXTRA(rest) [list set ourtubeXTRA(protection) ""]
- }
- }
- proc otGet {web} {
- global ourtubeXTRA
- set token [http::geturl $web -timeout 4000]
- upvar #0 $token state
- set data $state(body)
- regsub -all {\n|\t|\r} $data "" data
- set ncode ""
- regexp {[0-9]{3}} $state(http) ncode
- if {$ncode eq ""} {
- set ncode $state(http)
- }
- switch -- $ncode {
- "200" {
- }
- "302" {
- foreach {flag value} $state(meta) {
- if {$flag eq "Location"} {
- http::cleanup $token
- return "Invalid youtube link: $ncode"
- }
- }
- }
- "303" {
- http::cleanup $token
- return "That video does not exists. Server responded: $ncode"
- }
- "404" {
- http::cleanup $token
- return "$ncode - $web - No such webpage"
- }
- default {
- http::cleanup $token
- return "unforeseen circumstances. Server responded: $ncode"
- }
- }
- set durationfmt "%M:%S"
- set badges ""
- set badge1 ""
- set badge2 ""
- set agestrict ""
- set title ""
- set title_parsed ""
- set description "This video does not have a description"
- if {[regexp {<meta property=\"og:title\" content=\"(.*?)\">} $data "" title]} {
- set tlen [ string length $title ]
- set title_parsed [url_search $tlen "07" "style_ul" $title]
- }
- if {[regexp {<meta property=\"og:video:height\" content=\"(.*?)\">} $data "" videoHeight]} {
- if { $videoHeight >= 720 } { set badges [ append badges "HD "] }
- }
- if {[regexp {<meta property=\"og:restrictions:age\" content=\"(.*?)\">} $data "" agestrict]} {
- set badges [ append badges "$agestrict "]
- }
- set badges [ string trimright $badges " " ]
- regexp {<meta property=\"og:description\" content=\"(.*?)\">} $data "" description
- #regexp -all {<p id=\"eow-description\" >(.*?)</p>} $data "" full_description
- regexp -all {<div id=\"watch-description-text\">(.*?)</div>} $data "" full_description
- #regsub -all -- {\<[^\>]*\>|\t} $full_description "" full_description
- #set full_description [encoding convertfrom utf-8 $full_description ]
- set full_description [string trimleft $full_description " "]
- #regsub -all {<(.|\n)*?>} $full_description "" full_description
- #regsub -all -- {(<[^>]+>)|(\t)} $full_description "" full_description
- set tlen [ string length $full_description ]
- set full_description_parsed [url_search $tlen "07" "style_ul" $full_description]
- if {[string length $description] == 0} { set description "This video does not have a description" }
- set badgelist [ create_badgelist $badges ]
- set tlen [ string length $description ]
- set description_parsed [url_search $tlen "07" "style_ul" $description]
- set added "Unknown"
- regexp {<span id=\"eow-date\" class=\"watch-video-date\" >(.*?)</span>} $data "" added
- set views "0"
- regexp {<span class=\"watch-view-count \" >(.*?)</span>} $data "" views
- set views [string trimright $views " views" ]
- set views [string trimleft $views]
- if {![regexp -all {<span class=\"likes-count\">(.*?)</span>} $data "" likes]} { set likes 0 }
- if {![regexp -all {<span class=\"dislikes-count\">(.*?)</span>} $data "" dislikes]} { set dislikes 0 }
- set author "Unknown"
- regexp -all {data-name=\"watch\">(.*?)</a><span class=\"yt-user-separator\">} $data "" author
- regexp -all {data-name=\"watch\">(.*?)</a>} $data "" author
- if {![regexp -all {<meta itemprop=\"duration\" content=\"PT(.*?)M(.*?)S\">} $data "" videomins videosecs]} {
- set videomins 0
- set videosecs 0
- }
- set totalseconds [expr {($videomins * 60) + $videosecs}]
- if { $videomins >= 60 } { set durationfmt "%H:%M:%S" }
- set duration [clock format $totalseconds -format $durationfmt]
- set yt_output [string map [list "<title>" $title_parsed "<author>" $author "<added>" $added "<views>" $views "<duration>" $duration "<likes>" $likes "<dislikes>"
- $dislikes "<badgelist>" $badgelist "<description>" $description_parsed] $ourtubeXTRA(output)]
- return [ utfdecode [encoding convertto utf-8 $yt_output] ]
- }
- putlog "\002\00304,00You\00300,04Tube\017 \00311:: \002\00300*Loaded* \002\00315ourtubeXTRA 1.0 by \002WazzaUK\002\00311 :: \00315based on ourtube by \002Hackemate\002."
- set ourtubeXTRA(Loaded) 1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement