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.

YoutubeTitle V2 - Version 2.1 (22/08/16)

Support & discussion of released scripts, and announcements of new releases.
f
fr3n
Voice
Posts: 16
Joined: Fri Dec 02, 2005 10:06 am

Post by fr3n »

I get the following when trying to use this script;

Code: Select all

[14:37:12] Tcl error in file 'mrt.conf':
[14:37:12] wrong # args: should be "set varName ?newValue?"
    while executing
"set youtube(api_get) "https://www.googleapis.com/youtube/v3/videos" set youtube(api_search) "https://www.googleapis.com/youtube/v3/search""
    (file "scripts/YT.tcl" line 77)
    invoked from within
"source scripts/YT.tcl"
    (file "mrt.conf" line 1494)
[14:37:12] * CONFIG FILE NOT LOADED (NOT FOUND, OR ERROR)
User avatar
Arnold_X-P
Master
Posts: 226
Joined: Mon Oct 30, 2006 12:19 am
Location: DALnet - Trinidad - Beni - Bolivia
Contact:

Re: YoutubeTitle V2

Post by Arnold_X-P »

TCL good finally understood how it works
in windrop
step 1
conf down and add in three tcl:

http.tcl
tls.tcl
json.tcl

these three add tcl in the conf:
source scripts/http.tcl
source scripts/tls.tcl
source scripts/json.tcl

step two
then down
tls lib
unzip the contents and paste in your directory. example;
\lib\tcl8.5

and that's all ready, will be working well...

[18:05] <Arnold_X-P> .yt
[17:17] <Arnold_X-P> .yt irc
[17:17] <@JulieTh> 01,00You00,04Tube - https://youtu.be/IRC TV | IRC Ko Whatsapp Par Kaise Join Kare Aur Adv. Faiz Syed Kiyon Groups Me Reply Nahi Karte - https://youtu.be/TPWa6httLoM | Why IRC is the Best Social Network - https://youtu.be/xFvBzIP4OSo | IRC Chat For Beginners - https://youtu.be/9E4uskXmPVI | Jo Namaz Chut Jai To Unhe Kaise Padhe By Adv. Faiz Syed - https://youtu.be/XmyLqTeDZqg
Last edited by Arnold_X-P on Sun Jun 05, 2016 5:24 pm, edited 6 times in total.
.:an ideal world:. www.geocities.ws/chateo/yo.htm
my programming place /server ix.scay.net:7005
User avatar
caesar
Mint Rubber
Posts: 3776
Joined: Sun Oct 14, 2001 8:00 pm
Location: Mint Factory

Post by caesar »

fr3n wrote: [14:37:12] Tcl error in file 'mrt.conf':
[14:37:12] wrong # args: should be "set varName ?newValue?"
You get that error cos you copy/pasted the file incorrectly. Download the file to your PC and upload it to the scripts folder again.
Once the game is over, the king and the pawn go back in the same box.
User avatar
Arnold_X-P
Master
Posts: 226
Joined: Mon Oct 30, 2006 12:19 am
Location: DALnet - Trinidad - Beni - Bolivia
Contact:

Post by Arnold_X-P »

Youtube Title V2 for Jan Milants this TCL already has a working key Use it

Code: Select all

