This is the new home of the egghelp.org community forum.
All data has been migrated (including user logins/passwords) to a new phpBB version.


For more information, see this announcement post. Click the X in the top right-corner of this box to dismiss this message.

ourtubeXTRA new version using YT API... including comments

Support & discussion of released scripts, and announcements of new releases.
Post Reply
W
WazzaUK
Voice
Posts: 19
Joined: Sun Jul 02, 2006 5:03 pm

ourtubeXTRA new version using YT API... including comments

Post by WazzaUK »

THis version works, has ALOT of addititions.... including comments and badges.....

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
			&star; \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 &apos; \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&star; \00300$chan has this command disabled. \00304&star;"
			}
			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&star; \00300Flood protection triggered: $floodsecs second(s) remaining. \00304&star;"]
                        	}
                	}
        	}		

        	if {( $text eq "" ) && ([string length $data] == 0 )} {
                	lappend data [ utfdecode "$youtubelogo \002\00304&star; \00300Usage: !youtube <search criteria> \00304&star;"]
               
        	}

		if {( [string length $text] <= 3) && ([string length $data] == 0 )} {
                	lappend data [ utfdecode "$youtubelogo \002\00304&star; \00300Error - Search parameter '$text' is too short. \00304&star;"]
		}

		if {[string length $data] == 0} {
        		set data [ourtubeXTRAGet $text $chan]
       
		}

       		if {[string length $data] == 0} {
			lappend data [ utfdecode "youtubelogo \0w02\00304&star; I was unable to connect to that website. Probably I get timeout. \00304&star;"]
        	}

		#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&star; \00300$uresultcount result(s) found for items matching '$ask'.  \00304&star;"
					} else {
                    				set search_header "${ourtubeXTRA::youtubelogo} \002\00304&star; \00300Showing $numitems of $uresultcount result(s) found for  items matching '$ask'. \00304&star;"
				}

				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&star; \00300No such file or webpage. \00304&star;"]
        		}
            		default {
                		http::cleanup $token
                		return [ utfdecode "$youtubelogo \002\00304&star; \00300unforeseen circumstance. Server responded: $ncode \00304&star;"]
            		}
		}    
	}

     
	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&star; \00300Flood protection triggered: $floodsecs second(s) remaining. \00304&star;"]
            		}

            		set protection [clock seconds]

			if {[string length $data] == 0} {
            			set data [otGet $webTarget]
			}
            		
			if {[string length $data] == 0} {
                		lappend data [ utfdecode "$youtubelogo \002\00304&star; \00300I was not able to reach Youtube's link. Probably I get a timeout. Try again.  \00304&star;"]
           		}

			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&star; \00300Invalid youtube link: $ncode \00304&star;"
						return [utfdecode $otoutput]
                    			}
                		}
            		}
			"303" {
                		http::cleanup $token
                		lappend otoutput "$youtubelogo \002\00304&star; \00300That video does not exists. Server responded: $ncode \00304&star;"
				return [utfdecode $otoutput]
            		}
            		"404" {
                		http::cleanup $token
                		lappend otoutput "$youtubelogo \002\00304&star; \00300$ncode - $web - No such webpage \00304&star;"
				return [utfdecode $otoutput]
            		}
            		default {
                		http::cleanup $token
				if {[string first "Disabled" $data 0] == -1} {
					putlog "$VideoID: $data"
				}
                		lappend otoutput "$youtubelogo \002\00304&star; \00300unforeseen circumstances. Server responded: $ncode \00304&star;"
				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
}
User avatar
bunnybump
Voice
Posts: 9
Joined: Fri Aug 17, 2012 2:32 am
Contact:

Post by bunnybump »

uhm..another version of ourtubeXTRA made by you. i just wanna ask you one question:

"have you test it on your eggdrop before you post this script in here?"

cause i don't wanna wasting my time just for an experimently script. AFAIK, if somebody made a post of a script in here, that means it already tested and works fine to everyone (if another user got a trouble by the script, it is not because of the creator but it is because of their own mistake).

thankyou for your kind to answering my question, WazzaUK :)
In the Beginning... Was the Command Line
a
arkadio
Voice
Posts: 6
Joined: Fri Dec 13, 2013 7:36 am

Post by arkadio »

bind pubm - *http://www.youtube.com/watch?* ourtubeXTRA::otPub
It's not binding https that seems to be the default protocol for Youtube now.

Your code looks very very ugly.
W
WazzaUK
Voice
Posts: 19
Joined: Sun Jul 02, 2006 5:03 pm

https / tls / full API support...

Post by WazzaUK »

When i wrote that code i didnt have tls compiled. I use 'Eggdrop 1.8.0 pre-init' ( has tls support ) now. I think i will go back and sort that... The code atm works with the API part - best way to process the comments. Since the public search procedure doesnt use the API its broken since google changed the return data ( im tired of fixing all the regex). Im thinking of writing a new version from scratch using just native API - its so much simpler. Well i suppose thats the point. When i look at that code now im rather ashamed its so untidy... I dont usually like to sing googles praises but they made things alot easier by adding the API...
Post Reply