diff --git a/Plain Craft Launcher 2/Application.xaml.vb b/Plain Craft Launcher 2/Application.xaml.vb index 568af5a6..b3e296ca 100644 --- a/Plain Craft Launcher 2/Application.xaml.vb +++ b/Plain Craft Launcher 2/Application.xaml.vb @@ -96,6 +96,12 @@ Public Class Application End If '动态 DLL 调用 AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf AssemblyResolve + SetDllDirectory(Path & "PCL\") + If Is32BitSystem Then + File.WriteAllBytes(Path & "PCL\libwebp.dll", GetResources("libwebp32")) + Else + File.WriteAllBytes(Path & "PCL\libwebp.dll", GetResources("libwebp64")) + End If '日志初始化 LogStart() '添加日志 @@ -171,9 +177,11 @@ Public Class Application Private Shared AssemblyNAudio As Assembly Private Shared AssemblyJson As Assembly Private Shared AssemblyDialog As Assembly + Private Shared AssemblyWebp As Assembly Private Shared ReadOnly AssemblyNAudioLock As New Object Private Shared ReadOnly AssemblyJsonLock As New Object Private Shared ReadOnly AssemblyDialogLock As New Object + Private Shared ReadOnly AssemblyWebpLock As New Object Public Shared Function AssemblyResolve(sender As Object, args As ResolveEventArgs) As Assembly If args.Name.StartsWithF("NAudio") Then SyncLock AssemblyNAudioLock @@ -199,6 +207,14 @@ Public Class Application End If Return AssemblyDialog End SyncLock + ElseIf args.Name.StartsWithF("Imazen.WebP") Then + SyncLock AssemblyWebpLock + If AssemblyWebp Is Nothing Then + Log("[Start] 加载 DLL:Imazen.WebP") + AssemblyWebp = Assembly.Load(GetResources("WebP")) + End If + Return AssemblyWebp + End SyncLock Else Return Nothing End If diff --git a/Plain Craft Launcher 2/FormMain.xaml.vb b/Plain Craft Launcher 2/FormMain.xaml.vb index ee69501b..e57bc968 100644 --- a/Plain Craft Launcher 2/FormMain.xaml.vb +++ b/Plain Craft Launcher 2/FormMain.xaml.vb @@ -10,6 +10,16 @@ Public Class FormMain Dim FeatureList As New List(Of KeyValuePair(Of Integer, String)) '统计更新日志条目 #If BETA Then + If LastVersion < 336 Then 'Release 2.8.6 + FeatureList.Add(New KeyValuePair(Of Integer, String)(4, "下载 Mod 时会使用 MCIM 国内镜像源")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(4, "Mod 管理页面允许筛选可更新/启用/禁用的 Mod")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "打开 PCL 时会自动安装同目录下的 modpack.zip")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "爱发电域名迁移至 afdian.com")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复 1.20.1+ 离线登录使用正版皮肤时无法保存游戏的 Bug")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复安装的 1.14~1.15 Forge+OptiFine 无法进入世界的 Bug")) + FeatureCount += 19 + BugCount += 24 + End If If LastVersion < 332 Then 'Release 2.8.3 If LastVersion = 330 Then FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "修复部分玩家无法启动 MC 的 Bug")) End If @@ -124,6 +134,9 @@ Public Class FormMain '3:BUG+ IMP* FEAT- '2:BUG* IMP- '1:BUG- + If LastVersion < 335 Then 'Snapshot 2.8.6 + BugCount += 2 + End If If LastVersion < 334 Then 'Snapshot 2.8.5 FeatureList.Add(New KeyValuePair(Of Integer, String)(4, "Mod 管理页面允许筛选可更新/启用/禁用的 Mod")) If LastVersion = 333 Then diff --git a/Plain Craft Launcher 2/Modules/Base/ModBase.vb b/Plain Craft Launcher 2/Modules/Base/ModBase.vb index 2bad9a6d..4538e224 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModBase.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModBase.vb @@ -11,13 +11,13 @@ Public Module ModBase #Region "声明" '下列版本信息由更新器自动修改 - Public Const VersionBaseName As String = "2.8.5" '不含分支前缀的显示用版本名 - Public Const VersionStandardCode As String = "2.8.5." & VersionBranchCode '标准格式的四段式版本号 + Public Const VersionBaseName As String = "2.8.6" '不含分支前缀的显示用版本名 + Public Const VersionStandardCode As String = "2.8.6." & VersionBranchCode '标准格式的四段式版本号 Public Const CommitHash As String = "" 'Commit Hash #If BETA Then - Public Const VersionCode As Integer = 332 'Release + Public Const VersionCode As Integer = 336 'Release #Else - Public Const VersionCode As Integer = 334 'Snapshot + Public Const VersionCode As Integer = 335 'Snapshot #End If '自动生成的版本信息 Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb index c614d63c..26cd470a 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb @@ -506,6 +506,7 @@ NextInner: End If '尝试登录 Dim OAuthTokens As String() + Dim ClientId As String = "" If Input.OAuthRefreshToken = "" Then '无 RefreshToken Relogin: @@ -513,10 +514,10 @@ Relogin: If OAuthCode = "Cancel" Then Exit Sub If Data.IsAborted Then Throw New ThreadInterruptedException Data.Progress = 0.2 - OAuthTokens = MsLoginStep2(OAuthCode, False) + OAuthTokens = MsLoginStep2(OAuthCode, False, ClientId) Else '有 RefreshToken - OAuthTokens = MsLoginStep2(Input.OAuthRefreshToken, True) + OAuthTokens = MsLoginStep2(Input.OAuthRefreshToken, True, ClientId) End If '要求重新打开登录网页认证 If OAuthTokens(0) = "Cancel" Then Exit Sub @@ -837,39 +838,59 @@ LoginFinish: Return RegexSeek(Result, "(?<=code\=)[^&]+") End If End Function + '微软登录步骤 2:从 OAuth Code 或 OAuth RefreshToken 获取 {OAuth AccessToken, OAuth RefreshToken} - Private Function MsLoginStep2(Code As String, IsRefresh As Boolean) As String() + Private Function MsLoginStep2(Code As String, IsRefresh As Boolean, ClientId As String, Optional ExpiresIn As String = "900") As String() McLaunchLog("开始微软登录步骤 2(" & If(IsRefresh, "", "非") & "刷新登录)") Dim Request As String If IsRefresh Then - Request = "client_id=00000000402b5328" & "&" & + Request = "grant_type=refresh_token" & "&" & + "client_id=" & ClientId & "&" & + "device_code=" & Code & "&" & "refresh_token=" & Uri.EscapeDataString(Code) & "&" & - "grant_type=refresh_token" & "&" & - "redirect_uri=" & Uri.EscapeDataString("https://login.live.com/oauth20_desktop.srf") & "&" & - "scope=" & Uri.EscapeDataString("service::user.auth.xboxlive.com::MBI_SSL") + "scope=XboxLive.signin%20offline_access" Else - Request = "client_id=00000000402b5328" & "&" & - "code=" & Uri.EscapeDataString(Code) & "&" & - "grant_type=authorization_code" & "&" & - "redirect_uri=" & Uri.EscapeDataString("https://login.live.com/oauth20_desktop.srf") & "&" & - "scope=" & Uri.EscapeDataString("service::user.auth.xboxlive.com::MBI_SSL") + Request = "grant_type=urn:ietf:params:oauth:grant-type:device_code" & "&" & + "client_id=" & ClientId & "&" & + "device_code=" & Code & "&" & + "scope=XboxLive.signin%20offline_access" End If Dim Result As String - Try - Result = NetRequestMulty("https://login.live.com/oauth20_token.srf", "POST", Request, "application/x-www-form-urlencoded", 2) - Catch ex As Exception - If ex.Message.Contains("must sign in again") OrElse ex.Message.Contains("invalid_grant") Then '#269 - Return {"Relogin", ""} - Else - Throw + Dim stopwatch As Stopwatch = Stopwatch.StartNew() + + While stopwatch.Elapsed < TimeSpan.FromSeconds(ExpiresIn) + Try + Result = NetRequestMulty("https://login.microsoftonline.com/consumers/oauth2/v2.0/token", "POST", Request, "application/x-www-form-urlencoded", 2) + Catch ex As Exception + If ex.Message.Contains("must sign in again") OrElse ex.Message.Contains("invalid_grant") Then '#269 + Return {"Relogin", ""} + ElseIf ex.Message.Contains("authorization_declined") Then + Hint("你拒绝了 PCL2 的访问权限申请,验证过程被中断!") + Return {"Cancel", ""} + ElseIf ex.Message.Contains("expired_token") Then + Hint("Token 已过期,请尝试重新验证!") + Exit While + ElseIf ex.Message.Contains("AADSTS70016") Then + Continue While + Else + Throw + End If + End Try + + If Result IsNot Nothing Then + Dim ResultJson As JObject = GetJson(Result) + Dim AccessToken As String = ResultJson("access_token").ToString + Dim RefreshToken As String = ResultJson("refresh_token").ToString + Return {AccessToken, RefreshToken} End If - End Try - Dim ResultJson As JObject = GetJson(Result) - Dim AccessToken As String = ResultJson("access_token").ToString - Dim RefreshToken As String = ResultJson("refresh_token").ToString - Return {AccessToken, RefreshToken} + Thread.Sleep(1000) + End While + + Hint("验证超时,请尝试重新验证!") + Return {"Cancel", ""} + End Function ''微软登录步骤 1:获取 DeviceCode 并显示验证提示 diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index 27b9f872..4b82a949 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -260,7 +260,7 @@ Retry: '获取 Mod 下载信息 ModDownloadLoaders.Add(New LoaderTask(Of Integer, JArray)("获取 Mod 下载信息", Sub(Task As LoaderTask(Of Integer, JArray)) - Task.Output = GetJson(NetRequestRetry("https://api.curseforge.com/v1/mods/files", "POST", "{""fileIds"": [" & Join(ModList, ",") & "]}", "application/json"))("data") + Task.Output = GetJson(DlModRequest("https://api.curseforge.com/v1/mods/files", "POST", "{""fileIds"": [" & Join(ModList, ",") & "]}", "application/json"))("data") '如果文件已被删除,则 API 会跳过那一项 If ModList.Count > Task.Output.Count Then Throw New Exception("整合包所需要的部分 Mod 版本已被 Mod 作者删除,因此无法完成整合包安装,请联系整合包作者更新整合包中的 Mod 版本") End Sub) With {.ProgressWeight = ModList.Count / 10}) '每 10 Mod 需要 1s diff --git a/Plain Craft Launcher 2/Modules/Minecraft/MyCompItem.xaml.vb b/Plain Craft Launcher 2/Modules/Minecraft/MyCompItem.xaml.vb index 6bf0f720..ee52b361 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/MyCompItem.xaml.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/MyCompItem.xaml.vb @@ -18,9 +18,6 @@ '网络图片 If File.Exists(FileAddress) Then PathLogo.Source = New MyBitmap(FileAddress) - ElseIf _Logo.EndsWithF(".webp", True) Then 'Modrinth 林业 Mod 使用了不支持的 WebP 格式 Logo - Log($"[Comp] 发现不支持的 WebP 格式图标,已更改为默认图标:{_Logo}") - PathLogo.Source = New MyBitmap(PathImage & "Icons/NoIcon.png") Else PathLogo.Source = New MyBitmap(PathImage & "Icons/NoIcon.png") RunInNewThread(Sub() LogoLoader(FileAddress), "Comp Logo Loader " & Uuid & "#", ThreadPriority.BelowNormal) @@ -58,6 +55,12 @@ RetryStart: End If '下载图片 NetDownload(Url, LocalFileAddress & DownloadEnd, True) + If Url.EndsWithF("webp") Then + Log($"[Comp] Webp 格式转换:{LocalFileAddress}") + Dim dec = New Imazen.WebP.SimpleDecoder() + Dim picFile = File.ReadAllBytes(LocalFileAddress & DownloadEnd) + dec.DecodeFromBytes(picFile, picFile.Length).Save(LocalFileAddress & DownloadEnd) + End If Dim LoadError As Exception = Nothing RunInUiWait( Sub() diff --git a/Plain Craft Launcher 2/Modules/Minecraft/MyLocalModItem.xaml.vb b/Plain Craft Launcher 2/Modules/Minecraft/MyLocalModItem.xaml.vb index 016f81ab..a623f042 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/MyLocalModItem.xaml.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/MyLocalModItem.xaml.vb @@ -20,9 +20,6 @@ Public Class MyLocalModItem '网络图片 If File.Exists(FileAddress) Then PathLogo.Source = New MyBitmap(FileAddress) - ElseIf _Logo.EndsWithF(".webp", True) Then 'Modrinth 林业 Mod 使用了不支持的 WebP 格式 Logo - Log($"[LocalModItem] 发现不支持的 WebP 格式图标,已更改为默认图标:{_Logo}") - PathLogo.Source = New MyBitmap(PathImage & "Icons/NoIcon.png") Else PathLogo.Source = New MyBitmap(PathImage & "Icons/NoIcon.png") RunInNewThread(Sub() LogoLoader(FileAddress), "Comp Logo Loader " & Uuid & "#", ThreadPriority.BelowNormal) @@ -60,6 +57,12 @@ RetryStart: End If '下载图片 NetDownload(Url, LocalFileAddress & DownloadEnd, True) + If Url.EndsWithF("webp") Then + Log($"[Comp] Webp 格式转换:{LocalFileAddress}") + Dim dec = New Imazen.WebP.SimpleDecoder() + Dim picFile = File.ReadAllBytes(LocalFileAddress & DownloadEnd) + dec.DecodeFromBytes(picFile, picFile.Length).Save(LocalFileAddress & DownloadEnd) + End If Dim LoadError As Exception = Nothing RunInUiWait( Sub() diff --git a/Plain Craft Launcher 2/Modules/ModMain.vb b/Plain Craft Launcher 2/Modules/ModMain.vb index a9718867..21362135 100644 --- a/Plain Craft Launcher 2/Modules/ModMain.vb +++ b/Plain Craft Launcher 2/Modules/ModMain.vb @@ -798,6 +798,8 @@ NextFile: Public Declare Function SetForegroundWindow Lib "user32" (hWnd As IntPtr) As Integer Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (hWnd As IntPtr, msg As UInteger, wParam As Long, lParam As Long) As Boolean + Public Declare Function SetDllDirectory Lib "kernel32" Alias "SetDllDirectoryA" (lpPathName As String) As Boolean + #End Region Public DragControl = Nothing diff --git a/Plain Craft Launcher 2/My Project/AssemblyInfo.vb b/Plain Craft Launcher 2/My Project/AssemblyInfo.vb index 1f07bf58..205f3bae 100644 --- a/Plain Craft Launcher 2/My Project/AssemblyInfo.vb +++ b/Plain Craft Launcher 2/My Project/AssemblyInfo.vb @@ -51,6 +51,6 @@ Imports System.Runtime.InteropServices ' 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 ' 方法是按如下所示使用“*” - - + + diff --git a/Plain Craft Launcher 2/My Project/Resources.Designer.vb b/Plain Craft Launcher 2/My Project/Resources.Designer.vb index 033f9101..990f9b4e 100644 --- a/Plain Craft Launcher 2/My Project/Resources.Designer.vb +++ b/Plain Craft Launcher 2/My Project/Resources.Designer.vb @@ -120,6 +120,26 @@ Namespace My.Resources End Get End Property + ''' + ''' 查找 System.Byte[] 类型的本地化资源。 + ''' + Friend ReadOnly Property libwebp32() As Byte() + Get + Dim obj As Object = ResourceManager.GetObject("libwebp32", resourceCulture) + Return CType(obj,Byte()) + End Get + End Property + + ''' + ''' 查找 System.Byte[] 类型的本地化资源。 + ''' + Friend ReadOnly Property libwebp64() As Byte() + Get + Dim obj As Object = ResourceManager.GetObject("libwebp64", resourceCulture) + Return CType(obj,Byte()) + End Get + End Property + ''' ''' 查找 System.Byte[] 类型的本地化资源。 ''' @@ -149,5 +169,15 @@ Namespace My.Resources Return CType(obj,Byte()) End Get End Property + + ''' + ''' 查找 System.Byte[] 类型的本地化资源。 + ''' + Friend ReadOnly Property WebP() As Byte() + Get + Dim obj As Object = ResourceManager.GetObject("WebP", resourceCulture) + Return CType(obj,Byte()) + End Get + End Property End Module End Namespace diff --git a/Plain Craft Launcher 2/My Project/Resources.resx b/Plain Craft Launcher 2/My Project/Resources.resx index 66663f31..d15494b6 100644 --- a/Plain Craft Launcher 2/My Project/Resources.resx +++ b/Plain Craft Launcher 2/My Project/Resources.resx @@ -136,6 +136,12 @@ ..\Resources\Newtonsoft.Json.dll;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Resources\libwebp32.dll;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\libwebp64.dll;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + ..\Resources\ModData.txt;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -145,4 +151,7 @@ ..\Resources\transformer.jar;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Resources\Imazen.WebP.dll;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml b/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml index f693f703..0398d5e7 100644 --- a/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml +++ b/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml @@ -104,91 +104,81 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb b/Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb index 1e335a0a..468908de 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb +++ b/Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb @@ -86,7 +86,7 @@ {"LaunchArgumentWindowHeight", New SetupEntry(480)}, {"LaunchArgumentWindowType", New SetupEntry(1)}, {"LaunchArgumentRam", New SetupEntry(False, Source:=SetupSource.Registry)}, - {"LaunchAdvanceJvm", New SetupEntry("-XX:+UseG1GC -XX:-UseAdaptiveSizePolicy -XX:-OmitStackTraceInFastThrow -Dfml.ignoreInvalidMinecraftCertificates=True -Dfml.ignorePatchDiscrepancies=True -Dlog4j2.formatMsgNoLookups=true")}, + {"LaunchAdvanceJvm", New SetupEntry("-XX:+UseG1GC -XX:-UseAdaptiveSizePolicy -XX:-OmitStackTraceInFastThrow -Djdk.lang.Process.allowAmbiguousCommands=true -Dfml.ignoreInvalidMinecraftCertificates=True -Dfml.ignorePatchDiscrepancies=True -Dlog4j2.formatMsgNoLookups=true")}, {"LaunchAdvanceGame", New SetupEntry("")}, {"LaunchAdvanceRun", New SetupEntry("")}, {"LaunchAdvanceRunWait", New SetupEntry(True)}, diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb index 0bf1a50c..a7a81f4f 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb @@ -647,6 +647,7 @@ SelectedMods.Remove(ModEntity.RawFileName) '更改 Loader 和 UI 中的列表 McModLoader.Output.Remove(ModEntity) + SearchResult?.Remove(ModEntity) ModItems.Remove(ModEntity.RawFileName) Dim IndexOfUi As Integer = PanList.Children.IndexOf(PanList.Children.OfType(Of MyLocalModItem).FirstOrDefault(Function(i) i.Entry.Equals(ModEntity))) If IndexOfUi >= 0 Then PanList.Children.RemoveAt(IndexOfUi) diff --git a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj index 8246a859..bc74b16e 100644 --- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj +++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj @@ -140,6 +140,10 @@ false + + False + Resources\Imazen.WebP.dll + False False @@ -185,9 +189,6 @@ MyIconTextButton.xaml - - - @@ -472,7 +473,6 @@ FormMain.xaml Code - MSBuild:Compile Designer @@ -927,7 +927,9 @@ - + + + diff --git a/Plain Craft Launcher 2/Resources/Imazen.WebP.dll b/Plain Craft Launcher 2/Resources/Imazen.WebP.dll new file mode 100644 index 00000000..ac7cf07f Binary files /dev/null and b/Plain Craft Launcher 2/Resources/Imazen.WebP.dll differ diff --git a/Plain Craft Launcher 2/Resources/libwebp32.dll b/Plain Craft Launcher 2/Resources/libwebp32.dll new file mode 100644 index 00000000..9ebce902 Binary files /dev/null and b/Plain Craft Launcher 2/Resources/libwebp32.dll differ diff --git a/Plain Craft Launcher 2/Resources/libwebp64.dll b/Plain Craft Launcher 2/Resources/libwebp64.dll new file mode 100644 index 00000000..d3e2d477 Binary files /dev/null and b/Plain Craft Launcher 2/Resources/libwebp64.dll differ diff --git "a/\346\234\200\346\226\260\346\255\243\345\274\217\347\211\210.zip" "b/\346\234\200\346\226\260\346\255\243\345\274\217\347\211\210.zip" index f4ca635a..252209cd 100644 Binary files "a/\346\234\200\346\226\260\346\255\243\345\274\217\347\211\210.zip" and "b/\346\234\200\346\226\260\346\255\243\345\274\217\347\211\210.zip" differ