You've already forked N_m3u8DL-CLI
							
							
				mirror of
				https://github.com/nilaoda/N_m3u8DL-CLI
				synced 2025-10-30 14:40:52 +01:00 
			
		
		
		
	Compare commits
	
		
			88 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 65ae72d4a4 | ||
|   | 4a4bfae5ab | ||
|   | d586dddfcd | ||
|   | fca6b3ff6c | ||
|   | 5d75626a36 | ||
|   | a94271c244 | ||
|   | c51118dce7 | ||
|   | 81b2e87bf7 | ||
|   | 71a9878aaa | ||
|   | 769fe4e926 | ||
|   | 1f57ba7c09 | ||
|   | 71282bda30 | ||
|   | 41ee8aebdf | ||
|   | a4537bc093 | ||
|   | b8a60b3917 | ||
|   | 8091dd290f | ||
|   | d48e84e611 | ||
|   | 9f5423a437 | ||
|   | ce7e38770a | ||
|   | 8fdb2e918e | ||
|   | d4b7d240c1 | ||
|   | 484d2941ed | ||
|   | a0f2b66575 | ||
|   | 65cc0681e2 | ||
|   | 7d980ec9a2 | ||
|   | ec5892c05a | ||
|   | 9aed50fbf9 | ||
|   | d657b455cd | ||
|   | cda6575605 | ||
|   | 0d6377d41b | ||
|   | 9c76bdcbce | ||
|   | 83915ff606 | ||
|   | 9cd4746f33 | ||
|   | 33a5b917ac | ||
|   | f69978bd82 | ||
|   | d9fd526886 | ||
|   | 1cc8ecfaaf | ||
|   | 2bc2dde2ad | ||
|   | c3ddcf9e0e | ||
|   | ba5d20dd02 | ||
|   | 16f705fe66 | ||
|   | d141cabc4a | ||
|   | adcf884a93 | ||
|   | 9d903a025f | ||
|   | 0bd23ab641 | ||
|   | a38f27ccd7 | ||
|   | 3acec5efd3 | ||
|   | 90874e4bfe | ||
|   | b94768e3e8 | ||
|   | 311f3b882e | ||
|   | 4b4f537984 | ||
|   | 8032d50b42 | ||
|   | f615764e55 | ||
|   | ccaa200ef8 | ||
|   | 6058d878eb | ||
|   | c712c6dee0 | ||
|   | bb24bb998f | ||
|   | e9d951efa5 | ||
|   | 6f88a805ef | ||
|   | 6aa6d63a8d | ||
|   | 147246caba | ||
|   | 35c1ee4777 | ||
|   | 8b32081b85 | ||
|   | c00de328d1 | ||
|   | d5193c1645 | ||
|   | c06fbf5820 | ||
|   | e700edba56 | ||
|   | aad948da7c | ||
|   | 14f7b20176 | ||
|   | a66a9a4096 | ||
|   | c862f23a9c | ||
|   | 1a722e80de | ||
|   | eff43e8ac3 | ||
|   | 7648f8f8dc | ||
|   | 1edc1a43fe | ||
|   | 01e7735018 | ||
|   | a0c41d6116 | ||
|   | c3c25774de | ||
|   | ba40641a21 | ||
|   | 5d76418780 | ||
|   | fd48b766b5 | ||
|   | 0f25cc0ae8 | ||
|   | 1c6bd688e3 | ||
|   | 480857cc3b | ||
|   | 52af9a44a8 | ||
|   | 84d137b504 | ||
|   | a4f1064c81 | ||
|   | eac08b12f8 | 
							
								
								
									
										34
									
								
								.github/workflows/build_latest.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								.github/workflows/build_latest.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | |||||||
