Before you continue
Before submitting a bug report, please review our troubleshooting documentation at Troubleshoot Issues | Vega Troubleshooting
If you still want to file a bug report, please make sure to fill in all the details below and provide the necessary information.
NOTE: PLEASE ONLY REPORT A SINGLE BUG USING THIS TEMPLATE.
If you’re experiencing multiple issues, please file a separate report for each.
Bug Description
1. Summary
No Continue Watching Row being showed,
App Name:
App Link on Amazon Appstore (found through Developer Console → Actions column in App List → View on Amazon.com):
Vix
Bug Severity
Select one that applies
- Impacts operation of app
- x Blocks current development
- Improvement suggestion
- Issue with documentation (If selected, please share the doc link and describe the issue)
- Other
2. Steps to Reproduce
Watch a content after 2%, wait for content personalization logs
3. Observed Behavior
Explain what actually happened, noting any discrepancies or malfunctions.
sofia.lozada@MX-IT11588 ~ % vega exec vda shell loggingctl log --follow | grep -Ei 'kepler.tv.personalization|PlaybackEventsVegaMessage|content.dataRefresh'
Mar 05 09:47:08.642030 firestick-1f252afecb263eae local0.info com.univision.prendetv[16192]: 538995324 INFO kepler.tv.personalization.ancp.turbomodule: AutoLink entry function called for AmazonNativeContentPersonalization
Mar 05 09:47:08.656219 firestick-1f252afecb263eae local0.info com.univision.prendetv[16192]: 538995324 INFO kepler.tv.personalization: IContentPersonalizationServer2 getOrMakeServer2 called
Mar 05 09:47:08.672721 firestick-1f252afecb263eae local0.info com.univision.prendetv[16192]: 538995324 INFO kepler.tv.personalization.ancp.turbomodule: Registered AmazonNativeContentPersonalization
Mar 05 09:47:08.672963 firestick-1f252afecb263eae local0.info com.univision.prendetv[16192]: 538995324 INFO kepler.tv.personalization.ancp.turbomodule: JS Thread Id: 2850484992
Mar 05 09:47:08.675967 firestick-1f252afecb263eae local0.info com.univision.prendetv[16192]: 538995324 INFO kepler.tv.personalization.ancp.turbomodule: reportNewPlaybackEvent called
Mar 05 09:47:08.676197 firestick-1f252afecb263eae local0.info com.univision.prendetv[16192]: 538995324 INFO kepler.tv.personalization: reportNewPlaybackEvent async call received
Mar 05 09:47:08.676576 firestick-1f252afecb263eae local0.info com.univision.prendetv[16192]: 538995324 INFO kepler.tv.personalization: sendPlaybackEvents is submitted to thread pool
Mar 05 09:47:09.506376 firestick-1f252afecb263eae local0.info com.univision.prendetv[16192]: 921945510 INFO kepler.tv.personalization: sendPlaybackEvents async call completed successfully
Mar 05 09:47:09.572452 firestick-1f252afecb263eae local0.info com.univision.prendetv[16192]: 538995324 INFO kepler.tv.personalization.ancp.turbomodule: reportNewPlaybackEvent called
Mar 05 09:47:09.572604 firestick-1f252afecb263eae local0.info com.univision.prendetv[16192]: 538995324 INFO kepler.tv.personalization: reportNewPlaybackEvent async call received
Mar 05 09:47:09.572731 firestick-1f252afecb263eae local0.info com.univision.prendetv[16192]: 538995324 INFO kepler.tv.personalization: sendPlaybackEvents is submitted to thread pool
Mar 05 09:47:09.587252 firestick-1f252afecb263eae local0.info com.univision.prendetv[16192]: 1591239378 INFO kepler.tv.personalization: sendPlaybackEvents async call completed successfully
Mar 05 09:47:10.124504 firestick-1f252afecb263eae local0.info com.univision.prendetv[16192]: 538995324 INFO kepler.tv.personalization.ancp.turbomodule: reportNewPlaybackEvent called
Mar 05 09:47:10.125086 firestick-1f252afecb263eae local0.info com.univision.prendetv[16192]: 538995324 INFO kepler.tv.personalization: reportNewPlaybackEvent async call received
Mar 05 09:47:10.125242 firestick-1f252afecb263eae local0.info com.univision.prendetv[16192]: 538995324 INFO kepler.tv.personalization: sendPlaybackEvents is submitted to thread pool
Mar 05 09:47:10.142885 firestick-1f252afecb263eae local0.info com.univision.prendetv[16192]: 3619471110 INFO kepler.tv.personalization: sendPlaybackEvents async call completed successfully
Mar 05 09:47:11.164663 firestick-1f252afecb263eae local0.info com.univision.prendetv[16192]: 538995324 INFO kepler.tv.personalization.ancp.turbomodule: reportNewPlaybackEvent called
Mar 05 09:47:11.164815 firestick-1f252afecb263eae local0.info com.univision.prendetv[16192]: 538995324 INFO kepler.tv.personalization: reportNewPlaybackEvent async call received
Mar 05 09:47:11.164943 firestick-1f252afecb263eae local0.info com.univision.prendetv[16192]: 538995324 INFO kepler.tv.personalization: sendPlaybackEvents is submitted to thread pool
Mar 05 09:47:11.182048 firestick-1f252afecb263eae local0.info com.univision.prendetv[16192]: 2339668612 INFO kepler.tv.personalization: sendPlaybackEvents async call completed successfully
Mar 05 09:47:16.322488 firestick-1f252afecb263eae local0.info com.univision.prendetv[16192]: 538995324 INFO kepler.tv.personalization.ancp.turbomodule: reportNewPlaybackEvent called
Mar 05 09:47:16.322667 firestick-1f252afecb263eae local0.info com.univision.prendetv[16192]: 538995324 INFO kepler.tv.personalization: reportNewPlaybackEvent async call received
Mar 05 09:47:16.322841 firestick-1f252afecb263eae local0.info com.univision.prendetv[16192]: 538995324 INFO kepler.tv.personalization: sendPlaybackEvents is submitted to thread pool
Mar 05 09:47:16.336661 firestick-1f252afecb263eae local0.info com.univision.prendetv[16192]: 921945510 INFO kepler.tv.personalization: sendPlaybackEvents async call completed successfully
4. Expected Behavior
Describe what you expected the SDK to do under normal operation.
<!-- Answer here -->
4.a Possible Root Cause & Temporary Workaround
Fill out anything you have tried. If you don’t know, N/A is acceptable
<!-- Answer here -->
5. Logs or crash report
(Please make sure to provide relevant logs as attachment)
For crash issues, please refer this guide for faster troubleshooting: Detect Where the App Crash Originates | Design and Develop Vega Apps
-
For issues with Vega Studio Extension, please share log files from below folders:
For v0.22+:~/.vscode/extensions/amazon.vega-extension-<version>/ExtensionLogs ~/.vscode/extensions/amazon.vega-ui-extension-<version>/ExtensionLogsFor v0.21 and earlier:
~/.vscode/extensions/amazon.kepler-extension-<version>/ExtensionLogs ~/.vscode/extensions/amazon.kepler-ui-extension-<version>/ExtensionLogs
6. Environment
Please fill out the fields related to your bug below:
-
SDK Version: Run
vega --version(v0.22+) orkepler --version(v0.21 and earlier) and paste output -
App State:
[Foreground/Background] -
OS Information: Please ssh into the device via
vega exec vda shell(orkepler exec vda shellfor v0.21 and earlier) and copy the output fromcat /etc/os-releaseinto the answer section below. Note, if you don’t have a simulator running or device attached, the command will respond withvda: no devices/emulators found<!-- Answer here if applicable -->
7. Example Code Snippet / Screenshots / Screengrabs
Include any relevant code or component setup in React Native that can help reproduce the bug.
/* eslint-disable no-await-in-loop */
/* eslint-disable class-methods-use-this */
import {
ContentIdBuilder,
ContentIdNamespaces,
ContentPersonalizationServer,
CustomerListType,
IContentEntitlementsHandler,
IContentEntitlementsProvider, ICustomerListEntriesHandler, ICustomerListEntriesProvider, IPlaybackEventsHandler, IPlaybackEventsProvider,
PlaybackEventBuilder,
PlaybackState,
ProfileIdBuilder,
ProfileIdNamespaces,
} from '@amazon-devices/kepler-content-personalization';
import { IComponentInstance } from '@amazon-devices/react-native-kepler';
import { IHeadlessServiceInterface } from './HeadlessServiceInterface';
import graphQLClient from 'src/api/client';
import { useAppStore } from 'src/store/store';
import { CONTINUE_WATCHING_CONTENT } from 'src/api/graphql/queries';
import { IUiContinueWatchingResponse } from 'src/components/organisms/ContinueWatchingCarouselModule/ContinueWatching.types';
import { IUiModuleEdgeContentEdgeNode } from 'src/types';
/** ********* Content Personalization Handlers */
const contentEntitlementsHandler: IContentEntitlementsHandler = {
getAllContentEntitlements: (
contentEntitlementsProvider: IContentEntitlementsProvider,
) => {
contentEntitlementsProvider.addContentEntitlementChunk([]);
contentEntitlementsProvider.commit();
},
};
const customerListEntriesHandler: ICustomerListEntriesHandler = {
getAllCustomerListEntries: (
listType: CustomerListType,
customerListEntriesProvider: ICustomerListEntriesProvider,
) => {
customerListEntriesProvider.addCustomerListChunk(listType, []);
customerListEntriesProvider.commit();
},
};
const playbackEventsHandler: IPlaybackEventsHandler = {
getPlaybackEventsSince: async (
sinceTimestamp: Date,
playbackEventsProvider: IPlaybackEventsProvider,
) => {
try {
const client = graphQLClient();
const profileIdValue = useAppStore.getState()?.profileId ?? '';
const profileId = new ProfileIdBuilder()
.id(profileIdValue)
.idNamespace(ProfileIdNamespaces.NAMESPACE_APP_INTERNAL)
.build();
let hasNext = true;
let afterCursor: string | undefined;
const toPlaybackEvent = (node: IUiModuleEdgeContentEdgeNode, progressPercent?: number) => {
const durationSec = node?.videoTypeData?.playbackData?.streamMetadata?.duration ?? 0;
const durationMs = Math.round(durationSec * 1000);
const progress = typeof progressPercent === 'number' ? progressPercent / 100 : (node?.progressPercentage ?? 0) / 100;
const positionMs = Math.round(durationMs * progress);
const contentId = new ContentIdBuilder()
.id(node?.id ?? '')
.idNamespace(ContentIdNamespaces.NAMESPACE_CDF_ID)
.build();
const state = (positionMs >= Math.max(0, durationMs - 5000) && durationMs > 0) ? PlaybackState.EXIT : PlaybackState.PLAYING;
const eventTimestamp = new Date();
const ev = new PlaybackEventBuilder()
.contentId(contentId)
.durationMs(durationMs)
.playbackPositionMs(positionMs)
.playbackState(state)
.profileId(profileId)
.eventTimestamp(eventTimestamp)
.buildOffDeviceEvent();
return ev;
};
while (hasNext) {
const variables = {
pagination: { first: 10, after: afterCursor, carouselId: undefined },
};
const resp: IUiContinueWatchingResponse = await client.request(CONTINUE_WATCHING_CONTENT, variables);
const page = resp.continueWatchingCarouselContents;
const edges = page?.edges ?? [];
if (!edges || edges.length === 0) {
hasNext = false;
break;
}
const events = [];
for (const edge of edges) {
const node = edge?.node ?? edge;
const progressPercent = node?.progressPercentage ?? 0;
try {
const ev = toPlaybackEvent(node, progressPercent);
events.push(ev);
} catch (err) {
console.warn('Headless CP: failed to build playback event for node', err);
}
}
if (events.length) {
playbackEventsProvider.addPlaybackEventChunk(events);
}
afterCursor = page?.pageInfo?.endCursor ?? undefined;
hasNext = !!page?.pageInfo?.hasNextPage;
}
playbackEventsProvider.commit();
} catch (err) {
console.error('Headless CP: error in getPlaybackEventsSince', err);
try {
playbackEventsProvider.commit();
} catch (_) { /* swallow */ }
}
},
};
/** ********* Assign the Content Personalization Handlers */
/**
*
*/
class HeadlessService implements IHeadlessServiceInterface {
/**
* This is where you should set any handlers for Amazon's content
* personalization service commands that your application wants to respond to.
*
* @param componentInstance - The component instance for the headless service,
* passed in by Kepler when the service starts. This should be passed to the `set...HandlerForComponent`
* methods to register handlers for Amazon's content personalization service commands.
*/
public onStart(componentInstance: IComponentInstance): Promise<void> {
console.log(
'Headless Service: started. Setting the handlers for Content Personalization',
);
ContentPersonalizationServer.setContentEntitlementsHandlerForComponent(contentEntitlementsHandler, componentInstance);
ContentPersonalizationServer.setCustomerListEntriesHandlerForComponent(customerListEntriesHandler, componentInstance);
ContentPersonalizationServer.setPlaybackEventsHandlerForComponent(playbackEventsHandler, componentInstance);
return Promise.resolve();
}
/**
* This is where you should clean up any handlers set in onStart.
*
* @param componentInstance - The component instance for the headless service,
* passed in by Kepler when the service stops. This should be passed to the
* `set...HandlerForComponent` methods to unregister handlers for Amazon's content personalization service commands.
*/
// eslint-disable-next-line @typescript-eslint/no-unused-vars
public onStop(componentInstance: IComponentInstance): Promise<void> {
console.log('Headless Service: onStop() called');
return Promise.resolve();
}
}
const HeadlessServiceInstance = new HeadlessService() as IHeadlessServiceInterface;
export const onStartService = (componentInstance: IComponentInstance): Promise<void> => HeadlessServiceInstance.onStart(componentInstance);
export const onStopService = (componentInstance: IComponentInstance): Promise<void> => HeadlessServiceInstance.onStop(componentInstance);
Playback Issues
If this is a playback issue, please provide your content URL, any pre-conditions (like geo-location), and let us know if it’s x86 or arm7.
<!-- Describe your playback issue if applicable -->
Please share the following details in addition:_
- Player SDK:
[Bitmovin, Shaka, ...] - Player SDK Version:
[e.g. 1.23]- Audio Codecs:
[AAC, ...] - Video Codecs:
[h.264, mp4] - Manifest Types:
[m3u8, dash, etc ..]
- Audio Codecs:
Q: If applicable, please provide your media/content url
If this is created dynamically, tokenized, etc please provide a way for us to access it
[N/A or Content / Media Url for testing]
Q: Are there any special headers required to reproduce the issue you are facing?
[N/A or Insert Headers]
Additionally please provide the following if possible
Provide Screenshots / Screengrabs / Logs. Please include as much information as you can that will help debug.
<!-- Answer here if applicable -->
Additional Context
Any Additional Context you would like to provide?
Add any other relevant information, such as recent updates to the SDK, dependencies, or device OS that may affect the bug.
<!-- Answer here if applicable -->