Skip to content

Commit cc1fec5

Browse files
committed
feat(func): media library support change api url
1 parent 29f0636 commit cc1fec5

5 files changed

Lines changed: 42 additions & 18 deletions

File tree

internal/bootstrap/data/setting.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,9 @@ func InitialSettings() []model.SettingItem {
245245

246246
// media settings
247247
{Key: conf.MediaTMDBKey, Value: "", Type: conf.TypeString, Group: model.MEDIA, Flag: model.PRIVATE},
248+
{Key: conf.MediaTMDBAPIURL, Value: "https://api.themoviedb.org", Type: conf.TypeString, Group: model.MEDIA, Flag: model.PRIVATE},
248249
{Key: conf.MediaDiscogsToken, Value: "", Type: conf.TypeString, Group: model.MEDIA, Flag: model.PRIVATE},
250+
{Key: conf.MediaDiscogsAPIURL, Value: "https://api.discogs.com", Type: conf.TypeString, Group: model.MEDIA, Flag: model.PRIVATE},
249251
{Key: conf.MediaStoreThumbnail, Value: "false", Type: conf.TypeBool, Group: model.MEDIA, Flag: model.PRIVATE},
250252
{Key: conf.MediaThumbnailMode, Value: "base64", Type: conf.TypeSelect, Options: "base64,local", Group: model.MEDIA, Flag: model.PRIVATE},
251253
{Key: conf.MediaThumbnailPath, Value: "/.thumbnail", Type: conf.TypeString, Group: model.MEDIA, Flag: model.PRIVATE},

internal/conf/const.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,9 @@ const (
164164

165165
// media
166166
MediaTMDBKey = "media_tmdb_key"
167+
MediaTMDBAPIURL = "media_tmdb_api_url"
167168
MediaDiscogsToken = "media_discogs_token"
169+
MediaDiscogsAPIURL = "media_discogs_api_url"
168170
MediaThumbnailMode = "media_thumbnail_mode"
169171
MediaThumbnailPath = "media_thumbnail_path"
170172
MediaStoreThumbnail = "media_store_thumbnail"

internal/media/scraper/discogs.go

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,26 @@ import (
1212
"github.com/OpenListTeam/OpenList/v4/internal/model"
1313
)
1414

15-
const discogsBaseURL = "https://api.discogs.com"
15+
const discogsDefaultBaseURL = "https://api.discogs.com"
1616

1717
// DiscogsScraper Discogs音乐刮削器
1818
type DiscogsScraper struct {
19-
Token string
20-
client *http.Client
19+
Token string
20+
BaseURL string // 可自定义的 Discogs API 地址
21+
client *http.Client
2122
}
2223

2324
// NewDiscogsScraper 创建Discogs刮削器
24-
func NewDiscogsScraper(token string) *DiscogsScraper {
25+
// baseURL 为可自定义的 Discogs API 服务地址,为空时使用默认 https://api.discogs.com
26+
func NewDiscogsScraper(token string, baseURL string) *DiscogsScraper {
27+
base := strings.TrimRight(strings.TrimSpace(baseURL), "/")
28+
if base == "" {
29+
base = discogsDefaultBaseURL
30+
}
2531
return &DiscogsScraper{
26-
Token: token,
27-
client: &http.Client{Timeout: 15 * time.Second},
32+
Token: token,
33+
BaseURL: base,
34+
client: &http.Client{Timeout: 15 * time.Second},
2835
}
2936
}
3037

@@ -121,7 +128,7 @@ func parseMusicFileName(fileName string) []string {
121128
// doDiscogsSearch 执行单次Discogs搜索
122129
func (s *DiscogsScraper) doDiscogsSearch(query string) (*discogsSearchResult, error) {
123130
searchURL := fmt.Sprintf("%s/database/search?q=%s&type=release&token=%s",
124-
discogsBaseURL, url.QueryEscape(query), s.Token)
131+
s.BaseURL, url.QueryEscape(query), s.Token)
125132

126133
req, _ := http.NewRequest("GET", searchURL, nil)
127134
req.Header.Set("User-Agent", "OpenList/4.0 +https://github.com/OpenListTeam/OpenList")
@@ -214,7 +221,7 @@ func (s *DiscogsScraper) ScrapeMusic(item *model.MediaItem) error {
214221
first := searchResult.Results[0]
215222

216223
// 获取详情
217-
detailURL := fmt.Sprintf("%s/releases/%d?token=%s", discogsBaseURL, first.ID, s.Token)
224+
detailURL := fmt.Sprintf("%s/releases/%d?token=%s", s.BaseURL, first.ID, s.Token)
218225
detailReq, _ := http.NewRequest("GET", detailURL, nil)
219226
detailReq.Header.Set("User-Agent", "OpenList/4.0 +https://github.com/OpenListTeam/OpenList")
220227

internal/media/scraper/tmdb.go

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -88,20 +88,31 @@ func parseVideoFileName(fileName string) parsedVideoTitle {
8888
return result
8989
}
9090

91-
const tmdbBaseURL = "https://api.themoviedb.org/3"
91+
const tmdbDefaultBaseURL = "https://api.themoviedb.org"
9292
const tmdbImageBase = "https://image.tmdb.org/t/p/w500"
9393

9494
// TMDBScraper TMDB视频刮削器
9595
type TMDBScraper struct {
96-
APIKey string
97-
client *http.Client
96+
APIKey string
97+
BaseURL string // 含 /3 版本路径的最终请求地址,例如 https://api.themoviedb.org/3
98+
client *http.Client
9899
}
99100

100101
// NewTMDBScraper 创建TMDB刮削器
101-
func NewTMDBScraper(apiKey string) *TMDBScraper {
102+
// baseURL 为可自定义的 TMDB API 服务地址(不含版本路径),为空时使用默认 https://api.themoviedb.org
103+
func NewTMDBScraper(apiKey string, baseURL string) *TMDBScraper {
104+
base := strings.TrimRight(strings.TrimSpace(baseURL), "/")
105+
if base == "" {
106+
base = tmdbDefaultBaseURL
107+
}
108+
// 若用户填入的地址未带 /3 版本路径,则自动追加
109+
if !strings.HasSuffix(base, "/3") {
110+
base = base + "/3"
111+
}
102112
return &TMDBScraper{
103-
APIKey: apiKey,
104-
client: &http.Client{Timeout: 15 * time.Second},
113+
APIKey: apiKey,
114+
BaseURL: base,
115+
client: &http.Client{Timeout: 15 * time.Second},
105116
}
106117
}
107118

@@ -143,7 +154,7 @@ type tmdbMovieDetail struct {
143154
// doTMDBSearch 执行一次TMDB搜索请求
144155
func (s *TMDBScraper) doTMDBSearch(query, year string) (*tmdbSearchResult, error) {
145156
searchURL := fmt.Sprintf("%s/search/multi?api_key=%s&query=%s&language=zh-CN&search_type=ngram",
146-
tmdbBaseURL, s.APIKey, url.QueryEscape(query))
157+
s.BaseURL, s.APIKey, url.QueryEscape(query))
147158
if year != "" {
148159
searchURL += "&year=" + year
149160
}
@@ -237,7 +248,7 @@ func (s *TMDBScraper) ScrapeVideo(item *model.MediaItem) error {
237248

238249
// 获取详情
239250
detailURL := fmt.Sprintf("%s/%s/%d?api_key=%s&language=zh-CN&append_to_response=credits",
240-
tmdbBaseURL, mediaType, first.ID, s.APIKey)
251+
s.BaseURL, mediaType, first.ID, s.APIKey)
241252

242253
detailResp, err := s.client.Get(detailURL)
243254
if err != nil {

server/handles/media.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,9 @@ func StartMediaScrape(c *gin.Context) {
372372

373373
// 从系统设置中读取刮削配置
374374
tmdbKey := setting.GetStr(conf.MediaTMDBKey)
375+
tmdbAPIURL := setting.GetStr(conf.MediaTMDBAPIURL, "https://api.themoviedb.org")
375376
discogsToken := setting.GetStr(conf.MediaDiscogsToken)
377+
discogsAPIURL := setting.GetStr(conf.MediaDiscogsAPIURL, "https://api.discogs.com")
376378
thumbnailMode := setting.GetStr(conf.MediaThumbnailMode, "base64")
377379
thumbnailPath := setting.GetStr(conf.MediaThumbnailPath, "/.thumbnail")
378380
storeThumbnail := setting.GetBool(conf.MediaStoreThumbnail)
@@ -400,10 +402,10 @@ func StartMediaScrape(c *gin.Context) {
400402

401403
switch req.MediaType {
402404
case model.MediaTypeVideo:
403-
s := scraper.NewTMDBScraper(tmdbKey)
405+
s := scraper.NewTMDBScraper(tmdbKey, tmdbAPIURL)
404406
scrapeErr = s.ScrapeVideo(item)
405407
case model.MediaTypeMusic:
406-
s := scraper.NewDiscogsScraper(discogsToken)
408+
s := scraper.NewDiscogsScraper(discogsToken, discogsAPIURL)
407409
scrapeErr = s.ScrapeMusic(item)
408410
case model.MediaTypeBook:
409411
doubanScraper := scraper.NewDoubanScraperWithConfig(

0 commit comments

Comments
 (0)