138 lines
5.8 KiB
C#
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);
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|