--- old/webif/lib/tvdb.class
+++ new/webif/lib/tvdb.class
@@ -1,6 +1,8 @@
source /mod/webif/lib/setup
+source /mod/webif/lib/escape
package require cgi
+package require json
if {![exists -command class]} { package require oo }
if {![exists -command sqlite3.open]} { package require sqlite3 }
require system.class xml.class
@@ -12,6 +14,14 @@
set ::tvdb::icache "/mod/webif/cache/tvdb/img"
set ::tvdb::cacheage 86400
set ::tvdb::debug 0
+set ::tvdb::v4_search_data [join {
+ "{" {"requests":}
+ "[{" {"indexName":"TVDB","params":}
+ "{" {"query":"%s","maxValuesPerFacet":10,"page":0,"filters":"NOT is_official=0","facets":}
+ {["type","year","network","status"],"tagFilters":""} "}}]}"
+} ""]
+set ::tvdb::v4_search_url "https://api4.thetvdb.com/web/search/queries"
+
if {![file isdirectory $::tvdb::cache]} {
file mkdir $::tvdb::cache
@@ -72,15 +82,19 @@
# return $ret
#}
-proc {tvdb fetchfile} {url} {
+proc {tvdb fetchfile} {url {headers {}} {args data}} {
set cmd {wget -q -4 -O-}
+ lappend cmd {*}[concat {*}[lmap k_v $headers {list "--header" [join $k_v ": "]}]]
+ if {[llength $data] == 1} {
+ lappend cmd {--post-data} [lindex $data 0]
+ }
lappend cmd $url
::tvdb::dlog "Executing $cmd"
return [exec {*}$cmd]
}
-tvdb method _fetch {path} {
- return [tvdb fetchfile "https://$::tvdb::mirror$path"]
+tvdb method _fetch {path {headers {}} args} {
+ return [tvdb fetchfile "https://$::tvdb::mirror$path" $headers {*}$args]
}
tvdb method _parse {xml vars {end "XX"}} {
@@ -192,10 +206,25 @@
tvdb method searchseries {series} {
::tvdb::dlog "Searching TVDB for $series"
- set seriesxml [$self _fetch \
- "/api/GetSeries.php?seriesname=[cgi_quote_url $series]"]
- return [$self _extract $seriesxml Series \
- {seriesid SeriesName banner Overview}]
+ set post [format $::tvdb::v4_search_data [jescape $series]]
+ set referer [format "https://%s/search?query=%s" $::tvdb::mirror [cgi_quote_url $series]]
+ set results [tvdb fetchfile $::tvdb::v4_search_url [list \
+ {Content-Type application/json} [list Referer $referer]
+ ] $post]
+ set results [json::decode -index $results]
+ # emulate result of _extract method above
+ set extract [lambda {args} {
+ set attrs {}
+ foreach {k v} $args {
+ set attrs([string tolower $k]) $v
+ }
+ return $attrs
+ }]
+ return [lmap d [dict values [dict getdef $results "results" "0" "hits" {}]] {
+ dict with d {
+ $extract seriesid $id seriesName $name banner $banner Overview $overview
+ }
+ }]
}
tvdb method findseries {series} {
@@ -402,18 +431,28 @@
}
proc {tvdb cachebanner} {banner} {
+ set banner [regsub \
+ "^https?://[string map {"." {\.}} $::tvdb::artwork](/.+)$" \
+ $banner {\1}]
+
+ if {[string index $banner 0] != "/"} {
+ set banner "/$banner"
+ }
if {![string match {/banners/*} $banner]} {
- set _banner "/banners/$banner"
+ set _banner "/banners$banner"
} else {
set _banner $banner
}
- if {![file exists "$::tvdb::icache/$banner"]} {
+ set cached_banner "$::tvdb::icache$banner"
+ if {![file exists "$cached_banner"]} {
set ret [tvdb fetchfile "https://$::tvdb::artwork$_banner"]
- if {[string length $ret] > 50} {
- system mkdir_p "$::tvdb::icache/[file dirname $banner]"
- file write "$::tvdb::icache/$banner" $ret
- }
- }
+ if {[string length $ret] <= 50} {
+ return
+ }
+ system mkdir_p "$::tvdb::icache[file dirname $banner]"
+ file write "$cached_banner" $ret
+ }
+ return [regsub "^/mod/webif(/.+)$" $cached_banner {\1}]
}
proc {tvdb bannerurl} {banner} {