119 lines
3.4 KiB
C#
119 lines
3.4 KiB
C#
using CMD_Utils.Music;
|
|
|
|
using PluginManager.Others;
|
|
|
|
using System;
|
|
using System.IO;
|
|
using System.Net;
|
|
using System.Net.Http;
|
|
using System.Net.Http.Headers;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace MusicCommands
|
|
{
|
|
class MusicPlayer
|
|
{
|
|
public Stream inputStream { get; private set; } // from FFMPEG
|
|
public Stream outputStream { get; private set; } // to Voice Channel
|
|
public MusicPlayer(Stream input, Stream output)
|
|
{
|
|
inputStream = input;
|
|
outputStream = output;
|
|
}
|
|
|
|
public MusicPlayer(Stream output)
|
|
{
|
|
inputStream = null;
|
|
outputStream = output;
|
|
}
|
|
|
|
public bool Paused { get; set; }
|
|
private bool _stop { get; set; }
|
|
public void Stop()
|
|
{
|
|
_stop = true;
|
|
}
|
|
|
|
public async Task StartSendAudioFromLink(string URL)
|
|
{
|
|
Stream ms = new MemoryStream();
|
|
int bsize = 512;
|
|
new Thread(async delegate (object o)
|
|
{
|
|
var response = await new HttpClient().GetAsync(URL);
|
|
using (var stream = await response.Content.ReadAsStreamAsync())
|
|
{
|
|
byte[] buffer = new byte[bsize];
|
|
int read;
|
|
while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
|
|
{
|
|
var pos = ms.Position;
|
|
ms.Position = ms.Length;
|
|
ms.Write(buffer, 0, read);
|
|
ms.Position = pos;
|
|
}
|
|
}
|
|
}).Start();
|
|
Console.Write("Reading data: ");
|
|
while (ms.Length < bsize * 10)
|
|
{
|
|
await Task.Delay(1000);
|
|
Console.Title = "Reading data: " + ms.Length + " bytes read of " + bsize * 10;
|
|
Console.Write(".");
|
|
}
|
|
Console.WriteLine("\nDone");
|
|
ms.Position = 0;
|
|
|
|
_stop = false;
|
|
Paused = false;
|
|
|
|
while (!_stop)
|
|
{
|
|
if (Paused) continue;
|
|
byte[] buffer = new byte[bsize];
|
|
int read = await ms.ReadAsync(buffer, 0, buffer.Length);
|
|
if (read > 0)
|
|
{
|
|
await outputStream.WriteAsync(buffer, 0, read);
|
|
}
|
|
else
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
public async Task StartSendAudio()
|
|
{
|
|
Paused = false;
|
|
_stop = false;
|
|
while (!_stop)
|
|
{
|
|
if (Paused) continue;
|
|
int bsize = 512;
|
|
byte[] buffer = new byte[bsize];
|
|
var bcount = await inputStream.ReadAsync(buffer, 0, bsize);
|
|
if (bcount <= 0)
|
|
{
|
|
Stop();
|
|
Data.CurrentlyRunning = null;
|
|
break;
|
|
}
|
|
try
|
|
{
|
|
await outputStream.WriteAsync(buffer, 0, bcount);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await outputStream.FlushAsync();
|
|
Functions.WriteLogFile(ex.ToString());
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|