Code: Select all
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 seperator "\002\00310•\002 "
set outputline "$youtubelogo $seperator\002\00309<title> $seperator\00312Author: \00314\002<author> $seperator\00312\002Added: \00314\002<added> $seperator \00312\002Views: \00314\002<views> $seperator\00312\002Duration: \00314\002<duration> $seperator\00312\002Likes: \00309\002<likes> $seperator\00312\002Dislikes: \00304\002<dislikes> $seperator\00312\002<badgelist> "
set descrline "\017\00314<full_description>"
set outputsearch " \00310\002<vcount> \00312\037<link>\003\037 $seperator\00309<title>\002 $seperator\00312\002Author: \00314\002<author> $seperator\00312\002Added: \00314\002<added> $seperator\00312\002Views: \00314\002<views> $seperator\00312\002Duration: \00314\002<duration> $seperator\00312\002<badgelist>\017\00314<description>"
set outputcomments "\00314\002<commentnum> \00312<content> \00314(Posted by \002<author>\002 on <date> <time>"
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
set max_comments 3
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 newword ""
set oldword ""
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 idx 0
set urlindex [string first $wprotocol $word $idx ]
set newword [string range $word $urlindex [string length $word]]
incr idx
set oldlen [expr [string first $wprotocol $newword 0] -1 ]
set oldword [string range $word 0 $oldlen]
incr i
set wprotocol ""
if { $urlindex > 0 } { append oldword " " }
regexp {(f|ht)tp(s|)://} $newword "" wprotocol
if { $wprotocol != "" } {
set word "$oldword\003${color}${style_bd}${style_ul}$newword\00314${style_bd}${style_ul}"
append newtext $word " "
}
}
if {( $urlindex == -1 ) && ( $word != "" )} {
append newtext $word " "
}
}
set newtext [ string trimright $newtext $word ]
set Linelen [ string length $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
☆ \u2605 &lwarr; \u21e6 &rwarr; \u21e8 &blbt; \u25C0 &brbt; \u25b6
&brpdt; \u23e9 &blpdt; \u23ea
Ò \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 otdisplaylines {chan text} {
#Display results
set otoutput [encoding convertto utf-8 $text]
foreach line $otoutput {
putquick "PRIVMSG $chan :$line"
}
}
proc otYouTubeComments {VideoID otoutput} {
global ourtubeXTRA::max_comments ourtubeXTRA::youtubelog
putlog "otYouTubeComments - videoID: $VideoID - max_comments: $max_comments"
set url "http://gdata.youtube.com/feeds/api/videos/$VideoID/comments"
putlog "otYouTubeComments - URL: $url"
set token [http::geturl $url]
upvar #0 $token state
set data $state(body)
set ncode ""
regexp {[0-9]{3}} $state(http) ncode
if {$ncode eq ""} {
set ncode $state(http)
}
http::cleanup $token
regsub -all {\n|\t|\r} $data "" data
set totalcomments ""
regexp {<openSearch:totalResults>(.*?)</openSearch:totalResults>} $data "" totalcomments
regsub {(.*?)</id>} $data "" data
set comments [ regexp -all -inline {</id>(.*?)</author>} $data ]
set comments_items [ expr { [ llength $comments ] /2} ]
if { $ourtubeXTRA::max_comments > $totalcomments } {
set totalcomments $comments_items
}
putlog "comments contains $comments_items"
set lmap ""
set numcomments 0
lappend otoutput ""
foreach {id comment} $comments {
foreach {entity number} [regexp -all -inline {&#(\d+);} $comment] {
lappend map $entity [format \\u%04x [scan $number %d]]
}
set comment [string map [subst -nocomm -novar $lmap] $comment]
set commenttitle ""
set commentauthor ""
set commentcontent ""
set commentdate ""
set commenttime ""
set replycount 0
regexp {<author><name>(.*?)</name>} $comment "" commentauthor
regexp {<published>(.*?)T(.*?).000Z</published>} $comment "" commentdate commenttime
regexp {<updated>(.*?)T(.*?).000Z</updated>} $comment "" commentdate commenttime
regexp {<title type='text'>(.*?)</title>} $comment "" commenttitle
regexp {<content type='text'>(.*?)</content>} $comment "" commentcontent
regexp {<yt:replyCount>(.*?)</yt:replyCount>} $comment "" replycount
putlog "rc: $replycount."
set comlen [string length $commentcontent]
if {($comlen == 0 ) && ($replycount >0)} {
set commentcontent "$replycount replies on Google+"
}
incr numcomments
set numtext "\00312\[$numcomments\]\002"
set testline [string map [list "<commentnum>" $numtext "<content>" "" "<author>" $commentauthor "<date>" $commentdate "<time>" $commenttime] ${ourtubeXTRA::outputcomments} ]
set predlen [expr { [string length $testline] + [string length $commentcontent] } ]
if { $predlen >= 380 } {
set commentcontent [string range $commentcontent 0 [expr { 380 - [string length $testline] } ] ]
}
if {$commentcontent == "" } { set commentcontent "Empty." }
set clen [string length $commentcontent]
set commentcontent [url_search $clen "07" "style_ul" $commentcontent]
set outputline [string map [list "<commentnum>" $numtext "<content>" $commentcontent "<author>" $commentauthor "<date>" $commentdate "<time>" $commenttime] ${ourtubeXTRA::outputcomments} ]
set outputline [encoding convertfrom utf-8 $outputline]
set outputline [utfdecode $outputline]
lappend otoutput $outputline
if {$numcomments >= $ourtubeXTRA::max_comments} {
break
}
}
if { $numcomments > 0 } {
set totalsline "\00312Showing \00312$numcomments\00312 of \00312$totalcomments \00312comment(s)."
lappend otoutput $totalsline
}
return $otoutput
}
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} \002\00304☆ \00300$chan has this command disabled. \00304☆"
}
if {[matchattr $hand n]} {
putquick "NOTICE $nick :You can enable it directly typing: /msg $chan !youtube enable"
}
return
}
global ourtubeXTRA::ytrest protection ourtubeXTRA::youtubelogo
set data ""
#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]
lappend data [ utfdecode "$youtubelogo \002\00304☆ \00300Flood protection triggered: $floodsecs second(s) remaining. \00304☆"]
}
}
}
if {( $text eq "" ) && ([string length $data] == 0 )} {
lappend data [ utfdecode "$youtubelogo \002\00304☆ \00300Usage: !youtube <search criteria> \00304☆"]
}
if {( [string length $text] <= 3) && ([string length $data] == 0 )} {
lappend data [ utfdecode "$youtubelogo \002\00304☆ \00300Error - Search parameter '$text' is too short. \00304☆"]
}
if {[string length $data] == 0} {
set data [ourtubeXTRAGet $text $chan]
}
if {[string length $data] == 0} {
lappend data [ utfdecode "youtubelogo \0w02\00304☆ I was unable to connect to that website. Probably I get timeout. \00304☆"]
}
#Display results
set data [encoding convertto utf-8 $data]
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
#regsub {(.*?)<ol id=\"search-results\" class=\"result-list\">} $data "" data
#regsub {<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 "" data
regsub {<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 "" 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 } ]
putlog "max links: $ourtubeXTRA::max_links - Total: $total"
if {$total >= $ourtubeXTRA::max_links } {
set numitems $max_links
} else {
set numitems $total
}
set search_header ""
if {$resultcount == 0} {
set numitems 0
set search_header "${ourtubeXTRA::youtubelogo} \002\00304☆ \00300$uresultcount result(s) found for items matching '$ask'. \00304☆"
} else {
set search_header "${ourtubeXTRA::youtubelogo} \002\00304☆ \00300Showing $numitems of $uresultcount result(s) found for items matching '$ask'. \00304☆"
}
set search_header [utfdecode $search_header]
lappend ytlist $search_header
putlog "Search URL: http://www.youtube.com/results?search_query=$search&sm=12"
set i 0
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=\"rtl\">(.*?)</div>} $item_info "" description
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 {<meta name=\"description\" content=\"(.*?)\">} $line "" 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 200]
set vcount_txt "\[$vcount\]"
set ytoutput [string map [list "<vcount>" $vcount_txt "<link>" $yturl "<title>" $title_parsed "<author>" $author "<added>" $added "<views>" $viewcount "<duration>" $duration "<badgelist>" $badgelist "<description>" $description_parsed] ${ourtubeXTRA::outputsearch}]
set ytoutput [utfdecode $ytoutput]
if { $i >= $ourtubeXTRA::max_links } {
break
}
incr i
lappend ytlist $ytoutput
incr vcount
}
}
return $ytlist
}
"404" {
http::cleanup $token
return [ utfdecode "$youtubelogO \002\00304☆ \00300No such file or webpage. \00304☆"]
}
default {
http::cleanup $token
return [ utfdecode "$youtubelogo \002\00304☆ \00300unforeseen circumstance. Server responded: $ncode \00304☆"]
}
}
}
proc otPub {nick uhost hand chan text} {
if {![channel get $chan ourtubeXTRA]} {
return
}
global ourtubeXTRA::ytrest ourtubeXTRA::youtubelogo protection
set data ""
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]
lappend data [utfdecode "$youtubelogo \002\00304☆ \00300Flood protection triggered: $floodsecs second(s) remaining. \00304☆"]
}
set protection [clock seconds]
if {[string length $data] == 0} {
set data [otGet $webTarget]
}
if {[string length $data] == 0} {
lappend data [ utfdecode "$youtubelogo \002\00304☆ \00300I was not able to reach Youtube's link. Probably I get a timeout. Try again. \00304☆"]
}
set data [encoding convertto utf-8 $data]
foreach line $data {
putquick "PRIVMSG $chan :$line"
}
utimer $ytrest [list set protection ""]
}
}
proc otGet {web} {
global ourtubeXTRA::youtubelogo
set token [http::geturl $web]
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
lappend otoutput "$youtubelogo \002\00304☆ \00300Invalid youtube link: $ncode \00304☆"
return [utfdecode $otoutput]
}
}
}
"303" {
http::cleanup $token
lappend otoutput "$youtubelogo \002\00304☆ \00300That video does not exists. Server responded: $ncode \00304☆"
return [utfdecode $otoutput]
}
"404" {
http::cleanup $token
lappend otoutput "$youtubelogo \002\00304☆ \00300$ncode - $web - No such webpage \00304☆"
return [utfdecode $otoutput]
}
default {
http::cleanup $token
if {[string first "Disabled" $data 0] == -1} {
putlog "$VideoID: $data"
}
lappend otoutput "$youtubelogo \002\00304☆ \00300unforeseen circumstances. Server responded: $ncode \00304☆"
return [utfdecode $otoutput]
}
}
set durationfmt "%M:%S"
set badges ""
set badge1 ""
set badge2 ""
set agestrict ""
set title ""
set title_parsed ""
set VideoID ""
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]
}
regexp {<meta itemprop=\"videoId\" content=\"(.*?)\">} $data "" VideoID
putlog "videoID: $VideoID"
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 -- {<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 -- {(<[^>]*>)|\" \"|</*>} $full_description " " full_description
#set full_description [ string replace full_description [ string first \""\" $full_description 0 ] end " " ]
set tlen [string length $full_description]
#set full_description_parsed [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 $full_description ]
set full_description_parsed [url_search $tlen "07" "style_ul" $full_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]
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 ] ${ourtubeXTRA::outputline} ]
set descr [ string map [list "<full_description>" $full_description_parsed ] ${ourtubeXTRA::descrline} ]
set ot_output ""
lappend ot_output $yt_output
lappend ot_output $descr
set VideoID [string trimleft $VideoID "/"]
set ot_output [otYouTubeComments $VideoID $ot_output]
set ot_output [utfdecode $ot_output]
return $ot_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
}