85 lines
1.8 KiB
Go
85 lines
1.8 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"net/http"
|
|
"time"
|
|
|
|
"git.andreafazzi.eu/andrea/youtube-dl-service/task"
|
|
"git.andreafazzi.eu/andrea/youtube-dl-service/youtube"
|
|
youtube_dl "git.andreafazzi.eu/andrea/youtube-dl-service/youtube/youtube-dl"
|
|
"github.com/gin-contrib/cors"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
var tasks task.Tasks
|
|
|
|
func init() {
|
|
log.SetPrefix("[youtube-dl-service] ")
|
|
tasks = make(task.Tasks, 0)
|
|
}
|
|
|
|
func download(c *gin.Context, downloader youtube.Downloader) error {
|
|
video, err := downloader.GetVideo()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
c.JSON(200, gin.H{
|
|
"title": video.Title,
|
|
"duration": float64(video.Duration) / float64(time.Minute),
|
|
"thumbnails": video.Thumbnails[0],
|
|
})
|
|
|
|
go downloader.StartDownload(video, tasks)
|
|
|
|
return nil
|
|
}
|
|
|
|
func status(c *gin.Context, downloader youtube.Downloader) error {
|
|
id, err := downloader.ExtractVideoID()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
task, ok := tasks[id]
|
|
if ok {
|
|
c.JSON(200, gin.H{
|
|
"status": task.Status,
|
|
"download_path": task.DownloadPath,
|
|
})
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func main() {
|
|
r := gin.Default()
|
|
r.Use(cors.New(cors.Config{
|
|
AllowOrigins: []string{"http://localhost:8080", "http://localhost:5000"},
|
|
AllowCredentials: true,
|
|
AllowHeaders: []string{"*"},
|
|
}))
|
|
|
|
r.Use(gin.CustomRecovery(func(c *gin.Context, recovered interface{}) {
|
|
if err, ok := recovered.(string); ok {
|
|
c.String(http.StatusInternalServerError, fmt.Sprintf("error: %s", err))
|
|
}
|
|
c.AbortWithStatus(http.StatusInternalServerError)
|
|
}))
|
|
|
|
r.Static("/data", "./data")
|
|
|
|
r.GET("/download", func(c *gin.Context) {
|
|
if err := download(c, youtube_dl.NewYoutubeDlDownloader(c.Query("url"), "yt-dlp")); err != nil {
|
|
panic(err)
|
|
}
|
|
})
|
|
|
|
r.GET("/status", func(c *gin.Context) {
|
|
if err := status(c, youtube_dl.NewYoutubeDlDownloader(c.Query("url"), "yt-dlp")); err != nil {
|
|
panic(err)
|
|
}
|
|
})
|
|
|
|
r.Run()
|
|
}
|