Beispiel #1
0
        private static Stream TranslateTextStream(Shoko.Models.MediaInfo.Track sub)
        {
            Stream s = new Stream
            {
                Id      = ParseInt(sub.UniqueID),
                CodecID = sub.CodecID,

                StreamType = 3
            };
            string title = sub.Title;

            if (!string.IsNullOrEmpty(title))
            {
                s.Title = title;
            }
            else if (!string.IsNullOrEmpty(title = sub.Subtitle))
            {
                s.Title = title;
            }
            PopulateLanguage(sub, s);
            s.Index  = ParseByte(sub.ID);
            s.Format = s.Codec = GetFormat(sub.CodecID, sub.Format);

            string def = sub.Default;

            if (!string.IsNullOrEmpty(def))
            {
                if (def.ToLower(CultureInfo.InvariantCulture) == "yes")
                {
                    s.Default = 1;
                }
            }
            string forced = sub.Forced;

            if (!string.IsNullOrEmpty(forced))
            {
                if (forced.ToLower(CultureInfo.InvariantCulture) == "yes")
                {
                    s.Forced = 1;
                }
            }


            return(s);
        }
Beispiel #2
0
        public static void PopulateLanguage(Shoko.Models.MediaInfo.Track t, Stream stream)
        {
            string s = t.Language;

            if (string.IsNullOrEmpty(s))
            {
                return;
            }
            if (s.Length == 2)
            {
                stream.Language     = PostTranslateLan(Code2ToLanguage(s, s));
                stream.LanguageCode = PostTranslateCode3(Code2ToCode3(s, s));
                return;
            }
            if (s.Length == 3)
            {
                stream.Language     = PostTranslateLan(Code3ToLanguage(s, s));
                stream.LanguageCode = PostTranslateCode3(s);
                return;
            }
            stream.Language     = s;
            stream.LanguageCode = s;
        }
