playlist loading from json and displaying it properly

This commit is contained in:
Elias Quinn
2025-06-24 10:59:59 +01:00
parent 6e225465c1
commit 9e5b7a6999
48 changed files with 1740 additions and 1338 deletions

View File

@@ -60,6 +60,7 @@
<Button Content="Musik" Height="60" Foreground="White" Background="Transparent" Click="Musik_OnClick"/>
<Button Content="Photos" Height="60" Foreground="White" Background="Transparent" Click="Photo_OnClick"/>
<Button Content="Video" Height="60" Foreground="White" Background="Transparent" Click="Video_OnClick" />
<Button Content="Playlist" Height="60" Foreground="White" Background="Transparent" Click="PlayListButton_OnClick" />
</StackPanel>
<!-- MAIN CONTENT WRAPPED IN A GRID FOR LAYERING -->
@@ -140,6 +141,12 @@
</WrapPanel>
</StackPanel>
</ScrollViewer>
<!--Playlists-->
<ScrollViewer x:Name="ScrollContentPlaylist" Background="#444" Panel.ZIndex="0" Visibility="Collapsed">
<StackPanel x:Name="PlaylistContentPanel">
<Button Content="New Playlist" Background="Black" Foreground="White" Click="PlayListButton_Click"></Button>
</StackPanel>
</ScrollViewer>
</Grid>
<!-- SETTINGS BUTTON -->

View File

@@ -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<string> suportedVidioFiles = new List<string>();
List<string> suportedMusicFiles = new List<string>();
@@ -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<Catagory> tmpBP= new ObservableCollection<Catagory>();
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<locJasonPlaylist>();
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<locJasonPlaylist>();
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<Item> MuvieItems = CreateItemsFromJson(muvies);
List<Item> SerieItems = CreateItemsFromJson(series);
List<Item> PhotoItems = CreateItemsFromJson(photos, isPhoto: true);
List<Item> 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<locJason>();
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<Item> MuvieItems = CreateItemsFromJson(muvies);
List<Item> SerieItems = CreateItemsFromJson(series);
List<Item> PhotoItems = CreateItemsFromJson(photos, isPhoto: true);
List<Item> 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<Item> 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<locJason>();
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<Item> 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<Item> CreateItemsFromJson(List<locJason> jsonItems)
{
return CreateItemsFromJson(jsonItems, isPhoto: false, isMusic: false);
@@ -1006,6 +1188,4 @@ public partial class MainWindow : Window
#endregion
}

View File

@@ -51,7 +51,7 @@
<Button Content="Return" Grid.Column="0" Width="100" HorizontalAlignment="Right" Margin="0,10,0,0"
Click="Return_Click"/>
<Button Content="Add" Grid.Column="1" Width="100" HorizontalAlignment="Left" Margin="0,10,0,0"
Click="Add_Click" Visibility="Collapsed" Name="add_btn"/>
Visibility="Collapsed" Name="add_btn"/>
</Grid>
</Grid>
</Window>

View File

@@ -10,15 +10,28 @@ namespace ShadowStream.Views
public partial class PlaylistEditor : Window
{
private ObservableCollection<Catagory> _sharedList;
private bool Fav;
//pointer
//private unsafe Catagory* _sharedListLock;
Catagory _selectedCatagory;
public PlaylistEditor(ObservableCollection<Catagory> sharedList)
public PlaylistEditor(ObservableCollection<Catagory> sharedList,bool isFaF)
{
InitializeComponent();
_sharedList = sharedList;
if (isFaF)
{
PlaylistNameBox.Text = "Favorit";
PlaylistNameBox.IsReadOnly = true;
add_btn.Click += Edit_Click;
add_btn.Content = "Edit";
}
else
{
add_btn.Click += Add_Click;
}
}
private void ShowSublist(string categoryName)
@@ -69,12 +82,12 @@ namespace ShadowStream.Views
private void Add_Click(object sender, RoutedEventArgs e)
{
ObjListBP tmp = new ObjListBP(PlaylistNameBox.Text);
Catagory tmp = new Catagory(PlaylistNameBox.Text);
foreach (var VARIABLE in _selectedCatagory.getAllItems())
{
if (VARIABLE.IsAdded)
{
tmp.SharedRefs.Add(VARIABLE);
tmp.addItem(VARIABLE);
Console.WriteLine(VARIABLE.Name);
}
}
@@ -85,5 +98,24 @@ namespace ShadowStream.Views
mainWin.RecivePlaylist(tmp);
}
}
private void Edit_Click(object sender, RoutedEventArgs e)
{
Catagory tmp = new Catagory(PlaylistNameBox.Text);
foreach (var VARIABLE in _selectedCatagory.getAllItems())
{
if (VARIABLE.IsAdded)
{
tmp.addItem(VARIABLE);
Console.WriteLine(VARIABLE.Name);
}
}
if (this.Owner is MainWindow mainWin)
{
mainWin.RecivePlaylist(tmp,true);
}
}
}
}