2022-05-03 07:56:28 +00:00
using System ;
using YoutubeExplode ;
using YoutubeExplode.Videos ;
using System.Collections.Generic ;
using System.Linq ;
using System.Threading ;
using System.Threading.Tasks ;
using System.Net.Http ;
using Newtonsoft.Json ;
using System.IO ;
using YoutubeExplode.Playlists ;
using YoutubeExplode.Channels ;
using System.Text ;
namespace Tesses.YouTubeDownloader
{
2022-05-04 13:23:06 +00:00
internal class LockObj
{
2022-06-24 23:02:51 +00:00
}
public class TYTDErrorEventArgs : EventArgs
{
public TYTDErrorEventArgs ( VideoId ? id , Exception exception )
{
Id = id ;
Exception = exception ;
PrintError = true ;
}
public VideoId ? Id { get ; set ; }
public Exception Exception { get ; set ; }
public bool PrintError { get ; set ; }
2022-05-04 13:23:06 +00:00
}
2022-05-03 07:56:28 +00:00
public partial class TYTDStorage
{
2022-07-13 13:59:23 +00:00
protected virtual LoggerProperties ReadLoggerProperties ( )
{
string data = ReadAllTextAsync ( "config/tytdprop.json" ) . GetAwaiter ( ) . GetResult ( ) ;
return JsonConvert . DeserializeObject < LoggerProperties > ( data ) ;
}
protected virtual bool LoggerPropertiesExists
{
get {
return FileExists ( "config/tytdprop.json" ) ;
}
}
2022-06-24 23:02:51 +00:00
public event EventHandler < TYTDErrorEventArgs > Error ;
2022-05-09 22:00:19 +00:00
internal LoggerProperties Properties { get ; set ; }
public LoggerProperties GetProperties ( )
{
2022-07-13 13:59:23 +00:00
if ( LoggerPropertiesExists )
2022-05-09 22:00:19 +00:00
{
2022-07-13 13:59:23 +00:00
return ReadLoggerProperties ( ) ;
2022-05-09 22:00:19 +00:00
} else {
LoggerProperties prop = new LoggerProperties ( ) ;
prop . AddDateInLog = true ;
prop . LogVideoIds = true ;
prop . PrintErrors = false ;
prop . PrintVideoIds = true ;
prop . UseLogs = true ;
prop . SubscriptionInterval = TimeSpan . FromHours ( 1 ) ;
prop . AlwaysDownloadChannel = false ;
2022-07-13 13:59:23 +00:00
prop . AllowExport = false ;
2022-05-09 22:00:19 +00:00
return prop ;
}
}
public LoggerProperties GetLoggerProperties ( )
{
if ( Properties = = null )
{
Properties = GetProperties ( ) ;
}
2022-07-13 13:59:23 +00:00
2022-05-09 22:00:19 +00:00
return Properties ;
}
2022-05-04 13:23:06 +00:00
internal static LockObj o = new LockObj ( ) ;
2022-05-03 07:56:28 +00:00
private Logger _log = null ;
public Logger GetLogger ( )
{
2022-05-04 13:23:06 +00:00
lock ( o ) {
if ( _log = = null )
{
_log = new Logger ( this ) ;
}
return _log ;
2022-05-03 07:56:28 +00:00
}
}
}
public class LoggerProperties
{
2022-07-13 13:59:23 +00:00
public bool AllowExport { get ; set ; }
2022-05-09 22:00:19 +00:00
public bool AlwaysDownloadChannel { get ; set ; }
public TimeSpan SubscriptionInterval { get ; set ; }
2022-05-03 07:56:28 +00:00
public bool UseLogs { get ; set ; }
public bool PrintVideoIds { get ; set ; }
public bool PrintErrors { get ; set ; }
public bool LogVideoIds { get ; set ; }
public bool AddDateInLog { get ; set ; }
2022-07-13 13:59:23 +00:00
2022-05-03 07:56:28 +00:00
}
public class Logger
{
2022-05-04 13:23:06 +00:00
2022-05-03 07:56:28 +00:00
private string _filename ;
private TYTDStorage _storage ;
2022-05-09 22:00:19 +00:00
internal Logger ( TYTDStorage storage )
2022-05-03 07:56:28 +00:00
{
2022-05-09 22:00:19 +00:00
2022-05-03 07:56:28 +00:00
_storage = storage ;
string dateTime = DateTime . Now . ToString ( "yyyyMMdd_hhmmss" ) ;
_filename = $"config/logs/{dateTime}.log" ;
}
private void WriteStdErr ( string message )
{
2022-08-28 21:40:34 +00:00
if ( TYTDStorage . UseConsole ) {
var col = Console . ForegroundColor ;
Console . ForegroundColor = ConsoleColor . Red ;
Console . Error . WriteLine ( message ) ;
Console . ForegroundColor = col ;
} else {
_storage . ConsoleWriter . WriteLine ( $"ERROR: {message}" ) ;
}
2022-05-03 07:56:28 +00:00
}
private void WriteStd ( string message , bool error )
{
if ( error )
WriteStdErr ( message ) ;
2022-08-28 21:40:34 +00:00
else {
if ( TYTDStorage . UseConsole ) {
var col = Console . ForegroundColor ;
Console . ForegroundColor = ConsoleColor . Red ;
2022-05-03 07:56:28 +00:00
Console . WriteLine ( message ) ;
2022-08-28 21:40:34 +00:00
Console . ForegroundColor = col ;
} else {
_storage . ConsoleWriter . WriteLine ( message ) ;
}
}
2022-05-03 07:56:28 +00:00
}
2022-05-04 13:23:06 +00:00
public async Task WriteAsync ( string message , bool writeToConsole = false , bool isError = false , bool log = true )
{
await Task . Run ( ( ) = > {
Write ( message , writeToConsole , isError , log ) ;
} ) ;
}
public void Write ( string message , bool writeToConsole = false , bool isError = false , bool log = true )
2022-05-03 07:56:28 +00:00
{
if ( writeToConsole ) WriteStd ( message , isError ) ;
2022-05-09 22:00:19 +00:00
if ( ! log | | ! _storage . GetLoggerProperties ( ) . UseLogs ) return ;
2022-05-03 07:56:28 +00:00
// DateTime time = DateTime.Now;
var msg = new StringBuilder ( ) ;
2022-05-09 22:00:19 +00:00
if ( _storage . GetLoggerProperties ( ) . AddDateInLog )
2022-05-03 07:56:28 +00:00
{
var dat = DateTime . Now ;
msg . AppendLine ( $"{dat.ToShortDateString()} at {dat.ToShortTimeString()}:" ) ;
}
msg . AppendLine ( message ) ;
2022-05-04 13:23:06 +00:00
lock ( TYTDStorage . o ) {
try {
using ( var strm = _storage . OpenOrCreateAsync ( _filename ) . GetAwaiter ( ) . GetResult ( ) )
2022-05-03 07:56:28 +00:00
{
if ( ! strm . CanSeek ) return ;
strm . Seek ( 0 , SeekOrigin . End ) ;
using ( var sw = new StreamWriter ( strm ) )
{
2022-05-04 13:23:06 +00:00
sw . WriteLine ( msg . ToString ( ) ) ;
2022-05-03 07:56:28 +00:00
}
2022-05-04 13:23:06 +00:00
} }
catch ( Exception ex )
{
_ = ex ;
}
//mtx.ReleaseMutex();
}
2022-05-03 07:56:28 +00:00
}
public async Task WriteAsync ( Exception ex )
{
2022-06-24 23:02:51 +00:00
await WriteAsync ( ex , null ) ;
}
public async Task WriteAsync ( Exception ex , VideoId ? id )
{
TYTDErrorEventArgs args = new TYTDErrorEventArgs ( id , ex ) ;
_storage . ThrowError ( args ) ;
await WriteAsync ( $"Exception Catched:\n{ex.ToString()}" , _storage . GetLoggerProperties ( ) . PrintErrors & & args . PrintError , true ) ;
2022-05-03 07:56:28 +00:00
}
public async Task WriteAsync ( SavedVideo video )
{
2022-05-09 22:00:19 +00:00
await WriteAsync ( $"Download: {video.Title} with Id: {video.Id}" , _storage . GetLoggerProperties ( ) . PrintVideoIds , false , _storage . GetLoggerProperties ( ) . LogVideoIds ) ;
2022-05-03 07:56:28 +00:00
}
}
}