最新分类版本
This commit is contained in:
@@ -19,28 +19,46 @@ func MovieList(c *gin.Context) {
|
||||
}
|
||||
defer c.JSON(0, response)
|
||||
|
||||
category := c.Query("category")
|
||||
|
||||
var movies []Movie
|
||||
if category != "" {
|
||||
cateidx, err := strconv.Atoi(category)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
movies = categories[cateidx].Movies
|
||||
}
|
||||
|
||||
var page int = 0
|
||||
spage := c.Query("page")
|
||||
if spage != "" {
|
||||
p, err := strconv.Atoi(spage)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
page = p - 1
|
||||
}
|
||||
|
||||
var limit int = 10
|
||||
var limit int = 12
|
||||
slimit := c.Query("limit")
|
||||
if slimit != "" {
|
||||
l, err := strconv.Atoi(slimit)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
limit = l
|
||||
}
|
||||
|
||||
start := page * limit
|
||||
var end int = start + limit
|
||||
|
||||
if start > len(movies) {
|
||||
start = len(movies)
|
||||
}
|
||||
if end > len(movies) {
|
||||
end = len(movies)
|
||||
}
|
||||
|
||||
@@ -7,20 +7,31 @@ import (
|
||||
"net/http"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
// Movie 电影结构
|
||||
type Movie struct {
|
||||
Name string `json:"filename"`
|
||||
Image string `json:"image"`
|
||||
// Category 电影分类结构
|
||||
type Category struct {
|
||||
Name string `json:"name"`
|
||||
Movies []Movie `json:"movies"`
|
||||
}
|
||||
|
||||
var movies []Movie
|
||||
// Movie 电影结构
|
||||
type Movie struct {
|
||||
Name string `json:"filename"`
|
||||
Image string `json:"image"`
|
||||
Duration int `json:"duration"`
|
||||
}
|
||||
|
||||
// var movies []Movie
|
||||
var categories []Category
|
||||
|
||||
func initMovie() {
|
||||
// 需要改进 如果存在这个文件的略缩图, 就不存进movieDict里
|
||||
var movieDict map[string]string = make(map[string]string)
|
||||
|
||||
matches, err := filepath.Glob("movie/*")
|
||||
@@ -31,7 +42,7 @@ func initMovie() {
|
||||
for _, filename := range matches {
|
||||
base := filepath.Base(filename)
|
||||
|
||||
ext := filepath.Ext(base)
|
||||
// ext := filepath.Ext(base)
|
||||
base = base[:strings.IndexByte(base, '.')]
|
||||
|
||||
if _, ok := movieDict[base]; ok {
|
||||
@@ -40,7 +51,6 @@ func initMovie() {
|
||||
movieDict[base] = filename
|
||||
}
|
||||
|
||||
log.Println(base, ext)
|
||||
}
|
||||
|
||||
for key, filename := range movieDict {
|
||||
@@ -48,7 +58,6 @@ func initMovie() {
|
||||
// height := 120
|
||||
log.Println(filename)
|
||||
|
||||
// cmd := exec.Command("ffmpeg", "-i", filename, "-vframes", "1", "-s", fmt.Sprintf("%dx%d", width, height), "movie/"+key+".png")
|
||||
cmd := exec.Command("ffmpeg",
|
||||
"-i", filename,
|
||||
"-vf", "select='isnan(prev_selected_t)+gte(t-prev_selected_t\\,35)',scale=320:180,tile=3x3",
|
||||
@@ -63,25 +72,60 @@ func initMovie() {
|
||||
panic("could not generate frame")
|
||||
}
|
||||
|
||||
// err := generateThumbnail(filename, "movie/"+key+".png", width, height)
|
||||
// if err != nil {
|
||||
// panic("could not generate frame")
|
||||
// }
|
||||
}
|
||||
|
||||
// 初始化分类
|
||||
categories = []Category{
|
||||
{Name: "15min", Movies: []Movie{}},
|
||||
{Name: "30min", Movies: []Movie{}},
|
||||
{Name: "60min", Movies: []Movie{}},
|
||||
{Name: "大于60min", Movies: []Movie{}},
|
||||
}
|
||||
|
||||
filepath.Walk("./movie", func(path string, info fs.FileInfo, err error) error {
|
||||
if !info.IsDir() && filepath.Ext(info.Name()) != ".png" {
|
||||
base := info.Name()
|
||||
cmd := exec.Command("ffprobe", "-v", "error", "-select_streams", "v:0", "-show_entries", "stream=duration", "-of", "default=nw=1:nk=1", "./movie/"+info.Name())
|
||||
durationOutput, err := cmd.Output()
|
||||
if err != nil {
|
||||
log.Printf("Error getting duration for %s: %v", info.Name(), err)
|
||||
return err
|
||||
}
|
||||
|
||||
duration, err := strconv.ParseFloat(strings.Trim(string(durationOutput), "\n "), 64)
|
||||
if err != nil {
|
||||
log.Printf("Error parsing duration for %s: %v", info.Name(), err)
|
||||
return err
|
||||
}
|
||||
log.Println(path, info.Name())
|
||||
movies = append(movies, Movie{
|
||||
Name: info.Name(),
|
||||
Image: base[:strings.IndexByte(base, '.')] + ".png",
|
||||
})
|
||||
|
||||
movie := Movie{
|
||||
Name: info.Name(),
|
||||
Image: base[:strings.IndexByte(base, '.')] + ".png",
|
||||
Duration: int(duration / 60.0),
|
||||
}
|
||||
if movie.Duration <= 15 {
|
||||
categories[0].Movies = append(categories[0].Movies, movie)
|
||||
} else if movie.Duration <= 30 {
|
||||
categories[1].Movies = append(categories[1].Movies, movie)
|
||||
} else if movie.Duration <= 60 {
|
||||
categories[2].Movies = append(categories[2].Movies, movie)
|
||||
} else {
|
||||
categories[3].Movies = append(categories[3].Movies, movie)
|
||||
}
|
||||
|
||||
}
|
||||
return nil
|
||||
})
|
||||
|
||||
log.Printf("%##v", movies)
|
||||
for _, category := range categories {
|
||||
var movies = category.Movies
|
||||
sort.Slice(movies, func(i, j int) bool {
|
||||
return movies[i].Duration < movies[j].Duration
|
||||
})
|
||||
}
|
||||
|
||||
// log.Printf("%##v", categories)
|
||||
}
|
||||
|
||||
func main() {
|
||||
|
||||
Reference in New Issue
Block a user