public async Task <string> Response() { Session.room = await RoomContextManager.Instance.ValidateRoom(AlexaRequest, Session); if (Session.room is null) { return(await RoomContextManager.Instance.RequestRoom(AlexaRequest, Session)); } var request = AlexaRequest.request; var context = AlexaRequest.context; var apiAccessToken = context.System.apiAccessToken; var requestId = request.requestId; var intent = request.intent; var slots = intent.slots; AlexaResponseClient.Instance.PostProgressiveResponse(SpeechBuilderService.GetSpeechPrefix(SpeechPrefix.REPOSE) + " Starting Playback.", apiAccessToken, requestId); BaseItem result; if (Session.NowViewingBaseItem is null) { var type = slots.Movie.value is null ? "Series" : "Movie"; result = ServerDataQuery.Instance.QuerySpeechResultItem(type == "Movie" ? slots.Movie.value : slots.Series.value, new[] { type }); } else { result = Session.NowViewingBaseItem; } //Item doesn't exist in the library if (result is null) { var aplaDataSource = await DataSourcePropertiesManager.Instance.GetAudioResponsePropertiesAsync(new InternalAudioResponseQuery() { SpeechResponseType = SpeechResponseType.NoItemExists }); return(await AlexaResponseClient.Instance.BuildAlexaResponseAsync(new Response() { shouldEndSession = true, directives = new List <IDirective>() { await RenderDocumentDirectiveManager.Instance.RenderAudioDocumentDirectiveAsync(aplaDataSource) } }, Session)); } //Parental Control check for baseItem if (!result.IsParentalAllowed(Session.User)) { if (Plugin.Instance.Configuration.EnableServerActivityLogNotifications) { await ServerController.Instance.CreateActivityEntry(LogSeverity.Warn, $"{Session.User} attempted to view a restricted item.", $"{Session.User} attempted to view {result.Name}.").ConfigureAwait(false); } var genericLayoutProperties = await DataSourcePropertiesManager.Instance.GetGenericViewPropertiesAsync($"Stop! Rated {result.OfficialRating}", "/particles"); var parentalControlNotAllowedAudioSpeech = await DataSourcePropertiesManager.Instance.GetAudioResponsePropertiesAsync(new InternalAudioResponseQuery() { SpeechResponseType = SpeechResponseType.ParentalControlNotAllowed, item = result, session = Session }); return(await AlexaResponseClient.Instance.BuildAlexaResponseAsync(new Response() { shouldEndSession = true, directives = new List <IDirective>() { await RenderDocumentDirectiveManager.Instance.RenderVisualDocumentDirectiveAsync(genericLayoutProperties, Session), await RenderDocumentDirectiveManager.Instance.RenderAudioDocumentDirectiveAsync(parentalControlNotAllowedAudioSpeech) } }, Session)); } try { ServerController.Instance.PlayMediaItemAsync(Session, result); } catch (Exception exception) { AlexaResponseClient.Instance.PostProgressiveResponse(exception.Message, apiAccessToken, requestId); } Session.PlaybackStarted = true; AlexaSessionManager.Instance.UpdateSession(Session, null); var detailLayoutProperties = await DataSourcePropertiesManager.Instance.GetBaseItemDetailViewPropertiesAsync(result, Session); var playItemAudioSpeech = await DataSourcePropertiesManager.Instance.GetAudioResponsePropertiesAsync(new InternalAudioResponseQuery() { SpeechResponseType = SpeechResponseType.PlayItem, item = result }); var renderDocumentDirective = await RenderDocumentDirectiveManager.Instance.RenderVisualDocumentDirectiveAsync(detailLayoutProperties, Session); var renderAudioDirective = await RenderDocumentDirectiveManager.Instance.RenderAudioDocumentDirectiveAsync(playItemAudioSpeech); return(await AlexaResponseClient.Instance.BuildAlexaResponseAsync(new Response() { shouldEndSession = null, directives = new List <IDirective>() { renderDocumentDirective, renderAudioDirective } }, Session)); }
public async Task <string> Response() { await AlexaResponseClient.Instance.PostProgressiveResponse($"OK. { SpeechBuilderService.GetSpeechPrefix(SpeechPrefix.REPOSE)}.", AlexaRequest.context.System.apiAccessToken, AlexaRequest.request.requestId); Session.room = await RoomContextManager.Instance.ValidateRoom(AlexaRequest, Session); Session.hasRoom = !(Session.room is null); if (!Session.hasRoom && !Session.supportsApl) { Session.PersistedRequestData = AlexaRequest; AlexaSessionManager.Instance.UpdateSession(Session, null); return(await RoomContextManager.Instance.RequestRoom(AlexaRequest, Session)); } var request = AlexaRequest.request; var intent = request.intent; var slots = intent.slots; var searchName = (slots.Movie.value ?? slots.Series.value) ?? slots.MovieCollection.value; searchName = StringNormalization.ValidateSpeechQueryString(searchName); if (string.IsNullOrEmpty(searchName)) { return(await new NotUnderstood(AlexaRequest, Session).Response()); } var result = ServerDataQuery.Instance.QuerySpeechResultItem(searchName, new[] { "Movie", "Series", "Collection" }); if (result is null) { var aplaDataSourceProperties = await DataSourcePropertiesManager.Instance.GetAudioResponsePropertiesAsync(new InternalAudioResponseQuery() { SpeechResponseType = SpeechResponseType.NoItemExists }); return(await AlexaResponseClient.Instance.BuildAlexaResponseAsync(new Response() { shouldEndSession = true, directives = new List <IDirective>() { await RenderDocumentDirectiveManager.Instance.RenderAudioDocumentDirectiveAsync(aplaDataSourceProperties) } }, Session)); } //User should not access this item. Warn the user, and place a notification in the Emby Activity Label if (!result.IsParentalAllowed(Session.User)) { try { var config = Plugin.Instance.Configuration; if (config.EnableServerActivityLogNotifications) { await ServerController.Instance.CreateActivityEntry(LogSeverity.Warn, $"{Session.User} attempted to view a restricted item.", $"{Session.User} attempted to view {result.Name}."); } } catch { } var genericLayoutProperties = await DataSourcePropertiesManager.Instance.GetGenericViewPropertiesAsync($"Stop! Rated {result.OfficialRating}", "/particles"); var parentalControlNotAllowedAudioProperties = await DataSourcePropertiesManager.Instance.GetAudioResponsePropertiesAsync(new InternalAudioResponseQuery() { SpeechResponseType = SpeechResponseType.ParentalControlNotAllowed, item = result, session = Session }); return(await AlexaResponseClient.Instance.BuildAlexaResponseAsync(new Response() { shouldEndSession = null, directives = new List <IDirective>() { await RenderDocumentDirectiveManager.Instance.RenderVisualDocumentDirectiveAsync(genericLayoutProperties, Session), await RenderDocumentDirectiveManager.Instance.RenderAudioDocumentDirectiveAsync(parentalControlNotAllowedAudioProperties) } }, Session)); } if (Session.hasRoom) { try { await ServerController.Instance.BrowseItemAsync(Session, result); } catch (Exception exception) { ServerController.Instance.Log.Error(exception.Message); } } var sequenceLayoutProperties = await DataSourcePropertiesManager.Instance.GetBaseItemDetailViewPropertiesAsync(result, Session); var aplaDataSource1 = await DataSourcePropertiesManager.Instance.GetAudioResponsePropertiesAsync(new InternalAudioResponseQuery() { SpeechResponseType = SpeechResponseType.ItemBrowse, item = result, session = Session } ); //Update Session Session.NowViewingBaseItem = result; AlexaSessionManager.Instance.UpdateSession(Session, sequenceLayoutProperties); var renderDocumentDirective = await RenderDocumentDirectiveManager.Instance.RenderVisualDocumentDirectiveAsync(sequenceLayoutProperties, Session); var renderAudioDirective = await RenderDocumentDirectiveManager.Instance.RenderAudioDocumentDirectiveAsync(aplaDataSource1); try { return(await AlexaResponseClient.Instance.BuildAlexaResponseAsync(new Response() { shouldEndSession = null, directives = new List <IDirective>() { renderDocumentDirective, renderAudioDirective } }, Session)); } catch (Exception exception) { throw new Exception("I was unable to build the render document. " + exception.Message); } }