/// <summary>
 /// Inherited from MediaControllerAbstract.
 ///  Loads the text to the TextMesh component.
 /// </summary>
 public override void Load()
 {
     this.hasPlayedBefore   = false;
     this.subtitleFragments = SubtitleReader.ReadSubtitles(file_path);
     this.current_index     = 0;
     this.textMesh          = GetComponent <TextMesh>();
 }
예제 #2
0
        public Subtitle GetSubtitleByFile(string file, Types.SubtitleFormat format)
        {
            List <Dialog> dialogs = new List <Dialog>();

            SubtitleReader reader = null;

            switch (format)
            {
            case Types.SubtitleFormat.ASS:
                reader = new AssSubtitleReader();
                break;

            case Types.SubtitleFormat.SRT:
                reader = new SrtSubtitleReader();
                break;

            case Types.SubtitleFormat.VTT:
                reader = new VttSubtitleReader();
                break;
            }

            if (reader != null)
            {
                string[] contentLines = new StorageAccess.ReadFile().GetLines(file);
                reader.Load(contentLines);
                dialogs.AddRange(reader.GetDialogs());
            }


            return(new Subtitle(file, dialogs));
        }
예제 #3
0
        public List <Subtitle> GetSubtitlesByReadFormat()
        {
            SubtitleReader reader = null;

            string[] files = null;

            switch (ReadFormat)
            {
            case Types.SubtitleFormat.ASS:
                reader = new AssSubtitleReader();
                files  = storage.GetAllAssFiles();
                break;

            case Types.SubtitleFormat.SRT:
                reader = new SrtSubtitleReader();
                files  = storage.GetAllSrtFiles();
                break;

            case Types.SubtitleFormat.VTT:
                reader = new VttSubtitleReader();
                files  = storage.GetAllVttFiles();
                break;
            }

            if (reader == null)
            {
                return(new List <Subtitle>());
            }
            return(GetSubtitles(reader, files));
        }
예제 #4
0
    public void Init(string s, SubtitleReader sr)
    {
        sub       = s;
        this.text = GetComponentInChildren <Text>();
        text.text = sub;

        EventTrigger trigger = GetComponent <EventTrigger>();

        EventTrigger.Entry hoverEntry = new EventTrigger.Entry();
        hoverEntry.eventID = EventTriggerType.PointerEnter;
        hoverEntry.callback.AddListener(
            delegate
        {
            isHovering = true;
        });
        trigger.triggers.Add(hoverEntry);

        EventTrigger.Entry leaveEntry = new EventTrigger.Entry();
        leaveEntry.eventID = EventTriggerType.PointerExit;
        leaveEntry.callback.AddListener(
            delegate
        {
            isHovering = false;
        });
        trigger.triggers.Add(leaveEntry);

        EventTrigger.Entry selectEntry = new EventTrigger.Entry();
        selectEntry.eventID = EventTriggerType.PointerDown;
        selectEntry.callback.AddListener(
            delegate
        {
            if (sr.selectedSubtitle != null)
            {
                sr.selectedSubtitle.isSelected = false;
            }
            sr.selectedSubtitle = this;
            isSelected          = true;
        });
        trigger.triggers.Add(selectEntry);

        ScrollRect scroll = gameObject.GetComponentInParent <ScrollRect>();

        EventTrigger.Entry dragEnd = new EventTrigger.Entry();
        dragEnd.eventID = EventTriggerType.EndDrag;
        dragEnd.callback.AddListener((data) => { scroll.OnEndDrag((PointerEventData)data); });
        trigger.triggers.Add(dragEnd);

        EventTrigger.Entry dragBegin = new EventTrigger.Entry();
        dragBegin.eventID = EventTriggerType.BeginDrag;
        dragBegin.callback.AddListener((data) => { scroll.OnBeginDrag((PointerEventData)data); });
        trigger.triggers.Add(dragBegin);

        EventTrigger.Entry dragEntry = new EventTrigger.Entry();
        dragEntry.eventID = EventTriggerType.Drag;
        dragEntry.callback.AddListener((data) => { scroll.OnDrag((PointerEventData)data); });
        trigger.triggers.Add(dragEntry);
    }
