[MJ] - The following application allows you to get some basic information about a movie from IMDB. It can probably be improved upon and is fragile, but it's a start. When searching you can open a browser to the IMDB page (only on windows) package require http package require tdom package require tk bind all {imdb $::query} proc imdb {input} { set ua "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.7e" http::config -useragent $ua # don't manually build query strings http can do it better set query [http::formatQuery btnI "I'm Feeling Lucky" q "site:imdb.com $input"] set http [http::geturl http://www.google.com/search?$query] # get HTTP header info upvar 0 $http arr array set meta $arr(meta) # redirection url set url $meta(Location) set ::url $url .f1.bi configure -state normal # cleanup http::cleanup $http set http [http::geturl $url] set html [http::data $http] http::cleanup $http set doc [dom parse -html $html] set ::title [[$doc selectNodes {/html/head/title[1]}] asText] set outline [$doc selectNodes {string(//div[h5="Plot Summary:"]/text())}] if {$outline eq {}} { set outline [$doc selectNodes {string(//div[h5="Plot Outline:"]/text())}] } set outline [string trim $outline] .s delete 1.0 end .s insert 1.0 $outline set ::rating [[$doc selectNodes {//div[@class="general rating"]/b[2]} ] asText] set votes [[$doc selectNodes {//div[@class="general rating"]/small/a[1]} ] asText] $doc delete set ::votes [string map {, {}} [lindex [split $votes] 0]] } proc go {url} { exec cmd /c start {} $url & } label .lq -text Query: entry .q -textvariable query label .lt -text Title: entry .t -textvariable title label .lr -text Rating: entry .r -textvariable rating label .lv -text Votes entry .v -textvariable votes label .ls -text Outline text .s -height 3 -wrap word label .lu -text URL entry .u -textvariable url grid .lq .q -sticky ew grid .lt .t -sticky ew grid .lr .r -sticky ew grid .lv .v -sticky ew grid .ls .s -sticky ew grid .lu .u -sticky ew frame .f1 grid .f1 -column 1 -sticky ew button .f1.bs -text Search -command {imdb $::query} button .f1.bi -text "Goto IMDB" -state disable -command {go $::url} grid .f1.bs .f1.bi grid columnconfigure . 1 -weight 1 grid columnconfigure .f1 {0 1} -weight 1 ---- [LES] on 20080821: This is a nice idea, but this application doesn't quite work for me. First, [Google] doesn't like Lynx so we have to tell it a different lie about the user agent. Using Lynx as the user agent, the HTML is not the expected Google page. It is another page that says that my browser is not authorized, I should read the usage terms, etc. or something to that effect. Second, the code above tries to obtain from the headers information that my tests never retrieved: $meta(Location). So I skipped that altogether. Third, I added a switch that will let you open the IMDB page in your default browser on [Linux] too if you have [KDE] (not necessarily using it). Fourth, [dom] chokes on the HTML, so I did what countless developers never hesitate to frown upon: replace [dom] parsing with [Regular Expressions]. Why? Because '''it works''', that's why. [LV] I don't know about this specific application - but I use lynx with google and imdb on a regular basis and have not encountered cases where "google doesn't like lynx" myself. ---- [LES] Here is my code: package require http package require Tk bind all {imdb $::query} proc imdb {input} { http::config -useragent "Firefox 2.0.2" set query [http::formatQuery btnG Search q "site:imdb.com $input"] set http [http::geturl http://www.google.com/search?$query] set html [http::data $http] http::cleanup $http regexp {} $html => _rating regsub -all {(<[^<>]+>|more|\n)} $_rating {} _rating set ::rating [string trim $_rating] regexp {
Genre:
(.*?)} $html => _genre regsub -all {(<[^<>]+>|more)} $_genre {} _genre set ::genre [string trim $_genre] regexp {
Plot Outline:
(.*?)<} $html => _plot set ::plot [string trim $_plot] .s delete 1.0 end .s insert 1.0 "$::genre\n$::plot" } proc go {url} { if { $::tcl_platform(platform) == "windows" } { exec cmd /c start {} $url & } else { exec kfmclient exec $url } } label .lq -text Query: entry .q -textvariable query label .lt -text Title: entry .t -textvariable title label .lr -text Rating: entry .r -textvariable rating label .ls -text Outline text .s -height 5 -wrap word label .lu -text URL entry .u -textvariable ::url grid .lq .q -sticky ew grid .lt .t -sticky ew grid .lr .r -sticky ew grid .ls .s -sticky ew grid .lu .u -sticky ew frame .f1 grid .f1 -column 1 -sticky ew button .f1.bs -text Search -command {imdb $::query} button .f1.bi -text "Goto IMDB" -state disable -command {go $::url} grid .f1.bs .f1.bi grid columnconfigure . 1 -weight 1 grid columnconfigure .f1 {0 1} -weight 1 ----- [Category Internet]