Inheritance: PublishWorker
Esempio n. 1
0
        private void TrimButton_Click(object sender, EventArgs e)
        {
            MainModel.Initialize();

            OpenFileDialog.CheckFileExists = true;
            OpenFileDialog.FileName = "";

            string supportedExtensionsAsSingleString = "";
            foreach (string supportedExtension in MainModel.GetVideoExtensions())
            {
                supportedExtensionsAsSingleString += "*" + supportedExtension + ";";
            }
            if (supportedExtensionsAsSingleString.Length > 0)
                supportedExtensionsAsSingleString = supportedExtensionsAsSingleString.Substring(0, supportedExtensionsAsSingleString.Length - 1);

            OpenFileDialog.Multiselect = false;
            OpenFileDialog.Title = "Tell me which video you'd like to trim.";
            OpenFileDialog.Filter = "Supported Files (" + supportedExtensionsAsSingleString + ")|" + supportedExtensionsAsSingleString + "|All Files (*.*)|*.*";
            OpenFileDialog.ShowDialog();

            if (File.Exists(OpenFileDialog.FileName))
            {
                var inputFileObject = new InputFileObject(new FileInfo(OpenFileDialog.FileName));

                string ss = "0:00:00", end = "0:00:00";
                if (InputBox("Start time", "What is the starting time that you'd like to trim from? (e.g. 0:00:20)", ref ss) == DialogResult.OK)
                {
                    if (InputBox("End time", "What is the ending time that you'd like to trim to? (e.g. 0:00:35)", ref end) == DialogResult.OK)
                    {

                        var saveFileDialog = new SaveFileDialog();
                        saveFileDialog.InitialDirectory = inputFileObject.SourceFileInfo.DirectoryName;
                        saveFileDialog.FileName = inputFileObject.SourceFileInfo.Name + " - " + ss + " to " + end + inputFileObject.SourceFileInfo.Extension;
                        saveFileDialog.Title = "Where should we save the new file?";

                        if (saveFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                        {

                            using (var scanWorker = new ScanWorker(inputFileObject))
                            {

                                scanWorker.SetFramesPerSecond();
                                scanWorker.SetBitrate();

                                var highlightObject = new HighlightObject();
                                highlightObject.InputFileObject = inputFileObject;
                                highlightObject.StartTime = TimeSpan.Parse(ss); // ex. 0:06
                                highlightObject.EndTime = TimeSpan.Parse(end);

                                var saveWorker = new SaveWorker(highlightObject);
                                saveWorker.RunWorkerAsync(saveFileDialog.FileName);

                                while (saveWorker.PublishWorkerResult == PublishWorker.PublishWorkerResults.NotFinished)
                                    Application.DoEvents();

                                if (saveWorker.PublishWorkerResult == PublishWorker.PublishWorkerResults.Success)
                                    while (saveWorker.OutputFileInfo == null)
                                        Application.DoEvents();

                                var files = new List<FileInfo> { saveWorker.OutputFileInfo };
                                MainModel.LaunchExplorerWithFilesSelected(files);

                            }

                        }

                    }

                }
            }

            MainModel.Dispose();
        }
        internal override void PublishWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            #region Check for cancellation

            if (CheckForCancelledWorker())
            {
                PublishWorkerResult = PublishWorkerResults.Cancelled;
                facebookClient = null;
                return;
            }

            if (activationState == Protection.ActivationState.Activated)
                AnalyticsHelper.FireEvent("Each share - activation state - activated");
            else if (activationState == Protection.ActivationState.Trial)
                AnalyticsHelper.FireEvent("Each share - activation state - trial");
            else if (activationState == Protection.ActivationState.TrialExpired)
                AnalyticsHelper.FireEvent("Each share - activation state - trial expired");
            else if (activationState == Protection.ActivationState.Unlicensed)
                AnalyticsHelper.FireEvent("Each share - activation state - unlicensed");

            #endregion Check for cancellation

            #region Prepare video. We always do this, even if the user already saved it, because Facebook has formats it prefers

            using (var saveWorker = new SaveWorker(HighlightObject))
            {
                saveWorker.ProgressChanged += saveWorker_ProgressChanged;

            #if RELEASE
                saveWorker.HideOutputFile = true;
            #endif

                saveWorker.OutputFormat = SaveWorker.OutputFormats.Facebook;

                try
                {
                    string tempOutputFilePath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString() + HighlightObject.InputFileObject.SourceFileInfo.Extension);
                    saveWorker.RunWorkerAsync(tempOutputFilePath);

                    // try connecting while we start the saving
                    if (InitializeFacebookClient() == false)
                    {
                        PublishWorkerResult = PublishWorkerResults.UnableToAuthenticate;
                        saveWorker.CancelAsync();
                        return;
                    }

                    while (saveWorker.IsBusy)
                    { // wait for the scanworker to finish
                        if (CheckForCancelledWorker())
                        {
                            saveWorker.CancelAsync();
                            while (saveWorker.IsBusy) { System.Windows.Forms.Application.DoEvents(); } // DoEvents is required: http://social.msdn.microsoft.com/Forums/en-US/clr/thread/ad9a9a02-8a11-4bb8-b50a-613bcaa46886
                            PublishWorkerResult = PublishWorkerResults.Cancelled;
                            facebookClient = null;
                            return;
                        }

                        System.Threading.Thread.Sleep(500);
                    }
                }
                catch (InvalidOperationException ex)
                {
                    Logger.Error("Error starting SaveWorker! " + ex.ToString());
                }

                if (saveWorker.PublishWorkerResult != PublishWorkerResults.Success ||
                    saveWorker.OutputFileInfo == null)
                {
                    ErrorMessage = saveWorker.ErrorMessage;
                    PublishWorkerResult = PublishWorkerResults.UnableToShare;
                    facebookClient = null;
                    return;
                }

            #endregion Prepare video. We always do this, even if the user already saved it, because Facebook has formats it prefers

                #region Upload to Facebook

                var parameters = new Dictionary<string, object>();
                var bytes = File.ReadAllBytes(saveWorker.OutputFileInfo.FullName);

                parameters["source"] = new FacebookMediaObject { ContentType = "video/mpeg", FileName = "video.mp4" }.SetValue(bytes);
                parameters["title"] = HighlightObject.Title;

                // let's be more subtle and not spam their video.
                // it looks like Facebook is using the description field in the newsfeed instead of the title. lame.
                //parameters["description"] = "Found with Highlight Hunter. Download free for Mac and PC at www.HighlightHunter.com.";
                parameters["description"] = HighlightObject.Title;

                facebookClient.PostAsync("/me/videos", parameters);

                Logger.Info("Posted in background");

                trackFirstShare();

                while (!uploadCompleted)
                {
                    if (CheckForCancelledWorker())
                    {
                        facebookClient.CancelAsync();
                        PublishWorkerResult = PublishWorkerResults.Cancelled;
                        break;
                    }

                    Thread.Sleep(500); // this is on a background thread
                }

                #endregion Upload to Facebook

                #region Cleanup

                try
                {
                    saveWorker.OutputFileInfo.Delete();
                }
                catch (Exception ex)
                {
                    Logger.Error("Unable to delete " + ex);
                }

                #endregion Cleanup
            }

            facebookClient = null;

            // result is determined by facebookClient_PostCompleted
            AnalyticsHelper.FireEvent("Each share - Facebook - result - " + PublishWorkerResult);
        }
        private void SaveWorkerHost_DoWork(object sender, DoWorkEventArgs e)
        {
            Logger.Info("Started");

            var statusChangedEventArgs = new DoWorkEventArgs(null);
            e.Result = "Starting...";
            StatusChanged(sender, statusChangedEventArgs);

            ActivePublishWorkers.Clear();

            foreach (var publishWorker in CompletedPublishWorkers)
            {
                publishWorker.Dispose();
            }
            CompletedPublishWorkers.Clear();

            //totalSecondsOfOutput = CalculateTotalSecondsOfOutput();
            totalProgressUnits = CalculateTotalProgressUnits();

            foreach (var highlightObject in MainModel.HighlightObjects)
            {
                if (CancellationPending)
                    break;

                if (highlightObject.SaveToDisk)
                {
                    var saveWorker = new SaveWorker(highlightObject);
                    saveWorker.StatusChanged += publishWorker_StatusChanged;
                    saveWorker.ProgressChanged += publishWorker_ProgressChanged;
                    RunWorker(saveWorker); // runs syncronously
                }

                if (highlightObject.ShareToFacebook)
                {
                    var facebookShareWorker = new FacebookShareWorker(highlightObject);
                    facebookShareWorker.StatusChanged += publishWorker_StatusChanged;
                    facebookShareWorker.ProgressChanged += publishWorker_ProgressChanged;
                    RunWorker(facebookShareWorker); // runs syncronously
                }

            }

            // wait for ActiveScanWorkers to clean up

            IsCancelled = CancellationPending; // we use this instead of e.Cancel because if we set e.Cancel, we can't read e.Result (http://bytes.com/topic/c-sharp/answers/519073-asynch-crash-when-e-cancel-set)
            e.Result = CompletedPublishWorkers;
        }