###############################################################################
#  Name:                  Youtube Title V2
#  Author:                Jan Milants <viper@anope.org>
#  Version:               2.0     (28/08/2014)
#  Eggdrop Version:       1.6.x
#  Requires TCL version:  8.5
#  Package dependencies:  http, tls, json
#  Credits:               Based on original YouTube Script
#                             by jotham.read@gmail.com
#                         Design inspiration from
#                             youtube.tcl by Mookie.
###############################################################################
# Description
# -------------
# The script monitors text channels for links to Youtube.
# When found, it will query the google server for details such as video title
# and number of views of the youtube video and advertise the results in the channel.
# The script also supports searching youtube with the command "!youtube <search text>"
# or "!yt <search text>". In response, the search query will be passed on to the
# youtube API and the best ranking result will be linked in channel.
#
# This script will be active on any channel it resides in with the "youtube" flag.
# The flag can be set in the console with ".chanset #chan +youtube" or with the 
# in channel command "!youtube on". Both commands only work for users with flag mno.
#
# Getting your own Google API key
# ---------------------------------
# This script uses the Google Youtube Data API V3, which requires an API key to
# authorize access to the API and is used as basis for limiting request per day etc.
# Instructions can be found on 
#     https://developers.google.com/youtube/registering_an_application
# Required steps in short:
#     1. Go to the Google developers console https://console.developers.google.com
#     2. Create a new project. Give it a name like 'eggdrop', doesn't matter much.
#     3. When the project is loaded, select menu "APIs" under "APIs & auth"
#     4. In the list of APIs, enable the "YouTube Data API v3".
#     5. Select menu "Credentials" and click "Create new key".
#     6. Select key type "server".
#     7. Fill in the IP(s) or IP range from which the eggdrop bot will send
#        requests to google's servers. This is a whitelist, if the request
#        comes from a different IP, it will be rejected.
#        Note: If my-ip or my-hostname is configured in eggdrop.conf, they should
#              be entered here.
#     8. You now have an API KEY; copy it to the config section below.
#
# !!! IMPORTANT !!!
# When loading this script alongside other scripts which initiate web service calls,
# ensure this script is loaded last! The script creates a handler for HTTPS connection
# and sets the source IP to the my-ip or my-hostname from eggdrop.conf.
# Most other scripts will not correctly enforce the source IP of requests and 
# can overwrite this scripts HTTPS handler. This results in connections coming from another
# IP on the machine and may thus be rejected by the Google API Servers. 
# The typical error message logged would be "Error processing web service reply".
#
###############################################################################
#  Changes:
#  2.00 28/08/14
#    Started development (Jan).
#    Almost complete rewrite most notable changes:
#        * Use the YouTube Data API V3. (Requires TLS support!)
#        * Strip out flat_json_decoder and use json & dict packages instead.
#        * Strip out tinyurl support. Better to use youtu.be in the response.
#        * Many more data elements supported in response format (possible by new API).
#        * Added possiblity to turn the script on/off on a channel by channel basis.
#        * Added ability to search youtube and return the first result.
#  0.51 09/30/13
#    Small correction for caps in url (but not video id)
#  0.5 01/02/09
#    Added better error reporting for restricted youtube content.
#  0.4 10/11/09
#    Changed title scraping method to use the oembed api.
#    Added crude JSON decoder library.
#  0.3 02/03/09
#    Fixed entity decoding problems in return titles.
#    Added customisable response format.
#    Fixed rare query string bug.
###############################################################################
#
#  Configuration
#
###############################################################################

# API key assigned to your Google account.
# Sadly, everyone will have to register with Google and request their own API key.
# An API key is linked to an IP or mask, so you will need to register one for your own.
# Find detailed instructions above.
set youtube(api_key)  "AIzaSyD290rR6-rFyDRDD5aOerzxflCfZskE7q0"

# Base URI for links to youtube videos.
# Either use the normal youtube link or youtu.be for shorter URLs.
# I'd recommend keeping the HTTPS to avoid exposing user data.
set youtube(base_url)          "https://www.youtube.com/watch?v="
#set youtube(base_url)          "https://www.youtu.be/"

# Date/time format
# The format to be used when showing dates, for example in publish date.
# All times are in UTC.
#
# Available tokens:
#   %year%          4 digit year notation
#   %month%         2 digit month notation
#   %day%           2 digit day of the month notation
#   %hours%          2 digit hour notation on a 24hours basis
#   %minutes%       2 digit minutes notation
#   %seconds%       2 digit seconds notation
#
# Example:
#     "%day%/%month%/%year% %hours%:%minutes% UTC"
set youtube(date_format)   "%day%/%month%/%year% %hours%:%minutes% UTC"


