METANOIA/metadata/accuraterip.com/source.go

112 lines
2.5 KiB
Go

package accuraterip_com
import (
"encoding/binary"
"fmt"
"git.gammaspectra.live/S.O.N.G/METANOIA/metadata"
"log"
"net/http"
"net/url"
"time"
)
var baseURL = "http://www.accuraterip.com/"
type Source struct {
client *metadata.CachingClient
}
func NewSource() *Source {
s := &Source{}
s.client = metadata.NewCachingClient(s.GetURL(), time.Second/10)
return s
}
func (s *Source) GetName() string {
return "AccurateRip"
}
func (s *Source) GetURL() string {
return baseURL
}
func (s *Source) GetLicense() metadata.License {
return metadata.License{
//Most core data is CC0
Code: metadata.NC,
URL: "http://www.accuraterip.com/",
Attribution: fmt.Sprintf("%s (%s)", s.GetName(), s.GetURL()),
}
}
func (s *Source) FindMetadataByTOC(toc metadata.TOC) (results []AccurateRipMetadata) {
uri, _ := url.Parse(baseURL)
var data AccurateRipDiscIdent
data.TrackCount, data.TrackOffsetsAdded, data.TrackOffsetsMultiplied, data.CDDB1 = toc.GetAccurateRipData()
uri.Path += fmt.Sprintf("accuraterip/%01x/%01x/%01x/dBAR-%03d-%08x-%08x-%08x.bin", data.TrackOffsetsAdded&0xF, data.TrackOffsetsAdded>>4&0xF, data.TrackOffsetsAdded>>8&0xF, data.TrackCount, data.TrackOffsetsAdded, data.TrackOffsetsMultiplied, uint32(data.CDDB1))
response, err := s.client.Request(&http.Request{
Method: "GET",
URL: uri,
}, time.Hour*24*14)
if err != nil {
return nil
}
defer response.Body.Close()
if response.StatusCode != http.StatusOK {
return nil
}
var discIdent AccurateRipDiscIdent
var discTrack AccurateRipDiscTrack
for {
err = binary.Read(response.Body, binary.LittleEndian, &discIdent)
if err != nil {
break
}
meta := AccurateRipMetadata{AccurateRipDiscIdent: discIdent}
for i := byte(0); i < discIdent.TrackCount; i++ {
err = binary.Read(response.Body, binary.LittleEndian, &discTrack)
if err != nil {
break
}
meta.Tracks = append(meta.Tracks, discTrack)
}
results = append(results, meta)
}
return
}
type AccurateRipDiscIdent struct {
TrackCount byte
TrackOffsetsAdded uint32
TrackOffsetsMultiplied uint32
CDDB1 metadata.CDDB1
}
type AccurateRipDiscTrack struct {
Confidence byte
TrackCRC uint32
OffsetFindCRC uint32
}
type AccurateRipMetadata struct {
AccurateRipDiscIdent
Tracks []AccurateRipDiscTrack
}
func (s *Source) Test() {
meta := s.FindMetadataByTOC(metadata.NewTOCFromString("290543 150 27572 69794 109235 133506 177855 214680 252471"))
log.Print(meta)
}