/// <summary> /// Generates a local photo album from a directory of pictures. /// </summary> /// <param name="dInfo">The directory with the pictures.</param> /// <param name="pictureDirectory">The source photo directory path.</param> /// <returns>A local photo album with a collection of changed files to copy.</returns> private static PhotoAlbumWithChanges LocalToAlbum(DirectoryInfo dInfo, string pictureDirectory) { try { System.Console.WriteLine($"Started creating album from pictures: {dInfo.Name} & {pictureDirectory}."); var newAlbum = new PhotoAlbum { uniqueName = dInfo.Name.ToLower().Replace(' ', '-'), name = dInfo.Name, description = null, pictures = null, feature = null, thumb = null, createdOn = TimeUtility.GetUnixTime(), isActive = false }; var pictures = new List <Picture>(); var fileMap = new Dictionary <string, string>(); foreach (var picture in Directory.GetFiles(pictureDirectory, "*.jpg")) { var fInfo = new FileInfo(picture); var albumPicture = new Picture { caption = null, image = fInfo.Name, name = fInfo.Name.Split('.')[0], isPortrait = null, tags = null }; var image = new Bitmap(picture); var pItemSubject = image.PropertyItems.FirstOrDefault(pi => pi.Id == 40095); var pItemTags = image.PropertyItems.FirstOrDefault(pi => pi.Id == 40094); var subject = string.Empty; var tags = new string[] { }; if (pItemSubject == null && pItemTags == null) { continue; } if (pItemSubject != null) { subject = Encoding.Unicode.GetString(pItemSubject.Value).Replace("\0", string.Empty); } if (pItemTags != null) { tags = Encoding.Unicode.GetString(pItemTags.Value).Replace("\0", string.Empty).Split(';'); } // Generate a pretty file name from the Subject metadata if (pItemSubject != null && !string.IsNullOrEmpty(subject) && pItemTags == null) { var derivedImage = subject.Replace(" ", "-").ToLower(); derivedImage = Regex.Replace(derivedImage, @"[^\w\.@-]", "", RegexOptions.None, TimeSpan.FromSeconds(5)); var derivedName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(subject); var nameCount = pictures.Count(p => p.name == derivedName); // Handle files with the same Subject and add a number to the end for uniqueness if (nameCount > 0) { derivedImage += $"-{nameCount}"; } derivedImage = $"{derivedImage}{fInfo.Extension}"; fileMap[albumPicture.image] = derivedImage; if (albumPicture.name != derivedName) { albumPicture.name = derivedName; } if (albumPicture.image != derivedImage) { albumPicture.image = derivedImage; } } else { // Generate a pretty file name from the Tags metadata albumPicture.tags = tags; var derivedImage = string.Join(" ", albumPicture.tags).Replace(" ", "-").ToLower(); derivedImage = Regex.Replace(derivedImage, @"[^\w\.@-]", "", RegexOptions.None, TimeSpan.FromSeconds(5)); var derivedName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(string.Join(" ", albumPicture.tags)); var nameCount = pictures.Count(p => p.name == derivedName); // Handle files with the same Tags and add a number to the end for uniqueness if (nameCount > 0) { derivedImage += $"-{nameCount}"; } derivedImage = $"{derivedImage}{fInfo.Extension}"; fileMap[albumPicture.image] = derivedImage; if (albumPicture.name != derivedName) { albumPicture.name = derivedName; } if (albumPicture.image != derivedImage) { albumPicture.image = derivedImage; } } if (image.Height > image.Width) { albumPicture.isPortrait = true; } pictures.Add(albumPicture); } newAlbum.pictures = pictures.ToArray(); // Exclude Portrait photos from being features or thumbs var pics = newAlbum.pictures.Where(p => !p.isPortrait.HasValue || !p.isPortrait.Value).ToList(); var rand = new Random(); newAlbum.feature = pics[rand.Next(pics.Count)].image; newAlbum.thumb = pics[rand.Next(pics.Count)].image; System.Console.WriteLine($"Completed creating album from pictures: {dInfo.Name} & {pictureDirectory}."); return(new PhotoAlbumWithChanges { PhotoAlbum = newAlbum, FilesToCopy = fileMap }); } catch (Exception ex) { System.Console.WriteLine(ex); throw; } }
/// <summary> /// Generates playlist models with YouTube videos from device playlists files. /// </summary> /// <param name="path">Local path with m3u/m3u8 playlists from which to generate local model playlists.</param> /// <param name="export">True to export the resulting playlist locally to the path provided.</param> public static async Task GeneratePlaylists(string path, bool export = false) { try { var playlists = new List <Playlist>(); var m3uExtensions = new[] { ".m3u8", ".m3u" }; var m3ufiles = Directory .GetFiles(path) .Where(file => m3uExtensions.Any(file.ToLower().EndsWith)) .ToList(); foreach (var file in m3ufiles) { var fInfo = new FileInfo(file); var fName = fInfo.Name.Replace(fInfo.Extension, string.Empty); var playlist = new Playlist { uniqueName = fName, createdOn = TimeUtility.GetUnixTime() }; // If playlists are simply named YYYYMMDD.m3u, default the local playlist title to a prettier full date string if (int.TryParse(fName, out var n)) { var success = DateTime.TryParseExact(fName, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out var d); if (success) { playlist.title = $"{d.ToString("m")}, {d.Year.ToString()}"; } } var tracks = new List <Track>(); // Read the m3u playlist and create tracks using (var reader = new StreamReader(file)) { var track = new Track(); while (reader.Peek() >= 0) { var line = reader.ReadLine(); if (line.StartsWith("#EXTINF")) { track = new Track(); track.artist = line.Split(',')[1]; } else if (line.StartsWith("\\") || line.StartsWith("D:\\") || line.StartsWith("E:\\")) { var row = line.Split('\\'); var fileName = row.Last(); track.name = track.artist.Split('-').Last().TrimStart(); track.artist = track.artist.Split('-').First().TrimEnd(); var videos = await Search($"{track.artist} {track.name}", 1); if (videos.Any()) { track.video = videos.First(); } else { Console.WriteLine($"{track.artist} {track.name}"); } tracks.Add(track); } } } playlist.tracks = tracks.ToArray(); playlists.Add(playlist); } if (export) { var json = JsonConvert.SerializeObject(playlists, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); var jsonFileName = $"{path}\\playlists_{DateTime.Now.ToString("yyyyMMddhhmmss")}.json"; using (var writer = new StreamWriter(jsonFileName)) { writer.WriteLine(json); } } } catch (Exception ex) { Console.WriteLine($"ERROR: Handler exception. Error: {ex.Message}. {ex.StackTrace}."); throw; } }