using System.Drawing; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using file_finder__test; using ShadowStream; using ShadowStream.LogHelper; using ShadowStream.Obejeckte; using System.IO; using System.Threading; using ShadowStream.ObjecktForJason; using TagLib; using ShadowStream.Modules; using ShadowStream.ObjecktForJason; using LibVLCSharp.Shared; namespace ModuleManager; /// /// Interaction logic for MainWindow.xaml /// //Quinn and Reda and Yazan public partial class MainWindow : Window { #region no dont cahnge //adding base components used threw out the code private static LogHelper loghelper = new LogHelper(); LogWindow log = new LogWindow(loghelper.GetEntries()); private Catagory Muvie = new Catagory("Muvie"); private Catagory Serie = new Catagory("Serie"); private Catagory Music = new Catagory("Music"); private Catagory Photo = new Catagory("Photos"); List suportedVidioFiles = new List(); List suportedMusicFiles = new List(); List suportedPhotoFiles = new List(); //root directory List dirs = new List(); private int option =2; int specificOption = 0; string rootPath = "F:/"; FileScanner fileScanner; #endregion #region vlc logic private LibVLC _libVLC; private LibVLCSharp.Shared.MediaPlayer _mediaPlayer; #endregion //code start public MainWindow() { InitializeComponent(); //Initialise but Hide log.Hide(); //this.Hide(); #region vlc init Core.Initialize(); // Important: load native libvlc binaries _libVLC = new LibVLC(); _mediaPlayer = new LibVLCSharp.Shared.MediaPlayer(_libVLC); VideoView.MediaPlayer = _mediaPlayer; #endregion //Begin Login Process var login = new LogIn(); login.Show(); #region only exdend. no remuving of code //adding all extensions... example values added suportedVidioFiles.Add(".mp4"); suportedVidioFiles.Add(".mkv"); suportedMusicFiles.Add(".wav"); suportedMusicFiles.Add(".mp3"); suportedPhotoFiles.Add(".jpg"); Createscan(); //dirs.Add("C:/"); //execute and wait for task completion var tmp = fileScanner.ScanAllDrivesAsync(); //load json parallel to finding drives //add code laiter tmp.Wait(); foreach (var VARIABLE in tmp.Result) { dirs.Add(VARIABLE); } #endregion } #region dont change void Createscan() { //adding all string arrays to one temp array to do the initial scan of the designated drive int count = 0; string[] tmp = new string[suportedMusicFiles.Count + suportedVidioFiles.Count + suportedPhotoFiles.Count]; foreach (var suportedVidioFile in suportedVidioFiles) { tmp[count] = suportedVidioFile; count++; } foreach (var suportedMusicFile in suportedMusicFiles) { tmp[count] = suportedMusicFile; count++; } foreach (var suportedPhotoFile in suportedPhotoFiles) { tmp[count] = suportedPhotoFile; count++; } //initialise the file scanner with all files endings wanted fileScanner = new FileScanner(tmp); } //btn logic //example logoc to start vidio /*void Video_Click(object sender, RoutedEventArgs e) { PlayVideo(@"F:\Rio.mp4"); }*/ public void PlayVideo(string filePath) { VideoView.Visibility = Visibility.Visible; var media = new Media(_libVLC, filePath, FromType.FromPath); _mediaPlayer.Play(media); } private async void scanButton_Click(object sender, RoutedEventArgs e) { try { MessageBox.Show("scanning..."); List tmp = new List(); switch (option) { case 0: foreach (var VARIABLE in dirs) { foreach (var tmp2 in await fileScanner.ScanDriveParallel(VARIABLE)) { tmp.Add(tmp2); } } break; case 1: foreach (var VARIABLE in await fileScanner.ScanDriveParallel(dirs[specificOption])) { tmp.Add(VARIABLE); } break; case 2: foreach (var VARIABLE in await fileScanner.ScanDriveParallel(rootPath)) { tmp.Add(VARIABLE); } break; } Console.WriteLine($"Total scanned files: {tmp.Count}"); var classifier = new FileClassifier(); var (musicFiles, videoFiles, photoFiles) = await classifier.ClassifyFilesAsync(tmp, suportedMusicFiles, suportedVidioFiles, suportedPhotoFiles); var separator = new VideoSeparator(); var (series, movies) = await separator.SeparateVideosAsync(videoFiles); Console.WriteLine($"musicFiles count: {musicFiles.Count}"); Console.WriteLine($"videoFiles count: {videoFiles.Count}"); Console.WriteLine($"photoFiles count: {photoFiles.Count}"); Console.WriteLine($"series count: {series.Count}"); Console.WriteLine($"movies count: {movies.Count}"); videoFiles = null; MessageBox.Show("files sorted"); // Prepare JSON lists List muviesJS = new List(); List seriesJS = new List(); List photosJS = new List(); List mucicJS = new List(); JasonToString jasonToString = new JasonToString(); foreach (var VARIABLE in ItemCreater(movies, "Muvie", false)) { Muvie.addItem(VARIABLE); muviesJS.Add(new locJason { path = VARIABLE.getLink(), imageData = jasonToString.BitmapToBase64String(BitmapImageToBitmap(VARIABLE.getImage())), type = VARIABLE.getType() }); } foreach (var VARIABLE in ItemCreater(series, "Serie", false)) { Serie.addItem(VARIABLE); seriesJS.Add(new locJason { path = VARIABLE.getLink(), imageData = jasonToString.BitmapToBase64String(BitmapImageToBitmap(VARIABLE.getImage())), type = VARIABLE.getType() }); } foreach (var VARIABLE in ItemCreater(photoFiles, "Photo", true)) { Photo.addItem(VARIABLE); photosJS.Add(new locJason { path = VARIABLE.getLink(), imageData = jasonToString.BitmapToBase64String(BitmapImageToBitmap(VARIABLE.getImage())), type = VARIABLE.getType() }); } foreach (var VARIABLE in ItemCreater(musicFiles, "Music", false, true)) { Music.addItem(VARIABLE); mucicJS.Add(new locJason { path = VARIABLE.getLink(), imageData = jasonToString.BitmapToBase64String(BitmapImageToBitmap(VARIABLE.getImage())), type = VARIABLE.getType() }); } MessageBox.Show("scan finished"); Jason_Writer jason_Writer = new Jason_Writer(); List tasks = new List { jason_Writer.SaveList("Muvies", muviesJS), jason_Writer.SaveList("Series", seriesJS), jason_Writer.SaveList("Photos", photosJS), jason_Writer.SaveList("Music", mucicJS) }; await Task.WhenAll(tasks); } catch (Exception ex) { MessageBox.Show($"An error occurred during scanning:\n\n{ex.ToString()}", "Error", MessageBoxButton.OK, MessageBoxImage.Error); Console.WriteLine($"An error occurred during scanning:\n\n{ex.ToString()}", "Error"); } } List ItemCreater(List path, string type,bool isFoto) { List items = new List(); foreach (var VARIABLE in path) { BitmapImage frame200; if(!isFoto) frame200 = VideoFrameExtractor.GetFrame200(VARIABLE); else { frame200 = new BitmapImage(new Uri(VARIABLE, UriKind.Absolute)); } items.Add(new Item(VARIABLE, type,frame200, isFoto)); } return items; } List ItemCreater(List paths, string type, bool isFoto, bool Music) { List items = new List(); string baseDir = AppDomain.CurrentDomain.BaseDirectory; string imagePath = System.IO.Path.Combine(baseDir, "Pics", "MusicD.jpeg"); BitmapImage defaultImage; if (System.IO.File.Exists(imagePath)) { defaultImage = new BitmapImage(new Uri(imagePath)); defaultImage.Freeze(); } else { MessageBox.Show($"Default image not found at: {imagePath}"); // Create a blank 100x100 transparent BitmapImage fallback int width = 100; int height = 100; int dpi = 96; var pixelFormat = System.Windows.Media.PixelFormats.Pbgra32; int rawStride = (width * pixelFormat.BitsPerPixel + 7) / 8; byte[] rawImage = new byte[rawStride * height]; // all zero = transparent var bitmap = BitmapSource.Create(width, height, dpi, dpi, pixelFormat, null, rawImage, rawStride); bitmap.Freeze(); defaultImage = new BitmapImage(); // Can't cast BitmapSource directly to BitmapImage, // so let's use BitmapSource type instead in Item if possible // Otherwise, fallback to null or a resource image. // For now, assign null or handle in your Item class. defaultImage = null; } foreach (var filePath in paths) { BitmapImage bitmapImage = defaultImage; try { var file = TagLib.File.Create(filePath); if (file.Tag.Pictures.Length > 0) { var pic = file.Tag.Pictures[0]; using (var ms = new MemoryStream(pic.Data.Data)) { var img = new BitmapImage(); img.BeginInit(); img.CacheOption = BitmapCacheOption.OnLoad; img.StreamSource = ms; img.EndInit(); img.Freeze(); bitmapImage = img; } } } catch { // keep defaultImage if anything fails } items.Add(new Item(filePath, type, bitmapImage, isFoto)); } return items; } public static BitmapImage ConvertBitmapToBitmapImage(System.Drawing.Bitmap bitmap) { using (var memory = new System.IO.MemoryStream()) { bitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Png); memory.Position = 0; var bitmapImage = new BitmapImage(); bitmapImage.BeginInit(); bitmapImage.StreamSource = memory; bitmapImage.CacheOption = BitmapCacheOption.OnLoad; bitmapImage.EndInit(); bitmapImage.Freeze(); // Optional: for thread safety return bitmapImage; } } public static Bitmap BitmapImageToBitmap(BitmapImage bitmapImage) { using (MemoryStream ms = new MemoryStream()) { // Encode BitmapImage to stream (e.g., PNG) BitmapEncoder encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(bitmapImage)); encoder.Save(ms); ms.Seek(0, SeekOrigin.Begin); // Reset stream position // Create Bitmap from stream return new Bitmap(ms); } } //scan logic #endregion }