Example #1
0
        public Process MakeDebugYoutubeProcessAndReturnIt(VideoData video)
        {
            string levelPath = VideoLoader.GetLevelPath(video.level);

            if (!Directory.Exists(levelPath))
            {
                Directory.CreateDirectory(levelPath);
            }

            string videoFileName = video.title;

            // Strip invalid characters
            foreach (var c in Path.GetInvalidFileNameChars())
            {
                videoFileName = videoFileName.Replace(c, '-');
            }

            videoFileName = videoFileName.Replace('\\', '-');
            videoFileName = videoFileName.Replace('/', '-');

            video.videoPath = videoFileName + ".mp4";


            Plugin.logger.Info("Name Created");
            // Download the video via youtube-dl
            var ytProcess = new Process
            {
                StartInfo =
                {
                    FileName  = Environment.CurrentDirectory + "/Youtube-dl/youtube-dl.exe",
                    Arguments = "https://www.youtube.com" + video.URL +
                                " -f \"" + VideoQualitySetting.Format(quality) + "\"" + // Formats
                                " --no-cache-dir" +                                     // Don't use temp storage
                                $" -o \"{EscapeStringForPythonStringFormatter(videoFileName)}.%(ext)s\"" +
                                " --no-playlist" +                                      // Don't download playlists, only the first video
                                " --no-part" +                                          // Don't store download in parts, write directly to file
                                (hasFFMPEG
                                    ? " --recode-video mp4"
                                    : ""
                                ) +                      //Try to recode the video if ffmpeg is installed to fix issue with improper encoding
                                " --no-mtime" +          //Video last modified will be when it was downloaded, not when it was uploaded to youtube
                                " --socket-timeout 10" + //Retry if no response in 10 seconds Note: Not if download takes more than 10 seconds but if the time between any 2 messages from the server is 10 seconds
                                " --no-continue"         //overwrite existing file and force re-download
                    ,
                    RedirectStandardOutput = false,
                    RedirectStandardError  = false,
                    UseShellExecute        = true,
                    CreateNoWindow         = true,
                    WorkingDirectory       = levelPath
                },
                EnableRaisingEvents = true,
                //I think these are added only after Process Started
                //PriorityClass = ProcessPriorityClass.RealTime,
                //PriorityBoostEnabled = true
            };

            YouTubeDownloader.externalProcesses.Add(ytProcess);

            return(ytProcess);
        }
Example #2
0
        private static void CreateSettingsUI()
        {
            var subMenu = SettingsUI.CreateSubMenu("VideoPlayer");

            var showVideoSetting = subMenu.AddBool("Show Video");

            showVideoSetting.GetValue += delegate
            {
                return(ScreenManager.showVideo);
            };
            showVideoSetting.SetValue += delegate(bool value)
            {
                ScreenManager.showVideo = value;
                ModPrefs.SetBool(Plugin.PluginName, "ShowVideo", ScreenManager.showVideo);
            };

            var placementSetting = subMenu.AddList("Screen Position", VideoPlacementSetting.Modes());

            placementSetting.GetValue += delegate
            {
                return((float)ScreenManager.Instance.placement);
            };
            placementSetting.SetValue += delegate(float value)
            {
                ScreenManager.Instance.SetPlacement((VideoPlacement)value);
                ModPrefs.SetInt(Plugin.PluginName, "ScreenPositionMode", (int)ScreenManager.Instance.placement);
            };
            placementSetting.FormatValue += delegate(float value) { return(VideoPlacementSetting.Name((VideoPlacement)value)); };


            var qualitySetting = subMenu.AddList("Video Download Quality", VideoQualitySetting.Modes());

            qualitySetting.GetValue += delegate
            {
                return((float)YouTubeDownloader.Instance.quality);
            };
            qualitySetting.SetValue += delegate(float value)
            {
                YouTubeDownloader.Instance.quality = (VideoQuality)value;
                ModPrefs.SetInt(Plugin.PluginName, "VideoDownloadQuality", (int)YouTubeDownloader.Instance.quality);
            };
            qualitySetting.FormatValue += delegate(float value) { return(VideoQualitySetting.Name((VideoQuality)value)); };


            var autoDownloadSetting = subMenu.AddBool("Auto Download");

            autoDownloadSetting.GetValue += delegate
            {
                return(VideoLoader.Instance.autoDownload);
            };
            autoDownloadSetting.SetValue += delegate(bool value)
            {
                VideoLoader.Instance.autoDownload = value;
                ModPrefs.SetBool(Plugin.PluginName, "AutoDownload", ScreenManager.showVideo);
            };
        }
