diff --git a/AnimeAnnouncer/AnimeAnnouncer.csproj b/AnimeAnnouncer/AnimeAnnouncer.csproj index cf81941..cb2c3bb 100644 --- a/AnimeAnnouncer/AnimeAnnouncer.csproj +++ b/AnimeAnnouncer/AnimeAnnouncer.csproj @@ -12,6 +12,12 @@ + + + + PreserveNewest + + \ No newline at end of file diff --git a/AnimeAnnouncer/Cache/TMDBCache.cs b/AnimeAnnouncer/Cache/TMDBCache.cs new file mode 100644 index 0000000..8559f86 --- /dev/null +++ b/AnimeAnnouncer/Cache/TMDBCache.cs @@ -0,0 +1,35 @@ +using System.Text.Json; +using StackExchange.Redis; +using TMDbLib.Utilities.Converters; + +namespace AnimeAnnouncer.Cache; + +public class TMDBCache +{ + private readonly ConnectionMultiplexer redis; + + public TimeSpan CacheExpiration { get; set; } + + + public TMDBCache(String redisConnectionString) + { + CacheExpiration = TimeSpan.FromDays(3); + redis = ConnectionMultiplexer.Connect(redisConnectionString); + } + public async Task SetCacheItem(String key, TMDBCacheItem item) + { + var db = redis.GetDatabase(); + String jsonItem = JsonSerializer.Serialize(item); + db.StringSetAsync(key, jsonItem, CacheExpiration); + } + public async Task GetCacheItem(String key) + { + var db = redis.GetDatabase(); + String jsonItem = await db.StringGetAsync(key); + + if(!String.IsNullOrEmpty(jsonItem)) + return JsonSerializer.Deserialize(jsonItem); + else + return null; + } +} diff --git a/AnimeAnnouncer/Cache/TMDBCacheItem.cs b/AnimeAnnouncer/Cache/TMDBCacheItem.cs new file mode 100644 index 0000000..8892d58 --- /dev/null +++ b/AnimeAnnouncer/Cache/TMDBCacheItem.cs @@ -0,0 +1,12 @@ + +namespace AnimeAnnouncer.Cache +{ + public class TMDBCacheItem + { + public required String Title { get; set; } + public int ShowID { get; set; } + + public int LatestSeasonNumber { get; set; } + public int LastEpisodeNumber { get; set; } + } +} \ No newline at end of file diff --git a/AnimeAnnouncer/Program.cs b/AnimeAnnouncer/Program.cs index 66d2dc3..bc5bc61 100644 --- a/AnimeAnnouncer/Program.cs +++ b/AnimeAnnouncer/Program.cs @@ -1,4 +1,6 @@ -using AnimeAnnouncer.RSS; +using AnimeAnnouncer.Cache; +using AnimeAnnouncer.RSS; +using Microsoft.Extensions.Configuration; using TMDbLib.Client; namespace AnimeAnnouncer @@ -7,13 +9,33 @@ namespace AnimeAnnouncer { private static NyaaIndexer nyaaIndexer= new NyaaIndexer(); - private const String TMDBApiKey = ""; - - private static TMDbClient tmdbClient = new TMDbClient(TMDBApiKey); + private static TMDbClient tmdbClient; + private static TMDBCache tmdbCache; static void Main(string[] args) { Console.WriteLine("Starting..."); + var configurationBuilder = new ConfigurationBuilder(); + + configurationBuilder.SetBasePath(System.IO.Directory.GetCurrentDirectory()); // errors here + configurationBuilder.AddJsonFile(path: "appSettings.json", optional: false, reloadOnChange: true); // errors here + + var config = configurationBuilder.Build(); + + String TMDBApiKey = config["TMDBApiKey"]; + if(String.IsNullOrEmpty(TMDBApiKey)) + { + Console.WriteLine("ERROR: API key not found in config."); + return; + } + tmdbClient = new TMDbClient(TMDBApiKey); + + String redisCacheConnectionString = config["redisConnectionString"]; + if(!String.IsNullOrEmpty(redisCacheConnectionString)) + { + tmdbCache = new TMDBCache(redisCacheConnectionString); + } + nyaaIndexer.NewPost += OnNewPost; nyaaIndexer.RssReadFinished += OnRssReadFinished; nyaaIndexer.Start(true); @@ -61,7 +83,13 @@ namespace AnimeAnnouncer var showResult = await tmdbClient.GetTvShowAsync(supposedShowId); - var latestSeason = showResult.Seasons.OrderByDescending(s => s.SeasonNumber).First(); + var latestSeason = showResult.Seasons.Where(s => s.AirDate.HasValue && s.AirDate.Value < DateTime.Now).OrderByDescending(s => s.SeasonNumber).FirstOrDefault(); + + if(latestSeason == null) + { + Console.WriteLine("Unable to find a viable season from TMDB."); + return; + } if(latestSeason.SeasonNumber != int.Parse(season)) { diff --git a/AnimeAnnouncer/appSettings.json b/AnimeAnnouncer/appSettings.json new file mode 100644 index 0000000..fe00107 --- /dev/null +++ b/AnimeAnnouncer/appSettings.json @@ -0,0 +1,4 @@ +{ + "TMDBApiKey": "", + "redisConnectionString": "localhost" +} \ No newline at end of file