diff --git a/go_backend/metadata.go b/go_backend/metadata.go index a6daa4bc..3001730e 100644 --- a/go_backend/metadata.go +++ b/go_backend/metadata.go @@ -498,7 +498,7 @@ func EmbedM4AMetadata(filePath string, metadata Metadata, coverData []byte) erro } // Find udta atom inside moov, or create one - moovSize := int(data[moovPos]<<24 | data[moovPos+1]<<16 | data[moovPos+2]<<8 | data[moovPos+3]) + moovSize := int(uint32(data[moovPos])<<24 | uint32(data[moovPos+1])<<16 | uint32(data[moovPos+2])<<8 | uint32(data[moovPos+3])) udtaPos := findAtom(data, "udta", moovPos+8) // Build new metadata atoms @@ -507,12 +507,12 @@ func EmbedM4AMetadata(filePath string, metadata Metadata, coverData []byte) erro var newData []byte if udtaPos >= 0 && udtaPos < moovPos+moovSize { // udta exists, find meta inside it or replace - udtaSize := int(data[udtaPos]<<24 | data[udtaPos+1]<<16 | data[udtaPos+2]<<8 | data[udtaPos+3]) + udtaSize := int(uint32(data[udtaPos])<<24 | uint32(data[udtaPos+1])<<16 | uint32(data[udtaPos+2])<<8 | uint32(data[udtaPos+3])) metaPos := findAtom(data, "meta", udtaPos+8) if metaPos >= 0 && metaPos < udtaPos+udtaSize { // Replace existing meta atom - metaSize := int(data[metaPos]<<24 | data[metaPos+1]<<16 | data[metaPos+2]<<8 | data[metaPos+3]) + metaSize := int(uint32(data[metaPos])<<24 | uint32(data[metaPos+1])<<16 | uint32(data[metaPos+2])<<8 | uint32(data[metaPos+3])) newData = append(newData, data[:metaPos]...) newData = append(newData, metaAtom...) newData = append(newData, data[metaPos+metaSize:]...) @@ -570,7 +570,7 @@ func EmbedM4AMetadata(filePath string, metadata Metadata, coverData []byte) erro // findAtom finds an atom by name starting from offset func findAtom(data []byte, name string, offset int) int { for i := offset; i < len(data)-8; { - size := int(data[i]<<24 | data[i+1]<<16 | data[i+2]<<8 | data[i+3]) + size := int(uint32(data[i])<<24 | uint32(data[i+1])<<16 | uint32(data[i+2])<<8 | uint32(data[i+3])) if size < 8 { break } diff --git a/go_backend/qobuz.go b/go_backend/qobuz.go index 198b6262..923f1ed3 100644 --- a/go_backend/qobuz.go +++ b/go_backend/qobuz.go @@ -819,77 +819,6 @@ func getQobuzDownloadURLParallel(apis []string, trackID int64, quality string) ( return "", "", fmt.Errorf("all %d Qobuz APIs failed. Errors: %v", len(apis), errors) } -// getQobuzDownloadURLSequential requests download URL from APIs sequentially -// Uses same URL format as PC version: /api/stream?trackId={id}&quality={quality} -func getQobuzDownloadURLSequential(apis []string, trackID int64, quality string) (string, string, error) { - if len(apis) == 0 { - return "", "", fmt.Errorf("no APIs available") - } - - client := NewHTTPClientWithTimeout(DefaultTimeout) - retryConfig := DefaultRetryConfig() - var errors []string - - for _, apiURL := range apis { - // All APIs now use same format: https://domain/api/stream?trackId={id}&quality={quality} - // The apiURL already includes the path, just append trackID and quality - reqURL := fmt.Sprintf("%s%d&quality=%s", apiURL, trackID, quality) - - GoLog("[Qobuz] Trying: %s\n", reqURL) - - req, err := http.NewRequest("GET", reqURL, nil) - if err != nil { - errors = append(errors, BuildErrorMessage(apiURL, 0, err.Error())) - continue - } - - resp, err := DoRequestWithRetry(client, req, retryConfig) - if err != nil { - errors = append(errors, BuildErrorMessage(apiURL, 0, err.Error())) - continue - } - - body, err := ReadResponseBody(resp) - resp.Body.Close() - if err != nil { - errors = append(errors, BuildErrorMessage(apiURL, resp.StatusCode, err.Error())) - continue - } - - // Check if response is HTML (error page) - if len(body) > 0 && body[0] == '<' { - errors = append(errors, BuildErrorMessage(apiURL, resp.StatusCode, "received HTML instead of JSON")) - continue - } - - // Check for error in JSON response - var errorResp struct { - Error string `json:"error"` - } - if json.Unmarshal(body, &errorResp) == nil && errorResp.Error != "" { - errors = append(errors, BuildErrorMessage(apiURL, resp.StatusCode, errorResp.Error)) - continue - } - - var result struct { - URL string `json:"url"` - } - if err := json.Unmarshal(body, &result); err != nil { - errors = append(errors, BuildErrorMessage(apiURL, resp.StatusCode, "invalid JSON: "+err.Error())) - continue - } - - if result.URL != "" { - GoLog("[Qobuz] Got download URL from: %s\n", apiURL) - return apiURL, result.URL, nil - } - - errors = append(errors, BuildErrorMessage(apiURL, resp.StatusCode, "no download URL in response")) - } - - return "", "", fmt.Errorf("all %d Qobuz APIs failed. Errors: %v", len(apis), errors) -} - // GetDownloadURL gets download URL for a track - tries ALL APIs in parallel // "Siapa cepat dia dapat" - first successful response wins func (q *QobuzDownloader) GetDownloadURL(trackID int64, quality string) (string, error) {