From cf2fde58a91abb9d8bdc7e99b8fbdbb08632b0d7 Mon Sep 17 00:00:00 2001 From: ganqiuye Date: Tue, 13 Apr 2021 17:11:19 +0800 Subject: [PATCH] support DRM source with sample-aes-ctr encryption to download Signed-off-by: ganqiuye --- src/hls.c | 7 ++++++- src/hls.h | 1 + src/main.c | 15 ++++++++++----- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/hls.c b/src/hls.c index a007b8f..2d4729b 100644 --- a/src/hls.c +++ b/src/hls.c @@ -105,7 +105,9 @@ long get_hls_data_from_url(char *url, char **out, size_t *size, int type, char * int is_playlist_FPS(char* source) { - return strstr(source, "KEYFORMAT=\"com.apple.streamingkeydelivery\""); + return strstr(source, "KEYFORMAT=\"com.apple.streamingkeydelivery\"") || + strstr(source, "urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed") || + strstr(source, "com.microsoft.playready"); } int get_playlist_type(char *source) @@ -247,6 +249,9 @@ static int parse_tag(hls_media_playlist_t *me, struct hls_media_segment *ms, cha if (!strncmp(tag, "#EXT-X-KEY:METHOD=AES-128", 25)) { enc_type = ENC_AES128; me->enc_aes.iv_is_static = false; + } else if (!strncmp(tag, "#EXT-X-KEY:METHOD=SAMPLE-AES-CTR", 32)) { + enc_type = ENC_AES_SAMPLE_CTR; + me->enc_aes.iv_is_static = is_playlist_FPS(me->source); } else if (!strncmp(tag, "#EXT-X-KEY:METHOD=SAMPLE-AES", 28)) { enc_type = ENC_AES_SAMPLE; me->enc_aes.iv_is_static = is_playlist_FPS(me->source); diff --git a/src/hls.h b/src/hls.h index ee1b863..e44f6c7 100644 --- a/src/hls.h +++ b/src/hls.h @@ -13,6 +13,7 @@ extern "C" { #define MASTER_PLAYLIST 0 #define MEDIA_PLAYLIST 1 +#define ENC_AES_SAMPLE_CTR 0x03 #define ENC_AES_SAMPLE 0x02 #define ENC_AES128 0x01 #define ENC_NONE 0x00 diff --git a/src/main.c b/src/main.c index 0fdd2fd..4b7eaef 100644 --- a/src/main.c +++ b/src/main.c @@ -21,6 +21,14 @@ #include "msg.h" #include "misc.h" +char* str_ecryption_type[] ={ + "NONE", + "AES-128", + "SAMPLE-AES", + "SAMPLE-AES-CTR", +}; + + static size_t priv_write(const uint8_t *data, size_t len, void *opaque) { return fwrite(data, 1, len, opaque); } @@ -370,11 +378,8 @@ int main(int argc, char *argv[]) return 1; } - if (media_playlist.encryption) { - MSG_PRINT("HLS Stream is %s encrypted.\n", - media_playlist.encryptiontype == ENC_AES128 ? "AES-128" : - "SAMPLE-AES"); - } + MSG_PRINT("HLS Stream is %s encrypted.\n", + str_ecryption_type[media_playlist.encryptiontype]); MSG_VERBOSE("Media Playlist parsed successfully.\n");