Beispiel #3
0
        public static Media ConvertToPlexMedia(string mediainfo, SVR_VideoLocal vl)
        {
            Shoko.Models.MediaInfo.MediaInfo minfo = JsonConvert.DeserializeObject <Shoko.Models.MediaInfo.MediaInfo>(mediainfo);
            Media m = new Media();
            Part  p = new Part();

            Shoko.Models.MediaInfo.Track general = minfo.Media.Tracks.First(a => a.Type == "General");
            m.Duration = p.Duration = ParseDouble(general.Duration);
            p.Size     = ParseLong(general.FileSize);
            double brate = ParseDouble(general.BitRate);

            if (brate != 0)
            {
                m.Bitrate = (int)Math.Round(brate / 1000F);
            }
            int chaptercount = ParseInt(general.MenuCount);

            m.Chaptered = chaptercount > 0;
            int video_count = ParseInt(general.VideoCount);
            int audio_count = ParseInt(general.AudioCount);
            int text_count  = ParseInt(general.TextCount);

            m.Container = p.Container = TranslateContainer(general.Format);
            string codid = general.CodecID;

            if (!string.IsNullOrEmpty(codid) && (codid.Trim().ToLower() == "qt"))
            {
                m.Container = p.Container = "mov";
            }
            List <Stream> streams     = new List <Stream>();
            byte          iidx        = 0;
            Stream        VideoStream = null;

            if (video_count > 0)
            {
                int x = 0;
                foreach (Shoko.Models.MediaInfo.Track video in minfo.Media.Tracks.Where(a => a.Type == "Video"))
                {
                    Stream s = TranslateVideoStream(video);
                    if (x == 0)
                    {
                        VideoStream = s;
                        m.Width     = s.Width;
                        m.Height    = s.Height;
                        if (m.Height != 0)
                        {
                            if (m.Width != 0)
                            {
                                m.VideoResolution = GetResolution(m.Width, m.Height);
                                m.AspectRatio     = GetAspectRatio(m.Width, m.Height, s.PA);
                            }
                        }
                        if (s.FrameRate != 0)
                        {
                            float  fr  = System.Convert.ToSingle(s.FrameRate);
                            string frs = ((int)Math.Round(fr)).ToString(CultureInfo.InvariantCulture);
                            if (!string.IsNullOrEmpty(s.ScanType))
                            {
                                if (s.ScanType.ToLower().Contains("int"))
                                {
                                    frs += "i";
                                }
                                else
                                {
                                    frs += "p";
                                }
                            }
                            else
                            {
                                frs += "p";
                            }
                            if ((frs == "25p") || (frs == "25i"))
                            {
                                frs = "PAL";
                            }
                            else if ((frs == "30p") || (frs == "30i"))
                            {
                                frs = "NTSC";
                            }
                            m.VideoFrameRate = frs;
                        }
                        m.VideoCodec = string.IsNullOrEmpty(s.CodecID) ? s.Codec : s.CodecID;
                        if (m.Duration != 0 && s.Duration != 0)
                        {
                            if (s.Duration > m.Duration)
                            {
                                m.Duration = p.Duration = s.Duration;
                            }
                        }
                        if (video_count == 1)
                        {
                            s.Default = 0;
                            s.Forced  = 0;
                        }
                    }

                    if (m.Container != "mkv")
                    {
                        s.Index = iidx;
                        iidx++;
                    }
                    streams.Add(s);
                    x++;
                }
            }
            int totalsoundrate = 0;

            if (audio_count > 0)
            {
                int x = 0;
                foreach (Shoko.Models.MediaInfo.Track audio in minfo.Media.Tracks.Where(a => a.Type == "Audio"))
                {
                    Stream s = TranslateAudioStream(audio);
                    if ((s.Codec == "adpcm") && (p.Container == "flv"))
                    {
                        s.Codec = "adpcm_swf";
                    }
                    if (x == 0)
                    {
                        m.AudioCodec    = string.IsNullOrEmpty(s.CodecID) ? s.Codec : s.CodecID;
                        m.AudioChannels = s.Channels;
                        if (m.Duration != 0 && s.Duration != 0)
                        {
                            if (s.Duration > m.Duration)
                            {
                                m.Duration = p.Duration = s.Duration;
                            }
                        }
                        if (audio_count == 1)
                        {
                            s.Default = 0;
                            s.Forced  = 0;
                        }
                    }
                    if (s.Bitrate != 0)
                    {
                        totalsoundrate += s.Bitrate;
                    }
                    if (m.Container != "mkv")
                    {
                        s.Index = iidx;
                        iidx++;
                    }
                    streams.Add(s);
                    x++;
                }
            }
            if ((VideoStream != null) && VideoStream.Bitrate == 0 && m.Bitrate != 0)
            {
                VideoStream.Bitrate = m.Bitrate - totalsoundrate;
            }
            if (text_count > 0)
            {
                foreach (Shoko.Models.MediaInfo.Track sub in minfo.Media.Tracks.Where(a => a.Type == "Text"))

                {
                    Stream s = TranslateTextStream(sub);
                    streams.Add(s);
                    if (text_count == 1)
                    {
                        s.Default = 0;
                        s.Forced  = 0;
                    }
                    if (m.Container != "mkv")
                    {
                        s.Index = iidx;
                        iidx++;
                    }
                }
            }

            m.Parts = new List <Part> {
                p
            };
            bool over = false;

            if (m.Container == "mkv")
            {
                byte val = byte.MaxValue;
                foreach (Stream s in streams.OrderBy(a => a.Index).Skip(1))
                {
                    if (s.Index <= 0)
                    {
                        over = true;
                        break;
                    }
                    s.idx = s.Index;
                    if (s.idx < val)
                    {
                        val = s.idx;
                    }
                }
                if (val != 0 && !over)
                {
                    foreach (Stream s in streams)
                    {
                        s.idx   = (byte)(s.idx - val);
                        s.Index = s.idx;
                    }
                }
                else if (over)
                {
                    byte xx = 0;
                    foreach (Stream s in streams)
                    {
                        s.idx   = xx++;
                        s.Index = s.idx;
                    }
                }
                streams = streams.OrderBy(a => a.idx).ToList();
            }
            p.Streams = streams;
            m.Id      = vl.VideoLocalID;
            if (string.IsNullOrEmpty(vl.SubtitleStreams))
            {
                return(m);
            }
            List <Stream> subs = JsonConvert.DeserializeObject <List <Stream> >(vl.SubtitleStreams);

            if (subs != null && subs.Count > 0)
            {
                m.Parts[0].Streams.AddRange(subs);
            }

            foreach (Part pa in m.Parts)
            {
                pa.Id         = 0;
                pa.Accessible = 1;
                pa.Exists     = 1;
                bool vid = false;
                bool aud = false;
                bool txt = false;
                foreach (Stream ss in pa.Streams.ToArray())
                {
                    if (ss.StreamType == 1 && !vid)
                    {
                        vid = true;
                    }
                    if (ss.StreamType == 2 && !aud)
                    {
                        aud         = true;
                        ss.Selected = 1;
                    }

                    if (ss.StreamType == 3 && !txt)
                    {
                        txt         = true;
                        ss.Selected = 1;
                    }
                }
            }
            return(m);
        }
