|
5 | 5 | "fmt" |
6 | 6 | "io" |
7 | 7 | "io/fs" |
| 8 | + "net/url" |
8 | 9 | "os" |
9 | 10 | "path/filepath" |
10 | 11 | "sptlrx/lyrics" |
@@ -67,26 +68,12 @@ func (c *Client) findFile(track *player.TrackMetadata) string { |
67 | 68 | } |
68 | 69 |
|
69 | 70 | // If it is a local track, try for similarly named .lrc file first |
70 | | - if track.Uri != "" { |
71 | | - var absUri string |
72 | | - if filepath.IsAbs(track.Uri) { |
73 | | - // Uri is already absolute |
74 | | - absUri = track.Uri |
75 | | - } else if c.folder != "" { |
76 | | - // Uri is relative to local music directory |
77 | | - absUri = filepath.Join(c.folder, track.Uri) |
78 | | - } else { |
79 | | - // Can not handle relative uri without folder configured |
80 | | - absUri = "" |
81 | | - } |
82 | | - if absUri != "" { |
83 | | - absLyricsUri := strings.TrimSuffix(absUri, filepath.Ext(absUri)) + ".lrc" |
84 | | - if _, err := os.Stat(absLyricsUri); err == nil { |
85 | | - return absLyricsUri |
86 | | - } |
87 | | - } |
| 71 | + var exactMatch string = c.fileByLocalUri(track.Uri) |
| 72 | + if exactMatch != "" { |
| 73 | + return exactMatch |
88 | 74 | } |
89 | 75 |
|
| 76 | + // Fall back to best-effort search |
90 | 77 | parts := splitString(track.Query) |
91 | 78 |
|
92 | 79 | var best *file |
@@ -115,6 +102,32 @@ func (c *Client) findFile(track *player.TrackMetadata) string { |
115 | 102 | return best.Path |
116 | 103 | } |
117 | 104 |
|
| 105 | +func (c *Client) fileByLocalUri(uri *url.URL) string { |
| 106 | + if uri == nil { |
| 107 | + return "" |
| 108 | + } |
| 109 | + if uri.Scheme != "file" && uri.Scheme != "" { |
| 110 | + return "" |
| 111 | + } |
| 112 | + var absUri string |
| 113 | + if filepath.IsAbs(uri.Path) { |
| 114 | + // uri is already absolute |
| 115 | + absUri = uri.Path |
| 116 | + } else if c.folder != "" { |
| 117 | + // Uri is relative to local music directory |
| 118 | + absUri = filepath.Join(c.folder, uri.Path) |
| 119 | + } else { |
| 120 | + // Can not handle relative uri without folder configured |
| 121 | + return "" |
| 122 | + } |
| 123 | + absLyricsUri := strings.TrimSuffix(absUri, filepath.Ext(absUri)) + ".lrc" |
| 124 | + _, err := os.Stat(absLyricsUri) |
| 125 | + if err != nil { |
| 126 | + return "" |
| 127 | + } |
| 128 | + return absLyricsUri |
| 129 | +} |
| 130 | + |
118 | 131 | func createIndex(folder string) ([]*file, error) { |
119 | 132 | index := []*file{} |
120 | 133 | if folder == "" { |
|
0 commit comments