# Response Formats
# Template of the reply to be send to the channel showing the youtube video details.
# A separate response can be set for replies to a pasted URL or to a query.
#
# Available tokens in the response format:
#   %botnick%       Nickname of bot
#   %poster%        Nickname of person who posted the youtube link
#   %youtube_url%   URL to the youtube link (This may not be the exact same
#                   URL that was posted since it's rewritten based on the format
#                   above to ensure all links posted by the bot are HTTPS.)
#   %id%            ID of the linked youtube video.
#   %author%        Author/Uploader/channel of the video.
#   %title%         Title of youtube link
#   %description%   Description of the video.
#                   (Note that this is generally a VERY long text!)
#   %published%     Date & time the video was published.
#   %views%         The number of times the video has been viewed.
#   %likes%         The number of users who have "liked" the video.
#   %dislikes%      The number of users who have "disliked" the video.
#   %length%        Length of the video.
# Tokens only available in the response to searches (q_resp_format):
#   %query%         The original search string.
#
# Example:
#     "\002YouTube\002: %poster%: %youtube_url% - \"\002%title%\002\" (Uploaded by \"%author%\" on %published%) - Length: %length% - Views: %views%  - Likes / Dislikes: %likes% / %dislikes%"
# The template used when looking up a URL found in the channel
set youtube(response_format)   "\002YouTube\002: %poster%: %youtube_url% - \"\002%title%\002\" (Uploaded by \"%author%\" on %published%) - Length: %length% - Views: %views%  - Likes / Dislikes: %likes% / %dislikes%"
# The template used when replying to a search query.
set youtube(q_resp_format)     "\002YouTube\002: %poster%: Top result for searching '%query%': %youtube_url% - \"\002%title%\002\" (Uploaded by \"%author%\" on %published%) - Length: %length% - Views: %views%  - Likes / Dislikes: %likes% / %dislikes%"

# The maximum number of characters from a youtube title to print
set youtube(max_title_length)  64

# The maximum number of characters from a youtube description to print
set youtube(max_desc_length)   128

###############################################################################
#
#  Advanced Configuration
#  !!! DO NOT CHANGE UNLESS YOU KNOW WHAT YOU'RE DOING !!!
#
###############################################################################

# URLs of the youtube V3 API
set youtube(api_get)           "https://www.googleapis.com/youtube/v3/videos"
set youtube(api_search)        "https://www.googleapis.com/youtube/v3/search"

# The groups of properties to be fetched
set youtube(api_part)          "snippet,statistics,contentDetails"

# The fields from the selected property groups that are to be returned
set youtube(api_fields)        "items(id,snippet(publishedAt,title,description,channelTitle),statistics,contentDetails(duration))"

# Maximum time in milliseconds to wait for youtube to respond
set youtube(api_timeout)       "30000"

# Pattern used to patch youtube links in channel public text
set youtube(pattern)           {https{0,1}://.*youtu(?:\.be/|be\..*/watch\?(?:.*)v=)([A-Za-z0-9_\-]+)}

###############################################################################

package require Tcl 8.5
package require http 2.7
package require tls
package require json

# We need HTTPS support for the Google APIs..
# If local IP or host is configured in the main config, use it as the source
# of the outgoing connections.
if { [info exists {my-ip}] == 1 && [string length ${my-ip}] > 0} {
	http::register https 443 [list tls::socket -myaddr ${my-ip}]
} elseif { [info exists {my-hostname}] == 1 && [string length ${my-hostname}] > 0} {
	http::register https 443 [list tls::socket -myaddr ${my-hostname}]
} else {
	http::register https 443 tls::socket
}

set YoutubeTitleVersion "2.0"

setudef flag youtube
bind pubm - * public_youtube
bind pub - !youtube youtube_query
bind pub - !yt youtube_query

###############################################################################

proc note {msg} {
  putlog "% $msg"
}

# Ensure strings are no longer then given length. This will cutoff the string
# at the desired length and append '...'.
proc shorten {text maxlen} {
	if { [string length $text] > [expr $maxlen - 1] } {
		set text [string range $text 0 [expr $maxlen - 4]]"..."
	}
	return $text
}

# Convert an ISO8601 date into a more readable format..
proc conv_iso8601_date {orig_date} {
	global youtube
	set pattern {(\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\d{1}|3[012])[T\s](?:(?:([01]\d|2[0-3]):([0-5]\d))|(24):(00)):(?:([0-5]\d)(?:[\.,](\d+))?|(60)(?:[\.,](0+))?)Z}
	if { [regexp $pattern $orig_date match year month day hours minutes hours_2 minutes_2 seconds milliseconds seconds_2 milliseconds_2] } {
		# The hour and hour_2 variables are mutually exclusive, so we append the _2 variables to
		# the original ones to have fewer variables to work with.
		append hours $hours_2
		append minutes $minutes_2
		append seconds $seconds_2

		# Put everything in a dictionary so we can have a configurable time format.
		set tokens [dict create]
		dict set tokens %year% $year
		dict set tokens %month% $month
		dict set tokens %day% $day
		dict set tokens %hours% $hours
		dict set tokens %minutes% $minutes
		dict set tokens %seconds% $seconds

		return [string map $tokens $youtube(date_format)]
	} else {
		error "Unable to process date value ($orig_date) returned by web service."
	}
}

# Convert an ISO8601 duration into a more readable format..
proc conv_iso8601_duration {duration} {
	set length ""
	set pattern {P(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)D)?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+(?:\.\d+)?)S)?)}
	if { [regexp $pattern $duration match years months days hours minutes seconds] } {
		if { [string length $years] > 0 } {
			append length $years Y " "
		}
		if { [string length $months] > 0 } {
			append length $months M " "
		}
		if { [string length $days] > 0 } {
			append length $days D " "
		}
		if { [string length $hours] > 0 } {
			append length $hours h " "
		}
		if { [string length $minutes] > 0 } {
			append length $minutes m " "
		}
		if { [string length $seconds] > 0 } {
			append length $seconds s " "
		}
	} else {
		error "Unable to process duration value ($duration) returned by web service."
	}
	return [string trim $length]
}

