feat: migrate playback module to modular domain pattern
This commit is contained in:
66
internal/playback/service/service.go
Normal file
66
internal/playback/service/service.go
Normal file
@@ -0,0 +1,66 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"mal/internal/db"
|
||||
"mal/internal/domain"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
type playbackService struct {
|
||||
repo domain.PlaybackRepository
|
||||
providers []domain.Provider
|
||||
}
|
||||
|
||||
func NewPlaybackService(repo domain.PlaybackRepository, providers []domain.Provider) domain.PlaybackService {
|
||||
return &playbackService{repo: repo, providers: providers}
|
||||
}
|
||||
|
||||
func (s *playbackService) BuildWatchData(ctx context.Context, animeID int, titleCandidates []string, episode string, mode string, userID string) (map[string]any, error) {
|
||||
// Minimal implementation for now to show the pattern
|
||||
var result *domain.StreamResult
|
||||
var err error
|
||||
|
||||
for _, p := range s.providers {
|
||||
result, err = p.GetStreams(ctx, animeID, episode, mode)
|
||||
if err == nil && result != nil {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if result == nil {
|
||||
return nil, fmt.Errorf("no streams found")
|
||||
}
|
||||
|
||||
startTime := 0.0
|
||||
if userID != "" {
|
||||
entry, err := s.repo.GetWatchListEntry(ctx, db.GetWatchListEntryParams{
|
||||
UserID: userID,
|
||||
AnimeID: int64(animeID),
|
||||
})
|
||||
if err == nil {
|
||||
if entry.CurrentEpisode.Valid && strconv.FormatInt(entry.CurrentEpisode.Int64, 10) == episode {
|
||||
startTime = entry.CurrentTimeSeconds
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return map[string]any{
|
||||
"URL": result.URL,
|
||||
"Referer": result.Referer,
|
||||
"StartTime": startTime,
|
||||
"Subtitles": result.Subtitles,
|
||||
"Qualities": result.Qualities,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (s *playbackService) SaveProgress(ctx context.Context, userID string, animeID int64, episode int, timeSeconds float64) error {
|
||||
params := db.SaveWatchProgressParams{
|
||||
UserID: userID,
|
||||
AnimeID: animeID,
|
||||
CurrentEpisode: sql.NullInt64{Int64: int64(episode), Valid: true},
|
||||
CurrentTimeSeconds: timeSeconds,
|
||||
}
|
||||
return s.repo.SaveWatchProgress(ctx, params)
|
||||
}
|
||||
Reference in New Issue
Block a user