warren-bank / HLS-Proxy

Node.js server to proxy HLS video streams
http://webcast-reloaded.surge.sh/proxy.html
GNU General Public License v2.0
238 stars 68 forks source link

HLS with mp4 media segment #32

Closed RedRedFlower closed 1 year ago

RedRedFlower commented 1 year ago

The program work fine on HLS with .ts media segment

But it not work on HLS using .mp4 media segment. How to handle this?

Thanks.

warren-bank commented 1 year ago

Off-hand, I'd say that it should work.. regardless of the convention used for the format of the URLs by the video host. Do you have an example that I can test?

warren-bank commented 1 year ago

I just made my own manifest w/ mp4 segments.. to request through the proxy.. and check the format of the video segment URLs in the resulting proxied manifest..

master.m3u8:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:20675867
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:36:42.373Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=9.743,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
master_12_20675867.mp4
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:36:48.379Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=15.749,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
master_12_20675868.mp4
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:36:54.385Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=21.755,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
master_12_20675869.mp4
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:00.391Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=27.761,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
master_12_20675870.mp4
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:06.397Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=33.767,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
master_12_20675871.mp4
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:12.403Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=39.773,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
master_12_20675872.mp4
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:18.409Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=45.779,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
master_12_20675873.mp4
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:24.415Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=51.785,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
master_12_20675874.mp4
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:30.421Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=57.791,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
master_12_20675875.mp4
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:36.427Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=63.797,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
master_12_20675876.mp4

URL (direct):

http://localhost/master.m3u8

URL (proxied):

http://localhost:8080/aHR0cDovL2xvY2FsaG9zdC9tYXN0ZXIubTN1OA==.m3u8

__proxied_master.m3u8__:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:20675867
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:36:42.373Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=9.743,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
http://localhost:8080/aHR0cDovL2xvY2FsaG9zdC9tYXN0ZXJfMTJfMjA2NzU4NjcubXA0.ts
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:36:48.379Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=15.749,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
http://localhost:8080/aHR0cDovL2xvY2FsaG9zdC9tYXN0ZXJfMTJfMjA2NzU4NjgubXA0.ts
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:36:54.385Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=21.755,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
http://localhost:8080/aHR0cDovL2xvY2FsaG9zdC9tYXN0ZXJfMTJfMjA2NzU4NjkubXA0.ts
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:00.391Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=27.761,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
http://localhost:8080/aHR0cDovL2xvY2FsaG9zdC9tYXN0ZXJfMTJfMjA2NzU4NzAubXA0.ts
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:06.397Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=33.767,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
http://localhost:8080/aHR0cDovL2xvY2FsaG9zdC9tYXN0ZXJfMTJfMjA2NzU4NzEubXA0.ts
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:12.403Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=39.773,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
http://localhost:8080/aHR0cDovL2xvY2FsaG9zdC9tYXN0ZXJfMTJfMjA2NzU4NzIubXA0.ts
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:18.409Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=45.779,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
http://localhost:8080/aHR0cDovL2xvY2FsaG9zdC9tYXN0ZXJfMTJfMjA2NzU4NzMubXA0.ts
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:24.415Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=51.785,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
http://localhost:8080/aHR0cDovL2xvY2FsaG9zdC9tYXN0ZXJfMTJfMjA2NzU4NzQubXA0.ts
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:30.421Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=57.791,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
http://localhost:8080/aHR0cDovL2xvY2FsaG9zdC9tYXN0ZXJfMTJfMjA2NzU4NzUubXA0.ts
#EXT-X-PROGRAM-DATE-TIME:2023-05-15T04:37:36.427Z
#EXT-X-CUE-OUT-CONT:CAID=0x4B7347644F515A344F545F615A6F5848346A4E5A344D41365631694650547948,ElapsedTime=63.797,Duration=180.013,SCTE35=/DBOAAAAAyiYAP/wBQb+7pp5RgA4AjZDVUVJAPEdS3/DAAD3NeEBIEtzR2RPUVo0T1RfYVpvWEg0ak5aNE1BNlYxaUZQVHlINAAAAAB0jQ+y
#EXTINF:6.006,
http://localhost:8080/aHR0cDovL2xvY2FsaG9zdC9tYXN0ZXJfMTJfMjA2NzU4NzYubXA0.ts

version of HLS-Proxy:

3.4.0

conclusions: looks good to me

RedRedFlower commented 1 year ago

Thanks for your fast response. I found out the problem is not related to .mp4, .ts also got the same problem.

The source is Cloudflare's stream. Sample HLS: https://customer-wi9sckcs7uxt7lh4.cloudflarestream.com/5d5bc37ffcf54c9b82e996823bffbb81/manifest/video.m3u8