###############################################################################

# Process the reply string of a video lookup from the Youtube API (JSON) and add the
# data to a dictionary containing all tokens the user will be able to use in the template.
proc read_props {json_blob} {
	global youtube
	# Create an empty dictionary for the variables supported in the response format.
	set properties [dict create]

	# Convert the JSON response to a dictionary.
	set reply [json::json2dict $json_blob]

	# The web service returns a list of results, even though our query will always get 1.
	# So we have to take the first element from the list..
	if { ![dict exists $reply items] } {
		error "Error processing web service reply."
	} else {
		set video [lindex [dict get $reply items] 0]

		# Check whether the variables we support in the response are present in the
		# reply from the web service. We check this one by one instead of assuming
		# they exist in case the API changes or someone messes with the requested fields.
		# Properties of the view we extract from reply..
		if { [dict exists $video id] } {
			dict set properties %id% [dict get $video id]
		} else {
			dict set properties %id% ""
		}
		if { [dict exists $video snippet channelTitle] } {
			dict set properties %author% [dict get $video snippet channelTitle]
		} else {
			dict set properties %author% ""
		}
		if { [dict exists $video snippet title] } {
			dict set properties %title% [shorten "[dict get $video snippet title]" $youtube(max_title_length)]
		} else {
			dict set properties %title% ""
		}
		if { [dict exists $video snippet description] } {
			dict set properties %description% [shorten "[dict get $video snippet description]" $youtube(max_desc_length)]]
		} else {
			dict set properties %description% ""
		}
		if { [dict exists $video snippet publishedAt] } {
			dict set properties %published% [conv_iso8601_date [dict get $video snippet publishedAt]]
		} else {
			dict set properties %published% ""
		}
		if { [dict exists $video statistics viewCount] } {
			dict set properties %views% [dict get $video statistics viewCount]
		} else {
			dict set properties %views% ""
		}
		if { [dict exists $video statistics likeCount] } {
			dict set properties %likes% [dict get $video statistics likeCount]
		} else {
			dict set properties %likes% ""
		}
		if { [dict exists $video statistics dislikeCount] } {
			dict set properties %dislikes% [dict get $video statistics dislikeCount]
		} else {
			dict set properties %dislikes% ""
		}
		if { [dict exists $video contentDetails duration] } {
			dict set properties %length% [conv_iso8601_duration [dict get $video contentDetails duration]]
		} else {
			dict set properties %length% ""
		}
	}

	return $properties
}