Beispiel #4
0
        private static Stream TranslateAudioStream(Shoko.Models.MediaInfo.Track audio)
        {
            Stream s = new Stream
            {
                Id      = ParseInt(audio.UniqueID),
                CodecID = audio.CodecID,
                Codec   = TranslateCodec(audio.CodecID)
            };
            string title = audio.Title;

            if (!string.IsNullOrEmpty(title))
            {
                s.Title = title;
            }

            s.StreamType = 2;
            PopulateLanguage(audio, s);


            double duration = ParseDouble(audio.Duration);

            if (duration != 0)
            {
                s.Duration = duration;
            }

            double brate = BiggerFromList(audio.BitRate);

            if (brate != 0)
            {
                s.Bitrate = (int)Math.Round(brate / 1000F);
            }

            byte bitdepth = ParseByte(audio.BitDepth);

            if (bitdepth != 0)
            {
                s.BitDepth = bitdepth;
            }

            string fprofile = audio.Format_Profile;

            if (!string.IsNullOrEmpty(fprofile))
            {
                if ((fprofile.ToLower() != "layer 3") && (fprofile.ToLower() != "dolby digital") &&
                    (fprofile.ToLower() != "pro") &&
                    (fprofile.ToLower() != "layer 2"))
                {
                    s.Profile = fprofile.ToLower(CultureInfo.InvariantCulture);
                }
                if (fprofile.ToLower().StartsWith("ma"))
                {
                    s.Profile = "ma";
                }
            }
            string fset = audio.Format_Settings;

            if (!string.IsNullOrEmpty(fset) && (fset == "Little / Signed") && (s.Codec == "pcm") && (bitdepth == 16))
            {
                s.Profile = "pcm_s16le";
            }
            else if (!string.IsNullOrEmpty(fset) && (fset == "Big / Signed") && (s.Codec == "pcm") && (bitdepth == 16))
            {
                s.Profile = "pcm_s16be";
            }
            else if (!string.IsNullOrEmpty(fset) && (fset == "Little / Unsigned") && (s.Codec == "pcm") &&
                     (bitdepth == 8))
            {
                s.Profile = "pcm_u8";
            }

            string id = audio.ID;

            if (!string.IsNullOrEmpty(id) && byte.TryParse(id, out byte idx))
            {
                s.Index = idx;
            }

            double pa = BiggerFromList(audio.SamplingRate);

            if (pa != 0)
            {
                s.SamplingRate = (int)pa;
            }
            double channels = BiggerFromList(audio.Channels);

            if (channels != 0)
            {
                s.Channels = (byte)channels;
            }
            double channelso = BiggerFromList(audio.Channels_Original);

            if (channelso != 0)
            {
                s.Channels = (byte)channelso;
            }

            string bitRateMode = audio.BitRate_Mode;

            if (!string.IsNullOrEmpty(bitRateMode))
            {
                s.BitrateMode = bitRateMode.ToLower(CultureInfo.InvariantCulture);
            }
            string dialnorm = audio.Dialnorm;

            if (!string.IsNullOrEmpty(dialnorm))
            {
                s.DialogNorm = dialnorm;
            }
            dialnorm = audio.Dialnorm_Average;
            if (!string.IsNullOrEmpty(dialnorm))
            {
                s.DialogNorm = dialnorm;
            }

            string def = audio.Default;

            if (!string.IsNullOrEmpty(def))
            {
                if (def.ToLower(CultureInfo.InvariantCulture) == "yes")
                {
                    s.Default = 1;
                }
            }

            string forced = audio.Forced;

            if (!string.IsNullOrEmpty(forced))
            {
                if (forced.ToLower(CultureInfo.InvariantCulture) == "yes")
                {
                    s.Forced = 1;
                }
            }
            return(s);
        }
