Exemplo n.º 1
0
        /// <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;
            }
        }