iMDB.tcl

iMDB.tcl

This iMDB.tcl requires Eggdrop1.6.0 or higher, Just type in partyline: .chanset #channel +imdb - For each channel you want users to use !imdb cmd

Postat de Copyright Categorie Review user Vizualizari Data
btc B0unTy sockopen Cod netestat 542 2023-12-25 00:37:26

###############################################################################
##     This iMDB.tcl requires Eggdrop1.6.0 or higher                         ##
##                  (c) 2003 by B0unTy                                       ##

###############################################################################
##                                                                           ##
## INSTALL:                                                                  ##
## ========                                                                  ##
##   1- Copy iMDB.tcl in your dir scripts/                                   ##
##   2- Add iMDB.tcl in your eggdrop.conf:                                   ##
##        source scripts/imdb.tcl                                            ##
##                                                                           ##
##   For each channel you want users to use !imdb cmd                        ##
##   Just type in partyline: .chanset #channel +imdb                         ##
##                                                                           ##
###############################################################################
# COOKIES ARE :
# =============
# TITLE          = %title    |    BOLD        = %bold
# URL            = %url      |    UNDERLINE   = %uline
# DIRECTOR       = %name     |    COLORS      = %color#,#
# GENRE          = %genre    |    NEW LINE    = \n
# SYNOPSIS       = %plot     |-----------------------------
# RATING         = %rating   |    !! to reset color code !!
# RATING_BAR     = %rbar     |    !! use %color w/o args !!
# VOTES          = %votes    |
# RUNTIME        = %time     |
# BUDGET         = %budget   |
# SCREENS        = %screens  |
# TAGLINE        = %tagline  |
# MPAA           = %mpaa     |
# COUNTRY        = %country  |
# LANGUAGE       = %language |
# SOUND MIX      = %soundmix |
# TOP 250        = %top250   |
#
# RANDOMIZING OUTPUT :
# ====================
# Exemple:
#  set random(IMDBIRC-0)       "IMDB info for %bold%title%bold Directed by %name"
#  set random(IMDBIRC-1)       "IMDB info for %title Directed by %bold%name%bold"
#  set random(IMDBIRC-2)       "IMDB info for %title Directed by %name"
# TYPE --------^   ^

set announce(IMDBIRC) "%bold%title%bold - %url\nDirected by %name\nCountry: %country\nGenre: %genre\nTagline: %tagline\nSynopsis: %plot\nRating: %rating (%votes votes) %rbar  %color3%top250%color\nRuntime: %time mins\nBudget: %budget."

set barcol1 "14"
set barcol2 "7"
set imdb_timeout "40000"
set queue_enabled 1
set queue_size 5
set queue_time 120
set pub_or_not 1
set IMDB_DEBUG 1 
set IMDB_ALTERNATIVE 0
set binary(CURL) ""

#################################################################
# DO NOT MODIFY BELOW HERE UNLESS YOU KNOW WHAT YOU ARE DOING!  #
#################################################################
if { $IMDB_ALTERNATIVE == 0 } { package require http 2.3 }
setudef flag imdb

bind pub -|- !imdb imdb_proc

set instance 0
set warn_msg 0

