By default, log to ioutil.Discard (logging to nil would result in a crash).
The udpWrap now needs to keep a reference to *AniDB in order to use the
Logger. UpdateTitles also had to be changed to be an *AniDB* method because
of the Logger.
package anidb
import (
+ "io/ioutil"
+ "log"
"time"
)
// by a previous Auth() call.
type AniDB struct {
Timeout time.Duration // Timeout for the various calls (default: 45s)
+ Logger *log.Logger // Logger where HTTP/UDP traffic is logged
udp *udpWrap
}
// Initialises a new AniDB.
func NewAniDB() *AniDB {
- return &AniDB{
+ ret := &AniDB{
Timeout: 45 * time.Second,
- udp: newUDPWrap(),
+ Logger: log.New(ioutil.Discard, "", log.LstdFlags),
}
+ ret.udp = newUDPWrap(ret)
+ return ret
}
func (adb *AniDB) User() *User {
"github.com/Kovensky/go-anidb/misc"
"github.com/Kovensky/go-anidb/udp"
"github.com/Kovensky/go-fscache"
- "log"
"sort"
"strconv"
"strings"
go func() {
httpChan := make(chan httpAnimeResponse, 1)
go func() {
- log.Printf("HTTP>>> Anime %d", aid)
+ adb.Logger.Printf("HTTP>>> Anime %d", aid)
a, err := httpapi.GetAnime(int(aid))
httpChan <- httpAnimeResponse{anime: a, err: err}
}()
case <-timeout:
// HTTP API timeout
if httpChan != nil {
- log.Printf("HTTP<<< Timeout")
+ adb.Logger.Printf("HTTP<<< Timeout")
close(httpChan)
}
case resp := <-httpChan:
if resp.err != nil {
- log.Printf("HTTP<<< %v", resp.err)
+ adb.Logger.Printf("HTTP<<< %v", resp.err)
ok = false
break Loop
}
if resp.anime.Error != "" {
- log.Printf("HTTP<<< Error %q", resp.anime.Error)
+ adb.Logger.Printf("HTTP<<< Error %q", resp.anime.Error)
}
if anime.populateFromHTTP(resp.anime) {
- log.Printf("HTTP<<< Anime %q", anime.PrimaryTitle)
+ adb.Logger.Printf("HTTP<<< Anime %q", anime.PrimaryTitle)
} else {
// HTTP ok but parsing not ok
if anime.PrimaryTitle == "" {
defer udp.credLock.Unlock()
if c := udp.credentials; c != nil {
- logRequest(paramSet{cmd: "AUTH", params: paramMap{"user": decrypt(c.username)}})
+ udp.logRequest(paramSet{cmd: "AUTH", params: paramMap{"user": decrypt(c.username)}})
r := udp.AniDBUDP.Auth(
decrypt(c.username),
decrypt(c.password),
decrypt(c.udpKey))
- logReply(r)
+ udp.logReply(r)
err := r.Error()
if adb.udp.connected {
adb.udp.connected = false
- logRequest(paramSet{cmd: "LOGOUT"})
+ adb.udp.logRequest(paramSet{cmd: "LOGOUT"})
return adb.udp.Logout()
}
return nil
"github.com/Kovensky/go-anidb/udp"
"github.com/Kovensky/go-fscache"
"image"
- "log"
"regexp"
"sort"
"strconv"
if partial {
if calledFromFIDsByGID {
epno = test
- log.Printf("UDP!!! FID %d is only part of episode %s with no complementary files", fid, epno)
+ adb.Logger.Printf("UDP!!! FID %d is only part of episode %s with no complementary files", fid, epno)
} else if len(test) == 1 && test[0].Start.Number == test[0].End.Number {
fids := []int{}
"bytes"
"github.com/Kovensky/go-anidb/titles"
"io"
- "log"
"net/http"
"os"
"time"
// Downloads a new anime-titles database if the database is outdated.
//
// Saves the database as anime-titles.dat.gz in the cache dir.
-func UpdateTitles() error {
+func (adb *AniDB) UpdateTitles() error {
+ // needs the AniDB for the Logger
+
// too new, no need to update
if TitlesUpToDate() {
return nil
c := &http.Client{Transport: &http.Transport{DisableCompression: true}}
- log.Printf("HTTP>>> %s", titles.DataDumpURL)
+ adb.Logger.Printf("HTTP>>> %s", titles.DataDumpURL)
resp, err := c.Get(titles.DataDumpURL)
if err != nil {
- log.Printf("HTTP<<< %s", resp.Status)
+ adb.Logger.Printf("HTTP<<< %s", resp.Status)
return err
}
defer resp.Body.Close()
buf := bytes.Buffer{}
- log.Printf("HTTP--- %s", resp.Status)
+ adb.Logger.Printf("HTTP--- %s", resp.Status)
_, err = io.Copy(&buf, resp.Body)
if err != nil {
- log.Printf("HTTP--- %v", err)
+ adb.Logger.Printf("HTTP--- %v", err)
return err
}
}
defer func() {
- log.Printf("HTTP<<< Titles version %s", titlesDB.UpdateTime)
+ adb.Logger.Printf("HTTP<<< Titles version %s", titlesDB.UpdateTime)
}()
return RefreshTitles()
}
import (
"github.com/Kovensky/go-anidb/udp"
- "log"
"sync"
"time"
)
type udpWrap struct {
*udpapi.AniDBUDP
+ adb *AniDB
+
sendLock sync.Mutex
sendQueueCh chan paramSet
user *User
}
-func newUDPWrap() *udpWrap {
+func newUDPWrap(adb *AniDB) *udpWrap {
u := &udpWrap{
AniDBUDP: udpapi.NewAniDBUDP(),
+ adb: adb,
sendQueueCh: make(chan paramSet, 10),
}
go u.sendQueue()
var bannedReply udpapi.APIReply = &bannedAPIReply{}
-func logRequest(set paramSet) {
+func (udp *udpWrap) logRequest(set paramSet) {
switch set.cmd {
case "AUTH":
- log.Printf("UDP>>> AUTH user=%s\n", set.params["user"])
+ udp.adb.Logger.Printf("UDP>>> AUTH user=%s\n", set.params["user"])
default:
- log.Printf("UDP>>> %s %s\n", set.cmd, udpapi.ParamMap(set.params).String())
+ udp.adb.Logger.Printf("UDP>>> %s %s\n", set.cmd, udpapi.ParamMap(set.params).String())
}
}
-func logReply(reply udpapi.APIReply) {
- log.Printf("UDP<<< %d %s\n", reply.Code(), reply.Text())
+func (udp *udpWrap) logReply(reply udpapi.APIReply) {
+ udp.adb.Logger.Printf("UDP<<< %d %s\n", reply.Code(), reply.Text())
}
func (udp *udpWrap) sendQueue() {
continue
}
- logRequest(set)
+ udp.logRequest(set)
reply := <-udp.AniDBUDP.SendRecv(set.cmd, udpapi.ParamMap(set.params))
if reply.Error() == udpapi.TimeoutError {
if wait > time.Minute {
wait = time.Minute
}
- log.Printf("UDP--- Timeout; waiting %s before retry", wait)
+ udp.adb.Logger.Printf("UDP--- Timeout; waiting %s before retry", wait)
delete(set.params, "s")
delete(set.params, "tag")
time.Sleep(wait)
goto Retry
}
- logReply(reply)
+ udp.logReply(reply)
wait = initialWait