mirror of
https://github.com/truewhile/MeBox.git
synced 2026-10-03 04:26:36 +08:00
Add library covers and configurable footer visibility
This commit is contained in:
@@ -24,6 +24,10 @@ func (s *MediaService) CreateLibrary(ctx context.Context, name, path, kind strin
|
||||
}
|
||||
|
||||
func (s *MediaService) CreateLibraryWithRoots(ctx context.Context, name, kind string, inputs []LibraryRootInput) (*model.Library, error) {
|
||||
return s.CreateLibraryWithRootsAndCover(ctx, name, kind, "", inputs)
|
||||
}
|
||||
|
||||
func (s *MediaService) CreateLibraryWithRootsAndCover(ctx context.Context, name, kind, coverURL string, inputs []LibraryRootInput) (*model.Library, error) {
|
||||
if strings.TrimSpace(name) == "" {
|
||||
return nil, errors.New("name required")
|
||||
}
|
||||
@@ -35,6 +39,11 @@ func (s *MediaService) CreateLibraryWithRoots(ctx context.Context, name, kind st
|
||||
if existing, err := s.findLogicalLibrary(ctx, name, kind); err != nil {
|
||||
return nil, err
|
||||
} else if existing != nil {
|
||||
if strings.TrimSpace(coverURL) != "" {
|
||||
if err := s.UpdateLibraryCover(ctx, existing.ID, coverURL); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
lib, err := s.appendLibraryRoots(ctx, existing, roots)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -42,7 +51,7 @@ func (s *MediaService) CreateLibraryWithRoots(ctx context.Context, name, kind st
|
||||
s.invalidateMediaCache(ctx)
|
||||
return lib, nil
|
||||
}
|
||||
lib := &model.Library{Name: strings.TrimSpace(name), Path: roots[0].Path, Type: kind, Enabled: true}
|
||||
lib := &model.Library{Name: strings.TrimSpace(name), Path: roots[0].Path, Type: kind, CoverURL: strings.TrimSpace(coverURL), Enabled: true}
|
||||
if err := s.repo.Library.CreateWithRoots(ctx, lib, roots); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -50,6 +59,11 @@ func (s *MediaService) CreateLibraryWithRoots(ctx context.Context, name, kind st
|
||||
return lib, nil
|
||||
}
|
||||
|
||||
func (s *MediaService) UpdateLibraryCover(ctx context.Context, libraryID, coverURL string) error {
|
||||
return s.repo.DB.WithContext(ctx).Model(&model.Library{}).Where("id = ?", libraryID).
|
||||
Update("cover_url", strings.TrimSpace(coverURL)).Error
|
||||
}
|
||||
|
||||
func (s *MediaService) findLogicalLibrary(ctx context.Context, name, kind string) (*model.Library, error) {
|
||||
if s == nil || s.repo == nil || s.repo.Library == nil {
|
||||
return nil, nil
|
||||
|
||||
@@ -53,6 +53,30 @@ func TestCreateLibraryWithRootsAppendsToExistingLogicalLibrary(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestCreateLibraryWithRootsStoresAndUpdatesCustomCover(t *testing.T) {
|
||||
db := newServiceTestDB(t, &model.Library{}, &model.LibraryRoot{}, &model.Media{})
|
||||
repos := repository.New(db)
|
||||
svc := NewMediaService(&config.Config{}, zap.NewNop(), repos)
|
||||
|
||||
lib, err := svc.CreateLibraryWithRootsAndCover(t.Context(), "收藏", "movie", "https://example.com/cover.jpg", []LibraryRootInput{{Path: t.TempDir()}})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if lib.CoverURL != "https://example.com/cover.jpg" {
|
||||
t.Fatalf("cover_url = %q", lib.CoverURL)
|
||||
}
|
||||
if err := svc.UpdateLibraryCover(t.Context(), lib.ID, "https://example.com/new.jpg"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
updated, err := repos.Library.FindByID(t.Context(), lib.ID)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if updated.CoverURL != "https://example.com/new.jpg" {
|
||||
t.Fatalf("updated cover_url = %q", updated.CoverURL)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCreateLibraryWithRootsKeepsDifferentTypesSeparate(t *testing.T) {
|
||||
rootMovie := t.TempDir()
|
||||
rootTV := t.TempDir()
|
||||
|
||||
Reference in New Issue
Block a user