Exemple #1
0
        public LiveBroadcast GenerateBroadCast()
        {
            //broadcast snippet contains basic info about the broadcast and this is shown on youtube when launched
            LiveBroadcastSnippet broadCastSnippet = new LiveBroadcastSnippet();

            broadCastSnippet.Title       = "Test";
            broadCastSnippet.Description = "A test of the youtube data API";
            //TODO: Add a thumbnail icon
            broadCastSnippet.ScheduledStartTime = DateTime.Now;

            //Applies settings of made for kids and unlisted to snippet i.e broadcast settings
            LiveBroadcastStatus broadCastStatus = new LiveBroadcastStatus();

            broadCastStatus.SelfDeclaredMadeForKids = false;
            broadCastStatus.PrivacyStatus           = "unlisted";

            //enables the broadcast to view a different "special stream" in case of time delays etc good for debugging
            MonitorStreamInfo broadCastMonitorStream = new MonitorStreamInfo();

            broadCastMonitorStream.EnableMonitorStream = true;

            //contains info about the monitor stream
            LiveBroadcastContentDetails broadCastContentDetails = new LiveBroadcastContentDetails();

            broadCastContentDetails.MonitorStream = broadCastMonitorStream;

            LiveBroadcast broadCast = new LiveBroadcast();

            broadCast.Snippet        = broadCastSnippet;        //binds the info regarding stream
            broadCast.Status         = broadCastStatus;         //privacy settings & reg settings
            broadCast.ContentDetails = broadCastContentDetails; //binds monitor info

            //Allows to finalise the setting up and is ready to be transmitted
            LiveBroadcastsResource.InsertRequest liveBroadCastInsert = service.LiveBroadcasts.Insert(broadCast, "snippet,status,contentDetails");
            //Reads the returned var

            LiveBroadcast returnedBroadCast = liveBroadCastInsert.Execute();

            Console.WriteLine("\n================== Returned Broadcast ==================\n");
            Console.WriteLine("  - Id: " + returnedBroadCast.Id);
            Console.WriteLine("  - Title: " + returnedBroadCast.Snippet.Title);
            Console.WriteLine("  - Description: " + returnedBroadCast.Snippet.Description);
            Console.WriteLine("  - Published At: " + returnedBroadCast.Snippet.PublishedAt);
            Console.WriteLine(
                "  - Scheduled Start Time: " + returnedBroadCast.Snippet.ScheduledStartTime);
            Console.WriteLine(
                "  - Scheduled End Time: " + returnedBroadCast.Snippet.ScheduledEndTime);

            return(returnedBroadCast);
        }
        public async Task<ActionResult> IndexAsync(LiveStreamingModel liveModel, CancellationToken cancellationToken)
        {
            if (ModelState.IsValid)
            {
                HttpCookie newModel = new HttpCookie("liveModel");
                newModel.Value = new JavaScriptSerializer().Serialize(liveModel);
                newModel.Expires = DateTime.Now.AddHours(10);
                Response.Cookies.Add(newModel);
            }
            else 
            {
                if (Request.Cookies["liveModel"] != null)
                {
                    JavaScriptSerializer objJavascript = new JavaScriptSerializer();
                    liveModel = objJavascript.Deserialize<LiveStreamingModel>(Request.Cookies["liveModel"].Value);
                }
                else {
                    TempData["errorTitle"] = "Error";
                    TempData["errorMessage"] = "Something wrong! Please try again later!";
                    return RedirectToAction("Index", "Home", liveModel.eventID);
                }
            }
            
                var result = await new AuthorizationCodeMvcApp(this, new AppFlowMetadata()).
                AuthorizeAsync(cancellationToken);
                
                
                if (result.Credential != null)
                {
                    var youtubeService = new YouTubeService(new BaseClientService.Initializer()
                    {
                        HttpClientInitializer = result.Credential,
                        ApplicationName = Assembly.GetExecutingAssembly().GetName().Name
                    });
                    LiveBroadcastSnippet broadcastSnippet = new LiveBroadcastSnippet();
                    broadcastSnippet.Title = liveModel.Title;
                    broadcastSnippet.ScheduledStartTime = liveModel.StartTimeYoutube.CompareTo(DateTime.Now) < 0 ? (DateTime.Now) : liveModel.StartTimeYoutube;
                    broadcastSnippet.ScheduledEndTime = liveModel.EndTimeYoutube;
                    // Set the broadcast's privacy status to "private". See:
                    // https://developers.google.com/youtube/v3/live/docs/liveBroadcasts#status.privacyStatus
                    LiveBroadcastStatus status = new LiveBroadcastStatus();
                    if (liveModel.PrivacyYoutube == EventZoneConstants.publicEvent)
                    {
                        status.PrivacyStatus = "public";
                    }
                    else if (liveModel.PrivacyYoutube == EventZoneConstants.unlistedEvent)
                    {
                        status.PrivacyStatus = "unlisted";
                    }
                    else { 
                        status.PrivacyStatus= "private";
                    }
                    //Set LiveBroadcast
                    LiveBroadcast broadcast = new LiveBroadcast();
                    LiveBroadcast returnBroadcast = new LiveBroadcast();
                    broadcast.Kind = "youtube#liveBroadcast";
                    broadcast.Snippet = broadcastSnippet;
                    broadcast.Status = status;
                    LiveBroadcastsResource.InsertRequest liveBroadcastInsert = youtubeService.LiveBroadcasts.Insert(broadcast, "snippet,status");
                    try
                    {
                        returnBroadcast = liveBroadcastInsert.Execute();
                    }
                    catch (Exception ex){
                        TempData["ErrorCreateLiveMessage"] = "Your youtube account can not create live streaming";
                        result.Credential.RevokeTokenAsync(CancellationToken.None).Wait();
                        return RedirectToAction("Details", "Event", new { id = liveModel.eventID });
                    }
                    
                    //Set LiveStream Snippet
                    LiveStreamSnippet streamSnippet = new LiveStreamSnippet();
                    streamSnippet.Title = liveModel.Title + "Stream Title";
                    CdnSettings cdnSettings = new CdnSettings();
                    cdnSettings.Format = liveModel.Quality;
                    cdnSettings.IngestionType = "rtmp";

                    //Set LiveStream
                    LiveStream streamLive = new LiveStream();
                    streamLive.Kind = "youtube#liveStream";
                    streamLive.Snippet = streamSnippet;
                    streamLive.Cdn = cdnSettings;
                    LiveStream returnLiveStream = youtubeService.LiveStreams.Insert(streamLive, "snippet,cdn").Execute();
                    LiveBroadcastsResource.BindRequest liveBroadcastBind = youtubeService.LiveBroadcasts.Bind(returnBroadcast.Id, "id,contentDetails");
                    liveBroadcastBind.StreamId = returnLiveStream.Id;
                    try
                    {
                        returnBroadcast = liveBroadcastBind.Execute();
                    }
                    catch (Exception ex)
                    {
                        TempData["ErrorCreateLiveMessage"] = "Your youtube account can not create live streaming";
                        result.Credential.RevokeTokenAsync(CancellationToken.None).Wait();
                        return RedirectToAction("Details", "Event", new { id = liveModel.eventID });
                    }
                    
                    //Return Value
                    String streamName = returnLiveStream.Cdn.IngestionInfo.StreamName;
                    String primaryServerUrl = returnLiveStream.Cdn.IngestionInfo.IngestionAddress;
                    String backupServerUrl = returnLiveStream.Cdn.IngestionInfo.BackupIngestionAddress;
                    String youtubeUrl = "https://www.youtube.com/watch?v=" + returnBroadcast.Id;
                    
                    //youtubeReturnModel model = new youtubeReturnModel { streamName = streamName, primaryServerUrl = primaryServerUrl,backupServerUrl=backupServerUrl,youtubeUrl=youtubeUrl };
                    Video video = new Video {  EventPlaceID = liveModel.EventPlaceID,
                                               VideoLink = youtubeUrl,
                                               PrimaryServer = primaryServerUrl,
                                               StartTime = liveModel.StartTimeYoutube,
                                               Privacy = liveModel.PrivacyYoutube,
                                               EndTime = liveModel.EndTimeYoutube,
                                               BackupServer = backupServerUrl,
                                               StreamName= streamName};
                    EventDatabaseHelper.Instance.AddVideo(video);
                    HttpCookie newModel = new HttpCookie("liveModel");
                    newModel.Value = new JavaScriptSerializer().Serialize(liveModel);
                    newModel.Expires = DateTime.Now.AddHours(-1);
                    Response.Cookies.Add(newModel);
                    result.Credential.RevokeTokenAsync(CancellationToken.None).Wait();
                    TempData["ErrorCreateLiveMessage"] = "Success";
                    return RedirectToAction("Details", "Event", new { id = EventDatabaseHelper.Instance.GetEventPlaceByID(liveModel.EventPlaceID).EventID });
            }
            else
            {
                return new RedirectResult(result.RedirectUri);
            }
        }
        public YoutubeApi()
        {
            service = Auth();

            var broadcastSnippet = new LiveBroadcastSnippet();

            broadcastSnippet.Title = "Biometrico";
            broadcastSnippet.ScheduledStartTime = DateTime.Now;

            var broadcastStatus = new LiveBroadcastStatus();

            broadcastStatus.PrivacyStatus = "unlisted";

            var broadcastMonitorStream = new MonitorStreamInfo();

            broadcastMonitorStream.EnableMonitorStream = true;

            var broadcastContentDetails = new LiveBroadcastContentDetails();

            broadcastContentDetails.MonitorStream = broadcastMonitorStream;

            var broadcast = new LiveBroadcast();

            broadcast.Kind           = "youtube#liveBroadcast";
            broadcast.Snippet        = broadcastSnippet;
            broadcast.Status         = broadcastStatus;
            broadcast.ContentDetails = broadcastContentDetails;

            var liveBroadcastInsert = service.LiveBroadcasts.Insert(broadcast, "snippet,status,contentDetails");
            var returnedBroadcast   = liveBroadcastInsert.Execute();

            Console.WriteLine("\n================== Returned Broadcast ==================\n");
            Console.WriteLine("  - Id: " + returnedBroadcast.Id);
            Console.WriteLine("  - Title: " + returnedBroadcast.Snippet.Title);
            Console.WriteLine("  - Description: " + returnedBroadcast.Snippet.Description);
            Console.WriteLine("  - Published At: " + returnedBroadcast.Snippet.PublishedAt);
            Console.WriteLine(
                "  - Scheduled Start Time: " + returnedBroadcast.Snippet.ScheduledStartTime);
            Console.WriteLine(
                "  - Scheduled End Time: " + returnedBroadcast.Snippet.ScheduledEndTime);

            var streamSnippet = new LiveStreamSnippet();

            streamSnippet.Title = "Camara de Establecimiento";

            var cdnSettings = new CdnSettings();

            cdnSettings.Format        = "720p";
            cdnSettings.IngestionType = "rtmp";

            var stream = new LiveStream();

            stream.Kind    = "youtube#liveStream";
            stream.Snippet = streamSnippet;
            stream.Cdn     = cdnSettings;

            var liveStreamInsert = service.LiveStreams.Insert(stream, "snippet,cdn");
            var returnedStream   = liveStreamInsert.Execute();

            Console.WriteLine("\n================== Returned Stream ==================\n");
            Console.WriteLine("  - Id: " + returnedStream.Id);
            Console.WriteLine("  - Title: " + returnedStream.Snippet.Title);
            Console.WriteLine("  - Description: " + returnedStream.Snippet.Description);
            Console.WriteLine("  - Published At: " + returnedStream.Snippet.PublishedAt);
            Console.WriteLine("  - URL: " + returnedStream.Cdn.IngestionInfo.IngestionAddress);
            Console.WriteLine("  - Name: " + returnedStream.Cdn.IngestionInfo.StreamName);

            var liveBroadcastBind = service.LiveBroadcasts.Bind(returnedBroadcast.Id, "id, contentDetails");

            liveBroadcastBind.StreamId = returnedStream.Id;
            returnedBroadcast          = liveBroadcastBind.Execute();

            Console.WriteLine("\n================== Returned Bound Broadcast ==================\n");
            Console.WriteLine("  - Broadcast Id: " + returnedBroadcast.Id);
            Console.WriteLine("  - Bound Stream Id: " + returnedBroadcast.ContentDetails.BoundStreamId);

            var liveStreamRequest = service.LiveStreams.List("id,status");

            liveStreamRequest.Id = returnedStream.Id;

            string streamLoop = "0";

            while (!streamLoop.Contains("A"))
            {
                var returnedStreamListResponse = liveStreamRequest.Execute();
                var foundStream = returnedStreamListResponse.Items.Single();
                Console.WriteLine(foundStream.Status.StreamStatus);
                streamLoop = Console.ReadKey().Key.ToString();
            }


            returnedBroadcast.ContentDetails.MonitorStream.EnableMonitorStream = false;
            service.LiveBroadcasts.Update(returnedBroadcast, "contentDetails");
            var liveBroadcastRequest = service.LiveBroadcasts.List("id,status,contentDetails");

            liveBroadcastRequest.Id = returnedBroadcast.Id;

            char broadcastLoop = '0';

            while (broadcastLoop != ('A'))
            {
                var returnedBroadcastListResponse = liveBroadcastRequest.Execute();
                var foundBroadcast = returnedBroadcastListResponse.Items.Single();
                Console.WriteLine(foundBroadcast.ContentDetails.MonitorStream.EnableMonitorStream);
                broadcastLoop = Console.ReadKey().KeyChar;
            }

            service.LiveBroadcasts.Transition(LiveBroadcastsResource.TransitionRequest.BroadcastStatusEnum.Testing, returnedBroadcast.Id, "");

            broadcastLoop = '0';
            while (broadcastLoop != 'A')
            {
                var returnedBroadcastListResponse = liveBroadcastRequest.Execute();
                var foundBroadcast = returnedBroadcastListResponse.Items.Single();
                Console.WriteLine(foundBroadcast.Status.LifeCycleStatus);
                broadcastLoop = Console.ReadKey().KeyChar;
            }

            service.LiveBroadcasts.Transition(LiveBroadcastsResource.TransitionRequest.BroadcastStatusEnum.Live, returnedBroadcast.Id, "");

            broadcastLoop = '0';
            while (broadcastLoop != ('A'))
            {
                var returnedBroadcastListResponse = liveBroadcastRequest.Execute();
                var foundBroadcast = returnedBroadcastListResponse.Items.Single();
                Console.WriteLine(foundBroadcast.Status.LifeCycleStatus);
                broadcastLoop = Console.ReadKey().KeyChar;
            }


            //rtsp://192.168.1.99/axis-media/media.amp
        }
    IEnumerator StreamToYoutubeCoroutine()
    {
        float dt = .5f;

        //---OAuth2 Authorization
        #region  setup OAuth2 Login with ClientId & ClientSecret
        Debug.Log("======OAuth2 Login Session Started=======");
        streamstatusLabel.text = "setup OAuth2 Login with ClientId & ClientSecret";

        Task <UserCredential> taskGetUserCredential = GoogleWebAuthorizationBroker.AuthorizeAsync(
            new ClientSecrets
        {
            ClientId     = Credentials.CLIENT_ID,
            ClientSecret = Credentials.CLIENT_SECRET
        },
            new[] { YouTubeService.Scope.Youtube },
            "user", CancellationToken.None);

        yield return(new WaitUntil(() => taskGetUserCredential.Status == TaskStatus.RanToCompletion));

        UserCredential credential = taskGetUserCredential.Result;

        Debug.Log($"Login successful with {credential}");

        Debug.Log("======OAuth2 Login Session Ended=======");

        var youtubeService = new YouTubeService(new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName       = APP_NAME
        });
        Debug.Log($"Create Youtube Service with user credential {youtubeService.BaseUri}");
        #endregion

        //---create LiveBroadCast
        #region  setup LiveBroadCast Channel (LiveBroadcastSnippet)
        streamstatusLabel.text = "setup LiveBroadCast Channel";
        Debug.Log("======create LiveBroadCast Started=======");
        // Create a snippet with the title and scheduled start and end
        // times for the broadcast. Currently, those times are hard-coded.
        LiveBroadcastSnippet broadcastSnippet = new LiveBroadcastSnippet();
        broadcastSnippet.Title = streamtitle;

        broadcastSnippet.PublishedAt        = DateTime.Now;
        broadcastSnippet.ScheduledStartTime = DateTime.Now;
        broadcastSnippet.ScheduledEndTime   = DateTime.Now.AddHours(2);

        Debug.Log($"Prepare LiveBroadCast Snippet with Title: {broadcastSnippet.Title}");

        // Set the broadcast's privacy status to "private". See:
        // https://developers.google.com/youtube/v3/live/docs/liveBroadcasts#status.privacyStatus
        LiveBroadcastStatus status = new LiveBroadcastStatus();
        status.PrivacyStatus = "public";

        LiveBroadcast broadcast = new LiveBroadcast();
        broadcast.Kind    = "youtube#liveBroadcast";
        broadcast.Snippet = broadcastSnippet;
        broadcast.Status  = status;
        Debug.Log($"Prepare LiveBroadCast status: {status.LiveBroadcastPriority}");

        LiveBroadcastContentDetails contentDetails = new LiveBroadcastContentDetails();
        contentDetails.Projection = "360";
        broadcast.ContentDetails  = contentDetails;

        Debug.Log($"Try to insert LiveBroadcasts");

        try
        {
            broadcast = youtubeService.LiveBroadcasts.Insert(broadcast, "snippet,status,contentDetails").Execute();
            Debug.Log($"Insert LiveBroadcasts successfully with ID: {broadcast.Id}");
        }
        catch (Exception e)
        {
            Debug.LogError(e);
            yield break;
        }
        Debug.Log("======create LiveBroadCast Ended=======");
        #endregion

        //---create streaming channel
        #region  setup Streaming Channel (LiveStreamSnippet)
        streamstatusLabel.text = "setup Streaming Channel";
        Debug.Log("======create Streaming channel Started=======");
        // Create a snippet with the video stream's title.
        LiveStreamSnippet streamSnippet = new LiveStreamSnippet();
        streamSnippet.Title = streamtitle;

        Debug.Log($"Prepare streaming Snippet {streamSnippet.Title}");

        IngestionInfo ingestionInfo = new IngestionInfo();
        ingestionInfo.StreamName = streamname;

        //this Rtmp address is fixed ,defined by youtube API,
        //we need to get full push address by appending streaming ID.
        ingestionInfo.IngestionAddress = "rtmp://a.rtmp.youtube.com/live2";

        // Define the content distribution network settings for the
        // video stream. The settings specify the stream's format and
        // ingestion type. See:
        // https://developers.google.com/youtube/v3/live/docs/liveStreams#cdn
        CdnSettings cdnSettings = new CdnSettings();
        cdnSettings.IngestionInfo = ingestionInfo;
        cdnSettings.Format        = "720p";
        cdnSettings.IngestionType = "rtmp";

        Debug.Log($"Prepare CDN settings type:{cdnSettings.IngestionType}");

        LiveStream stream = new LiveStream();
        stream.Kind    = "youtube#liveStream";
        stream.Snippet = streamSnippet;
        stream.Cdn     = cdnSettings;

        // Construct and execute the API request to insert the stream.
        Debug.Log($"Try to insert LiveStreams");
        LiveStream liveStream = null;
        try
        {
            liveStream = youtubeService.LiveStreams.Insert(stream, "snippet,cdn").Execute();
            Debug.Log($"Open livestream successfully with Id {liveStream.Cdn.IngestionInfo.StreamName}");
        }
        catch (Exception e)
        {
            Debug.LogError(e);
            yield break;
        }
        var push_addr = liveStream.Cdn.IngestionInfo.IngestionAddress + "/" + liveStream.Cdn.IngestionInfo.StreamName;
        Debug.Log($"Get rtmp push address: {push_addr}");
        Debug.Log("======create Streaming channel Ended=======");
        #endregion

        //---bind LiveBroadcast & LiveStreams
        #region  bind LiveBroadcast & LiveStreams
        streamstatusLabel.text = "bind LiveBroadcast & LiveStreams";
        Debug.Log("======bind LiveBroadcast & LiveStreams Started=======");
        // Construct and execute a request to bind the new broadcast and stream.
        Debug.Log($"Try to bind LiveBroadcast and streams {broadcast.Id}");
        LiveBroadcastsResource.BindRequest liveBroadcastBind = null;
        try
        {
            liveBroadcastBind          = youtubeService.LiveBroadcasts.Bind(broadcast.Id, "id,contentDetails");
            liveBroadcastBind.StreamId = liveStream.Id;
            broadcast = liveBroadcastBind.Execute();
            Debug.Log($"Binding LiveBroadcasts and Streams successfully with Id {liveBroadcastBind.StreamId}");
        }
        catch (Exception e)
        {
            Debug.LogError(e);
            yield break;
        }

        string share_addr = "https://www.youtube.com/watch?v=" + broadcast.Id;
        streamstatusLabel.text = share_addr;
        Debug.Log($"Get user watch address: {share_addr}");
        Debug.Log("======bind LiveBroadcast & LiveStreams Ended=======");
        #endregion

        //---for now, create channel ,get rtmp push addr, get user watch addr jobs are done.
        //---we start to push the streams towards push addr.
        #region  push Stream to rtmp address
        Debug.Log("======push Stream to rtmp address Started=======");

        //TODO :

        #endregion

        //---switch LiveStream status from Ready to Active
        #region  check LiveStream status if is streaming (ready-->active)
        Debug.Log("======Switch liveBroadcast Ready to Active Started=======");

        var liveStreamlist = youtubeService.LiveStreams.List("id,status");
        liveStreamlist.Id = broadcast.ContentDetails.BoundStreamId;

        LiveStreamListResponse returnedList = liveStreamlist.Execute();
        List <LiveStream>      liveStreams  = returnedList.Items as List <LiveStream>;
        if (liveStreams != null && liveStreams.Count > 0)
        {
            LiveStream ls = liveStreams[0];

            openURLBtn.interactable = true;

            if (ls != null)
            {
                int errortimes = 0;
                while (errortimes < 3 && !ls.Status.StreamStatus.Equals("active"))
                {
                    yield return(new WaitForSeconds(dt));

                    Debug.Log($"Pending, current stream status: {ls.Status.StreamStatus} {errortimes}");
                    returnedList = liveStreamlist.Execute();
                    liveStreams  = returnedList.Items as List <LiveStream>;
                    liveStream   = liveStreams[0];
                    errortimes++;
                }

                if (errortimes >= 3)
                {
                    Debug.Log("Streaming Process is Pending. due to there is no streaming push to youtube address.");
                    errortimes = 0;
                    yield break;
                }
            }
        }
        Debug.Log("======Switch liveBroadcast Ready to Active Ended=======");
        #endregion

        //---the broadcast can't transition the status from ready to live directly,
        //---it must change to testing first and then live.
        #region transition LiveBroadcasts status (-->testing)
        Debug.Log("======Test Stream Started=======");
        var broadCastTestingRequest = youtubeService.LiveBroadcasts.Transition(LiveBroadcastsResource.TransitionRequest.BroadcastStatusEnum.Testing, broadcast.Id, "id,snippet,contentDetails,status");
        broadcast = broadCastTestingRequest.Execute();

        var liveBroadRequest = youtubeService.LiveBroadcasts.List("id,status");
        liveBroadRequest.BroadcastStatus = LiveBroadcastsResource.ListRequest.BroadcastStatusEnum.All;

        LiveBroadcastListResponse liveBroadcastListResponse = liveBroadRequest.Execute();
        List <LiveBroadcast>      broadcastReturnedList     = liveBroadcastListResponse.Items as List <LiveBroadcast>;
        if (broadcastReturnedList != null && broadcastReturnedList.Count > 0)
        {
            var liveBroadcastReq = broadcastReturnedList[0];
            if (liveBroadcastReq != null)
            {
                int errortimes = 0;
                while (errortimes < 3 && !liveBroadcastReq.Status.LifeCycleStatus.Equals("testing"))
                {
                    yield return(new WaitForSeconds(dt));

                    Debug.Log("Error publish broadcast - getLifeCycleStatus: " + liveBroadcastReq.Status.LifeCycleStatus);
                    liveBroadcastListResponse = liveBroadRequest.Execute();
                    broadcastReturnedList     = liveBroadcastListResponse.Items as List <LiveBroadcast>;
                    liveBroadcastReq          = broadcastReturnedList[0];
                    errortimes++;
                }

                if (errortimes >= 3)
                {
                    Debug.Log("Streaming Process is Pending. due to there is problem preforming testing.");
                    errortimes = 0;
                    yield break;
                }
            }
        }
        Debug.Log("======Test Stream Ended=======");
        #endregion

        //---transition the status from testing to live
        #region transition LiveBroadcasts status (testing-->live)
        var broadCastLiveRequest = youtubeService.LiveBroadcasts.Transition(LiveBroadcastsResource.TransitionRequest.BroadcastStatusEnum.Live, broadcast.Id, "status");
        broadcast = broadCastLiveRequest.Execute();
        #endregion
    }