proc htmlcodes {tempfile} {
    set mapfile [string map {" ' & & [ ( \ / ] ) { ( } ) £ £ ¨ ¨ © © « « ­ ­ ® ® } $tempfile]
    set mapfile [string map {´ ´ · · ¹ ¹ » » ¼ ¼ ½ ½ ¾ ¾ À À Á Á  Â } $mapfile]
    set mapfile [string map {à Ã Ä Ã„ Å Ã… Æ Ã† Ç Ã‡ È Ãˆ É Ã‰ Ê ÃŠ Ë Ã‹ Ì ÃŒ Í Ã Î ÃŽ Ï Ã РÐ Ñ Ã‘ Ò Ã’ Ó Ã“ Ô Ã” Õ Ã• Ö Ã– } $mapfile]
    set mapfile [string map {× Ã— Ø Ã˜ ٠Ù Ú Ãš Û Ã› Ü Ãœ Ý Ã Þ Ãž ß ÃŸ à à á á â â ã ã ä ä å Ã¥ æ æ ç ç è è é é ê ê } $mapfile]
    set mapfile [string map {ë ë ì ì í í î î ï ï ð ð ñ ñ ò ò ó ó ô ô õ õ ö ö ÷ ÷ ø ø ù ù ú ú û û ü ü ý ý þ þ } $mapfile]
    return $mapfile
}

proc channel_check_imdb { chan } {
    foreach setting [channel info $chan] {
        if {[regexp -- {^[\+-]} $setting]} {
            if {![string compare "+imdb" $setting]} {
                set permission 1
                break
            } else {
                set permission 0
            }
        }
    }
    return $permission
}

proc replacevar {strin what withwhat} {
    set output $strin
    set replacement $withwhat
    set cutpos 0
    while { [string first $what $output] != -1 } {
        set cutstart [expr [string first $what $output] - 1]
        set cutstop  [expr $cutstart + [string length $what] + 1]
        set output [string range $output 0 $cutstart]$replacement[string range $output $cutstop end]
    }
    return $output
}

proc imdb_proc { nick uhost handle chan arg } {
    global instance queue_size queue_time queue_enabled imdb_timeout barcol1 barcol2 IMDB_DEBUG pub_or_not announce random warn_msg binary IMDB_ALTERNATIVE
    # channel_check permission
    set permission_result [channel_check_imdb $chan]
    if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG permission_result == $permission_result" }
    if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG instance == $instance" }
    if { $permission_result == 0} { return }
    # public or private
    if {$pub_or_not == 1 } { set toput "PRIVMSG $chan" } else { set toput "NOTICE $nick" }
    if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG toput_result == $toput" }
    # if no arg passed, show help
    if {$arg == ""} {
        if { $IMDB_ALTERNATIVE == 0 } { set using "Http 2.3+" } else { set using "Curl 6.0+" }
        if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG no arg passed, show help" }
        puthelp "$toput :IMDb info script \002v2.3.4+\002 by B0unTy using \002$using\002"
        puthelp "$toput :\002Syntax: !imdb <movie title>\002  exemple: !imdb Beautiful Mind"
        return
    }

    #flood-control
    if { $queue_enabled == 1 } {
       #flooded?
       if { $instance >= $queue_size } {
          if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG flood detected" }
          if { $warn_msg == 0 } {
             set warn_msg 1
             putquick "$toput :Flood-Control: Request for \"$arg\" from user \"$nick\" will not be answered."
             putquick "$toput :Flood-Control: Maximum of $queue_size requests every $queue_time seconds."
             utimer 120 wmsg
          }
          return
       }
       incr instance
       if { $IMDB_DEBUG == 1 } { putlog "IMDB_DEBUG new instance == $instance" }
       utimer [set queue_time] decr_inst
    }

    # initial search
    set imdburl "http://www.imdb.com"
    set imdbsearchurl "http://akas.imdb.com/find?tt=on;nm=on;mx=5;"
    set searchString [string map {\  %20 & %26 , %2C . %20} $arg]
    if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG searchString: \"$searchString\"" }
    if { $IMDB_ALTERNATIVE == 0 } {
        set page [::http::config -useragent "MSIE 6.0"]
        if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG ${imdbsearchurl}q=$searchString" }
        set page [::http::geturl ${imdbsearchurl}q=$searchString -timeout $imdb_timeout]
        if { [::http::status $page] == "timeout" } {
            puthelp "$toput :\002Connection to imdb.com timed out while doing initial search.\002"
            ::http::Finish $page
            return
        }
        set html [::http::data $page]
        ::http::Finish $page
    } else {
        catch { exec $binary(CURL) "${imdbsearchurl}q=$searchString" } html
    }
    #if redirect necessary, find first link and redirect
    if { [regexp {<title>IMDb  Search} $html] == 1 } {
        if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG redirect 1" }
        set ttcode "0000001"
        set start "0"
        #start from the headline
        regexp -indices {<h1>IMDb  Search</h1>} $html start
        set temp [string range $html [lindex $start 1] end]

        #dealing with different search results
        set hit 0
        if { [regexp -indices {Popular Titles} $temp tstart] } {
           if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG found popular titles" }
           set temp2 [string range $temp [lindex $tstart 1] end]
           regexp {<a.*?>(.*?)</a>} $temp2 dummy title
           if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG compare $title == $arg" }
           if { [string equal -nocase $title $arg] } {
              if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG equals - displaying first popular match" }
              set temp $temp2
              set hit 1
           } else {
              if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG not equal - searching for exact match" }
           }

        }
        if { $hit == 0 } {
           if { [regexp -indices {Exact Matches} $temp start] } {
              if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG displaying exact match" }
           } elseif { [regexp -indices {Titles} $temp start] } {
              if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG no exact match - displaying first title on page" }
           } else {
                puthelp "$toput :No useful results."
                if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG no titles results found" }
                return
           }
           set temp [string range $temp [lindex $start 1] end]
        }

        #searching for first ttcode
        if [regexp {/title/tt[0-9]+} $temp ttcode] {
           set pos [string last / $ttcode] ; incr pos
           set ttcode [string range $ttcode $pos end]
        }
        # for bogus ttcode
        if { $ttcode == "0000001" } {
            puthelp "$toput :No no no! I can't find that!"
            if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG bogus ttcode" }
            return
        }
        set newurl "$imdburl/title/$ttcode/"
        if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG redirect 1 = $newurl" }
        # get the page redirected to
        unset html
        if { $IMDB_ALTERNATIVE == 0 } {
            set page [::http::config -useragent "MSIE 6.0"]
            set page [::http::geturl $newurl -timeout $imdb_timeout]
            if {[::http::status $page]=="timeout"} {
                puthelp "$toput :\002Connection to imdb.com timed out.\002"
                ::http::Finish $page
                return
            }
            set html [::http::data $page]
            ::http::Finish $page
        } else {
            catch { exec $binary(CURL) "$newurl" } html
        }
    # if no redirect happened, then get first page on match
    } else {
        set location ""
        if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG redirect 0" }
        if { $IMDB_ALTERNATIVE == 0 } {
            upvar 0 $page oldpage
            regexp {title/tt[0-9]+/} $oldpage(meta) location
        } else {
            set result [catch { exec $binary(CURL) -i "${imdbsearchurl}q=$searchString" } oldpage]
            regexp {title/tt[0-9]+/} $oldpage location
        }
        if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG redirect 0 Location == $location" }
        set newurl "$imdburl/$location"
        if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG redirect 0 = $newurl" }
        if { $location != "" } {
            if { $IMDB_ALTERNATIVE == 0 } {
                unset html
                set page [::http::config -useragent "MSIE 6.0"]
                set page [::http::geturl $newurl -timeout $imdb_timeout]
                if {[::http::status $page]=="timeout"} {
                    puthelp "$toput :\002Connection to imdb.com timed out.\002"
                    ::http::Finish $page
                    return
                }
                set html [::http::data $page]
                ::http::Finish $page
            } else {
                unset html
                catch { exec $binary(CURL) "$newurl" } html
            }
        }
    }
    # for bogus searches
    if {[string length $newurl] == 0} {
        puthelp "$toput :No no no! I can't find that!"
        if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG bogus searches" }
        return
    }

    # decide on output
    if { ! [string compare [lindex $announce(IMDBIRC) 0] "random"] && [string is alnum -strict [lindex $announce(IMDBIRC) 1]] == 1 } {
        set output $random(IMDBIRC\-[rand [lindex $announce(IMDBIRC) 1]])
    } else {
        set output $announce(IMDBIRC)
    }

    # collect output
    set title "N/A" ; set name "N/A" ; set genre "N/A" ; set tagline "N/A"
    set plot "N/A" ; set rating "N/A" ; set votes "N/A" ; set mpaa "N/A"
    set runtime "N/A" ; set budget "N/A" ; set screens "N/A" ; set country "N/A"
    set language "N/A" ; set soundmix "N/A" ; set top250 "top/bottom:N/A"
    set rating_bar ""
    ## get title
    if [regexp {<title>[^<]+} $html title] {
        set pos [expr [string last > $title] + 1]
        set title [string range $title $pos end]
        set title [htmlcodes $title]
    }
    if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG title == $title" }
    ## get director
        
    if [regexp {<h5>Directed by</h5>\n<[^>]+>[^<]+} $html name] {
        set pos [string last > $name] ; incr pos
        set name [string range $name $pos end]
        set name [htmlcodes $name]
    }
    if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG director == $name" }
    ## get genre
    if [regexp {<a href=./Sections/Genres[^\n]+} $html genre] {
        regsub -all {<[^\>]*>} $genre {} genre
        regsub {\(.*\)} $genre {} genre
    }
    if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG genre == $genre" }
    ## get tagline
      if [regexp {<h5>Tagline:</h5>[^<]+} $html tagline] {
        set pos [string last > $tagline] ; incr pos
        set tagline [string range $tagline $pos end]
        set tagline [string trim $tagline]
        set tagline [htmlcodes $tagline]
    }
    if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG tagline == $tagline" }
    ## get plot
    if [regexp {<h5>Plot (Summary|Outline):</h5>[\s\n]+[^<]+} $html plot] {
        set pos [string last > $plot] ; incr pos
        set plot [string range $plot $pos end]
        set plot [string trim $plot]
        set plot [htmlcodes $plot]
    }
    if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG plot == $plot" }
    ## get iMDb rating
    if [regexp {<b>\d.\d/10</b> \(<a href="ratings">[\w\s\d,]+\</a>} $html rating] {
        set pos [string last {>} $rating 39 ]
        set pos1 [string last { } $rating ]
        set pos [expr $pos + 1]
        incr pos1 -1
        set votes [string range $rating $pos $pos1]
        set rating [string range $rating 3 8]

        #rating bar code
        ##set goldstars [regexp -all goldstar $html]
        set goldstars [string range $rating 0 0] 
        set greystars [expr 10 - $goldstars]
        # generating the rating bar
        set marker "*"
        set rating_bar "$barcol1\[$barcol2"
        for {set i2 0} {$i2 < $goldstars} {incr i2 1} {
            set rating_bar "$rating_bar$marker"
        }
        set marker "-"
        set rating_bar "$rating_bar14"
        for {set i3 0} {$i3 < $greystars} {incr i3 1} {
            set rating_bar "$rating_bar$marker"
        }
        set rating_bar "$rating_bar$barcol1\]"
        #end rating bar code

    }
    if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG rating == $rating | votes == $votes | rating bar == $rating_bar" }
    ## get TOP 250
    if [regexp {<a href="/chart/top[^\n]+} $html top250] {
        regexp {#[^<]+} $top250 top250
        set top250 "Top 250:$top250"
    } elseif [regexp {<a href="/chart/bottom">[^\n]+} $html top250] {
        regexp {#[^<]+} $top250 top250
        set top250 "bottom 100:$top250"
    }

    if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG top250 == $top250" }
    ## get MPAA
    if [regexp {<b class="ch"><a href="/mpaa">[^\n]+} $html mpaa] {
        regsub -all {<[^\>]*>} $mpaa {} mpaa
        regsub {MPAA: } $mpaa {} mpaa
        set mpaa [htmlcodes $mpaa]
    }
    if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG mpaa == $mpaa" }
    ## get runtime
    if [regexp {<h5>Runtime:</h5>([\n\s]+)([\w:]+)(\d+)} $html runtime] {
        regsub -all {[\n\s]+} $runtime {} runtime
        set pos [string last > $runtime] ; incr pos
        set runtime [string range $runtime $pos end]
        set pos [string last : $runtime]
        if {$pos != -1} {incr pos ; set runtime [string range $runtime $pos end]}
    }
    if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG runtime == $runtime" }
    ## get country
    if [regexp {<a href=./Sections/Countries[^\n]+} $html country] {
        regsub -all {<[^\>]*>} $country {} country
    }
    if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG country == $country" }
    ## get language
    if [regexp {<a href=./Sections/Languages[^\n]+} $html language] {
        regsub -all {<[^\>]*>} $language {} language
    }
    if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG language == $language" }
    ## get soundmix
    if [regexp {<a href=./List.sound-mix=[^\n]+} $html soundmix] {
        regsub -all {<[^\>]*>} $soundmix {} soundmix
    }
    if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG soundmix == $soundmix" }

    # do we need the second page?

    if {[string match "*%budget*" $output] || [string match "*%screens*" $output]} {
        if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG page2 needed" }
        unset html
        if { $IMDB_ALTERNATIVE == 0 } {
           set page2 [::http::config -useragent "MSIE 6.0"]
           set page2 [::http::geturl ${newurl}business -timeout $imdb_timeout]
           if {[::http::status $page2]=="timeout"} {
              puthelp "$toput :\002Connection to imdb.com timed out.\002"
              ::http::Finish $page2
              return
           }
           set html [::http::data $page2]
           ::http::Finish $page2
        } else {
          catch { exec $binary(CURL) "${newurl}business" } html
        }
        ## get budget
        if [regexp {<h5>Budget</h5>([\n]+)[^<]+} $html budget] {
           set pos [string last > $budget] ; incr pos
           incr pos
           set budget [string range $budget $pos end]
           set budget [string map {&#8364; € &#163; £ } $budget]
        }
        if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG budget == $budget" }
        ## get screens
        if [regexp {<b>Opening Weekend</b></dt>[\s\n]?[^\n]+} $html opweek] {
           if [regexp {\(USA\) \([^)]+\) \([^)]+\)} $opweek screens] {
              set pos [string last ( $screens]
              set pos1 [string last ) $screens]
              incr pos ; incr pos1 -1
              set screens [string range $screens $pos $pos1]
           }
        }
        if {$IMDB_DEBUG == 1} { putlog "IMDB_DEBUG screens == $screens" }
    }

    ## output results

    set output [replacevar $output "%bold" "\002"]
    set output [replacevar $output "%color" "\003"]
    set output [replacevar $output "%uline" "\037"]
    set output [replacevar $output "%title" $title]
    set output [replacevar $output "%url" $newurl]
    set output [replacevar $output "%name" $name]
    set output [replacevar $output "%genre" $genre]
    set output [replacevar $output "%tagline" $tagline]
    set output [replacevar $output "%plot" $plot]
    set output [replacevar $output "%rating" $rating]
    set output [replacevar $output "%rbar" $rating_bar]
    set output [replacevar $output "%votes" $votes]
    set output [replacevar $output "%top250" $top250]
    set output [replacevar $output "%mpaa" $mpaa]
    set output [replacevar $output "%time" $runtime]
    set output [replacevar $output "%country" $country]
    set output [replacevar $output "%language" $language]
    set output [replacevar $output "%soundmix" $soundmix]
    set output [replacevar $output "%budget" $budget]
    set output [replacevar $output "%screens" $screens]
    foreach line [split $output "\n"] {
        puthelp "$toput :$line"
    }
}

proc decr_inst { } {
     global IMDB_DEBUG instance
     if { $instance > 0 } { incr instance -1 }
     if { $IMDB_DEBUG == 1 } { putlog "IMDB_DEBUG instance decreased by timer to: $instance" }
}

proc wmsg { } {
     global warn_msg
     set warn_msg 0
}