public override void Rebuild(bool deepLoad) { _tag = null; if (IsServerURI == false) { try { TagLib.File.IFileAbstraction abs = null; if (IsURI) { abs = new UriFileAbstraction(base.Path); } else { abs = new TagLib.File.LocalFileAbstraction(base.Path); } af = new TagLib.Mpeg.AudioFile(abs, ReadStyle.Average); if (deepLoad) { // This will actually toggle reading the audio header TimeSpan duration = af.Properties.Duration; _deepLoad = true; } _tag = af.Tag; _prop = af.Properties; } catch (Exception ex) { string s = null; } _tagModified = false; } }
public void ScanLocalDB(string folder) { // Delete missing files string norm = CUEToolsLocalDBEntry.NormalizePath(folder); if (norm.Length != 0 && norm[norm.Length - 1] != System.IO.Path.DirectorySeparatorChar) norm = norm + System.IO.Path.DirectorySeparatorChar; ReportProgress("Checking known files", 0.0); int oldi = 0, oldn = _localDB.Count; foreach (var item in _localDB.ToArray()) { bool matches = false; oldi++; if (item.AudioPaths != null) { foreach (var f in item.AudioPaths) if (f.StartsWith(norm)) { matches = true; CheckStop(); if (!File.Exists(f)) { _localDB.Remove(item); _localDB.Dirty = true; continue; } } } if (item.InputPaths != null) { foreach (var f in item.InputPaths.ToArray()) if (f.StartsWith(norm)) { CheckStop(); ReportProgress("Checking " + f, (double)oldi / oldn); matches = true; if (!File.Exists(f)) { item.InputPaths.Remove(f); _localDB.Dirty = true; } else { var cueSheet = new CUESheet(_config); cueSheet.UseLocalDB(_localDB); try { cueSheet.Open(f); List<string> fullAudioPaths = cueSheet._sourcePaths == null ? null : cueSheet._sourcePaths.ConvertAll(p => CUEToolsLocalDBEntry.NormalizePath(p)); if (!item.Equals(cueSheet._toc, fullAudioPaths)) { item.InputPaths.Remove(f); _localDB.Dirty = true; } } catch (Exception) { item.InputPaths.Remove(f); _localDB.Dirty = true; } cueSheet.Close(); } } if (matches && item.InputPaths.Count == 0) { _localDB.Remove(item); _localDB.Dirty = true; continue; } } } // Add new files ReportProgress("Scanning for new files", 0.0); var results = new List<string>(); int n = 2, j = 0; foreach (var fmt in _config.formats) if (fmt.Value.allowLossless) n++; CheckStop(); ReportProgress("Scanning *.cue", (double)(j++) / n); results.AddRange(Directory.GetFiles(folder, "*.cue", SearchOption.AllDirectories)); CheckStop(); ReportProgress("Scanning *.m3u", (double)(j++) / n); results.AddRange(Directory.GetFiles(folder, "*.m3u", SearchOption.AllDirectories)); foreach (var fmt in _config.formats) if (fmt.Value.allowLossless) { CheckStop(); ReportProgress("Scanning *." + fmt.Key, (double)(j++) / n); results.AddRange(Directory.GetFiles(folder, "*." + fmt.Key, SearchOption.AllDirectories)); } ReportProgress("Checking new files", 0.0); int i = 0; foreach (var result in results) { CheckStop(); var path = CUEToolsLocalDBEntry.NormalizePath(result); var pathextension = Path.GetExtension(path).ToLower(); bool skip = false; if (_localDB.Find( item => item.HasPath(path) || (item.AudioPaths != null && item.AudioPaths.Count > 1 && item.AudioPaths.Contains(path)) ) != null) skip = true; if (!skip && pathextension == ".m3u") { var contents = new List<string>(); using (StreamReader m3u = new StreamReader(path)) { do { string line = m3u.ReadLine(); if (line == null) break; if (line == "" || line[0] == '#') continue; //if (line.IndexOfAny(Path.GetInvalidPathChars()) >= 0) // continue; try { string extension = Path.GetExtension(line); CUEToolsFormat fmt1; if (!extension.StartsWith(".") || !_config.formats.TryGetValue(extension.ToLower().Substring(1), out fmt1) || !fmt1.allowLossless) { skip = true; break; } string fullpath = CUEToolsLocalDBEntry.NormalizePath(Path.Combine(Path.GetDirectoryName(path), line)); if (!File.Exists(fullpath)) { skip = true; break; } contents.Add(fullpath); } catch { skip = true; break; } } while (!skip); } if (!skip && _localDB.Find(item => item.EqualAudioPaths(contents)) != null) skip = true; } if (!skip && pathextension != ".cue" && pathextension != ".m3u") { if (_localDB.Find(item => item.AudioPaths != null && item.AudioPaths.Count == 1 && item.AudioPaths[0] == path ) != null) { CUEToolsFormat fmt; if (!pathextension.StartsWith(".") || !_config.formats.TryGetValue(pathextension.Substring(1), out fmt) || !fmt.allowLossless || !fmt.allowEmbed) skip = true; else { TagLib.File fileInfo; TagLib.UserDefined.AdditionalFileTypes.Config = _config; TagLib.File.IFileAbstraction file = new TagLib.File.LocalFileAbstraction(path); fileInfo = TagLib.File.Create(file); NameValueCollection tags = Tagging.Analyze(fileInfo); if (tags.Get("CUESHEET") == null) skip = true; } } } if (skip) { ReportProgress("Skipping " + path, (double)(i++) / results.Count); } else { ReportProgress("Checking " + path, (double)(i++) / results.Count); var cueSheet = new CUESheet(_config); cueSheet.UseLocalDB(_localDB); //cueSheet.PasswordRequired += new EventHandler<CompressionPasswordRequiredEventArgs>(PasswordRequired); //cueSheet.CUEToolsProgress += new EventHandler<CUEToolsProgressEventArgs>(SetStatus); //cueSheet.CUEToolsSelection += new EventHandler<CUEToolsSelectionEventArgs>(MakeSelection); try { cueSheet.Open(path); cueSheet.OpenLocalDBEntry(); } catch (Exception) { } cueSheet.Close(); } } _localDB.Save(); }
public static List<FileGroupInfo> ScanFolder(CUEConfig _config, IEnumerable<FileSystemInfo> files) { List<FileGroupInfo> fileGroups = new List<FileGroupInfo>(); foreach (FileSystemInfo file in files) { // file.Refresh(); // file.Attributes returns -1 for long paths!!! if ((file.Attributes & FileAttributes.Hidden) != 0) continue; if ((file.Attributes & FileAttributes.Directory) != 0) { // foreach (FileSystemInfo subfile in ((DirectoryInfo)e.file).GetFileSystemInfos()) // if (IsVisible(subfile)) // { // e.isExpandable = true; // break; // } fileGroups.Add(new FileGroupInfo(file, FileGroupInfoType.Folder)); continue; } string ext = file.Extension.ToLower(); if (ext == ".cue") { fileGroups.Add(new FileGroupInfo(file, FileGroupInfoType.CUESheetFile)); continue; } if (ext == ".m3u") { FileGroupInfo m3uGroup = new FileGroupInfo(file, FileGroupInfoType.M3UFile); using (StreamReader m3u = new StreamReader(file.FullName)) { do { string line = m3u.ReadLine(); if (line == null) break; if (line == "" || line[0] == '#') continue; //if (line.IndexOfAny(Path.GetInvalidPathChars()) >= 0) // continue; try { line = Path.Combine(Path.GetDirectoryName(file.FullName), line); if (File.Exists(line)) { FileInfo f = new FileInfo(line); CUEToolsFormat fmt1; if (!f.Extension.StartsWith(".") || !_config.formats.TryGetValue(f.Extension.ToLower().Substring(1), out fmt1) || !fmt1.allowLossless) throw new Exception("not lossless"); m3uGroup.files.Add(f); continue; } } catch { } m3uGroup = null; break; } while (true); }; if (m3uGroup != null) fileGroups.Add(m3uGroup); continue; } if (ext == ".zip") { fileGroups.Add(new FileGroupInfo(file, FileGroupInfoType.Archive)); //try //{ // using (ICSharpCode.SharpZipLib.Zip.ZipFile unzip = new ICSharpCode.SharpZipLib.Zip.ZipFile(file.FullName)) // { // foreach (ICSharpCode.SharpZipLib.Zip.ZipEntry entry in unzip) // { // if (entry.IsFile && Path.GetExtension(entry.Name).ToLower() == ".cue") // { // e.node.Nodes.Add(fileSystemTreeView1.NewNode(file, false)); // break; // } // } // unzip.Close(); // } //} //catch //{ //} continue; } if (ext == ".rar") { fileGroups.Add(new FileGroupInfo(file, FileGroupInfoType.Archive)); continue; } CUEToolsFormat fmt; if (ext.StartsWith(".") && _config.formats.TryGetValue(ext.Substring(1), out fmt) && fmt.allowLossless) { uint disc = 0; uint number = 0; string album = null; string cueFound = null; TimeSpan dur = TimeSpan.Zero; TagLib.UserDefined.AdditionalFileTypes.Config = _config; TagLib.File.IFileAbstraction fileAbsraction = new TagLib.File.LocalFileAbstraction(file.FullName); try { TagLib.File fileInfo = TagLib.File.Create(fileAbsraction); disc = fileInfo.Tag.Disc; album = fileInfo.Tag.Album; number = fileInfo.Tag.Track; dur = fileInfo.Properties.Duration; cueFound = fmt.allowEmbed ? Tagging.Analyze(fileInfo).Get("CUESHEET") : null; } catch { } if (cueFound != null) { FileGroupInfo group = new FileGroupInfo(file, FileGroupInfoType.FileWithCUE); if (dur != TimeSpan.Zero) group.TOC = CUE2TOC(cueFound, (int)((dur.TotalMilliseconds * 75 + 500) / 1000)); fileGroups.Add(group); continue; } disc = Math.Min(5, Math.Max(1, disc)); FileGroupInfo groupFound = null; foreach (FileGroupInfo fileGroup in fileGroups) { if (fileGroup.type == FileGroupInfoType.TrackFiles && fileGroup.discNo == disc && fileGroup.album == album && fileGroup.main.Extension.ToLower() == ext) { groupFound = fileGroup; break; } } if (groupFound == null) { groupFound = new FileGroupInfo(file, FileGroupInfoType.TrackFiles); groupFound.discNo = disc; groupFound.album = album; groupFound.durations = new Dictionary<FileSystemInfo, TimeSpan>(); fileGroups.Add(groupFound); } groupFound.files.Add(file); if (number > 0) groupFound.numbers.Add(file, number); if (dur != TimeSpan.Zero) groupFound.durations.Add(file, dur); } } fileGroups.RemoveAll(group => group.type == FileGroupInfoType.TrackFiles && group.files.Count < 2); // tracks must be sorted according to tracknumer (or filename if missing) foreach (FileGroupInfo group in fileGroups) if (group.type == FileGroupInfoType.TrackFiles) { group.files.Sort(group.Compare()); group.numbers = null; group.TOC = new CDImageLayout(); foreach (FileSystemInfo f in group.files) { if (!group.durations.ContainsKey(f)) { group.TOC = null; break; } uint len = (uint)((group.durations[f].TotalMilliseconds * 75 + 500) / 1000); group.TOC.AddTrack(new CDTrack((uint)group.TOC.TrackCount + 1, group.TOC.Length, len, true, false)); } } fileGroups.Sort(FileGroupInfo.Compare); return fileGroups; }
public static string CreateDummyCUESheet(CUEConfig _config, FileGroupInfo fileGroup) { if (fileGroup.type == FileGroupInfoType.FileWithCUE) { TagLib.UserDefined.AdditionalFileTypes.Config = _config; TagLib.File.IFileAbstraction fileAbsraction = new TagLib.File.LocalFileAbstraction(fileGroup.main.FullName); TagLib.File fileInfo = TagLib.File.Create(fileAbsraction); return Tagging.Analyze(fileInfo).Get("CUESHEET"); } StringWriter sw = new StringWriter(); sw.WriteLine(String.Format("REM COMMENT \"CUETools generated dummy CUE sheet\"")); int trackNo = 0; foreach (FileSystemInfo file in fileGroup.files) { string name = file.Name; if (fileGroup.type == FileGroupInfoType.M3UFile && Path.GetDirectoryName(file.FullName) != Path.GetDirectoryName(fileGroup.main.FullName) && Path.GetDirectoryName(file.FullName).StartsWith(Path.GetDirectoryName(fileGroup.main.FullName))) { name = file.FullName.Substring(Path.GetDirectoryName(fileGroup.main.FullName).Length + 1); } sw.WriteLine(String.Format("FILE \"{0}\" WAVE", name)); sw.WriteLine(String.Format(" TRACK {0:00} AUDIO", ++trackNo)); sw.WriteLine(String.Format(" INDEX 01 00:00:00")); } sw.Close(); return sw.ToString(); }