YouTube parser: Difference between revisions

From Scriptwiki
Jump to navigation Jump to search
Created page with "As the description says, this script retrieves information about youtube videos from the YouTube API and posts them to the channel whenever a youtube link is posted. You can i..."
 
m fixed $regml link
Line 24: Line 24:
   
   
   ; call the youtube script with the channel and the video ID, if there is one
   ; call the youtube script with the channel and the video ID, if there is one
   youtube [[$$]][[regml]](2) [[$chan_(remote)|$chan]]
   youtube [[$$]][[$regml|regml]](2) [[$chan_(remote)|$chan]]
  }
  }
   
   

Revision as of 18:22, 10 July 2013

As the description says, this script retrieves information about youtube videos from the YouTube API and posts them to the channel whenever a youtube link is posted. You can install it by opening the script editor (Alt+R), creating a new script file (File -> New) and then copy paste the script into it.

Note: Make sure to replace the channels (#foo,#bar) in the on TEXT event line with the channels you want the script to be active in.

/*
********************************************************************************************************
* 
*  youtube.mrc by Jay2k1 @ QuakeNet, 2013
* 
*  Whenever a youtube link is posted in the channels #foo or #bar, this script retrieves the video's details
*  from the youtube API and post them to the channel. It looks like this:
* 
*  <Jay2k1> http://www.youtube.com/watch?v=oHg5SJYRHA0
*  <Bot> 'RickRoll' by cotter548, 00:03:34, 68213084 views, rating: 87% (259236/38751)
* 
*********************************************************************************************************
*/

; on text event: regex check for messages containing youtube.com or youtu.be, match the URL
on $*:TEXT:/(youtu\.be\/.*?(\s|$)|youtube\.com\/.*?(\s|$))/:#foo,#bar:{

  ; use another regex to extract the video ID from the matched URL
  noop $regex($regml(1),/(\?v=|\/\d\/|\/embed\/|\/v\/|\.be\/)([a-zA-Z0-9\-\_]{11})/)

  ; call the youtube script with the channel and the video ID, if there is one
  youtube $$regml(2) $chan
}

; alias youtube: opens a socket connection to youtube
; expects: youtube video ID as $1, #channel as $2
; returns: -
alias -l youtube {
  ; create a unique socket name to allow for multiple connections at a time
  var %sock = youtube. $+ $ticks
  sockopen %sock gdata.youtube.com 80
  ; store video ID and channel in socket mark
  sockmark %sock $1-
}

on *:SOCKOPEN:youtube.*:{
  ; obligatory error check
  if $sockerr { return }

  ; send our request
  sockwrite -n $sockname GET /feeds/mobile/videos/ $+ $gettok($sock($sockname).mark,1,32) $+ ?v=2&prettyprint=true HTTP/1.1
  sockwrite -n $sockname Host: $sock($sockname).addr
  sockwrite -n $sockname $crlf
}

on *:SOCKREAD:youtube.*:{
  if $sockerr { return }

  ; receive answer to the request into a variable
  var %data | sockread %data

  ; while there's bytes in the sockread buffer...
  while $sockbr {

    ; extract things of interest out of the source code into a hash table
    if (*<title>*</title>* iswm %data) { hadd -m $sockname title $regsubex(%data,/(.*<title>|</title>.*)/g,) }
    if (*<yt:duration seconds='*'/>* iswm %data) { hadd -m $sockname dur $duration($regsubex(%data,/(.*seconds='|'/>.*)/g,),3) }
    if (*<yt:statistics favoriteCount='*' viewCount='*'/>* iswm %data) { hadd -m $sockname views $regsubex(%data,/(.*viewCount='|'/>)/g,) }
    if (*<yt:rating numDislikes='*' numLikes='*'/>* iswm %data) { hadd -m $sockname likes $regsubex(%data,/(.*numLikes='|'/>.*)/g,) | hadd -m $sockname dislikes $regsubex(%data,/(.*numDislikes='|'.*)/g,) }
    if (*<name>*</name>* iswm %data) { hadd -m $sockname uploader $regsubex(%data,/(.*<name>|</name>.*)/g,) }
    if (*<yt:uploaded>*</yt:uploaded>* iswm %data) { hadd -m $sockname uploaded $left($regsubex(%data,/(.*<yt:uploaded>|</yt:uploaded>.*)/g,),10) }

    ; if we have seven items in our hash table, we have all data we need
    if $hget($sockname,0).item == 7 {
      var %t = $sockname
      msg $gettok($sock($sockname).mark,2,32) ' $+ $hget(%t,title) $+ ' by $hget(%t,uploader) $+ , $hget(%t,dur) $+ , $hget(%t,views) views, rating: $round($calc($hget(%t,likes) / ($hget(%t,likes) + $hget(%t,dislikes)) * 100),1) $+ % ( $+ $hget(%t,likes) $+ / $+ $hget(%t,dislikes) $+ )
      sockclose %t
      hfree %t
      return
    }
    sockread %data
  }
}
Contributed by Jay2k1