示例#1
0
文件: MainForm.cs 项目: Crimso44/mag6
        private void RecalcDurations(Album parentAlbum, FolderDataDto res)
        {
            // рассчитываем размеры, битрейты и продолжительности
            foreach (var sng in parentAlbum.Songs)
            {
                res.Duration = (res.Duration ?? 0) + (sng.Duration ?? 0);
                res.Size     = (res.Size ?? 0) + sng.Size;
                if (sng.Bitrate.HasValue)
                {
                    res.AddBitrate(sng.Bitrate.Value);
                }
            }

            var br = res.GetBitrateString();

            if (parentAlbum.Bitrate != br || parentAlbum.Size != res.Size || parentAlbum.Duration != res.Duration)
            {
                parentAlbum.Bitrate  = br;
                parentAlbum.Size     = res.Size;
                parentAlbum.Duration = res.Duration;
                _ctx.SaveChanges();

                var treeItem = _treeList.Where(x => x.Id == parentAlbum.Id).FirstOrDefault();
                if (treeItem != null)
                {
                    treeItem.Assign(res);
                    tlwAlbums.RefreshObject(treeItem);
                }
            }
        }
示例#2
0
文件: MainForm.cs 项目: Crimso44/mag6
        private void RecalcDurations(AlbumDto sel)
        {
            var res    = new FolderDataDto();
            var chAlbs = _ctx.Albums.Where(x => x.ParentId == sel.Id).ToList();

            foreach (var chAlb in chAlbs)
            {
                res.Size     = (res.Size ?? 0) + (chAlb.Size ?? 0);
                res.Duration = (res.Duration ?? 0) + (chAlb.Duration ?? 0);
                if (!string.IsNullOrEmpty(chAlb.Bitrate))
                {
                    if (chAlb.Bitrate.EndsWith("+") || chAlb.Bitrate.EndsWith("-"))
                    {
                        var bit = int.Parse(chAlb.Bitrate.Substring(0, chAlb.Bitrate.Length - 1));
                        res.AddBitrate(bit);
                        res.AddBitrate(bit);
                    }
                    else if (chAlb.Bitrate.Contains("-"))
                    {
                        var bitLst = chAlb.Bitrate.Split('-');
                        foreach (var bitStr in bitLst)
                        {
                            var bit = int.Parse(bitStr);
                            res.AddBitrate(bit);
                            res.AddBitrate(bit);
                        }
                    }
                    else
                    {
                        var bit = int.Parse(chAlb.Bitrate);
                        res.AddBitrate(bit);
                        res.AddBitrate(bit);
                    }
                }
            }
            var alb = _ctx.Albums.Where(x => x.Id == sel.Id).First();

            RecalcDurations(alb, res);

            var dvdNamesExists = _ctx.DVDs.Where(d => d.AlbumId == alb.Id)
                                 .Select(d => d.Name).Distinct().ToList();

            var dvdNamesBelow = (
                from a in _ctx.Albums
                join d in _ctx.DVDs on a.Id equals d.AlbumId
                where a.ParentId == alb.Id
                select d.Name).Distinct().ToList();

            if (dvdNamesBelow.Any())
            {
                var dvdsToAdd    = dvdNamesBelow.Where(x => !dvdNamesExists.Contains(x)).ToList();
                var dvdsToRemove = dvdNamesExists.Where(x => !dvdNamesBelow.Contains(x)).ToList();
                _ctx.DVDs.AddRange(dvdsToAdd.Select(d => new DVD()
                {
                    AlbumId = alb.Id, Name = d
                }).ToList());
                _ctx.DVDs.RemoveRange(_ctx.DVDs.Where(d => d.AlbumId == alb.Id && dvdsToRemove.Contains(d.Name)).ToList());
                _ctx.SaveChanges();

                if (dvdsToAdd.Any() || dvdsToRemove.Any())
                {
                    var path = GetDirName(txtMusicPath.Text);
                    path = path.Substring(0, path.Length - 6) + alb.Path + "\\magdata";
                    if (File.Exists(path))
                    {
                        var magFile    = File.ReadAllLines(path);
                        var magdata    = new List <string>(magFile);
                        var isHidden   = magdata.Any(x => x == "hidden");
                        var newMagdata = _ctx.DVDs.Where(d => d.AlbumId == alb.Id).OrderBy(d => d.Name).Select(d => d.Name).ToList();
                        if (isHidden)
                        {
                            newMagdata.Add("hidden");
                        }
                        using (var tw = new StreamWriter("path"))
                        {
                            foreach (var s in newMagdata)
                            {
                                tw.WriteLine(s);
                            }
                        }
                    }
                }
            }
        }
