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) }