# Process the reply string of a search query to the Youtube API (JSON) and extract the 
# video id of the first result from the reply.
proc read_searchres {json_blob} {
	global youtube
	# Create an empty dictionary for the variables supported in the response format.
	set video_id ""

	# Convert the JSON response to a dictionary.
	set reply [json::json2dict $json_blob]

	# The web service returns a list of results, even though our query will always get 1.
	# So we have to take the first element from the list..
	if { ![dict exists $reply items] } {
		error "Error processing web service reply."
	} else {
		set res [lindex [dict get $reply items] 0]
		if { [dict exists $res id videoId] } {
			set video_id [dict get $res id videoId]
		}
	}

	return $video_id
}

# Send a request to the youtube API to fetch the video details for
# the video with the given ID.
proc fetch_props {youtube_id} {
	global youtube
	# Ensure an API key has been configured..
	if { [info exists youtube(api_key)] == 0 || [string length $youtube(api_key)] == 0 } {
		error "An API key must be configured to access the Google web API!"
	} else {
		set query [http::formatQuery id $youtube_id key $youtube(api_key) \
			part $youtube(api_part) fields $youtube(api_fields)]
		set response [http::geturl "$youtube(api_get)?$query" -timeout $youtube(api_timeout)]
		upvar #0 $response state
		if [expr [http::ncode $response] == 401] {
			error "Location contained restricted embed data."
		} else {
			set response_body [http::data $response]
			http::cleanup $response
			return [read_props $response_body]
		}
	}
}

# Find the video ID of the first match for the given search.
proc search_video {criteria} {
	global youtube
	# Ensure an API key has been configured..
	if { [info exists youtube(api_key)] == 0 || [string length $youtube(api_key)] == 0 } {
		error "An API key must be configured to access the Google web API!"
	} else {
		set query [http::formatQuery type "video" q $criteria key $youtube(api_key) \
			part "id" fields "items(id(videoId))" maxResults "1"]
		set response [http::geturl "$youtube(api_search)?$query" -timeout $youtube(api_timeout)]
		upvar #0 $response state
		if [expr [http::ncode $response] == 401] {
			error "Location contained restricted embed data."
		} else {
			set response_body [http::data $response]
			http::cleanup $response
			return [read_searchres $response_body]
		}
	}
}

###############################################################################

# This is triggered to analyse ever channel message for the presence of the youtube URL.
# When one is found, the ID is extracted and passed on to get a list of the video properties.
# Finally, this list is used to fill in the tokens in the user defined reply template.
proc public_youtube {nick userhost handle channel args} {
	global youtube botnick

	if { [channel get $channel youtube] && [regexp -nocase -- $youtube(pattern) $args match video_id] } {
		if { [catch {set tokens [fetch_props $video_id]} error] } {
			note "Failed to get video details: $error (querying '$video_id')"
		# If the reply contained an empty ID, we assume we found no video..
		} elseif { [string length [dict get $tokens %id%]] == 0 } {
			putserv "PRIVMSG $channel :Unable to find a youtube video with ID '$video_id'."
		} else {
			dict set tokens %botnick% $botnick
			dict set tokens %poster% $nick
			# Rebuild the URL so we use a url shortener or force SSL
			# in all messages coming from us
			dict set tokens %youtube_url% "$youtube(base_url)$video_id"

			set result [string map $tokens $youtube(response_format)]
			putserv "PRIVMSG $channel :$result" 
		}
	}
}

