Files
djk/internal/app/ui_library_search.go
T

78 lines
2.2 KiB
Go

package app
import (
"context"
"fmt"
"net/http"
"time"
)
func (app *UIApp) handleLibrarySearch(writer http.ResponseWriter, request *http.Request) {
if request.Method != http.MethodGet {
writeJSON(writer, http.StatusMethodNotAllowed, map[string]string{"error": "method not allowed"})
return
}
keyword, err := hongguoSearchKeyword(request.URL.Query().Get("q"))
if err != nil {
writeJSON(writer, http.StatusBadRequest, map[string]string{"error": err.Error()})
return
}
if !requireSource(writer, request.Context(), sourceHongguo) {
return
}
ctx, cancel := context.WithTimeout(request.Context(), 45*time.Second)
defer cancel()
result, err := app.downloader.searchHongguoDramas(ctx, keyword)
if err != nil {
if request.Context().Err() != nil {
return
}
fmt.Printf("红果联网搜索失败: %v\n", publicError(err))
writeJSON(writer, http.StatusBadGateway, map[string]string{"error": "联网搜索暂不可用,请稍后重试;本地筛选仍可使用"})
return
}
if ctx.Err() != nil {
return
}
dramas := append([]Drama{}, result.Dramas...)
if len(dramas) > 0 {
positions := make(map[string]int, len(dramas))
for index, drama := range dramas {
positions[drama.ID] = index
}
app.mu.Lock()
app.normalizeDramaCovers(dramas)
newDramas := app.newSortMetadataDramasLocked(dramas)
app.dramas = mergeSourceDramas(app.dramas, dramas, nil, sourceHongguo)
app.enqueueSortMetadataLocked(newDramas, false)
app.loadedAt = time.Now()
if app.librarySources == nil {
app.librarySources = map[string]librarySourceState{}
}
state := app.librarySources[sourceHongguo]
state.Count = 0
for _, drama := range app.dramas {
if dramaProvider(drama) == sourceHongguo {
state.Count++
}
if index, found := positions[drama.ID]; found {
dramas[index] = drama
}
}
state.UpdatedAt = app.loadedAt
if state.Status == "" {
state.Status = "ready"
}
app.librarySources[sourceHongguo] = state
app.libraryDirty = true
app.libraryRevision++
app.mu.Unlock()
app.persistLibrary()
}
app.mu.Lock()
saved := app.librarySaved && !app.libraryDirty
app.mu.Unlock()
writeJSON(writer, http.StatusOK, map[string]any{"query": keyword, "data": dramas, "total": result.Total, "saved": saved})
}