78 lines
2.2 KiB
Go
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})
|
|
}
|