Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Support for XOne devices #7529

Draft
wants to merge 13 commits into
base: main
Choose a base branch
from
3 changes: 2 additions & 1 deletion lib/polyfill/media_capabilities.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ shaka.polyfill.MediaCapabilities = class {
shaka.util.Platform.isWebOS() ||
shaka.util.Platform.isTizen() ||
shaka.util.Platform.isEOS() ||
shaka.util.Platform.isHisense()) {
shaka.util.Platform.isHisense() ||
shaka.util.Platform.isXOne()) {
canUseNativeMCap = false;
}
if (canUseNativeMCap && navigator.mediaCapabilities) {
Expand Down
12 changes: 12 additions & 0 deletions lib/polyfill/mediasource.js
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,18 @@ shaka.polyfill.MediaSource = class {
// the player from trying to play opus on Tizen, we will override media
// source to always reject opus content.
shaka.polyfill.MediaSource.rejectCodec_('opus');
} else if (shaka.util.Platform.isXOne()) {
// XOne look to be like safari 8 which do not correctly
// implement abort() on SourceBuffer.
// Calling abort() before appending a segment causes that segment to be
// incomplete in the buffer.
// Bug filed: https://bugs.webkit.org/show_bug.cgi?id=165342
shaka.polyfill.MediaSource.stubAbort_();
// If you remove up to a keyframe, Webkit 601.x.x incorrectly will also
// remove that keyframe and the content up to the next.
// Offsetting the end of the removal range seems to help.
// Bug filed: https://bugs.webkit.org/show_bug.cgi?id=177884
shaka.polyfill.MediaSource.patchRemovalRange_();
} else {
shaka.log.info('Using native MSE as-is.');
}
Expand Down
23 changes: 21 additions & 2 deletions lib/util/platform.js
Original file line number Diff line number Diff line change
Expand Up @@ -302,7 +302,8 @@ shaka.util.Platform = class {
!shaka.util.Platform.isAmazonFireTV() &&
!shaka.util.Platform.isWPE() &&
!shaka.util.Platform.isZenterio() &&
!shaka.util.Platform.isSkyQ();
!shaka.util.Platform.isSkyQ() &&
!shaka.util.Platform.isXOne();
}

/**
Expand Down Expand Up @@ -354,6 +355,23 @@ shaka.util.Platform = class {
return shaka.util.Platform.userAgentContains_('Sky_STB');
}

/**
* Check if the current platform is XOne.
*/
static isXOne() {
let rdk = false;
if (window && Object.keys(window).includes('ServiceManager')) {
Copy link
Member

@joeyparrish joeyparrish Nov 1, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this simpler version work instead?

if (window.ServiceManager && window.ServiceManager.getServiceForJavaScript &&
    navigator.platform.includes('Linux aarch64') &&
    shaka.util.Platform.userAgentContains_('AppleWebKit') &&
    shaka.util.Platform.userAgentContains_('Version/8.0')) {

You will need to add a file following the example of externs/xbox.js to satisfy the compiler that ServiceManager and getServiceForJavaScript might exist. The types can be very simple if you don't need to call into any of that functionality.

const subRDK = window['ServiceManager'];
if (Object.keys(subRDK).includes('getServiceForJavaScript')) {
rdk = true;
}
}
return rdk && navigator.platform &&
navigator.platform.includes('Linux aarch64') &&
shaka.util.Platform.userAgentContains_('AppleWebKit') &&
shaka.util.Platform.userAgentContains_('Version/8.0');
}

/**
* Check if the current platform is Amazon Fire TV.
* https://developer.amazon.com/docs/fire-tv/identify-amazon-fire-tv-devices.html
Expand Down Expand Up @@ -537,7 +555,8 @@ shaka.util.Platform = class {
Platform.isEOS() || Platform.isAPL() ||
Platform.isVirginMedia() || Platform.isOrange() ||
Platform.isWPE() || Platform.isChromecast() ||
Platform.isHisense() || Platform.isZenterio()) {
Platform.isHisense() || Platform.isZenterio() ||
Platform.isXOne()) {
return true;
}
return false;
Expand Down
Loading