HuanMengProject/src/0-core/HuanMeng.MiaoYu.Code/Music/MusicService.cs
2024-09-21 17:25:47 +08:00

138 lines
5.8 KiB
C#

using HuanMeng.DotNetCore.MultiTenant.Contract;
using HuanMeng.DotNetCore.Processors;
using HuanMeng.MiaoYu.Code.AppExtend;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Headers;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using HuanMeng.MiaoYu.Model.DbSqlServer.Db_MiaoYu;
namespace HuanMeng.MiaoYu.Code.Music
{
/// <summary>
///
/// </summary>
public class MusicService(IServiceProvider serviceProvider) : IHostedService, IDisposable
{
MusicProcessor? musicProcessor = null;
public Task StartAsync(CancellationToken cancellationToken)
{
musicProcessor = new MusicProcessor(serviceProvider);
musicProcessor.Run();
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
if (musicProcessor != null)
{
musicProcessor.Stop();
musicProcessor.Dispose();
}
return Task.CompletedTask;
}
public void Dispose()
{
musicProcessor?.Dispose();
}
}
public class MusicProcessor(IServiceProvider serviceProvider) : ThreadProcessor
{
protected override async void Proc_Do()
{
while (true)
{
foreach (var item in AppConfigurationExtend.AppConfigs.Values)
{
try
{
using var service = serviceProvider.CreateScope();
var _serviceProvider = service.ServiceProvider;
var temantInfo = _serviceProvider.GetService<ITenantInfo>();
var t = item.ToITenantInfo();
DAO dao = new DAO(_serviceProvider, t);
var list = dao.daoDbMiaoYu.context.M_Songs.Where(it => it.State == 0).ToList();
if (list.Count > 0)
{
var httpFactory = serviceProvider.GetRequiredService<IHttpClientFactory>();
foreach (var songs in list)
{
var httpClient = httpFactory.CreateClient();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
httpClient.DefaultRequestHeaders.Add("authorization", "Bearer hk-ylg6c31000042000fef54b80aec96b39e83b36f6e551440b");
var url = $"https://api.openai-hk.com/suno/feed/{songs.SpecialId}";
var response = await httpClient.GetAsync(url);
if (response == null || !response.IsSuccessStatusCode)
{
//throw new Exception("创建音乐失败");
songs.State = -1;
dao.daoDbMiaoYu.context.SaveChanges();
continue;
}
var responseContent = await response.Content.ReadAsStringAsync();
if (string.IsNullOrEmpty(responseContent))
{
songs.State = -1;
dao.daoDbMiaoYu.context.SaveChanges();
continue;
}
var obj = JsonConvert.DeserializeObject<JArray>(responseContent);
//status
var status = obj?.SelectToken("[0].status")?.ToString();
if (status == "complete")
{
songs.MusicAddress = obj?.SelectToken("[0].audio_url")?.ToString() ?? "";
songs.CoverImage = obj?.SelectToken("[0].image_url")?.ToString() ?? "";
songs.ImageLargeUrl = obj?.SelectToken("[0].image_large_url")?.ToString() ?? "";
songs.Lyrics = obj?.SelectToken("[0].metadata.prompt")?.ToString() ?? "";
var duration = obj?.SelectToken("[0].metadata.duration")?.ToString() ?? "";
if (!string.IsNullOrEmpty(duration))
{
if (decimal.TryParse(duration, out var d))
{
songs.Duration = TimeOnly.FromTimeSpan(new TimeSpan(0, 0, (int)d));
}
}
songs.State = 1;
var songInfo = await dao.daoDbMiaoYu.context.M_SongInfo.Where(it => it.Id == songs.SongInfoId).FirstOrDefaultAsync();
if (songInfo != null)
{
if (songInfo.Status == "正在生成")
{
songInfo.Status = "已完成";
}
}
dao.daoDbMiaoYu.context.SaveChanges();
}
}
}
}
catch (Exception ex)
{
}
}
Thread.Sleep(1000 * 5);
}
}
}
}