示例#3
0
文件: MainForm.cs 项目: Crimso44/mag6
        private FolderDataDto LoadDirectory(DirectoryInfo d, string path, Album parentAlbum)
        {
            var res = new FolderDataDto();

            if (_stop)
            {
                return(res);
            }

            label1.Text = path;
            Application.DoEvents();

            // помечаем для удаления все песни (пока)
            var songs      = parentAlbum.Songs.ToList();
            var songsToDel = songs.Select(x => x.Id).ToList();
            var dvds       = parentAlbum.DVDs.ToList();
            var dvdsToDel  = dvds.Select(x => x.Id).ToList();

            try
            {
                var files = d.GetFiles();
                foreach (var file in files)
                {
                    if (file.Name == "magdata")
                    {
                        var magFile = File.ReadAllLines(file.FullName);
                        var magdata = new List <string>(magFile);

                        foreach (var line in magdata)
                        {
                            if (line == "hidden")
                            {
                                parentAlbum.IsHidden = true;
                            }
                            else if (!string.IsNullOrEmpty(line))
                            {
                                var dvd = dvds.FirstOrDefault(x => x.Name == line);
                                if (dvd == null)
                                {
                                    dvd = new DVD()
                                    {
                                        AlbumId = parentAlbum.Id,
                                        Name    = line
                                    };
                                    _ctx.DVDs.Add(dvd);
                                }
                                else
                                {
                                    dvdsToDel.Remove(dvd.Id);
                                }
                                res.Dvds.Add(line);
                            }
                        }
                    }
                    else
                    {
                        var sng = songs.FirstOrDefault(x => x.FileName == file.Name);
                        if (sng == null)
                        {
                            sng = new Song()
                            {
                                AlbumId  = parentAlbum.Id,
                                FileName = file.Name
                            };
                            _ctx.Songs.Add(sng);
                            parentAlbum.Songs.Add(sng);
                        }
                        else
                        {
                            songsToDel.Remove(sng.Id);
                        }

                        if (sng.Size != file.Length || sng.Created.ToString("dd.MM.yyyy hh:mm") != file.CreationTime.ToString("dd.MM.yyyy hh:mm"))
                        {
                            sng.Size    = file.Length;
                            sng.Created = file.CreationTime;

                            if (file.Extension.ToLower() == ".mp3")
                            {
                                try
                                {
                                    var mp3 = new Track(file.FullName);
                                    sng.Name     = Util.toUtf8(mp3.Title);
                                    sng.Bitrate  = mp3.Bitrate;
                                    sng.Duration = mp3.Duration;
                                    sng.IsVbr    = mp3.IsVBR;
                                }
                                catch (Exception e) {
                                    //MessageBox.Show(e.Message);
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception e) {
                MessageBox.Show(e.Message);
            }

            // удаляем не найденные песни
            if (songsToDel.Any())
            {
                var songToDelete = songs.Where(x => songsToDel.Contains(x.Id)).ToList();
                _ctx.Songs.RemoveRange(songToDelete);
            }
            if (dvdsToDel.Any())
            {
                var dvdToDelete = dvds.Where(x => dvdsToDel.Contains(x.Id)).ToList();
                _ctx.DVDs.RemoveRange(dvdToDelete);
            }
            _ctx.SaveChanges();


            // обрабатываем вложенные папки
            var albsToDel = _ctx.Albums.Where(x => x.ParentId == parentAlbum.Id).Select(x => x.Id).ToList();

            try
            {
                var innerDvds = new List <string>();
                var folders   = d.GetDirectories();
                foreach (var folder in folders)
                {
                    var dir = _ctx.Albums.Include("Songs").Include("DVDs")
                              .FirstOrDefault(x => x.Path == path && x.Name == folder.Name);
                    if (dir == null)
                    {
                        dir = new Album()
                        {
                            Path     = path,
                            Name     = folder.Name,
                            ParentId = parentAlbum.Id
                        };
                        _ctx.Albums.Add(dir);
                    }
                    else
                    {
                        dir.ParentId = parentAlbum.Id;
                        albsToDel.Remove(dir.Id);
                    }
                    _ctx.SaveChanges();

                    var dat = LoadDirectory(folder,
                                            (string.IsNullOrEmpty(path) ? "" : path + "\\") + folder.Name, dir);
                    res.Size     = (res.Size ?? 0) + (dat.Size ?? 0);
                    res.Duration = (res.Duration ?? 0) + (dat.Duration ?? 0);
                    foreach (var key in dat.Bitrates.Keys)
                    {
                        if (res.Bitrates.ContainsKey(key))
                        {
                            res.Bitrates[key] += dat.Bitrates[key];
                        }
                        else
                        {
                            res.Bitrates[key] = dat.Bitrates[key];
                        }
                    }
                    foreach (var dvd in dat.Dvds)
                    {
                        if (!innerDvds.Contains(dvd))
                        {
                            innerDvds.Add(dvd);
                        }
                    }
                }

                if (innerDvds.Any())
                {
                    foreach (var dvd in res.Dvds)
                    {
                        if (!innerDvds.Contains(dvd) && !dvd.StartsWith("_"))
                        {
                            _loadErrors.Add($"- {dvd}: {parentAlbum.Path}\\{parentAlbum.Name}");
                        }
                    }
                    foreach (var dvd in innerDvds)
                    {
                        if (!res.Dvds.Contains(dvd))
                        {
                            _loadErrors.Add($"+ {dvd}: {parentAlbum.Path}\\{parentAlbum.Name}");
                        }
                    }
                }
            }
            catch { }


            if (!_stop)
            {
                var albumsToDel = _ctx.Albums.Where(x => albsToDel.Contains(x.Id)).ToList();
                foreach (var alb in albumsToDel)
                {
                    // ищем для удаления только во вложенных папках
                    var albumsQuery = _ctx.Albums.Where(x => x.Path.StartsWith(alb.Path + "\\" + alb.Name));

                    var toDeleteSongs = _ctx.Songs
                                        .Where(y => albumsQuery.Select(x => x.Id).ToList().Contains(y.AlbumId)
                                               ).ToList();
                    _ctx.Songs.RemoveRange(toDeleteSongs);

                    var toDeleteDvds = _ctx.DVDs
                                       .Where(y => albumsQuery.Select(x => x.Id).ToList().Contains(y.AlbumId)
                                              ).ToList();
                    _ctx.DVDs.RemoveRange(toDeleteDvds);

                    var toDelete = albumsQuery.ToList();
                    _ctx.Albums.RemoveRange(toDelete);

                    if (alb.Songs.Any())
                    {
                        _ctx.Songs.RemoveRange(alb.Songs);
                    }
                    if (alb.DVDs.Any())
                    {
                        _ctx.DVDs.RemoveRange(alb.DVDs);
                    }
                    _ctx.Albums.Remove(alb);

                    _ctx.SaveChanges();
                }
            }
            _ctx.SaveChanges();

            RecalcDurations(parentAlbum, res);

            label1.Text = "";
            Application.DoEvents();

            return(res);
        }