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); } } }
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); } } } } } }
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); }