| View previous topic :: View next topic |
| Author |
Message |
WazzaUK Voice
Joined: 02 Jul 2006 Posts: 19
|
Posted: Sun Jan 12, 2014 11:49 am Post subject: ourtubeXTRA 1.0 |
|
|
A rework of ourtube with extra data. Lots of new additions including URL detection. Also removed some of the original functionality such as ability to turn on/off color and multi/single line. Deals with utf-8 via encoding function, i think eggdrop has to be properly patched. I use 1.6.21 and works nicely.
To enable on channels , in dcc add user defined flag with:
.chanset #channel +ourtubeXTRA
or in the channel window:
/msg #channel !youtube enable
if a youtube URL is detected in channel, details are taken from youtube site. Videos can be searched for using:
!youtube <search criteria>
To enable on channels , in dcc add user defined flag with:
.chanset #channel +ourtubeXTRAsearch
or in the channel window:
/msg #channel !youtube enablesearch
Forgive the bad identation. Its perfect in my editor.
EDIT: now detects URLs in Title. Small modifiucation in how $data is set - no longer uses string map, afterall utf-8 decoding is done at time of output.
Parameters maxlen(max length of parsed text), color(00-15 - color of url) and styles(can be style_ul and/or style_bd) added to url_search proc. Called like:
| Code: |
set text_parsed [url_search 40 07 "style_ul" $text]
|
If incorrect string classes used/bad values default values should hopefully be set.
Now has 2 user defined channel flags:
ourtubeXTRA for youtube URL detection in a channel.
ourtubeXTRAsearch for youtube video searching.
| Code: |
setudef flag ourtubeXTRA
setudef flag ourtubeXTRAsearch
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::\00315 <title> \00311:: \00308Author: \00315<author> \00311:: \00308Added: \00315<added> \00311:: \00308Views: \00315<views> \00311:: \00308Duration: \00315<duration> \00311:: \00308Likes: \00309<likes> \00311:: \00308Dislikes: \00304<dislikes> \00311:: \00308Description: \00315<description>"
set ourtubeXTRA(outputsearch) "\00312\037<link>\003\037 \00311:: \00308Title: \00315<title> \00311:: \00308Author: \00315<author> \00311:: \00308Added: \00315<added> \00311:: ;\00308Views: \00315<views> \00311:: \00308Duration: \00315<duration> \00311:: \00308Description: \00315<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 url_search {maxlen color styles text} {
set i 0
set newtext ""
set style_ul ""
set style_bd ""
if {[string is integer -strict $maxlen]} {
if {($maxlen == "") || ($maxlen < 1)} {set maxlen 100}
} else { set maxlen 100 }
if {[string is list -strict $styles]} {
if {[string match -nocase "*style_ul*" [lrange [split $styles] 0 end]]} {set style_ul "\037"}
if {[string match -nocase "*style_bd*" [lrange [split $styles] 0 end]]} {set style_bd "\002"}
}
if {[string is integer -strict $color]} {
if {($color < 0) || ($color > 15)} {set color 07}
} else { set color "07" }
foreach word [split $text] {
if {[string length $word] >= 5 && [regexp {(f|ht)tp(s|)://} $word] && ![regexp {://([^/:]*:([^/]*@|\d+(/|$))|.*/\.)} $word]} {
set urlindex [string first "http" $word 0]
set newword [string range $word $urlindex [string length $word]]
set oldlen [expr [string first "http" $word 0] -1 ]
set oldword [string range $word 0 $oldlen]
incr i
set color "\3${color}"
set word "$oldword${color}${style_ul}${style_bd}$newword\00315${style_ul}${style_bd}"
if {$word != ""} {
set newtext [append newtext $word " "]
}
set olen [string length $newtext]
if {$olen >= $maxlen} {
set newtext [append newtext "..."]
return $newtext
}
}
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
if {[channel get $chan ourtubeXTRA]} {
putquick "NOTICE $nick :$ourtubeXTRA(youtubelogo) \00311:: \00315ourtubeXTRA 1.0"
putquick "NOTICE $nick :Youtube URL detection was successfully ENABLED on $chan"
return
}
return
}
}
if {![channel get $chan ourtubeXTRAsearch]} {
if {$text eq "enablesearch"} {
channel set $chan +ourtubeXTRAsearch
if {[channel get $chan ourtubeXTRAsearch]} {
putquick "NOTICE $nick :$ourtubeXTRA(youtubelogo) \00311:: \00315ourtubeXTRA 1.0"
putquick "NOTICE $nick :Video search was successfully ENABLED on $chan"
return
}
}
putquick "NOTICE $nick :$ourtubeXTRA(youtubelogo) \00311:: \00315ourtubeXTRA 1.0"
putquick "NOTICE $nick :$chan has the youtube search command DISABLED"
if {[matchattr $hand n]} {
putquick "NOTICE $nick :You can ENABLE it directly by typing:\002 /msg $chan !youtube enablesearch\002"
}
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 '$arg' 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]
http::config -useragent "Mozilla/5.0 (Windows NT; U; Windows NT x86; en-ES; rv:1.9.0.3) Firefox 3.0.7" -accept "text/html,application/xhtml,+xml,application/xml;q=0.9,*/*;q=0.8"
set token [http::geturl http://www.youtube.com/results?search_query=$search]
upvar #0 $token state
set data $state(body)
regsub -all {\n|\t} $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 "" resultcount
regexp -- {<ol id=\"search-results\" class=\"result-list context-data-container\">(.*)$} $data -> data
set videos [regexp -all -inline {<li class=\"yt-lockup clearfix yt-uix-tile result-item-padding yt-lockup-video yt-lockup-tile vve-check context-data-item\"(.*?)</li></ul></div>} $data]
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$resultcount \00315result(s) found for items matching '$ask'."]
} else {
set list [list "$ourtubeXTRA(youtubelogo) \00311:: \00315Showing \00300$numitems \00315of \00300$resultcount \00315result(s) found for items matching '$ask'."]
}
set i 2
if {$resultcount > 0} {
foreach {id line} $videos {
set map {}
set title ""
set description ""
set description_parsed ""
set added "Unknown"
set viewcount "0"
set author "Unknown"
set link ""
set duration ""
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 {data-context-item-title=\"(.*?)\"} $line "" title
regsub -all -- {\<[^\>]*\>|\t} $title "" title
set title_parsed [url_search 40 07 "style_ul" $title]
if {![regexp {data-context-item-views=\"(.*?)views} $line "" viewcount]} { set viewcount "0" }
regsub -all -- {\<[^\>]*\>|\t} $viewcount "" viewcount
regexp {data-context-item-time=\"(.*?)\"} $line "" duration
regsub -all -- {\<[^\>]*\>|\t} $duration "" duration
regexp {<div class=\"yt-lockup-description yt-ui-ellipsis yt-ui-ellipsis-2\" dir=\"ltr\">(.*?)</div>} $line "" description
regsub -all -- {\<[^\>]*\>|\t} $description "" description
if {$description == ""} {
set description "This video doesn't have any description ..."
}
set description_parsed [url_search 100 07 "style_ul" $description]
regexp {</a></li><li>(.*?)</li>} $line "" added
regexp {data-context-item-user=\"(.*?)\"} $line "" author
regsub -all -- {\<[^\>]*\>|\t} $author "" author
regexp {data-context-item-id=\"(.*?)\"} $line "" link
set link "http://www.youtube.com/watch?v=$link"
set output [string map [list "<link>" $link "<title>" $title_parsed "<author>" $author "<added>" $added "<views>" $viewcount "<duration>" $duration "<description>" $description_parsed] $ourtubeXTRA(outputsearch)]
lappend list $output
if {$i > $ourtubeXTRA(max)} {
break
}
incr i
}
}
set list [utfdecode $list]
return [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} {
global ourtubeXTRA
if {![channel get $chan ourtubeXTRA]} {
putquick "NOTICE $nick :$ourtubeXTRA(youtubelogo) \00311:: \00315ourtubeXTRA 1.0"
putquick "NOTICE $nick :$chan has the youtube URL detector DISABLED"
if {[matchattr $hand n]} {
putquick "NOTICE $nick :You can ENABLE it directly by typing:\002 /msg $chan !youtube enable\002"
}
return
}
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."
}
putquick "PRIVMSG $chan :$data"
utimer $ourtubeXTRA(rest) [list set ourtubeXTRA(protection) ""]
}
}
proc otGet {web {relocation ""}} {
global ourtubeXTRA
set token [http::geturl $web -timeout 4000]
upvar #0 $token state
set lastcode $state(http)
set ncode ""
regexp {[0-9]{3}} $lastcode ncode
if {$ncode eq ""} {
set ncode $lastcode
}
switch -- $ncode {
"200" {
}
"302" {
foreach {flag value} $state(meta) {
if {$flag eq "Location"} {
# Due to invalid youtube link but valid url syntax we can
# receive an url forward. this handles that
http::cleanup $token
return [otGet $value "(Relocated)"]
}
}
}
"303" {
http::cleanup $token
return "That video does not exists. Server responded: $lastcode"
}
"404" {
http::cleanup $token
return "$web - No such webpage"
}
default {
http::cleanup $token
return "unforeseen circumstances. Server responded: $lastcode"
}
}
set data $state(body)
http::cleanup $token
set title ""
set author "Unknown"
set added "Unknown"
set description "This video doesn't have any description..."
set views "0"
set author "Unknown"
set likes "0"
set dislikes "0"
set userinfo ""
set duration ""
set totalseconds 0
set videosecs 0
set videomins 0
regexp {<title>(.*?)</title>} $data "" title
set title [string trimright $title " - YouTube"]
regsub -all -- {\<[^\>]*\>|\t} $title "" title
set title_parsed [url_search 40 07 "style_ul" $title]
regexp {<meta name=\"description\" content=\"(.*?)\">.*} $data " " description
regexp {<span id=\"eow-date\" class=\"watch-video-date\" >(.*?)</span>} $data "" added
# following two lines were edited from original
if {![regexp {<span class=\"watch-view-count \" >(.*?)</span>} $data "" views]} { set views "0" }
set views [string trim $views]
set added [string trimleft $added]
if {[regexp -nocase {<meta itemprop=\"duration\" content=\"(.*?)\">.*} $data match duration]} {
set youtubelength $duration
if {[regexp {M(.*?)S} $duration match duration]} {
set videosecs $duration
}
set duration $youtubelength
if {[regexp {PT(.*?)M} $duration match duration]} {
set videomins $duration
}
set totalseconds [expr {($videomins * 60) + $videosecs}]
set duration [clock format $totalseconds -format {%H:%M:%S}]
}
regexp -- {<div id=\"watch7-user-header\" class=\"spf-nolink\">(.*?)<div class=\"yt-dialog hid\">} $data -> userinfo
if {![regexp {data-name=\"watch\">(.*?)</a>} $userinfo "" author]} { set author "Unknown" }
if {![regexp {<span class=\"likes-count\">(.*?)</span>} $data "" likes]} { set likes "0" }
if {![regexp {<span class=\"dislikes-count\">(.*?)</span>} $data "" dislikes]} { set dislikes "0" }
regsub -all -- {\<[^\>]*\>|\t} $description "" description
regsub -all -- {\<[^\>]*\>|\t} $views "" views
if {$description eq ""} {
set description "This video doesn't have any description ..."
}
set description_parsed [url_search 100 07 "style_ul" $description]
set output [string map [list "<title>" $title_parsed "<author>" $author "<added>" $added "<views>" $views "<duration>" $duration "<likes>" $likes "<dislikes>" $dislikes "<description>" $description_parsed] $ourtubeXTRA(output)]
set output [utfdecode $output]
return [encoding convertto utf-8 $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
|
|
|
| Back to top |
|
 |
bunnybump Voice

Joined: 17 Aug 2012 Posts: 9
|
Posted: Fri Feb 21, 2014 3:39 pm Post subject: |
|
|
i've try this tcl but it keeps telling me that there's an error with the script. here what i got:
| Code: | can't read "maxlen": no such variable
while executing
"string is integer -strict $maxlen"
invoked from within
"if {[string is integer -strict $maxlen]} {
if {($maxlen == "") || ($maxlen < 1)} {set maxlen 100}
} else { set maxlen "100" }"
(file "scripts/you.tcl" line 50)
|
what should i do to fix it? thank you in advance for the help. _________________ In the Beginning... Was the Command Line |
|
| Back to top |
|
 |
Anahel Halfop

Joined: 03 Jul 2009 Posts: 48 Location: Dom!
|
Posted: Mon Feb 24, 2014 2:41 pm Post subject: |
|
|
WazzaUK each time I want to load your script i get this:
| Code: | [19:38:11] Tcl error in file 'neko.conf':
[19:38:11] missing close-brace
while executing
"proc url_search {maxlen color styles text} {
set i 0
set newtext ""
set style_ul ""
set style_bd ""
if {[string is integer -strict $m..."
(file "scripts/ourtube.tcl" line 43)
invoked from within
"source scripts/ourtube.tcl"
(file "neko.conf" line 1509)
[19:38:11] * CONFIG FILE NOT LOADED (NOT FOUND, OR ERROR)
|
Could you post your script somewhere instead of inside [code] on forum? |
|
| Back to top |
|
 |
WazzaUK Voice
Joined: 02 Jul 2006 Posts: 19
|
Posted: Wed Feb 26, 2014 1:10 pm Post subject: OurTubeXTRA re-codes |
|
|
Ok so there was a few errors in the last release. It didnt help that youtube changed theyre form data structure. I know this one works, im still working on the utf-8 encoding.
| Code: |
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 { $badges ne "" } {
foreach badge [split $badges] {
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
set data [ utfdecode $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 vve-check\"(.*?)<li class="yt-lockup clearfix
yt-uix-tile result-item-padding yt-lockup-video yt-lockup-tile vve-check\"} $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'."]
}
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
regsub -all -- {\<[^\>]*\>|\t} $title "" 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
regexp {<span class=\"video-time\">(.*?)</span>} $line "" duration
regsub -all -- {\<[^\>]*\>|\t} $duration "" duration
regexp {data-name=\"\">(.*?)</a></li><li>(.*?)</li><li>(.*?) views</li>} $line "" author added viewcount
regsub -all -- {\<[^\>]*\>|\t} $author "" author
regsub -all -- {\<[^\>]*\>|\t} $added "" added
regsub -all -- {\<[^\>]*\>|\t} $viewcount "" viewcount
regsub -all -- {\<[^\>]*\>|\t} $description "" description
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 ]
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 [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."
}
putquick "PRIVMSG $chan :$data"
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)
set data [ utfdecode $data ]
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 ""
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
if { $description eq "" } { 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 [ 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
|
|
|
| Back to top |
|
 |
Anahel Halfop

Joined: 03 Jul 2009 Posts: 48 Location: Dom!
|
Posted: Thu Feb 27, 2014 1:35 pm Post subject: |
|
|
WazzaUK you should check script you're posting on site - you updated it but (tho it still doesn't work for me) somewhere you added word wrap making the script unusable - you need to fix broken lines in script.
Could you just upload the .tcl somewhere? or paste it to some pastebin instead of adding it in [code] |
|
| Back to top |
|
 |
WazzaUK Voice
Joined: 02 Jul 2006 Posts: 19
|
Posted: Sun Mar 02, 2014 11:26 am Post subject: OurtubeXTRA search fix... |
|
|
it seems youtube changed output data again...
find the:
| Code: |
set videos [ regexp -all -inline {<li class=\"yt-lockup clearfix yt-uix-tile result-item-padding yt-lockup-video yt-lockup-tile vve-check\"(.*?)<li class=\"yt-lockup clearfix yt-uix-tile result-item-padding yt-lockup-video yt-lockup-tile vve-check\"} $data ]
|
and change to:
| Code: |
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 ]
|
Whole source uploaded to pastebin. Full TCL script |
|
| Back to top |
|
 |
bunnybump Voice

Joined: 17 Aug 2012 Posts: 9
|
Posted: Mon Mar 03, 2014 7:51 am Post subject: |
|
|
and now here what we got with your script:
| Code: |
Tcl error in file 'Eggdrop.conf':
invalid command name "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
while executing
""text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8""
(file "scripts/OurtubeXTRA.tcl" line 71)
invoked from within
"source scripts/OurtubeXTRA.tcl"
(file "in" line 203)
* CONFIG FILE NOT LOADED (NOT FOUND, OR ERROR)
|
are you sure that you already test it before make a post in here? cause every change that you've made seems never working  _________________ In the Beginning... Was the Command Line |
|
| Back to top |
|
 |
WazzaUK Voice
Joined: 02 Jul 2006 Posts: 19
|
Posted: Mon Mar 03, 2014 10:34 pm Post subject: re: bunnybump |
|
|
| Quote: |
and now here what we got with your script:
Code:
Tcl error in file 'Eggdrop.conf':
invalid command name "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
while executing
""text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8""
(file "scripts/OurtubeXTRA.tcl" line 71)
invoked from within
"source scripts/OurtubeXTRA.tcl"
(file "in" line 203)
* CONFIG FILE NOT LOADED (NOT FOUND, OR ERROR)
are you sure that you already test it before make a post in here? cause every change that you've made seems never working Sad
|
that line should be:
| Code: |
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"
|
|
|
| Back to top |
|
 |
WazzaUK Voice
Joined: 02 Jul 2006 Posts: 19
|
Posted: Tue Mar 04, 2014 3:28 pm Post subject: new version of code - in namespace... |
|
|
| Code: |
namespace eval ourtubeXTRA {
setudef flag ourtubeXTRA
global tcl_platform
#What language you can receive the youTube data? (if works heh)
set lang en
#youtube logo
set youtubelogo "\002\00304,00You\00300,04Tube\017"
set outputline "$youtubelogo \00311:: \002\00309<title> \002\00311:: \00308Author: \00314<author> \700311:: \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<full_description>\n"
set outputsearch " \00308<vcount>. \00312\037<link>\003\037 \00311:: \00309<title> \00311:: \00308Author: \00314<author> \00311:: \00308Added: \00314<added> \00311:: \00308Views: \00314<views> \00311:: \00308Duration: \00314<duration> \00311: \002\00312 <badgelist>\017\00314<description>"
set author "WazzaUK"
set contact "WazzaUK <wallison_uk@yahoo.co.uk>"
set originalauthor "HackeMate"
set originalcontact "HackeMate <Sentencia@eggdrop.es>"
set name "ourtubeXTRA"
set projectName "ourtubeXTRA"
set package.http [package require http]
set protection ""
set ytrest 10
set max_links 5
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); $lang; rv:1.9.0.3) ourtubeXTRA 1.0" -accept "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
bind pubm - *http://www.youtube.com/watch?* ourtubeXTRA::otPub
bind pub - !youtube ourtubeXTRA::otYoutube
proc create_badgelist {badges} {
set badgelist ""
if { [string length $badges] > 1} {
foreach badge [split $badges] {
if { $badge ne " " } {
append badgelist "\[$badge\] "
}
}
}
return $badgelist
}
proc parse_text {maxlen text} {
set newtext ""
set ccount 0
set linelist ""
foreach word [split $text] {
set prednum [ expr {([string length $word] + $ccount) + 1}]
if {$prednum >= $maxlen} {
set ccount 0
lappend linelist $newtext
set newtext ""
} else {
append newtext $word " "
incr ccount
}
set ccount [ expr {[string length $word] + $ccount}]
}
if {$ccount >0} {
lappend linelist $newtext
}
return $linelist
}
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
set isurl 0
if {[string length $word] >= 5 && [regexp {(f|ht)tp(s|)://} $word] && ![regexp {://([^/:]*:([^/]*@|\d+(/|$))|.*/\.)} $word]} {
set wprotocol ""
set isurl 1
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} {
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
}
global ourtubeXTRA::ytrest protection
#This is a generic protection to prevent flood
#No utimer required
if {![info exists protection ]} {
set protection [clock seconds]
} else {
if {![string is digit -strict $protection ]} {
set protection [clock seconds]
} else {
set time [expr [clock seconds]-$protection]
if { $time >= $ytrest } {
set protection [clock seconds]
} else {
set floodsecs [expr [clock seconds]-$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 $chan]
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 chan} {
global ourtubeXTRA::max_links
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 {\n|\t|\r} $data "" data
set ncode ""
regexp {[0-9]{3}} $state(http) ncode
if {$ncode eq ""} {
set ncode $state(http)
}
set ytlist ""
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 >= $max_links } {
set numitems $max_links
} else {
set numitems $total
}
if {$resultcount == 0} {
set numitems 0
set yts "${ourtubeXTRA::youtubelogo} \00311:: \00315$uresultcount \00315result(s) found for items matching '$ask'."
} else {
set yts "${ourtubeXTRA::youtubelogo} \00311:: \00315Showing \00300$numitems \00315of \00300$uresultcount \00315result(s) found
for items matching '$ask'."
}
putquick "PRIVMSG $chan :$yts"
putlog "Search URL: http://www.youtube.com/results?search_query=$search&sm=12"
set i 2
set vcount 1
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
regsub -all -- {(<[^>]+>)|(\t)} $description "" description
set description [ string trimleft $description " " ]
regexp {<span class=\"video-time\">(.*?)</span>} $line "" duration
regexp {data-name=\"\">(.*?)</a></li><li>(.*?)\<} $line "" author added
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 ]
set description_parsed [url_search $tlen "07" "style_ul" $description]
set yturl "http://www.youtube.com$link"
set description_parsed [string range $description_parsed 0 100]
set ytoutput [string map [list "<vcount>" $vcount "<link>" $yturl "<title>" $title_parsed "<author>" $author "<added>" $added
"<views>" $viewcount "<duration>" $duration "<badgelist>" $badgelist "<description>" $description_parsed] ${ourtubeXTRA::outputsearch}]
set ytoutput [utfdecode $ytoutput]
set ytoutput [encoding convertto utf-8 $ytoutput]
lappend ytlist $ytoutput
if {$i > $ourtubeXTRA::max_links } {
break
}
incr i
incr vcount
}
}
return $ytlist
}
"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::ytrest protection
set webTarget [lsearch -inline [split $text] {*http://*.youtube.*/watch?*}]
if {([info exists protection]) && ([string is digit -strict $protection ])} {
set rest [expr [clock seconds]-$protection]
if { $rest >= $ytrest } {
set protection ""
}
} else {
set protection ""
}
if {$webTarget ne ""} {
if {![regexp -nocase {^(http://)?([^/:]+)(:([0-9]+))?(/.*)?$} $webTarget]} {
return
}
if { $protection ne "" } {
set floodsecs [expr [clock seconds]-$protection]
putserv "NOTICE $nick :${ourtubeXTRA::youtubelogo} \00311:: \00315Flood protection triggered: $floodsecs second(s) remaining."
return
}
set 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 $ytrest [list set protection ""]
}
}
proc otGet {web} {
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 numcomments 0
set agestrict ""
set title ""
set title_parsed ""
set description "This video does not have a description"
set full_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 [url_search $tlen "07" "style_ul" $full_description]
set full_description_parsed [parse_text 380 $full_description]
if {[string length $description] <= 1} { 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]
if {[llength $full_description_parsed] == 0 } {
set full_description_parsed {}
lappend full_description_parsed $description_parsed
}
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]
set added [string trimleft $added]
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 "<author>" $author "<added>" $added "<views>" $views "<duration>" $duration "<likes>" $likes "<dislikes>"
$dislikes "<badgelist>" $badgelist "<full_description>" $description_parsed] ${ourtubeXTRA::outputline} ]
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 Loaded 1
}
|
|
|
| Back to top |
|
 |
bunnybump Voice

Joined: 17 Aug 2012 Posts: 9
|
Posted: Sat Mar 08, 2014 3:19 am Post subject: KEEP IN FAILED |
|
|
i dunno how could you made this script works. i've try it so many times but it keeps FAILED. how can i use your script for my eggdrop? what command that i have to use so i can use it as what you said?
please check the screenshot below (and probably you would be happy to made a test with your own script right before post it in here):
| Quote: |  |
_________________ In the Beginning... Was the Command Line |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|