shaka-player 4.6.4 → 4.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/controls.css +1 -1
- package/dist/controls.css.map +1 -1
- package/dist/deps.js +9 -5
- package/dist/locales.js +29 -29
- package/dist/shaka-player.compiled.d.ts +46 -3
- package/dist/shaka-player.compiled.debug.d.ts +46 -3
- package/dist/shaka-player.compiled.debug.externs.js +45 -0
- package/dist/shaka-player.compiled.debug.js +382 -351
- package/dist/shaka-player.compiled.debug.map +4 -4
- package/dist/shaka-player.compiled.externs.js +45 -0
- package/dist/shaka-player.compiled.js +1135 -1121
- package/dist/shaka-player.compiled.map +4 -4
- package/dist/shaka-player.ui.d.ts +68 -4
- package/dist/shaka-player.ui.debug.d.ts +68 -4
- package/dist/shaka-player.ui.debug.externs.js +77 -0
- package/dist/shaka-player.ui.debug.js +428 -392
- package/dist/shaka-player.ui.debug.map +4 -4
- package/dist/shaka-player.ui.externs.js +77 -0
- package/dist/shaka-player.ui.js +1304 -1290
- package/dist/shaka-player.ui.map +4 -4
- package/externs/mediasession.js +7 -0
- package/externs/shaka/abr_manager.js +8 -0
- package/externs/shaka/manifest.js +3 -3
- package/externs/shaka/player.js +59 -4
- package/lib/abr/simple_abr_manager.js +41 -15
- package/lib/cea/cea708_service.js +1 -1
- package/lib/cea/cea708_window.js +95 -7
- package/lib/dash/dash_parser.js +55 -11
- package/lib/media/adaptation_set_criteria.js +76 -10
- package/lib/media/media_source_engine.js +42 -18
- package/lib/media/segment_reference.js +12 -0
- package/lib/media/streaming_engine.js +55 -3
- package/lib/player.js +92 -6
- package/lib/util/cmsd_manager.js +269 -0
- package/lib/util/content_steering_manager.js +5 -1
- package/lib/util/mime_utils.js +6 -2
- package/lib/util/periods.js +108 -39
- package/lib/util/player_configuration.js +19 -5
- package/lib/util/stream_utils.js +82 -13
- package/package.json +1 -1
- package/ui/audio_language_selection.js +3 -0
- package/ui/controls.js +60 -0
- package/ui/externs/ui.js +12 -1
- package/ui/hidden_fast_forward_button.js +32 -0
- package/ui/hidden_rewind_button.js +32 -0
- package/ui/hidden_seek_button.js +121 -0
- package/ui/less/buttons.less +50 -0
- package/ui/less/containers.less +18 -0
- package/ui/resolution_selection.js +2 -0
- package/ui/ui.js +2 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -75
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -26
- package/.github/ISSUE_TEMPLATE/question.md +0 -26
- package/.github/config.yml +0 -1
- package/.github/workflows/appspot.yaml +0 -39
- package/.github/workflows/build-and-test.yaml +0 -222
- package/.github/workflows/compute-incremental-coverage.py +0 -265
- package/.github/workflows/custom-actions/prep-for-appspot/action.yaml +0 -56
- package/.github/workflows/custom-actions/set-commit-status/action.yaml +0 -37
- package/.github/workflows/deflake.yaml +0 -31
- package/.github/workflows/demo-version-index.yaml +0 -43
- package/.github/workflows/nightly-demo.yaml +0 -42
- package/.github/workflows/release-please.yaml +0 -193
- package/.github/workflows/report-incremental-coverage.yaml +0 -39
- package/.github/workflows/safari-homedir-launcher.sh +0 -18
- package/.github/workflows/selenium-lab-tests.yaml +0 -370
- package/.github/workflows/shaka-bot-commands/command-help.sh +0 -27
- package/.github/workflows/shaka-bot-commands/command-test.sh +0 -56
- package/.github/workflows/shaka-bot-commands/lib.sh +0 -83
- package/.github/workflows/shaka-bot-commands/main.sh +0 -51
- package/.github/workflows/sync-labels.yaml +0 -33
- package/.github/workflows/talk-to-shaka-bot.yaml +0 -29
- package/.github/workflows/update-issues.yaml +0 -31
- package/.github/workflows/update-screenshots.yaml +0 -142
- package/.github/workflows/validate-pr-title.yaml +0 -27
- package/CHANGELOG.md +0 -5774
- package/CODE_OF_CONDUCT.md +0 -93
- package/CONTRIBUTING.md +0 -76
- package/demo/TengwarTelcontar.woff2 +0 -0
- package/demo/app_logo_144.png +0 -0
- package/demo/app_logo_192.png +0 -0
- package/demo/app_logo_256.png +0 -0
- package/demo/app_logo_384.png +0 -0
- package/demo/app_logo_512.png +0 -0
- package/demo/app_manifest.json +0 -29
- package/demo/asset_card.js +0 -410
- package/demo/autoTemplate.txt +0 -61
- package/demo/cast_receiver/idle1.jpg +0 -0
- package/demo/cast_receiver/idle2.jpg +0 -0
- package/demo/cast_receiver/idle3.jpg +0 -0
- package/demo/cast_receiver/index.html +0 -75
- package/demo/cast_receiver/receiver_app.css +0 -111
- package/demo/cast_receiver/receiver_app.js +0 -158
- package/demo/close_button.js +0 -60
- package/demo/common/asset.js +0 -510
- package/demo/common/assets.js +0 -1634
- package/demo/config.js +0 -859
- package/demo/custom.js +0 -907
- package/demo/customWarning.txt +0 -8
- package/demo/demo.less +0 -591
- package/demo/demo_uncompiled.js +0 -11
- package/demo/demo_utils.js +0 -113
- package/demo/favicon.ico +0 -0
- package/demo/front.js +0 -156
- package/demo/icons/README.md +0 -4
- package/demo/icons/baseline-audiotrack-24px.svg +0 -1
- package/demo/icons/baseline-closed_caption-24px.svg +0 -1
- package/demo/icons/baseline-fast_forward-24px.svg +0 -1
- package/demo/icons/baseline-language-24px.svg +0 -1
- package/demo/icons/baseline-live_tv-24px.svg +0 -1
- package/demo/icons/baseline-subtitles-24px.svg +0 -1
- package/demo/icons/baseline-surround_sound-24px.svg +0 -1
- package/demo/icons/custom_ad.svg +0 -1
- package/demo/icons/custom_box_with_text.svg +0 -1
- package/demo/icons/custom_clear_key.svg +0 -1
- package/demo/icons/custom_high_definition.svg +0 -1
- package/demo/icons/custom_playready.svg +0 -1
- package/demo/icons/custom_ultra_high_definition.svg +0 -1
- package/demo/icons/custom_widevine.svg +0 -1
- package/demo/index.html +0 -173
- package/demo/input.js +0 -270
- package/demo/input_container.js +0 -218
- package/demo/load.js +0 -156
- package/demo/main.js +0 -1854
- package/demo/search.js +0 -452
- package/demo/service_worker.js +0 -355
- package/demo/shaka_logo_trans.png +0 -0
- package/demo/tooltip.js +0 -29
- package/demo/visualizer.js +0 -335
- package/demo/visualizer_button.js +0 -84
- package/dist/demo.compiled.debug.js +0 -340
- package/dist/demo.compiled.debug.map +0 -8
- package/dist/demo.compiled.js +0 -340
- package/dist/demo.compiled.map +0 -8
- package/dist/demo.css +0 -6
- package/dist/demo.css.map +0 -1
- package/dist/receiver.compiled.debug.js +0 -187
- package/dist/receiver.compiled.debug.map +0 -8
- package/dist/receiver.compiled.js +0 -187
- package/dist/receiver.compiled.map +0 -8
- package/docs/announcement-list-join-group.png +0 -0
- package/docs/api-mainpage.md +0 -28
- package/docs/design/REDESIGN.md +0 -283
- package/docs/design/architecture.md +0 -13
- package/docs/design/bg-fetch-after.gv +0 -29
- package/docs/design/bg-fetch-after.gv.png +0 -0
- package/docs/design/bg-fetch-before.gv +0 -18
- package/docs/design/bg-fetch-before.gv.png +0 -0
- package/docs/design/bg-fetch.md +0 -134
- package/docs/design/cast.gv +0 -35
- package/docs/design/cast.gv.png +0 -0
- package/docs/design/chromecast.md +0 -151
- package/docs/design/codec_preferences.md +0 -158
- package/docs/design/dash-audio-channels.md +0 -123
- package/docs/design/dash-manifests.md +0 -248
- package/docs/design/dash-timeline.svg +0 -4
- package/docs/design/dataflow.gv +0 -66
- package/docs/design/dataflow.gv.png +0 -0
- package/docs/design/export.md +0 -70
- package/docs/design/fuzzy-locale-matching.md +0 -40
- package/docs/design/gap-jumping.md +0 -151
- package/docs/design/lcevc-architecture.png +0 -0
- package/docs/design/lcevc-demo.png +0 -0
- package/docs/design/lcevc-integration.md +0 -72
- package/docs/design/locale_compatibility.svg +0 -1
- package/docs/design/locales_tree.svg +0 -1
- package/docs/design/localization-design-principles.md +0 -158
- package/docs/design/newdemo.gv +0 -83
- package/docs/design/newdemo.gv.png +0 -0
- package/docs/design/offline.gv +0 -43
- package/docs/design/offline.gv.png +0 -0
- package/docs/design/offline.md +0 -153
- package/docs/design/ownership.gv +0 -76
- package/docs/design/ownership.gv.png +0 -0
- package/docs/design/preload.md +0 -299
- package/docs/design/preload.png +0 -0
- package/docs/design/talking-about-languages.md +0 -46
- package/docs/design/timeline.svg +0 -152
- package/docs/design/ui.md +0 -31
- package/docs/design/ui_player_relationships.svg +0 -1
- package/docs/jsdoc-plugin.js +0 -74
- package/docs/jsdoc-template/README.md +0 -1
- package/docs/jsdoc-template/publish.js +0 -879
- package/docs/jsdoc-template/static/fonts/OpenSans-Bold-webfont.eot +0 -0
- package/docs/jsdoc-template/static/fonts/OpenSans-Bold-webfont.svg +0 -1830
- package/docs/jsdoc-template/static/fonts/OpenSans-Bold-webfont.woff +0 -0
- package/docs/jsdoc-template/static/fonts/OpenSans-BoldItalic-webfont.eot +0 -0
- package/docs/jsdoc-template/static/fonts/OpenSans-BoldItalic-webfont.svg +0 -1830
- package/docs/jsdoc-template/static/fonts/OpenSans-BoldItalic-webfont.woff +0 -0
- package/docs/jsdoc-template/static/fonts/OpenSans-Italic-webfont.eot +0 -0
- package/docs/jsdoc-template/static/fonts/OpenSans-Italic-webfont.svg +0 -1830
- package/docs/jsdoc-template/static/fonts/OpenSans-Italic-webfont.woff +0 -0
- package/docs/jsdoc-template/static/fonts/OpenSans-Light-webfont.eot +0 -0
- package/docs/jsdoc-template/static/fonts/OpenSans-Light-webfont.svg +0 -1831
- package/docs/jsdoc-template/static/fonts/OpenSans-Light-webfont.woff +0 -0
- package/docs/jsdoc-template/static/fonts/OpenSans-LightItalic-webfont.eot +0 -0
- package/docs/jsdoc-template/static/fonts/OpenSans-LightItalic-webfont.svg +0 -1835
- package/docs/jsdoc-template/static/fonts/OpenSans-LightItalic-webfont.woff +0 -0
- package/docs/jsdoc-template/static/fonts/OpenSans-Regular-webfont.eot +0 -0
- package/docs/jsdoc-template/static/fonts/OpenSans-Regular-webfont.svg +0 -1831
- package/docs/jsdoc-template/static/fonts/OpenSans-Regular-webfont.woff +0 -0
- package/docs/jsdoc-template/static/scripts/linenumber.js +0 -44
- package/docs/jsdoc-template/static/scripts/show-widget.js +0 -55
- package/docs/jsdoc-template/static/styles/jsdoc-default.css +0 -438
- package/docs/jsdoc-template/tmpl/augments.tmpl +0 -10
- package/docs/jsdoc-template/tmpl/container.tmpl +0 -205
- package/docs/jsdoc-template/tmpl/details.tmpl +0 -152
- package/docs/jsdoc-template/tmpl/example.tmpl +0 -2
- package/docs/jsdoc-template/tmpl/examples.tmpl +0 -13
- package/docs/jsdoc-template/tmpl/exceptions.tmpl +0 -32
- package/docs/jsdoc-template/tmpl/layout.tmpl +0 -50
- package/docs/jsdoc-template/tmpl/mainpage.tmpl +0 -14
- package/docs/jsdoc-template/tmpl/members.tmpl +0 -47
- package/docs/jsdoc-template/tmpl/method.tmpl +0 -140
- package/docs/jsdoc-template/tmpl/modifies.tmpl +0 -14
- package/docs/jsdoc-template/tmpl/params.tmpl +0 -131
- package/docs/jsdoc-template/tmpl/properties.tmpl +0 -125
- package/docs/jsdoc-template/tmpl/returns.tmpl +0 -19
- package/docs/jsdoc-template/tmpl/source.tmpl +0 -8
- package/docs/jsdoc-template/tmpl/tutorial.tmpl +0 -21
- package/docs/jsdoc-template/tmpl/type.tmpl +0 -7
- package/docs/jsdoc.conf.json +0 -38
- package/docs/shaka-player-logo.png +0 -0
- package/docs/style.md +0 -174
- package/docs/tutorials/a11y.md +0 -64
- package/docs/tutorials/ad_monetization.md +0 -292
- package/docs/tutorials/application-level-redirects.md +0 -94
- package/docs/tutorials/architecture.md +0 -32
- package/docs/tutorials/basic-usage.md +0 -89
- package/docs/tutorials/blob-url.md +0 -15
- package/docs/tutorials/config.md +0 -148
- package/docs/tutorials/debugging.md +0 -189
- package/docs/tutorials/drm-config.md +0 -274
- package/docs/tutorials/errors.md +0 -95
- package/docs/tutorials/fairplay.md +0 -242
- package/docs/tutorials/faq.md +0 -252
- package/docs/tutorials/index.json +0 -29
- package/docs/tutorials/lcevc.md +0 -118
- package/docs/tutorials/license-server-auth.md +0 -248
- package/docs/tutorials/license-wrapping.md +0 -168
- package/docs/tutorials/manifest-parser.md +0 -365
- package/docs/tutorials/network-and-buffering-config.md +0 -119
- package/docs/tutorials/offline.md +0 -683
- package/docs/tutorials/plugins.md +0 -184
- package/docs/tutorials/selenium-grid-config.md +0 -174
- package/docs/tutorials/service-worker.md +0 -106
- package/docs/tutorials/ui-customization.md +0 -288
- package/docs/tutorials/ui.md +0 -232
- package/docs/tutorials/upgrade-manifest.md +0 -281
- package/docs/tutorials/upgrade.md +0 -104
- package/docs/tutorials/welcome.md +0 -108
- package/docs/tutorials/widevine-service-certs.md +0 -45
- package/karma.conf.js +0 -879
- package/maintained-branches.md +0 -15
- package/roadmap.md +0 -186
- package/test/abr/simple_abr_manager_unit.js +0 -398
- package/test/ads/ad_manager_unit.js +0 -260
- package/test/assumptions/uint8_array_unit.js +0 -22
- package/test/cast/cast_proxy_unit.js +0 -736
- package/test/cast/cast_receiver_integration.js +0 -488
- package/test/cast/cast_receiver_unit.js +0 -1183
- package/test/cast/cast_sender_unit.js +0 -973
- package/test/cast/cast_utils_unit.js +0 -311
- package/test/cea/cea608_memory_unit.js +0 -411
- package/test/cea/cea708_service_unit.js +0 -674
- package/test/cea/cea708_window_unit.js +0 -373
- package/test/cea/cea_decoder_unit.js +0 -615
- package/test/cea/dtvcc_packet_builder_unit.js +0 -158
- package/test/cea/dtvcc_packet_unit.js +0 -60
- package/test/cea/mp4_cea_parser_unit.js +0 -127
- package/test/codec_switching/codec_switching_integration.js +0 -182
- package/test/dash/dash_parser_content_protection_unit.js +0 -998
- package/test/dash/dash_parser_integration.js +0 -74
- package/test/dash/dash_parser_live_unit.js +0 -1542
- package/test/dash/dash_parser_manifest_unit.js +0 -3121
- package/test/dash/dash_parser_segment_base_unit.js +0 -421
- package/test/dash/dash_parser_segment_list_unit.js +0 -380
- package/test/dash/dash_parser_segment_template_unit.js +0 -910
- package/test/dash/mpd_utils_unit.js +0 -794
- package/test/demo/demo_unit.js +0 -108
- package/test/deprecate/enforcer_unit.js +0 -74
- package/test/deprecate/version_unit.js +0 -57
- package/test/hls/hls_live_unit.js +0 -1330
- package/test/hls/hls_parser_unit.js +0 -5276
- package/test/hls/manifest_text_parser_unit.js +0 -545
- package/test/media/adaptation_set_criteria_unit.js +0 -806
- package/test/media/adaptation_set_unit.js +0 -229
- package/test/media/buffering_observer_unit.js +0 -143
- package/test/media/closed_caption_parser_unit.js +0 -18
- package/test/media/content_workarounds_unit.js +0 -43
- package/test/media/drm_engine_integration.js +0 -356
- package/test/media/drm_engine_unit.js +0 -2805
- package/test/media/media_source_engine_integration.js +0 -691
- package/test/media/media_source_engine_unit.js +0 -1512
- package/test/media/mp4_segment_index_parser_unit.js +0 -80
- package/test/media/play_rate_controller_unit.js +0 -69
- package/test/media/playhead_unit.js +0 -1394
- package/test/media/presentation_timeline_unit.js +0 -477
- package/test/media/quality_observer_unit.js +0 -138
- package/test/media/region_observer_unit.js +0 -374
- package/test/media/region_timeline_unit.js +0 -139
- package/test/media/segment_index_unit.js +0 -1080
- package/test/media/segment_prefetch_unit.js +0 -243
- package/test/media/segment_reference_unit.js +0 -63
- package/test/media/stall_detector_unit.js +0 -184
- package/test/media/streaming_engine_integration.js +0 -632
- package/test/media/streaming_engine_unit.js +0 -4211
- package/test/media/time_ranges_utils_unit.js +0 -123
- package/test/media/webm_segment_index_parser_unit.js +0 -90
- package/test/mss/mss_parser_content_protection_unit.js +0 -49
- package/test/mss/mss_parser_unit.js +0 -474
- package/test/mss/mss_player_integration.js +0 -124
- package/test/net/data_uri_plugin_unit.js +0 -105
- package/test/net/http_plugin_unit.js +0 -439
- package/test/net/networking_engine_unit.js +0 -1236
- package/test/net/networking_utils_unit.js +0 -37
- package/test/offline/download_progress_estimator_unit.js +0 -90
- package/test/offline/indexeddb_storage_unit.js +0 -192
- package/test/offline/manifest_convert_unit.js +0 -622
- package/test/offline/offline_integration.js +0 -168
- package/test/offline/offline_manifest_parser_unit.js +0 -231
- package/test/offline/offline_scheme_unit.js +0 -154
- package/test/offline/offline_uri_unit.js +0 -59
- package/test/offline/storage_compatibility_unit.js +0 -344
- package/test/offline/storage_integration.js +0 -1858
- package/test/player_external.js +0 -237
- package/test/player_integration.js +0 -1371
- package/test/player_load_graph_integration.js +0 -865
- package/test/player_src_equals_external.js +0 -154
- package/test/player_src_equals_integration.js +0 -527
- package/test/player_unit.js +0 -4434
- package/test/polyfill/media_capabilities_unit.js +0 -277
- package/test/polyfill/patchedmediakeys_apple_unit.js +0 -130
- package/test/test/assets/3675/chunk-stream0-00001.m4s +0 -0
- package/test/test/assets/3675/chunk-stream0-00002.m4s +0 -0
- package/test/test/assets/3675/chunk-stream0-00003.m4s +0 -0
- package/test/test/assets/3675/chunk-stream0-00004.m4s +0 -0
- package/test/test/assets/3675/chunk-stream0-00005.m4s +0 -0
- package/test/test/assets/3675/chunk-stream0-00006.m4s +0 -0
- package/test/test/assets/3675/chunk-stream0-00007.m4s +0 -0
- package/test/test/assets/3675/dash_0.mpd +0 -30
- package/test/test/assets/3675/dash_1.mpd +0 -30
- package/test/test/assets/3675/dash_2.mpd +0 -30
- package/test/test/assets/3675/dash_3.mpd +0 -30
- package/test/test/assets/3675/dash_4.mpd +0 -30
- package/test/test/assets/3675/dash_5.mpd +0 -26
- package/test/test/assets/3675/init-stream0.m4s +0 -0
- package/test/test/assets/audio-xhe-aac.mp4 +0 -0
- package/test/test/assets/audio.ts +0 -0
- package/test/test/assets/captions-test.ts +0 -0
- package/test/test/assets/cea-init.mp4 +0 -0
- package/test/test/assets/cea-segment.mp4 +0 -0
- package/test/test/assets/chapters.srt +0 -11
- package/test/test/assets/chapters.vtt +0 -10
- package/test/test/assets/chapters2.vtt +0 -10
- package/test/test/assets/dash-aes-128/Fragments(video=0,format=mpd-time-csf) +0 -0
- package/test/test/assets/dash-aes-128/Fragments(video=20000000,format=mpd-time-csf) +0 -0
- package/test/test/assets/dash-aes-128/Fragments(video=40000000,format=mpd-time-csf) +0 -0
- package/test/test/assets/dash-aes-128/Fragments(video=60000000,format=mpd-time-csf) +0 -0
- package/test/test/assets/dash-aes-128/Fragments(video=i,format=mpd-time-csf) +0 -0
- package/test/test/assets/dash-aes-128/dash.mpd +0 -18
- package/test/test/assets/dash-aes-128/license +0 -1
- package/test/test/assets/dash-multi-codec/audio_en_2c_128k_aac.mp4 +0 -0
- package/test/test/assets/dash-multi-codec/audio_es_2c_64k_opus.webm +0 -0
- package/test/test/assets/dash-multi-codec/dash.mpd +0 -32
- package/test/test/assets/dash-multi-codec/video_144p_108k_h264.mp4 +0 -0
- package/test/test/assets/db-dump-v1.json +0 -1
- package/test/test/assets/db-dump-v2-broken.json +0 -1
- package/test/test/assets/db-dump-v2-clean.json +0 -1
- package/test/test/assets/db-dump-v3.json +0 -1
- package/test/test/assets/db-dump-v4-broken.json +0 -1
- package/test/test/assets/db-dump-v5.json +0 -1
- package/test/test/assets/empty_caption_video_init.mp4 +0 -0
- package/test/test/assets/empty_caption_video_segment.mp4 +0 -0
- package/test/test/assets/encrypted-sintel-audio-init.mp4 +0 -0
- package/test/test/assets/encrypted-sintel-audio-segment.mp4 +0 -0
- package/test/test/assets/encrypted-sintel-video-init.mp4 +0 -0
- package/test/test/assets/encrypted-sintel-video-segment.mp4 +0 -0
- package/test/test/assets/green-pixel.mp4 +0 -0
- package/test/test/assets/green-pixel.txt +0 -15
- package/test/test/assets/h265-cea-init.mp4 +0 -0
- package/test/test/assets/h265-cea-segment.mp4 +0 -0
- package/test/test/assets/hls-raw-aac/fileSequence0.aac +0 -0
- package/test/test/assets/hls-raw-aac/fileSequence1.aac +0 -0
- package/test/test/assets/hls-raw-aac/fileSequence2.aac +0 -0
- package/test/test/assets/hls-raw-aac/fileSequence3.aac +0 -0
- package/test/test/assets/hls-raw-aac/manifest.m3u8 +0 -4
- package/test/test/assets/hls-raw-aac/stream.m4a.m3u8 +0 -14
- package/test/test/assets/hls-raw-ac3/fileSequence0.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence1.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence2.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence3.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence4.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence5.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence6.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence7.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/prog_index.m3u8 +0 -31
- package/test/test/assets/hls-raw-ec3/fileSequence0.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence1.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence2.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence3.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence4.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence5.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence6.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence7.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/prog_index.m3u8 +0 -31
- package/test/test/assets/hls-raw-mp3/chunklist_w905519204.m3u8 +0 -13
- package/test/test/assets/hls-raw-mp3/media_w905519204_0.mp3 +0 -0
- package/test/test/assets/hls-raw-mp3/media_w905519204_1.mp3 +0 -0
- package/test/test/assets/hls-raw-mp3/media_w905519204_2.mp3 +0 -0
- package/test/test/assets/hls-raw-mp3/media_w905519204_3.mp3 +0 -0
- package/test/test/assets/hls-raw-mp3/playlist.m3u8 +0 -4
- package/test/test/assets/hls-ts-aac/playlist.m3u8 +0 -23
- package/test/test/assets/hls-ts-aac/segment_0.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_1.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_2.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_3.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_4.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_5.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_6.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_7.ts +0 -0
- package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0000.ts +0 -0
- package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0001.ts +0 -0
- package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0002.ts +0 -0
- package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0003.ts +0 -0
- package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0004.ts +0 -0
- package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0005.ts +0 -0
- package/test/test/assets/hls-ts-ac3/prog_index.m3u8 +0 -19
- package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0000.ts +0 -0
- package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0001.ts +0 -0
- package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0002.ts +0 -0
- package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0003.ts +0 -0
- package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0004.ts +0 -0
- package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0005.ts +0 -0
- package/test/test/assets/hls-ts-ec3/prog_index.m3u8 +0 -19
- package/test/test/assets/hls-ts-h264/fileSequence0.ts +0 -0
- package/test/test/assets/hls-ts-h264/fileSequence1.ts +0 -0
- package/test/test/assets/hls-ts-h264/fileSequence2.ts +0 -0
- package/test/test/assets/hls-ts-h264/fileSequence3.ts +0 -0
- package/test/test/assets/hls-ts-h264/fileSequence4.ts +0 -0
- package/test/test/assets/hls-ts-h264/fileSequence5.ts +0 -0
- package/test/test/assets/hls-ts-h264/prog_index.m3u8 +0 -25
- package/test/test/assets/hls-ts-h265/0.ts +0 -0
- package/test/test/assets/hls-ts-h265/hevc.m3u8 +0 -6
- package/test/test/assets/hls-ts-h265/index.m3u8 +0 -7
- package/test/test/assets/hls-ts-mp3/manifest.m3u8 +0 -13
- package/test/test/assets/hls-ts-mp3/media_w239891843_0.ts +0 -0
- package/test/test/assets/hls-ts-mp3/media_w239891843_1.ts +0 -0
- package/test/test/assets/hls-ts-mp3/media_w239891843_2.ts +0 -0
- package/test/test/assets/hls-ts-mp3/media_w239891843_3.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/chunk.m3u8 +0 -17
- package/test/test/assets/hls-ts-muxed-aac-h264/n_0_0_0.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/n_1_0_0.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/n_2_0_0.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/n_3_0_0.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/n_4_0_0.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/n_5_0_0.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/playlist.m3u8 +0 -4
- package/test/test/assets/hls-ts-muxed-aac-h265/0.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h265/1.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h265/media.m3u8 +0 -9
- package/test/test/assets/hls-ts-muxed-ac3-h264/media.m3u8 +0 -24
- package/test/test/assets/hls-ts-muxed-ac3-h264/s_00000.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ac3-h264/s_00001.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ac3-h264/s_00002.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ac3-h264/s_00003.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ac3-h264/s_00004.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ac3-h264/s_00005.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0000.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0001.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0002.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0003.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ec3-h264/prog_index.m3u8 +0 -14
- package/test/test/assets/hls-ts-muxed-mp3-h264/index.m3u8 +0 -23
- package/test/test/assets/hls-ts-muxed-mp3-h264/seg-1-v1-a1.ts +0 -0
- package/test/test/assets/hls-ts-muxed-mp3-h264/seg-2-v1-a1.ts +0 -0
- package/test/test/assets/hls-ts-muxed-mp3-h264/seg-3-v1-a1.ts +0 -0
- package/test/test/assets/hls-ts-muxed-mp3-h264/seg-4-v1-a1.ts +0 -0
- package/test/test/assets/hls-ts-muxed-mp3-h264/seg-5-v1-a1.ts +0 -0
- package/test/test/assets/hls-ts-muxed-mp3-h264/seg-6-v1-a1.ts +0 -0
- package/test/test/assets/hls-ts-muxed-mp3-h264/seg-7-v1-a1.ts +0 -0
- package/test/test/assets/hls-ts-muxed-mp3-h264/seg-8-v1-a1.ts +0 -0
- package/test/test/assets/id3-metadata.aac +0 -0
- package/test/test/assets/id3-metadata.ts +0 -0
- package/test/test/assets/index-segment.mp4 +0 -0
- package/test/test/assets/index-segment.webm +0 -0
- package/test/test/assets/init-segment.webm +0 -0
- package/test/test/assets/large_file.mpd +0 -4930
- package/test/test/assets/multidrm-audio-init.mp4 +0 -0
- package/test/test/assets/multidrm-audio-segment.mp4 +0 -0
- package/test/test/assets/multidrm-video-init.mp4 +0 -0
- package/test/test/assets/multidrm-video-segment.mp4 +0 -0
- package/test/test/assets/multiple-trun-init.mp4 +0 -0
- package/test/test/assets/multiple-trun-segment.mp4 +0 -0
- package/test/test/assets/sintel-audio-init.mp4 +0 -0
- package/test/test/assets/sintel-audio-segment.mp4 +0 -0
- package/test/test/assets/sintel-video-init.mp4 +0 -0
- package/test/test/assets/sintel-video-segment.mp4 +0 -0
- package/test/test/assets/small.mp4 +0 -0
- package/test/test/assets/text-clip-alt.vtt +0 -63
- package/test/test/assets/text-clip.vtt +0 -63
- package/test/test/assets/thumbnails-sprites.vtt +0 -10
- package/test/test/assets/thumbnails.vtt +0 -10
- package/test/test/assets/ttml-init.mp4 +0 -0
- package/test/test/assets/ttml-segment-multiplemdat.mp4 +0 -0
- package/test/test/assets/ttml-segment.mp4 +0 -0
- package/test/test/assets/video.ts +0 -0
- package/test/test/assets/vtt-init.mp4 +0 -0
- package/test/test/assets/vtt-segment-multi-payload.mp4 +0 -0
- package/test/test/assets/vtt-segment-no-duration.mp4 +0 -0
- package/test/test/assets/vtt-segment-settings.mp4 +0 -0
- package/test/test/assets/vtt-segment.mp4 +0 -0
- package/test/test/boot.js +0 -495
- package/test/test/externs/filters.js +0 -44
- package/test/test/externs/fontfaceonload.js +0 -29
- package/test/test/externs/jasmine.js +0 -670
- package/test/test/externs/karma.js +0 -26
- package/test/test/externs/require.js +0 -21
- package/test/test/externs/sprintf.js +0 -18
- package/test/test/namespace.js +0 -10
- package/test/test/util/canned_idb.js +0 -379
- package/test/test/util/cea_utils.js +0 -60
- package/test/test/util/dash_parser_util.js +0 -329
- package/test/test/util/fake_ad.js +0 -321
- package/test/test/util/fake_ad_manager.js +0 -122
- package/test/test/util/fake_demo_main.js +0 -144
- package/test/test/util/fake_drm_engine.js +0 -103
- package/test/test/util/fake_media_source_engine.js +0 -464
- package/test/test/util/fake_networking_engine.js +0 -381
- package/test/test/util/fake_segment_prefetch.js +0 -84
- package/test/test/util/fake_text_displayer.js +0 -60
- package/test/test/util/id3_generator.js +0 -100
- package/test/test/util/indexeddb_utils.js +0 -124
- package/test/test/util/jasmine_fetch.js +0 -382
- package/test/test/util/layout_tests.js +0 -435
- package/test/test/util/loader.js +0 -88
- package/test/test/util/manifest_generator.js +0 -705
- package/test/test/util/manifest_parser_util.js +0 -101
- package/test/test/util/mss_parser_util.js +0 -119
- package/test/test/util/offline_utils.js +0 -105
- package/test/test/util/simple_fakes.js +0 -535
- package/test/test/util/stream_generator.js +0 -676
- package/test/test/util/streaming_engine_util.js +0 -506
- package/test/test/util/test_scheme.js +0 -778
- package/test/test/util/ttml_utils.js +0 -77
- package/test/test/util/ui_utils.js +0 -183
- package/test/test/util/util.js +0 -374
- package/test/test/util/waiter.js +0 -406
- package/test/text/cue_integration.js +0 -51
- package/test/text/lrc_text_parser_unit.js +0 -98
- package/test/text/mp4_ttml_parser_unit.js +0 -171
- package/test/text/mp4_vtt_parser_unit.js +0 -195
- package/test/text/sbv_text_parser_unit.js +0 -81
- package/test/text/simple_text_displayer_unit.js +0 -468
- package/test/text/srt_text_parser_unit.js +0 -163
- package/test/text/ssa_text_parser_unit.js +0 -382
- package/test/text/text_displayer_layout_unit.js +0 -323
- package/test/text/text_engine_unit.js +0 -500
- package/test/text/text_track_integration.js +0 -186
- package/test/text/ttml_text_parser_unit.js +0 -2176
- package/test/text/ui_text_displayer_unit.js +0 -608
- package/test/text/vtt_text_parser_unit.js +0 -1363
- package/test/text/web_vtt_generator_unit.js +0 -144
- package/test/text/web_vtt_layout_integration.js +0 -524
- package/test/transmuxer/transmuxer_engine_integration.js +0 -69
- package/test/transmuxer/transmuxer_integration.js +0 -443
- package/test/ui/ad_ui_unit.js +0 -369
- package/test/ui/localization_unit.js +0 -508
- package/test/ui/ui_customization_unit.js +0 -208
- package/test/ui/ui_integration.js +0 -669
- package/test/ui/ui_unit.js +0 -902
- package/test/util/abortable_operation_unit.js +0 -624
- package/test/util/array_utils_unit.js +0 -58
- package/test/util/buffer_utils_unit.js +0 -185
- package/test/util/cmcd_manager_unit.js +0 -440
- package/test/util/content_steering_manager_unit.js +0 -427
- package/test/util/data_view_reader_unit.js +0 -254
- package/test/util/ebml_parser_unit.js +0 -297
- package/test/util/event_manager_unit.js +0 -185
- package/test/util/fake_event_target_unit.js +0 -123
- package/test/util/id3_utils_unit.js +0 -168
- package/test/util/iterables_unit.js +0 -68
- package/test/util/language_utils_unit.js +0 -240
- package/test/util/manifest_parser_utils_unit.js +0 -55
- package/test/util/mime_utils_unit.js +0 -64
- package/test/util/mp4_box_parsers_unit.js +0 -246
- package/test/util/mp4_parser_unit.js +0 -373
- package/test/util/multi_map_unit.js +0 -94
- package/test/util/object_utils_unit.js +0 -79
- package/test/util/periods_unit.js +0 -1623
- package/test/util/pssh_unit.js +0 -226
- package/test/util/state_history_unit.js +0 -101
- package/test/util/stream_utils_unit.js +0 -1068
- package/test/util/string_utils_unit.js +0 -166
- package/test/util/text_parser_unit.js +0 -165
- package/test/util/ts_parser_unit.js +0 -77
- package/test/util/xml_utils_unit.js +0 -444
|
@@ -1,248 +0,0 @@
|
|
|
1
|
-
# License Server Authentication
|
|
2
|
-
|
|
3
|
-
Your application's license server may require some form of authentication so
|
|
4
|
-
that it only delivers licenses to paying users. In this tutorial, we're going
|
|
5
|
-
to use various license server endpoints that require various forms of
|
|
6
|
-
authentication.
|
|
7
|
-
|
|
8
|
-
*Please note that the license server we are using in this tutorial is a
|
|
9
|
-
Widevine license server, so you will need to use Chrome to follow along.
|
|
10
|
-
Because EME requires a secure URL, you will also need to use localhost or
|
|
11
|
-
https for this tutorial. See the note at the top of {@tutorial drm-config}
|
|
12
|
-
for more information.*
|
|
13
|
-
|
|
14
|
-
To start, we're going to use the code from {@tutorial basic-usage}, but use this
|
|
15
|
-
manifest and license server:
|
|
16
|
-
|
|
17
|
-
```js
|
|
18
|
-
const manifestUri =
|
|
19
|
-
'https://storage.googleapis.com/shaka-demo-assets/sintel-widevine/dash.mpd';
|
|
20
|
-
const licenseServer = 'https://cwip-shaka-proxy.appspot.com/no_auth';
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
We'll also need to configure the player to use this license server before it
|
|
24
|
-
loads the manifest:
|
|
25
|
-
|
|
26
|
-
```js
|
|
27
|
-
player.configure({
|
|
28
|
-
drm: {
|
|
29
|
-
servers: { 'com.widevine.alpha': licenseServer }
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
// Try to load a manifest.
|
|
34
|
-
try {
|
|
35
|
-
await player.load(manifestUri);
|
|
36
|
-
// The video should now be playing!
|
|
37
|
-
} catch (e) {
|
|
38
|
-
onError(e);
|
|
39
|
-
}
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
Since the endpoint is `/no_auth`, this should play without authentication.
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
#### Header authentication
|
|
46
|
-
|
|
47
|
-
First, we'll try authentication using headers. Change the license server to:
|
|
48
|
-
|
|
49
|
-
```js
|
|
50
|
-
const licenseServer = 'https://cwip-shaka-proxy.appspot.com/header_auth';
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
This endpoint requires a specific header value to deliver a license. If you
|
|
54
|
-
try to use it without setting the authentication header, you will see `Error
|
|
55
|
-
code 6007`, which means `LICENSE_REQUEST_FAILED`. The JavaScript console will
|
|
56
|
-
show you a failed HTTP request with HTTP status code `401 (Unauthorized)`, and
|
|
57
|
-
playback will hang when you get to the encrypted part of the stream (10 seconds
|
|
58
|
-
in).
|
|
59
|
-
|
|
60
|
-
To authenticate to this endpoint, we must send a special header. You can add
|
|
61
|
-
arbitrary headers to Shaka's requests through a request filter callback.
|
|
62
|
-
Register the filter before calling `player.load()`:
|
|
63
|
-
|
|
64
|
-
```js
|
|
65
|
-
player.getNetworkingEngine().registerRequestFilter(function(type, request, context) {
|
|
66
|
-
// Only add headers to license requests:
|
|
67
|
-
if (type == shaka.net.NetworkingEngine.RequestType.LICENSE) {
|
|
68
|
-
// This is the specific header name and value the server wants:
|
|
69
|
-
request.headers['CWIP-Auth-Header'] = 'VGhpc0lzQVRlc3QK';
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
Load the page again, and the license request will succeed. Although we are
|
|
75
|
-
using a fixed value for the purposes of this tutorial, your application can
|
|
76
|
-
derive appropriate authentication header(s) before or during the callback.
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
#### Parameter Authentication
|
|
80
|
-
|
|
81
|
-
Next, we'll try authentication using URL parameters. Change the license server
|
|
82
|
-
to:
|
|
83
|
-
|
|
84
|
-
```js
|
|
85
|
-
const licenseServer = 'https://cwip-shaka-proxy.appspot.com/param_auth';
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
This endpoint requires a specific URL parameter to deliver a license. If you
|
|
89
|
-
try to use it without setting the parameter, you will see `Error code 6007`
|
|
90
|
-
(`LICENSE_REQUEST_FAILED`) just as before with header authentication.
|
|
91
|
-
|
|
92
|
-
We can use a request filter to modify the URL and add the required parameter:
|
|
93
|
-
|
|
94
|
-
```js
|
|
95
|
-
player.getNetworkingEngine().registerRequestFilter(function(type, request, context) {
|
|
96
|
-
// Only add headers to license requests:
|
|
97
|
-
if (type == shaka.net.NetworkingEngine.RequestType.LICENSE) {
|
|
98
|
-
// This is the specific parameter name and value the server wants:
|
|
99
|
-
// Note that all network requests can have multiple URIs (for fallback),
|
|
100
|
-
// and therefore this is an array. But there should only be one license
|
|
101
|
-
// server URI in this tutorial.
|
|
102
|
-
request.uris[0] += '?CWIP-Auth-Param=VGhpc0lzQVRlc3QK';
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
Load the page again, and the license request will succeed.
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
#### Cookie Authentication
|
|
111
|
-
|
|
112
|
-
Finally, let's try using cookies for authentication. Change the license server
|
|
113
|
-
to:
|
|
114
|
-
|
|
115
|
-
```js
|
|
116
|
-
const licenseServer = 'https://cwip-shaka-proxy.appspot.com/cookie_auth';
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
This endpoint requires a specific cookie to deliver a license. If you try to
|
|
120
|
-
use it without setting the parameter, you will see `Error code 6007`
|
|
121
|
-
(`LICENSE_REQUEST_FAILED`) just as with the other endpoints.
|
|
122
|
-
|
|
123
|
-
Cookies are set by a server to be returned to that server, and are not sent by
|
|
124
|
-
the JavaScript application. So to set the required cookie value, point your
|
|
125
|
-
browser to the server's [set\_cookie][] page.
|
|
126
|
-
|
|
127
|
-
Open the JavaScript console and check the value of `document.cookie` to confirm
|
|
128
|
-
that you have the cookie. You should see `"CWIP-Auth-Cookie=VGhpc0lzQVRlc3QK"`.
|
|
129
|
-
|
|
130
|
-
Now load the Shaka page again, and ... we still get error code 6007. What
|
|
131
|
-
happened?
|
|
132
|
-
|
|
133
|
-
Cookies are considered "credentials" by the browser's XmlHttpRequest API, and
|
|
134
|
-
credentials may not be sent cross-origin unless:
|
|
135
|
-
|
|
136
|
-
1. [explicitly requested by the application](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials) AND
|
|
137
|
-
2. [explicitly allowed by the destination server](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Access-Control-Allow-Credentials)
|
|
138
|
-
|
|
139
|
-
Our `cookie_auth` endpoint sends back headers that allow credentialed requests,
|
|
140
|
-
so we set a flag in our request filter to send credentials cross-site:
|
|
141
|
-
|
|
142
|
-
```js
|
|
143
|
-
player.getNetworkingEngine().registerRequestFilter(function(type, request, context) {
|
|
144
|
-
if (type == shaka.net.NetworkingEngine.RequestType.LICENSE) {
|
|
145
|
-
request.allowCrossSiteCredentials = true;
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
Load the page again, and the license request will succeed.
|
|
151
|
-
|
|
152
|
-
[set\_cookie]: http://cwip-shaka-proxy.appspot.com/set_cookie
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
#### Always Sending Credentials
|
|
156
|
-
|
|
157
|
-
Now, you may be asking yourself: "Why not just make `true` the default and
|
|
158
|
-
always send credentials when we have them?"
|
|
159
|
-
|
|
160
|
-
If a server does not explicitly allow credentials to be sent cross-origin,
|
|
161
|
-
setting this flag would cause the request to fail *even if the client has no
|
|
162
|
-
cookies to send*. If you'd like to try this out, clear your cookies by
|
|
163
|
-
pointing your browser to the server's [delete\_cookie][] page. Then set your
|
|
164
|
-
license server back to:
|
|
165
|
-
|
|
166
|
-
```js
|
|
167
|
-
const licenseServer = 'https://cwip-shaka-proxy.appspot.com/no_auth';
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
Since `allowCrossSiteCredentials` is `true` and that endpoint doesn't
|
|
171
|
-
explicitly allow credentials, you'll get a failure. The JavaScript console
|
|
172
|
-
will show a message from the browser that says something like:
|
|
173
|
-
|
|
174
|
-
```html
|
|
175
|
-
Credentials flag is 'true', but the 'Access-Control-Allow-Credentials' header
|
|
176
|
-
is ''. It must be 'true' to allow credentials. Origin 'http://localhost' is
|
|
177
|
-
therefore not allowed access.
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
[delete\_cookie]: http://cwip-shaka-proxy.appspot.com/delete_cookie
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
#### Asynchronous Credentials
|
|
184
|
-
|
|
185
|
-
In some scenarios, you may not know the credentials right away. You would like
|
|
186
|
-
to make an additional request to get those credentials before you attach them to
|
|
187
|
-
the request Shaka Player wants to make.
|
|
188
|
-
|
|
189
|
-
Since v2.1.0, we support asynchronous filters. This allows you to pause a
|
|
190
|
-
license request, make an additional request for an authorization token, then use
|
|
191
|
-
that token to complete the license request.
|
|
192
|
-
|
|
193
|
-
Any filter that returns a Promise is an asynchronous filter. NetworkingEngine
|
|
194
|
-
uses Promises for requests, so it is easy to make an additional request as part
|
|
195
|
-
of an asynchronous filter.
|
|
196
|
-
|
|
197
|
-
To start, change the license server and add two additional variables:
|
|
198
|
-
|
|
199
|
-
```js
|
|
200
|
-
const licenseServer = 'https://cwip-shaka-proxy.appspot.com/header_auth';
|
|
201
|
-
const authTokenServer = 'https://cwip-shaka-proxy.appspot.com/get_auth_token';
|
|
202
|
-
const authToken = null;
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
Now change the request filter:
|
|
206
|
-
|
|
207
|
-
```js
|
|
208
|
-
player.getNetworkingEngine().registerRequestFilter(function(type, request, context) {
|
|
209
|
-
// Only add headers to license requests:
|
|
210
|
-
if (type != shaka.net.NetworkingEngine.RequestType.LICENSE) return;
|
|
211
|
-
|
|
212
|
-
// If we already know the token, attach it right away:
|
|
213
|
-
if (authToken) {
|
|
214
|
-
console.log('Have auth token, attaching to license request.');
|
|
215
|
-
request.headers['CWIP-Auth-Header'] = authToken;
|
|
216
|
-
return;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
console.log('Need auth token.');
|
|
220
|
-
// Start an asynchronous request, and return a Promise chain based on that.
|
|
221
|
-
const authRequest = {
|
|
222
|
-
uris: [authTokenServer],
|
|
223
|
-
method: 'POST',
|
|
224
|
-
};
|
|
225
|
-
const requestType = shaka.net.NetworkingEngine.RequestType.APP;
|
|
226
|
-
return player.getNetworkingEngine().request(requestType, authRequest)
|
|
227
|
-
.promise.then(function(response) {
|
|
228
|
-
// This endpoint responds with the value we should use in the header.
|
|
229
|
-
authToken = shaka.util.StringUtils.fromUTF8(response.data);
|
|
230
|
-
console.log('Received auth token', authToken);
|
|
231
|
-
request.headers['CWIP-Auth-Header'] = authToken;
|
|
232
|
-
console.log('License request can now continue.');
|
|
233
|
-
});
|
|
234
|
-
});
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
Load the page again. The license request will be delayed, an additional request
|
|
238
|
-
will be made for the auth token, and then the license request will continue.
|
|
239
|
-
You should see these messages in the JavaScript console:
|
|
240
|
-
|
|
241
|
-
```html
|
|
242
|
-
Need auth token.
|
|
243
|
-
Received auth token VGhpc0lzQVRlc3QK
|
|
244
|
-
License request can now continue.
|
|
245
|
-
```
|
|
246
|
-
|
|
247
|
-
If you need them, you can also create asynchronous response filters in the same
|
|
248
|
-
way.
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
# License Wrapping
|
|
2
|
-
|
|
3
|
-
Applications sometimes need to communicate extra information to or from its
|
|
4
|
-
license server. EME, the API that browsers provide for DRM, does not offer a
|
|
5
|
-
direct way to include extra information in a license request or extract extra
|
|
6
|
-
information from a license response. To pass extra information, applications
|
|
7
|
-
must "wrap" requests and "unwrap" responses as they pass through JavaScript.
|
|
8
|
-
|
|
9
|
-
*Please note that the license server we are using in this tutorial is a
|
|
10
|
-
Widevine license server, so you will need to use Chrome to follow along.
|
|
11
|
-
Because EME requires a secure URL, you will also need to use localhost or
|
|
12
|
-
https for this tutorial. See the note at the top of {@tutorial drm-config}
|
|
13
|
-
for more information.*
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
#### Wrapping License Requests
|
|
17
|
-
|
|
18
|
-
If your application needs to communicate complex information to the license
|
|
19
|
-
server along with the request, the solution is to "wrap" the platform's license
|
|
20
|
-
request and "unwrap" it at the license server. In Shaka Player, this is
|
|
21
|
-
accomplished with a network request filter.
|
|
22
|
-
|
|
23
|
-
In practice, you may wrap the request in any format that can be constructed on
|
|
24
|
-
the client and parsed on the server. For simplicity, the server used in this
|
|
25
|
-
tutorial expects a JSON format that looks like this:
|
|
26
|
-
|
|
27
|
-
```json
|
|
28
|
-
{
|
|
29
|
-
"rawLicenseRequestBase64":
|
|
30
|
-
"VGhlIHJhdyBsaWNlbnNlIHJlcXVlc3QgZ2VuZXJhdGVkIGJ5IHRoZSBDRE0=",
|
|
31
|
-
...
|
|
32
|
-
}
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
To start, we're going to use the code from {@tutorial basic-usage}, but use this
|
|
36
|
-
manifest and license server:
|
|
37
|
-
|
|
38
|
-
```js
|
|
39
|
-
const manifestUri =
|
|
40
|
-
'https://storage.googleapis.com/shaka-demo-assets/sintel-widevine/dash.mpd';
|
|
41
|
-
const licenseServer = 'https://cwip-shaka-proxy.appspot.com/wrapped_request';
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
We'll also need to configure the player to use this license server before it
|
|
45
|
-
loads the manifest:
|
|
46
|
-
|
|
47
|
-
```js
|
|
48
|
-
player.configure({
|
|
49
|
-
drm: {
|
|
50
|
-
servers: { 'com.widevine.alpha': licenseServer }
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
// Try to load a manifest.
|
|
55
|
-
try {
|
|
56
|
-
await player.load(manifestUri);
|
|
57
|
-
// The video should now be playing!
|
|
58
|
-
} catch(e) {
|
|
59
|
-
onError(e);
|
|
60
|
-
}
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
This license server is expecting a wrapped request, so if we try to play now, we
|
|
64
|
-
will see `Error code 6007`, which means `LICENSE_REQUEST_FAILED`. To wrap the
|
|
65
|
-
license request, we must register a request filter:
|
|
66
|
-
|
|
67
|
-
```js
|
|
68
|
-
player.getNetworkingEngine().registerRequestFilter(function(type, request, context) {
|
|
69
|
-
// Alias some utilities provided by the library.
|
|
70
|
-
const StringUtils = shaka.util.StringUtils;
|
|
71
|
-
const Uint8ArrayUtils = shaka.util.Uint8ArrayUtils;
|
|
72
|
-
|
|
73
|
-
// Only manipulate license requests:
|
|
74
|
-
if (type == shaka.net.NetworkingEngine.RequestType.LICENSE) {
|
|
75
|
-
// Create the wrapped request structure.
|
|
76
|
-
const wrapped = {};
|
|
77
|
-
|
|
78
|
-
// Encode the raw license request in base64.
|
|
79
|
-
// The server we are using in this tutorial expects this field and this
|
|
80
|
-
// encoding for the raw request.
|
|
81
|
-
wrapped.rawLicenseRequestBase64 =
|
|
82
|
-
Uint8ArrayUtils.toBase64(new Uint8Array(request.body));
|
|
83
|
-
|
|
84
|
-
// Add whatever else we want to communicate to the server.
|
|
85
|
-
// None of these values are read by the server we are using in this
|
|
86
|
-
// tutorial.
|
|
87
|
-
// In practice, you would send what the server needs and the server would
|
|
88
|
-
// react to it.
|
|
89
|
-
wrapped.favoriteColor = 'blue';
|
|
90
|
-
wrapped.Beatles = ['John', 'Paul', 'George', 'Ringo'];
|
|
91
|
-
wrapped.bestBeatleIndex = 1; // Paul, of course.
|
|
92
|
-
wrapped.pEqualsNP = false; // maybe?
|
|
93
|
-
|
|
94
|
-
// Encode the wrapped request as JSON.
|
|
95
|
-
const wrappedJson = JSON.stringify(wrapped);
|
|
96
|
-
// Convert the JSON string back into an ArrayBuffer to replace the request
|
|
97
|
-
// body.
|
|
98
|
-
request.body = StringUtils.toUTF8(wrappedJson);
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
Load the page again, and the license request will succeed.
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
#### Wrapping License Responses
|
|
107
|
-
|
|
108
|
-
If your license server needs to communicate complex information back to the
|
|
109
|
-
application, the solution is very similar to what we just did above. We can
|
|
110
|
-
"wrap" the license itself in the server and "unwrap" it in the client. In Shaka
|
|
111
|
-
Player, this is accomplished with a network response filter.
|
|
112
|
-
|
|
113
|
-
Similar to the guideline for license requests, you may wrap the response in any
|
|
114
|
-
format that can be constructed on the server and parsed by the client. We will
|
|
115
|
-
again use JSON for simplicity. The server will send a response with a format
|
|
116
|
-
that looks like this:
|
|
117
|
-
|
|
118
|
-
```json
|
|
119
|
-
{
|
|
120
|
-
"rawLicenseBase64":
|
|
121
|
-
"VGhlIHJhdyBsaWNlbnNlIGZyb20gdGhlIGxpY2Vuc2Ugc2VydmVyIGJhY2tlbmQ=",
|
|
122
|
-
...
|
|
123
|
-
}
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
Change the license server to:
|
|
127
|
-
|
|
128
|
-
```js
|
|
129
|
-
const licenseServer =
|
|
130
|
-
'https://cwip-shaka-proxy.appspot.com/wrapped_request_and_response';
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
This license server is sending a wrapped response, so if we try to play now, we
|
|
134
|
-
will see `Error code 6008`, which means `LICENSE_RESPONSE_REJECTED`. The
|
|
135
|
-
Widevine CDM does not understand this wrapped format, so we must unwrap it first
|
|
136
|
-
using a request filter:
|
|
137
|
-
|
|
138
|
-
```js
|
|
139
|
-
player.getNetworkingEngine().registerResponseFilter(function(type, response, context) {
|
|
140
|
-
// Alias some utilities provided by the library.
|
|
141
|
-
const StringUtils = shaka.util.StringUtils;
|
|
142
|
-
const Uint8ArrayUtils = shaka.util.Uint8ArrayUtils;
|
|
143
|
-
|
|
144
|
-
// Only manipulate license responses:
|
|
145
|
-
if (type == shaka.net.NetworkingEngine.RequestType.LICENSE) {
|
|
146
|
-
// This is the wrapped license, which is a JSON string.
|
|
147
|
-
const wrappedString = StringUtils.fromUTF8(response.data);
|
|
148
|
-
// Parse the JSON string into an object.
|
|
149
|
-
const wrapped = JSON.parse(wrappedString);
|
|
150
|
-
|
|
151
|
-
// This is a base64-encoded version of the raw license.
|
|
152
|
-
const rawLicenseBase64 = wrapped.rawLicenseBase64;
|
|
153
|
-
// Decode that base64 string into a Uint8Array and replace the response
|
|
154
|
-
// data. The raw license will be fed to the Widevine CDM.
|
|
155
|
-
response.data = Uint8ArrayUtils.fromBase64(rawLicenseBase64);
|
|
156
|
-
|
|
157
|
-
// Read additional fields from the server.
|
|
158
|
-
// The server we are using in this tutorial does not send anything useful.
|
|
159
|
-
// In practice, you could send any license metadata the client might need.
|
|
160
|
-
// Here we log what the server sent to the JavaScript console for
|
|
161
|
-
// inspection.
|
|
162
|
-
console.log(wrapped);
|
|
163
|
-
}
|
|
164
|
-
});
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
Load the page again, and the license response will be accepted by the Widevine
|
|
168
|
-
CDM. Open the JavaScript console to see what the server sent back.
|