2021-05-30 21:20:35 +05:30
|
|
|
package model
|
|
|
|
|
|
|
|
|
|
import (
|
2025-01-16 22:26:16 -03:00
|
|
|
"cmp"
|
2023-01-24 15:35:23 -05:00
|
|
|
"strings"
|
2021-05-30 21:20:35 +05:30
|
|
|
"time"
|
2023-01-24 15:35:23 -05:00
|
|
|
|
2024-05-11 20:04:21 -04:00
|
|
|
"github.com/navidrome/navidrome/utils/random"
|
2021-05-30 21:20:35 +05:30
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type Share struct {
|
2023-12-09 13:52:17 -05:00
|
|
|
ID string `structs:"id" json:"id,omitempty"`
|
|
|
|
|
UserID string `structs:"user_id" json:"userId,omitempty"`
|
|
|
|
|
Username string `structs:"-" json:"username,omitempty"`
|
2023-01-22 14:38:55 -05:00
|
|
|
Description string `structs:"description" json:"description,omitempty"`
|
2023-03-10 23:01:03 -05:00
|
|
|
Downloadable bool `structs:"downloadable" json:"downloadable"`
|
2024-02-07 17:45:08 -08:00
|
|
|
ExpiresAt *time.Time `structs:"expires_at" json:"expiresAt,omitempty"`
|
|
|
|
|
LastVisitedAt *time.Time `structs:"last_visited_at" json:"lastVisitedAt,omitempty"`
|
2023-12-09 13:52:17 -05:00
|
|
|
ResourceIDs string `structs:"resource_ids" json:"resourceIds,omitempty"`
|
2023-01-22 14:38:55 -05:00
|
|
|
ResourceType string `structs:"resource_type" json:"resourceType,omitempty"`
|
|
|
|
|
Contents string `structs:"contents" json:"contents,omitempty"`
|
|
|
|
|
Format string `structs:"format" json:"format,omitempty"`
|
|
|
|
|
MaxBitRate int `structs:"max_bit_rate" json:"maxBitRate,omitempty"`
|
|
|
|
|
VisitCount int `structs:"visit_count" json:"visitCount,omitempty"`
|
2026-02-08 08:57:30 -06:00
|
|
|
CreatedAt time.Time `structs:"created_at" json:"createdAt"`
|
|
|
|
|
UpdatedAt time.Time `structs:"updated_at" json:"updatedAt"`
|
2023-12-09 13:52:17 -05:00
|
|
|
Tracks MediaFiles `structs:"-" json:"tracks,omitempty"`
|
|
|
|
|
Albums Albums `structs:"-" json:"albums,omitempty"`
|
|
|
|
|
URL string `structs:"-" json:"-"`
|
|
|
|
|
ImageURL string `structs:"-" json:"-"`
|
2023-01-24 15:35:23 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s Share) CoverArtID() ArtworkID {
|
|
|
|
|
ids := strings.SplitN(s.ResourceIDs, ",", 2)
|
|
|
|
|
if len(ids) == 0 {
|
|
|
|
|
return ArtworkID{}
|
|
|
|
|
}
|
|
|
|
|
switch s.ResourceType {
|
|
|
|
|
case "album":
|
|
|
|
|
return Album{ID: ids[0]}.CoverArtID()
|
|
|
|
|
case "playlist":
|
|
|
|
|
return Playlist{ID: ids[0]}.CoverArtID()
|
|
|
|
|
case "artist":
|
|
|
|
|
return Artist{ID: ids[0]}.CoverArtID()
|
|
|
|
|
}
|
2024-05-19 21:55:19 -04:00
|
|
|
rnd := random.Int64N(len(s.Tracks))
|
2023-01-24 15:35:23 -05:00
|
|
|
return s.Tracks[rnd].CoverArtID()
|
2021-05-30 21:20:35 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type Shares []Share
|
|
|
|
|
|
2025-05-27 12:37:57 -04:00
|
|
|
// ToM3U8 exports the share to the Extended M3U8 format.
|
2025-01-16 22:26:16 -03:00
|
|
|
func (s Share) ToM3U8() string {
|
2025-05-27 12:37:57 -04:00
|
|
|
return s.Tracks.ToM3U8(cmp.Or(s.Description, s.ID), false)
|
2025-01-16 22:26:16 -03:00
|
|
|
}
|
|
|
|
|
|
2021-05-30 21:20:35 +05:30
|
|
|
type ShareRepository interface {
|
2023-01-19 22:52:55 -05:00
|
|
|
Exists(id string) (bool, error)
|
2023-01-23 18:44:58 -05:00
|
|
|
Get(id string) (*Share, error)
|
2021-05-30 21:20:35 +05:30
|
|
|
GetAll(options ...QueryOptions) (Shares, error)
|
2024-12-17 17:10:55 -05:00
|
|
|
CountAll(options ...QueryOptions) (int64, error)
|
2021-05-30 21:20:35 +05:30
|
|
|
}
|