This commit is contained in:
parent
1acd1c0cab
commit
7cd5e80468
23 changed files with 988 additions and 5 deletions
85
music-youtube.go
Normal file
85
music-youtube.go
Normal file
|
@ -0,0 +1,85 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"net/url"
|
||||
)
|
||||
|
||||
type MusicAPIResponse struct {
|
||||
Items []struct {
|
||||
Title string `json:"title"`
|
||||
UploaderName string `json:"uploaderName"`
|
||||
Duration int `json:"duration"`
|
||||
Thumbnail string `json:"thumbnail"`
|
||||
URL string `json:"url"`
|
||||
} `json:"items"` // Removed VideoID since we'll parse from URL
|
||||
}
|
||||
|
||||
func SearchMusicViaPiped(query string, page int) ([]MusicResult, error) {
|
||||
var lastError error
|
||||
mu.Lock()
|
||||
defer mu.Unlock()
|
||||
|
||||
for _, instance := range pipedInstances {
|
||||
if disabledInstances[instance] {
|
||||
continue
|
||||
}
|
||||
|
||||
url := fmt.Sprintf(
|
||||
"https://%s/search?q=%s&filter=music_songs&page=%d",
|
||||
instance,
|
||||
url.QueryEscape(query),
|
||||
page,
|
||||
)
|
||||
|
||||
resp, err := http.Get(url)
|
||||
if err != nil || resp.StatusCode != http.StatusOK {
|
||||
printInfo("Disabling instance %s due to error: %v", instance, err)
|
||||
disabledInstances[instance] = true
|
||||
lastError = fmt.Errorf("request to %s failed: %w", instance, err)
|
||||
continue
|
||||
}
|
||||
|
||||
defer resp.Body.Close()
|
||||
var apiResp MusicAPIResponse
|
||||
if err := json.NewDecoder(resp.Body).Decode(&apiResp); err != nil {
|
||||
lastError = fmt.Errorf("failed to decode response from %s: %w", instance, err)
|
||||
continue
|
||||
}
|
||||
|
||||
return convertPipedToMusicResults(instance, apiResp), nil
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf("all Piped instances failed, last error: %v", lastError)
|
||||
}
|
||||
|
||||
func convertPipedToMusicResults(instance string, resp MusicAPIResponse) []MusicResult {
|
||||
seen := make(map[string]bool)
|
||||
var results []MusicResult
|
||||
|
||||
for _, item := range resp.Items {
|
||||
// Extract video ID from URL
|
||||
u, err := url.Parse(item.URL)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
videoID := u.Query().Get("v")
|
||||
if videoID == "" || seen[videoID] {
|
||||
continue
|
||||
}
|
||||
seen[videoID] = true
|
||||
|
||||
results = append(results, MusicResult{
|
||||
Title: item.Title,
|
||||
Artist: item.UploaderName,
|
||||
URL: fmt.Sprintf("https://music.youtube.com%s", item.URL),
|
||||
Duration: formatDuration(item.Duration),
|
||||
Thumbnail: item.Thumbnail,
|
||||
Source: "YouTube Music",
|
||||
//AudioURL: fmt.Sprintf("https://%s/stream/%s", instance, videoID),
|
||||
})
|
||||
}
|
||||
return results
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue