diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000..56d0e8a
--- /dev/null
+++ b/.env.example
@@ -0,0 +1 @@
+DISCORD_APP_ID=your_app_id_here
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 370da60..27a3a5b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,8 @@
##
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
+*.env
+
# User-specific files
*.rsuser
*.suo
diff --git a/DiscordPresence.cs b/DiscordPresence.cs
new file mode 100644
index 0000000..3c22c3d
--- /dev/null
+++ b/DiscordPresence.cs
@@ -0,0 +1,40 @@
+using DiscordRPC;
+using DiscordRPC.Logging;
+using System;
+
+class DiscordPresence
+{
+ private static DiscordRpcClient client;
+
+ public static void Init(string clientId)
+ {
+ client = new DiscordRpcClient(clientId);
+ client.Logger = new ConsoleLogger() { Level = LogLevel.Warning };
+ client.Initialize();
+ }
+
+ public static void SetPresence(string image, string texte, string sousTexte)
+ {
+ if (client == null)
+ {
+ Console.WriteLine("Erreur : Discord RPC non initialisé. Appelle Init(clientId) avant.");
+ return;
+ }
+
+ client.SetPresence(new RichPresence()
+ {
+ Details = texte,
+ State = sousTexte,
+ Assets = new Assets()
+ {
+ LargeImageKey = image,
+ LargeImageText = texte
+ }
+ });
+ }
+
+ public static void Close()
+ {
+ client.Dispose();
+ }
+}
\ No newline at end of file
diff --git a/Folder.DotSettings.user b/Folder.DotSettings.user
new file mode 100644
index 0000000..e1d286d
--- /dev/null
+++ b/Folder.DotSettings.user
@@ -0,0 +1,6 @@
+
+ <AssemblyExplorer>
+ <Assembly Path="/home/kali/RiderProjects/Meio/discord_social_sdk/bin/release/discord_partner_sdk.dll" />
+</AssemblyExplorer>
\ No newline at end of file
diff --git a/Meio.Api/Api.cs b/Meio.Api/Api.cs
new file mode 100644
index 0000000..22dcb45
--- /dev/null
+++ b/Meio.Api/Api.cs
@@ -0,0 +1,50 @@
+using System.Runtime.CompilerServices;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Logging.Console;
+using PrettyLogging.Console;
+
+namespace Meio.Api;
+
+public class Api
+{
+ private static ILoggerFactory? LoggerFactory { get; set; }
+
+ public static ILogger? Logger { get; private set; }
+
+ [ModuleInitializer]
+ public static void Init()
+ {
+ // Create and configure PrettyLogger
+ LoggerFactory = Microsoft.Extensions.Logging.LoggerFactory.Create(builder =>
+ {
+ builder.ClearProviders();
+ builder.AddPrettyConsole(opt =>
+ {
+ opt.ShowLogLevel = true;
+ opt.ShowEventId = false;
+ opt.ShowManagedThreadId = false;
+ opt.SingleLine = true;
+ opt.IncludeScopes = true;
+ opt.ShowTimestamp = true;
+ opt.LogLevelCase = LogLevelCase.Upper;
+ opt.CategoryMode = LoggerCategoryMode.Short;
+ opt.ColorBehavior = LoggerColorBehavior.Enabled;
+ opt.UseUtcTimestamp = false;
+ });
+
+#if DEBUG
+ builder.SetMinimumLevel(LogLevel.Trace);
+#else
+ builder.SetMinimumLevel(LogLevel.Information);
+#endif
+ });
+
+ Logger = LoggerFactory.CreateLogger();
+ Logger.LogInformation("Meio API started.");
+ }
+
+ public static void Main()
+ {
+ Init();
+ }
+}
\ No newline at end of file
diff --git a/Meio.Api/Meio.Api.csproj b/Meio.Api/Meio.Api.csproj
new file mode 100644
index 0000000..cefad2b
--- /dev/null
+++ b/Meio.Api/Meio.Api.csproj
@@ -0,0 +1,18 @@
+
+
+
+ Exe
+ net8.0
+ enable
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Meio.app/Services/AudioMetadataService.cs b/Meio.Api/Services/AudioMetadataService.cs
similarity index 54%
rename from Meio.app/Services/AudioMetadataService.cs
rename to Meio.Api/Services/AudioMetadataService.cs
index 26cbabe..42e5c3c 100644
--- a/Meio.app/Services/AudioMetadataService.cs
+++ b/Meio.Api/Services/AudioMetadataService.cs
@@ -1,21 +1,23 @@
+using System.IO;
using Microsoft.Extensions.Logging;
using TagLib;
+using File = TagLib.File;
-namespace Meio.app.Services;
+namespace Meio.Api.Services;
public class MetadataInfo
{
- public string? Title { get; set; }
+ public string? Title { get; init; }
- public string[]? Artists { get; set; }
+ public string[]? Artists { get; init; }
- public string? Album { get; set; }
+ public string? Album { get; init; }
- public uint Year { get; set; }
+ public uint Year { get; init; }
- public string[]? Genres { get; set; }
+ public string[]? Genres { get; init; }
- public byte[]? AlbumArt { get; set; }
+ public byte[]? AlbumArt { get; init; }
}
public static class AudioMetadataService
@@ -32,13 +34,13 @@ public static class AudioMetadataService
var file = File.Create(filePath);
var tag = file.Tag;
- App.Logger?.LogDebug("Asked for the metadata of {filePath}.", filePath);
- App.Logger?.LogTrace("Title: {tagTitle}", tag.Title);
- App.Logger?.LogTrace("Artists: {tagArtists}", string.Join(", ", tag.AlbumArtists));
- App.Logger?.LogTrace("Album: {tagAlbum}", tag.Album);
- App.Logger?.LogTrace("Year: {tagYear}", tag.Year);
- App.Logger?.LogTrace("Genre: {tagGenres}", string.Join(", ", tag.Genres));
- App.Logger?.LogTrace(tag.Pictures.Length > 0 ? "Got an album art." : "No album art was found.");
+ Api.Logger?.LogDebug("Current metadata of {filePath}.", filePath);
+ Api.Logger?.LogTrace("Title: {tagTitle}", tag.Title);
+ Api.Logger?.LogTrace("Artists: {tagArtists}", string.Join(", ", tag.AlbumArtists));
+ Api.Logger?.LogTrace("Album: {tagAlbum}", tag.Album);
+ Api.Logger?.LogTrace("Year: {tagYear}", tag.Year);
+ Api.Logger?.LogTrace("Genre: {tagGenres}", string.Join(", ", tag.Genres));
+ Api.Logger?.LogTrace(tag.Pictures.Length > 0 ? "Got an album art." : "No album art was found.");
return new MetadataInfo
{
@@ -52,12 +54,17 @@ public static class AudioMetadataService
}
catch (CorruptFileException corruptFileException)
{
- App.Logger?.LogError(corruptFileException, "Failed to load metadata. File is corrupted.");
+ Api.Logger?.LogError(corruptFileException, "Failed to load metadata. File is corrupted.");
return null;
}
catch (UnsupportedFormatException unsupportedFormatException)
{
- App.Logger?.LogError(unsupportedFormatException, "Failed to load metadata. File format is unsupported.");
+ Api.Logger?.LogError(unsupportedFormatException, "Failed to load metadata. File format is unsupported.");
+ return null;
+ }
+ catch (FileNotFoundException fileNotFoundException)
+ {
+ Api.Logger?.LogError(fileNotFoundException, "Failed to load metadata. File not found.");
return null;
}
}
diff --git a/Meio.Api/Services/AudioPlayerService.cs b/Meio.Api/Services/AudioPlayerService.cs
new file mode 100644
index 0000000..0735684
--- /dev/null
+++ b/Meio.Api/Services/AudioPlayerService.cs
@@ -0,0 +1,188 @@
+using System;
+using LibVLCSharp.Shared;
+using Microsoft.Extensions.Logging;
+
+// ReSharper disable UnusedMember.Global
+
+namespace Meio.Api.Services;
+
+public class AudioPlayerService : IDisposable
+{
+ // ReSharper disable once InconsistentNaming
+ private readonly LibVLC _libVLC;
+ private readonly MediaPlayer _mediaPlayer;
+
+ public AudioPlayerService()
+ {
+ try
+ {
+ _libVLC = new LibVLC();
+ _mediaPlayer = new MediaPlayer(_libVLC);
+ Api.Logger!.LogDebug("Initialized AudioPlayerService.");
+ }
+ catch (VLCException ex)
+ {
+ Api.Logger!.LogCritical("An error occured trying to initialize AudioPlayerService. {Exception}", ex.Message);
+ Api.Logger!.LogInformation(
+ "!! READ THIS !!\n If you are on a linux host, please make sure you have installed the libvlc library, you will not be able to read any audio otherwise !!!");
+ Environment.Exit(-1);
+ }
+ }
+
+ ///
+ /// To be called when done using.
+ ///
+ public void Dispose()
+ {
+ _mediaPlayer.Stop(); // Make sure it stops first to avoid potential unwanted behaviour.
+ _mediaPlayer.Dispose();
+ Api.Logger!.LogTrace("Disposed media player.");
+
+ _libVLC.Dispose();
+ Api.Logger!.LogTrace("Disposed libVLC.");
+
+ GC.SuppressFinalize(this); // Dispose AudioPlayerService.
+ Api.Logger!.LogDebug("Disposed.");
+
+ Environment.Exit(0); // Exit after this.
+ }
+
+ ///
+ /// Starts playing the given audio file.
+ ///
+ /// Audio file path.
+ public Media? Play(string audioFilePath)
+ {
+ try
+ {
+ if (_mediaPlayer.IsPlaying)
+ {
+ Api.Logger!.LogError("An audio file is already being played. Please stop it first.");
+ return null;
+ }
+
+ var media = new Media(_libVLC, audioFilePath);
+
+ _mediaPlayer.Play(media);
+ Api.Logger!.LogInformation("Playing media file {AudioFilePath} .", audioFilePath);
+
+ _mediaPlayer.EndReached += (_, _) =>
+ {
+ Api.Logger!.LogDebug("Media playback ended.");
+ // _mediaPlayer.Stop()
+ };
+
+ return media;
+ }
+ catch (Exception e)
+ {
+ Api.Logger?.LogError("An error occured trying to play the audio file. {e}", e.Message);
+
+ return null;
+ }
+ }
+
+ ///
+ /// Starts playing the given audio file.
+ ///
+ /// Audio file Uri.
+ public Media? Play(Uri audioUri)
+ {
+ try
+ {
+ if (_mediaPlayer.IsPlaying)
+ {
+ Api.Logger!.LogError("An audio file is already being played. Please stop it first.");
+ return null;
+ }
+
+ var media = new Media(_libVLC, audioUri.AbsolutePath, FromType.FromLocation);
+
+ _mediaPlayer.Play(media);
+ Api.Logger!.LogInformation("Playing media file from url {AudioFilePath}.", audioUri.AbsolutePath);
+
+ return media;
+ }
+ catch (Exception e)
+ {
+ Api.Logger?.LogError("An error occured trying to play the audio file from url. {e}", e.Message);
+ return null;
+ }
+ }
+
+ ///
+ /// Stops the current reading audio file.
+ ///
+ public void Stop()
+ {
+ if (!_mediaPlayer.IsPlaying)
+ {
+ Api.Logger!.LogError("Cannot stop the media player. No media is playing.");
+ }
+
+ _mediaPlayer.Stop();
+ _mediaPlayer.Media?.Dispose();
+ Api.Logger!.LogDebug("Stopped media player.");
+ }
+
+ ///
+ /// Pauses the current reading audio file.
+ ///
+ public void Pause()
+ {
+ _mediaPlayer.Pause();
+ Api.Logger!.LogDebug("Paused media player.");
+ }
+
+ ///
+ /// Changes the volume of the current reading audio file.
+ ///
+ /// New volume of the media player.
+ public void ChangeVolume(int newVolume)
+ {
+ try
+ {
+ _mediaPlayer.Volume = newVolume;
+ Api.Logger!.LogTrace("Changed audio volume to {NewAudioVolume}.", newVolume);
+ }
+ catch (Exception e)
+ {
+ Api.Logger!.LogError("An error occured trying to change audio volume. {Exception}", e.Message);
+ }
+ }
+
+ ///
+ /// Changes the playback speed of the current playing media.
+ ///
+ /// New playback speed.
+ public void ChangePlaybackSpeed(float speed)
+ {
+ if (!_mediaPlayer.IsPlaying)
+ {
+ Api.Logger!.LogError("Cannot change audio rate, no media is playing.");
+ }
+ else
+ {
+ _mediaPlayer.SetRate(speed);
+ Api.Logger!.LogTrace("Changed audio rate to {Speed}.", speed);
+ }
+ }
+
+ ///
+ /// Mute the current reading audio file.
+ ///
+ public void Mute()
+ {
+ _mediaPlayer.Mute = true;
+ Api.Logger!.LogDebug("Muted media.");
+ }
+
+ ///
+ /// Unmute the current reading audio file.
+ ///
+ public void Unmute()
+ {
+ _mediaPlayer.Mute = false;
+ Api.Logger!.LogDebug("Unuted media.");
+ }
+}
\ No newline at end of file
diff --git a/Meio.app/App.axaml b/Meio.App/App.axaml
similarity index 97%
rename from Meio.app/App.axaml
rename to Meio.App/App.axaml
index 7bc5830..fce12ed 100644
--- a/Meio.app/App.axaml
+++ b/Meio.App/App.axaml
@@ -1,10 +1,10 @@
-
-
-
-
-
-
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Meio.app/App.axaml.cs b/Meio.App/App.axaml.cs
similarity index 96%
rename from Meio.app/App.axaml.cs
rename to Meio.App/App.axaml.cs
index 00e0160..23be316 100644
--- a/Meio.app/App.axaml.cs
+++ b/Meio.App/App.axaml.cs
@@ -1,58 +1,58 @@
-using Avalonia;
-using Avalonia.Controls.ApplicationLifetimes;
-using Avalonia.Markup.Xaml;
-using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Logging.Console;
-using PrettyLogging.Console;
-
-namespace Meio.app;
-
-public class App : Application
-{
- private static ILoggerFactory? LoggerFactory { get; set; }
-
- public static ILogger? Logger { get; private set; }
-
- public override void Initialize()
- {
- AvaloniaXamlLoader.Load(this);
- }
-
- public override void OnFrameworkInitializationCompleted()
- {
- // Create and configure PrettyLogger
- LoggerFactory = Microsoft.Extensions.Logging.LoggerFactory.Create(builder =>
- {
- builder.ClearProviders();
- builder.AddPrettyConsole(opt =>
- {
- opt.ShowLogLevel = true;
- opt.ShowEventId = false;
- opt.ShowManagedThreadId = false;
- opt.SingleLine = true;
- opt.IncludeScopes = true;
- opt.ShowTimestamp = true;
- opt.LogLevelCase = LogLevelCase.Upper;
- opt.CategoryMode = LoggerCategoryMode.Short;
- opt.ColorBehavior = LoggerColorBehavior.Enabled;
- opt.UseUtcTimestamp = false;
- });
-
-#if DEBUG
- builder.SetMinimumLevel(LogLevel.Trace);
-#else
- builder.SetMinimumLevel(LogLevel.Information);
-#endif
- });
-
- Logger = LoggerFactory.CreateLogger();
- Logger.LogInformation("Meio Application started.");
-
- if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
- {
- desktop.MainWindow = new MainWindow();
- }
-
- base.OnFrameworkInitializationCompleted();
- }
+using Avalonia;
+using Avalonia.Controls.ApplicationLifetimes;
+using Avalonia.Markup.Xaml;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Logging.Console;
+using PrettyLogging.Console;
+
+namespace Meio.app;
+
+public class App : Application
+{
+ private static ILoggerFactory? LoggerFactory { get; set; }
+
+ public static ILogger? Logger { get; private set; }
+
+ public override void Initialize()
+ {
+ AvaloniaXamlLoader.Load(this);
+ }
+
+ public override void OnFrameworkInitializationCompleted()
+ {
+ // Create and configure PrettyLogger
+ LoggerFactory = Microsoft.Extensions.Logging.LoggerFactory.Create(builder =>
+ {
+ builder.ClearProviders();
+ builder.AddPrettyConsole(opt =>
+ {
+ opt.ShowLogLevel = true;
+ opt.ShowEventId = false;
+ opt.ShowManagedThreadId = false;
+ opt.SingleLine = true;
+ opt.IncludeScopes = true;
+ opt.ShowTimestamp = true;
+ opt.LogLevelCase = LogLevelCase.Upper;
+ opt.CategoryMode = LoggerCategoryMode.Short;
+ opt.ColorBehavior = LoggerColorBehavior.Enabled;
+ opt.UseUtcTimestamp = false;
+ });
+
+#if DEBUG
+ builder.SetMinimumLevel(LogLevel.Trace);
+#else
+ builder.SetMinimumLevel(LogLevel.Information);
+#endif
+ });
+
+ Logger = LoggerFactory.CreateLogger();
+ Logger.LogInformation("Meio Application started.");
+
+ if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
+ {
+ desktop.MainWindow = new MainWindow();
+ }
+
+ base.OnFrameworkInitializationCompleted();
+ }
}
\ No newline at end of file
diff --git a/Meio.app/MainWindow.axaml b/Meio.App/MainWindow.axaml
similarity index 98%
rename from Meio.app/MainWindow.axaml
rename to Meio.App/MainWindow.axaml
index 7f6c48b..e61780c 100644
--- a/Meio.app/MainWindow.axaml
+++ b/Meio.App/MainWindow.axaml
@@ -1,27 +1,27 @@
-
-
-
-
-
-
-
- Currently reading
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+ Currently reading
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Meio.app/MainWindow.axaml.cs b/Meio.App/MainWindow.axaml.cs
similarity index 96%
rename from Meio.app/MainWindow.axaml.cs
rename to Meio.App/MainWindow.axaml.cs
index 5f31f96..7487096 100644
--- a/Meio.app/MainWindow.axaml.cs
+++ b/Meio.App/MainWindow.axaml.cs
@@ -1,94 +1,95 @@
-using System;
-using System.Threading;
-using System.Threading.Tasks;
-using Avalonia.Controls;
-using Avalonia.Controls.Primitives;
-using Avalonia.Interactivity;
-using Meio.app.Services;
-using Microsoft.Extensions.Logging;
-
-namespace Meio.app;
-
-public partial class MainWindow : Window
-{
- private readonly AudioPlayerService _audioPlayerService;
- private string? _author = "unknown"; // this is a cheap fix, but it is because this Window is just for testing, so it's alright.
- private bool _debounce;
- private string? _filePath;
- private CancellationTokenSource? _volumeDebounceToken;
-
- // DIS WHOLE CODE IS HORIRBLE AAAAAAAAAA
-
- public MainWindow()
- {
- InitializeComponent();
- _audioPlayerService = new AudioPlayerService();
- }
-
- private void Button_OnClick(object? sender, RoutedEventArgs e)
- {
- if (!_debounce)
- {
- _debounce = true;
-
- if (_filePath == null) return;
-
- var metadata = AudioMetadataService.LoadMetadata(_filePath);
- if (metadata == null) return;
-
- _audioPlayerService.Play(_filePath);
-
- PlayButton.Content = "Stop";
- _author = metadata.Artists is { Length: 0 } ? "unknown" : metadata.Artists?[0];
-
- CurrentMusicText.Text = $"{metadata.Title} - {_author}";
- AlbumArtImage.Source = metadata.AlbumArt != null ? ImageHelper.LoadBitmapFromBytes(metadata.AlbumArt) : null;
- }
- else
- {
- PlayButton.Content = "Play";
- CurrentMusicText.Text = "Nothing";
- AlbumArtImage.Source = null;
-
- _audioPlayerService.Stop();
- _debounce = false;
- }
- }
-
- private void VolumeSlider_OnValueChanged(object? sender, RangeBaseValueChangedEventArgs e)
- {
- _volumeDebounceToken?.Cancel();
- _volumeDebounceToken = new CancellationTokenSource();
-
- var token = _volumeDebounceToken.Token;
- var newVolume = (int)e.NewValue;
- VolumeText.Text = $"{newVolume * 100 / 30}%";
-
- Task.Run(async () =>
- {
- try
- {
- await Task.Delay(100, token); // 100ms debounce
- if (!token.IsCancellationRequested) _audioPlayerService.ChangeVolume(newVolume);
- }
- catch (TaskCanceledException)
- {
- // Ignore
- }
- },
- token);
- }
-
- private async void UploadButton_OnClick(object? sender, RoutedEventArgs e)
- {
- try
- {
- var url = await FileHelper.GetFilePathDialog(GetTopLevel(this));
- if (url != null) _filePath = Uri.UnescapeDataString(url.AbsolutePath);
- }
- catch (Exception exception)
- {
- App.Logger!.LogError("There was an error trying to parse the URI unescape data. {exception}", exception.Message);
- }
- }
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+using Avalonia.Controls;
+using Avalonia.Controls.Primitives;
+using Avalonia.Interactivity;
+using Meio.Api.Services;
+using Meio.app.Services;
+using Microsoft.Extensions.Logging;
+
+namespace Meio.app;
+
+public partial class MainWindow : Window
+{
+ private readonly AudioPlayerService _audioPlayerService;
+ private string? _author = "unknown"; // this is a cheap fix, but it is because this Window is just for testing, so it's alright.
+ private bool _debounce;
+ private string? _filePath;
+ private CancellationTokenSource? _volumeDebounceToken;
+
+ // DIS WHOLE CODE IS HORIRBLE AAAAAAAAAA
+
+ public MainWindow()
+ {
+ InitializeComponent();
+ _audioPlayerService = new AudioPlayerService();
+ }
+
+ private void Button_OnClick(object? sender, RoutedEventArgs e)
+ {
+ if (!_debounce)
+ {
+ _debounce = true;
+
+ if (_filePath == null) return;
+
+ var metadata = AudioMetadataService.LoadMetadata(_filePath);
+ if (metadata == null) return;
+
+ _audioPlayerService.Play(_filePath);
+
+ PlayButton.Content = "Stop";
+ _author = metadata.Artists is { Length: 0 } ? "unknown" : metadata.Artists?[0];
+
+ CurrentMusicText.Text = $"{metadata.Title} - {_author}";
+ AlbumArtImage.Source = metadata.AlbumArt != null ? ImageHelper.LoadBitmapFromBytes(metadata.AlbumArt) : null;
+ }
+ else
+ {
+ PlayButton.Content = "Play";
+ CurrentMusicText.Text = "Nothing";
+ AlbumArtImage.Source = null;
+
+ _audioPlayerService.Stop();
+ _debounce = false;
+ }
+ }
+
+ private void VolumeSlider_OnValueChanged(object? sender, RangeBaseValueChangedEventArgs e)
+ {
+ _volumeDebounceToken?.Cancel();
+ _volumeDebounceToken = new CancellationTokenSource();
+
+ var token = _volumeDebounceToken.Token;
+ var newVolume = (int)e.NewValue;
+ VolumeText.Text = $"{newVolume * 100 / 30}%";
+
+ Task.Run(async () =>
+ {
+ try
+ {
+ await Task.Delay(100, token); // 100ms debounce
+ if (!token.IsCancellationRequested) _audioPlayerService.ChangeVolume(newVolume);
+ }
+ catch (TaskCanceledException)
+ {
+ // Ignore
+ }
+ },
+ token);
+ }
+
+ private async void UploadButton_OnClick(object? sender, RoutedEventArgs e)
+ {
+ try
+ {
+ var url = await FileHelper.GetFilePathDialog(GetTopLevel(this));
+ if (url != null) _filePath = Uri.UnescapeDataString(url.AbsolutePath);
+ }
+ catch (Exception exception)
+ {
+ App.Logger!.LogError("There was an error trying to parse the URI unescape data. {exception}", exception.Message);
+ }
+ }
}
\ No newline at end of file
diff --git a/Meio.app/Meio.app.csproj b/Meio.App/Meio.App.csproj
similarity index 75%
rename from Meio.app/Meio.app.csproj
rename to Meio.App/Meio.App.csproj
index 6497d16..28fb93c 100644
--- a/Meio.app/Meio.app.csproj
+++ b/Meio.App/Meio.App.csproj
@@ -1,27 +1,30 @@
-
-
- WinExe
- net8.0
- enable
- true
- app.manifest
- true
-
-
-
-
-
-
-
-
-
- None
- All
-
-
-
-
-
-
-
-
+
+
+ WinExe
+ net8.0
+ enable
+ true
+ app.manifest
+ true
+ Meio.app
+
+
+
+
+
+
+
+
+
+ None
+ All
+
+
+
+
+
+
+
+
+
+
diff --git a/Meio.app/Program.cs b/Meio.App/Program.cs
similarity index 73%
rename from Meio.app/Program.cs
rename to Meio.App/Program.cs
index f1b4aa4..0ced40d 100644
--- a/Meio.app/Program.cs
+++ b/Meio.App/Program.cs
@@ -1,26 +1,31 @@
-using System;
-using Avalonia;
-
-namespace Meio.app;
-
-internal class Program
-{
- // Initialization code. Don't use any Avalonia, third-party APIs or any
- // SynchronizationContext-reliant code before AppMain is called: things aren't initialized
- // yet and stuff might break.
- [STAThread]
- public static void Main(string[] args)
- {
- BuildAvaloniaApp()
- .StartWithClassicDesktopLifetime(args);
- }
-
- // Avalonia configuration, don't remove; also used by visual designer.
- public static AppBuilder BuildAvaloniaApp()
- {
- return AppBuilder.Configure()
- .UsePlatformDetect()
- .WithInterFont()
- .LogToTrace();
- }
+using System;
+using System.IO;
+using Avalonia;
+using DotNetEnv;
+
+namespace Meio.app;
+
+internal abstract class Program
+{
+ // Initialization code. Don't use any Avalonia, third-party APIs or any
+ // SynchronizationContext-reliant code before AppMain is called: things aren't initialized
+ // yet and stuff might break.
+ [STAThread]
+ public static void Main(string[] args)
+ {
+ var envPath = Path.Combine(AppContext.BaseDirectory, "../../../../.env");
+ Env.Load(envPath);
+
+ BuildAvaloniaApp()
+ .StartWithClassicDesktopLifetime(args);
+ }
+
+ // Avalonia configuration, don't remove; also used by visual designer.
+ private static AppBuilder BuildAvaloniaApp()
+ {
+ return AppBuilder.Configure()
+ .UsePlatformDetect()
+ .WithInterFont()
+ .LogToTrace();
+ }
}
\ No newline at end of file
diff --git a/Meio.App/Services/DiscordService.cs b/Meio.App/Services/DiscordService.cs
new file mode 100644
index 0000000..b5397cb
--- /dev/null
+++ b/Meio.App/Services/DiscordService.cs
@@ -0,0 +1,147 @@
+using System;
+using System.IO;
+using System.Threading;
+using System.Threading.Tasks;
+using DiscordRPC;
+using DiscordRPC.Logging;
+using Microsoft.Extensions.Logging;
+using LogLevel = DiscordRPC.Logging.LogLevel;
+
+namespace Meio.app.Services;
+
+public class DiscordService : IDisposable
+{
+ private readonly DiscordRpcClient? _client;
+ private readonly TimeSpan _cooldown = TimeSpan.FromSeconds(16); // Time between calls.
+ private readonly SemaphoreSlim _semaphore = new(1, 1); // Prevents multiple calls.
+ private DateTime _lastUpdate = DateTime.MinValue;
+
+ public DiscordService()
+ {
+ try
+ {
+ var appId = Environment.GetEnvironmentVariable("DISCORD_APP_ID");
+ Console.WriteLine($"AppId: {appId}");
+ Console.WriteLine($"Current Directory {Directory.GetCurrentDirectory()}");
+
+ // Create the client and setup events.
+ _client = new DiscordRpcClient(appId)
+ {
+ Logger = new ConsoleLogger(LogLevel.None) // Sadly, this is mandatory.
+ };
+
+ _client.OnReady += (sender, _) => App.Logger!.LogDebug("{object} | Initialized DiscordService.", sender);
+ _client.OnClose += (sender, args) =>
+ App.Logger!.LogError("{object} | There was an error connecting to discord. {args}", sender, args);
+ _client.OnError += (sender, args) => App.Logger!.LogError("{object} | {args}", sender, args);
+
+ //Connect to the RPC.
+ _client.Initialize();
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e.Message);
+ }
+ }
+
+ public static DiscordService Instance { get; } = new(); // Static reference
+
+ ///
+ /// To be called when done using.
+ ///
+ public void Dispose()
+ {
+ _client?.Dispose();
+ GC.SuppressFinalize(this);
+ App.Logger!.LogDebug("Disposed DiscordService.");
+ }
+
+ ///
+ /// Changes the current Presence, suitable for when the user is listening to music.
+ ///
+ /// Title of the single.
+ /// Artist of the single.
+ /// Album the single is from.
+ /// Album splash art.
+ /// Length of the media duration (in seconds).
+ public async Task SetPresence(string title, string artist, string album, string albumArt, TimeSpan timestamp)
+ {
+ await _semaphore.WaitAsync();
+
+ try
+ {
+ var timeSinceLastUpdate = DateTime.UtcNow - _lastUpdate;
+
+ if (timeSinceLastUpdate < _cooldown)
+ {
+ var delay = _cooldown - timeSinceLastUpdate;
+ App.Logger!.LogDebug("Rate Limited have to wait for {delay}s", delay.Seconds);
+ await Task.Delay(delay); // Wait for cooldown to pass
+ // TODO: RPC Queue system, if there is two RPCs in wait, only show the last one.
+ }
+
+ _client?.SetPresence(new RichPresence
+ {
+ Type = ActivityType.Listening,
+ StatusDisplay = StatusDisplayType.Details,
+ Details = title,
+ State = $"{artist} - {album}",
+ Timestamps = Timestamps.FromTimeSpan(timestamp),
+ Assets = new Assets { LargeImageKey = albumArt },
+ Buttons = [new Button { Label = "Join us!", Url = "https://github.com/nodeSoftwares/Meio/" }]
+ });
+
+ _lastUpdate = DateTime.UtcNow;
+
+ App.Logger!.LogDebug("Changed discord presence to {title} | {artist} - {album}", title, artist, album);
+ }
+ finally
+ {
+ _semaphore.Release();
+ }
+ }
+
+ ///
+ /// Changes the current Presence, for general purpose.
+ ///
+ /// Title of the Presence.
+ /// State of the Presence.
+ public async Task SetPresence(string text, string state)
+ {
+ await _semaphore.WaitAsync();
+
+ try
+ {
+ var timeSinceLastUpdate = DateTime.UtcNow - _lastUpdate;
+
+ if (timeSinceLastUpdate < _cooldown)
+ {
+ var delay = _cooldown - timeSinceLastUpdate;
+ await Task.Delay(delay); // Wait for cooldown to pass
+ }
+
+ _client?.SetPresence(new RichPresence
+ {
+ Details = text,
+ State = state,
+ Buttons = [new Button { Label = "Join us!", Url = "https://github.com/nodeSoftwares/Meio/" }]
+ });
+
+ _lastUpdate = DateTime.UtcNow;
+
+ App.Logger!.LogDebug("Changed discord presence to {text} | {state}", text, state);
+ }
+ finally
+ {
+ _semaphore.Release();
+ }
+ }
+
+ ///
+ /// Clears the current Presence.
+ ///
+ public void ClearPresence()
+ {
+ _client?.ClearPresence();
+ }
+}
\ No newline at end of file
diff --git a/Meio.app/Services/FileHelper.cs b/Meio.App/Services/FileHelper.cs
similarity index 100%
rename from Meio.app/Services/FileHelper.cs
rename to Meio.App/Services/FileHelper.cs
diff --git a/Meio.app/Services/ImageHelper.cs b/Meio.App/Services/ImageHelper.cs
similarity index 100%
rename from Meio.app/Services/ImageHelper.cs
rename to Meio.App/Services/ImageHelper.cs
diff --git a/Meio.app/app.manifest b/Meio.App/app.manifest
similarity index 98%
rename from Meio.app/app.manifest
rename to Meio.App/app.manifest
index d841308..c4d23cf 100644
--- a/Meio.app/app.manifest
+++ b/Meio.App/app.manifest
@@ -1,18 +1,18 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Meio.app/Services/AudioPlayerService.cs b/Meio.app/Services/AudioPlayerService.cs
deleted file mode 100644
index fab4961..0000000
--- a/Meio.app/Services/AudioPlayerService.cs
+++ /dev/null
@@ -1,122 +0,0 @@
-using System;
-using Avalonia.Threading;
-using LibVLCSharp.Shared;
-using Microsoft.Extensions.Logging;
-// ReSharper disable UnusedMember.Global
-
-namespace Meio.app.Services;
-
-public class AudioPlayerService
-{
- // ReSharper disable once InconsistentNaming
- private readonly LibVLC _libVLC;
- private readonly MediaPlayer _mediaPlayer;
-
- public AudioPlayerService()
- {
- try
- {
- _libVLC = new LibVLC();
- _mediaPlayer = new MediaPlayer(_libVLC);
- App.Logger!.LogDebug("Initialized AudioPlayerService.");
- }
- catch (VLCException ex)
- {
- App.Logger!.LogCritical("An error occured trying to initialize AudioPlayerService. {Exception}", ex.Message);
- App.Logger!.LogInformation(
- "!! READ THIS !!\n If you are on a linux host, please make sure you have installed the libvlc library, you will not be able to read any audio otherwise !!!");
- Environment.Exit(-1);
- }
- }
-
- ///
- /// Starts playing the given audio file.
- ///
- /// Audio file path.
- public void Play(string audioFilePath)
- {
- try
- {
- var media = new Media(_libVLC, audioFilePath);
-
- _mediaPlayer.Play(media);
- App.Logger!.LogInformation("Playing media file {AudioFilePath} .", audioFilePath);
- }
- catch (Exception e)
- {
- App.Logger?.LogError("An error occured trying to play the audio file. {e}", e.Message);
- }
- }
-
- ///
- /// Starts playing the given audio file.
- ///
- /// Audio file Uri.
- public void Play(Uri audioUri)
- {
- try
- {
- var media = new Media(_libVLC, audioUri.AbsolutePath, FromType.FromLocation);
-
- _mediaPlayer.Play(media);
- App.Logger!.LogInformation("Playing media file from url {AudioFilePath} .", audioUri.AbsolutePath);
- }
- catch (Exception e)
- {
- App.Logger?.LogError("An error occured trying to play the audio file. {e}", e.Message);
- }
- }
-
- ///
- /// Stops the current reading audio file.
- ///
- public void Stop()
- {
- _mediaPlayer.Stop();
- App.Logger!.LogDebug("Stopped media player.");
- }
-
- ///
- /// Pauses the current reading audio file.
- ///
- public void Pause()
- {
- _mediaPlayer.Pause();
- App.Logger!.LogDebug("Paused media player.");
- }
-
- ///
- /// Changes the volume of the current reading audio file.
- ///
- /// New volume of the media player.
- public async void ChangeVolume(int newVolume)
- {
- try
- {
- await Dispatcher.UIThread.InvokeAsync(() => { _mediaPlayer.Volume = newVolume; });
- App.Logger!.LogTrace("Changed audio volume to {NewAudioVolume}.", newVolume);
- }
- catch (Exception e)
- {
- App.Logger!.LogError("An error occured trying to change audio volume. {Exception}", e.Message);
- }
- }
-
- ///
- /// Mute the current reading audio file.
- ///
- public void Mute()
- {
- _mediaPlayer.Mute = true;
- App.Logger!.LogDebug("Muted media.");
- }
-
- ///
- /// Unmute the current reading audio file.
- ///
- public void Unmute()
- {
- _mediaPlayer.Mute = false;
- App.Logger!.LogDebug("Unmuted media.");
- }
-}
\ No newline at end of file
diff --git a/Meio.csproj b/Meio.csproj
new file mode 100644
index 0000000..3fc40fe
--- /dev/null
+++ b/Meio.csproj
@@ -0,0 +1,17 @@
+
+
+
+ Exe
+ net8.0
+ enable
+ enable
+ YouTubeMusicDiscordRPC.Program
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Meio.sln b/Meio.sln
index a90f785..fdb44f9 100644
--- a/Meio.sln
+++ b/Meio.sln
@@ -3,7 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Meio.app", "Meio.app\Meio.app.csproj", "{A0DA8FBF-856F-44FE-89D5-C394F5F51E16}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Meio.App", "Meio.App\Meio.App.csproj", "{A0DA8FBF-856F-44FE-89D5-C394F5F51E16}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Meio.Api", "Meio.Api\Meio.Api.csproj", "{DADDD56A-A716-4AB4-9570-AD0C56C8EB3B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -18,5 +20,9 @@ Global
{A0DA8FBF-856F-44FE-89D5-C394F5F51E16}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A0DA8FBF-856F-44FE-89D5-C394F5F51E16}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A0DA8FBF-856F-44FE-89D5-C394F5F51E16}.Release|Any CPU.Build.0 = Release|Any CPU
+ {DADDD56A-A716-4AB4-9570-AD0C56C8EB3B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {DADDD56A-A716-4AB4-9570-AD0C56C8EB3B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {DADDD56A-A716-4AB4-9570-AD0C56C8EB3B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {DADDD56A-A716-4AB4-9570-AD0C56C8EB3B}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
diff --git a/PRIVACY.md b/PRIVACY.md
new file mode 100644
index 0000000..cc76a69
--- /dev/null
+++ b/PRIVACY.md
@@ -0,0 +1,13 @@
+# Privacy Policy
+
+**Last updated:** October 05, 2025
+
+This application, **Meio**, does not collect, store, or transmit any personal data from users.
+
+We do not require any registration, login, or personal information to use the Service. We do not use cookies, analytics, or third-party trackers.
+
+However, the app uses APIs from third-party music services (such as Spotify, YouTube, or others). These services may collect data in accordance with their own privacy policies. Please review their respective policies for more information.
+
+If you have any questions about this Privacy Policy, you can contact us:
+
+- On Matrix: [@selkii:matrix.org](https://matrix.to/#/@selkii:matrix.org)
diff --git a/Program.cs b/Program.cs
new file mode 100644
index 0000000..8680f66
--- /dev/null
+++ b/Program.cs
@@ -0,0 +1,316 @@
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using DiscordRPC;
+using YoutubeExplode;
+using YoutubeExplode.Videos;
+
+namespace YouTubeMusicDiscordRPC
+{
+ class Program
+ {
+ private static DiscordRpcClient discordClient;
+ private static YoutubeClient youtubeClient;
+ private static string currentVideoId = "";
+ private static MusicInfo currentMusicInfo;
+ private const string CLIENT_ID = "1415069890766704700";
+
+ static async Task Main(string[] args)
+ {
+ Console.Title = "YouTube Music Discord RPC";
+ Console.WriteLine("🎵 Rich Presence YouTube Music pour Discord");
+ Console.WriteLine("=============================================\n");
+
+ // Initialisation
+ InitializeDiscordRPC();
+ youtubeClient = new YoutubeClient();
+
+ Console.WriteLine("Instructions:");
+ Console.WriteLine("1. Ouvrez YouTube Music dans votre navigateur");
+ Console.WriteLine("2. Copiez l'URL de la musique en cours");
+ Console.WriteLine("3. Collez l'URL ici et appuyez sur Entrée");
+ Console.WriteLine("4. Tapez 'stop' pour arrêter");
+ Console.WriteLine("5. Tapez 'exit' pour quitter\n");
+
+ // Boucle principale
+ while (true)
+ {
+ Console.ForegroundColor = ConsoleColor.Cyan;
+ Console.Write("🎵 Collez l'URL YouTube Music: ");
+ Console.ResetColor();
+
+ string input = Console.ReadLine()?.Trim();
+
+ if (string.IsNullOrEmpty(input))
+ continue;
+
+ if (input.Equals("exit", StringComparison.OrdinalIgnoreCase))
+ break;
+
+ if (input.Equals("stop", StringComparison.OrdinalIgnoreCase))
+ {
+ SetIdlePresence();
+ Console.WriteLine("❌ Rich Presence arrêté.");
+ continue;
+ }
+
+ if (input.Equals("clear", StringComparison.OrdinalIgnoreCase))
+ {
+ Console.Clear();
+ continue;
+ }
+
+ await ProcessYouTubeUrl(input);
+ }
+
+ Cleanup();
+ }
+
+ static void InitializeDiscordRPC()
+ {
+ discordClient = new DiscordRpcClient(CLIENT_ID);
+
+ discordClient.OnReady += (sender, e) =>
+ {
+ Console.ForegroundColor = ConsoleColor.Green;
+ Console.WriteLine($"\n✅ Connecté à Discord en tant que {e.User.Username}");
+ Console.ResetColor();
+ };
+
+ discordClient.OnError += (sender, e) =>
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.WriteLine($"\n❌ Erreur Discord: {e.Message}");
+ Console.ResetColor();
+ };
+
+ discordClient.OnConnectionFailed += (sender, e) =>
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.WriteLine($"\n❌ Connexion Discord échouée");
+ Console.ResetColor();
+ };
+
+ discordClient.Initialize();
+ SetIdlePresence();
+ }
+
+ static async Task ProcessYouTubeUrl(string url)
+ {
+ try
+ {
+ if (!url.Contains("youtube.com") && !url.Contains("youtu.be"))
+ {
+ Console.ForegroundColor = ConsoleColor.Yellow;
+ Console.WriteLine("⚠️ URL YouTube non valide");
+ Console.ResetColor();
+ return;
+ }
+
+ string videoId = ExtractVideoIdFromUrl(url);
+ if (string.IsNullOrEmpty(videoId))
+ {
+ Console.ForegroundColor = ConsoleColor.Yellow;
+ Console.WriteLine("⚠️ Impossible d'extraire l'ID de la vidéo");
+ Console.ResetColor();
+ return;
+ }
+
+ // Éviter de refaire la requête si c'est la même vidéo
+ if (videoId == currentVideoId && currentMusicInfo != null)
+ {
+ SetDiscordPresence(currentMusicInfo);
+ return;
+ }
+
+ Console.ForegroundColor = ConsoleColor.Blue;
+ Console.WriteLine("🔄 Récupération des informations de la musique...");
+ Console.ResetColor();
+
+ var video = await youtubeClient.Videos.GetAsync(videoId);
+
+ currentMusicInfo = new MusicInfo
+ {
+ VideoId = videoId,
+ Title = CleanTitle(video.Title),
+ Artist = video.Author.ChannelTitle,
+ Duration = video.Duration.HasValue ? (int)video.Duration.Value.TotalSeconds : 0,
+ ThumbnailUrl = GetThumbnailUrl(videoId),
+ Url = url
+ };
+
+ currentVideoId = videoId;
+
+ SetDiscordPresence(currentMusicInfo);
+
+ Console.ForegroundColor = ConsoleColor.Green;
+ Console.WriteLine($"\n✅ Musique mise à jour:");
+ Console.WriteLine($" Titre: {currentMusicInfo.Title}");
+ Console.WriteLine($" Artiste: {currentMusicInfo.Artist}");
+ Console.WriteLine($" Durée: {FormatTime(currentMusicInfo.Duration)}");
+ Console.ResetColor();
+
+ }
+ catch (Exception ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.WriteLine($"\n❌ Erreur: {ex.Message}");
+ Console.ResetColor();
+ SetErrorPresence();
+ }
+ }
+
+ static void SetDiscordPresence(MusicInfo musicInfo)
+ {
+ var presence = new RichPresence()
+ {
+ Details = $"{Truncate(musicInfo.Title, 128)}",
+ State = $"Par {Truncate(musicInfo.Artist, 128)}",
+ Timestamps = new Timestamps()
+ {
+ Start = DateTime.UtcNow
+ },
+ Assets = new Assets()
+ {
+ LargeImageKey = musicInfo.ThumbnailUrl,
+ LargeImageText = $"YouTube Music - {FormatTime(musicInfo.Duration)}",
+ SmallImageKey = "music_icon",
+ SmallImageText = "En lecture sur YouTube Music"
+ },
+ Buttons = new Button[]
+ {
+ new Button()
+ {
+ Label = "Écouter sur YouTube Music",
+ Url = musicInfo.Url
+ }
+ }
+ };
+
+ discordClient.SetPresence(presence);
+ }
+
+ static void SetIdlePresence()
+ {
+ var presence = new RichPresence()
+ {
+ Details = "Aucune musique en cours",
+ State = "En attente sur YouTube Music",
+ Assets = new Assets()
+ {
+ LargeImageKey = "youtube_music",
+ LargeImageText = "YouTube Music",
+ SmallImageKey = "idle",
+ SmallImageText = "En attente"
+ }
+ };
+
+ discordClient.SetPresence(presence);
+ currentVideoId = "";
+ currentMusicInfo = null;
+ }
+
+ static void SetErrorPresence()
+ {
+ var presence = new RichPresence()
+ {
+ Details = "Erreur de lecture",
+ State = "Vérifiez l'URL YouTube Music",
+ Assets = new Assets()
+ {
+ LargeImageKey = "error",
+ LargeImageText = "Erreur",
+ SmallImageKey = "warning",
+ SmallImageText = "Problème détecté"
+ }
+ };
+
+ discordClient.SetPresence(presence);
+ }
+
+ // Méthodes utilitaires
+ static string ExtractVideoIdFromUrl(string url)
+ {
+ try
+ {
+ if (url.Contains("youtu.be/"))
+ {
+ return url.Split(new[] { "youtu.be/" }, StringSplitOptions.None)[1].Split('?')[0];
+ }
+ else if (url.Contains("v="))
+ {
+ var uri = new Uri(url);
+ var query = System.Web.HttpUtility.ParseQueryString(uri.Query);
+ return query["v"];
+ }
+ else if (url.Contains("youtube.com/watch/"))
+ {
+ return url.Split(new[] { "watch/" }, StringSplitOptions.None)[1].Split('?')[0];
+ }
+ }
+ catch
+ {
+ return null;
+ }
+ return null;
+ }
+
+ static string GetThumbnailUrl(string videoId)
+ {
+ // Format standard des thumbnails YouTube
+ return $"https://img.youtube.com/vi/{videoId}/maxresdefault.jpg";
+ }
+
+ static string CleanTitle(string title)
+ {
+ // Nettoyer le titre des tags communs
+ string[] toRemove = {
+ "(Official Video)", "(Official Music Video)", "[Official Video]",
+ "(Official Audio)", "[Official Audio]", "(Lyrics)", "[Lyrics]",
+ "(Lyric Video)", "[Lyric Video]", "| Official Video", "| Official Audio",
+ "(Official HD Video)", "[HD]", "(HD)", "| HD", "(4K)", "[4K]", "| 4K",
+ "(Clean Version)", "[Clean]", "(Explicit)", "[Explicit]"
+ };
+
+ foreach (var tag in toRemove)
+ {
+ title = title.Replace(tag, "");
+ }
+
+ return title.Trim(' ', '-', '|', '"', '\'');
+ }
+
+ static string FormatTime(int seconds)
+ {
+ if (seconds <= 0) return "0:00";
+
+ TimeSpan time = TimeSpan.FromSeconds(seconds);
+ return $"{(int)time.TotalMinutes}:{time.Seconds:00}";
+ }
+
+ static string Truncate(string value, int maxLength)
+ {
+ if (string.IsNullOrEmpty(value)) return value;
+ return value.Length <= maxLength ? value : value.Substring(0, maxLength - 3) + "...";
+ }
+
+ static void Cleanup()
+ {
+ Console.WriteLine("\n🛑 Arrêt du Rich Presence...");
+ discordClient?.ClearPresence();
+ discordClient?.Dispose();
+ Console.WriteLine("✅ Application arrêtée. Appuyez sur une touche pour fermer...");
+ Console.ReadKey();
+ }
+ }
+
+ public class MusicInfo
+ {
+ public string VideoId { get; set; }
+ public string Title { get; set; }
+ public string Artist { get; set; }
+ public int Duration { get; set; }
+ public string ThumbnailUrl { get; set; }
+ public string Url { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/TERMS.md b/TERMS.md
new file mode 100644
index 0000000..105facb
--- /dev/null
+++ b/TERMS.md
@@ -0,0 +1,98 @@
+# Terms and Conditions
+
+**Last updated:** October 05, 2025
+
+Please read these Terms and Conditions carefully before using the Meio application ("the Service") developed by nodeSoftwares ("the Organization", "We", "Us", or "Our").
+
+---
+
+## 1. Definitions
+
+- **Application**: The software program named "Meio" provided by the Organization for use on any device.
+- **Service**: The Application.
+- **You**: The individual using the Service.
+- **Third-party Services**: External services or APIs (e.g., Spotify, YouTube) used to provide music content.
+- **Application Store**: Platforms such as Google Play or Apple App Store from which the Application is downloaded.
+- **Device**: Any device used to access the Service, such as a phone, tablet, or computer.
+
+---
+
+## 2. Acknowledgment
+
+By using the Service, You agree to be bound by these Terms and Conditions. If You do not agree with any part of the Terms, then You may not use the Service.
+
+The Service is provided free of charge and does not include any paid subscriptions or in-app purchases.
+
+---
+
+## 3. Use of Third-Party APIs
+
+The Application uses APIs provided by third-party music streaming services (such as Spotify, YouTube, or others) to access and stream publicly available content.
+
+We do not host, store, or distribute any media content. All music and metadata is served directly by these third-party services, and You are responsible for complying with their respective terms and conditions.
+
+The Organization is not affiliated with, endorsed by, or sponsored by any of these third-party services.
+
+---
+
+## 4. No Data Collection
+
+The Service does not collect, store, or transmit any personal data. No account creation, login, or personal data input is required to use the Application.
+
+However, third-party services accessed through the Application may collect data in accordance with their own privacy policies.
+
+---
+
+## 5. Links to Other Websites
+
+The Service may contain links to or display content from third-party websites or services. The Organization has no control over and assumes no responsibility for the content, privacy policies, or practices of any third-party services.
+
+We advise You to review the terms and conditions and privacy policies of any third-party services You interact with.
+
+---
+
+## 6. Limitation of Liability
+
+To the fullest extent permitted by applicable law, the Organization shall not be held liable for any indirect, incidental, special, or consequential damages arising from the use of the Service or third-party services accessed through it.
+
+Because the Service is provided free of charge, Our total liability to You shall be limited to zero (0) USD.
+
+---
+
+## 7. "AS IS" and "AS AVAILABLE" Disclaimer
+
+The Service is provided "AS IS" and "AS AVAILABLE" without warranties of any kind. We make no guarantees that the Service will be uninterrupted, secure, or error-free, or that it will meet Your expectations.
+
+---
+
+## 8. Governing Law
+
+These Terms are governed by the laws of France, excluding its conflict of law rules. Your use of the Application may also be subject to other local, state, national, or international laws.
+
+---
+
+## 9. Dispute Resolution
+
+If You have any concern or dispute about the Service, You agree to first try to resolve it informally by contacting the Organization.
+
+---
+
+## 10. Severability and Waiver
+
+If any provision of these Terms is held to be unenforceable, the remaining provisions will remain in effect. No waiver of any term shall be deemed a further or continuing waiver of such term or any other term.
+
+---
+
+## 11. Changes to These Terms
+
+We reserve the right to modify or replace these Terms at any time. If changes are material, We will provide reasonable notice before they take effect.
+
+By continuing to use the Service after changes are made, You agree to be bound by the revised Terms. If You do not agree, please discontinue use of the Service.
+
+---
+
+## 12. Contact Us
+
+If You have any questions about these Terms and Conditions, You can contact us:
+
+- On Matrix: [@selkii:matrix.org](https://matrix.to/#/@selkii:matrix.org)
diff --git a/bin/Debug/net6.0/Discord.Net.Commands.dll b/bin/Debug/net6.0/Discord.Net.Commands.dll
new file mode 100644
index 0000000..8dd9f23
Binary files /dev/null and b/bin/Debug/net6.0/Discord.Net.Commands.dll differ
diff --git a/bin/Debug/net6.0/Discord.Net.Core.dll b/bin/Debug/net6.0/Discord.Net.Core.dll
new file mode 100644
index 0000000..dcc52e7
Binary files /dev/null and b/bin/Debug/net6.0/Discord.Net.Core.dll differ
diff --git a/bin/Debug/net6.0/Discord.Net.Interactions.dll b/bin/Debug/net6.0/Discord.Net.Interactions.dll
new file mode 100644
index 0000000..6828953
Binary files /dev/null and b/bin/Debug/net6.0/Discord.Net.Interactions.dll differ
diff --git a/bin/Debug/net6.0/Discord.Net.Rest.dll b/bin/Debug/net6.0/Discord.Net.Rest.dll
new file mode 100644
index 0000000..c59645a
Binary files /dev/null and b/bin/Debug/net6.0/Discord.Net.Rest.dll differ
diff --git a/bin/Debug/net6.0/Discord.Net.WebSocket.dll b/bin/Debug/net6.0/Discord.Net.WebSocket.dll
new file mode 100644
index 0000000..f313634
Binary files /dev/null and b/bin/Debug/net6.0/Discord.Net.WebSocket.dll differ
diff --git a/bin/Debug/net6.0/Discord.Net.Webhook.dll b/bin/Debug/net6.0/Discord.Net.Webhook.dll
new file mode 100644
index 0000000..32e1d95
Binary files /dev/null and b/bin/Debug/net6.0/Discord.Net.Webhook.dll differ
diff --git a/bin/Debug/net6.0/DiscordRPC.dll b/bin/Debug/net6.0/DiscordRPC.dll
new file mode 100644
index 0000000..4efbf2b
Binary files /dev/null and b/bin/Debug/net6.0/DiscordRPC.dll differ
diff --git a/bin/Debug/net6.0/Meio b/bin/Debug/net6.0/Meio
new file mode 100644
index 0000000..82a97fd
Binary files /dev/null and b/bin/Debug/net6.0/Meio differ
diff --git a/bin/Debug/net6.0/Meio.deps.json b/bin/Debug/net6.0/Meio.deps.json
new file mode 100644
index 0000000..62e16d0
--- /dev/null
+++ b/bin/Debug/net6.0/Meio.deps.json
@@ -0,0 +1,350 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v6.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v6.0": {
+ "Meio/1.0.0": {
+ "dependencies": {
+ "Discord.Net": "3.15.2",
+ "DiscordRichPresence": "1.6.1.70"
+ },
+ "runtime": {
+ "Meio.dll": {}
+ }
+ },
+ "Discord.Net/3.15.2": {
+ "dependencies": {
+ "Discord.Net.Commands": "3.15.2",
+ "Discord.Net.Core": "3.15.2",
+ "Discord.Net.Interactions": "3.15.2",
+ "Discord.Net.Rest": "3.15.2",
+ "Discord.Net.WebSocket": "3.15.2",
+ "Discord.Net.Webhook": "3.15.2"
+ }
+ },
+ "Discord.Net.Commands/3.15.2": {
+ "dependencies": {
+ "Discord.Net.Core": "3.15.2"
+ },
+ "runtime": {
+ "lib/net6.0/Discord.Net.Commands.dll": {
+ "assemblyVersion": "3.15.2.0",
+ "fileVersion": "3.15.2.0"
+ }
+ }
+ },
+ "Discord.Net.Core/3.15.2": {
+ "dependencies": {
+ "Newtonsoft.Json": "13.0.3",
+ "System.Collections.Immutable": "6.0.0",
+ "System.Interactive.Async": "6.0.1",
+ "System.ValueTuple": "4.5.0"
+ },
+ "runtime": {
+ "lib/net6.0/Discord.Net.Core.dll": {
+ "assemblyVersion": "3.15.2.0",
+ "fileVersion": "3.15.2.0"
+ }
+ }
+ },
+ "Discord.Net.Interactions/3.15.2": {
+ "dependencies": {
+ "Discord.Net.Core": "3.15.2",
+ "Discord.Net.Rest": "3.15.2",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0",
+ "System.Collections.Immutable": "6.0.0",
+ "System.Reactive": "6.0.0"
+ },
+ "runtime": {
+ "lib/net6.0/Discord.Net.Interactions.dll": {
+ "assemblyVersion": "3.15.2.0",
+ "fileVersion": "3.15.2.0"
+ }
+ }
+ },
+ "Discord.Net.Rest/3.15.2": {
+ "dependencies": {
+ "Discord.Net.Core": "3.15.2"
+ },
+ "runtime": {
+ "lib/net6.0/Discord.Net.Rest.dll": {
+ "assemblyVersion": "3.15.2.0",
+ "fileVersion": "3.15.2.0"
+ }
+ }
+ },
+ "Discord.Net.Webhook/3.15.2": {
+ "dependencies": {
+ "Discord.Net.Core": "3.15.2",
+ "Discord.Net.Rest": "3.15.2"
+ },
+ "runtime": {
+ "lib/net6.0/Discord.Net.Webhook.dll": {
+ "assemblyVersion": "3.15.2.0",
+ "fileVersion": "3.15.2.0"
+ }
+ }
+ },
+ "Discord.Net.WebSocket/3.15.2": {
+ "dependencies": {
+ "Discord.Net.Core": "3.15.2",
+ "Discord.Net.Rest": "3.15.2"
+ },
+ "runtime": {
+ "lib/net6.0/Discord.Net.WebSocket.dll": {
+ "assemblyVersion": "3.15.2.0",
+ "fileVersion": "3.15.2.0"
+ }
+ }
+ },
+ "DiscordRichPresence/1.6.1.70": {
+ "dependencies": {
+ "Microsoft.Win32.Registry": "4.5.0",
+ "Newtonsoft.Json": "13.0.3"
+ },
+ "runtime": {
+ "lib/netstandard2.0/DiscordRPC.dll": {
+ "assemblyVersion": "1.6.1.70",
+ "fileVersion": "1.6.1.70"
+ }
+ }
+ },
+ "Microsoft.Bcl.AsyncInterfaces/6.0.0": {
+ "runtime": {
+ "lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll": {
+ "assemblyVersion": "6.0.0.0",
+ "fileVersion": "6.0.21.52210"
+ }
+ }
+ },
+ "Microsoft.Extensions.DependencyInjection.Abstractions/6.0.0": {
+ "runtime": {
+ "lib/net6.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
+ "assemblyVersion": "6.0.0.0",
+ "fileVersion": "6.0.21.52210"
+ }
+ }
+ },
+ "Microsoft.NETCore.Platforms/2.0.0": {},
+ "Microsoft.Win32.Registry/4.5.0": {
+ "dependencies": {
+ "System.Security.AccessControl": "4.5.0",
+ "System.Security.Principal.Windows": "4.5.0"
+ }
+ },
+ "Newtonsoft.Json/13.0.3": {
+ "runtime": {
+ "lib/net6.0/Newtonsoft.Json.dll": {
+ "assemblyVersion": "13.0.0.0",
+ "fileVersion": "13.0.3.27908"
+ }
+ }
+ },
+ "System.Collections.Immutable/6.0.0": {
+ "dependencies": {
+ "System.Runtime.CompilerServices.Unsafe": "6.0.0"
+ }
+ },
+ "System.Interactive.Async/6.0.1": {
+ "dependencies": {
+ "System.Linq.Async": "6.0.1"
+ },
+ "runtime": {
+ "lib/net6.0/System.Interactive.Async.dll": {
+ "assemblyVersion": "6.0.0.0",
+ "fileVersion": "6.0.1.35981"
+ }
+ }
+ },
+ "System.Linq.Async/6.0.1": {
+ "dependencies": {
+ "Microsoft.Bcl.AsyncInterfaces": "6.0.0"
+ },
+ "runtime": {
+ "lib/net6.0/System.Linq.Async.dll": {
+ "assemblyVersion": "6.0.0.0",
+ "fileVersion": "6.0.1.35981"
+ }
+ }
+ },
+ "System.Reactive/6.0.0": {
+ "runtime": {
+ "lib/net6.0/System.Reactive.dll": {
+ "assemblyVersion": "6.0.0.0",
+ "fileVersion": "6.0.0.1"
+ }
+ }
+ },
+ "System.Runtime.CompilerServices.Unsafe/6.0.0": {},
+ "System.Security.AccessControl/4.5.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "2.0.0",
+ "System.Security.Principal.Windows": "4.5.0"
+ }
+ },
+ "System.Security.Principal.Windows/4.5.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "2.0.0"
+ }
+ },
+ "System.ValueTuple/4.5.0": {}
+ }
+ },
+ "libraries": {
+ "Meio/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Discord.Net/3.15.2": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-+OwnSHaAJdKRLd8CVqSrlANX3EupQ5w5Vej2zor+wVcJ0ek7M3bZFzjJvXqx6cXeU6TQPBy6vpopzOwA2TU2Xg==",
+ "path": "discord.net/3.15.2",
+ "hashPath": "discord.net.3.15.2.nupkg.sha512"
+ },
+ "Discord.Net.Commands/3.15.2": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-a55wlniMT0kr7w8h/zlpR3slBeA07qJaqOnuB/X7Kp8W7aOYD3le0+uMKu7Er2ypvysa8MMRMNRpn94OSqbA6w==",
+ "path": "discord.net.commands/3.15.2",
+ "hashPath": "discord.net.commands.3.15.2.nupkg.sha512"
+ },
+ "Discord.Net.Core/3.15.2": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-985EAMCn8K9gS8WUAt+hF96nEvnbHGb8mqCFpxS1EO74MpgIZRk3DLHQeHhpEpX1R/NR/YdOvfw0aM/4bl3DGw==",
+ "path": "discord.net.core/3.15.2",
+ "hashPath": "discord.net.core.3.15.2.nupkg.sha512"
+ },
+ "Discord.Net.Interactions/3.15.2": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-w2ar8ga1mntK9gD/0zwV7m/9cQliah0C4KCweG+TXTljJTU9GLxXDBBGpMfo2jE2P5FSVS48gLGd5y6G+fxoKQ==",
+ "path": "discord.net.interactions/3.15.2",
+ "hashPath": "discord.net.interactions.3.15.2.nupkg.sha512"
+ },
+ "Discord.Net.Rest/3.15.2": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-P+SuiwjN1zBo9DMqgxIzlKNNZKaD47CfJyqlkbOtJUmfWhA9BDrmCgo/DSE+FTJAWEjiLO4rcQ8XEx/qDbkphg==",
+ "path": "discord.net.rest/3.15.2",
+ "hashPath": "discord.net.rest.3.15.2.nupkg.sha512"
+ },
+ "Discord.Net.Webhook/3.15.2": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-L14uU+rXa1ERqpl5K4xFERCM0LaSgWVBuTLJqt15pps0gsmEISr52NxZ1F9dcysi8YFfUSlREnJ+ih/PomJ8+g==",
+ "path": "discord.net.webhook/3.15.2",
+ "hashPath": "discord.net.webhook.3.15.2.nupkg.sha512"
+ },
+ "Discord.Net.WebSocket/3.15.2": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-OmaDEPrqmW69dzKxvOKFioFunZYpP0dwrECa0pJn9RaDUQo86l/ToUjolUJ3imjJ2XaMKcRwJ95D5QfDe4KXXg==",
+ "path": "discord.net.websocket/3.15.2",
+ "hashPath": "discord.net.websocket.3.15.2.nupkg.sha512"
+ },
+ "DiscordRichPresence/1.6.1.70": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-yho1fdhbsedICHdfHe/Tu3IX6a5oj4fiPFL0keZStlsh7T/FrdjcwZZ7C1uC2HUvcXbFh+VEJvcbo1W66QtkUg==",
+ "path": "discordrichpresence/1.6.1.70",
+ "hashPath": "discordrichpresence.1.6.1.70.nupkg.sha512"
+ },
+ "Microsoft.Bcl.AsyncInterfaces/6.0.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==",
+ "path": "microsoft.bcl.asyncinterfaces/6.0.0",
+ "hashPath": "microsoft.bcl.asyncinterfaces.6.0.0.nupkg.sha512"
+ },
+ "Microsoft.Extensions.DependencyInjection.Abstractions/6.0.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==",
+ "path": "microsoft.extensions.dependencyinjection.abstractions/6.0.0",
+ "hashPath": "microsoft.extensions.dependencyinjection.abstractions.6.0.0.nupkg.sha512"
+ },
+ "Microsoft.NETCore.Platforms/2.0.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-VdLJOCXhZaEMY7Hm2GKiULmn7IEPFE4XC5LPSfBVCUIA8YLZVh846gtfBJalsPQF2PlzdD7ecX7DZEulJ402ZQ==",
+ "path": "microsoft.netcore.platforms/2.0.0",
+ "hashPath": "microsoft.netcore.platforms.2.0.0.nupkg.sha512"
+ },
+ "Microsoft.Win32.Registry/4.5.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-+FWlwd//+Tt56316p00hVePBCouXyEzT86Jb3+AuRotTND0IYn0OO3obs1gnQEs/txEnt+rF2JBGLItTG+Be6A==",
+ "path": "microsoft.win32.registry/4.5.0",
+ "hashPath": "microsoft.win32.registry.4.5.0.nupkg.sha512"
+ },
+ "Newtonsoft.Json/13.0.3": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==",
+ "path": "newtonsoft.json/13.0.3",
+ "hashPath": "newtonsoft.json.13.0.3.nupkg.sha512"
+ },
+ "System.Collections.Immutable/6.0.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-l4zZJ1WU2hqpQQHXz1rvC3etVZN+2DLmQMO79FhOTZHMn8tDRr+WU287sbomD0BETlmKDn0ygUgVy9k5xkkJdA==",
+ "path": "system.collections.immutable/6.0.0",
+ "hashPath": "system.collections.immutable.6.0.0.nupkg.sha512"
+ },
+ "System.Interactive.Async/6.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-f8H1O4ZWDQo344y5NQU76G4SIjWMuKDVXL9OM1dg6K5YZnLkc8iCdQDybBvMcC6ufk61jzXGVAX6UCDu0qDSjA==",
+ "path": "system.interactive.async/6.0.1",
+ "hashPath": "system.interactive.async.6.0.1.nupkg.sha512"
+ },
+ "System.Linq.Async/6.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-0YhHcaroWpQ9UCot3Pizah7ryAzQhNvobLMSxeDIGmnXfkQn8u5owvpOH0K6EVB+z9L7u6Cc4W17Br/+jyttEQ==",
+ "path": "system.linq.async/6.0.1",
+ "hashPath": "system.linq.async.6.0.1.nupkg.sha512"
+ },
+ "System.Reactive/6.0.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-31kfaW4ZupZzPsI5PVe77VhnvFF55qgma7KZr/E0iFTs6fmdhhG8j0mgEx620iLTey1EynOkEfnyTjtNEpJzGw==",
+ "path": "system.reactive/6.0.0",
+ "hashPath": "system.reactive.6.0.0.nupkg.sha512"
+ },
+ "System.Runtime.CompilerServices.Unsafe/6.0.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==",
+ "path": "system.runtime.compilerservices.unsafe/6.0.0",
+ "hashPath": "system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512"
+ },
+ "System.Security.AccessControl/4.5.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-vW8Eoq0TMyz5vAG/6ce483x/CP83fgm4SJe5P8Tb1tZaobcvPrbMEL7rhH1DRdrYbbb6F0vq3OlzmK0Pkwks5A==",
+ "path": "system.security.accesscontrol/4.5.0",
+ "hashPath": "system.security.accesscontrol.4.5.0.nupkg.sha512"
+ },
+ "System.Security.Principal.Windows/4.5.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-U77HfRXlZlOeIXd//Yoj6Jnk8AXlbeisf1oq1os+hxOGVnuG+lGSfGqTwTZBoORFF6j/0q7HXIl8cqwQ9aUGqQ==",
+ "path": "system.security.principal.windows/4.5.0",
+ "hashPath": "system.security.principal.windows.4.5.0.nupkg.sha512"
+ },
+ "System.ValueTuple/4.5.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==",
+ "path": "system.valuetuple/4.5.0",
+ "hashPath": "system.valuetuple.4.5.0.nupkg.sha512"
+ }
+ }
+}
\ No newline at end of file
diff --git a/bin/Debug/net6.0/Meio.dll b/bin/Debug/net6.0/Meio.dll
new file mode 100644
index 0000000..c3f7668
Binary files /dev/null and b/bin/Debug/net6.0/Meio.dll differ
diff --git a/bin/Debug/net6.0/Meio.pdb b/bin/Debug/net6.0/Meio.pdb
new file mode 100644
index 0000000..06148ee
Binary files /dev/null and b/bin/Debug/net6.0/Meio.pdb differ
diff --git a/bin/Debug/net6.0/Meio.runtimeconfig.json b/bin/Debug/net6.0/Meio.runtimeconfig.json
new file mode 100644
index 0000000..4986d16
--- /dev/null
+++ b/bin/Debug/net6.0/Meio.runtimeconfig.json
@@ -0,0 +1,9 @@
+{
+ "runtimeOptions": {
+ "tfm": "net6.0",
+ "framework": {
+ "name": "Microsoft.NETCore.App",
+ "version": "6.0.0"
+ }
+ }
+}
\ No newline at end of file
diff --git a/bin/Debug/net6.0/Microsoft.Bcl.AsyncInterfaces.dll b/bin/Debug/net6.0/Microsoft.Bcl.AsyncInterfaces.dll
new file mode 100644
index 0000000..fe6ba4c
Binary files /dev/null and b/bin/Debug/net6.0/Microsoft.Bcl.AsyncInterfaces.dll differ
diff --git a/bin/Debug/net6.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll b/bin/Debug/net6.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll
new file mode 100644
index 0000000..b4ee93d
Binary files /dev/null and b/bin/Debug/net6.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll differ
diff --git a/bin/Debug/net6.0/Newtonsoft.Json.dll b/bin/Debug/net6.0/Newtonsoft.Json.dll
new file mode 100644
index 0000000..d035c38
Binary files /dev/null and b/bin/Debug/net6.0/Newtonsoft.Json.dll differ
diff --git a/bin/Debug/net6.0/System.Interactive.Async.dll b/bin/Debug/net6.0/System.Interactive.Async.dll
new file mode 100644
index 0000000..f7c93ae
Binary files /dev/null and b/bin/Debug/net6.0/System.Interactive.Async.dll differ
diff --git a/bin/Debug/net6.0/System.Linq.Async.dll b/bin/Debug/net6.0/System.Linq.Async.dll
new file mode 100644
index 0000000..7ae9527
Binary files /dev/null and b/bin/Debug/net6.0/System.Linq.Async.dll differ
diff --git a/bin/Debug/net6.0/System.Reactive.dll b/bin/Debug/net6.0/System.Reactive.dll
new file mode 100644
index 0000000..f179765
Binary files /dev/null and b/bin/Debug/net6.0/System.Reactive.dll differ
diff --git a/bin/Debug/net8.0/AngleSharp.dll b/bin/Debug/net8.0/AngleSharp.dll
new file mode 100644
index 0000000..348e1b3
Binary files /dev/null and b/bin/Debug/net8.0/AngleSharp.dll differ
diff --git a/bin/Debug/net8.0/CliWrap.dll b/bin/Debug/net8.0/CliWrap.dll
new file mode 100644
index 0000000..86e8c1d
Binary files /dev/null and b/bin/Debug/net8.0/CliWrap.dll differ
diff --git a/bin/Debug/net8.0/DiscordRPC.dll b/bin/Debug/net8.0/DiscordRPC.dll
new file mode 100644
index 0000000..4efbf2b
Binary files /dev/null and b/bin/Debug/net8.0/DiscordRPC.dll differ
diff --git a/bin/Debug/net8.0/Meio b/bin/Debug/net8.0/Meio
new file mode 100644
index 0000000..18f8231
Binary files /dev/null and b/bin/Debug/net8.0/Meio differ
diff --git a/bin/Debug/net8.0/Meio.deps.json b/bin/Debug/net8.0/Meio.deps.json
new file mode 100644
index 0000000..d496fe0
--- /dev/null
+++ b/bin/Debug/net8.0/Meio.deps.json
@@ -0,0 +1,239 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "Meio/1.0.0": {
+ "dependencies": {
+ "CliWrap": "3.9.0",
+ "DiscordRichPresence": "1.6.1.70",
+ "YoutubeExplode": "6.5.4"
+ },
+ "runtime": {
+ "Meio.dll": {}
+ }
+ },
+ "AngleSharp/1.2.0": {
+ "runtime": {
+ "lib/net8.0/AngleSharp.dll": {
+ "assemblyVersion": "1.2.0.0",
+ "fileVersion": "1.2.0.0"
+ }
+ }
+ },
+ "CliWrap/3.9.0": {
+ "runtime": {
+ "lib/net8.0/CliWrap.dll": {
+ "assemblyVersion": "3.9.0.0",
+ "fileVersion": "3.9.0.0"
+ }
+ }
+ },
+ "DiscordRichPresence/1.6.1.70": {
+ "dependencies": {
+ "Microsoft.Win32.Registry": "4.5.0",
+ "Newtonsoft.Json": "13.0.1"
+ },
+ "runtime": {
+ "lib/netstandard2.0/DiscordRPC.dll": {
+ "assemblyVersion": "1.6.1.70",
+ "fileVersion": "1.6.1.70"
+ }
+ }
+ },
+ "Microsoft.Bcl.AsyncInterfaces/9.0.1": {
+ "runtime": {
+ "lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll": {
+ "assemblyVersion": "9.0.0.1",
+ "fileVersion": "9.0.124.61010"
+ }
+ }
+ },
+ "Microsoft.NETCore.Platforms/2.0.0": {},
+ "Microsoft.Win32.Registry/4.5.0": {
+ "dependencies": {
+ "System.Security.AccessControl": "4.5.0",
+ "System.Security.Principal.Windows": "4.5.0"
+ }
+ },
+ "Newtonsoft.Json/13.0.1": {
+ "runtime": {
+ "lib/netstandard2.0/Newtonsoft.Json.dll": {
+ "assemblyVersion": "13.0.0.0",
+ "fileVersion": "13.0.1.25517"
+ }
+ }
+ },
+ "System.IO.Pipelines/9.0.1": {
+ "runtime": {
+ "lib/net8.0/System.IO.Pipelines.dll": {
+ "assemblyVersion": "9.0.0.0",
+ "fileVersion": "9.0.124.61010"
+ }
+ }
+ },
+ "System.Security.AccessControl/4.5.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "2.0.0",
+ "System.Security.Principal.Windows": "4.5.0"
+ }
+ },
+ "System.Security.Principal.Windows/4.5.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "2.0.0"
+ }
+ },
+ "System.Text.Encodings.Web/9.0.1": {
+ "runtime": {
+ "lib/net8.0/System.Text.Encodings.Web.dll": {
+ "assemblyVersion": "9.0.0.0",
+ "fileVersion": "9.0.124.61010"
+ }
+ },
+ "runtimeTargets": {
+ "runtimes/browser/lib/net8.0/System.Text.Encodings.Web.dll": {
+ "rid": "browser",
+ "assetType": "runtime",
+ "assemblyVersion": "9.0.0.0",
+ "fileVersion": "9.0.124.61010"
+ }
+ }
+ },
+ "System.Text.Json/9.0.1": {
+ "dependencies": {
+ "System.IO.Pipelines": "9.0.1",
+ "System.Text.Encodings.Web": "9.0.1"
+ },
+ "runtime": {
+ "lib/net8.0/System.Text.Json.dll": {
+ "assemblyVersion": "9.0.0.0",
+ "fileVersion": "9.0.124.61010"
+ }
+ }
+ },
+ "System.Threading.Tasks.Extensions/4.6.0": {},
+ "YoutubeExplode/6.5.4": {
+ "dependencies": {
+ "AngleSharp": "1.2.0",
+ "Microsoft.Bcl.AsyncInterfaces": "9.0.1",
+ "System.Text.Json": "9.0.1",
+ "System.Threading.Tasks.Extensions": "4.6.0"
+ },
+ "runtime": {
+ "lib/netstandard2.0/YoutubeExplode.dll": {
+ "assemblyVersion": "6.5.4.0",
+ "fileVersion": "6.5.4.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Meio/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "AngleSharp/1.2.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-uF/PzSCVcb+b2nqVvHZbOqexoJ9R6QLjonugPf0PQl+0h7YKaFZeXyspctbHe5HGlx7/Iuk5BErtk+t63ac/ZA==",
+ "path": "anglesharp/1.2.0",
+ "hashPath": "anglesharp.1.2.0.nupkg.sha512"
+ },
+ "CliWrap/3.9.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-3IpuZUbTsWhgD3jhd5mKK7VVyVu/LhfsHXUlYrAOV8mZkJCTasum8Klgv7wyMIl5tttwUralTuTQzCNDLicMRw==",
+ "path": "cliwrap/3.9.0",
+ "hashPath": "cliwrap.3.9.0.nupkg.sha512"
+ },
+ "DiscordRichPresence/1.6.1.70": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-yho1fdhbsedICHdfHe/Tu3IX6a5oj4fiPFL0keZStlsh7T/FrdjcwZZ7C1uC2HUvcXbFh+VEJvcbo1W66QtkUg==",
+ "path": "discordrichpresence/1.6.1.70",
+ "hashPath": "discordrichpresence.1.6.1.70.nupkg.sha512"
+ },
+ "Microsoft.Bcl.AsyncInterfaces/9.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-IVkmUqf+KzbuXKrxi2tyQlg11RArYk26t2eU5cHekff+7Ao09vH8vt8idC0BJSMnpiRV2OK66zM2EwJU6Tm5Cw==",
+ "path": "microsoft.bcl.asyncinterfaces/9.0.1",
+ "hashPath": "microsoft.bcl.asyncinterfaces.9.0.1.nupkg.sha512"
+ },
+ "Microsoft.NETCore.Platforms/2.0.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-VdLJOCXhZaEMY7Hm2GKiULmn7IEPFE4XC5LPSfBVCUIA8YLZVh846gtfBJalsPQF2PlzdD7ecX7DZEulJ402ZQ==",
+ "path": "microsoft.netcore.platforms/2.0.0",
+ "hashPath": "microsoft.netcore.platforms.2.0.0.nupkg.sha512"
+ },
+ "Microsoft.Win32.Registry/4.5.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-+FWlwd//+Tt56316p00hVePBCouXyEzT86Jb3+AuRotTND0IYn0OO3obs1gnQEs/txEnt+rF2JBGLItTG+Be6A==",
+ "path": "microsoft.win32.registry/4.5.0",
+ "hashPath": "microsoft.win32.registry.4.5.0.nupkg.sha512"
+ },
+ "Newtonsoft.Json/13.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==",
+ "path": "newtonsoft.json/13.0.1",
+ "hashPath": "newtonsoft.json.13.0.1.nupkg.sha512"
+ },
+ "System.IO.Pipelines/9.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-uXf5o8eV/gtzDQY4lGROLFMWQvcViKcF8o4Q6KpIOjloAQXrnscQSu6gTxYJMHuNJnh7szIF9AzkaEq+zDLoEg==",
+ "path": "system.io.pipelines/9.0.1",
+ "hashPath": "system.io.pipelines.9.0.1.nupkg.sha512"
+ },
+ "System.Security.AccessControl/4.5.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-vW8Eoq0TMyz5vAG/6ce483x/CP83fgm4SJe5P8Tb1tZaobcvPrbMEL7rhH1DRdrYbbb6F0vq3OlzmK0Pkwks5A==",
+ "path": "system.security.accesscontrol/4.5.0",
+ "hashPath": "system.security.accesscontrol.4.5.0.nupkg.sha512"
+ },
+ "System.Security.Principal.Windows/4.5.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-U77HfRXlZlOeIXd//Yoj6Jnk8AXlbeisf1oq1os+hxOGVnuG+lGSfGqTwTZBoORFF6j/0q7HXIl8cqwQ9aUGqQ==",
+ "path": "system.security.principal.windows/4.5.0",
+ "hashPath": "system.security.principal.windows.4.5.0.nupkg.sha512"
+ },
+ "System.Text.Encodings.Web/9.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-XkspqduP2t1e1x2vBUAD/xZ5ZDvmywuUwsmB93MvyQLospJfqtX0GsR/kU0vUL2h4kmvf777z3txV2W4NrQ9Qg==",
+ "path": "system.text.encodings.web/9.0.1",
+ "hashPath": "system.text.encodings.web.9.0.1.nupkg.sha512"
+ },
+ "System.Text.Json/9.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-eqWHDZqYPv1PvuvoIIx5pF74plL3iEOZOl/0kQP+Y0TEbtgNnM2W6k8h8EPYs+LTJZsXuWa92n5W5sHTWvE3VA==",
+ "path": "system.text.json/9.0.1",
+ "hashPath": "system.text.json.9.0.1.nupkg.sha512"
+ },
+ "System.Threading.Tasks.Extensions/4.6.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-I5G6Y8jb0xRtGUC9Lahy7FUvlYlnGMMkbuKAQBy8Jb7Y6Yn8OlBEiUOY0PqZ0hy6Ua8poVA1ui1tAIiXNxGdsg==",
+ "path": "system.threading.tasks.extensions/4.6.0",
+ "hashPath": "system.threading.tasks.extensions.4.6.0.nupkg.sha512"
+ },
+ "YoutubeExplode/6.5.4": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-SWMvvvC/xEjkDEnQW28xeBXn0mgB7tsNtXvtcMpxYioyVuUWzsx94oWVQgUZIaT+Zbmvj03LaKIwK9mTGKMZQg==",
+ "path": "youtubeexplode/6.5.4",
+ "hashPath": "youtubeexplode.6.5.4.nupkg.sha512"
+ }
+ }
+}
\ No newline at end of file
diff --git a/bin/Debug/net8.0/Meio.dll b/bin/Debug/net8.0/Meio.dll
new file mode 100644
index 0000000..c7f22ad
Binary files /dev/null and b/bin/Debug/net8.0/Meio.dll differ
diff --git a/bin/Debug/net8.0/Meio.pdb b/bin/Debug/net8.0/Meio.pdb
new file mode 100644
index 0000000..f057740
Binary files /dev/null and b/bin/Debug/net8.0/Meio.pdb differ
diff --git a/bin/Debug/net8.0/Meio.runtimeconfig.json b/bin/Debug/net8.0/Meio.runtimeconfig.json
new file mode 100644
index 0000000..becfaea
--- /dev/null
+++ b/bin/Debug/net8.0/Meio.runtimeconfig.json
@@ -0,0 +1,12 @@
+{
+ "runtimeOptions": {
+ "tfm": "net8.0",
+ "framework": {
+ "name": "Microsoft.NETCore.App",
+ "version": "8.0.0"
+ },
+ "configProperties": {
+ "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/bin/Debug/net8.0/Microsoft.Bcl.AsyncInterfaces.dll b/bin/Debug/net8.0/Microsoft.Bcl.AsyncInterfaces.dll
new file mode 100644
index 0000000..4aea70d
Binary files /dev/null and b/bin/Debug/net8.0/Microsoft.Bcl.AsyncInterfaces.dll differ
diff --git a/bin/Debug/net8.0/Newtonsoft.Json.dll b/bin/Debug/net8.0/Newtonsoft.Json.dll
new file mode 100644
index 0000000..1ffeabe
Binary files /dev/null and b/bin/Debug/net8.0/Newtonsoft.Json.dll differ
diff --git a/bin/Debug/net8.0/System.IO.Pipelines.dll b/bin/Debug/net8.0/System.IO.Pipelines.dll
new file mode 100644
index 0000000..9e10d5f
Binary files /dev/null and b/bin/Debug/net8.0/System.IO.Pipelines.dll differ
diff --git a/bin/Debug/net8.0/System.Text.Encodings.Web.dll b/bin/Debug/net8.0/System.Text.Encodings.Web.dll
new file mode 100644
index 0000000..230d2a6
Binary files /dev/null and b/bin/Debug/net8.0/System.Text.Encodings.Web.dll differ
diff --git a/bin/Debug/net8.0/System.Text.Json.dll b/bin/Debug/net8.0/System.Text.Json.dll
new file mode 100644
index 0000000..5e855de
Binary files /dev/null and b/bin/Debug/net8.0/System.Text.Json.dll differ
diff --git a/bin/Debug/net8.0/YoutubeExplode.dll b/bin/Debug/net8.0/YoutubeExplode.dll
new file mode 100644
index 0000000..4f0e967
Binary files /dev/null and b/bin/Debug/net8.0/YoutubeExplode.dll differ
diff --git a/bin/Debug/net8.0/runtimes/browser/lib/net8.0/System.Text.Encodings.Web.dll b/bin/Debug/net8.0/runtimes/browser/lib/net8.0/System.Text.Encodings.Web.dll
new file mode 100644
index 0000000..faef332
Binary files /dev/null and b/bin/Debug/net8.0/runtimes/browser/lib/net8.0/System.Text.Encodings.Web.dll differ
diff --git a/config.json b/config.json
new file mode 100644
index 0000000..4016e3a
--- /dev/null
+++ b/config.json
@@ -0,0 +1,6 @@
+{
+ "DiscordClientId": "1415069890766704700",
+ "UpdateInterval": 3000,
+ "ChromeExtensionPort": 1337,
+ "CachePath": "%LocalAppData%\\YouTubeMusicRPC"
+}
\ No newline at end of file
diff --git a/obj/Debug/net6.0/Meio.AssemblyInfo.cs b/obj/Debug/net6.0/Meio.AssemblyInfo.cs
new file mode 100644
index 0000000..07f5600
--- /dev/null
+++ b/obj/Debug/net6.0/Meio.AssemblyInfo.cs
@@ -0,0 +1,22 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+using System;
+using System.Reflection;
+
+[assembly: System.Reflection.AssemblyCompanyAttribute("Meio")]
+[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
+[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
+[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+9999e02221e87353f3ed994d910179d768a69e7d")]
+[assembly: System.Reflection.AssemblyProductAttribute("Meio")]
+[assembly: System.Reflection.AssemblyTitleAttribute("Meio")]
+[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
+
+// Généré par la classe MSBuild WriteCodeFragment.
+
diff --git a/obj/Debug/net6.0/Meio.AssemblyInfoInputs.cache b/obj/Debug/net6.0/Meio.AssemblyInfoInputs.cache
new file mode 100644
index 0000000..f17ce6e
--- /dev/null
+++ b/obj/Debug/net6.0/Meio.AssemblyInfoInputs.cache
@@ -0,0 +1 @@
+8dcb6832f0a97466de70520dfacbd3033bfbdbf1a91f70efac7de8e5ab03b5ec
diff --git a/obj/Debug/net6.0/Meio.GeneratedMSBuildEditorConfig.editorconfig b/obj/Debug/net6.0/Meio.GeneratedMSBuildEditorConfig.editorconfig
new file mode 100644
index 0000000..bf9f3c6
--- /dev/null
+++ b/obj/Debug/net6.0/Meio.GeneratedMSBuildEditorConfig.editorconfig
@@ -0,0 +1,13 @@
+is_global = true
+build_property.TargetFramework = net6.0
+build_property.TargetPlatformMinVersion =
+build_property.UsingMicrosoftNETSdkWeb =
+build_property.ProjectTypeGuids =
+build_property.InvariantGlobalization =
+build_property.PlatformNeutralAssembly =
+build_property.EnforceExtendedAnalyzerRules =
+build_property._SupportedPlatformList = Linux,macOS,Windows
+build_property.RootNamespace = Meio
+build_property.ProjectDir = /home/kali/RiderProjects/Meio/
+build_property.EnableComHosting =
+build_property.EnableGeneratedComInterfaceComImportInterop =
diff --git a/obj/Debug/net6.0/Meio.GlobalUsings.g.cs b/obj/Debug/net6.0/Meio.GlobalUsings.g.cs
new file mode 100644
index 0000000..8578f3d
--- /dev/null
+++ b/obj/Debug/net6.0/Meio.GlobalUsings.g.cs
@@ -0,0 +1,8 @@
+//
+global using global::System;
+global using global::System.Collections.Generic;
+global using global::System.IO;
+global using global::System.Linq;
+global using global::System.Net.Http;
+global using global::System.Threading;
+global using global::System.Threading.Tasks;
diff --git a/obj/Debug/net6.0/Meio.assets.cache b/obj/Debug/net6.0/Meio.assets.cache
new file mode 100644
index 0000000..e24fdb5
Binary files /dev/null and b/obj/Debug/net6.0/Meio.assets.cache differ
diff --git a/obj/Debug/net6.0/Meio.csproj.AssemblyReference.cache b/obj/Debug/net6.0/Meio.csproj.AssemblyReference.cache
new file mode 100644
index 0000000..9cfa0b6
Binary files /dev/null and b/obj/Debug/net6.0/Meio.csproj.AssemblyReference.cache differ
diff --git a/obj/Debug/net6.0/Meio.csproj.CoreCompileInputs.cache b/obj/Debug/net6.0/Meio.csproj.CoreCompileInputs.cache
new file mode 100644
index 0000000..9666cbb
--- /dev/null
+++ b/obj/Debug/net6.0/Meio.csproj.CoreCompileInputs.cache
@@ -0,0 +1 @@
+a091a2e80b8286b0f648eaf2d1250ee6c2d217d68b7d6870c96c57f678f7206c
diff --git a/obj/Debug/net6.0/Meio.csproj.FileListAbsolute.txt b/obj/Debug/net6.0/Meio.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..a546b2b
--- /dev/null
+++ b/obj/Debug/net6.0/Meio.csproj.FileListAbsolute.txt
@@ -0,0 +1,30 @@
+/home/kali/RiderProjects/Meio/obj/Debug/net6.0/Meio.csproj.AssemblyReference.cache
+/home/kali/RiderProjects/Meio/obj/Debug/net6.0/Meio.GeneratedMSBuildEditorConfig.editorconfig
+/home/kali/RiderProjects/Meio/obj/Debug/net6.0/Meio.AssemblyInfoInputs.cache
+/home/kali/RiderProjects/Meio/obj/Debug/net6.0/Meio.AssemblyInfo.cs
+/home/kali/RiderProjects/Meio/obj/Debug/net6.0/Meio.csproj.CoreCompileInputs.cache
+/home/kali/RiderProjects/Meio/obj/Debug/net6.0/Meio.sourcelink.json
+/home/kali/RiderProjects/Meio/bin/Debug/net6.0/Meio
+/home/kali/RiderProjects/Meio/bin/Debug/net6.0/Meio.deps.json
+/home/kali/RiderProjects/Meio/bin/Debug/net6.0/Meio.runtimeconfig.json
+/home/kali/RiderProjects/Meio/bin/Debug/net6.0/Meio.dll
+/home/kali/RiderProjects/Meio/bin/Debug/net6.0/Meio.pdb
+/home/kali/RiderProjects/Meio/bin/Debug/net6.0/DiscordRPC.dll
+/home/kali/RiderProjects/Meio/bin/Debug/net6.0/Newtonsoft.Json.dll
+/home/kali/RiderProjects/Meio/obj/Debug/net6.0/Meio.csproj.Up2Date
+/home/kali/RiderProjects/Meio/obj/Debug/net6.0/Meio.dll
+/home/kali/RiderProjects/Meio/obj/Debug/net6.0/refint/Meio.dll
+/home/kali/RiderProjects/Meio/obj/Debug/net6.0/Meio.pdb
+/home/kali/RiderProjects/Meio/obj/Debug/net6.0/Meio.genruntimeconfig.cache
+/home/kali/RiderProjects/Meio/obj/Debug/net6.0/ref/Meio.dll
+/home/kali/RiderProjects/Meio/bin/Debug/net6.0/Discord.Net.Commands.dll
+/home/kali/RiderProjects/Meio/bin/Debug/net6.0/Discord.Net.Core.dll
+/home/kali/RiderProjects/Meio/bin/Debug/net6.0/Discord.Net.Interactions.dll
+/home/kali/RiderProjects/Meio/bin/Debug/net6.0/Discord.Net.Rest.dll
+/home/kali/RiderProjects/Meio/bin/Debug/net6.0/Discord.Net.Webhook.dll
+/home/kali/RiderProjects/Meio/bin/Debug/net6.0/Discord.Net.WebSocket.dll
+/home/kali/RiderProjects/Meio/bin/Debug/net6.0/Microsoft.Bcl.AsyncInterfaces.dll
+/home/kali/RiderProjects/Meio/bin/Debug/net6.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll
+/home/kali/RiderProjects/Meio/bin/Debug/net6.0/System.Interactive.Async.dll
+/home/kali/RiderProjects/Meio/bin/Debug/net6.0/System.Linq.Async.dll
+/home/kali/RiderProjects/Meio/bin/Debug/net6.0/System.Reactive.dll
diff --git a/obj/Debug/net6.0/Meio.csproj.Up2Date b/obj/Debug/net6.0/Meio.csproj.Up2Date
new file mode 100644
index 0000000..e69de29
diff --git a/obj/Debug/net6.0/Meio.dll b/obj/Debug/net6.0/Meio.dll
new file mode 100644
index 0000000..c3f7668
Binary files /dev/null and b/obj/Debug/net6.0/Meio.dll differ
diff --git a/obj/Debug/net6.0/Meio.genruntimeconfig.cache b/obj/Debug/net6.0/Meio.genruntimeconfig.cache
new file mode 100644
index 0000000..77782fb
--- /dev/null
+++ b/obj/Debug/net6.0/Meio.genruntimeconfig.cache
@@ -0,0 +1 @@
+faf85bda597aead77055e2d3dd2d4615302bc7862e64113106b2853e7a75d41e
diff --git a/obj/Debug/net6.0/Meio.pdb b/obj/Debug/net6.0/Meio.pdb
new file mode 100644
index 0000000..06148ee
Binary files /dev/null and b/obj/Debug/net6.0/Meio.pdb differ
diff --git a/obj/Debug/net6.0/Meio.sourcelink.json b/obj/Debug/net6.0/Meio.sourcelink.json
new file mode 100644
index 0000000..51aacdd
--- /dev/null
+++ b/obj/Debug/net6.0/Meio.sourcelink.json
@@ -0,0 +1 @@
+{"documents":{"/home/kali/RiderProjects/Meio/*":"https://raw.githubusercontent.com/nodeSoftwares/Meio/9999e02221e87353f3ed994d910179d768a69e7d/*"}}
\ No newline at end of file
diff --git a/obj/Debug/net6.0/apphost b/obj/Debug/net6.0/apphost
new file mode 100644
index 0000000..82a97fd
Binary files /dev/null and b/obj/Debug/net6.0/apphost differ
diff --git a/obj/Debug/net6.0/ref/Meio.dll b/obj/Debug/net6.0/ref/Meio.dll
new file mode 100644
index 0000000..12f59c9
Binary files /dev/null and b/obj/Debug/net6.0/ref/Meio.dll differ
diff --git a/obj/Debug/net6.0/refint/Meio.dll b/obj/Debug/net6.0/refint/Meio.dll
new file mode 100644
index 0000000..12f59c9
Binary files /dev/null and b/obj/Debug/net6.0/refint/Meio.dll differ
diff --git a/obj/Debug/net8.0/Meio.AssemblyInfo.cs b/obj/Debug/net8.0/Meio.AssemblyInfo.cs
new file mode 100644
index 0000000..07f5600
--- /dev/null
+++ b/obj/Debug/net8.0/Meio.AssemblyInfo.cs
@@ -0,0 +1,22 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+using System;
+using System.Reflection;
+
+[assembly: System.Reflection.AssemblyCompanyAttribute("Meio")]
+[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
+[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
+[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+9999e02221e87353f3ed994d910179d768a69e7d")]
+[assembly: System.Reflection.AssemblyProductAttribute("Meio")]
+[assembly: System.Reflection.AssemblyTitleAttribute("Meio")]
+[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
+
+// Généré par la classe MSBuild WriteCodeFragment.
+
diff --git a/obj/Debug/net8.0/Meio.AssemblyInfoInputs.cache b/obj/Debug/net8.0/Meio.AssemblyInfoInputs.cache
new file mode 100644
index 0000000..f17ce6e
--- /dev/null
+++ b/obj/Debug/net8.0/Meio.AssemblyInfoInputs.cache
@@ -0,0 +1 @@
+8dcb6832f0a97466de70520dfacbd3033bfbdbf1a91f70efac7de8e5ab03b5ec
diff --git a/obj/Debug/net8.0/Meio.GeneratedMSBuildEditorConfig.editorconfig b/obj/Debug/net8.0/Meio.GeneratedMSBuildEditorConfig.editorconfig
new file mode 100644
index 0000000..51d8734
--- /dev/null
+++ b/obj/Debug/net8.0/Meio.GeneratedMSBuildEditorConfig.editorconfig
@@ -0,0 +1,13 @@
+is_global = true
+build_property.TargetFramework = net8.0
+build_property.TargetPlatformMinVersion =
+build_property.UsingMicrosoftNETSdkWeb =
+build_property.ProjectTypeGuids =
+build_property.InvariantGlobalization =
+build_property.PlatformNeutralAssembly =
+build_property.EnforceExtendedAnalyzerRules =
+build_property._SupportedPlatformList = Linux,macOS,Windows
+build_property.RootNamespace = Meio
+build_property.ProjectDir = /home/kali/RiderProjects/Meio/
+build_property.EnableComHosting =
+build_property.EnableGeneratedComInterfaceComImportInterop =
diff --git a/obj/Debug/net8.0/Meio.GlobalUsings.g.cs b/obj/Debug/net8.0/Meio.GlobalUsings.g.cs
new file mode 100644
index 0000000..8578f3d
--- /dev/null
+++ b/obj/Debug/net8.0/Meio.GlobalUsings.g.cs
@@ -0,0 +1,8 @@
+//
+global using global::System;
+global using global::System.Collections.Generic;
+global using global::System.IO;
+global using global::System.Linq;
+global using global::System.Net.Http;
+global using global::System.Threading;
+global using global::System.Threading.Tasks;
diff --git a/obj/Debug/net8.0/Meio.assets.cache b/obj/Debug/net8.0/Meio.assets.cache
new file mode 100644
index 0000000..ff62abd
Binary files /dev/null and b/obj/Debug/net8.0/Meio.assets.cache differ
diff --git a/obj/Debug/net8.0/Meio.csproj.AssemblyReference.cache b/obj/Debug/net8.0/Meio.csproj.AssemblyReference.cache
new file mode 100644
index 0000000..960fd4d
Binary files /dev/null and b/obj/Debug/net8.0/Meio.csproj.AssemblyReference.cache differ
diff --git a/obj/Debug/net8.0/Meio.csproj.CoreCompileInputs.cache b/obj/Debug/net8.0/Meio.csproj.CoreCompileInputs.cache
new file mode 100644
index 0000000..b705f6d
--- /dev/null
+++ b/obj/Debug/net8.0/Meio.csproj.CoreCompileInputs.cache
@@ -0,0 +1 @@
+82f7d49270fd59941dab35f86554c82dc0f68dfaf721369a425409d1adee0a13
diff --git a/obj/Debug/net8.0/Meio.csproj.FileListAbsolute.txt b/obj/Debug/net8.0/Meio.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..530e816
--- /dev/null
+++ b/obj/Debug/net8.0/Meio.csproj.FileListAbsolute.txt
@@ -0,0 +1,27 @@
+/home/kali/RiderProjects/Meio/obj/Debug/net8.0/Meio.csproj.AssemblyReference.cache
+/home/kali/RiderProjects/Meio/obj/Debug/net8.0/Meio.GeneratedMSBuildEditorConfig.editorconfig
+/home/kali/RiderProjects/Meio/obj/Debug/net8.0/Meio.AssemblyInfoInputs.cache
+/home/kali/RiderProjects/Meio/obj/Debug/net8.0/Meio.AssemblyInfo.cs
+/home/kali/RiderProjects/Meio/obj/Debug/net8.0/Meio.csproj.CoreCompileInputs.cache
+/home/kali/RiderProjects/Meio/obj/Debug/net8.0/Meio.sourcelink.json
+/home/kali/RiderProjects/Meio/bin/Debug/net8.0/Meio
+/home/kali/RiderProjects/Meio/bin/Debug/net8.0/Meio.deps.json
+/home/kali/RiderProjects/Meio/bin/Debug/net8.0/Meio.runtimeconfig.json
+/home/kali/RiderProjects/Meio/bin/Debug/net8.0/Meio.dll
+/home/kali/RiderProjects/Meio/bin/Debug/net8.0/Meio.pdb
+/home/kali/RiderProjects/Meio/bin/Debug/net8.0/AngleSharp.dll
+/home/kali/RiderProjects/Meio/bin/Debug/net8.0/CliWrap.dll
+/home/kali/RiderProjects/Meio/bin/Debug/net8.0/DiscordRPC.dll
+/home/kali/RiderProjects/Meio/bin/Debug/net8.0/Microsoft.Bcl.AsyncInterfaces.dll
+/home/kali/RiderProjects/Meio/bin/Debug/net8.0/Newtonsoft.Json.dll
+/home/kali/RiderProjects/Meio/bin/Debug/net8.0/System.IO.Pipelines.dll
+/home/kali/RiderProjects/Meio/bin/Debug/net8.0/System.Text.Encodings.Web.dll
+/home/kali/RiderProjects/Meio/bin/Debug/net8.0/System.Text.Json.dll
+/home/kali/RiderProjects/Meio/bin/Debug/net8.0/YoutubeExplode.dll
+/home/kali/RiderProjects/Meio/bin/Debug/net8.0/runtimes/browser/lib/net8.0/System.Text.Encodings.Web.dll
+/home/kali/RiderProjects/Meio/obj/Debug/net8.0/Meio.csproj.Up2Date
+/home/kali/RiderProjects/Meio/obj/Debug/net8.0/Meio.dll
+/home/kali/RiderProjects/Meio/obj/Debug/net8.0/refint/Meio.dll
+/home/kali/RiderProjects/Meio/obj/Debug/net8.0/Meio.pdb
+/home/kali/RiderProjects/Meio/obj/Debug/net8.0/Meio.genruntimeconfig.cache
+/home/kali/RiderProjects/Meio/obj/Debug/net8.0/ref/Meio.dll
diff --git a/obj/Debug/net8.0/Meio.csproj.Up2Date b/obj/Debug/net8.0/Meio.csproj.Up2Date
new file mode 100644
index 0000000..e69de29
diff --git a/obj/Debug/net8.0/Meio.dll b/obj/Debug/net8.0/Meio.dll
new file mode 100644
index 0000000..c7f22ad
Binary files /dev/null and b/obj/Debug/net8.0/Meio.dll differ
diff --git a/obj/Debug/net8.0/Meio.genruntimeconfig.cache b/obj/Debug/net8.0/Meio.genruntimeconfig.cache
new file mode 100644
index 0000000..b63e6aa
--- /dev/null
+++ b/obj/Debug/net8.0/Meio.genruntimeconfig.cache
@@ -0,0 +1 @@
+e151954bd8edb324d54105aa0d6d2e0bb3631bc692d8191d82e570732398022c
diff --git a/obj/Debug/net8.0/Meio.pdb b/obj/Debug/net8.0/Meio.pdb
new file mode 100644
index 0000000..f057740
Binary files /dev/null and b/obj/Debug/net8.0/Meio.pdb differ
diff --git a/obj/Debug/net8.0/Meio.sourcelink.json b/obj/Debug/net8.0/Meio.sourcelink.json
new file mode 100644
index 0000000..51aacdd
--- /dev/null
+++ b/obj/Debug/net8.0/Meio.sourcelink.json
@@ -0,0 +1 @@
+{"documents":{"/home/kali/RiderProjects/Meio/*":"https://raw.githubusercontent.com/nodeSoftwares/Meio/9999e02221e87353f3ed994d910179d768a69e7d/*"}}
\ No newline at end of file
diff --git a/obj/Debug/net8.0/apphost b/obj/Debug/net8.0/apphost
new file mode 100644
index 0000000..18f8231
Binary files /dev/null and b/obj/Debug/net8.0/apphost differ
diff --git a/obj/Debug/net8.0/ref/Meio.dll b/obj/Debug/net8.0/ref/Meio.dll
new file mode 100644
index 0000000..61cbecc
Binary files /dev/null and b/obj/Debug/net8.0/ref/Meio.dll differ
diff --git a/obj/Debug/net8.0/refint/Meio.dll b/obj/Debug/net8.0/refint/Meio.dll
new file mode 100644
index 0000000..61cbecc
Binary files /dev/null and b/obj/Debug/net8.0/refint/Meio.dll differ
diff --git a/obj/Meio.csproj.nuget.dgspec.json b/obj/Meio.csproj.nuget.dgspec.json
new file mode 100644
index 0000000..c7b6efd
--- /dev/null
+++ b/obj/Meio.csproj.nuget.dgspec.json
@@ -0,0 +1,86 @@
+{
+ "format": 1,
+ "restore": {
+ "/home/kali/RiderProjects/Meio/Meio.csproj": {}
+ },
+ "projects": {
+ "/home/kali/RiderProjects/Meio/Meio.csproj": {
+ "version": "1.0.0",
+ "restore": {
+ "projectUniqueName": "/home/kali/RiderProjects/Meio/Meio.csproj",
+ "projectName": "Meio",
+ "projectPath": "/home/kali/RiderProjects/Meio/Meio.csproj",
+ "packagesPath": "/home/kali/.nuget/packages/",
+ "outputPath": "/home/kali/RiderProjects/Meio/obj/",
+ "projectStyle": "PackageReference",
+ "configFilePaths": [
+ "/home/kali/.nuget/NuGet/NuGet.Config"
+ ],
+ "originalTargetFrameworks": [
+ "net8.0"
+ ],
+ "sources": {
+ "https://api.nuget.org/v3/index.json": {}
+ },
+ "frameworks": {
+ "net8.0": {
+ "targetAlias": "net8.0",
+ "projectReferences": {}
+ }
+ },
+ "warningProperties": {
+ "warnAsError": [
+ "NU1605"
+ ]
+ },
+ "restoreAuditProperties": {
+ "enableAudit": "true",
+ "auditLevel": "low",
+ "auditMode": "direct"
+ }
+ },
+ "frameworks": {
+ "net8.0": {
+ "targetAlias": "net8.0",
+ "dependencies": {
+ "CliWrap": {
+ "target": "Package",
+ "version": "[3.9.0, )"
+ },
+ "DiscordRichPresence": {
+ "target": "Package",
+ "version": "[1.6.1.70, )"
+ },
+ "YoutubeExplode": {
+ "target": "Package",
+ "version": "[6.5.4, )"
+ }
+ },
+ "imports": [
+ "net461",
+ "net462",
+ "net47",
+ "net471",
+ "net472",
+ "net48",
+ "net481"
+ ],
+ "assetTargetFallback": true,
+ "warn": true,
+ "downloadDependencies": [
+ {
+ "name": "Microsoft.AspNetCore.App.Ref",
+ "version": "[8.0.19, 8.0.19]"
+ }
+ ],
+ "frameworkReferences": {
+ "Microsoft.NETCore.App": {
+ "privateAssets": "all"
+ }
+ },
+ "runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/8.0.413/PortableRuntimeIdentifierGraph.json"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/obj/Meio.csproj.nuget.g.props b/obj/Meio.csproj.nuget.g.props
new file mode 100644
index 0000000..6e44910
--- /dev/null
+++ b/obj/Meio.csproj.nuget.g.props
@@ -0,0 +1,15 @@
+
+
+
+ True
+ NuGet
+ $(MSBuildThisFileDirectory)project.assets.json
+ /home/kali/.nuget/packages/
+ /home/kali/.nuget/packages/
+ PackageReference
+ 6.11.1
+
+
+
+
+
\ No newline at end of file
diff --git a/obj/Meio.csproj.nuget.g.targets b/obj/Meio.csproj.nuget.g.targets
new file mode 100644
index 0000000..a446183
--- /dev/null
+++ b/obj/Meio.csproj.nuget.g.targets
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/obj/project.assets.json b/obj/project.assets.json
new file mode 100644
index 0000000..d43318c
--- /dev/null
+++ b/obj/project.assets.json
@@ -0,0 +1,763 @@
+{
+ "version": 3,
+ "targets": {
+ "net8.0": {
+ "AngleSharp/1.2.0": {
+ "type": "package",
+ "compile": {
+ "lib/net8.0/AngleSharp.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/net8.0/AngleSharp.dll": {
+ "related": ".xml"
+ }
+ }
+ },
+ "CliWrap/3.9.0": {
+ "type": "package",
+ "compile": {
+ "lib/net8.0/CliWrap.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/net8.0/CliWrap.dll": {
+ "related": ".xml"
+ }
+ }
+ },
+ "DiscordRichPresence/1.6.1.70": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.Win32.Registry": "4.5.0",
+ "Newtonsoft.Json": "13.0.1"
+ },
+ "compile": {
+ "lib/netstandard2.0/DiscordRPC.dll": {
+ "related": ".pdb;.xml"
+ }
+ },
+ "runtime": {
+ "lib/netstandard2.0/DiscordRPC.dll": {
+ "related": ".pdb;.xml"
+ }
+ }
+ },
+ "Microsoft.Bcl.AsyncInterfaces/9.0.1": {
+ "type": "package",
+ "compile": {
+ "lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll": {
+ "related": ".xml"
+ }
+ },
+ "build": {
+ "buildTransitive/net8.0/_._": {}
+ }
+ },
+ "Microsoft.NETCore.Platforms/2.0.0": {
+ "type": "package",
+ "compile": {
+ "lib/netstandard1.0/_._": {}
+ },
+ "runtime": {
+ "lib/netstandard1.0/_._": {}
+ }
+ },
+ "Microsoft.Win32.Registry/4.5.0": {
+ "type": "package",
+ "dependencies": {
+ "System.Security.AccessControl": "4.5.0",
+ "System.Security.Principal.Windows": "4.5.0"
+ },
+ "compile": {
+ "ref/netstandard2.0/Microsoft.Win32.Registry.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/netstandard2.0/Microsoft.Win32.Registry.dll": {}
+ },
+ "runtimeTargets": {
+ "runtimes/unix/lib/netstandard2.0/Microsoft.Win32.Registry.dll": {
+ "assetType": "runtime",
+ "rid": "unix"
+ },
+ "runtimes/win/lib/netstandard2.0/Microsoft.Win32.Registry.dll": {
+ "assetType": "runtime",
+ "rid": "win"
+ }
+ }
+ },
+ "Newtonsoft.Json/13.0.1": {
+ "type": "package",
+ "compile": {
+ "lib/netstandard2.0/Newtonsoft.Json.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/netstandard2.0/Newtonsoft.Json.dll": {
+ "related": ".xml"
+ }
+ }
+ },
+ "System.IO.Pipelines/9.0.1": {
+ "type": "package",
+ "compile": {
+ "lib/net8.0/System.IO.Pipelines.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/net8.0/System.IO.Pipelines.dll": {
+ "related": ".xml"
+ }
+ },
+ "build": {
+ "buildTransitive/net8.0/_._": {}
+ }
+ },
+ "System.Security.AccessControl/4.5.0": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "2.0.0",
+ "System.Security.Principal.Windows": "4.5.0"
+ },
+ "compile": {
+ "ref/netstandard2.0/System.Security.AccessControl.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/netstandard2.0/System.Security.AccessControl.dll": {}
+ },
+ "runtimeTargets": {
+ "runtimes/win/lib/netcoreapp2.0/System.Security.AccessControl.dll": {
+ "assetType": "runtime",
+ "rid": "win"
+ }
+ }
+ },
+ "System.Security.Principal.Windows/4.5.0": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "2.0.0"
+ },
+ "compile": {
+ "ref/netstandard2.0/System.Security.Principal.Windows.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/netstandard2.0/System.Security.Principal.Windows.dll": {}
+ },
+ "runtimeTargets": {
+ "runtimes/unix/lib/netcoreapp2.0/System.Security.Principal.Windows.dll": {
+ "assetType": "runtime",
+ "rid": "unix"
+ },
+ "runtimes/win/lib/netcoreapp2.0/System.Security.Principal.Windows.dll": {
+ "assetType": "runtime",
+ "rid": "win"
+ }
+ }
+ },
+ "System.Text.Encodings.Web/9.0.1": {
+ "type": "package",
+ "compile": {
+ "lib/net8.0/System.Text.Encodings.Web.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/net8.0/System.Text.Encodings.Web.dll": {
+ "related": ".xml"
+ }
+ },
+ "build": {
+ "buildTransitive/net8.0/_._": {}
+ },
+ "runtimeTargets": {
+ "runtimes/browser/lib/net8.0/System.Text.Encodings.Web.dll": {
+ "assetType": "runtime",
+ "rid": "browser"
+ }
+ }
+ },
+ "System.Text.Json/9.0.1": {
+ "type": "package",
+ "dependencies": {
+ "System.IO.Pipelines": "9.0.1",
+ "System.Text.Encodings.Web": "9.0.1"
+ },
+ "compile": {
+ "lib/net8.0/System.Text.Json.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/net8.0/System.Text.Json.dll": {
+ "related": ".xml"
+ }
+ },
+ "build": {
+ "buildTransitive/net8.0/System.Text.Json.targets": {}
+ }
+ },
+ "System.Threading.Tasks.Extensions/4.6.0": {
+ "type": "package",
+ "compile": {
+ "lib/netcoreapp2.1/_._": {}
+ },
+ "runtime": {
+ "lib/netcoreapp2.1/_._": {}
+ }
+ },
+ "YoutubeExplode/6.5.4": {
+ "type": "package",
+ "dependencies": {
+ "AngleSharp": "1.2.0",
+ "Microsoft.Bcl.AsyncInterfaces": "9.0.1",
+ "System.Text.Json": "9.0.1",
+ "System.Threading.Tasks.Extensions": "4.6.0"
+ },
+ "compile": {
+ "lib/netstandard2.0/YoutubeExplode.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/netstandard2.0/YoutubeExplode.dll": {
+ "related": ".xml"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "AngleSharp/1.2.0": {
+ "sha512": "uF/PzSCVcb+b2nqVvHZbOqexoJ9R6QLjonugPf0PQl+0h7YKaFZeXyspctbHe5HGlx7/Iuk5BErtk+t63ac/ZA==",
+ "type": "package",
+ "path": "anglesharp/1.2.0",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "README.md",
+ "anglesharp.1.2.0.nupkg.sha512",
+ "anglesharp.nuspec",
+ "lib/net462/AngleSharp.dll",
+ "lib/net462/AngleSharp.xml",
+ "lib/net472/AngleSharp.dll",
+ "lib/net472/AngleSharp.xml",
+ "lib/net6.0/AngleSharp.dll",
+ "lib/net6.0/AngleSharp.xml",
+ "lib/net7.0/AngleSharp.dll",
+ "lib/net7.0/AngleSharp.xml",
+ "lib/net8.0/AngleSharp.dll",
+ "lib/net8.0/AngleSharp.xml",
+ "lib/netstandard2.0/AngleSharp.dll",
+ "lib/netstandard2.0/AngleSharp.xml",
+ "logo.png"
+ ]
+ },
+ "CliWrap/3.9.0": {
+ "sha512": "3IpuZUbTsWhgD3jhd5mKK7VVyVu/LhfsHXUlYrAOV8mZkJCTasum8Klgv7wyMIl5tttwUralTuTQzCNDLicMRw==",
+ "type": "package",
+ "path": "cliwrap/3.9.0",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "cliwrap.3.9.0.nupkg.sha512",
+ "cliwrap.nuspec",
+ "favicon.png",
+ "lib/net8.0/CliWrap.dll",
+ "lib/net8.0/CliWrap.xml",
+ "lib/net9.0/CliWrap.dll",
+ "lib/net9.0/CliWrap.xml",
+ "lib/netstandard2.0/CliWrap.dll",
+ "lib/netstandard2.0/CliWrap.xml",
+ "lib/netstandard2.1/CliWrap.dll",
+ "lib/netstandard2.1/CliWrap.xml"
+ ]
+ },
+ "DiscordRichPresence/1.6.1.70": {
+ "sha512": "yho1fdhbsedICHdfHe/Tu3IX6a5oj4fiPFL0keZStlsh7T/FrdjcwZZ7C1uC2HUvcXbFh+VEJvcbo1W66QtkUg==",
+ "type": "package",
+ "path": "discordrichpresence/1.6.1.70",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "README.md",
+ "discordrichpresence.1.6.1.70.nupkg.sha512",
+ "discordrichpresence.nuspec",
+ "lib/net45/DiscordRPC.dll",
+ "lib/net45/DiscordRPC.pdb",
+ "lib/net45/DiscordRPC.xml",
+ "lib/net9.0/DiscordRPC.deps.json",
+ "lib/net9.0/DiscordRPC.dll",
+ "lib/net9.0/DiscordRPC.pdb",
+ "lib/net9.0/DiscordRPC.xml",
+ "lib/netstandard2.0/DiscordRPC.dll",
+ "lib/netstandard2.0/DiscordRPC.pdb",
+ "lib/netstandard2.0/DiscordRPC.xml"
+ ]
+ },
+ "Microsoft.Bcl.AsyncInterfaces/9.0.1": {
+ "sha512": "IVkmUqf+KzbuXKrxi2tyQlg11RArYk26t2eU5cHekff+7Ao09vH8vt8idC0BJSMnpiRV2OK66zM2EwJU6Tm5Cw==",
+ "type": "package",
+ "path": "microsoft.bcl.asyncinterfaces/9.0.1",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "Icon.png",
+ "LICENSE.TXT",
+ "PACKAGE.md",
+ "THIRD-PARTY-NOTICES.TXT",
+ "buildTransitive/net461/Microsoft.Bcl.AsyncInterfaces.targets",
+ "buildTransitive/net462/_._",
+ "buildTransitive/net8.0/_._",
+ "buildTransitive/netcoreapp2.0/Microsoft.Bcl.AsyncInterfaces.targets",
+ "lib/net462/Microsoft.Bcl.AsyncInterfaces.dll",
+ "lib/net462/Microsoft.Bcl.AsyncInterfaces.xml",
+ "lib/netstandard2.0/Microsoft.Bcl.AsyncInterfaces.dll",
+ "lib/netstandard2.0/Microsoft.Bcl.AsyncInterfaces.xml",
+ "lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll",
+ "lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.xml",
+ "microsoft.bcl.asyncinterfaces.9.0.1.nupkg.sha512",
+ "microsoft.bcl.asyncinterfaces.nuspec",
+ "useSharedDesignerContext.txt"
+ ]
+ },
+ "Microsoft.NETCore.Platforms/2.0.0": {
+ "sha512": "VdLJOCXhZaEMY7Hm2GKiULmn7IEPFE4XC5LPSfBVCUIA8YLZVh846gtfBJalsPQF2PlzdD7ecX7DZEulJ402ZQ==",
+ "type": "package",
+ "path": "microsoft.netcore.platforms/2.0.0",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "LICENSE.TXT",
+ "THIRD-PARTY-NOTICES.TXT",
+ "lib/netstandard1.0/_._",
+ "microsoft.netcore.platforms.2.0.0.nupkg.sha512",
+ "microsoft.netcore.platforms.nuspec",
+ "runtime.json",
+ "useSharedDesignerContext.txt",
+ "version.txt"
+ ]
+ },
+ "Microsoft.Win32.Registry/4.5.0": {
+ "sha512": "+FWlwd//+Tt56316p00hVePBCouXyEzT86Jb3+AuRotTND0IYn0OO3obs1gnQEs/txEnt+rF2JBGLItTG+Be6A==",
+ "type": "package",
+ "path": "microsoft.win32.registry/4.5.0",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "LICENSE.TXT",
+ "THIRD-PARTY-NOTICES.TXT",
+ "lib/net46/Microsoft.Win32.Registry.dll",
+ "lib/net461/Microsoft.Win32.Registry.dll",
+ "lib/netstandard1.3/Microsoft.Win32.Registry.dll",
+ "lib/netstandard2.0/Microsoft.Win32.Registry.dll",
+ "microsoft.win32.registry.4.5.0.nupkg.sha512",
+ "microsoft.win32.registry.nuspec",
+ "ref/net46/Microsoft.Win32.Registry.dll",
+ "ref/net461/Microsoft.Win32.Registry.dll",
+ "ref/net461/Microsoft.Win32.Registry.xml",
+ "ref/netstandard1.3/Microsoft.Win32.Registry.dll",
+ "ref/netstandard1.3/Microsoft.Win32.Registry.xml",
+ "ref/netstandard1.3/de/Microsoft.Win32.Registry.xml",
+ "ref/netstandard1.3/es/Microsoft.Win32.Registry.xml",
+ "ref/netstandard1.3/fr/Microsoft.Win32.Registry.xml",
+ "ref/netstandard1.3/it/Microsoft.Win32.Registry.xml",
+ "ref/netstandard1.3/ja/Microsoft.Win32.Registry.xml",
+ "ref/netstandard1.3/ko/Microsoft.Win32.Registry.xml",
+ "ref/netstandard1.3/ru/Microsoft.Win32.Registry.xml",
+ "ref/netstandard1.3/zh-hans/Microsoft.Win32.Registry.xml",
+ "ref/netstandard1.3/zh-hant/Microsoft.Win32.Registry.xml",
+ "ref/netstandard2.0/Microsoft.Win32.Registry.dll",
+ "ref/netstandard2.0/Microsoft.Win32.Registry.xml",
+ "runtimes/unix/lib/netstandard2.0/Microsoft.Win32.Registry.dll",
+ "runtimes/win/lib/net46/Microsoft.Win32.Registry.dll",
+ "runtimes/win/lib/net461/Microsoft.Win32.Registry.dll",
+ "runtimes/win/lib/netstandard1.3/Microsoft.Win32.Registry.dll",
+ "runtimes/win/lib/netstandard2.0/Microsoft.Win32.Registry.dll",
+ "useSharedDesignerContext.txt",
+ "version.txt"
+ ]
+ },
+ "Newtonsoft.Json/13.0.1": {
+ "sha512": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==",
+ "type": "package",
+ "path": "newtonsoft.json/13.0.1",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "LICENSE.md",
+ "lib/net20/Newtonsoft.Json.dll",
+ "lib/net20/Newtonsoft.Json.xml",
+ "lib/net35/Newtonsoft.Json.dll",
+ "lib/net35/Newtonsoft.Json.xml",
+ "lib/net40/Newtonsoft.Json.dll",
+ "lib/net40/Newtonsoft.Json.xml",
+ "lib/net45/Newtonsoft.Json.dll",
+ "lib/net45/Newtonsoft.Json.xml",
+ "lib/netstandard1.0/Newtonsoft.Json.dll",
+ "lib/netstandard1.0/Newtonsoft.Json.xml",
+ "lib/netstandard1.3/Newtonsoft.Json.dll",
+ "lib/netstandard1.3/Newtonsoft.Json.xml",
+ "lib/netstandard2.0/Newtonsoft.Json.dll",
+ "lib/netstandard2.0/Newtonsoft.Json.xml",
+ "newtonsoft.json.13.0.1.nupkg.sha512",
+ "newtonsoft.json.nuspec",
+ "packageIcon.png"
+ ]
+ },
+ "System.IO.Pipelines/9.0.1": {
+ "sha512": "uXf5o8eV/gtzDQY4lGROLFMWQvcViKcF8o4Q6KpIOjloAQXrnscQSu6gTxYJMHuNJnh7szIF9AzkaEq+zDLoEg==",
+ "type": "package",
+ "path": "system.io.pipelines/9.0.1",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "Icon.png",
+ "LICENSE.TXT",
+ "PACKAGE.md",
+ "THIRD-PARTY-NOTICES.TXT",
+ "buildTransitive/net461/System.IO.Pipelines.targets",
+ "buildTransitive/net462/_._",
+ "buildTransitive/net8.0/_._",
+ "buildTransitive/netcoreapp2.0/System.IO.Pipelines.targets",
+ "lib/net462/System.IO.Pipelines.dll",
+ "lib/net462/System.IO.Pipelines.xml",
+ "lib/net8.0/System.IO.Pipelines.dll",
+ "lib/net8.0/System.IO.Pipelines.xml",
+ "lib/net9.0/System.IO.Pipelines.dll",
+ "lib/net9.0/System.IO.Pipelines.xml",
+ "lib/netstandard2.0/System.IO.Pipelines.dll",
+ "lib/netstandard2.0/System.IO.Pipelines.xml",
+ "system.io.pipelines.9.0.1.nupkg.sha512",
+ "system.io.pipelines.nuspec",
+ "useSharedDesignerContext.txt"
+ ]
+ },
+ "System.Security.AccessControl/4.5.0": {
+ "sha512": "vW8Eoq0TMyz5vAG/6ce483x/CP83fgm4SJe5P8Tb1tZaobcvPrbMEL7rhH1DRdrYbbb6F0vq3OlzmK0Pkwks5A==",
+ "type": "package",
+ "path": "system.security.accesscontrol/4.5.0",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "LICENSE.TXT",
+ "THIRD-PARTY-NOTICES.TXT",
+ "lib/net46/System.Security.AccessControl.dll",
+ "lib/net461/System.Security.AccessControl.dll",
+ "lib/netstandard1.3/System.Security.AccessControl.dll",
+ "lib/netstandard2.0/System.Security.AccessControl.dll",
+ "lib/uap10.0.16299/_._",
+ "ref/net46/System.Security.AccessControl.dll",
+ "ref/net461/System.Security.AccessControl.dll",
+ "ref/net461/System.Security.AccessControl.xml",
+ "ref/netstandard1.3/System.Security.AccessControl.dll",
+ "ref/netstandard1.3/System.Security.AccessControl.xml",
+ "ref/netstandard1.3/de/System.Security.AccessControl.xml",
+ "ref/netstandard1.3/es/System.Security.AccessControl.xml",
+ "ref/netstandard1.3/fr/System.Security.AccessControl.xml",
+ "ref/netstandard1.3/it/System.Security.AccessControl.xml",
+ "ref/netstandard1.3/ja/System.Security.AccessControl.xml",
+ "ref/netstandard1.3/ko/System.Security.AccessControl.xml",
+ "ref/netstandard1.3/ru/System.Security.AccessControl.xml",
+ "ref/netstandard1.3/zh-hans/System.Security.AccessControl.xml",
+ "ref/netstandard1.3/zh-hant/System.Security.AccessControl.xml",
+ "ref/netstandard2.0/System.Security.AccessControl.dll",
+ "ref/netstandard2.0/System.Security.AccessControl.xml",
+ "ref/uap10.0.16299/_._",
+ "runtimes/win/lib/net46/System.Security.AccessControl.dll",
+ "runtimes/win/lib/net461/System.Security.AccessControl.dll",
+ "runtimes/win/lib/netcoreapp2.0/System.Security.AccessControl.dll",
+ "runtimes/win/lib/netstandard1.3/System.Security.AccessControl.dll",
+ "runtimes/win/lib/uap10.0.16299/_._",
+ "system.security.accesscontrol.4.5.0.nupkg.sha512",
+ "system.security.accesscontrol.nuspec",
+ "useSharedDesignerContext.txt",
+ "version.txt"
+ ]
+ },
+ "System.Security.Principal.Windows/4.5.0": {
+ "sha512": "U77HfRXlZlOeIXd//Yoj6Jnk8AXlbeisf1oq1os+hxOGVnuG+lGSfGqTwTZBoORFF6j/0q7HXIl8cqwQ9aUGqQ==",
+ "type": "package",
+ "path": "system.security.principal.windows/4.5.0",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "LICENSE.TXT",
+ "THIRD-PARTY-NOTICES.TXT",
+ "lib/net46/System.Security.Principal.Windows.dll",
+ "lib/net461/System.Security.Principal.Windows.dll",
+ "lib/netstandard1.3/System.Security.Principal.Windows.dll",
+ "lib/netstandard2.0/System.Security.Principal.Windows.dll",
+ "lib/uap10.0.16299/_._",
+ "ref/net46/System.Security.Principal.Windows.dll",
+ "ref/net461/System.Security.Principal.Windows.dll",
+ "ref/net461/System.Security.Principal.Windows.xml",
+ "ref/netstandard1.3/System.Security.Principal.Windows.dll",
+ "ref/netstandard1.3/System.Security.Principal.Windows.xml",
+ "ref/netstandard1.3/de/System.Security.Principal.Windows.xml",
+ "ref/netstandard1.3/es/System.Security.Principal.Windows.xml",
+ "ref/netstandard1.3/fr/System.Security.Principal.Windows.xml",
+ "ref/netstandard1.3/it/System.Security.Principal.Windows.xml",
+ "ref/netstandard1.3/ja/System.Security.Principal.Windows.xml",
+ "ref/netstandard1.3/ko/System.Security.Principal.Windows.xml",
+ "ref/netstandard1.3/ru/System.Security.Principal.Windows.xml",
+ "ref/netstandard1.3/zh-hans/System.Security.Principal.Windows.xml",
+ "ref/netstandard1.3/zh-hant/System.Security.Principal.Windows.xml",
+ "ref/netstandard2.0/System.Security.Principal.Windows.dll",
+ "ref/netstandard2.0/System.Security.Principal.Windows.xml",
+ "ref/uap10.0.16299/_._",
+ "runtimes/unix/lib/netcoreapp2.0/System.Security.Principal.Windows.dll",
+ "runtimes/win/lib/net46/System.Security.Principal.Windows.dll",
+ "runtimes/win/lib/net461/System.Security.Principal.Windows.dll",
+ "runtimes/win/lib/netcoreapp2.0/System.Security.Principal.Windows.dll",
+ "runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll",
+ "runtimes/win/lib/uap10.0.16299/_._",
+ "system.security.principal.windows.4.5.0.nupkg.sha512",
+ "system.security.principal.windows.nuspec",
+ "useSharedDesignerContext.txt",
+ "version.txt"
+ ]
+ },
+ "System.Text.Encodings.Web/9.0.1": {
+ "sha512": "XkspqduP2t1e1x2vBUAD/xZ5ZDvmywuUwsmB93MvyQLospJfqtX0GsR/kU0vUL2h4kmvf777z3txV2W4NrQ9Qg==",
+ "type": "package",
+ "path": "system.text.encodings.web/9.0.1",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "Icon.png",
+ "LICENSE.TXT",
+ "PACKAGE.md",
+ "THIRD-PARTY-NOTICES.TXT",
+ "buildTransitive/net461/System.Text.Encodings.Web.targets",
+ "buildTransitive/net462/_._",
+ "buildTransitive/net8.0/_._",
+ "buildTransitive/netcoreapp2.0/System.Text.Encodings.Web.targets",
+ "lib/net462/System.Text.Encodings.Web.dll",
+ "lib/net462/System.Text.Encodings.Web.xml",
+ "lib/net8.0/System.Text.Encodings.Web.dll",
+ "lib/net8.0/System.Text.Encodings.Web.xml",
+ "lib/net9.0/System.Text.Encodings.Web.dll",
+ "lib/net9.0/System.Text.Encodings.Web.xml",
+ "lib/netstandard2.0/System.Text.Encodings.Web.dll",
+ "lib/netstandard2.0/System.Text.Encodings.Web.xml",
+ "runtimes/browser/lib/net8.0/System.Text.Encodings.Web.dll",
+ "runtimes/browser/lib/net8.0/System.Text.Encodings.Web.xml",
+ "runtimes/browser/lib/net9.0/System.Text.Encodings.Web.dll",
+ "runtimes/browser/lib/net9.0/System.Text.Encodings.Web.xml",
+ "system.text.encodings.web.9.0.1.nupkg.sha512",
+ "system.text.encodings.web.nuspec",
+ "useSharedDesignerContext.txt"
+ ]
+ },
+ "System.Text.Json/9.0.1": {
+ "sha512": "eqWHDZqYPv1PvuvoIIx5pF74plL3iEOZOl/0kQP+Y0TEbtgNnM2W6k8h8EPYs+LTJZsXuWa92n5W5sHTWvE3VA==",
+ "type": "package",
+ "path": "system.text.json/9.0.1",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "Icon.png",
+ "LICENSE.TXT",
+ "PACKAGE.md",
+ "THIRD-PARTY-NOTICES.TXT",
+ "analyzers/dotnet/roslyn3.11/cs/System.Text.Json.SourceGeneration.dll",
+ "analyzers/dotnet/roslyn3.11/cs/cs/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn3.11/cs/de/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn3.11/cs/es/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn3.11/cs/fr/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn3.11/cs/it/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn3.11/cs/ja/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn3.11/cs/ko/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn3.11/cs/pl/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn3.11/cs/pt-BR/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn3.11/cs/ru/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn3.11/cs/tr/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn3.11/cs/zh-Hans/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn3.11/cs/zh-Hant/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn4.0/cs/System.Text.Json.SourceGeneration.dll",
+ "analyzers/dotnet/roslyn4.0/cs/cs/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn4.0/cs/de/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn4.0/cs/es/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn4.0/cs/fr/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn4.0/cs/it/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn4.0/cs/ja/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn4.0/cs/ko/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn4.0/cs/pl/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn4.0/cs/pt-BR/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn4.0/cs/ru/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn4.0/cs/tr/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn4.0/cs/zh-Hans/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn4.0/cs/zh-Hant/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn4.4/cs/System.Text.Json.SourceGeneration.dll",
+ "analyzers/dotnet/roslyn4.4/cs/cs/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn4.4/cs/de/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn4.4/cs/es/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn4.4/cs/fr/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn4.4/cs/it/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn4.4/cs/ja/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn4.4/cs/ko/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn4.4/cs/pl/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn4.4/cs/pt-BR/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn4.4/cs/ru/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn4.4/cs/tr/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn4.4/cs/zh-Hans/System.Text.Json.SourceGeneration.resources.dll",
+ "analyzers/dotnet/roslyn4.4/cs/zh-Hant/System.Text.Json.SourceGeneration.resources.dll",
+ "buildTransitive/net461/System.Text.Json.targets",
+ "buildTransitive/net462/System.Text.Json.targets",
+ "buildTransitive/net8.0/System.Text.Json.targets",
+ "buildTransitive/netcoreapp2.0/System.Text.Json.targets",
+ "buildTransitive/netstandard2.0/System.Text.Json.targets",
+ "lib/net462/System.Text.Json.dll",
+ "lib/net462/System.Text.Json.xml",
+ "lib/net8.0/System.Text.Json.dll",
+ "lib/net8.0/System.Text.Json.xml",
+ "lib/net9.0/System.Text.Json.dll",
+ "lib/net9.0/System.Text.Json.xml",
+ "lib/netstandard2.0/System.Text.Json.dll",
+ "lib/netstandard2.0/System.Text.Json.xml",
+ "system.text.json.9.0.1.nupkg.sha512",
+ "system.text.json.nuspec",
+ "useSharedDesignerContext.txt"
+ ]
+ },
+ "System.Threading.Tasks.Extensions/4.6.0": {
+ "sha512": "I5G6Y8jb0xRtGUC9Lahy7FUvlYlnGMMkbuKAQBy8Jb7Y6Yn8OlBEiUOY0PqZ0hy6Ua8poVA1ui1tAIiXNxGdsg==",
+ "type": "package",
+ "path": "system.threading.tasks.extensions/4.6.0",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "Icon.png",
+ "PACKAGE.md",
+ "buildTransitive/net461/System.Threading.Tasks.Extensions.targets",
+ "buildTransitive/net462/_._",
+ "lib/net462/System.Threading.Tasks.Extensions.dll",
+ "lib/net462/System.Threading.Tasks.Extensions.xml",
+ "lib/netcoreapp2.1/_._",
+ "lib/netstandard2.0/System.Threading.Tasks.Extensions.dll",
+ "lib/netstandard2.0/System.Threading.Tasks.Extensions.xml",
+ "system.threading.tasks.extensions.4.6.0.nupkg.sha512",
+ "system.threading.tasks.extensions.nuspec"
+ ]
+ },
+ "YoutubeExplode/6.5.4": {
+ "sha512": "SWMvvvC/xEjkDEnQW28xeBXn0mgB7tsNtXvtcMpxYioyVuUWzsx94oWVQgUZIaT+Zbmvj03LaKIwK9mTGKMZQg==",
+ "type": "package",
+ "path": "youtubeexplode/6.5.4",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "favicon.png",
+ "lib/net9.0/YoutubeExplode.dll",
+ "lib/net9.0/YoutubeExplode.xml",
+ "lib/netstandard2.0/YoutubeExplode.dll",
+ "lib/netstandard2.0/YoutubeExplode.xml",
+ "youtubeexplode.6.5.4.nupkg.sha512",
+ "youtubeexplode.nuspec"
+ ]
+ }
+ },
+ "projectFileDependencyGroups": {
+ "net8.0": [
+ "CliWrap >= 3.9.0",
+ "DiscordRichPresence >= 1.6.1.70",
+ "YoutubeExplode >= 6.5.4"
+ ]
+ },
+ "packageFolders": {
+ "/home/kali/.nuget/packages/": {}
+ },
+ "project": {
+ "version": "1.0.0",
+ "restore": {
+ "projectUniqueName": "/home/kali/RiderProjects/Meio/Meio.csproj",
+ "projectName": "Meio",
+ "projectPath": "/home/kali/RiderProjects/Meio/Meio.csproj",
+ "packagesPath": "/home/kali/.nuget/packages/",
+ "outputPath": "/home/kali/RiderProjects/Meio/obj/",
+ "projectStyle": "PackageReference",
+ "configFilePaths": [
+ "/home/kali/.nuget/NuGet/NuGet.Config"
+ ],
+ "originalTargetFrameworks": [
+ "net8.0"
+ ],
+ "sources": {
+ "https://api.nuget.org/v3/index.json": {}
+ },
+ "frameworks": {
+ "net8.0": {
+ "targetAlias": "net8.0",
+ "projectReferences": {}
+ }
+ },
+ "warningProperties": {
+ "warnAsError": [
+ "NU1605"
+ ]
+ },
+ "restoreAuditProperties": {
+ "enableAudit": "true",
+ "auditLevel": "low",
+ "auditMode": "direct"
+ }
+ },
+ "frameworks": {
+ "net8.0": {
+ "targetAlias": "net8.0",
+ "dependencies": {
+ "CliWrap": {
+ "target": "Package",
+ "version": "[3.9.0, )"
+ },
+ "DiscordRichPresence": {
+ "target": "Package",
+ "version": "[1.6.1.70, )"
+ },
+ "YoutubeExplode": {
+ "target": "Package",
+ "version": "[6.5.4, )"
+ }
+ },
+ "imports": [
+ "net461",
+ "net462",
+ "net47",
+ "net471",
+ "net472",
+ "net48",
+ "net481"
+ ],
+ "assetTargetFallback": true,
+ "warn": true,
+ "downloadDependencies": [
+ {
+ "name": "Microsoft.AspNetCore.App.Ref",
+ "version": "[8.0.19, 8.0.19]"
+ }
+ ],
+ "frameworkReferences": {
+ "Microsoft.NETCore.App": {
+ "privateAssets": "all"
+ }
+ },
+ "runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/8.0.413/PortableRuntimeIdentifierGraph.json"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/obj/project.nuget.cache b/obj/project.nuget.cache
new file mode 100644
index 0000000..eefcc7d
--- /dev/null
+++ b/obj/project.nuget.cache
@@ -0,0 +1,24 @@
+{
+ "version": 2,
+ "dgSpecHash": "bkktZTyPRNg=",
+ "success": true,
+ "projectFilePath": "/home/kali/RiderProjects/Meio/Meio.csproj",
+ "expectedPackageFiles": [
+ "/home/kali/.nuget/packages/anglesharp/1.2.0/anglesharp.1.2.0.nupkg.sha512",
+ "/home/kali/.nuget/packages/cliwrap/3.9.0/cliwrap.3.9.0.nupkg.sha512",
+ "/home/kali/.nuget/packages/discordrichpresence/1.6.1.70/discordrichpresence.1.6.1.70.nupkg.sha512",
+ "/home/kali/.nuget/packages/microsoft.bcl.asyncinterfaces/9.0.1/microsoft.bcl.asyncinterfaces.9.0.1.nupkg.sha512",
+ "/home/kali/.nuget/packages/microsoft.netcore.platforms/2.0.0/microsoft.netcore.platforms.2.0.0.nupkg.sha512",
+ "/home/kali/.nuget/packages/microsoft.win32.registry/4.5.0/microsoft.win32.registry.4.5.0.nupkg.sha512",
+ "/home/kali/.nuget/packages/newtonsoft.json/13.0.1/newtonsoft.json.13.0.1.nupkg.sha512",
+ "/home/kali/.nuget/packages/system.io.pipelines/9.0.1/system.io.pipelines.9.0.1.nupkg.sha512",
+ "/home/kali/.nuget/packages/system.security.accesscontrol/4.5.0/system.security.accesscontrol.4.5.0.nupkg.sha512",
+ "/home/kali/.nuget/packages/system.security.principal.windows/4.5.0/system.security.principal.windows.4.5.0.nupkg.sha512",
+ "/home/kali/.nuget/packages/system.text.encodings.web/9.0.1/system.text.encodings.web.9.0.1.nupkg.sha512",
+ "/home/kali/.nuget/packages/system.text.json/9.0.1/system.text.json.9.0.1.nupkg.sha512",
+ "/home/kali/.nuget/packages/system.threading.tasks.extensions/4.6.0/system.threading.tasks.extensions.4.6.0.nupkg.sha512",
+ "/home/kali/.nuget/packages/youtubeexplode/6.5.4/youtubeexplode.6.5.4.nupkg.sha512",
+ "/home/kali/.nuget/packages/microsoft.aspnetcore.app.ref/8.0.19/microsoft.aspnetcore.app.ref.8.0.19.nupkg.sha512"
+ ],
+ "logs": []
+}
\ No newline at end of file