public BluRayDiscMovie(IDirectoryAbstraction source) { RootDirectory = source; if (!source.TestForSubdirectory("BDMV")) { throw new DirectoryNotFoundException("BDMV directory not found!"); } IDirectoryAbstraction bdmvRoot = source.OpenSubdirectory("BDMV"); if (!bdmvRoot.TestForFile("index.bdmv")) { throw new FileNotFoundException("BDMV index not found!", "index.bdmv"); } byte[] indexBdmv = bdmvRoot.ReadFileCompletely("index.bdmv"); Index = new Index(indexBdmv); if (Index.HasMovieObjects()) { byte[] movieObjectBdmv = bdmvRoot.ReadFileCompletely("MovieObject.bdmv"); MovieObject = new MovieObject(movieObjectBdmv); bool playlistDirExists = bdmvRoot.TestForSubdirectory("PLAYLIST"); if (MovieObject.HasPlaylistDependencies() && playlistDirExists) { ReadOnlyCollection <uint> readOnlyCollection = MovieObject.GetPlaylistDependencies(); Playlists = new Playlist[readOnlyCollection.Count]; IDirectoryAbstraction playlistDir = bdmvRoot.OpenSubdirectory("PLAYLIST"); for (int i = 0; i < readOnlyCollection.Count; i++) { string fname = String.Format("{0:00000}.mpls", readOnlyCollection[i]); if (!playlistDir.TestForFile(fname)) { continue; } byte[] mplsBuffer = playlistDir.ReadFileCompletely(fname); Playlists[i] = new Playlist(mplsBuffer, i); } } } if (bdmvRoot.TestForSubdirectory("CLIPINF")) { IDirectoryAbstraction clipInfoDir = bdmvRoot.OpenSubdirectory("CLIPINF"); string[] listFiles = clipInfoDir.ListFiles(); Array.Sort(listFiles); Clips = Array.ConvertAll(listFiles, x => new ClipInfo(clipInfoDir.ReadFileCompletely(x), int.Parse(Path.GetFileNameWithoutExtension(x)))); } if (source.TestForSubdirectory("CERTIFICATE")) { IDirectoryAbstraction certificate = source.OpenSubdirectory("CERTIFICATE"); if (certificate.TestForFile("id.bdmv")) { byte[] idBdmv = certificate.ReadFileCompletely("id.bdmv"); Id = new Id(idBdmv); } } }
private static void SerializeDirectory(IDirectoryAbstraction ida, BinaryWriter bw, int depth) { bw.Write(OPCODE_BEGIN_DIRECTORY); SerializeString(ida.Name, bw); if (ida.TestForSubdirectory("BDMV")) { SerializeDirectory(ida.OpenSubdirectory("BDMV"), bw, depth + 1); } if (ida.TestForSubdirectory("CERTIFICATE")) { SerializeDirectory(ida.OpenSubdirectory("CERTIFICATE"), bw, depth + 1); } if (ida.TestForSubdirectory("PLAYLIST")) { SerializeDirectory(ida.OpenSubdirectory("PLAYLIST"), bw, depth + 1); } if (ida.TestForSubdirectory("CLIPINF")) { SerializeDirectory(ida.OpenSubdirectory("CLIPINF"), bw, depth + 1); } foreach (string listFile in ida.ListFiles()) { if (depth == 1 && listFile.Equals("disc.inf")) { continue; } if (!listFile.EndsWith(".bdmv") && !listFile.EndsWith(".mpls") && !listFile.EndsWith(".clpi")) { throw new NotImplementedException(listFile); } bw.Write(OPCODE_FILE); byte[] buffer = ida.ReadFileCompletely(listFile); SerializeString(listFile, bw); bw.Write(buffer.Length); bw.Write(buffer); } bw.Write(OPCODE_END_OF_DIRECTORY); }