|  | name: Build_Latest | ||||||
|  |   | ||||||
|  | on: [push] | ||||||
|  |   | ||||||
|  | jobs: | ||||||
|  |   build: | ||||||
|  |   | ||||||
|  |     runs-on: windows-latest | ||||||
|  |   | ||||||
|  |     steps: | ||||||
|  |     - uses: actions/checkout@v1 | ||||||
|  |       name: Checkout Code | ||||||
|  |       | ||||||
|  |     - name: Setup MSBuild Path | ||||||
|  |       uses: warrenbuckley/Setup-MSBuild@v1 | ||||||
|  |       env: | ||||||
|  |         ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true' | ||||||
|  |         | ||||||
|  |     - name: Setup NuGet | ||||||
|  |       uses: NuGet/setup-nuget@v1.0.2 | ||||||
|  |       env: | ||||||
|  |         ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true' | ||||||
|  |       | ||||||
|  |     - name: Restore NuGet Packages | ||||||
|  |       run: nuget restore N_m3u8DL-CLI.sln | ||||||
|  |   | ||||||
|  |     - name: Build  | ||||||
|  |       run: msbuild N_m3u8DL-CLI.sln /p:Configuration=Release /p:DebugSymbols=false /p:DebugType=None | ||||||
|  |   | ||||||
|  |     - name: Upload Artifact | ||||||
|  |       uses: actions/upload-artifact@v1.0.0 | ||||||
|  |       with: | ||||||
|  |         name: N_m3u8DL-CLI_latest | ||||||
|  |         path: N_m3u8DL-CLI\bin\Release\ | ||||||
| @@ -2,6 +2,9 @@ | |||||||
|  |  | ||||||
| namespace N_m3u8DL_CLI | namespace N_m3u8DL_CLI | ||||||
| { | { | ||||||
|  |     /** | ||||||
|  |      * https://www.cnblogs.com/linxuanchen/p/c-sharp-command-line-argument-parser.html | ||||||
|  |      */ | ||||||
|     public class CommandLineArgument |     public class CommandLineArgument | ||||||
|     { |     { | ||||||
|         List<CommandLineArgument> _arguments; |         List<CommandLineArgument> _arguments; | ||||||
|   | |||||||
| @@ -1,6 +1,8 @@ | |||||||
| using NiL.JS.BaseLibrary; | using NiL.JS.BaseLibrary; | ||||||
| using NiL.JS.Core; | using NiL.JS.Core; | ||||||
| using NiL.JS.Extensions; | using NiL.JS.Extensions; | ||||||
|  | using System.Security.Cryptography; | ||||||
|  | using System.Text; | ||||||
|  |  | ||||||
| namespace N_m3u8DL_CLI | namespace N_m3u8DL_CLI | ||||||
| { | { | ||||||
| @@ -285,6 +287,19 @@ function getKey(text, lid) { | |||||||
|     return btoa(dec(text, lid)); |     return btoa(dec(text, lid)); | ||||||
| }"; | }"; | ||||||
|  |  | ||||||
|  |         private static string MD5Encoding(string rawPass) | ||||||
|  |         { | ||||||
|  |             MD5 md5 = MD5.Create(); | ||||||
|  |             byte[] bs = Encoding.UTF8.GetBytes(rawPass); | ||||||
|  |             byte[] hs = md5.ComputeHash(bs); | ||||||
|  |             StringBuilder sb = new StringBuilder(); | ||||||
|  |             foreach (byte b in hs) | ||||||
|  |             { | ||||||
|  |                 sb.Append(b.ToString("x2")); | ||||||
|  |             } | ||||||
|  |             return sb.ToString(); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         public static string GetDecodeKey(string encodeKey, string lid) |         public static string GetDecodeKey(string encodeKey, string lid) | ||||||
|         { |         { | ||||||
|             var context = new Context(); |             var context = new Context(); | ||||||
| @@ -293,5 +308,11 @@ function getKey(text, lid) { | |||||||
|             string key = concatFunction.Call(new Arguments { encodeKey, lid }).ToString(); |             string key = concatFunction.Call(new Arguments { encodeKey, lid }).ToString(); | ||||||
|             return key; |             return key; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         public static string GetSign(string lid) | ||||||
|  |         { | ||||||
|  |             var data = lid + "eDu_51Cto_siyuanTlw"; | ||||||
|  |             return MD5Encoding(data); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										41
									
								
								N_m3u8DL-CLI/DecodeDdyun.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								N_m3u8DL-CLI/DecodeDdyun.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | |||||||
|  | using System.Security.Cryptography; | ||||||
|  | using System.Text; | ||||||
|  | using System.Text.RegularExpressions; | ||||||
|  |  | ||||||
|  | namespace N_m3u8DL_CLI | ||||||
|  | { | ||||||
|  |     class DecodeDdyun | ||||||
|  |     { | ||||||
|  |         public static string DecryptM3u8(byte[] byteArray) | ||||||
|  |         { | ||||||
|  |             string tmp = DecodeNfmovies.DecryptM3u8(byteArray); | ||||||
|  |             if (tmp.StartsWith("duoduo.key")) | ||||||
|  |             { | ||||||
|  |                 tmp = Regex.Replace(tmp, @"#EXT-X-BYTERANGE:.*\s", ""); | ||||||
|  |                 tmp = tmp.Replace("https:", "jump/https:") | ||||||
|  |                     .Replace("inews.gtimg.com", "puui.qpic.cn"); | ||||||
|  |             } | ||||||
|  |             return tmp; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         //https://player.ddyunp.com/jQuery.min.js?v1.5 | ||||||
|  |         public static string GetVaildM3u8Url(string url) | ||||||
|  |         { | ||||||
|  |             //url: https://hls.ddyunp.com/ddyun/id/1/key/playlist.m3u8 | ||||||
|  |             string id = Regex.Match(url, @"\w{20,}").Value; | ||||||
|  |             string tm = Global.GetTimeStamp(false); | ||||||
|  |             string t = ((long.Parse(tm) / 0x186a0) * 0x64).ToString(); | ||||||
|  |             string tmp = id + "duoduo" + "1" + t; | ||||||
|  |             MD5 md5 = MD5.Create(); | ||||||
|  |             byte[] bs = Encoding.UTF8.GetBytes(tmp); | ||||||
|  |             byte[] hs = md5.ComputeHash(bs); | ||||||
|  |             StringBuilder sb = new StringBuilder(); | ||||||
|  |             foreach (byte b in hs) | ||||||
|  |             { | ||||||
|  |                 sb.Append(b.ToString("x2")); | ||||||
|  |             } | ||||||
|  |             string key = sb.ToString(); | ||||||
|  |             return Regex.Replace(url, @"1/\w{20,}", "1/" + key); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										53
									
								
								N_m3u8DL-CLI/DecodeHuke88Key.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								N_m3u8DL-CLI/DecodeHuke88Key.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | |||||||
|  | using Newtonsoft.Json.Linq; | ||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Security.Cryptography; | ||||||
|  | using System.Text; | ||||||
|  | using System.Text.RegularExpressions; | ||||||
|  |  | ||||||
|  | namespace N_m3u8DL_CLI | ||||||
|  | { | ||||||
|  |     //https://js.huke88.com/assets/revision/js/plugins/tcplayer/tcplayer.v4.1.min.js?v=930 | ||||||
|  |     //https://js.huke88.com/assets/revision/js/plugins/tcplayer/libs/hls.min.0.13.2m.js?v=930 | ||||||
|  |     class DecodeHuke88Key | ||||||
|  |     { | ||||||
|  |         private static string[] GetOverlayInfo(string url) | ||||||
|  |         { | ||||||
|  |             var enc = new Regex("eyJ\\w{100,}").Match(url).Value; | ||||||
|  |             var json = Encoding.UTF8.GetString(Convert.FromBase64String(enc)); | ||||||
|  |             JObject jObject = JObject.Parse(json); | ||||||
|  |             var key = jObject["overlayKey"].ToString(); | ||||||
|  |             var iv = jObject["overlayIv"].ToString(); | ||||||
|  |             return new string[] { key, iv }; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public static string DecodeKey(string url, byte[] data) | ||||||
|  |         { | ||||||
|  |             var info = GetOverlayInfo(url); | ||||||
|  |             var overlayKey = info[0]; | ||||||
|  |             var overlayIv = info[1]; | ||||||
|  |             var l = new List<byte>(); | ||||||
|  |             var c = new List<byte>(); | ||||||
|  |             for (int h = 0; h < 16; h++) | ||||||
|  |             { | ||||||
|  |                 var f = overlayKey.Substring(2 * h, 2); | ||||||
|  |                 var g = overlayIv.Substring(2 * h, 2); | ||||||
|  |                 l.Add(Convert.ToByte(f, 16)); | ||||||
|  |                 c.Add(Convert.ToByte(g, 16)); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             var _lastCipherblock = c.ToArray(); | ||||||
|  |  | ||||||
|  |             var t = new byte[data.Length]; | ||||||
|  |             var r = data; | ||||||
|  |             r = Decrypter.AES128Decrypt(data, l.ToArray(), Decrypter.HexStringToBytes("00000000000000000000000000000000"), CipherMode.CBC, PaddingMode.Zeros); | ||||||
|  |  | ||||||
|  |             for (var o = 0; o < 16; o++) | ||||||
|  |                 t[o] = (byte)(r[o] ^ _lastCipherblock[o]); | ||||||
|  |  | ||||||
|  |             var key = Convert.ToBase64String(t); | ||||||
|  |  | ||||||
|  |             return key; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										203
									
								
								N_m3u8DL-CLI/DecodeImooc.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										203
									
								
								N_m3u8DL-CLI/DecodeImooc.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,203 @@ | |||||||
|  | using NiL.JS.BaseLibrary; | ||||||
|  | using NiL.JS.Core; | ||||||
|  | using NiL.JS.Extensions; | ||||||
|  | using System; | ||||||
|  | using Array = System.Array; | ||||||
|  |  | ||||||
|  | namespace N_m3u8DL_CLI | ||||||
|  | { | ||||||
|  |     /* | ||||||
|  |      * js代码来自:https://www.imooc.com/static/moco/player/3.0.6.3/mocoplayer.js?v=202006122046 | ||||||
|  |      *  | ||||||
|  |      */ | ||||||
|  |     class DecodeImooc | ||||||
|  |     { | ||||||
|  |         private static string JS = @" | ||||||
|  | function n(t, e) { | ||||||
|  |                 function r(t, e) { | ||||||
|  |                     var r = ''; | ||||||
|  |                     if ('object' == typeof t) | ||||||
|  |                         for (var n = 0; n < t.length; n++) | ||||||
|  |                             r += String.fromCharCode(t[n]); | ||||||
|  |                     t = r || t; | ||||||
|  |                     for (var i, o, a = new Uint8Array(t.length), s = e.length, n = 0; n < t.length; n++) | ||||||
|  |                         o = n % s, | ||||||
|  |                         i = t[n], | ||||||
|  |                         i = i.toString().charCodeAt(0), | ||||||
|  |                         a[n] = i ^ e.charCodeAt(o); | ||||||
|  |                     return a | ||||||
|  |                 } | ||||||
|  |                 function n(t) { | ||||||
|  |                     var e = ''; | ||||||
|  |                     if ('object' == typeof t) | ||||||
|  |                         for (var r = 0; r < t.length; r++) | ||||||
|  |                             e += String.fromCharCode(t[r]); | ||||||
|  |                     t = e || t; | ||||||
|  |                     var n = new Uint8Array(t.length); | ||||||
|  |                     for (r = 0; r < t.length; r++) | ||||||
|  |                         n[r] = t[r].toString().charCodeAt(0); | ||||||
|  |                     var i, o, r = 0; | ||||||
|  |                     for (r = 0; r < n.length; r++) | ||||||
|  |                         0 != (i = n[r] % 3) && r + i < n.length && (o = n[r + 1], | ||||||
|  |                         n[r + 1] = n[r + i], | ||||||
|  |                         n[r + i] = o, | ||||||
|  |                         r = r + i + 1); | ||||||
|  |                     return n | ||||||
|  |                 } | ||||||
|  |                 function i(t) { | ||||||
|  |                     var e = ''; | ||||||
|  |                     if ('object' == typeof t) | ||||||
|  |                         for (var r = 0; r < t.length; r++) | ||||||
|  |                             e += String.fromCharCode(t[r]); | ||||||
|  |                     t = e || t; | ||||||
|  |                     var n = new Uint8Array(t.length); | ||||||
|  |                     for (r = 0; r < t.length; r++) | ||||||
|  |                         n[r] = t[r].toString().charCodeAt(0); | ||||||
|  |                     var r = 0 | ||||||
|  |                       , i = 0 | ||||||
|  |                       , o = 0 | ||||||
|  |                       , a = 0; | ||||||
|  |                     for (r = 0; r < n.length; r++) | ||||||
|  |                         o = n[r] % 2, | ||||||
|  |                         o && r++, | ||||||
|  |                         a++; | ||||||
|  |                     var s = new Uint8Array(a); | ||||||
|  |                     for (r = 0; r < n.length; r++) | ||||||
|  |                         o = n[r] % 2, | ||||||
|  |                         s[i++] = o ? n[r++] : n[r]; | ||||||
|  |                     return s | ||||||
|  |                 } | ||||||
|  |                 function o(t, e) { | ||||||
|  |                     var r = 0 | ||||||
|  |                       , n = 0 | ||||||
|  |                       , i = 0 | ||||||
|  |                       , o = 0 | ||||||
|  |                       , a = ''; | ||||||
|  |                     if ('object' == typeof t) | ||||||
|  |                         for (var r = 0; r < t.length; r++) | ||||||
|  |                             a += String.fromCharCode(t[r]); | ||||||
|  |                     t = a || t; | ||||||
|  |                     var s = new Uint8Array(t.length); | ||||||
|  |                     for (r = 0; r < t.length; r++) | ||||||
|  |                         s[r] = t[r].toString().charCodeAt(0); | ||||||
|  |                     for (r = 0; r < t.length; r++) | ||||||
|  |                         if (0 != (o = s[r] % 5) && 1 != o && r + o < s.length && (i = s[r + 1], | ||||||
|  |                         n = r + 2, | ||||||
|  |                         s[r + 1] = s[r + o], | ||||||
|  |                         s[o + r] = i, | ||||||
|  |                         (r = r + o + 1) - 2 > n)) | ||||||
|  |                             for (; n < r - 2; n++) | ||||||
|  |                                 s[n] = s[n] ^ e.charCodeAt(n % e.length); | ||||||
|  |                     for (r = 0; r < t.length; r++) | ||||||
|  |                         s[r] = s[r] ^ e.charCodeAt(r % e.length); | ||||||
|  |                     return s | ||||||
|  |                 } | ||||||
|  |                 for (var a = { | ||||||
|  |                     data: { | ||||||
|  |                         info: t | ||||||
|  |                     } | ||||||
|  |                 }, s = { | ||||||
|  |                     q: r, | ||||||
|  |                     h: n, | ||||||
|  |                     m: i, | ||||||
|  |                     k: o | ||||||
|  |                 }, l = a.data.info, u = l.substring(l.length - 4).split(''), c = 0; c < u.length; c++) | ||||||
|  |                     u[c] = u[c].toString().charCodeAt(0) % 4; | ||||||
|  |                 u.reverse(); | ||||||
|  |                 for (var d = [], c = 0; c < u.length; c++) | ||||||
|  |                     d.push(l.substring(u[c] + 1, u[c] + 2)), | ||||||
|  |                     l = l.substring(0, u[c] + 1) + l.substring(u[c] + 2); | ||||||
|  |                 a.data.encrypt_table = d, | ||||||
|  |                 a.data.key_table = []; | ||||||
|  |                 for (var c in a.data.encrypt_table) | ||||||
|  |                     'q' != a.data.encrypt_table[c] && 'k' != a.data.encrypt_table[c] || (a.data.key_table.push(l.substring(l.length - 12)), | ||||||
|  |                     l = l.substring(0, l.length - 12)); | ||||||
|  |                 a.data.key_table.reverse(), | ||||||
|  |                 a.data.info = l; | ||||||
|  |                 var f = new Array(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1); | ||||||
|  |                 a.data.info = function(t) { | ||||||
|  |                     var e, r, n, i, o, a, s; | ||||||
|  |                     for (a = t.length, | ||||||
|  |                     o = 0, | ||||||
|  |                     s = ''; o < a; ) { | ||||||
|  |                         do { | ||||||
|  |                             e = f[255 & t.charCodeAt(o++)] | ||||||
|  |                         } while (o < a && -1 == e);if (-1 == e) | ||||||
|  |                             break; | ||||||
|  |                         do { | ||||||
|  |                             r = f[255 & t.charCodeAt(o++)] | ||||||
|  |                         } while (o < a && -1 == r);if (-1 == r) | ||||||
|  |                             break; | ||||||
|  |                         s += String.fromCharCode(e << 2 | (48 & r) >> 4); | ||||||
|  |                         do { | ||||||
|  |                             if (61 == (n = 255 & t.charCodeAt(o++))) | ||||||
|  |                                 return s; | ||||||
|  |                             n = f[n] | ||||||
|  |                         } while (o < a && -1 == n);if (-1 == n) | ||||||
|  |                             break; | ||||||
|  |                         s += String.fromCharCode((15 & r) << 4 | (60 & n) >> 2); | ||||||
|  |                         do { | ||||||
|  |                             if (61 == (i = 255 & t.charCodeAt(o++))) | ||||||
|  |                                 return s; | ||||||
|  |                             i = f[i] | ||||||
|  |                         } while (o < a && -1 == i);if (-1 == i) | ||||||
|  |                             break; | ||||||
|  |                         s += String.fromCharCode((3 & n) << 6 | i) | ||||||
|  |                     } | ||||||
|  |                     return s | ||||||
|  |                 }(a.data.info); | ||||||
|  |                 for (var c in a.data.encrypt_table) { | ||||||
|  |                     var h = a.data.encrypt_table[c]; | ||||||
|  |                     if ('q' == h || 'k' == h) { | ||||||
|  |                         var p = a.data.key_table.pop(); | ||||||
|  |                         a.data.info = s[a.data.encrypt_table[c]](a.data.info, p) | ||||||
|  |                     } else | ||||||
|  |                         a.data.info = s[a.data.encrypt_table[c]](a.data.info) | ||||||
|  |                 } | ||||||
|  |                 if (e) | ||||||
|  |                     return a.data.info; | ||||||
|  |                 var g = ''; | ||||||
|  |                 for (c = 0; c < a.data.info.length; c++) | ||||||
|  |                     g += String.fromCharCode(a.data.info[c]); | ||||||
|  |                 return g | ||||||
|  |             } | ||||||
|  |             function Uint8ArrayToString(fileData){ | ||||||
|  |               var dataString = ''; | ||||||
|  |               for (var i = 0; i < fileData.length; i++) { | ||||||
|  |                 dataString += Number(fileData[i]) + ','; | ||||||
|  |               } | ||||||
|  |               return dataString; | ||||||
|  |             } | ||||||
|  |             function decodeKey(resp){ | ||||||
|  |                 var string = eval('('+resp+')'); | ||||||
|  |                 //return btoa(String.fromCharCode.apply(null, new Uint8Array(n(string.data.info, 1)))); | ||||||
|  |                 return Uint8ArrayToString(new Uint8Array(n(string.data.info, 1))); | ||||||
|  |             } | ||||||
|  |             function decodeM3u8(resp){ | ||||||
|  |                 var string = eval('('+resp+')'); | ||||||
|  |                 return n(string.data.info); | ||||||
|  |             } | ||||||
|  |             "; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         public static string DecodeM3u8(string resp) | ||||||
|  |         { | ||||||
|  |             var context = new Context(); | ||||||
|  |             context.Eval(JS); | ||||||
|  |             var concatFunction = context.GetVariable("decodeM3u8").As<Function>(); | ||||||
|  |             string m3u8 = concatFunction.Call(new Arguments { resp }).ToString(); | ||||||
|  |             return m3u8; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public static string DecodeKey(string resp) | ||||||
|  |         { | ||||||
|  |             var context = new Context(); | ||||||
|  |             context.Eval(JS); | ||||||
|  |             var concatFunction = context.GetVariable("decodeKey").As<Function>(); | ||||||
|  |             string key = concatFunction.Call(new Arguments { resp }).ToString(); | ||||||
|  |             byte[] v = Array.ConvertAll(key.Trim(',').Split(','), s => (byte)int.Parse(s)); | ||||||
|  |             string realKey = Convert.ToBase64String(v); | ||||||
|  |             return realKey; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										36
									
								
								N_m3u8DL-CLI/DecodeNfmovies.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								N_m3u8DL-CLI/DecodeNfmovies.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | |||||||
|  | using System; | ||||||
|  | using System.IO; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Text; | ||||||
|  |  | ||||||
|  | namespace N_m3u8DL_CLI | ||||||
|  | { | ||||||
|  |     class DecodeNfmovies | ||||||
|  |     { | ||||||
|  |         //https://jx.nfmovies.com/hls.min.js | ||||||
|  |         public static string DecryptM3u8(byte[] byteArray) | ||||||
|  |         { | ||||||
|  |             var t = byteArray; | ||||||
|  |             var decrypt = ""; | ||||||
|  |             if (137 == t[0] && 80 == t[1] && 130 == t[354] && 96 == t[353]) t = t.Skip(355).ToArray(); | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 if (137 != t[0] || 80 != t[1] || 130 != t[394] || 96 != t[393]) | ||||||
|  |                 { | ||||||
|  |                     for (var i = 0; i < t.Length; i++) decrypt += Convert.ToChar(t[i]); | ||||||
|  |                     return decrypt; | ||||||
|  |                 } | ||||||
|  |                 t = t.Skip(395).ToArray(); | ||||||
|  |             } | ||||||
|  |             using (var zipStream = | ||||||
|  |                 new System.IO.Compression.GZipStream(new MemoryStream(t), System.IO.Compression.CompressionMode.Decompress)) | ||||||
|  |             { | ||||||
|  |                 using (StreamReader sr = new StreamReader(zipStream, Encoding.UTF8)) | ||||||
|  |                 { | ||||||
|  |                     decrypt = sr.ReadToEnd(); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             return decrypt; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -1,16 +1,12 @@ | |||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; |  | ||||||
| using System.IO; | using System.IO; | ||||||
| using System.Linq; |  | ||||||
| using System.Security.Cryptography; | using System.Security.Cryptography; | ||||||
| using System.Text; |  | ||||||
| using System.Threading.Tasks; |  | ||||||
|  |  | ||||||
| namespace N_m3u8DL_CLI | namespace N_m3u8DL_CLI | ||||||
| { | { | ||||||
|     class Decrypter |     class Decrypter | ||||||
|     { |     { | ||||||
|         public static byte[] AES128Decrypt(string filePath, byte[] keyByte, byte[] ivByte, CipherMode mode = CipherMode.CBC) |         public static byte[] AES128Decrypt(string filePath, byte[] keyByte, byte[] ivByte, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7) | ||||||
|         { |         { | ||||||
|             FileStream fs = new FileStream(filePath, FileMode.Open); |             FileStream fs = new FileStream(filePath, FileMode.Open); | ||||||
|             //获取文件大小 |             //获取文件大小 | ||||||
| @@ -19,30 +15,30 @@ namespace N_m3u8DL_CLI | |||||||
|             fs.Read(inBuff, 0, inBuff.Length); |             fs.Read(inBuff, 0, inBuff.Length); | ||||||
|             fs.Close(); |             fs.Close(); | ||||||
|  |  | ||||||
|             Aes dcpt = Aes.Create("AES"); |             Aes dcpt = Aes.Create(); | ||||||
|             dcpt.BlockSize = 128; |             dcpt.BlockSize = 128; | ||||||
|             dcpt.KeySize = 128; |             dcpt.KeySize = 128; | ||||||
|             dcpt.Key = keyByte; |             dcpt.Key = keyByte; | ||||||
|             dcpt.IV = ivByte; |             dcpt.IV = ivByte; | ||||||
|             dcpt.Mode = mode; |             dcpt.Mode = mode; | ||||||
|             dcpt.Padding = PaddingMode.PKCS7; |             dcpt.Padding = padding; | ||||||
|  |  | ||||||
|             ICryptoTransform cTransform = dcpt.CreateDecryptor(); |             ICryptoTransform cTransform = dcpt.CreateDecryptor(); | ||||||
|             Byte[] resultArray = cTransform.TransformFinalBlock(inBuff, 0, inBuff.Length); |             Byte[] resultArray = cTransform.TransformFinalBlock(inBuff, 0, inBuff.Length); | ||||||
|             return resultArray; |             return resultArray; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public static byte[] AES128Decrypt(byte[] encryptedBuff, byte[] keyByte, byte[] ivByte, CipherMode mode = CipherMode.CBC) |         public static byte[] AES128Decrypt(byte[] encryptedBuff, byte[] keyByte, byte[] ivByte, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7) | ||||||
|         { |         { | ||||||
|             byte[] inBuff = encryptedBuff; |             byte[] inBuff = encryptedBuff; | ||||||
|  |  | ||||||
|             Aes dcpt = Aes.Create("AES"); |             Aes dcpt = Aes.Create(); | ||||||
|             dcpt.BlockSize = 128; |             dcpt.BlockSize = 128; | ||||||
|             dcpt.KeySize = 128; |             dcpt.KeySize = 128; | ||||||
|             dcpt.Key = keyByte; |             dcpt.Key = keyByte; | ||||||
|             dcpt.IV = ivByte; |             dcpt.IV = ivByte; | ||||||
|             dcpt.Mode = mode; |             dcpt.Mode = mode; | ||||||
|             dcpt.Padding = PaddingMode.PKCS7; |             dcpt.Padding = padding; | ||||||
|  |  | ||||||
|             ICryptoTransform cTransform = dcpt.CreateDecryptor(); |             ICryptoTransform cTransform = dcpt.CreateDecryptor(); | ||||||
|             Byte[] resultArray = cTransform.TransformFinalBlock(inBuff, 0, inBuff.Length); |             Byte[] resultArray = cTransform.TransformFinalBlock(inBuff, 0, inBuff.Length); | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,5 +1,4 @@ | |||||||
| //using DecryptYK; | using System; | ||||||
| using System; |  | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.ComponentModel; | using System.ComponentModel; | ||||||
| using System.IO; | using System.IO; | ||||||
| @@ -13,8 +12,6 @@ namespace N_m3u8DL_CLI | |||||||
| { | { | ||||||
|     class Downloader |     class Downloader | ||||||
|     { |     { | ||||||
|         public static bool YouKuAES = false; |  | ||||||
|  |  | ||||||
|         private int timeOut = 0; |         private int timeOut = 0; | ||||||
|         private int retry = 5; |         private int retry = 5; | ||||||
|         private int count = 0; |         private int count = 0; | ||||||
| @@ -93,23 +90,11 @@ namespace N_m3u8DL_CLI | |||||||
|                         byte[] encryptedBuff = Global.HttpDownloadFileToBytes(fileUrl, Headers, TimeOut); |                         byte[] encryptedBuff = Global.HttpDownloadFileToBytes(fileUrl, Headers, TimeOut); | ||||||
|                         //byte[] encryptedBuff = Global.WebClientDownloadToBytes(fileUrl, Headers); |                         //byte[] encryptedBuff = Global.WebClientDownloadToBytes(fileUrl, Headers); | ||||||
|                         byte[] decryptBuff = null; |                         byte[] decryptBuff = null; | ||||||
|                         if (YouKuAES) |  | ||||||
|                         { |  | ||||||
|                             //decryptBuff = DecrypterYK.Decrypt( |  | ||||||
|                         decryptBuff = Decrypter.AES128Decrypt( |                         decryptBuff = Decrypter.AES128Decrypt( | ||||||
|                             encryptedBuff, |                             encryptedBuff, | ||||||
|                             Convert.FromBase64String(Key), |                             Convert.FromBase64String(Key), | ||||||
|                             Decrypter.HexStringToBytes(Iv) |                             Decrypter.HexStringToBytes(Iv) | ||||||
|                             ); |                             ); | ||||||
|                         } |  | ||||||
|                         else |  | ||||||
|                         { |  | ||||||
|                             decryptBuff = Decrypter.AES128Decrypt( |  | ||||||
|                                 encryptedBuff, |  | ||||||
|                                 Convert.FromBase64String(Key), |  | ||||||
|                                 Decrypter.HexStringToBytes(Iv) |  | ||||||
|                                 ); |  | ||||||
|                         } |  | ||||||
|                         Global.AppendBytesToFileStreamAndDoNotClose(LiveStream, decryptBuff); |                         Global.AppendBytesToFileStreamAndDoNotClose(LiveStream, decryptBuff); | ||||||
|                         LOGGER.PrintLine("<" + SegIndex + " Complete>\r\n"); |                         LOGGER.PrintLine("<" + SegIndex + " Complete>\r\n"); | ||||||
|                         LOGGER.WriteLine("<" + SegIndex + " Complete>"); |                         LOGGER.WriteLine("<" + SegIndex + " Complete>"); | ||||||
| @@ -133,8 +118,8 @@ namespace N_m3u8DL_CLI | |||||||
|                     HLSLiveDownloader.REC_DUR += SegDur; |                     HLSLiveDownloader.REC_DUR += SegDur; | ||||||
|                     if (HLSLiveDownloader.REC_DUR_LIMIT != -1 && HLSLiveDownloader.REC_DUR >= HLSLiveDownloader.REC_DUR_LIMIT)  |                     if (HLSLiveDownloader.REC_DUR_LIMIT != -1 && HLSLiveDownloader.REC_DUR >= HLSLiveDownloader.REC_DUR_LIMIT)  | ||||||
|                     { |                     { | ||||||
|                         LOGGER.PrintLine("录制已到达限定长度", LOGGER.Warning); |                         LOGGER.PrintLine(strings.recordLimitReached, LOGGER.Warning); | ||||||
|                         LOGGER.WriteLine("录制已到达限定长度"); |                         LOGGER.WriteLine(strings.recordLimitReached); | ||||||
|                         Environment.Exit(0); //正常退出 |                         Environment.Exit(0); //正常退出 | ||||||
|                     } |                     } | ||||||
|                     return; |                     return; | ||||||
| @@ -207,16 +192,7 @@ namespace N_m3u8DL_CLI | |||||||
|                         try |                         try | ||||||
|                         { |                         { | ||||||
|                             byte[] decryptBuff = null; |                             byte[] decryptBuff = null; | ||||||
|                             if (YouKuAES) |                             if(fileUrl.Contains(".51cto.com/")) //使用AES-128-ECB模式解密 | ||||||
|                             { |  | ||||||
|                                 //decryptBuff = DecrypterYK.Decrypt( |  | ||||||
|                                 decryptBuff = Decrypter.AES128Decrypt( |  | ||||||
|                                         File.ReadAllBytes(fi.FullName), |  | ||||||
|                                     Convert.FromBase64String(Key), |  | ||||||
|                                     Decrypter.HexStringToBytes(Iv) |  | ||||||
|                                     ); |  | ||||||
|                             } |  | ||||||
|                             else if(fileUrl.Contains(".51cto.com/")) //使用AES-128-ECB模式解密 |  | ||||||
|                             { |                             { | ||||||
|                                 decryptBuff = Decrypter.AES128Decrypt( |                                 decryptBuff = Decrypter.AES128Decrypt( | ||||||
|                                     fi.FullName, |                                     fi.FullName, | ||||||
| @@ -244,13 +220,14 @@ namespace N_m3u8DL_CLI | |||||||
|                         { |                         { | ||||||
|                             LOGGER.PrintLine(ex.Message, LOGGER.Error); |                             LOGGER.PrintLine(ex.Message, LOGGER.Error); | ||||||
|                             LOGGER.WriteLineError(ex.Message); |                             LOGGER.WriteLineError(ex.Message); | ||||||
|  |                             Thread.Sleep(3000); | ||||||
|                             Environment.Exit(-1); |                             Environment.Exit(-1); | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                     else |                     else | ||||||
|                     { |                     { | ||||||
|                         LOGGER.WriteLineError("Something was wrong!"); |                         LOGGER.WriteLineError(strings.SomethingWasWrong); | ||||||
|                         LOGGER.PrintLine("遇到了某些错误!", LOGGER.Error); |                         LOGGER.PrintLine(strings.SomethingWasWrong, LOGGER.Error); | ||||||
|                         return; |                         return; | ||||||
|                     } |                     } | ||||||
|                     return; |                     return; | ||||||
|   | |||||||
| @@ -10,19 +10,20 @@ namespace N_m3u8DL_CLI | |||||||
| { | { | ||||||
|     class FFmpeg |     class FFmpeg | ||||||
|     { |     { | ||||||
|         private static string outPutPath = string.Empty; |         public static string FFMPEG_PATH = "ffmpeg"; | ||||||
|         private static string reportFile = string.Empty; |         public static string REC_TIME = ""; //录制日期 | ||||||
|         private static bool useAACFilter = false;  //是否启用滤镜 |  | ||||||
|         private static bool writeDate = true;  //是否写入录制日期 |         public static string OutPutPath { get; set; } = string.Empty; | ||||||
|         public static string OutPutPath { get => outPutPath; set => outPutPath = value; } |         public static string ReportFile { get; set; } = string.Empty; | ||||||
|         public static string ReportFile { get => reportFile; set => reportFile = value; } |         public static bool UseAACFilter { get; set; } = false;  //是否启用滤镜 | ||||||
|         public static bool UseAACFilter { get => useAACFilter; set => useAACFilter = value; } |         public static bool WriteDate { get; set; } = true;  //是否写入录制日期 | ||||||
|         public static bool WriteDate { get => writeDate; set => writeDate = value; } |  | ||||||
|  |  | ||||||
|         public static void Merge(string[] files, string muxFormat, bool fastStart, |         public static void Merge(string[] files, string muxFormat, bool fastStart, | ||||||
|             string poster = "", string audioName = "", string title = "", |             string poster = "", string audioName = "", string title = "", | ||||||
|             string copyright = "", string comment = "", string encodingTool = "") |             string copyright = "", string comment = "", string encodingTool = "") | ||||||
|         { |         { | ||||||
|  |             string dateString = string.IsNullOrEmpty(REC_TIME) ? DateTime.Now.ToString("o") : REC_TIME; | ||||||
|  |  | ||||||
|             //同名文件已存在的共存策略 |             //同名文件已存在的共存策略 | ||||||
|             if (File.Exists($"{OutPutPath}.{muxFormat.ToLower()}"))  |             if (File.Exists($"{OutPutPath}.{muxFormat.ToLower()}"))  | ||||||
|             { |             { | ||||||
| @@ -50,7 +51,7 @@ namespace N_m3u8DL_CLI | |||||||
|                     command += " " + (string.IsNullOrEmpty(ddpAudio) ? "" : "-i \"" + ddpAudio + "\""); |                     command += " " + (string.IsNullOrEmpty(ddpAudio) ? "" : "-i \"" + ddpAudio + "\""); | ||||||
|                     command += |                     command += | ||||||
|                         $" -map 0:v? {(string.IsNullOrEmpty(ddpAudio) ? "-map 0:a?" : $"-map {(string.IsNullOrEmpty(poster) ? "1" : "2")}:a -map 0:a?")} -map 0:s? " + (string.IsNullOrEmpty(poster) ? "" : addPoster) |                         $" -map 0:v? {(string.IsNullOrEmpty(ddpAudio) ? "-map 0:a?" : $"-map {(string.IsNullOrEmpty(poster) ? "1" : "2")}:a -map 0:a?")} -map 0:s? " + (string.IsNullOrEmpty(poster) ? "" : addPoster) | ||||||
|                         + (writeDate ? " -metadata date=\"" + DateTime.Now.ToString("o") + "\"" : "") + |                         + (WriteDate ? " -metadata date=\"" + dateString + "\"" : "") + | ||||||
|                         " -metadata encoding_tool=\"" + encodingTool + "\" -metadata title=\"" + title + |                         " -metadata encoding_tool=\"" + encodingTool + "\" -metadata title=\"" + title + | ||||||
|                         "\" -metadata copyright=\"" + copyright + "\" -metadata comment=\"" + comment + |                         "\" -metadata copyright=\"" + copyright + "\" -metadata comment=\"" + comment + | ||||||
|                         $"\" -metadata:s:a:{(string.IsNullOrEmpty(ddpAudio) ? "0" : "1")} handler_name=\"" + audioName + $"\" -metadata:s:a:{(string.IsNullOrEmpty(ddpAudio) ? "0" : "1")} handler=\"" + audioName + "\" "; |                         $"\" -metadata:s:a:{(string.IsNullOrEmpty(ddpAudio) ? "0" : "1")} handler_name=\"" + audioName + $"\" -metadata:s:a:{(string.IsNullOrEmpty(ddpAudio) ? "0" : "1")} handler=\"" + audioName + "\" "; | ||||||
| @@ -83,8 +84,8 @@ namespace N_m3u8DL_CLI | |||||||
|  |  | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             Run("ffmpeg", command, Path.GetDirectoryName(files[0])); |             Run(FFMPEG_PATH, command, Path.GetDirectoryName(files[0])); | ||||||
|             LOGGER.WriteLine("Result in [ffreport.log]"); |             LOGGER.WriteLine(strings.ffmpegDone); | ||||||
|             //Console.WriteLine(command); |             //Console.WriteLine(command); | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -92,7 +93,7 @@ namespace N_m3u8DL_CLI | |||||||
|         { |         { | ||||||
|             if (Global.VIDEO_TYPE == "H264") |             if (Global.VIDEO_TYPE == "H264") | ||||||
|             { |             { | ||||||
|                 Run("ffmpeg", |                 Run(FFMPEG_PATH, | ||||||
|                     "-loglevel quiet -i \"" + file + "\" -map 0 -c copy -copy_unknown -f mpegts -bsf:v h264_mp4toannexb \"" |                     "-loglevel quiet -i \"" + file + "\" -map 0 -c copy -copy_unknown -f mpegts -bsf:v h264_mp4toannexb \"" | ||||||
|                     + Path.GetFileNameWithoutExtension(file) + "[MPEGTS].ts\"",  |                     + Path.GetFileNameWithoutExtension(file) + "[MPEGTS].ts\"",  | ||||||
|                     Path.GetDirectoryName(file)); |                     Path.GetDirectoryName(file)); | ||||||
| @@ -104,7 +105,7 @@ namespace N_m3u8DL_CLI | |||||||
|             } |             } | ||||||
|             else if (Global.VIDEO_TYPE == "H265") |             else if (Global.VIDEO_TYPE == "H265") | ||||||
|             { |             { | ||||||
|                 Run("ffmpeg", |                 Run(FFMPEG_PATH, | ||||||
|                     "-loglevel quiet -i \"" + file + "\" -map 0 -c copy -copy_unknown -f mpegts -bsf:v hevc_mp4toannexb \"" |                     "-loglevel quiet -i \"" + file + "\" -map 0 -c copy -copy_unknown -f mpegts -bsf:v hevc_mp4toannexb \"" | ||||||
|                     + Path.GetFileNameWithoutExtension(file) + "[MPEGTS].ts\"", |                     + Path.GetFileNameWithoutExtension(file) + "[MPEGTS].ts\"", | ||||||
|                     Path.GetDirectoryName(file)); |                     Path.GetDirectoryName(file)); | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										783
									
								
								N_m3u8DL-CLI/MPDParser.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										783
									
								
								N_m3u8DL-CLI/MPDParser.cs
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,5 +1,6 @@ | |||||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||||
| <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||||
|  |   <Import Project="..\packages\Costura.Fody.4.1.0\build\Costura.Fody.props" Condition="Exists('..\packages\Costura.Fody.4.1.0\build\Costura.Fody.props')" /> | ||||||
|   <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> |   <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> | ||||||
|   <PropertyGroup> |   <PropertyGroup> | ||||||
|     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> |     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> | ||||||
| @@ -12,6 +13,8 @@ | |||||||
|     <FileAlignment>512</FileAlignment> |     <FileAlignment>512</FileAlignment> | ||||||
|     <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> |     <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> | ||||||
|     <TargetFrameworkProfile /> |     <TargetFrameworkProfile /> | ||||||
|  |     <NuGetPackageImportStamp> | ||||||
|  |     </NuGetPackageImportStamp> | ||||||
|   </PropertyGroup> |   </PropertyGroup> | ||||||
|   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> |   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> | ||||||
|     <PlatformTarget>x86</PlatformTarget> |     <PlatformTarget>x86</PlatformTarget> | ||||||
| @@ -38,13 +41,16 @@ | |||||||
|     <ApplicationIcon>logo_3Iv_icon.ico</ApplicationIcon> |     <ApplicationIcon>logo_3Iv_icon.ico</ApplicationIcon> | ||||||
|   </PropertyGroup> |   </PropertyGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|  |     <Reference Include="Costura, Version=4.1.0.0, Culture=neutral, PublicKeyToken=9919ef960d84173d, processorArchitecture=MSIL"> | ||||||
|  |       <HintPath>..\packages\Costura.Fody.4.1.0\lib\net40\Costura.dll</HintPath> | ||||||
|  |     </Reference> | ||||||
|     <Reference Include="Microsoft.JScript" /> |     <Reference Include="Microsoft.JScript" /> | ||||||
|     <Reference Include="netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" /> |     <Reference Include="netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" /> | ||||||
|     <Reference Include="Newtonsoft.Json"> |     <Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> | ||||||
|       <HintPath>..\packages\Newtonsoft.Json.dll</HintPath> |       <HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath> | ||||||
|     </Reference> |     </Reference> | ||||||
|     <Reference Include="NiL.JS, Version=2.5.1428.0, Culture=neutral, PublicKeyToken=fa941a7c2a4de689, processorArchitecture=MSIL"> |     <Reference Include="NiL.JS, Version=2.5.1428.0, Culture=neutral, PublicKeyToken=fa941a7c2a4de689, processorArchitecture=MSIL"> | ||||||
|       <HintPath>..\packages\NiL.JS.dll</HintPath> |       <HintPath>..\packages\NiL.JS.2.5.1428\lib\net45\NiL.JS.dll</HintPath> | ||||||
|     </Reference> |     </Reference> | ||||||
|     <Reference Include="PresentationFramework" /> |     <Reference Include="PresentationFramework" /> | ||||||
|     <Reference Include="System" /> |     <Reference Include="System" /> | ||||||
| @@ -63,6 +69,10 @@ | |||||||
|     <Compile Include="CommandLineArgument.cs" /> |     <Compile Include="CommandLineArgument.cs" /> | ||||||
|     <Compile Include="CommandLineArgumentParser.cs" /> |     <Compile Include="CommandLineArgumentParser.cs" /> | ||||||
|     <Compile Include="Decode51CtoKey.cs" /> |     <Compile Include="Decode51CtoKey.cs" /> | ||||||
|  |     <Compile Include="DecodeDdyun.cs" /> | ||||||
|  |     <Compile Include="DecodeHuke88Key.cs" /> | ||||||
|  |     <Compile Include="DecodeImooc.cs" /> | ||||||
|  |     <Compile Include="DecodeNfmovies.cs" /> | ||||||
|     <Compile Include="Decrypter.cs" /> |     <Compile Include="Decrypter.cs" /> | ||||||
|     <Compile Include="FFmpeg.cs" /> |     <Compile Include="FFmpeg.cs" /> | ||||||
|     <Compile Include="Global.cs" /> |     <Compile Include="Global.cs" /> | ||||||
| @@ -70,10 +80,26 @@ | |||||||
|     <Compile Include="HLSTags.cs" /> |     <Compile Include="HLSTags.cs" /> | ||||||
|     <Compile Include="LOGGER.cs" /> |     <Compile Include="LOGGER.cs" /> | ||||||
|     <Compile Include="DownloadManager.cs" /> |     <Compile Include="DownloadManager.cs" /> | ||||||
|  |     <Compile Include="MPDParser.cs" /> | ||||||
|     <Compile Include="Parser.cs" /> |     <Compile Include="Parser.cs" /> | ||||||
|     <Compile Include="Program.cs" /> |     <Compile Include="Program.cs" /> | ||||||
|     <Compile Include="Properties\AssemblyInfo.cs" /> |     <Compile Include="Properties\AssemblyInfo.cs" /> | ||||||
|     <Compile Include="Downloader.cs" /> |     <Compile Include="Downloader.cs" /> | ||||||
|  |     <Compile Include="strings.Designer.cs"> | ||||||
|  |       <AutoGen>True</AutoGen> | ||||||
|  |       <DesignTime>True</DesignTime> | ||||||
|  |       <DependentUpon>strings.resx</DependentUpon> | ||||||
|  |     </Compile> | ||||||
|  |     <Compile Include="strings.en-US.Designer.cs"> | ||||||
|  |       <AutoGen>True</AutoGen> | ||||||
|  |       <DesignTime>True</DesignTime> | ||||||
|  |       <DependentUpon>strings.en-US.resx</DependentUpon> | ||||||
|  |     </Compile> | ||||||
|  |     <Compile Include="strings.zh-TW.Designer.cs"> | ||||||
|  |       <AutoGen>True</AutoGen> | ||||||
|  |       <DesignTime>True</DesignTime> | ||||||
|  |       <DependentUpon>strings.zh-TW.resx</DependentUpon> | ||||||
|  |     </Compile> | ||||||
|     <Compile Include="Watcher.cs" /> |     <Compile Include="Watcher.cs" /> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
| @@ -82,9 +108,6 @@ | |||||||
|     </None> |     </None> | ||||||
|     <None Include="packages.config" /> |     <None Include="packages.config" /> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <ItemGroup> |  | ||||||
|     <None Include="bin\Debug\Newtonsoft.Json.dll" /> |  | ||||||
|   </ItemGroup> |  | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <COMReference Include="Scripting"> |     <COMReference Include="Scripting"> | ||||||
|       <Guid>{420B2830-E718-11CF-893D-00A0C9054228}</Guid> |       <Guid>{420B2830-E718-11CF-893D-00A0C9054228}</Guid> | ||||||
| @@ -99,5 +122,27 @@ | |||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <Content Include="logo_3Iv_icon.ico" /> |     <Content Include="logo_3Iv_icon.ico" /> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <EmbeddedResource Include="strings.en-US.resx"> | ||||||
|  |       <Generator>ResXFileCodeGenerator</Generator> | ||||||
|  |       <LastGenOutput>strings.en-US.Designer.cs</LastGenOutput> | ||||||
|  |     </EmbeddedResource> | ||||||
|  |     <EmbeddedResource Include="strings.resx"> | ||||||
|  |       <Generator>ResXFileCodeGenerator</Generator> | ||||||
|  |       <LastGenOutput>strings.Designer.cs</LastGenOutput> | ||||||
|  |     </EmbeddedResource> | ||||||
|  |     <EmbeddedResource Include="strings.zh-TW.resx"> | ||||||
|  |       <Generator>ResXFileCodeGenerator</Generator> | ||||||
|  |       <LastGenOutput>strings.zh-TW.Designer.cs</LastGenOutput> | ||||||
|  |     </EmbeddedResource> | ||||||
|  |   </ItemGroup> | ||||||
|   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> |   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> | ||||||
|  |   <Import Project="..\packages\Fody.6.0.0\build\Fody.targets" Condition="Exists('..\packages\Fody.6.0.0\build\Fody.targets')" /> | ||||||
|  |   <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> | ||||||
|  |     <PropertyGroup> | ||||||
|  |       <ErrorText>这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。</ErrorText> | ||||||
|  |     </PropertyGroup> | ||||||
|  |     <Error Condition="!Exists('..\packages\Fody.6.0.0\build\Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Fody.6.0.0\build\Fody.targets'))" /> | ||||||
|  |     <Error Condition="!Exists('..\packages\Costura.Fody.4.1.0\build\Costura.Fody.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Costura.Fody.4.1.0\build\Costura.Fody.props'))" /> | ||||||
|  |   </Target> | ||||||
| </Project> | </Project> | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -10,7 +10,7 @@ using System.Runtime.InteropServices; | |||||||
| [assembly: AssemblyConfiguration("")] | [assembly: AssemblyConfiguration("")] | ||||||
| [assembly: AssemblyCompany("nilaoda")] | [assembly: AssemblyCompany("nilaoda")] | ||||||
| [assembly: AssemblyProduct("N_m3u8DL-CLI")] | [assembly: AssemblyProduct("N_m3u8DL-CLI")] | ||||||
| [assembly: AssemblyCopyright("Copyright ©  2019")] | [assembly: AssemblyCopyright("Copyright ©  2020")] | ||||||
| [assembly: AssemblyTrademark("")] | [assembly: AssemblyTrademark("")] | ||||||
| [assembly: AssemblyCulture("")] | [assembly: AssemblyCulture("")] | ||||||
|  |  | ||||||
| @@ -33,4 +33,4 @@ using System.Runtime.InteropServices; | |||||||
| // 方法是按如下所示使用“*”: : | // 方法是按如下所示使用“*”: : | ||||||
| // [assembly: AssemblyVersion("1.0.*")] | // [assembly: AssemblyVersion("1.0.*")] | ||||||
| [assembly: AssemblyVersion("1.0.0.0")] | [assembly: AssemblyVersion("1.0.0.0")] | ||||||
| [assembly: AssemblyFileVersion("1.0.0.0")] | [assembly: AssemblyFileVersion("2.7.0.0")] | ||||||
|   | |||||||
							
								
								
									
										311
									
								
								N_m3u8DL-CLI/changelog.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										311
									
								
								N_m3u8DL-CLI/changelog.txt
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,4 +1,7 @@ | |||||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||||
| <packages> | <packages> | ||||||
|  |   <package id="Fody" version="6.0.0" targetFramework="net46" developmentDependency="true" /> | ||||||
|  |   <package id="Costura.Fody" version="4.1.0" targetFramework="net46" /> | ||||||
|  |   <package id="Newtonsoft.Json" version="12.0.3" targetFramework="net46" /> | ||||||
|   <package id="NiL.JS" version="2.5.1428" targetFramework="net46" /> |   <package id="NiL.JS" version="2.5.1428" targetFramework="net46" /> | ||||||
| </packages> | </packages> | ||||||
							
								
								
									
										541
									
								
								N_m3u8DL-CLI/strings.Designer.cs
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										541
									
								
								N_m3u8DL-CLI/strings.Designer.cs
									
									
									
										generated
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										0
									
								
								N_m3u8DL-CLI/strings.en-US.Designer.cs
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								N_m3u8DL-CLI/strings.en-US.Designer.cs
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
								
								
									
										301
									
								
								N_m3u8DL-CLI/strings.en-US.resx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										301
									
								
								N_m3u8DL-CLI/strings.en-US.resx
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										302
									
								
								N_m3u8DL-CLI/strings.resx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										302
									
								
								N_m3u8DL-CLI/strings.resx
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										0
									
								
								N_m3u8DL-CLI/strings.zh-TW.Designer.cs
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								N_m3u8DL-CLI/strings.zh-TW.Designer.cs
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
								
								
									
										302
									
								
								N_m3u8DL-CLI/strings.zh-TW.resx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										302
									
								
								N_m3u8DL-CLI/strings.zh-TW.resx
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -26,6 +26,7 @@ | |||||||
| 一个**简单易用的**m3u8下载器,下载地址:https://github.com/nilaoda/N_m3u8DL-CLI/releases   | 一个**简单易用的**m3u8下载器,下载地址:https://github.com/nilaoda/N_m3u8DL-CLI/releases   | ||||||
|  |  | ||||||
| 支持下载m3u8链接或文件为`mp4`或`ts`格式,并提供丰富的命令行选项。 | 支持下载m3u8链接或文件为`mp4`或`ts`格式,并提供丰富的命令行选项。 | ||||||
|  |   * **不支持**优酷视频解密 | ||||||
|   * 支持`AES-128-CBC`加密自动解密 |   * 支持`AES-128-CBC`加密自动解密 | ||||||
|   * 支持多线程下载 |   * 支持多线程下载 | ||||||
|   * 支持下载限速 |   * 支持下载限速 | ||||||
| @@ -39,7 +40,6 @@ | |||||||
|   * 支持下载外挂字幕轨道、音频轨道 |   * 支持下载外挂字幕轨道、音频轨道 | ||||||
|   * 支持仅合并为音频 |   * 支持仅合并为音频 | ||||||
|   * 自动使用系统代理(可禁止) |   * 自动使用系统代理(可禁止) | ||||||
|   * 针对国内视频网站`m3u8`进行了优化 |  | ||||||
|   * 提供SimpleG简易的`GUI`生成常用参数 |   * 提供SimpleG简易的`GUI`生成常用参数 | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -61,11 +61,11 @@ N_m3u8DL-CLI.exe <URL|JSON|FILE> [OPTIONS] | |||||||
|     --muxSetJson File           使用外部json文件定义混流选项 |     --muxSetJson File           使用外部json文件定义混流选项 | ||||||
|     --useKeyFile File           使用外部16字节文件定义AES-128解密KEY |     --useKeyFile File           使用外部16字节文件定义AES-128解密KEY | ||||||
|     --useKeyBase64 Base64String 使用Base64字符串定义AES-128解密KEY |     --useKeyBase64 Base64String 使用Base64字符串定义AES-128解密KEY | ||||||
|  |     --useKeyIV     HEXString    使用HEX字符串定义AES-128解密IV | ||||||
|     --downloadRange Range       仅下载视频的一部分分片或长度 |     --downloadRange Range       仅下载视频的一部分分片或长度 | ||||||
|     --liveRecDur HH:MM:SS       直播录制时,达到此长度自动退出软件 |     --liveRecDur HH:MM:SS       直播录制时,达到此长度自动退出软件 | ||||||
|     --stopSpeed  Number         当速度低于此值时,重试(单位为KB/s) |     --stopSpeed  Number         当速度低于此值时,重试(单位为KB/s) | ||||||
|     --maxSpeed   Number         设置下载速度上限(单位为KB/s) |     --maxSpeed   Number         设置下载速度上限(单位为KB/s) | ||||||
|     --enableYouKuAes            使用优酷AES-128解密方案 |  | ||||||
|     --enableDelAfterDone        开启下载后删除临时文件夹的功能 |     --enableDelAfterDone        开启下载后删除临时文件夹的功能 | ||||||
|     --enableMuxFastStart        开启混流mp4的FastStart特性 |     --enableMuxFastStart        开启混流mp4的FastStart特性 | ||||||
|     --enableBinaryMerge         开启二进制合并分片 |     --enableBinaryMerge         开启二进制合并分片 | ||||||
|   | |||||||
| @@ -43,6 +43,7 @@ N_m3u8DL-CLI.exe <URL|JSON|FILE> [OPTIONS] | |||||||
|     --muxSetJson File           Set a json file for mux |     --muxSetJson File           Set a json file for mux | ||||||
|     --useKeyFile File           Use 16 bytes file as KEY for AES-128 decryption |     --useKeyFile File           Use 16 bytes file as KEY for AES-128 decryption | ||||||
|     --useKeyBase64 Base64String Use Base64 String as KEY for AES-128 decryption |     --useKeyBase64 Base64String Use Base64 String as KEY for AES-128 decryption | ||||||
|  |     --useKeyIV     HEXString    Use HEX String as IV for AES-128 decryption | ||||||
|     --downloadRange Range       Set range for a video |     --downloadRange Range       Set range for a video | ||||||
|     --stopSpeed  Number         Speed below this, retry(KB/s) |     --stopSpeed  Number         Speed below this, retry(KB/s) | ||||||
|     --maxSpeed   Number         Set max download speed(KB/s) |     --maxSpeed   Number         Set max download speed(KB/s) | ||||||
|   | |||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										555
									
								
								docs/GetM3u8.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										555
									
								
								docs/GetM3u8.html
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user