Merge branch 'main' into new-add-to-playlist
This commit is contained in:
@@ -98,7 +98,7 @@ type randomAlbumIter struct {
|
||||
// Once we start getting back too many already-returned albums,
|
||||
// switch to requesting more albums from a deterministic sort order.
|
||||
deterministicFetcher AlbumFetchFn
|
||||
ramdomFetcher AlbumFetchFn
|
||||
randomFetcher AlbumFetchFn
|
||||
phaseTwo bool
|
||||
offset int
|
||||
done bool
|
||||
@@ -109,7 +109,7 @@ func NewRandomAlbumIter(deterministicFetcher, randomFetcher AlbumFetchFn, filter
|
||||
filter: filter,
|
||||
prefetchCB: prefetchCoverCB,
|
||||
deterministicFetcher: deterministicFetcher,
|
||||
ramdomFetcher: randomFetcher,
|
||||
randomFetcher: randomFetcher,
|
||||
albumIDSet: make(map[string]bool),
|
||||
}
|
||||
}
|
||||
@@ -145,13 +145,14 @@ func (r *randomAlbumIter) Next() *mediaprovider.Album {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
albums, err := r.ramdomFetcher(0 /*offset - doesn't matter for random*/, 25)
|
||||
albums, err := r.randomFetcher(r.offset, 25)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
r.done = true
|
||||
r.albumIDSet = nil
|
||||
return nil
|
||||
}
|
||||
r.offset += len(albums)
|
||||
var hitCount int
|
||||
for _, album := range albums {
|
||||
if _, ok := r.albumIDSet[album.ID]; !ok {
|
||||
@@ -169,6 +170,7 @@ func (r *randomAlbumIter) Next() *mediaprovider.Album {
|
||||
}
|
||||
if successRatio := float64(hitCount) / float64(25); successRatio < 0.3 {
|
||||
r.phaseTwo = true
|
||||
r.offset = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -354,6 +354,28 @@ func (j *jellyfinMediaProvider) RescanLibrary() error {
|
||||
return j.client.RefreshLibrary()
|
||||
}
|
||||
|
||||
var _ mediaprovider.LyricsProvider = (*jellyfinMediaProvider)(nil)
|
||||
|
||||
func (j *jellyfinMediaProvider) GetLyrics(tr *mediaprovider.Track) (*mediaprovider.Lyrics, error) {
|
||||
l, err := j.client.GetLyrics(tr.ID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &mediaprovider.Lyrics{
|
||||
Title: l.Metadata.Title,
|
||||
Artist: l.Metadata.Artist,
|
||||
Synced: l.Metadata.IsSynced || (len(l.Lyrics) > 0 && l.Lyrics[0].Start > 0),
|
||||
Lines: sharedutil.MapSlice(l.Lyrics, toLyricLine),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func toLyricLine(ll jellyfin.LyricLine) mediaprovider.LyricLine {
|
||||
return mediaprovider.LyricLine{
|
||||
Text: ll.Text,
|
||||
Start: float64(ll.Start) / float64(runTimeTicksPerSecond),
|
||||
}
|
||||
}
|
||||
|
||||
func toTrack(ch *jellyfin.Song) *mediaprovider.Track {
|
||||
if ch == nil {
|
||||
return nil
|
||||
|
||||
@@ -225,7 +225,11 @@ func (s *subsonicMediaProvider) newRandomIter(filter mediaprovider.AlbumFilter,
|
||||
return helpers.NewRandomAlbumIter(
|
||||
s.fetchFnFromStandardSort("newest"),
|
||||
makeFetchFn(func(offset, limit int) ([]*subsonic.AlbumID3, error) {
|
||||
return s.client.GetAlbumList2("random", map[string]string{"size": strconv.Itoa(limit)})
|
||||
args := map[string]string{
|
||||
"size": strconv.Itoa(limit),
|
||||
"offset": strconv.Itoa(offset),
|
||||
}
|
||||
return s.client.GetAlbumList2("random", args)
|
||||
}),
|
||||
filter, s.prefetchCoverCB)
|
||||
}
|
||||
|
||||
@@ -61,7 +61,7 @@ type playbackEngine struct {
|
||||
|
||||
// registered callbacks
|
||||
onSongChange []func(nowPlaying, justScrobbledIfAny *mediaprovider.Track)
|
||||
onPlayTimeUpdate []func(float64, float64)
|
||||
onPlayTimeUpdate []func(float64, float64, bool)
|
||||
onLoopModeChange []func(LoopMode)
|
||||
onVolumeChange []func(int)
|
||||
onSeek []func()
|
||||
@@ -92,7 +92,7 @@ func NewPlaybackEngine(
|
||||
}
|
||||
p.OnTrackChange(pm.handleOnTrackChange)
|
||||
p.OnSeek(func() {
|
||||
pm.doUpdateTimePos()
|
||||
pm.doUpdateTimePos(true)
|
||||
pm.invokeNoArgCallbacks(pm.onSeek)
|
||||
})
|
||||
p.OnStopped(pm.handleOnStopped)
|
||||
@@ -239,7 +239,7 @@ func (p *playbackEngine) LoadTracks(tracks []*mediaprovider.Track, insertQueueMo
|
||||
func (p *playbackEngine) StopAndClearPlayQueue() {
|
||||
changed := len(p.playQueue) > 0
|
||||
p.player.Stop()
|
||||
p.doUpdateTimePos()
|
||||
p.doUpdateTimePos(false)
|
||||
p.playQueue = nil
|
||||
p.nowPlayingIdx = -1
|
||||
if changed {
|
||||
@@ -399,7 +399,7 @@ func (p *playbackEngine) handleOnTrackChange() {
|
||||
p.curTrackTime = float64(p.playQueue[p.nowPlayingIdx].Duration)
|
||||
p.sendNowPlayingScrobble() // Must come before invokeOnChangeCallbacks b/c track may immediately be scrobbled
|
||||
p.invokeOnSongChangeCallbacks()
|
||||
p.doUpdateTimePos()
|
||||
p.doUpdateTimePos(false)
|
||||
p.setNextTrackBasedOnLoopMode(false)
|
||||
}
|
||||
|
||||
@@ -407,7 +407,7 @@ func (p *playbackEngine) handleOnStopped() {
|
||||
p.playTimeStopwatch.Stop()
|
||||
p.checkScrobble()
|
||||
p.stopPollTimePos()
|
||||
p.doUpdateTimePos()
|
||||
p.doUpdateTimePos(false)
|
||||
p.invokeOnSongChangeCallbacks()
|
||||
p.invokeNoArgCallbacks(p.onStopped)
|
||||
p.wasStopped = true
|
||||
@@ -568,7 +568,7 @@ func (p *playbackEngine) startPollTimePos() {
|
||||
pollingTick.Stop()
|
||||
return
|
||||
case <-pollingTick.C:
|
||||
p.doUpdateTimePos()
|
||||
p.doUpdateTimePos(false)
|
||||
}
|
||||
}
|
||||
}()
|
||||
@@ -581,7 +581,7 @@ func (p *playbackEngine) stopPollTimePos() {
|
||||
}
|
||||
}
|
||||
|
||||
func (p *playbackEngine) doUpdateTimePos() {
|
||||
func (p *playbackEngine) doUpdateTimePos(seeked bool) {
|
||||
if p.callbacksDisabled {
|
||||
return
|
||||
}
|
||||
@@ -590,6 +590,6 @@ func (p *playbackEngine) doUpdateTimePos() {
|
||||
p.latestTrackPosition = s.TimePos
|
||||
}
|
||||
for _, cb := range p.onPlayTimeUpdate {
|
||||
cb(s.TimePos, s.Duration)
|
||||
cb(s.TimePos, s.Duration, seeked)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ func (p *PlaybackManager) OnSongChange(cb func(nowPlaying *mediaprovider.Track,
|
||||
}
|
||||
|
||||
// Registers a callback that is notified whenever the play time should be updated.
|
||||
func (p *PlaybackManager) OnPlayTimeUpdate(cb func(float64, float64)) {
|
||||
func (p *PlaybackManager) OnPlayTimeUpdate(cb func(curTime float64, totalTime float64, seeked bool)) {
|
||||
p.engine.onPlayTimeUpdate = append(p.engine.onPlayTimeUpdate, cb)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user