Beware - I just wanted to share the following code, which bodges up a quick FreeDB access for reading CD tracklistings. It's not pretty, but it works.
It uses the windows application diskid.exe which reads the CDID from the disc in the drive, see DiscID
package require http
set alldata {}
set cds {}
set tracks {}
set cats {blues classical country data folk jazz newage reggae rock soundtrack misc}
proc query {} {
global cds tracks cats alldata
set cds ""
set tracks ""
set r [catch {set ret [exec discid cdaudio]}]
if {$r!=0} {
tk_messageBox -message "No CD in drive or other error"
return
}
set did [lindex $ret 0]
set cdtemp ""
foreach c $cats {
set token [::http::geturl "http://freedb.freedb.org/~cddb/cddb.cgi?cmd=cddb+read+$c+$did&hello=name+host.com+W4CDTL+1.0&proto=1"]
upvar #0 $token state
set data $state(body)
if {$data==""} {tk_messageBox -message "Try again - no data"; return}
# 210 is code for found CD
if {[lindex $data 0]==210} {
lappend cdtemp $state(body)
}
}
if {[llength $cdtemp]==0} {set cds "No Matches Found";return}
set newcds ""
foreach cd $cdtemp {
set cd [split $cd "\n"]
set lines [list]
foreach l $cd {
set r [split $l ""]
set first [lindex $r 0]
if {$first == "D" || $first == "T"} {
set l [lindex [split $l "="] 1]
lappend lines $l
}
}
lappend newcds $lines
lappend cds "[lindex $lines 0] - [lindex $lines 1]"
}
set alldata $newcds
update
}
set last 0
proc cdselected {} {
global cds tracks alldata last
set tracks ""
set w [.cds curselection]
set last $w
set trtemp [lrange [lindex $alldata $w] 2 end]
set num 1
foreach tr $trtemp {
lappend tracks "$num - $tr"
incr num
}
}
proc url x {
#set x [regsub -all -nocase {htm} $x {ht%6D}]
exec rundll32 url.dll,FileProtocolHandler $x &
}
proc print {} {
global alldata tracks last
set tracks ""
set l [lindex $alldata $last]
set trtemp [lrange [lindex $alldata $last] 2 end]
set num 1
foreach tr $trtemp {
lappend tracks "$num - $tr"
incr num
}
# Add formatting here...
set output "<html><h3>[lindex $l 1]</h3><table width=400 border=0 cellpadding=0>\n"
foreach t $tracks {
append output "<tr><td><font size=3>$t</font></td></tr>\n"
}
append output "</table><script>window.print()</script></html>"
set fh [open w4trtemp.html w]
puts $fh $output
close $fh
url w4trtemp.html
}
listbox .cds -width 50 -height 6 -listvariable cds
listbox .tracks -width 50 -height 24 -listvariable tracks
button .query -text "Query FreeDB" -command query
button .print -text "Export and Print" -command print
pack .cds .tracks .query .print -fill both -expand 1
bind .cds <<ListboxSelect>> "cdselected"
It foreachs through the available categories on freeDB using the ID provided from discID, then allows the user to choose the one they need.