diff --git a/ShadowStream/Modules/Obejeckte/Catagory.cs b/ShadowStream/Modules/Obejeckte/Catagory.cs index 780d0e0..6f82244 100644 --- a/ShadowStream/Modules/Obejeckte/Catagory.cs +++ b/ShadowStream/Modules/Obejeckte/Catagory.cs @@ -1,3 +1,4 @@ +using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Media; using ModuleManager.Modules; @@ -10,12 +11,20 @@ public class Catagory public readonly string name; List items = new List(); + private WrapPanel wrapPanel; + StringConversions conv = new StringConversions(); public Catagory(string name) { this.name = name; } + + public Catagory(string name,WrapPanel wrapPanel) + { + this.name = name; + this.wrapPanel = wrapPanel; + } public void addItem(Item item) { @@ -58,4 +67,9 @@ public class Catagory return -1; // Not found } + public WrapPanel getWrapPanel() + { + return wrapPanel; + } + } \ No newline at end of file diff --git a/ShadowStream/Modules/Obejeckte/Item.cs b/ShadowStream/Modules/Obejeckte/Item.cs index aa3649a..37d89e5 100644 --- a/ShadowStream/Modules/Obejeckte/Item.cs +++ b/ShadowStream/Modules/Obejeckte/Item.cs @@ -70,6 +70,7 @@ namespace ShadowStream.Obejeckte this.isFoto = isFoto; Console.WriteLine(path); + Console.WriteLine(playButton.Tag); } // Old methods needed by main window diff --git a/ShadowStream/Modules/Obejeckte/ObjListBP.cs b/ShadowStream/Modules/Obejeckte/ObjListBP.cs index 09ffe91..a0f57f4 100644 --- a/ShadowStream/Modules/Obejeckte/ObjListBP.cs +++ b/ShadowStream/Modules/Obejeckte/ObjListBP.cs @@ -2,17 +2,17 @@ namespace ShadowStream.Obejeckte; public class ObjListBP { - public List SharedRefs; + public List SharedRefs; private string _name; public ObjListBP(string name) { _name = name; - SharedRefs = new List(); + SharedRefs = new List(); } public ObjListBP() { - SharedRefs = new List(); + SharedRefs = new List(); } } \ No newline at end of file diff --git a/ShadowStream/Modules/ObjecktForJason/Jason Writer.cs b/ShadowStream/Modules/ObjecktForJason/Jason Writer.cs index 58e1f45..1bf141c 100644 --- a/ShadowStream/Modules/ObjecktForJason/Jason Writer.cs +++ b/ShadowStream/Modules/ObjecktForJason/Jason Writer.cs @@ -54,4 +54,69 @@ public class Jason_Writer string filePath = Path.Combine(_folderPath, $"{listName}.json"); return File.Exists(filePath); } + + + public async Task SavePlaylistListAsync(string listName, List list) + { + Console.WriteLine($"Saving playlist list '{listName}' with {list.Count} items."); + + foreach (var item in list) + { + Console.WriteLine($" - Name: {item.name}, Path: {item.path}, Type: {item.type}"); + } + + string filePath = Path.Combine(_folderPath, $"{listName}.json"); // keep same naming as original + string jsonString = JsonConvert.SerializeObject(list, Formatting.Indented); + await File.WriteAllTextAsync(filePath, jsonString); + + Console.WriteLine($"Saved JSON to: {filePath}"); + } + + public async Task> LoadPlaylistListAsync(string listName) + { + string filePath = Path.Combine(_folderPath, $"{listName}.json"); + + if (!File.Exists(filePath)) + { + Console.WriteLine($"List file '{filePath}' not found. Returning empty list."); + return new List(); + } + + string jsonString = await File.ReadAllTextAsync(filePath); + var list = JsonConvert.DeserializeObject>(jsonString); + return list ?? new List(); + } + public async Task> GetSavedPlaylistNamesAsync() + { + string playlistFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Temp Data"); + + if (!Directory.Exists(playlistFolder)) + return new List(); + + var files = Directory.GetFiles(playlistFolder, "*.json"); + var playlistNames = new List(); + + foreach (var file in files) + { + string name = Path.GetFileNameWithoutExtension(file); + if (IsPlaylistFile(name)) // uses the updated method + { + playlistNames.Add(name); + } + } + + return playlistNames; + } + + + private bool IsPlaylistFile(string fileName) + { + // Exclude main media files and the favorites file + var reserved = new[] { "Muvies", "Series", "Photos", "Music", "Favorit" }; + return !reserved.Contains(fileName); + } + + + + } diff --git a/ShadowStream/Modules/ObjecktForJason/locJason.cs b/ShadowStream/Modules/ObjecktForJason/locJason.cs index f95c2a9..4b7145d 100644 --- a/ShadowStream/Modules/ObjecktForJason/locJason.cs +++ b/ShadowStream/Modules/ObjecktForJason/locJason.cs @@ -1,3 +1,5 @@ +using System.IO; + namespace ShadowStream.ObjecktForJason; public class locJason @@ -5,4 +7,10 @@ public class locJason public string path; public string imageData; public string type; -} \ No newline at end of file +} +public class locJasonPlaylist +{ + public string name { get; set; } + public string type { get; set; } + public string path { get; set; } +} diff --git a/ShadowStream/Views/MainWindow.xaml b/ShadowStream/Views/MainWindow.xaml index 8f3ae04..308b245 100644 --- a/ShadowStream/Views/MainWindow.xaml +++ b/ShadowStream/Views/MainWindow.xaml @@ -60,6 +60,7 @@ + + diff --git a/ShadowStream/Views/MainWindow.xaml.cs b/ShadowStream/Views/MainWindow.xaml.cs index eb2a9e4..4327d9a 100644 --- a/ShadowStream/Views/MainWindow.xaml.cs +++ b/ShadowStream/Views/MainWindow.xaml.cs @@ -39,13 +39,14 @@ public partial class MainWindow : Window PlaylistEditor popupWindow; - ObjListBP _favorites = new ObjListBP(); ObjListBP _playlists = new ObjListBP(); private Catagory Muvie = new Catagory("Muvie"); private Catagory Serie = new Catagory("Serie"); private Catagory Music = new Catagory("Music"); private Catagory Photo = new Catagory("Photos"); + + private Catagory Favorites; List suportedVidioFiles = new List(); List suportedMusicFiles = new List(); @@ -83,12 +84,13 @@ public partial class MainWindow : Window #region Init wpf InitializeComponent(); //Initialise but Hide - logWin.Show(); + //logWin.Show(); //logWin.Hide(); //this.Hide(); //Begin Login Process var login = new LogIn(); login.Show(); + Favorites = new Catagory("Favorites",Favorites_Home); #endregion //Quinn Dont change or remuve!!! @@ -384,16 +386,32 @@ public partial class MainWindow : Window tmpBP.Add(Serie); tmpBP.Add(Photo); tmpBP.Add(Music); - popupWindow = new PlaylistEditor(tmpBP); + popupWindow = new PlaylistEditor(tmpBP,false); popupWindow.Owner = this; popupWindow.ShowInTaskbar = false; popupWindow.Show(); } + private void EdditFav_Click(object sender, RoutedEventArgs e) + { + ObservableCollection tmpBP= new ObservableCollection(); + tmpBP.Add(Muvie); + tmpBP.Add(Serie); + tmpBP.Add(Photo); + tmpBP.Add(Music); + popupWindow = new PlaylistEditor(tmpBP,true); + popupWindow.Owner = this; + popupWindow.ShowInTaskbar = false; + popupWindow.Show(); + } + + + #region Catagory btns private void Home_OnClick(object sender, RoutedEventArgs e) { Close_Player(); + ScrollContentPlaylist.Visibility = Visibility.Collapsed; ScrollContentCat.Visibility = Visibility.Collapsed; ScrollContentHome.Visibility = Visibility.Visible; MenueItems(); @@ -402,6 +420,7 @@ public partial class MainWindow : Window { Close_Player(); Name_of_Catagory_Text1.Visibility = Visibility.Collapsed; + ScrollContentPlaylist.Visibility = Visibility.Collapsed; ScrollContentHome.Visibility = Visibility.Collapsed; ScrollContentCat.Visibility = Visibility.Visible; @@ -412,6 +431,7 @@ public partial class MainWindow : Window { Close_Player(); Name_of_Catagory_Text1.Visibility = Visibility.Collapsed; + ScrollContentPlaylist.Visibility = Visibility.Collapsed; ScrollContentHome.Visibility = Visibility.Collapsed; ScrollContentCat.Visibility = Visibility.Visible; @@ -422,12 +442,22 @@ public partial class MainWindow : Window { Close_Player(); Name_of_Catagory_Text1.Visibility = Visibility.Visible; - + ScrollContentPlaylist.Visibility = Visibility.Collapsed; ScrollContentHome.Visibility = Visibility.Collapsed; ScrollContentCat.Visibility = Visibility.Visible; Name_of_Catagory1.Visibility = Visibility.Visible; MenueItems(ref Muvie,ref Serie); } + private void PlayListButton_OnClick(object sender, RoutedEventArgs e) + { + Close_Player(); + Name_of_Catagory_Text1.Visibility = Visibility.Collapsed; + + ScrollContentHome.Visibility = Visibility.Collapsed; + ScrollContentCat.Visibility = Visibility.Collapsed; + Name_of_Catagory1.Visibility = Visibility.Collapsed; + PopulateAllCategoriesFromPlaylists(); + } #endregion @@ -569,16 +599,9 @@ public partial class MainWindow : Window return itemsBag.ToList(); } - - - #endregion #region Comunication - public void addFavorit(ref Item item) - { - _favorites.SharedRefs.Add(item); - } public void ReciveErrorLog(string logMessage) { log.Error(logMessage); @@ -588,7 +611,7 @@ public partial class MainWindow : Window if(suportedVidioFiles.Contains(Path.GetExtension(filePath))||suportedPhotoFiles.Contains(Path.GetExtension(filePath))) VideoView.Visibility = Visibility.Visible; var media = new Media(_libVLC, filePath, FromType.FromPath); - + Console.WriteLine(filePath); media.ParsedChanged += (sender, args) => { if (args.ParsedStatus == MediaParsedStatus.Done) @@ -596,6 +619,7 @@ public partial class MainWindow : Window Dispatcher.Invoke(() => { var duration = media.Duration; + Console.WriteLine(duration); videoSliderInit(duration / 1000); }); } @@ -604,7 +628,6 @@ public partial class MainWindow : Window media.Parse(MediaParseOptions.ParseLocal); _mediaPlayer.Play(media); } - public void setStrings() { #region type? @@ -699,15 +722,115 @@ public partial class MainWindow : Window VideoView.Visibility = Visibility.Collapsed; } - public void RecivePlaylist(ObjListBP items) + public void RecivePlaylist(Catagory items) { _playlists.SharedRefs.Add(items); RecivePlaylist(); + var writer = new Jason_Writer(); + var tmp = new List(); + int index = 0; + foreach (var VARIABLE in items.getAllItems()) + { + tmp.Add(new locJasonPlaylist()); + tmp[index].name = VARIABLE.Name; + tmp[index].path = VARIABLE.Path; + tmp[index].type = VARIABLE.Type; + index++; + } + writer.SavePlaylistListAsync(items.name,tmp); + Console.WriteLine("wrote"+items.name); + } + public void RecivePlaylist(Catagory items,bool favorite) + { + if (favorite) + { + Favorites.clear(); + foreach (var VARIABLE in items.getAllItems()) + { + Favorites.addItem(VARIABLE); + } + } + else + { + foreach (var VARIABLE in _playlists.SharedRefs) + { + if (VARIABLE.name == items.name) + { + + VARIABLE.clear(); + foreach (var var2 in items.getAllItems()) + { + VARIABLE.addItem(var2); + } + break; + } + } + + } + RecivePlaylist(); + var writer = new Jason_Writer(); + var tmp = new List(); + int index = 0; + foreach (var VARIABLE in items.getAllItems()) + { + tmp.Add(new locJasonPlaylist()); + tmp[index].name = VARIABLE.Name; + tmp[index].path = VARIABLE.Path; + tmp[index].type = VARIABLE.Type; + index++; + } + writer.SavePlaylistListAsync(items.name,tmp); + Console.WriteLine("faf updated"); + if (favorite) + Application.Current.Dispatcher.Invoke(() => + { + MenueItems(); // safely update UI + }); + + + foreach (var VARIABLE in items.getAllItems()) + { + Console.WriteLine(VARIABLE.Name); + } } public void RecivePlaylist() { popupWindow.Close(); } + + private void PopulateAllCategoriesFromPlaylists() + { + PlaylistContentPanel.Children.Clear(); // Optional: clear previous entries + + foreach (Catagory category in _playlists.SharedRefs) + { + // Create TextBlock for category name + var textBlock = new TextBlock + { + Text = category.name, + FontSize = 18, + Foreground = Brushes.White, + Margin = new Thickness(0, 10, 0, 5) + }; + + // Create WrapPanel for items + var wrapPanel = new WrapPanel + { + Margin = new Thickness(0, 0, 0, 10) + }; + + // Fill WrapPanel with items + PopulatePanelWithItems(category.getAllItems(), wrapPanel); + + // Add both to the ScrollViewer's inner panel + PlaylistContentPanel.Children.Add(textBlock); + PlaylistContentPanel.Children.Add(wrapPanel); + } + + // Make the ScrollViewer visible + ScrollContentPlaylist.Visibility = Visibility.Visible; + } + #endregion #endregion @@ -726,6 +849,7 @@ public partial class MainWindow : Window } void MenueItems() { + PopulatePanelWithItems(Favorites.getAllItems(), Favorites_Home); PopulatePanelWithItems(Muvie.getAllItems(), Muvies_Home); PopulatePanelWithItems(Serie.getAllItems(), Series_Home); PopulatePanelWithItems(Photo.getAllItems(), Photos_Home); @@ -831,40 +955,98 @@ public partial class MainWindow : Window #region load saved data private async void LoadSavedData() +{ + try + { + Jason_Writer jason_Writer = new Jason_Writer(); // Uses default "Temp Data" folder + + // Load main media lists + var muvies = await jason_Writer.LoadListAsync("Muvies"); + var series = await jason_Writer.LoadListAsync("Series"); + var photos = await jason_Writer.LoadListAsync("Photos"); + var music = await jason_Writer.LoadListAsync("Music"); + var favorites = await jason_Writer.LoadListAsync("Favorit"); + + // Initialize progress bar with total count + progressScann = new ProgressBar("Reading saved data", + muvies.Count + series.Count + photos.Count + music.Count + favorites.Count); + progressScann.Show(); + + // Create Item lists from JSON + List MuvieItems = CreateItemsFromJson(muvies); + List SerieItems = CreateItemsFromJson(series); + List PhotoItems = CreateItemsFromJson(photos, isPhoto: true); + List MusicItems = CreateItemsFromJson(music, isPhoto: false, isMusic: true); + + Muvie.addItems(MuvieItems); + Serie.addItems(SerieItems); + Photo.addItems(PhotoItems); + Music.addItems(MusicItems); + + // Combine all media items for playlist/favorite matching + var allLocs = muvies.Concat(series).Concat(photos).Concat(music).ToList(); + + // Enrich favorite items by matching them with main list entries + var enrichedFavorites = new List(); + foreach (var fav in favorites) { - try + var match = allLocs.FirstOrDefault(item => + string.Equals(item.path, fav.path, StringComparison.OrdinalIgnoreCase)); + + if (match != null) { - Jason_Writer jason_Writer = new Jason_Writer(); // Use default "Temp Data" folder - JasonToString jasonToString = new JasonToString(); - - var muvies = await jason_Writer.LoadListAsync("Muvies"); - var series = await jason_Writer.LoadListAsync("Series"); - var photos = await jason_Writer.LoadListAsync("Photos"); - var music = await jason_Writer.LoadListAsync("Music"); - - progressScann = new ProgressBar("Reading saved data",muvies.Count+series.Count+photos.Count+music.Count); - progressScann.Show(); - - List MuvieItems = CreateItemsFromJson(muvies); - List SerieItems = CreateItemsFromJson(series); - List PhotoItems = CreateItemsFromJson(photos, isPhoto: true); - List MusicItems = CreateItemsFromJson(music, isPhoto: false, isMusic: true); - - Muvie.addItems(MuvieItems); - Serie.addItems(SerieItems); - Photo.addItems(PhotoItems); - Music.addItems(MusicItems); - - MenueItems(); // Re-populate the UI - progressScann.Hide(); - log.Log("Loaded saved data from JSON."); + enrichedFavorites.Add(match); } - catch (Exception ex) + else { - MessageBox.Show($"Failed to load saved data:\n{ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error); - log.Error($"LoadSavedData error: {ex}"); + enrichedFavorites.Add(fav); // fallback if not found + Console.WriteLine($"[Warning] Favorite not found in main lists: {fav.path}"); } } + + List FavoriteItems = CreateItemsFromJson(enrichedFavorites); + Favorites.addItems(FavoriteItems); + + // Load playlists + var playlistNames = await jason_Writer.GetSavedPlaylistNamesAsync(); + + foreach (var playlistName in playlistNames) + { + var playlistEntries = await jason_Writer.LoadPlaylistListAsync(playlistName); + + var matchedLocs = new List(); + foreach (var entry in playlistEntries) + { + var match = allLocs.FirstOrDefault(item => + string.Equals(item.path, entry.path, StringComparison.OrdinalIgnoreCase)); + + if (match != null) + { + matchedLocs.Add(match); + } + else + { + Console.WriteLine($"[Warning] Playlist '{playlistName}' contains unknown path: {entry.path}"); + } + } + + List PlaylistItems = CreateItemsFromJson(matchedLocs); + var playlistCategory = new Catagory(playlistName); + playlistCategory.addItems(PlaylistItems); + _playlists.SharedRefs.Add(playlistCategory); + } + + MenueItems(); // Refresh the UI + progressScann.Hide(); + log.Log("Loaded saved data from JSON."); + } + catch (Exception ex) + { + MessageBox.Show($"Failed to load saved data:\n{ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error); + log.Error($"LoadSavedData error: {ex}"); + } +} + private List CreateItemsFromJson(List jsonItems) { return CreateItemsFromJson(jsonItems, isPhoto: false, isMusic: false); @@ -1006,6 +1188,4 @@ public partial class MainWindow : Window #endregion - - } \ No newline at end of file diff --git a/ShadowStream/Views/PlaylistEditor.xaml b/ShadowStream/Views/PlaylistEditor.xaml index ecd3c99..3d874df 100644 --- a/ShadowStream/Views/PlaylistEditor.xaml +++ b/ShadowStream/Views/PlaylistEditor.xaml @@ -51,7 +51,7 @@