Example #3
0
 private Settings()
 {
     config        = new Config("MVP");
     placementMode = VideoPlacementSetting.FromName(
         config.GetString("Positions", "Video Placement", "")
         );
     qualityMode = VideoQualitySetting.FromName(
         config.GetString("Modes", "Video Quality", "")
         );
 }
Example #4
0
        public Process MakeYoutubeProcessAndReturnIt(VideoData video)
        {
            string levelPath = VideoLoader.GetLevelPath(video.level);

            if (!Directory.Exists(levelPath))
            {
                Directory.CreateDirectory(levelPath);
            }

            string videoFileName = video.title;

            // Strip invalid characters
            foreach (var c in Path.GetInvalidFileNameChars())
            {
                videoFileName = videoFileName.Replace(c, '-');
            }
            videoFileName = videoFileName.Replace('\\', '-');
            videoFileName = videoFileName.Replace('/', '-');

            video.videoPath = videoFileName + ".mp4";

            // Download the video via youtube-dl
            var ytProcess = new Process
            {
                StartInfo =
                {
                    FileName  = Environment.CurrentDirectory + "/Youtube-dl/youtube-dl.exe",
                    Arguments = "https://www.youtube.com" + video.URL +
                                " -f \"" + VideoQualitySetting.Format(quality) + "\"" + // Formats
                                " --no-cache-dir" +                                     // Don't use temp storage
                                " -o \"" + levelPath + $"\\{videoFileName}.%(ext)s\"" +
                                " --no-playlist" +                                      // Don't download playlists, only the first video
                                " --no-part" +                                          // Don't store download in parts, write directly to file
                                (hasFFMPEG ? " --recode-video mp4" : ""),
                    RedirectStandardOutput = true,
                    RedirectStandardError  = true,
                    UseShellExecute        = false,
                    CreateNoWindow         = true
                },
                EnableRaisingEvents = true
            };

            return(ytProcess);
        }
        private IEnumerator DownloadVideo()
        {
            downloading = true;

            if (!updated)
            {
                yield return(new WaitUntil(() => updated));
            }

            VideoDownload download = videoQueue.Peek();
            VideoData     video    = download.video;

            if (video.downloadState == DownloadState.Cancelled || download.downloadAttempts > MaxRetries)
            {
                // skip
                videoQueue.Dequeue();

                if (videoQueue.Count > 0)
                {
                    // Start next download
                    DownloadVideo();
                }
                else
                {
                    // queue empty
                    downloading = false;
                    yield break;
                }
            }

            StopCoroutine(Countdown(download));

            video.downloadState = DownloadState.Downloading;
            downloadProgress?.Invoke(video);
            download.Update();

            string levelPath = VideoLoader.GetLevelPath(video.level);

            if (!Directory.Exists(levelPath))
            {
                Directory.CreateDirectory(levelPath);
            }

            string videoFileName = video.title;

            // Strip invalid characters
            foreach (var c in Path.GetInvalidFileNameChars())
            {
                videoFileName = videoFileName.Replace(c, '-');
            }
            videoFileName = videoFileName.Replace('\\', '-');
            videoFileName = videoFileName.Replace('/', '-');

            video.videoPath = videoFileName + ".mp4";

            // Download the video via youtube-dl
            ydl = new Process();

            ydl.StartInfo.FileName  = Environment.CurrentDirectory + "\\Youtube-dl\\youtube-dl.exe";
            ydl.StartInfo.Arguments =
                "https://www.youtube.com" + video.URL +
                " -f \"" + VideoQualitySetting.Format(quality) + "\"" + // Formats
                " --no-cache-dir" +                                     // Don't use temp storage
                " -o \"" + levelPath + $"\\{videoFileName}.%(ext)s\"" +
                " --no-playlist" +                                      // Don't download playlists, only the first video
                " --no-part";                                           // Don't store download in parts, write directly to file

            ydl.StartInfo.RedirectStandardOutput = true;
            ydl.StartInfo.RedirectStandardError  = true;
            ydl.StartInfo.UseShellExecute        = false;
            ydl.StartInfo.CreateNoWindow         = true;
            ydl.EnableRaisingEvents = true;

            ydl.Start();

            // Hook up our output to console
            ydl.BeginOutputReadLine();
            ydl.BeginErrorReadLine();

            ydl.OutputDataReceived += (sender, e) => {
                if (e.Data != null)
                {
                    Regex rx    = new Regex(@"(\d*).\d%+");
                    Match match = rx.Match(e.Data);
                    if (match.Success)
                    {
                        video.downloadProgress = float.Parse(match.Value.Substring(0, match.Value.Length - 1)) / 100;
                        downloadProgress?.Invoke(video);
                        download.Update();
                    }
                }
            };

            ydl.ErrorDataReceived += (sender, e) => {
                if (e.Data.Length < 3)
                {
                    return;
                }
                //to do: check these errors are problems - redownload or skip file when an error occurs
                //video.downloadState = DownloadState.Cancelled;
                downloadProgress?.Invoke(video);
                download.Update();
            };

            ydl.Exited += (sender, e) => {
                StopCoroutine(Countdown(download));

                if (video.downloadState == DownloadState.Cancelled)
                {
                    VideoLoader.Instance.DeleteVideo(video);
                }
                else
                {
                    video.downloadState = DownloadState.Downloaded;
                    VideoLoader.SaveVideoToDisk(video);
                    StartCoroutine(VerifyDownload(video));
                }

                videoQueue.Dequeue();

                if (videoQueue.Count > 0)
                {
                    // Start next download
                    DownloadVideo();
                }
                else
                {
                    // queue empty
                    downloading = false;
                }
                ydl.Dispose();
            };
        }
        private void DownloadVideo()
        {
            VideoData video = videoQueue.Peek();

            if (video.downloadState == DownloadState.Cancelled)
            {
                // skip
                videoQueue.Dequeue();

                if (videoQueue.Count > 0)
                {
                    // Start next download
                    DownloadVideo();
                }
                else
                {
                    // queue empty
                    downloading = false;
                    return;
                }
            }

            downloading         = true;
            video.downloadState = DownloadState.Downloading;
            downloadProgress?.Invoke(video);
            string levelPath = VideoLoader.GetLevelPath(video.level);

            if (!Directory.Exists(levelPath))
            {
                Directory.CreateDirectory(levelPath);
            }
            // Download the video via youtube-dl
            ydl = new Process();

            string videoFileName = video.title;

            // Strip invalid characters
            foreach (var c in Path.GetInvalidFileNameChars())
            {
                videoFileName = videoFileName.Replace(c, '-');
            }
            video.videoPath = videoFileName + ".mp4";

            ydl.StartInfo.FileName  = Environment.CurrentDirectory + "/Youtube-dl/youtube-dl.exe";
            ydl.StartInfo.Arguments =
                "https://www.youtube.com" + video.URL +
                " -f \"" + VideoQualitySetting.Format(quality) + "\"" + // Formats
                " --no-cache-dir" +                                     // Don't use temp storage
                " -o \"" + levelPath + $"\\{videoFileName}.%(ext)s\"" +
                " --no-playlist" +                                      // Don't download playlists, only the first video
                " --no-part";                                           // Don't store download in parts, write directly to file


            ydl.StartInfo.RedirectStandardOutput = true;
            ydl.StartInfo.RedirectStandardError  = true;
            ydl.StartInfo.UseShellExecute        = false;
            ydl.StartInfo.CreateNoWindow         = true;
            ydl.EnableRaisingEvents = true;

            ydl.Start();

            // Hook up our output to console
            ydl.BeginOutputReadLine();
            ydl.BeginErrorReadLine();

            ydl.OutputDataReceived += (sender, e) => {
                if (e.Data != null)
                {
                    //[download]  81.8% of 40.55MiB at  4.80MiB/s ETA 00:01
                    //[download] Resuming download at byte 48809440
                    //
                    Regex rx    = new Regex(@"(\d+).\d%+");
                    Match match = rx.Match(e.Data);
                    if (match.Success)
                    {
                        video.downloadProgress = float.Parse(match.Value.Substring(0, match.Value.Length - 2)) / 100;
                        downloadProgress?.Invoke(video);
                    }
                    Console.WriteLine(e.Data);
                }
            };

            ydl.ErrorDataReceived += (sender, e) => {
                Console.WriteLine(e.Data);
                //to do: check these errors problems - redownload or skip file when an error occurs
            };

            ydl.Exited += (sender, e) => {
                // to do: check that the file was indeed downloaded correctly

                if (video.downloadState == DownloadState.Cancelled)
                {
                    VideoLoader.Instance.DeleteVideo(video);
                }
                else
                {
                    video.downloadState = DownloadState.Downloaded;
                    VideoLoader.SaveVideoToDisk(video);
                    StartCoroutine(VerifyDownload(video));
                }

                videoQueue.Dequeue();

                if (videoQueue.Count > 0)
                {
                    // Start next download
                    DownloadVideo();
                }
                else
                {
                    // queue empty
                    downloading = false;
                }
            };
        }