using BaseDomain.Results;
using Microsoft.Extensions.Configuration;
using Postall.Domain.Dtos;
using Postall.Domain.Services.Contracts;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Postall.Infra.Services
{
public class VideoYoutubeService : IVideoYoutubeService
{
private readonly IConfiguration _configuration;
private readonly string _apiKey;
public VideoYoutubeService(IConfiguration configuration)
{
_configuration = configuration;
_apiKey = _configuration["YouTube:ApiKey"];
}
///
/// Busca os detalhes de um vídeo na API do YouTube
///
public async Task> GetVideoDetailsAsync(string videoId)
{
try
{
var youtubeService = new YouTubeBaseServiceWrapper(_apiKey);
var videosRequest = youtubeService.Videos.List("snippet,statistics");
videosRequest.Id = videoId;
var response = await videosRequest.ExecuteAsync();
if (response.Items.Count == 0)
return Result.Failure($"Vídeo não encontrado: {videoId}");
var video = response.Items[0];
var snippet = video.Snippet;
var statistics = video.Statistics;
return new VideoResponse
{
VideoId = video.Id,
ChannelId = snippet.ChannelId,
Title = snippet.Title,
Description = snippet.Description,
ThumbnailUrl = snippet.Thumbnails.Medium?.Url ?? snippet.Thumbnails.Default__.Url,
PublishedAt = snippet.PublishedAt.GetValueOrDefault(),
ViewCount = statistics.ViewCount.GetValueOrDefault(),
LikeCount = statistics.LikeCount.GetValueOrDefault(),
DislikeCount = statistics.DislikeCount.GetValueOrDefault(),
CommentCount = statistics.CommentCount.GetValueOrDefault()
};
}
catch (Exception ex)
{
return Result.Failure(ex.Message);
}
}
///
/// Busca vídeos de um canal na API do YouTube
///
public async Task>> GetChannelVideosAsync(string channelId, int maxResults = 50)
{
try
{
var youtubeService = new YouTubeBaseServiceWrapper(_apiKey);
var searchRequest = youtubeService.Search.List("snippet");
searchRequest.ChannelId = channelId;
searchRequest.Type = "video";
searchRequest.Order = Google.Apis.YouTube.v3.SearchResource.ListRequest.OrderEnum.Date;
searchRequest.MaxResults = maxResults;
var searchResponse = await searchRequest.ExecuteAsync();
var videos = new List();
foreach (var item in searchResponse.Items)
{
// Para cada resultado, obter os detalhes completos do vídeo
var videoResult = await GetVideoDetailsAsync(item.Id.VideoId);
if (videoResult.IsSuccess)
{
videos.Add(videoResult.Value);
}
}
return videos;
}
catch (Exception ex)
{
return Result>.Failure(ex.Message);
}
}
///
/// Busca vídeos pelo título ou descrição na API do YouTube
///
public async Task>> SearchVideosAsync(string query, int maxResults = 10)
{
try
{
var youtubeService = new YouTubeBaseServiceWrapper(_apiKey);
var searchRequest = youtubeService.Search.List("snippet");
searchRequest.Q = query;
searchRequest.Type = "video";
searchRequest.MaxResults = maxResults;
var searchResponse = await searchRequest.ExecuteAsync();
var videos = new List();
foreach (var item in searchResponse.Items)
{
// Para cada resultado, obter os detalhes completos do vídeo
var videoResult = await GetVideoDetailsAsync(item.Id.VideoId);
if (videoResult.IsSuccess)
{
videos.Add(videoResult.Value);
}
}
return videos;
}
catch (Exception ex)
{
return Result>.Failure(ex.Message);
}
}
}
}