# This is triggered on !youtube commands.
# Allows turning monitoring on or off by admins.
# All other queries are interpreted as a youtube search.
proc youtube_query {nick userhost handle channel args} {
	global youtube botnick

	# We get a list of arguments, join it to get rid of the curly braces..
	set args [join $args]
	if  { [string length $args] == 0 } {
		if { [channel get $channel youtube] } {
			putserv "PRIVMSG $channel :Syntax: \002!youtube <search criteria>\002 - Search for a video."
		}
		if { [matchattr $handle +mno|+mno $channel] } {
			putserv "NOTICE $nick :Syntax: \002!youtube <on/off>\002 - Turn youtube link lookups on/off."
		}
	} elseif { [matchattr $handle +mno|+mno $channel] && ([string compare $args "on"] == 0 \
			|| [string compare $args "off"] == 0) } {
		if { ![channel get $channel youtube] && [string compare $args "on"] == 0 } {
			channel set $channel +youtube
			putserv "NOTICE $nick :YoutubeTitleV2: enabled on $channel"
			note "YoutubeTitleV2: Monitoring enabled by $nick for $channel."
		} elseif { [channel get $channel youtube] && [string compare $args "off"] == 0 } {
			channel set $channel -youtube
			putserv "NOTICE $nick :YoutubeTitleV2: disabled on $channel"
			note "YoutubeTitleV2: Monitoring disabled by $nick for $channel."
		}
	# The magic number comes from the length of the string "cat".. ;)
	} elseif { [channel get $channel youtube] && [string length $args] < 3 } {
		putserv "PRIVMSG $channel :Search criteria must be at least 3 characters long."
	} elseif { [channel get $channel youtube] } {
		# Search a video...
		# Note that we have to do 2 requests: one to fetch search results (id)
		# and a second to get video details. This is caused by the youtube API 
		# not being capable of returning details in the search functions.
		if { [catch { set video_id [search_video $args] } error ] } {
			note "Failed to find a video: $error (searching for '$args')."
		# If the reply contained an empty ID, we assume we found no video..
		} elseif { [string length $video_id] == 0 } {
			putserv "PRIVMSG $channel :Unable to find a youtube video matching search '$args'" 
		# We have the video id, now find the properties..
		} elseif { [catch {set tokens [fetch_props $video_id]} error] } {
			note "Failed to get video details: $error (searching for '$args' and found '$video_id')."
		# If the reply contained an empty ID, we assume we found no video..
		} elseif { [string length [dict get $tokens %id%]] == 0 } {
			putserv "PRIVMSG $channel :Unable to fetch the video details of '$video_id' for the search result '$args'"
		} else {
			dict set tokens %botnick% $botnick
			dict set tokens %poster% $nick
			dict set tokens %query% $args
			# Rebuild the URL so we use a url shortener or force SSL
			# in all messages coming from us
			dict set tokens %youtube_url% "$youtube(base_url)$video_id"

			set result [string map $tokens $youtube(q_resp_format)]
			putserv "PRIVMSG $channel :$result" 
		}
	}
}

###############################################################################

note "YoutubeTitleV2 Version $YoutubeTitleVersion: loaded";
.:an ideal world:. www.geocities.ws/chateo/yo.htm
my programming place /server ix.scay.net:7005
User avatar
Arnold_X-P
Master
Posts: 226
Joined: Mon Oct 30, 2006 12:19 am
Location: DALnet - Trinidad - Beni - Bolivia
Contact:

Post by Arnold_X-P »

youtube for m00nie
this I recommend it because it gives four simultaneous results also already activated api key....

Code: Select all

