@@ -2918,6 +2918,159 @@ describe('HlsParser', () => {
2918
2918
expect ( newDrmInfoSpy ) . toHaveBeenCalled ( ) ;
2919
2919
} ) ;
2920
2920
2921
+ describe ( 'constructs DrmInfo with EXT-X-SESSION-KEY' , ( ) => {
2922
+ it ( 'for Widevine' , async ( ) => {
2923
+ const initDataBase64 =
2924
+ 'dGhpcyBpbml0IGRhdGEgY29udGFpbnMgaGlkZGVuIHNlY3JldHMhISE=' ;
2925
+
2926
+ const keyId = 'abc123' ;
2927
+
2928
+ const master = [
2929
+ '#EXTM3U\n' ,
2930
+ '#EXT-X-STREAM-INF:BANDWIDTH=200,CODECS="avc1",' ,
2931
+ 'RESOLUTION=960x540,FRAME-RATE=60\n' ,
2932
+ 'video\n' ,
2933
+ '#EXT-X-SESSION-KEY:METHOD=SAMPLE-AES-CTR,' ,
2934
+ 'KEYID=0X' + keyId + ',' ,
2935
+ 'KEYFORMAT="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed",' ,
2936
+ 'URI="data:text/plain;base64,' ,
2937
+ initDataBase64 , '",\n' ,
2938
+ ] . join ( '' ) ;
2939
+
2940
+ const manifest = shaka . test . ManifestGenerator . generate ( ( manifest ) => {
2941
+ manifest . anyTimeline ( ) ;
2942
+ manifest . addPartialVariant ( ( variant ) => {
2943
+ variant . addPartialStream ( ContentType . VIDEO , ( stream ) => {
2944
+ stream . addDrmInfo ( 'com.widevine.alpha' , ( drmInfo ) => {
2945
+ drmInfo . addCencInitData ( initDataBase64 ) ;
2946
+ drmInfo . keyIds . add ( keyId ) ;
2947
+ } ) ;
2948
+ } ) ;
2949
+ } ) ;
2950
+ manifest . sequenceMode = true ;
2951
+ } ) ;
2952
+
2953
+ fakeNetEngine . setResponseText ( 'test:/master' , master ) ;
2954
+
2955
+ const actual = await parser . start ( 'test:/master' , playerInterface ) ;
2956
+ expect ( actual ) . toEqual ( manifest ) ;
2957
+ } ) ;
2958
+
2959
+ it ( 'for PlayReady' , async ( ) => {
2960
+ const initDataBase64 =
2961
+ 'AAAAKXBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAAAlQbGF5cmVhZHk=' ;
2962
+
2963
+ const master = [
2964
+ '#EXTM3U\n' ,
2965
+ '#EXT-X-STREAM-INF:BANDWIDTH=200,CODECS="avc1",' ,
2966
+ 'RESOLUTION=960x540,FRAME-RATE=60\n' ,
2967
+ 'video\n' ,
2968
+ '#EXT-X-SESSION-KEY:METHOD=SAMPLE-AES-CTR,' ,
2969
+ 'KEYFORMAT="com.microsoft.playready",' ,
2970
+ 'URI="data:text/plain;base64,UGxheXJlYWR5",\n' ,
2971
+ ] . join ( '' ) ;
2972
+
2973
+ const manifest = shaka . test . ManifestGenerator . generate ( ( manifest ) => {
2974
+ manifest . anyTimeline ( ) ;
2975
+ manifest . addPartialVariant ( ( variant ) => {
2976
+ variant . addPartialStream ( ContentType . VIDEO , ( stream ) => {
2977
+ stream . addDrmInfo ( 'com.microsoft.playready' , ( drmInfo ) => {
2978
+ drmInfo . addCencInitData ( initDataBase64 ) ;
2979
+ } ) ;
2980
+ } ) ;
2981
+ } ) ;
2982
+ manifest . sequenceMode = true ;
2983
+ } ) ;
2984
+
2985
+ fakeNetEngine . setResponseText ( 'test:/master' , master ) ;
2986
+
2987
+ const actual = await parser . start ( 'test:/master' , playerInterface ) ;
2988
+ expect ( actual ) . toEqual ( manifest ) ;
2989
+ } ) ;
2990
+
2991
+ it ( 'for FairPlay' , async ( ) => {
2992
+ const master = [
2993
+ '#EXTM3U\n' ,
2994
+ '#EXT-X-STREAM-INF:BANDWIDTH=200,CODECS="avc1",' ,
2995
+ 'RESOLUTION=960x540,FRAME-RATE=60\n' ,
2996
+ 'video\n' ,
2997
+ '#EXT-X-SESSION-KEY:METHOD=SAMPLE-AES-CTR,' ,
2998
+ 'KEYFORMAT="com.apple.streamingkeydelivery",' ,
2999
+ 'URI="skd://f93d4e700d7ddde90529a27735d9e7cb",\n' ,
3000
+ ] . join ( '' ) ;
3001
+
3002
+ const manifest = shaka . test . ManifestGenerator . generate ( ( manifest ) => {
3003
+ manifest . anyTimeline ( ) ;
3004
+ manifest . addPartialVariant ( ( variant ) => {
3005
+ variant . addPartialStream ( ContentType . VIDEO , ( stream ) => {
3006
+ stream . addDrmInfo ( 'com.apple.fps' , ( drmInfo ) => {
3007
+ drmInfo . addInitData ( 'sinf' , new Uint8Array ( 0 ) ) ;
3008
+ } ) ;
3009
+ } ) ;
3010
+ } ) ;
3011
+ manifest . sequenceMode = true ;
3012
+ } ) ;
3013
+
3014
+ fakeNetEngine . setResponseText ( 'test:/master' , master ) ;
3015
+
3016
+ const actual = await parser . start ( 'test:/master' , playerInterface ) ;
3017
+ expect ( actual ) . toEqual ( manifest ) ;
3018
+ } ) ;
3019
+
3020
+ it ( 'for ClearKey with explicit KEYFORMAT' , async ( ) => {
3021
+ const master = [
3022
+ '#EXTM3U\n' ,
3023
+ '#EXT-X-STREAM-INF:BANDWIDTH=200,CODECS="avc1",' ,
3024
+ 'RESOLUTION=960x540,FRAME-RATE=60\n' ,
3025
+ 'video\n' ,
3026
+ '#EXT-X-SESSION-KEY:METHOD=SAMPLE-AES-CTR,' ,
3027
+ 'KEYFORMAT="identity",' ,
3028
+ 'URI="key.bin",\n' ,
3029
+ ] . join ( '' ) ;
3030
+
3031
+ const manifest = shaka . test . ManifestGenerator . generate ( ( manifest ) => {
3032
+ manifest . anyTimeline ( ) ;
3033
+ manifest . addPartialVariant ( ( variant ) => {
3034
+ variant . addPartialStream ( ContentType . VIDEO , ( stream ) => {
3035
+ stream . addDrmInfo ( 'org.w3.clearkey' ) ;
3036
+ } ) ;
3037
+ } ) ;
3038
+ manifest . sequenceMode = true ;
3039
+ } ) ;
3040
+
3041
+ fakeNetEngine . setResponseText ( 'test:/master' , master ) ;
3042
+
3043
+ const actual = await parser . start ( 'test:/master' , playerInterface ) ;
3044
+ expect ( actual ) . toEqual ( manifest ) ;
3045
+ } ) ;
3046
+
3047
+ it ( 'for ClearKey without explicit KEYFORMAT' , async ( ) => {
3048
+ const master = [
3049
+ '#EXTM3U\n' ,
3050
+ '#EXT-X-STREAM-INF:BANDWIDTH=200,CODECS="avc1",' ,
3051
+ 'RESOLUTION=960x540,FRAME-RATE=60\n' ,
3052
+ 'video\n' ,
3053
+ '#EXT-X-SESSION-KEY:METHOD=SAMPLE-AES-CTR,' ,
3054
+ 'URI="key.bin",\n' ,
3055
+ ] . join ( '' ) ;
3056
+
3057
+ const manifest = shaka . test . ManifestGenerator . generate ( ( manifest ) => {
3058
+ manifest . anyTimeline ( ) ;
3059
+ manifest . addPartialVariant ( ( variant ) => {
3060
+ variant . addPartialStream ( ContentType . VIDEO , ( stream ) => {
3061
+ stream . addDrmInfo ( 'org.w3.clearkey' ) ;
3062
+ } ) ;
3063
+ } ) ;
3064
+ manifest . sequenceMode = true ;
3065
+ } ) ;
3066
+
3067
+ fakeNetEngine . setResponseText ( 'test:/master' , master ) ;
3068
+
3069
+ const actual = await parser . start ( 'test:/master' , playerInterface ) ;
3070
+ expect ( actual ) . toEqual ( manifest ) ;
3071
+ } ) ;
3072
+ } ) ;
3073
+
2921
3074
it ( 'falls back to mp4 if HEAD request fails' , async ( ) => {
2922
3075
const master = [
2923
3076
'#EXTM3U\n' ,
0 commit comments