예제 #5
0
 /// <summary>
 /// Tries to load a vtt subtitle from the given url
 /// and convert it to an srt formatted string.
 /// </summary>
 /// <param name="vttSubtitleUrl">The url of a vtt subtitle file.</param>
 /// <returns>An srt formatted string.</returns>
 string getVttSubtitleText(string vttSubtitleUrl)
 {
     try
     {
         if (!Helpers.UriUtils.IsValidUri(vttSubtitleUrl))
         {
             return(null);
         }
         string vttText = GetWebData(vttSubtitleUrl);
         return(SubtitleReader.VTT2SRT(vttText));
     }
     catch (Exception ex)
     {
         Log.Error("ITVPlayer: Error reading subtitles from '{0}'", vttSubtitleUrl);
         Log.Error(ex);
         return(null);
     }
 }
예제 #6
0
        private List <Subtitle> GetSubtitles(SubtitleReader reader, string[] files)
        {
            List <Subtitle> subtitles = new List <Subtitle>();

            for (int i = 0; i < files.Length; i++)
            {
                string file = files[i];
                Console.Clear();
                Console.WriteLine($"Reading File [{i+1}/{files.Length}]");
                Console.WriteLine($"Current file: {file}");

                string[] contentLines = new StorageAccess.ReadFile().GetLines(file);
                reader.Load(contentLines);

                IList <Dialog> dialogs = reader.GetDialogs();
                subtitles.Add(new Subtitle(file, dialogs));
            }

            return(subtitles);
        }
예제 #7
0
        string populateUrlsFromXml(VideoInfo video, XmlDocument streamPlaylist, bool live)
        {
            if (streamPlaylist == null)
            {
                Log.Warn("ITVPlayer: Stream playlist is null");
                return("");
            }

            XmlNode videoEntry = streamPlaylist.SelectSingleNode("//VideoEntries/Video");

            if (videoEntry == null)
            {
                Log.Warn("ITVPlayer: Could not find video entry");
                return("");
            }

            XmlNode node;

            node = videoEntry.SelectSingleNode("./MediaFiles");
            if (node == null || node.Attributes["base"] == null)
            {
                Log.Warn("ITVPlayer: Could not find base url");
                return("");
            }

            string rtmpUrl = node.Attributes["base"].Value;
            SortedList <string, string> options = new SortedList <string, string>(new StreamComparer());

            foreach (XmlNode mediaFile in node.SelectNodes("./MediaFile"))
            {
                if (mediaFile.Attributes["delivery"] == null || mediaFile.Attributes["delivery"].Value != "Streaming")
                {
                    continue;
                }

                string title = "";
                if (mediaFile.Attributes["bitrate"] != null)
                {
                    title = mediaFile.Attributes["bitrate"].Value;
                    int bitrate;
                    if (int.TryParse(title, out bitrate))
                    {
                        title = string.Format("{0} kbps", bitrate / 1000);
                    }
                }

                if (!options.ContainsKey(title))
                {
                    string url = new MPUrlSourceFilter.RtmpUrl(rtmpUrl)
                    {
                        PlayPath  = mediaFile.InnerText,
                        SwfUrl    = "http://mediaplayer.itv.com/2.18.5%2Bbuild.ad408a9c67/ITVMediaPlayer.swf",
                        SwfVerify = true,
                        Live      = live
                    }.ToString();
                    options.Add(title, url);
                }
            }

            if (RetrieveSubtitles)
            {
                node = videoEntry.SelectSingleNode("./ClosedCaptioningURIs");
                if (node != null && Helpers.UriUtils.IsValidUri(node.InnerText))
                {
                    video.SubtitleText = SubtitleReader.TimedText2SRT(GetWebData(node.InnerText));
                }
            }

            video.PlaybackOptions = new Dictionary <string, string>();
            if (options.Count == 0)
            {
                return(null);
            }

            if (AutoSelectStream)
            {
                var last = options.Last();
                video.PlaybackOptions.Add(last.Key, last.Value);
            }
            else
            {
                foreach (KeyValuePair <string, string> key in options)
                {
                    video.PlaybackOptions.Add(key.Key, key.Value);
                }
            }
            return(options.Last().Value);
        }