Exemple #5
0
        public async Task <ActionResult> IndexAsync(LiveStreamingModel liveModel, CancellationToken cancellationToken)
        {
            if (!ModelState.IsValid)
            {
                JavaScriptSerializer objJavascript = new JavaScriptSerializer();
                liveModel = objJavascript.Deserialize <LiveStreamingModel>(Request.Cookies["liveModel"].Value);
            }
            else
            {
                if (liveModel.Quality != null)
                {
                    HttpCookie newModel = new HttpCookie("liveModel");
                    newModel.Value   = new JavaScriptSerializer().Serialize(liveModel);
                    newModel.Expires = DateTime.Now.AddHours(10);
                    Response.Cookies.Add(newModel);
                }
            }
            var result = await new AuthorizationCodeMvcApp(this, new AppFlowMetadata()).
                         AuthorizeAsync(cancellationToken);


            if (result.Credential != null)
            {
                var youtubeService = new YouTubeService(new BaseClientService.Initializer()
                {
                    HttpClientInitializer = result.Credential,
                    ApplicationName       = Assembly.GetExecutingAssembly().GetName().Name
                });
                LiveBroadcastSnippet broadcastSnippet = new LiveBroadcastSnippet();
                broadcastSnippet.Title = liveModel.Title;
                broadcastSnippet.ScheduledStartTime = liveModel.StartTimeYoutube.CompareTo(DateTime.Now) < 0 ? (DateTime.Now) : liveModel.StartTimeYoutube;
                broadcastSnippet.ScheduledEndTime   = liveModel.EndTimeYoutube;
                // Set the broadcast's privacy status to "private". See:
                // https://developers.google.com/youtube/v3/live/docs/liveBroadcasts#status.privacyStatus
                LiveBroadcastStatus status = new LiveBroadcastStatus();
                if (liveModel.PrivacyYoutube == EventZoneConstants.publicEvent)
                {
                    status.PrivacyStatus = "public";
                }
                else if (liveModel.PrivacyYoutube == EventZoneConstants.unlistedEvent)
                {
                    status.PrivacyStatus = "unlisted";
                }
                else
                {
                    status.PrivacyStatus = "private";
                }

                //Set LiveBroadcast
                LiveBroadcast broadcast       = new LiveBroadcast();
                LiveBroadcast returnBroadcast = new LiveBroadcast();
                broadcast.Kind    = "youtube#liveBroadcast";
                broadcast.Snippet = broadcastSnippet;
                broadcast.Status  = status;
                LiveBroadcastsResource.InsertRequest liveBroadcastInsert = youtubeService.LiveBroadcasts.Insert(broadcast, "snippet,status");
                try
                {
                    returnBroadcast = liveBroadcastInsert.Execute();
                }
                catch (Exception ex) {
                    TempData["errorTitle"]   = "Error";
                    TempData["errorMessage"] = ex.Message;
                    result.Credential.RevokeTokenAsync(CancellationToken.None).Wait();
                    return(RedirectToAction("Details", "Event", liveModel.eventID));
                }

                //Set LiveStream Snippet
                LiveStreamSnippet streamSnippet = new LiveStreamSnippet();
                streamSnippet.Title = liveModel.Title + "Stream Title";
                CdnSettings cdnSettings = new CdnSettings();
                cdnSettings.Format        = liveModel.Quality;
                cdnSettings.IngestionType = "rtmp";

                //Set LiveStream
                LiveStream streamLive = new LiveStream();
                streamLive.Kind    = "youtube#liveStream";
                streamLive.Snippet = streamSnippet;
                streamLive.Cdn     = cdnSettings;
                LiveStream returnLiveStream = youtubeService.LiveStreams.Insert(streamLive, "snippet,cdn").Execute();
                LiveBroadcastsResource.BindRequest liveBroadcastBind = youtubeService.LiveBroadcasts.Bind(returnBroadcast.Id, "id,contentDetails");
                liveBroadcastBind.StreamId = returnLiveStream.Id;
                try
                {
                    returnBroadcast = liveBroadcastBind.Execute();
                }
                catch (Exception ex)
                {
                    TempData["errorTitle"]   = "Error";
                    TempData["errorMessage"] = ex.Message;
                    result.Credential.RevokeTokenAsync(CancellationToken.None).Wait();
                    return(RedirectToAction("Details", "Event", liveModel.eventID));
                }

                //Return Value
                String streamName       = returnLiveStream.Cdn.IngestionInfo.StreamName;
                String primaryServerUrl = returnLiveStream.Cdn.IngestionInfo.IngestionAddress;
                String backupServerUrl  = returnLiveStream.Cdn.IngestionInfo.BackupIngestionAddress;
                String youtubeUrl       = "https://www.youtube.com/watch?v=" + returnBroadcast.Id;

                //youtubeReturnModel model = new youtubeReturnModel { streamName = streamName, primaryServerUrl = primaryServerUrl,backupServerUrl=backupServerUrl,youtubeUrl=youtubeUrl };
                Video video = new Video {
                    EventPlaceID  = liveModel.EventPlaceID,
                    VideoLink     = youtubeUrl,
                    PrimaryServer = primaryServerUrl,
                    StartTime     = liveModel.StartTimeYoutube,
                    Privacy       = liveModel.PrivacyYoutube,
                    EndTime       = liveModel.EndTimeYoutube,
                    BackupServer  = backupServerUrl,
                    StreamName    = streamName
                };
                EventDatabaseHelper.Instance.AddVideo(video);

                HttpCookie newEventID = new HttpCookie("CreateEventID");
                newEventID.Expires = DateTime.Now.AddDays(-1);
                Request.Cookies.Add(newEventID);
                HttpCookie newModel = new HttpCookie("liveModel");
                newModel.Value   = new JavaScriptSerializer().Serialize(liveModel);
                newModel.Expires = DateTime.Now.AddHours(-1);
                Response.Cookies.Add(newModel);
                result.Credential.RevokeTokenAsync(CancellationToken.None).Wait();
                return(RedirectToAction("Details", "Event", new { id = EventDatabaseHelper.Instance.GetEventPlaceByID(liveModel.EventPlaceID).EventID }));
            }
            else
            {
                return(new RedirectResult(result.RedirectUri));
            }
        }
        /// <summary>
        /// Setup youtube channel. Needs to refine it all.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private async void LaunchPage_Loaded(object sender, RoutedEventArgs e)
        {
            //Move authorize to a common class
            user = await GoogleWebAuthorizationBroker.AuthorizeAsync(
                new Uri("ms-appx:///client_secret.json"),
                scope,
                "user",
                CancellationToken.None
            );

            youtubeService = new YouTubeService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = user,
                ApplicationName = "WatchMe"
            });

            //Individual youtube section to be moved to helper classes

            SearchResource.ListRequest listRequest = youtubeService.Search.List("snippet");
            listRequest.MaxResults = 10;
            listRequest.Q = "Microsoft";
            SearchListResponse searchResponse = await listRequest.ExecuteAsync();
            //YoutubePlayer.Source = new Uri("https://progressivemlx-a.akamaihd.net:443/asset-5f19445d-1500-80c4-d8fd-f1e5a5ddee3a/16914-237342-od1s011z.knj_H264_3400kbps_AAC_und_ch2_96kbps.mp4");
            //YoutubePlayer.Source = new Uri("https://www.youtube.com/v/V_XUSOLVRzA");
            //YoutubePlayer.Play();

            //Create broadcast snippet
            LiveBroadcastSnippet livebcSnippet = new LiveBroadcastSnippet();
            livebcSnippet.Title = "Hello Public Broadcast";
            livebcSnippet.ScheduledStartTime = DateTime.Now;
            livebcSnippet.ScheduledEndTime = DateTime.Now.AddHours(2);

            //Set broadcast privacy
            LiveBroadcastStatus livebcStatus = new LiveBroadcastStatus();
            livebcStatus.PrivacyStatus = "public";

            //Create Live Broadcast request combining the above parts
            LiveBroadcast liveBCRequest = new LiveBroadcast();
            liveBCRequest.Kind = "youtube#liveBroadcast";
            liveBCRequest.Snippet = livebcSnippet;
            liveBCRequest.Status = livebcStatus;

            //Create the live broadcast in youtube
            LiveBroadcastsResource.InsertRequest liveBCInsertRequest = youtubeService.LiveBroadcasts.Insert(liveBCRequest, "snippet,status");

            //Final Live Broadcast reponse
            LiveBroadcast liveBCResponse = await liveBCInsertRequest.ExecuteAsync();

            //Create liveStream snippet
            LiveStreamSnippet liveStreamSnippet = new LiveStreamSnippet();
            liveStreamSnippet.Title = "Live Video Public";

            // Define the content distribution network settings for the video stream.
            // The settings specify the stream's format and ingestion type.
            CdnSettings cdnSettings = new CdnSettings();
            cdnSettings.Format = "1080p";
            cdnSettings.IngestionType = "rtmp";

            //Create liveStream request
            LiveStream liveStreamRequest = new LiveStream();
            liveStreamRequest.Kind = "youtube#liveStream";
            liveStreamRequest.Snippet = liveStreamSnippet;
            liveStreamRequest.Cdn = cdnSettings;

            //Create the live stream in youtube
            LiveStreamsResource.InsertRequest liveStreamInsertRequest = youtubeService.LiveStreams.Insert(liveStreamRequest, "snippet,cdn");

            //Final Live Stream reponse
            LiveStream liveStreamResponse = await liveStreamInsertRequest.ExecuteAsync();

            // Construct and execute a request to bind the new broadcast and stream.
            LiveBroadcastsResource.BindRequest bindRequest = youtubeService.LiveBroadcasts.Bind(liveBCResponse.Id, "id,contentDetails");
            bindRequest.StreamId = liveStreamResponse.Id;

            // The LiveBroadcast object bound to the LiveStream
            LiveBroadcast boundBroadcast = await bindRequest.ExecuteAsync();

            App.RTMPUrl = liveStreamResponse.Cdn.IngestionInfo.IngestionAddress + "/" + liveStreamResponse.Cdn.IngestionInfo.StreamName;

            encoder = new RTMPEncoder();
            if (encoder.Ffmpeg_init(400, 300, AUDIO_SAMPLE_RATE, App.RTMPUrl))
            {
                Debug.WriteLine("encoder initialization successfull");
            }
            else
            {
                Debug.WriteLine("encoder initialization failed");
            }
            
            ChangeScenarioState(ScenarioState.Ready);
        }