Beispiel #5
0
        private static Stream TranslateVideoStream(Shoko.Models.MediaInfo.Track video)
        {
            Stream s = new Stream
            {
                Id         = ParseInt(video.UniqueID),
                Codec      = TranslateCodec(video.CodecID),
                CodecID    = video.CodecID,
                StreamType = 1,
                Width      = ParseInt(video.Width),
                Height     = ParseInt(video.Height),
                Duration   = ParseDouble(video.Duration)
            };
            string title = video.Title;

            if (!string.IsNullOrEmpty(title))
            {
                s.Title = title;
            }
            PopulateLanguage(video, s);
            double brate = BiggerFromList(video.BitRate);

            if (brate != 0)
            {
                s.Bitrate = (int)Math.Round(brate / 1000F);
            }
            string stype = video.ScanType;

            if (!string.IsNullOrEmpty(stype))
            {
                s.ScanType = stype.ToLower();
            }
            s.RefFrames = ParseByte(video.Format_Settings_RefFrames);
            string fprofile = video.Format_Profile;

            if (!string.IsNullOrEmpty(fprofile))
            {
                int a = fprofile.ToLower(CultureInfo.InvariantCulture).IndexOf("@", StringComparison.Ordinal);
                if (a > 0)
                {
                    s.Profile = TranslateProfile(s.Codec,
                                                 fprofile.ToLower(CultureInfo.InvariantCulture).Substring(0, a));
                    if (int.TryParse(TranslateLevel(fprofile.ToLower(CultureInfo.InvariantCulture).Substring(a + 1)),
                                     out int level))
                    {
                        s.Level = level;
                    }
                }
                else
                {
                    s.Profile = TranslateProfile(s.Codec, fprofile.ToLower(CultureInfo.InvariantCulture));
                }
            }

            double rot = ParseDouble(video.Rotation);

            if (rot != 0)
            {
                switch (rot)
                {
                case 90F:
                    s.Orientation = 9;
                    break;

                case 180F:
                    s.Orientation = 3;
                    break;

                case 270F:
                    s.Orientation = 6;
                    break;
                }
            }

            string muxing = video.MuxingMode;

            if (!string.IsNullOrEmpty(muxing))
            {
                if (muxing.ToLower(CultureInfo.InvariantCulture).Contains("strip"))
                {
                    s.HeaderStripping = 1;
                }
            }

            string cabac = video.Format_Settings_CABAC;

            if (!string.IsNullOrEmpty(cabac))
            {
                s.Cabac = (byte)(cabac.ToLower(CultureInfo.InvariantCulture) == "yes" ? 1 : 0);
            }
            if (s.Codec == "h264")
            {
                if (s.Level == 31 && s.Cabac == 0)
                {
                    s.HasScalingMatrix = 1;
                }
                else
                {
                    s.HasScalingMatrix = 0;
                }
            }

            string fratemode = video.FrameRate_Mode;

            if (!string.IsNullOrEmpty(fratemode))
            {
                s.FrameRateMode = fratemode.ToLower(CultureInfo.InvariantCulture);
            }
            double frate = ParseDouble(video.FrameRate);

            if (frate == 0.0D)
            {
                frate = ParseDouble(video.FrameRate_Original);
            }
            if (frate != 0.0D)
            {
                s.FrameRate = frate;
            }
            string colorspace = video.ColorSpace;

            if (!string.IsNullOrEmpty(colorspace))
            {
                s.ColorSpace = colorspace.ToLower(CultureInfo.InvariantCulture);
            }
            string chromasubsampling = video.ChromaSubsampling;

            if (!string.IsNullOrEmpty(chromasubsampling))
            {
                s.ChromaSubsampling = chromasubsampling.ToLower(CultureInfo.InvariantCulture);
            }


            byte bitdepth = ParseByte(video.BitDepth);

            if (bitdepth != 0)
            {
                s.BitDepth = bitdepth;
            }
            string id = video.ID;

            if (!string.IsNullOrEmpty(id))
            {
                if (byte.TryParse(id, out byte idx))
                {
                    s.Index = idx;
                }
            }

            string qpel = video.Format_Settings_QPel;

            if (!string.IsNullOrEmpty(qpel))
            {
                s.QPel = (byte)(qpel.ToLower(CultureInfo.InvariantCulture) == "yes" ? 1 : 0);
            }

            string gmc = video.Format_Settings_GMC;

            if (!string.IsNullOrEmpty(gmc))
            {
                s.GMC = gmc;
            }
            string bvop = video.Format_Settings_BVOP;

            if (!string.IsNullOrEmpty(bvop) && (s.Codec != "mpeg1video"))
            {
                if (bvop == "No")
                {
                    s.BVOP = 0;
                }
                else if ((bvop == "1") || (bvop == "Yes"))
                {
                    s.BVOP = 1;
                }
            }

            string def = video.Default;

            if (!string.IsNullOrEmpty(def))
            {
                if (def.ToLower(CultureInfo.InvariantCulture) == "yes")
                {
                    s.Default = 1;
                }
            }

            string forced = video.Forced;

            if (!string.IsNullOrEmpty(forced))
            {
                if (forced.ToLower(CultureInfo.InvariantCulture) == "yes")
                {
                    s.Forced = 1;
                }
            }

            s.PA = ParseDouble(video.PixelAspectRatio);
            string sp2 = video.PixelAspectRatio_Original;

            if (!string.IsNullOrEmpty(sp2))
            {
                s.PA = ParseDouble(sp2);
            }
            if ((s.PA != 1.0) && s.Width != 0)
            {
                if (s.Width != 0)
                {
                    double width = s.Width;
                    width *= s.PA;
                    s.PixelAspectRatio = (int)Math.Round(width) + ":" + s.Width;
                }
            }

            return(s);
        }