예제 #8
0
        public override string GetVideoUrl(VideoInfo video)
        {
            Log.Debug(@"video: {0}", video.Title);
            string result = string.Empty;

            video.PlaybackOptions = new Dictionary <string, string>();
            // keep track of bitrates and URLs
            Dictionary <int, string> urlsDictionary = new Dictionary <int, string>();

            string pid = string.Empty;

            // must find pid before proceeding
            if (video.VideoUrl.Contains(@"pid="))
            {
                pid = HttpUtility.ParseQueryString(new Uri(video.VideoUrl).Query)["pid"];
            }
            else
            {
                string data = GetWebData(video.VideoUrl);

                Match pidMatch = pidRegex.Match(data);
                if (pidMatch.Success)
                {
                    pid = pidMatch.Groups["pid"].Value;
                }
            }

            if (!string.IsNullOrEmpty(pid))
            {
                XmlDocument xml = GetWebData <XmlDocument>(string.Format(thePlatformUrlFormat, pid));
                Log.Debug(@"SMIL loaded from {0}", string.Format(thePlatformUrlFormat, pid));

                XmlNamespaceManager nsmRequest = new XmlNamespaceManager(xml.NameTable);
                nsmRequest.AddNamespace("a", @"http://www.w3.org/2005/SMIL21/Language");

                XmlNode metaBase = xml.SelectSingleNode(@"//a:meta", nsmRequest);
                // base URL may be stored in the base attribute of <meta> tag
                string url = metaBase != null ? metaBase.Attributes["base"].Value : string.Empty;

                foreach (XmlNode node in xml.SelectNodes("//a:body/a:switch/a:video", nsmRequest))
                {
                    int bitrate = int.Parse(node.Attributes["system-bitrate"].Value);
                    // do not bother unless bitrate is non-zero
                    if (bitrate == 0)
                    {
                        continue;
                    }

                    if (url.StartsWith("rtmp") && !urlsDictionary.ContainsKey(bitrate / 1000))
                    {
                        string playPath = node.Attributes["src"].Value;
                        if (playPath.EndsWith(@".mp4") && !playPath.StartsWith(@"mp4:"))
                        {
                            // prepend with mp4:
                            playPath = @"mp4:" + playPath;
                        }
                        else if (playPath.EndsWith(@".flv"))
                        {
                            // strip extension
                            playPath = playPath.Replace(@".flv", string.Empty);
                        }
                        Log.Debug(@"bitrate: {0}, url: {1}, PlayPath: {2}", bitrate / 1000, url, playPath);
                        urlsDictionary.Add(bitrate / 1000, new MPUrlSourceFilter.RtmpUrl(url)
                        {
                            PlayPath = playPath
                        }.ToString());
                    }
                }

                // closed captions
                string subtitleText = string.Empty;
                if (retrieveSubtitles)
                {
                    XmlNode ccUrl = xml.SelectSingleNode("//a:body/a:switch/a:ref/a:param[@name='ClosedCaptionURL']", nsmRequest);
                    if (ccUrl != null)
                    {
                        subtitleText = SubtitleReader.TimedText2SRT(GetWebData(ccUrl.Attributes["value"].Value));
                    }
                }

                // sort the URLs ascending by bitrate
                foreach (var item in urlsDictionary.OrderBy(u => u.Key))
                {
                    video.PlaybackOptions.Add(string.Format("{0} kbps", item.Key), item.Value);
                    if (!string.IsNullOrEmpty(subtitleText))
                    {
                        video.SubtitleText = subtitleText;
                    }
                    // return last URL as the default (will be the highest bitrate)
                    result = item.Value;
                }

                // if result is still empty then perhaps we are geo-locked
                if (string.IsNullOrEmpty(result))
                {
                    XmlNode geolockReference = xml.SelectSingleNode(@"//a:seq/a:ref", nsmRequest);
                    if (geolockReference != null)
                    {
                        string message = geolockReference.Attributes["abstract"] != null ?
                                         geolockReference.Attributes["abstract"].Value :
                                         @"This content is not available in your location.";
                        Log.Error(message);
                        throw new OnlineVideosException(message, true);
                    }
                }
            }
            return(result);
        }