Skip to content

Commit 5a27d5f

Browse files
committed
feat(func): media library support change api url
1 parent ce6bff2 commit 5a27d5f

4 files changed

Lines changed: 20 additions & 8 deletions

File tree

internal/bootstrap/data/setting.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,9 +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},
248+
{Key: conf.MediaTMDBAPIURL, Value: "api.themoviedb.org", Type: conf.TypeString, Group: model.MEDIA, Flag: model.PRIVATE},
249249
{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},
250+
{Key: conf.MediaDiscogsAPIURL, Value: "api.discogs.com", Type: conf.TypeString, Group: model.MEDIA, Flag: model.PRIVATE},
251251
{Key: conf.MediaStoreThumbnail, Value: "false", Type: conf.TypeBool, Group: model.MEDIA, Flag: model.PRIVATE},
252252
{Key: conf.MediaThumbnailMode, Value: "base64", Type: conf.TypeSelect, Options: "base64,local", Group: model.MEDIA, Flag: model.PRIVATE},
253253
{Key: conf.MediaThumbnailPath, Value: "/.thumbnail", Type: conf.TypeString, Group: model.MEDIA, Flag: model.PRIVATE},

internal/db/db.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,13 @@ func migrateMediaItems() {
2929
if !db.Migrator().HasTable("x_media_items") {
3030
return
3131
}
32-
// 已迁移到新组合索引,跳过
32+
// 已迁移到新组合索引
3333
if db.Migrator().HasIndex("x_media_items", "idx_media_folder_file_album") {
34+
// 清理掉之前软删除留下的脏数据,避免与组合唯一索引冲突
35+
// (唯一索引在物理层不区分软删除,残留行会导致后续插入/更新报 UNIQUE constraint failed)
36+
if err := db.Exec("DELETE FROM x_media_items WHERE deleted_at IS NOT NULL").Error; err != nil {
37+
log.Warnf("media_items: 清理软删除残留数据失败: %v", err)
38+
}
3439
return
3540
}
3641
// 旧表存在但没有新组合索引,说明是旧版本数据,需要清空后重建

internal/db/media.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -174,9 +174,13 @@ func GetMediaItemByFolderPath(folderPath string) (*model.MediaItem, error) {
174174

175175
// CreateOrUpdateMediaItem 创建或更新媒体条目(按 folder_path + file_name + album_name 组合唯一)
176176
// 更新时保留已有的刮削数据,避免重新扫描时把已刮削的字段清空
177+
//
178+
// 注意:使用 Unscoped() 查询是为了把软删除残留记录也包含进来,
179+
// 否则唯一索引 idx_media_folder_file_album 会与软删除行冲突,
180+
// 导致新建条目时报 UNIQUE constraint failed。
177181
func CreateOrUpdateMediaItem(item *model.MediaItem) error {
178182
var existing model.MediaItem
179-
result := db.Where("folder_path = ? AND file_name = ? AND album_name = ?", item.FolderPath, item.FileName, item.AlbumName).First(&existing)
183+
result := db.Unscoped().Where("folder_path = ? AND file_name = ? AND album_name = ?", item.FolderPath, item.FileName, item.AlbumName).First(&existing)
180184
if result.Error == gorm.ErrRecordNotFound {
181185
return db.Create(item).Error
182186
}
@@ -185,6 +189,8 @@ func CreateOrUpdateMediaItem(item *model.MediaItem) error {
185189
}
186190
item.ID = existing.ID
187191
item.CreatedAt = existing.CreatedAt
192+
// 复用已有记录时清除软删除标记,确保该条目“恢复”为正常记录
193+
item.DeletedAt = gorm.DeletedAt{}
188194
// 如果已有刮削数据,保留刮削字段,防止重新扫描时覆盖刮削结果
189195
if existing.ScrapedAt != nil {
190196
item.ScrapedAt = existing.ScrapedAt
@@ -204,12 +210,13 @@ func CreateOrUpdateMediaItem(item *model.MediaItem) error {
204210
item.ISBN = existing.ISBN
205211
item.ExternalID = existing.ExternalID
206212
}
207-
return db.Save(item).Error
213+
return db.Unscoped().Save(item).Error
208214
}
209215

210-
// UpdateMediaItem 更新媒体条目(仅更新可编辑字段)
216+
// UpdateMediaItem 更新媒体条目
217+
// 使用 Unscoped 确保即使存在软删除标记也能正确更新(避免命中唯一索引但行不可见的诡异情况)。
211218
func UpdateMediaItem(item *model.MediaItem) error {
212-
return db.Save(item).Error
219+
return db.Unscoped().Save(item).Error
213220
}
214221

215222
// DeleteMediaItem 硬删除媒体条目(真正从数据库删除)

server/handles/media.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,7 @@ func StartMediaScrape(c *gin.Context) {
462462
now := time.Now()
463463
item.ScrapedAt = &now
464464
if err := db.UpdateMediaItem(item); err != nil {
465-
log.Warnf("保存刮削结果失败 [%s]: %v", item.FolderPath, err)
465+
log.Warnf("保存刮削结果失败 [id=%d, %s/%s]: %v", item.ID, item.FolderPath, item.FileName, err)
466466
}
467467
}
468468
log.Infof("刮削完成 [%s],共处理 %d 条", req.MediaType, len(items))

0 commit comments

Comments
 (0)