URL proxied: http://localhost:8080/aHR0cHM6Ly9jdXN0b21lci13aTlzY2tjczd1eHQ3bGg0LmNsb3VkZmxhcmVzdHJlYW0uY29tLzVkNWJjMzdmZmNmNTRjOWI4MmU5OTY4MjNiZmZiYjgxL21hbmlmZXN0L3ZpZGVvLm0zdTg=.m3u8

Maybe the path contain ../../ ?

Thanks.

RedRedFlower commented 1 year ago

URL proxied: http://localhost:8080/aHR0cHM6Ly9jdXN0b21lci13aTlzY2tjczd1eHQ3bGg0LmNsb3VkZmxhcmVzdHJlYW0uY29tLzVkNWJjMzdmZmNmNTRjOWI4MmU5OTY4MjNiZmZiYjgxL21hbmlmZXN0L3ZpZGVvLm0zdTg=.m3u8

warren-bank commented 1 year ago

direct

master:

240p:

1st video segment:

proxied

master: http://localhost:8080/aHR0cHM6Ly9jdXN0b21lci13aTlzY2tjczd1eHQ3bGg0LmNsb3VkZmxhcmVzdHJlYW0uY29tLzVkNWJjMzdmZmNmNTRjOWI4MmU5OTY4MjNiZmZiYjgxL21hbmlmZXN0L3ZpZGVvLm0zdTg=.m3u8

240p: http://localhost:8080/aHR0cHM6Ly9jdXN0b21lci13aTlzY2tjczd1eHQ3bGg0LmNsb3VkZmxhcmVzdHJlYW0uY29tLzVkNWJjMzdmZmNmNTRjOWI4MmU5OTY4MjNiZmZiYjgxL21hbmlmZXN0L3N0cmVhbV90YTJkM2M1ZDU2YTlmODUzN2RhYTNiMmI3ZGRhYmQ1YjBfcjE1MjE4MzgwLm0zdTg=.m3u8

  console.log(
    atob('aHR0cHM6Ly9jdXN0b21lci13aTlzY2tjczd1eHQ3bGg0LmNsb3VkZmxhcmVzdHJlYW0uY29tLzVkNWJjMzdmZmNmNTRjOWI4MmU5OTY4MjNiZmZiYjgxL21hbmlmZXN0L3N0cmVhbV90YTJkM2M1ZDU2YTlmODUzN2RhYTNiMmI3ZGRhYmQ1YjBfcjE1MjE4MzgwLm0zdTg=')
  )
  // output: https://customer-wi9sckcs7uxt7lh4.cloudflarestream.com/5d5bc37ffcf54c9b82e996823bffbb81/manifest/stream_ta2d3c5d56a9f8537daa3b2b7ddabd5b0_r15218380.m3u8
  // OK

