112 lines
2.5 KiB
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)
|
|
}
|