mirror of
https://github.com/Dvorinka/Trackeep.git
synced 2026-06-03 20:12:58 +00:00
146 lines
3.8 KiB
Go
146 lines
3.8 KiB
Go
package handlers
|
|
|
|
import (
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/trackeep/backend/config"
|
|
"github.com/trackeep/backend/services"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// YouTubeChannelRequest represents the request for channel videos
|
|
type YouTubeChannelRequest struct {
|
|
ChannelID string `json:"channel_id"`
|
|
MaxResults int `json:"max_results"`
|
|
}
|
|
|
|
// GetFireshipVideos fetches latest videos from Fireship channel
|
|
func GetFireshipVideos(c *gin.Context) {
|
|
// Get max results from query parameter (default: 20)
|
|
maxResults := 20
|
|
if maxResultsStr := c.Query("max_results"); maxResultsStr != "" {
|
|
if parsed, err := strconv.Atoi(maxResultsStr); err == nil && parsed > 0 && parsed <= 50 {
|
|
maxResults = parsed
|
|
}
|
|
}
|
|
|
|
// Create YouTube channel service with cache
|
|
var db *gorm.DB
|
|
if config.GetDB() != nil {
|
|
db = config.GetDB()
|
|
}
|
|
youtubeService := services.NewYouTubeService()
|
|
cacheService := services.NewYouTubeCacheService(db)
|
|
channelService := services.NewYouTubeChannelService(youtubeService, cacheService)
|
|
|
|
// Fetch Fireship videos
|
|
videos, err := channelService.GetFireshipVideos(maxResults)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{
|
|
"error": "Failed to fetch Fireship videos",
|
|
"details": err.Error(),
|
|
})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
"channel": "Fireship",
|
|
"videos": videos,
|
|
"count": len(videos),
|
|
})
|
|
}
|
|
|
|
// GetNetworkChuckVideos fetches latest videos from Network Chuck channel
|
|
func GetNetworkChuckVideos(c *gin.Context) {
|
|
// Get max results from query parameter (default: 20)
|
|
maxResults := 20
|
|
if maxResultsStr := c.Query("max_results"); maxResultsStr != "" {
|
|
if parsed, err := strconv.Atoi(maxResultsStr); err == nil && parsed > 0 && parsed <= 50 {
|
|
maxResults = parsed
|
|
}
|
|
}
|
|
|
|
// Create YouTube channel service with cache
|
|
var db *gorm.DB
|
|
if config.GetDB() != nil {
|
|
db = config.GetDB()
|
|
}
|
|
youtubeService := services.NewYouTubeService()
|
|
cacheService := services.NewYouTubeCacheService(db)
|
|
channelService := services.NewYouTubeChannelService(youtubeService, cacheService)
|
|
|
|
// Fetch Network Chuck videos
|
|
videos, err := channelService.GetNetworkChuckVideos(maxResults)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{
|
|
"error": "Failed to fetch Network Chuck videos",
|
|
"details": err.Error(),
|
|
})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
"channel": "Network Chuck",
|
|
"videos": videos,
|
|
"count": len(videos),
|
|
})
|
|
}
|
|
|
|
// GetChannelVideos fetches videos from a specific channel
|
|
func GetChannelVideos(c *gin.Context) {
|
|
var req YouTubeChannelRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{
|
|
"error": "Invalid request body",
|
|
"details": err.Error(),
|
|
})
|
|
return
|
|
}
|
|
|
|
// Set default max results if not provided
|
|
if req.MaxResults <= 0 {
|
|
req.MaxResults = 20
|
|
}
|
|
if req.MaxResults > 50 {
|
|
req.MaxResults = 50
|
|
}
|
|
|
|
// Create YouTube channel service with cache
|
|
var db *gorm.DB
|
|
if config.GetDB() != nil {
|
|
db = config.GetDB()
|
|
}
|
|
youtubeService := services.NewYouTubeService()
|
|
cacheService := services.NewYouTubeCacheService(db)
|
|
channelService := services.NewYouTubeChannelService(youtubeService, cacheService)
|
|
|
|
// Get channel info first
|
|
channelInfo, err := channelService.GetChannelInfo(req.ChannelID)
|
|
if err != nil {
|
|
c.JSON(http.StatusNotFound, gin.H{
|
|
"error": "Channel not found",
|
|
"details": err.Error(),
|
|
})
|
|
return
|
|
}
|
|
|
|
// Fetch channel videos
|
|
response, err := channelService.YouTubeService.GetChannelVideos(req.ChannelID, req.MaxResults, "")
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{
|
|
"error": "Failed to fetch channel videos",
|
|
"details": err.Error(),
|
|
})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
"channel": channelInfo,
|
|
"videos": response.Videos,
|
|
"count": len(response.Videos),
|
|
"next_page_token": response.NextPageToken,
|
|
})
|
|
}
|