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