#########################################################################################
# Name			m00nie::youtube
# Description		Uses youtube v3 API to search and return videos
# 	
# Version		1.6 - Small correction to "stream" categorisation.....
# 			1.5 - Added UTF-8 support thanks to CatboxParadox (Requires eggdrop
# 				to be compiled with UTF-8 support)
# 			1.4 - Correct time format and live streams gaming etc
#           		1.3 - Updated output to be RFC compliant for some IRCDs
# 			1.2 - Added auto info grabber for spammed links
#			1.1 - Fixing regex!
#			1.0 - Initial release
# Website		https://www.m00nie.com
# Notes			Grab your own key @ https://developers.google.com/youtube/v3/
#########################################################################################
namespace eval m00nie {
   namespace eval youtube {
	package require http
	package require json
	package require tls
	http::register https 443 tls::socket
	bind pub - !yt m00nie::youtube::search
	bind pub - .yt m00nie::youtube::search
	bind pub - !youtube m00nie::youtube::search
	bind pub - .youtube m00nie::youtube::search
	bind pubm - * m00nie::youtube::autoinfo
	variable version "1.6"
	setudef flag youtube
	variable key "AIzaSyD290rR6-rFyDRDD5aOerzxflCfZskE7q0"
	variable regex {(?:http(?:s|).{3}|)(?:www.|)(?:youtube.com\/watch\?.*v=|youtu.be\/)([\w-]{11})}
	::http::config -useragent "Mozilla/5.0 (X11; Linux x86_64; rv:29.0) Gecko/20100101 Firefox/29.0"

proc autoinfo {nick uhost hand chan text} {
	if {[channel get $chan youtube] && [regexp -nocase -- $m00nie::youtube::regex $text url id]} {
		putlog "m00nie::youtube::autoinfo is running"
		putlog "m00nie::youtube::autoinfo url is: $url and id is: $id"
		set url "https://www.googleapis.com/youtube/v3/videos?id=$id&key=$m00nie::youtube::key&part=snippet,statistics,contentDetails&fields=items(snippet(title,channelTitle,publishedAt),statistics(viewCount),contentDetails(duration))"
		set ids [getinfo $url]
		set title [encoding convertfrom [lindex $ids 0 1 3]]
		set pubiso [lindex $ids 0 1 1]
		regsub {\.000Z} $pubiso "" pubiso
		set pubtime [clock format [clock scan $pubiso]]
		set user [encoding convertfrom [lindex $ids 0 1 5]]
		# Yes all quite horrible...
		set isotime [lindex $ids 0 3 1]
		regsub -all {PT|S} $isotime "" isotime
                regsub -all {H|M} $isotime ":" isotime
		if { [string index $isotime end-1] == ":" } {
			set sec [string index $isotime end]
                        set trim [string range $isotime 0 end-1]
                        set isotime ${trim}0$sec
		} elseif { [string index $isotime 0] == "0" } {
			set isotime "stream"
		} elseif { [string index $isotime end-2] != ":" } {
			set isotime "${isotime}s"
		}
		set views [lindex $ids 0 5 1]
		puthelp "PRIVMSG $chan :\002\00301,00You\00300,04Tube\003\002 \002$title\002 by $user (duration: $isotime) on $pubtime, $views views"

	}
}

proc getinfo { url } {
	for { set i 1 } { $i <= 5 } { incr i } {
        	set rawpage [::http::data [::http::geturl "$url" -timeout 5000]]
        	if {[string length rawpage] > 0} { break }
        }
        putlog "m00nie::youtube::getinfo Rawpage length is: [string length $rawpage]"
        if {[string length $rawpage] == 0} { error "without answer comeback, :( try it later or check its connection." }
        set ids [dict get [json::json2dict $rawpage] items]
	putlog "m00nie::youtube::getinfo IDS are $ids"
	return $ids
} 

proc search {nick uhost hand chan text} {
	putlog "m00nie::youtube::search is running"
	regsub -all {\s+} $text "%20" text
	set url "https://www.googleapis.com/youtube/v3/search?part=snippet&fields=items(id(videoId),snippet(title))&key=$m00nie::youtube::key&q=$text"
	set ids [getinfo $url]
	set output "\002\00301,00You\00300,04Tube\003\002 "
	for {set i 0} {$i < 5} {incr i} {
		set id [lindex $ids $i 1 1]
		set desc [encoding convertfrom [lindex $ids $i 3 1]]
		set yout "https://youtu.be/$id"
		append output "\002" $desc "\002 - " $yout " | "
	}
	set output [string range $output 0 end-2]
	puthelp "PRIVMSG $chan :$output"
}
}
}
putlog "m00nie::youtube $m00nie::youtube::version loaded"
.:an ideal world:. www.geocities.ws/chateo/yo.htm
my programming place /server ix.scay.net:7005
User avatar
d3n
Voice
Posts: 15
Joined: Wed Jul 13, 2016 2:30 pm
Location: Italy
Contact:

Post by d3n »

i have a problem with Youtube V2 , today doesn't work, title and !yt why ? can help me

[17:18:22] % Failed to get video details: error reading "sock6": software caused connection abort (querying 's8cOBFStYhM')
User avatar
Arnold_X-P
Master
Posts: 226
Joined: Mon Oct 30, 2006 12:19 am
Location: DALnet - Trinidad - Beni - Bolivia
Contact:

Post by Arnold_X-P »

that eggdrop version is using??
It works for me well the tcl
.:an ideal world:. www.geocities.ws/chateo/yo.htm
my programming place /server ix.scay.net:7005
User avatar
d3n
Voice
Posts: 15
Joined: Wed Jul 13, 2016 2:30 pm
Location: Italy
Contact:

Post by d3n »

i'm using eddgrop 1.6.21 i'ts works always but 2 day ago tell me in DCC the reason i posted ! i need to change API key for work again ?


