168 lines
6.2 KiB
C#
168 lines
6.2 KiB
C#
using Npgsql;
|
|
using Serilog;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Text.Json;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace TvSyncApp
|
|
{
|
|
public class Program
|
|
{
|
|
public static async Task<int> Main(string[] args)
|
|
{
|
|
string settingsPath = Path.Combine(Directory.GetCurrentDirectory(), "appsettings.json");
|
|
var settings = TvSyncApp.Settings.Load(settingsPath)
|
|
?? throw new Exception("Failed to load settings from appsettings.json");
|
|
|
|
Console.WriteLine($"Log level: {settings.Global.LogLevel}");
|
|
Console.WriteLine($"Database type: {settings.Database.DbType}");
|
|
// Console.WriteLine($"TVMaze series API: {settings.Json.SeriesApi}");
|
|
|
|
string rootDir = Directory.GetCurrentDirectory();
|
|
|
|
var directories = new Dictionary<string, string>
|
|
{
|
|
["SERIESDIR"] = Path.Combine(rootDir, "cache", "series"),
|
|
["EPISODEDIR"] = Path.Combine(rootDir, "cache", "episodes"),
|
|
["CASTDIR"] = Path.Combine(rootDir, "cache", "cast"),
|
|
// ["GUESTCASTDIR"] = Path.Combine(rootDir, "cache", "guestcast"),
|
|
["CREWDIR"] = Path.Combine(rootDir, "cache", "crew"),
|
|
["UNKNOWN"] = Path.Combine(rootDir, "cache", "unknown")
|
|
};
|
|
|
|
CreateDirectories(rootDir);
|
|
|
|
Log.Logger = new LoggerConfiguration()
|
|
.MinimumLevel.Debug()
|
|
.WriteTo.Console()
|
|
.WriteTo.File(Path.Combine(rootDir, "log", "sync.log"))
|
|
.CreateLogger();
|
|
|
|
Log.Information("Starting sync process...");
|
|
|
|
// --- Fetch series IDs from PostgreSQL ---
|
|
string connectionString = $"Host={settings.DbSettings.Hostname};Port={settings.DbSettings.PgsqlPort};Username={settings.DbSettings.PgsqlUsername};Password={settings.DbSettings.PgsqlPassword};Database={settings.DbSettings.DbName}";
|
|
List<SeriesUpdate> seriesUpdates = GetSeriesIdsFromDb(connectionString);
|
|
|
|
List<string> seriesIds = seriesUpdates
|
|
.Select(x => x.SeriesId.ToString())
|
|
.ToList();
|
|
|
|
|
|
Log.Information("Fetched {Count} series IDs from tvupdates table.", seriesIds.Count);
|
|
|
|
// Convert to string list if your Loader expects strings
|
|
List<string> updateList = seriesIds.ConvertAll(id => id.ToString());
|
|
|
|
// Optionally, you can also fetch timestamps if needed
|
|
Dictionary<string, long> updateDict = new Dictionary<string, long>();
|
|
|
|
var loader = new Loader();
|
|
|
|
var result = await loader.LoadJsonAsync(directories, updateList, updateDict, settings);
|
|
|
|
Log.Information("Sync complete. Success: {Success}, Failed: {Failed}", result.Success, result.Failed);
|
|
Log.CloseAndFlush();
|
|
|
|
return 0;
|
|
}
|
|
private static List<SeriesUpdate> GetSeriesIdsFromDb(string connectionString)
|
|
{
|
|
var results = new List<SeriesUpdate>();
|
|
|
|
try
|
|
{
|
|
using var conn = new NpgsqlConnection(connectionString);
|
|
conn.Open();
|
|
|
|
const string query = @"
|
|
SELECT seriesid, timestamp
|
|
FROM updates.tvupdates
|
|
ORDER BY seriesid";
|
|
|
|
using var cmd = new NpgsqlCommand(query, conn);
|
|
using var reader = cmd.ExecuteReader();
|
|
|
|
while (reader.Read())
|
|
{
|
|
if (!reader.IsDBNull(0) && !reader.IsDBNull(1))
|
|
{
|
|
results.Add(new SeriesUpdate
|
|
{
|
|
SeriesId = reader.GetInt32(0),
|
|
Timestamp = long.Parse(reader.GetString(1))
|
|
});
|
|
}
|
|
}
|
|
|
|
SaveSeriesUpdatesToFile(results);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Log.Error(ex, "Failed to fetch series updates or manage JSON output.");
|
|
}
|
|
|
|
return results;
|
|
}
|
|
|
|
private static void SaveSeriesUpdatesToFile(List<SeriesUpdate> data)
|
|
{
|
|
string configDir = Path.Combine(AppContext.BaseDirectory, "config");
|
|
Directory.CreateDirectory(configDir);
|
|
|
|
string fileName = "previous_tvmaze_updates.json";
|
|
string filePath = Path.Combine(configDir, fileName);
|
|
|
|
if (File.Exists(filePath))
|
|
{
|
|
string timestamp = DateTime.UtcNow.ToString("yyyyMMddHHmmss");
|
|
string archiveName = $"previous_tvmaze_updates_{timestamp}.json";
|
|
string archivePath = Path.Combine(configDir, archiveName);
|
|
|
|
File.Move(filePath, archivePath);
|
|
}
|
|
|
|
var options = new JsonSerializerOptions
|
|
{
|
|
WriteIndented = true
|
|
};
|
|
|
|
string json = JsonSerializer.Serialize(data, options);
|
|
File.WriteAllText(filePath, json);
|
|
|
|
var archives = Directory.GetFiles(configDir, "previous_tvmaze_updates_*.json")
|
|
.Select(f => new FileInfo(f))
|
|
.OrderByDescending(f => f.CreationTimeUtc)
|
|
.ToList();
|
|
|
|
foreach (var oldFile in archives.Skip(5))
|
|
{
|
|
oldFile.Delete();
|
|
}
|
|
|
|
Log.Information("Saved {Count} series updates to {FilePath}", data.Count, filePath);
|
|
}
|
|
|
|
|
|
private static void CreateDirectories(string rootDir)
|
|
{
|
|
Directory.CreateDirectory(Path.Combine(rootDir, "log"));
|
|
Directory.CreateDirectory(Path.Combine(rootDir, "temp"));
|
|
Directory.CreateDirectory(Path.Combine(rootDir, "cache", "series"));
|
|
Directory.CreateDirectory(Path.Combine(rootDir, "cache", "episodes"));
|
|
Directory.CreateDirectory(Path.Combine(rootDir, "cache", "cast"));
|
|
Directory.CreateDirectory(Path.Combine(rootDir, "cache", "guestcast"));
|
|
Directory.CreateDirectory(Path.Combine(rootDir, "cache", "crew"));
|
|
}
|
|
}
|
|
|
|
public class SeriesUpdate
|
|
{
|
|
public int SeriesId { get; set; }
|
|
public long Timestamp { get; set; }
|
|
}
|
|
|
|
}
|