1st video segment: http://localhost:8080/aHR0cHM6Ly9jdXN0b21lci13aTlzY2tjczd1eHQ3bGg0LmNsb3VkZmxhcmVzdHJlYW0uY29tLzVkNWJjMzdmZmNmNTRjOWI4MmU5OTY4MjNiZmZiYjgxL21hbmlmZXN0Ly4uLy4uLzVkNWJjMzdmZmNmNTRjOWI4MmU5OTY4MjNiZmZiYjgxL3ZpZGVvLzI0MC9zZWdfMS50cz9wPWV5SjBlWEJsSWpvaWRISmhibk50ZFhnaUxDSjJhV1JsYjBsRUlqb2lOV1ExWW1Nek4yWm1ZMlkxTkdNNVlqZ3laVGs1TmpneU0ySm1abUppT0RFaUxDSnZkMjVsY2tsRUlqb3pOakV6TXpBeExDSmpjbVZoZEc5eVNVUWlPaUlpTENKelpXZHRaVzUwUkhWeVlYUnBiMjVUWldOeklqbzBMQ0oxYzJWV1QwUlBWRVpGSWpwMGNuVmxMQ0ptY205dFRXVjZlbUZ1YVc1bElqcG1ZV3h6WlN3aWRISmhZMnNpT2lKaE1tUXpZelZrTlRaaE9XWTROVE0zWkdGaE0ySXlZamRrWkdGaVpEVmlNQ0lzSW5KbGJtUnBkR2x2YmlJNklqRTFNakU0TXpnd0lpd2liWFY0YVc1bklqb2lNekEwTVRReU56RWlmUSZzPXdvTENpY0s0dzRmQ244S2dhQkxEdTA3Q3ZHekRyMHpDaW1QRG1NS3l3N0RDaVMzQ29jS0RaY0szd3FkLVc4S1d3NFlJUEE=.ts

  console.log(
    atob('aHR0cHM6Ly9jdXN0b21lci13aTlzY2tjczd1eHQ3bGg0LmNsb3VkZmxhcmVzdHJlYW0uY29tLzVkNWJjMzdmZmNmNTRjOWI4MmU5OTY4MjNiZmZiYjgxL21hbmlmZXN0Ly4uLy4uLzVkNWJjMzdmZmNmNTRjOWI4MmU5OTY4MjNiZmZiYjgxL3ZpZGVvLzI0MC9zZWdfMS50cz9wPWV5SjBlWEJsSWpvaWRISmhibk50ZFhnaUxDSjJhV1JsYjBsRUlqb2lOV1ExWW1Nek4yWm1ZMlkxTkdNNVlqZ3laVGs1TmpneU0ySm1abUppT0RFaUxDSnZkMjVsY2tsRUlqb3pOakV6TXpBeExDSmpjbVZoZEc5eVNVUWlPaUlpTENKelpXZHRaVzUwUkhWeVlYUnBiMjVUWldOeklqbzBMQ0oxYzJWV1QwUlBWRVpGSWpwMGNuVmxMQ0ptY205dFRXVjZlbUZ1YVc1bElqcG1ZV3h6WlN3aWRISmhZMnNpT2lKaE1tUXpZelZrTlRaaE9XWTROVE0zWkdGaE0ySXlZamRrWkdGaVpEVmlNQ0lzSW5KbGJtUnBkR2x2YmlJNklqRTFNakU0TXpnd0lpd2liWFY0YVc1bklqb2lNekEwTVRReU56RWlmUSZzPXdvTENpY0s0dzRmQ244S2dhQkxEdTA3Q3ZHekRyMHpDaW1QRG1NS3l3N0RDaVMzQ29jS0RaY0szd3FkLVc4S1d3NFlJUEE=')
  )
  // output: https://customer-wi9sckcs7uxt7lh4.cloudflarestream.com/5d5bc37ffcf54c9b82e996823bffbb81/manifest/../../5d5bc37ffcf54c9b82e996823bffbb81/video/240/seg_1.ts?p=eyJ0eXBlIjoidHJhbnNtdXgiLCJ2aWRlb0lEIjoiNWQ1YmMzN2ZmY2Y1NGM5YjgyZTk5NjgyM2JmZmJiODEiLCJvd25lcklEIjozNjEzMzAxLCJjcmVhdG9ySUQiOiIiLCJzZWdtZW50RHVyYXRpb25TZWNzIjo0LCJ1c2VWT0RPVEZFIjp0cnVlLCJmcm9tTWV6emFuaW5lIjpmYWxzZSwidHJhY2siOiJhMmQzYzVkNTZhOWY4NTM3ZGFhM2IyYjdkZGFiZDViMCIsInJlbmRpdGlvbiI6IjE1MjE4MzgwIiwibXV4aW5nIjoiMzA0MTQyNzEifQ&s=woLCicK4w4fCn8KgaBLDu07CvGzDr0zCimPDmMKyw7DCiS3CocKDZcK3wqd-W8KWw4YIPA
  // resolves to: https://customer-wi9sckcs7uxt7lh4.cloudflarestream.com/5d5bc37ffcf54c9b82e996823bffbb81/video/240/seg_1.ts?p=eyJ0eXBlIjoidHJhbnNtdXgiLCJ2aWRlb0lEIjoiNWQ1YmMzN2ZmY2Y1NGM5YjgyZTk5NjgyM2JmZmJiODEiLCJvd25lcklEIjozNjEzMzAxLCJjcmVhdG9ySUQiOiIiLCJzZWdtZW50RHVyYXRpb25TZWNzIjo0LCJ1c2VWT0RPVEZFIjp0cnVlLCJmcm9tTWV6emFuaW5lIjpmYWxzZSwidHJhY2siOiJhMmQzYzVkNTZhOWY4NTM3ZGFhM2IyYjdkZGFiZDViMCIsInJlbmRpdGlvbiI6IjE1MjE4MzgwIiwibXV4aW5nIjoiMzA0MTQyNzEifQ&s=woLCicK4w4fCn8KgaBLDu07CvGzDr0zCimPDmMKyw7DCiS3CocKDZcK3wqd-W8KWw4YIPA
  // OK
warren-bank commented 1 year ago

but.. you're right.. if I request the 1st video segment through the proxy.. it responds with 404 so when it requests the URL with "../../" in its path.. it doesn't resolve it properly

hmm.. I'll definitely fix that

warren-bank commented 1 year ago

rather than fixing this here (in HLS-Proxy).. I think I might fix it in the upstream "request" library.. TBD..

RedRedFlower commented 1 year ago

Thanks for you find out the problem.

warren-bank commented 1 year ago

all fixed.. you'll just need to reinstall HLS-Proxy from npm.

turned out that it was a bug in the 'request' library.. it did already contain logic to normalize the URL pathname.. but in doing so, it removed the querystring parameters from the URL path.. and this video host required those querystring params to serve the .ts video segments.

in any case.. this commit bumps the version of the library to '2.0.13'.. and it'll get pulled (as a dependency) with a fresh install.

RedRedFlower commented 1 year ago

Tested, it work fine.

very appreciate for your help !!