% Failed to get video details: error reading "sock6": software caused connection abort (querying 'Qv-hsIPs3Ak')

% Failed to get video details: error reading "sock6": software caused connection abort (querying 'Qv-hsIPs3Ak')


i can't understand where is the problem
T
Taken
Voice
Posts: 7
Joined: Mon Jul 26, 2010 5:51 pm

Post by Taken »

d3n wrote:i'm using eddgrop 1.6.21 i'ts works always but 2 day ago tell me in DCC the reason i posted ! i need to change API key for work again ?


% Failed to get video details: error reading "sock6": software caused connection abort (querying 'Qv-hsIPs3Ak')

% Failed to get video details: error reading "sock6": software caused connection abort (querying 'Qv-hsIPs3Ak')


i can't understand where is the problem
Same problem here, only change sock number (my case sock10).

Any ideas?
User avatar
Madalin
Master
Posts: 310
Joined: Fri Jun 24, 2005 11:36 am
Location: Constanta, Romania
Contact:

Post by Madalin »

search for the

Code: Select all

::http::register line
and modify it with

Code: Select all

::http::register https 443 [list ::tls::socket -tls1 1] 
or use my version http://forum.egghelp.org/viewtopic.php?t=20199
T
Taken
Voice
Posts: 7
Joined: Mon Jul 26, 2010 5:51 pm

Post by Taken »

I have this:

Code: Select all

if { [info exists {my-ip}] == 1 && [string length ${my-ip}] > 0} {
        http::register https 443 [list tls::socket -myaddr ${my-ip}]
} elseif { [info exists {my-hostname}] == 1 && [string length ${my-hostname}] > 0} {
        http::register https 443 [list tls::socket -myaddr ${my-hostname}]
} else {
        http::register https 443 tls::socket
}
what change here?

Thanks.
User avatar
Madalin
Master
Posts: 310
Joined: Fri Jun 24, 2005 11:36 am
Location: Constanta, Romania
Contact:

Post by Madalin »

second line
T
Taken
Voice
Posts: 7
Joined: Mon Jul 26, 2010 5:51 pm

Post by Taken »

Madalin wrote:second line
Works! Thanks!
V
Viper
Voice
Posts: 3
Joined: Fri Aug 29, 2014 4:59 am

YoutubeTitleV2 - Version 2.1 Released

Post by Viper »

Wow.. people are actually using my script..? :shock:
I remember watching this thread for the first few weeks/months after i posted it, but kinda forgot about it after that since it seemed like there was no interest :)
Until recently someone mentioned on IRC he and other people actually use it now, so figured I'd pop in and go through the comments..

Having done that, i figured a small update to address the 2 items mentioned wouldn't hurt.. and i ended up with a slightly bigger update than expected.. The previous version has no major issues I'm aware of, so this release mostly adds 2 handy features I should have probably added from the start.. :)

Changes
  • Added a default API key since IPs don't need to be individually whitelisted anymore.
    Added support for YouTube searches returning multiple search results.
    Added basic anti-flood measures by implementing a minimum interval between searches.
    Updated dependency checking to be non-fatal to the hosting bot. (Suggested by caesar.)
    Updated documentation for creating your own API key to match new dev console.
    Fixed the socket not enabling TLS usage on some systems. (Fix suggested by Madalin.)
I've committed everything to my GIT repo so the link in the first post will use the new version unless you specifically select the previous release or commit.. i'll update the first post to add a direct link to be clear :)

Git repo link
Direct download link.

Note that as mentioned in the notes, you no longer have to bother getting your own API key.. i've added one of my own in the git repo. I can't recall exactly why I didn't do this initially, may have something to do with having to whitelist each IP individually back then..
User avatar
Arnold_X-P
Master
Posts: 226
Joined: Mon Oct 30, 2006 12:19 am
Location: DALnet - Trinidad - Beni - Bolivia
Contact:

Re: YoutubeTitleV2 - Version 2.1 Released

Post by Arnold_X-P »

great Viper!!!!! thanks :)
.:an ideal world:. www.geocities.ws/chateo/yo.htm
my programming place /server ix.scay.net:7005
Post Reply