From 3c44c8dc8a554eff477e6ec8b51b9c9c0e47d2c5 Mon Sep 17 00:00:00 2001 From: Zacharias Date: Tue, 4 Feb 2025 09:03:10 +0100 Subject: [PATCH] Chaged colors Added handelrs for networking exceptions Made Book selector a bit bigger Fixed issue with publishing date --- Bokhantarare/BareBookInfo.cs | 2 +- Bokhantarare/Bokhantarare.csproj | 6 +++ Bokhantarare/Book.cs | 17 +++++-- Bokhantarare/BookSelectionPage.xaml | 2 +- Bokhantarare/Helper.cs | 26 +++++++---- Bokhantarare/MainWindow.xaml | 2 +- Bokhantarare/MainWindow.xaml.cs | 67 ++++++++++++++++++---------- Bokhantarare/recycle-bin.png | Bin 0 -> 15741 bytes 8 files changed, 84 insertions(+), 38 deletions(-) create mode 100644 Bokhantarare/recycle-bin.png diff --git a/Bokhantarare/BareBookInfo.cs b/Bokhantarare/BareBookInfo.cs index 81daade..8f7f97c 100644 --- a/Bokhantarare/BareBookInfo.cs +++ b/Bokhantarare/BareBookInfo.cs @@ -13,7 +13,7 @@ public class BareBookInfo(string editionId, string title, string? workId = null) public Book getBook() { Dictionary? responce = JsonSerializer.Deserialize>( - Helper.Request($"https://openlibrary.org/books/{EditionID}.json")); + Helper.Request($"https://openlibrary.org/books/{EditionID}.json") ?? throw new Exception("Network Error")); if (responce == null) { diff --git a/Bokhantarare/Bokhantarare.csproj b/Bokhantarare/Bokhantarare.csproj index c4a3262..a485e62 100644 --- a/Bokhantarare/Bokhantarare.csproj +++ b/Bokhantarare/Bokhantarare.csproj @@ -8,4 +8,10 @@ true + + + Always + + + diff --git a/Bokhantarare/Book.cs b/Bokhantarare/Book.cs index 2c9b616..64ef837 100644 --- a/Bokhantarare/Book.cs +++ b/Bokhantarare/Book.cs @@ -1,5 +1,7 @@ +using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; +using System.Text.RegularExpressions; namespace Bokhantarare; @@ -46,7 +48,7 @@ public class Book } Dictionary? responce = JsonSerializer.Deserialize>( - Helper.Request($"https://openlibrary.org/api/books?bibkeys=ISBN:{ISBN}&jscmd=details&format=json")); + Helper.Request($"https://openlibrary.org/api/books?bibkeys=ISBN:{ISBN}&jscmd=details&format=json") ?? throw new Exception("Network Error")); if (responce == null) { @@ -86,7 +88,16 @@ public class Book string pubDate = ""; if (details.ContainsKey("publish_date")) { - details["publish_date"].ToString(); + pubDate = details["publish_date"].ToString(); + + if (!Regex.IsMatch(pubDate, @"^\d{4}$")) + { + if (DateTime.TryParse(pubDate, CultureInfo.InvariantCulture, DateTimeStyles.None, + out DateTime date)) + { + pubDate = date.ToString("yyyy"); + } + } } else { @@ -100,7 +111,7 @@ public class Book title = title.Trim(); Dictionary? responce = JsonSerializer.Deserialize>( - Helper.Request($"https://openlibrary.org/search.json?q={title}")); + Helper.Request($"https://openlibrary.org/search.json?q={title}") ?? throw new Exception("Network Error")); if (responce == null) { diff --git a/Bokhantarare/BookSelectionPage.xaml b/Bokhantarare/BookSelectionPage.xaml index 91b0b5c..f348b8e 100644 --- a/Bokhantarare/BookSelectionPage.xaml +++ b/Bokhantarare/BookSelectionPage.xaml @@ -5,7 +5,7 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:Bokhantarare" mc:Ignorable="d" - Title="BookSelectionPage" Height="90" Width="180"> + Title="BookSelectionPage" Height="100" Width="180"> diff --git a/Bokhantarare/Helper.cs b/Bokhantarare/Helper.cs index 85e909a..2d403b4 100644 --- a/Bokhantarare/Helper.cs +++ b/Bokhantarare/Helper.cs @@ -5,17 +5,25 @@ namespace Bokhantarare; public class Helper { - public static string Request(string requestUrl) + public static string? Request(string requestUrl) { - HttpClient client = new HttpClient(); - HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, requestUrl); - requestMessage.Headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse("application/json")); + try + { + HttpClient client = new HttpClient(); + HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, requestUrl); + requestMessage.Headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse("application/json")); - //Connect to the URL - HttpResponseMessage response = client.SendAsync(requestMessage).Result; + //Connect to the URL + HttpResponseMessage response = client.SendAsync(requestMessage).Result; - // Get the response - string Output = response.Content.ReadAsStringAsync().Result; - return Output; + // Get the response + string Output = response.Content.ReadAsStringAsync().Result; + return Output; + } + catch (Exception ex) + { + Console.Error.WriteLine(ex.Message); + return null; + } } } \ No newline at end of file diff --git a/Bokhantarare/MainWindow.xaml b/Bokhantarare/MainWindow.xaml index 6e0bc76..ba6092f 100644 --- a/Bokhantarare/MainWindow.xaml +++ b/Bokhantarare/MainWindow.xaml @@ -6,7 +6,7 @@ xmlns:local="clr-namespace:Bokhantarare" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> - + diff --git a/Bokhantarare/MainWindow.xaml.cs b/Bokhantarare/MainWindow.xaml.cs index 59a9f3e..22a5450 100644 --- a/Bokhantarare/MainWindow.xaml.cs +++ b/Bokhantarare/MainWindow.xaml.cs @@ -42,7 +42,7 @@ public partial class MainWindow : Window uppdateListedBooks(0); - Console.WriteLine(Book.GetBookFromISBN("978-1-97470719-5")); + //Console.WriteLine(Book.GetBookFromISBN("978-1-97470719-5")); AppDomain.CurrentDomain.ProcessExit += (_, __) => { @@ -68,45 +68,65 @@ public partial class MainWindow : Window int i = 0; Library.Children.Clear(); - + foreach (Book book in shown) { Grid grid = new Grid(); + Color c = new Color(); + + if (i % 2 == 0) + { + grid.Background = Brushes.DarkGray; + } + else + { + grid.Background = Brushes.LightGray; + } + grid.Margin = new Thickness(0, 5, 0, 0); grid.SetValue(Grid.RowProperty, i); i++; - + ColumnDefinition def1 = new ColumnDefinition(); def1.Width = new GridLength(40); grid.ColumnDefinitions.Add(def1); - + ColumnDefinition def2 = new ColumnDefinition(); def2.Width = GridLength.Auto; grid.ColumnDefinitions.Add(def2); - + ColumnDefinition def7 = new ColumnDefinition(); def2.Width = GridLength.Auto; grid.ColumnDefinitions.Add(def7); - - BitmapImage coverBitmap = new BitmapImage(); - coverBitmap.BeginInit(); - coverBitmap.UriSource = new Uri($"https://covers.openlibrary.org/b/isbn/{book.ISBN}-S.jpg"); - coverBitmap.CacheOption = BitmapCacheOption.OnLoad; // Ensure full load before use - //coverBitmap.CreateOptions = BitmapCreateOptions.IgnoreImageCache; // Prevent caching issues - coverBitmap.UriCachePolicy = new RequestCachePolicy(RequestCacheLevel.Default); // Network-friendly caching - coverBitmap.EndInit(); - - Image cover = new Image(); - cover.SetValue(Grid.ColumnProperty, 0); - cover.Stretch = Stretch.Uniform; - cover.Source = coverBitmap; - cover.Margin = new Thickness(0, 0, 5, 0); - - grid.Children.Add(cover); - Grid bookInfo = new Grid(); + try + { + + BitmapImage coverBitmap = new BitmapImage(); + coverBitmap.BeginInit(); + coverBitmap.UriSource = new Uri($"https://covers.openlibrary.org/b/isbn/{book.ISBN}-S.jpg"); + coverBitmap.CacheOption = BitmapCacheOption.OnLoad; // Ensure full load before use + //coverBitmap.CreateOptions = BitmapCreateOptions.IgnoreImageCache; // Prevent caching issues + coverBitmap.UriCachePolicy = + new RequestCachePolicy(RequestCacheLevel.Default); // Network-friendly caching + coverBitmap.EndInit(); + + Image cover = new Image(); + cover.SetValue(Grid.ColumnProperty, 0); + cover.Stretch = Stretch.Uniform; + cover.Source = coverBitmap; + cover.Margin = new Thickness(0, 0, 5, 0); + + grid.Children.Add(cover); + } + catch(Exception e) + { + + } + + Grid bookInfo = new Grid(); bookInfo.SetValue(Grid.ColumnProperty, 1); @@ -156,12 +176,13 @@ public partial class MainWindow : Window removeImage.Source = removeBitmap; removeImage.MaxHeight = 20; removeImage.MaxWidth = 20; - removeImage.Margin = new Thickness(0, 0, 5, 0); + //removeImage.Margin = new Thickness(0, 0, 5, 0); Button remove = new Button(); remove.Click += (_, __) => RemoveBook(book); remove.Content = removeImage; remove.MaxWidth = 30; + remove.HorizontalAlignment = HorizontalAlignment.Right; remove.SetValue(Grid.ColumnProperty, 2); grid.Children.Add(remove); diff --git a/Bokhantarare/recycle-bin.png b/Bokhantarare/recycle-bin.png new file mode 100644 index 0000000000000000000000000000000000000000..f6c0d1869234a75b2a28f09db2f9bad3ef5e75cc GIT binary patch literal 15741 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 Kb6Mw<&;$UFG@?2H literal 0 HcmV?d00001