x-movie/server/handler.go
2025-08-14 00:28:29 +08:00

199 lines
4.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"log"
"net/http"
"strconv"
"strings"
"sort"
"github.com/gin-gonic/gin"
)
// GetCategoryList 获取分类列表
func GetCategoryList(c *gin.Context) {
response := gin.H{
"code": http.StatusOK,
"message": "Success",
"data": Categories,
}
c.JSON(http.StatusOK, response)
}
// MovieList 电影列表
func MovieList(c *gin.Context) {
response := gin.H{
"code": http.StatusInternalServerError,
"message": "An unexpected error occurred.",
"data": gin.H{"items": []Movie{}, "total": 0},
}
var moviesToPaginate []*Movie
categoryName := c.Query("category")
searchQuery := c.Query("search") // 获取搜索参数
// === 第一步:基础过滤(类别)===
if categoryName != "" && categoryName != "最新添加" {
// 普通类别:直接过滤
for _, m := range Movies {
if m.TimeCategory == categoryName {
moviesToPaginate = append(moviesToPaginate, m)
}
}
} else {
// 最新添加/所有电影使用全局movies
moviesToPaginate = make([]*Movie, len(Movies))
copy(moviesToPaginate, Movies)
}
// === 第二步:搜索过滤 ===
if searchQuery != "" {
var searchResults []*Movie
lowerSearch := strings.ToLower(searchQuery)
for _, m := range moviesToPaginate {
// 检查文件名是否包含搜索词(不区分大小写)
if strings.Contains(strings.ToLower(m.FileName), lowerSearch) {
searchResults = append(searchResults, m)
}
}
moviesToPaginate = searchResults
}
// === 第三步:排序处理 ===
sortBy := c.Query("sort")
order := c.Query("order")
if sortBy == "" {
sortBy = "duration" // 默认按创建时间排序
}
// 应用排序
sort.Slice(moviesToPaginate, func(i, j int) bool {
switch sortBy {
case "created_time":
if order == "desc" {
return moviesToPaginate[i].CreatedTime > moviesToPaginate[j].CreatedTime
}
return moviesToPaginate[i].CreatedTime < moviesToPaginate[j].CreatedTime
case "duration":
if order == "desc" {
return moviesToPaginate[i].Duration > moviesToPaginate[j].Duration
}
return moviesToPaginate[i].Duration < moviesToPaginate[j].Duration
default:
// 默认按创建时间降序
return moviesToPaginate[i].CreatedTime > moviesToPaginate[j].CreatedTime
}
})
// === 第四步:分页处理 ===
page := 0
spage := c.Query("page")
if spage != "" {
p, err := strconv.Atoi(spage)
if err != nil || p < 1 {
log.Println("Invalid page number:", spage, err)
response["code"] = http.StatusBadRequest
response["message"] = "Invalid page number. Must be a positive integer."
c.JSON(http.StatusBadRequest, response)
return
}
page = p - 1
}
limit := 12
slimit := c.Query("limit")
if slimit != "" {
l, err := strconv.Atoi(slimit)
if err != nil || l < 1 {
log.Println("Invalid limit number:", slimit, err)
response["code"] = http.StatusBadRequest
response["message"] = "Invalid limit number. Must be a positive integer."
c.JSON(http.StatusBadRequest, response)
return
}
limit = l
}
start := page * limit
end := start + limit
total := len(moviesToPaginate)
// 处理超出范围的情况
if start >= total {
response["data"] = gin.H{
"items": []Movie{},
"total": total,
}
response["code"] = http.StatusOK
response["message"] = "Success"
c.JSON(http.StatusOK, response)
return
}
if end > total {
end = total
}
responseData := gin.H{
"items": moviesToPaginate[start:end],
"total": total,
}
response["code"] = http.StatusOK
response["message"] = "Success"
response["data"] = responseData
c.JSON(http.StatusOK, response)
}
// PostRename 重命名文件
func PostRename(c *gin.Context) {
var requestData struct {
OldName string `json:"old_name"`
NewName string `json:"new_name"`
}
response := gin.H{
"code": http.StatusOK,
"message": "Success",
"data": nil,
}
if err := c.ShouldBindJSON(&requestData); err != nil {
response["code"] = http.StatusBadRequest
response["message"] = "Invalid request data: " + err.Error()
c.JSON(http.StatusBadRequest, response)
return
}
if requestData.OldName == "" || requestData.NewName == "" {
response["code"] = http.StatusBadRequest
response["message"] = "Both old_name and new_name are required"
c.JSON(http.StatusBadRequest, response)
return
}
// 查找要重命名的电影
movie, exists := MovieDict[requestData.OldName]
if !exists {
response["code"] = http.StatusNotFound
response["message"] = "Movie not found"
c.JSON(http.StatusNotFound, response)
return
}
// 执行重命名
if err := movie.RenameVideo(requestData.NewName); err != nil {
response["code"] = http.StatusInternalServerError
response["message"] = "Failed to rename video: " + err.Error()
c.JSON(http.StatusInternalServerError, response)
return
}
// 更新全局字典
delete(MovieDict, requestData.OldName)
MovieDict[requestData.NewName] = movie
response["message"] = "Rename successful"
c.JSON(http.StatusOK, response)
}