From a8aeceb617fd508b31339c74a2f80adc56f64c00 Mon Sep 17 00:00:00 2001 From: hama3254 <52826614+hama3254@users.noreply.github.com> Date: Sun, 28 Apr 2024 21:29:33 +0200 Subject: [PATCH] added token reusing, added error handling (.key files) added reusing the access token (valid 300s in usage for ~270s) added renewing the access token (via refresh token) added .key file error detection (critical issue) minor cleanup --- .vs/Crunchyroll Downloader/v17/.suo | Bin 236032 -> 240640 bytes Crunchyroll Downloader/Anime_Add.vb | 2 +- Crunchyroll Downloader/App.config | 3 - Crunchyroll Downloader/Browser.vb | 58 +- Crunchyroll Downloader/CRD-Classes.vb | 19 + Crunchyroll Downloader/CRD_List_Item.vb | 48 +- Crunchyroll Downloader/Main.designer.vb | 21 +- Crunchyroll Downloader/Main.resx | 14 +- Crunchyroll Downloader/Main.vb | 576 ++++++++---------- .../My Project/AssemblyInfo.vb | 4 +- .../My Project/Settings.Designer.vb | 12 - .../My Project/Settings.settings | 3 - 12 files changed, 315 insertions(+), 445 deletions(-) diff --git a/.vs/Crunchyroll Downloader/v17/.suo b/.vs/Crunchyroll Downloader/v17/.suo index ff8f74f4770c18648ce3c2f6bd2ee37b4a7a8e39..ba5d98f842e483027b9912324ab7b1e0fde5cf1d 100644 GIT binary patch delta 12016 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 False - - False - 0 diff --git a/Crunchyroll Downloader/Browser.vb b/Crunchyroll Downloader/Browser.vb index 4283a11..bb740cc 100644 --- a/Crunchyroll Downloader/Browser.vb +++ b/Crunchyroll Downloader/Browser.vb @@ -20,8 +20,8 @@ Public Class Browser Private Sub WebView2_CoreWebView2InitializationCompleted(sender As Object, e As CoreWebView2InitializationCompletedEventArgs) Handles WebView2.CoreWebView2InitializationCompleted Try WebView2.CoreWebView2.AddWebResourceRequestedFilter("https://www.crunchyroll.com/*", CoreWebView2WebResourceContext.All) - AddHandler WebView2.CoreWebView2.WebResourceResponseReceived, AddressOf ObserveResponse - AddHandler WebView2.CoreWebView2.WebResourceRequested, AddressOf ObserveHttp + 'AddHandler WebView2.CoreWebView2.WebResourceResponseReceived, AddressOf ObserveResponse + 'AddHandler WebView2.CoreWebView2.WebResourceRequested, AddressOf ObserveHttp 'this is not the data we are looking for (anymore :( ) My.Settings.User_Agend = Chr(34) + "User-Agent: " + WebView2.CoreWebView2.Settings.UserAgent + Chr(34) If WebView2.CoreWebView2.Source = "about:blank" Or WebView2.CoreWebView2.Source = Nothing Then @@ -162,60 +162,6 @@ Public Class Browser End Sub - Private Async Sub ObserveResponse(ByVal sender As Object, ByVal e As CoreWebView2WebResourceResponseReceivedEventArgs) - - - If CBool(InStr(Main.LoadingUrl, "crunchyroll.com")) Then - - - - If CBool(InStr(e.Request.Uri, "crunchyroll.com/")) And CBool(InStr(e.Request.Uri, "v1/token")) And Main.CR_v1Token = "Get" Then - Debug.WriteLine("Crunchyroll-v1_token: " + e.Request.Uri) - Dim Content As Stream = Await e.Response.GetContentAsync - Dim ContentString As String = Nothing - Dim reader As New StreamReader(Content) - ContentString = reader.ReadToEnd - - Dim Loc_CR_Cookies = " -H " + Chr(34) + Main.CR_Cookies + Chr(34) - Dim Token() As String = ContentString.Split(New String() {Chr(34) + "access_token" + Chr(34) + ":" + Chr(34)}, System.StringSplitOptions.RemoveEmptyEntries) - Dim Token2() As String = Token(1).Split(New String() {Chr(34) + "," + Chr(34)}, System.StringSplitOptions.RemoveEmptyEntries) - - Dim Auth As String = "Bearer " + Token2(0) - Dim Auth2 As String = " -H " + Chr(34) + "Authorization: " + Auth + Chr(34) - Main.ProcessLoading(Main.LoadingUrl, Auth2, Loc_CR_Cookies, 0) - Main.CR_v1Token = "" - Exit Sub - - - ElseIf CBool(InStr(e.Request.Uri, "crunchyroll.com/")) And CBool(InStr(e.Request.Uri, "seasons?preferred_audio_language=")) And CBool(InStr(Main.LoadingUrl, "/series/")) Then - Debug.WriteLine("Crunchyroll-Season: " + e.Request.Uri) - Main.LoadedUrls.Add(e.Request) - - Exit Sub - 'ElseIf CBool(InStr(e.Request.Uri, "crunchyroll.com/")) And CBool(InStr(e.Request.Uri, "content/v2/cms/objects/")) Then - ' Debug.WriteLine("Crunchyroll-objects added to cache: " + e.Request.Uri) - ' Main.LoadedUrls.Add(e.Request) - - ' Exit Sub - 'ElseIf CBool(InStr(e.Request.Uri, "crunchyroll.com/")) And CBool(InStr(e.Request.Uri, "seasons?preferred_audio_language=")) And CBool(InStr(Main.LoadingUrl, "/series/")) Then - ' Debug.WriteLine("Crunchyroll-objects added to cache: " + e.Request.Uri) - ' Main.LoadedUrls.Add(e.Request) - - ' Exit Sub - End If - - - - End If - - End Sub - - - - - - - Private Sub ObserveHttp(ByVal sender As Object, ByVal e As CoreWebView2WebResourceRequestedEventArgs) 'Handles RequestResource.GetUrl diff --git a/Crunchyroll Downloader/CRD-Classes.vb b/Crunchyroll Downloader/CRD-Classes.vb index 33f5995..5484cee 100644 --- a/Crunchyroll Downloader/CRD-Classes.vb +++ b/Crunchyroll Downloader/CRD-Classes.vb @@ -35,6 +35,25 @@ Public Class CR_Beta_Stream End Class + +Public Class CR_Tokens + + Public access_token As String + Public refresh_token As String + Public expires_Unix As Integer + + Public Sub New(ByVal access_token As String, ByVal refresh_token As String, ByVal expires_Unix As Integer) + Me.access_token = access_token + Me.refresh_token = refresh_token + Me.expires_Unix = expires_Unix + End Sub + + Public Overrides Function ToString() As String + Return String.Format("{0}, {1}, {2}", Me.access_token, Me.refresh_token, Me.expires_Unix.ToString) + End Function + +End Class + Public Class CR_MediaVersion Public AudioLang As String diff --git a/Crunchyroll Downloader/CRD_List_Item.vb b/Crunchyroll Downloader/CRD_List_Item.vb index 05bcdb2..220d18f 100644 --- a/Crunchyroll Downloader/CRD_List_Item.vb +++ b/Crunchyroll Downloader/CRD_List_Item.vb @@ -31,10 +31,15 @@ Public Class CRD_List_Item Dim TempFolder As String = Nothing Dim DownloadPfad As String = Nothing Dim ThumbnailSource As String = Nothing + Dim Failed As Boolean = False Dim FailedCount As Integer = 0 + + Dim FailedKey As Boolean = False + Dim HistoryDL_URL As String Dim HistoryDL_Pfad As String + Dim HistoryFilename As String Dim Retry As Boolean = False Dim HybridMode As Boolean = False @@ -301,6 +306,32 @@ Public Class CRD_List_Item StatusRunning = False bt_pause.BackgroundImage = My.Resources.main_pause_play + ElseIf Failed = True And FailedKey = True Then + If Not Directory.Exists(Path.GetDirectoryName(HybridModePath)) Then + ' Nein! Jetzt erstellen... + Try + Directory.Delete(Path.GetDirectoryName(HybridModePath)) + Catch ex As Exception + Debug.WriteLine("folder issue - delete") + Exit Sub + End Try + End If + Dim Evaluator = New Thread(Sub() DownloadHybrid(HistoryDL_URL, HistoryDL_Pfad, HistoryFilename)) + Evaluator.Start() + HybridMode = True + HybridRunning = True + StatusRunning = True + Failed = False + + LastDate = Date.Now + LastSize = 0 + LastDataRate1 = 0 + LastDataRate2 = 0 + LastDataRate3 = 0 + FailedSegments.Clear() + LogText.Clear() + ZeitGesamtInteger = 0 + ElseIf Failed = True Then Dim Result As DialogResult = MessageBox.Show("The hybride mode has failed to download a fragment." + vbNewLine + "Press 'Retry' to retry the fragment or 'Ignore' to continue.", "Download Error", MessageBoxButtons.AbortRetryIgnore) '= DialogResult.Ignore Then @@ -445,8 +476,6 @@ Public Class CRD_List_Item #Region "Download + Update UI" Public Sub StartDownload(ByVal DL_URL As String, ByVal DL_Pfad As String, ByVal Filename As String, ByVal DownloadHybridMode As Boolean, ByVal TempFolder As String) - 'MsgBox(DL_URL) - Me.StyleManager = MetroStyleManager1 @@ -1073,7 +1102,16 @@ Public Class CRD_List_Item Catch ex2 As Exception FailedCount = FailedCount + 1 - If Item_ErrorTolerance = 0 Then + If CBool(InStr(DL_Pfad, ".key")) Then + Failed = True + FailedKey = True + StatusRunning = False + bt_pause.BackgroundImage = My.Resources.main_pause_play + Me.Invoke(New Action(Function() As Object + Label_percent.Text = "fatal! Failed to download 'encryption.key'" + Return Nothing + End Function)) + ElseIf Item_ErrorTolerance = 0 Then ElseIf FailedCount >= Item_ErrorTolerance Then FailedSegments.Add(New FailedSegemtsWithURL(DL_Pfad, DL_URL)) @@ -1085,6 +1123,7 @@ Public Class CRD_List_Item Label_percent.Text = "Missing segment detected, retry or resume with the play button" Return Nothing End Function)) + End If @@ -1099,6 +1138,7 @@ Public Class CRD_List_Item #End Region Public Function DownloadHybrid(ByVal DL_URL As String, ByVal DL_Pfad As String, ByVal Filename As String) As String + 'MsgBox(DL_URL) LogText.Add(Date.Now.ToString + " " + DL_URL) Dim Folder As String = GeräteID() @@ -1147,7 +1187,7 @@ Public Class CRD_List_Item Return Nothing End Function)) - For i As Integer = 0 To InuputStreams.Count - 1 + For i As Integer = 1 To InuputStreams.Count - 1 Dim int As Integer = i diff --git a/Crunchyroll Downloader/Main.designer.vb b/Crunchyroll Downloader/Main.designer.vb index 8d3aba4..7eb97fd 100644 --- a/Crunchyroll Downloader/Main.designer.vb +++ b/Crunchyroll Downloader/Main.designer.vb @@ -40,7 +40,6 @@ Partial Class Main Me.Btn_Close = New System.Windows.Forms.Button() Me.ContextMenuStrip1 = New System.Windows.Forms.ContextMenuStrip(Me.components) Me.QueueToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() - Me.SaveModeToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() Me.SaveThumbnailAsImageToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() Me.ToggleDebugModeToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() Me.CheckCRBetaTokenToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() @@ -50,9 +49,9 @@ Partial Class Main Me.UrlJsonsToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() Me.DummyItemToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() Me.AudioOnlyQualityToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.LoginFormToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() Me.Panel1 = New System.Windows.Forms.Panel() Me.Btn_Queue = New System.Windows.Forms.Button() - Me.LoginFormToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() CType(Me.PictureBox5, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.ConsoleBar, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.MetroStyleManager1, System.ComponentModel.ISupportInitialize).BeginInit() @@ -161,7 +160,7 @@ Partial Class Main ' 'ContextMenuStrip1 ' - Me.ContextMenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.QueueToolStripMenuItem, Me.SaveModeToolStripMenuItem, Me.SaveThumbnailAsImageToolStripMenuItem, Me.ToggleDebugModeToolStripMenuItem, Me.CheckCRBetaTokenToolStripMenuItem, Me.Timer3OffToolStripMenuItem, Me.ThreadCount, Me.CRCookieToolStripMenuItem, Me.UrlJsonsToolStripMenuItem, Me.DummyItemToolStripMenuItem, Me.AudioOnlyQualityToolStripMenuItem, Me.LoginFormToolStripMenuItem}) + Me.ContextMenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.QueueToolStripMenuItem, Me.SaveThumbnailAsImageToolStripMenuItem, Me.ToggleDebugModeToolStripMenuItem, Me.CheckCRBetaTokenToolStripMenuItem, Me.Timer3OffToolStripMenuItem, Me.ThreadCount, Me.CRCookieToolStripMenuItem, Me.UrlJsonsToolStripMenuItem, Me.DummyItemToolStripMenuItem, Me.AudioOnlyQualityToolStripMenuItem, Me.LoginFormToolStripMenuItem}) Me.ContextMenuStrip1.Name = "ContextMenuStrip1" resources.ApplyResources(Me.ContextMenuStrip1, "ContextMenuStrip1") ' @@ -170,11 +169,6 @@ Partial Class Main Me.QueueToolStripMenuItem.Name = "QueueToolStripMenuItem" resources.ApplyResources(Me.QueueToolStripMenuItem, "QueueToolStripMenuItem") ' - 'SaveModeToolStripMenuItem - ' - Me.SaveModeToolStripMenuItem.Name = "SaveModeToolStripMenuItem" - resources.ApplyResources(Me.SaveModeToolStripMenuItem, "SaveModeToolStripMenuItem") - ' 'SaveThumbnailAsImageToolStripMenuItem ' Me.SaveThumbnailAsImageToolStripMenuItem.Name = "SaveThumbnailAsImageToolStripMenuItem" @@ -220,6 +214,11 @@ Partial Class Main Me.AudioOnlyQualityToolStripMenuItem.Name = "AudioOnlyQualityToolStripMenuItem" resources.ApplyResources(Me.AudioOnlyQualityToolStripMenuItem, "AudioOnlyQualityToolStripMenuItem") ' + 'LoginFormToolStripMenuItem + ' + Me.LoginFormToolStripMenuItem.Name = "LoginFormToolStripMenuItem" + resources.ApplyResources(Me.LoginFormToolStripMenuItem, "LoginFormToolStripMenuItem") + ' 'Panel1 ' resources.ApplyResources(Me.Panel1, "Panel1") @@ -236,11 +235,6 @@ Partial Class Main Me.Btn_Queue.Name = "Btn_Queue" Me.Btn_Queue.UseVisualStyleBackColor = False ' - 'LoginFormToolStripMenuItem - ' - Me.LoginFormToolStripMenuItem.Name = "LoginFormToolStripMenuItem" - resources.ApplyResources(Me.LoginFormToolStripMenuItem, "LoginFormToolStripMenuItem") - ' 'Main ' Me.ApplyImageInvert = True @@ -297,7 +291,6 @@ Partial Class Main Friend WithEvents QueueToolStripMenuItem As ToolStripMenuItem Friend WithEvents Btn_Queue As Button Friend WithEvents SaveThumbnailAsImageToolStripMenuItem As ToolStripMenuItem - Friend WithEvents SaveModeToolStripMenuItem As ToolStripMenuItem Friend WithEvents AudioOnlyQualityToolStripMenuItem As ToolStripMenuItem Friend WithEvents LoginFormToolStripMenuItem As ToolStripMenuItem End Class diff --git a/Crunchyroll Downloader/Main.resx b/Crunchyroll Downloader/Main.resx index 3dd090c..a3e54c3 100644 --- a/Crunchyroll Downloader/Main.resx +++ b/Crunchyroll Downloader/Main.resx @@ -489,12 +489,6 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - SaveModeToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - SaveThumbnailAsImageToolStripMenuItem @@ -573,12 +567,6 @@ ffmpeg option - - 233, 22 - - - *Save Mode* - 233, 22 @@ -640,7 +628,7 @@ Login Form - 234, 290 + 234, 268 ContextMenuStrip1 diff --git a/Crunchyroll Downloader/Main.vb b/Crunchyroll Downloader/Main.vb index fced807..4c43607 100644 --- a/Crunchyroll Downloader/Main.vb +++ b/Crunchyroll Downloader/Main.vb @@ -15,8 +15,7 @@ Imports System.Runtime.InteropServices Imports MyProvider.MyProvider Imports Microsoft.Web.WebView2.Core Imports Crunchyroll_Downloader.CRD_Classes - - +Imports System.Runtime.CompilerServices Public Class Main Inherits MetroForm @@ -25,32 +24,21 @@ Public Class Main Dim HTML As String = Nothing Public CR_Cookies As String = "Cookie: " - Public CheckCRLogin As Boolean = True - - Public CR_AuthToken As String = "" - Public CR_v1Token As String = "" - - - 'Public GetBetaSeasonsRetry As Boolean = False - 'Public GetBetaSeasonSingle As Boolean = False - Public CR_MassSeasons As New List(Of CR_Seasons) Public CR_MassEpisodes As New List(Of CR_Seasons) - 'Public CrBetaMass As String = Nothing - 'Public CrBetaMassEpisodes As String = Nothing - 'Public CrBetaMassParameters As String = Nothing - 'Public CrBetaMassBaseURL As String = Nothing Public Mail As String = Nothing Public PW As String = Nothing Public CrBetaBasic As String = "Basic dC1rZGdwMmg4YzNqdWI4Zm4wZnE6eWZMRGZNZnJZdktYaDRKWFMxTEVJMmNDcXUxdjVXYW4=" + + Public CR_Token As CR_Tokens = New CR_Tokens(Nothing, "", 0) + + Public locale As String = Nothing Public Url_locale As String = Nothing - 'Public CrBetaObjects As String = Nothing - 'Public CrBetaStreams As String = Nothing - 'Public CrBetaStreamsUrl As String = Nothing + Public LoadingUrl As String = "" Public LoadedUrls As New List(Of CoreWebView2WebResourceRequest) @@ -61,10 +49,8 @@ Public Class Main Public KodiNaming As Boolean = False Public ErrorTolerance As Integer = 0 Public CookieList As New List(Of CoreWebView2Cookie) - 'Public liList As New List(Of String) Public HTMLString As String = My.Resources.Startuphtml Public ListBoxList As New List(Of String) - 'Public ItemList As New List(Of CRD_List_Item) Public RunningDownloads As Integer = 0 Public UseQueue As Boolean = False Public StartServer As Integer = 0 @@ -76,17 +62,12 @@ Public Class Main Public LogBrowserData As Boolean = False Public Thumbnail As String = Nothing Public MergeSubs As Boolean = False - 'Public IgnoreS1 As Boolean = False Public IgnoreSeason As Integer = 0 Public HideFLInt As Integer = 0 Public KeepCache As Boolean = False - 'Public SubsOnly As Boolean = False Public DownloadScope As Integer = 0 Public VideoFormat As String = ".mp4" Public MergeSubsFormat As String = "mov_text" - 'Public LoginDialog As Boolean = False - 'Public NonCR_Timeout As Integer = 5 - 'Public NonCR_URL As String = Nothing Public DlSoftSubsRDY As Boolean = True Public DialogTaskString As String Dim NewAPIString1 As String @@ -1073,93 +1054,92 @@ Public Class Main Dim ObjectsURLBuilder() As String = Streams.Split(New String() {"videos"}, System.StringSplitOptions.RemoveEmptyEntries) - Dim ObjectsURLBuilder2() As String = ObjectsURLBuilder(1).Split(New String() {"/streams"}, System.StringSplitOptions.RemoveEmptyEntries) - Dim ObjectsURLBuilder3() As String = WebsiteURL.Split(New String() {"watch/"}, System.StringSplitOptions.RemoveEmptyEntries) - Dim ObjectsURLBuilder4() As String = ObjectsURLBuilder3(1).Split(New String() {"/"}, System.StringSplitOptions.RemoveEmptyEntries) - Dim ObjectsURL As String = ObjectsURLBuilder(0) + "objects/" + ObjectsURLBuilder4(0) + ObjectsURLBuilder2(1) + Dim ObjectsURLBuilder2() As String = ObjectsURLBuilder(1).Split(New String() {"/streams"}, System.StringSplitOptions.RemoveEmptyEntries) + Dim ObjectsURLBuilder3() As String = WebsiteURL.Split(New String() {"watch/"}, System.StringSplitOptions.RemoveEmptyEntries) + Dim ObjectsURLBuilder4() As String = ObjectsURLBuilder3(1).Split(New String() {"/"}, System.StringSplitOptions.RemoveEmptyEntries) + Dim ObjectsURL As String = ObjectsURLBuilder(0) + "objects/" + ObjectsURLBuilder4(0) + ObjectsURLBuilder2(1) - CR_EpisodeID = ObjectsURLBuilder4(0) + CR_EpisodeID = ObjectsURLBuilder4(0) - Debug.WriteLine(ObjectsURL) + 'Debug.WriteLine(ObjectsURL) - ObjectJson = CurlAuthNew(ObjectsURL, Loc_CR_Cookies, Loc_AuthToken) + ObjectJson = CurlAuthNew(ObjectsURL, Loc_CR_Cookies, Loc_AuthToken) - 'Filter JSON esqaped characters - 'Debug.WriteLine(Date.Now.ToString + "before:" + ObjectJson) - Debug.WriteLine("1750: " + ObjectJson) - ObjectJson = CleanJSON(ObjectJson) - 'Debug.WriteLine(Date.Now.ToString + "after:" + ObjectJson) + 'Filter JSON esqaped characters + 'Debug.WriteLine(Date.Now.ToString + "before:" + ObjectJson) + 'Debug.WriteLine("1750: " + ObjectJson) + ObjectJson = CleanJSON(ObjectJson) + 'Debug.WriteLine(Date.Now.ToString + "after:" + ObjectJson) - Dim DubsAvalible As New List(Of CR_MediaVersion) + Dim DubsAvalible As New List(Of CR_MediaVersion) - Dim ser As JObject = JObject.Parse(ObjectJson) - Dim data As List(Of JToken) = ser.Children().ToList + Dim ser As JObject = JObject.Parse(ObjectJson) + Dim data As List(Of JToken) = ser.Children().ToList - For Each item As JProperty In data - item.CreateReader() - Select Case item.Name + For Each item As JProperty In data + item.CreateReader() + Select Case item.Name - Case "data" 'each record is inside the entries array - For Each Entry As JObject In item.Values - Try - Dim Title As String = Entry("title").ToString - CR_title = String.Join(" ", Title.Split(invalids, StringSplitOptions.RemoveEmptyEntries)).TrimEnd("."c).Replace(Chr(34), "").Replace("\", "").Replace("/", "").Replace(":", "") - Debug.WriteLine(Date.Now.ToString + " CR-Title: " + CR_title) - Catch ex As Exception - End Try - Dim SubData As List(Of JToken) = Entry.Children().ToList - For Each SubItem As JProperty In SubData - 'SubItem.CreateReader() - Select Case SubItem.Name - Case "episode_metadata" - For Each SubEntry As JProperty In SubItem.Values - Select Case SubEntry.Name - Case "series_title" - CR_series_title = SubEntry.Value.ToString.Replace(Chr(34), "").Replace("\", "").Replace("/", "").Replace(":", "") + Case "data" 'each record is inside the entries array + For Each Entry As JObject In item.Values + Try + Dim Title As String = Entry("title").ToString + CR_title = String.Join(" ", Title.Split(invalids, StringSplitOptions.RemoveEmptyEntries)).TrimEnd("."c).Replace(Chr(34), "").Replace("\", "").Replace("/", "").Replace(":", "") + Debug.WriteLine(Date.Now.ToString + " CR-Title: " + CR_title) + Catch ex As Exception + End Try + Dim SubData As List(Of JToken) = Entry.Children().ToList + For Each SubItem As JProperty In SubData + 'SubItem.CreateReader() + Select Case SubItem.Name + Case "episode_metadata" + For Each SubEntry As JProperty In SubItem.Values + Select Case SubEntry.Name + Case "series_title" + CR_series_title = SubEntry.Value.ToString.Replace(Chr(34), "").Replace("\", "").Replace("/", "").Replace(":", "") 'Case "season_title" ' CR_season_title = SubEntry.Value.ToString - Case "season_number" - CR_season_number = SubEntry.Value.ToString.Replace(Chr(34), "").Replace("\", "").Replace("/", "").Replace(":", "") - Case "episode_number" - CR_episode2 = SubEntry.Value.ToString.Replace(Chr(34), "").Replace("\", "").Replace("/", "").Replace(":", "") - Case "episode" - CR_episode = SubEntry.Value.ToString.Replace(Chr(34), "").Replace("\", "").Replace("/", "").Replace(":", "") - Case "duration_ms" - CR_episode_duration_ms = SubEntry.Value.ToString.Replace(Chr(34), "").Replace("\", "").Replace("/", "").Replace(":", "") - Case "is_dubbed" - CR_audio_isDubbed = CBool(SubEntry.Value.ToString.Replace(Chr(34), "").Replace("\", "").Replace("/", "").Replace(":", "")) - Case "audio_locale" - CR_audio_locale = SubEntry.Value.ToString.Replace(Chr(34), "").Replace("\", "").Replace("/", "").Replace(":", "") - Case "versions" 'each record is inside the entries array - For Each VersionEntry As JObject In item.Values + Case "season_number" + CR_season_number = SubEntry.Value.ToString.Replace(Chr(34), "").Replace("\", "").Replace("/", "").Replace(":", "") + Case "episode_number" + CR_episode2 = SubEntry.Value.ToString.Replace(Chr(34), "").Replace("\", "").Replace("/", "").Replace(":", "") + Case "episode" + CR_episode = SubEntry.Value.ToString.Replace(Chr(34), "").Replace("\", "").Replace("/", "").Replace(":", "") + Case "duration_ms" + CR_episode_duration_ms = SubEntry.Value.ToString.Replace(Chr(34), "").Replace("\", "").Replace("/", "").Replace(":", "") + Case "is_dubbed" + CR_audio_isDubbed = CBool(SubEntry.Value.ToString.Replace(Chr(34), "").Replace("\", "").Replace("/", "").Replace(":", "")) + Case "audio_locale" + CR_audio_locale = SubEntry.Value.ToString.Replace(Chr(34), "").Replace("\", "").Replace("/", "").Replace(":", "") + Case "versions" 'each record is inside the entries array + For Each VersionEntry As JObject In item.Values - Dim VideoSubData As List(Of JToken) = VersionEntry.Children().ToList - Dim guid As String = Nothing - Dim audio_locale As String = Nothing + Dim VideoSubData As List(Of JToken) = VersionEntry.Children().ToList + Dim guid As String = Nothing + Dim audio_locale As String = Nothing - For Each VideoSubItem As JProperty In VideoSubData - Select Case VideoSubItem.Name - Case "audio_locale" - audio_locale = VideoSubItem.Value.ToString - Case "guid" - guid = VideoSubItem.Value.ToString - 'Debug.WriteLine(guid) - End Select + For Each VideoSubItem As JProperty In VideoSubData + Select Case VideoSubItem.Name + Case "audio_locale" + audio_locale = VideoSubItem.Value.ToString + Case "guid" + guid = VideoSubItem.Value.ToString + 'Debug.WriteLine(guid) + End Select + Next + + If audio_locale = Nothing Or guid = Nothing Then + Else + DubsAvalible.Add(New CR_MediaVersion(audio_locale, guid)) + End If Next - - If audio_locale = Nothing Or guid = Nothing Then - Else - DubsAvalible.Add(New CR_MediaVersion(audio_locale, guid)) - End If - Next - End Select - Next ' - End Select + End Select + Next ' + End Select + Next Next - Next - End Select - Next - + End Select + Next #Region "m3u8 suche" @@ -1167,15 +1147,15 @@ Public Class Main #Region "Check for dub override" If My.Settings.OverrideDub = True And CR_audio_locale = DubSprache.CR_Value = False Then 'einstellung ein + kein musikvideo oder Konzert - 'MsgBox("Trigger on!") - For i As Integer = 0 To DubsAvalible.Count - 1 - If DubsAvalible(i).AudioLang = DubSprache.CR_Value Then - page_guid = DubsAvalible(i).guid - End If - Next + 'MsgBox("Trigger on!") + For i As Integer = 0 To DubsAvalible.Count - 1 + If DubsAvalible(i).AudioLang = DubSprache.CR_Value Then + page_guid = DubsAvalible(i).guid + End If + Next - End If + End If #End Region End If @@ -1183,7 +1163,7 @@ Public Class Main Debug.WriteLine("NewAPI: " + NewAPI) Dim NewAPIData As String = CurlAuthNew(NewAPI, "", Loc_AuthToken) - Debug.WriteLine("NewAPIData: " + NewAPIData) + 'Debug.WriteLine("NewAPIData: " + NewAPIData) Dim VideoJSON_New As String = CleanJSON(NewAPIData) @@ -1217,7 +1197,10 @@ Public Class Main End Select Next - + Me.Invoke(New Action(Function() As Object + SetStatusLabel("Status: API data received") + Return Nothing + End Function)) Dim CR_URI_Master As New List(Of String) @@ -1273,23 +1256,11 @@ Public Class Main End If End If - 'MsgBox(CR_URI_Master.Count.ToString) + Me.Invoke(New Action(Function() As Object + SetStatusLabel("Status: Language found") + Return Nothing + End Function)) - 'If CBool(InStr(CR_URI_Master(0), "master.m3u8")) Then - ' Me.Invoke(New Action(Function() As Object - ' Anime_Add.StatusLabel.Text = "Status: m3u8 found, looking for resolution" - ' Me.Text = "Status: m3u8 found, looking for resolution" - ' Me.Invalidate() - ' Return Nothing - ' End Function)) - 'Else - ' If MessageBox.Show("The Url below failed a check, continue?" + vbNewLine + CR_URI_Master(0), "Mission failed?", MessageBoxButtons.OKCancel) = DialogResult.OK Then - - ' Else - ' Throw New System.Exception("Premium Episode") - ' End If - ' Throw New System.Exception("Premium Episode") - 'End If #End Region @@ -1606,6 +1577,7 @@ Public Class Main If DownloadScope = DownloadScopeEnum.SubsOnly Then ffmpegInput = "-i [Subtitles only]" + Else Dim str As String = CurlAuthNew(CR_URI_Master(0), "", Loc_AuthToken) @@ -1674,7 +1646,11 @@ Public Class Main End If - + Me.Invoke(New Action(Function() As Object + SetStatusLabel("Status: Resolution found") + Pause(2) + Return Nothing + End Function)) #End Region @@ -1686,7 +1662,6 @@ Public Class Main - 'Dim SplitVideo As String() = VideoJson.Split(New String() {Chr(34) + "closed_captions" + Chr(34) + ":"}, System.StringSplitOptions.RemoveEmptyEntries) 'If SoftSubs.Count > 0 And My.Settings.Captions = True Then @@ -1698,6 +1673,11 @@ Public Class Main 'End If '"language":"de-DE" If SoftSubs.Count > 0 Then 'And CCAvailable.Count = 0 Then + Me.Invoke(New Action(Function() As Object + SetStatusLabel("Status: Checking Soft-Subs") + Return Nothing + End Function)) + For i As Integer = 0 To SoftSubs.Count - 1 If CBool(InStr(VideoJSON_New, Chr(34) + "language" + Chr(34) + ":" + Chr(34) + SoftSubs(i) + Chr(34) + "," + Chr(34) + "url" + Chr(34) + ":" + Chr(34))) Then SoftSubsAvailable.Add(SoftSubs(i)) @@ -2311,84 +2291,6 @@ Public Class Main #End Region - Public Sub ProcessUrls() - Debug.WriteLine(LoadedUrls.Count.ToString) - Debug.WriteLine(Date.Now.ToString + " Thread Name: " + Thread.CurrentThread.Name) - Dim SavedObjectsUrl = "" - For i As Integer = 0 To LoadedUrls.Count - 1 - - Dim Request As CoreWebView2WebResourceRequest = LoadedUrls.Item(i) - - - If CBool(InStr(Request.Uri, "crunchyroll.com/")) And CBool(InStr(Request.Uri, "streams?")) Then - - If b = False Then - - If Application.OpenForms().OfType(Of Anime_Add).Any = True Then - Anime_Add.StatusLabel.Text = "Status: Crunchyroll episode found." - End If - Me.Text = "Status: Crunchyroll episode found." - Debug.WriteLine("Crunchyroll episode found") - GetCRVideoProxy(Request.Uri, CR_AuthToken, WebbrowserURL, 0) - b = True - LoadedUrls.Clear() - Me.Text = "Crunchyroll Downloader" - Exit Sub - End If - - ElseIf CBool(InStr(Request.Uri, "crunchyroll.com/")) And CBool(InStr(Request.Uri, "seasons?preferred_audio_language=")) And CBool(InStr(WebbrowserURL, "series")) Then - - If b = False Then - - If Application.OpenForms().OfType(Of Anime_Add).Any = True Then - Anime_Add.StatusLabel.Text = "Status: Crunchyroll season found." - End If - Me.Text = "Status: Crunchyroll season found." - Debug.WriteLine("Crunchyroll season found") - - Dim Auth As String = " -H " + Chr(34) + "Authorization: " + Request.Headers.GetHeader("Authorization") + Chr(34) - Debug.WriteLine(Auth) - - CR_Cookies = "Cookie: " + Request.Headers.GetHeader("Cookie") - - GetBetaSeasons(WebbrowserURL, Request.Uri, Auth) - - 'Browser.WebBrowser1.LoadUrl(Request.Uri) - b = True - LoadedUrls.Clear() - Me.Text = "Crunchyroll Downloader" - Exit Sub - End If - ElseIf CBool(InStr(Request.Uri, "crunchyroll.com/")) And CBool(InStr(Request.Uri, "seasons?series_id=")) Then - - If b = False Then - - If Application.OpenForms().OfType(Of Anime_Add).Any = True Then - Anime_Add.StatusLabel.Text = "Status: Error found invalid data." - End If - b = True - LoadedUrls.Clear() - Me.Text = "Crunchyroll Downloader" - Exit Sub - End If - - End If - - - - Next - - LoadedUrls.Clear() - - If b = True Then - LoadedUrls.Clear() - Debug.WriteLine("Just Browsing after all, exiting...") - Grapp_RDY = True - Me.Text = "Crunchyroll Downloader" - Exit Sub - End If - - End Sub Public Sub Navigate(ByVal Url As String) If Application.OpenForms().OfType(Of Browser).Any = True Then @@ -2996,10 +2898,6 @@ Public Class Main LoadedUrls.Clear() Dim NoBrowser As Boolean = False - If My.Settings.SaveMode = True Then - Browser.WebView2.CoreWebView2.Navigate(Url) - Exit Sub - End If 'CR_v1Token = "Get" 'Browser.WebView2.Source = New Uri(Url) @@ -3012,153 +2910,167 @@ Public Class Main #Region "Get Cookies" - CR_Cookies = "Cookie: " - 'MsgBox("Cookies") - If File.Exists("cookies.txt") = True Then - CR_Cookies = GetCookiesFromFile("crunchyroll.com") - NoBrowser = True - CrBetaBasic = "Basic bm9haWhkZXZtXzZpeWcwYThsMHE6" - 'MsgBox(True.ToString) - Else - Browser.GetCookies(Url) + 'CR_Cookies = "Cookie: " + ''MsgBox("Cookies") + 'If File.Exists("cookies.txt") = True Then + ' CR_Cookies = GetCookiesFromFile("crunchyroll.com") + ' NoBrowser = True + ' CrBetaBasic = "Basic bm9haWhkZXZtXzZpeWcwYThsMHE6" + ' 'MsgBox(True.ToString) + 'Else + ' Browser.GetCookies(Url) - Debug.WriteLine(CookieList.Count.ToString) - If CookieList.Count = 0 Then - Browser.WebView2.CoreWebView2.Navigate(Url) - SetStatusLabel("Status: loading in browser...") - Me.Text = "Status: loading in browser..." - Exit Sub - End If + ' Debug.WriteLine(CookieList.Count.ToString) + ' If CookieList.Count = 0 Then + ' Browser.WebView2.CoreWebView2.Navigate(Url) + ' SetStatusLabel("Status: loading in browser...") + ' Me.Text = "Status: loading in browser..." + ' Exit Sub + ' End If - For i As Integer = 0 To CookieList.Count - 1 + ' For i As Integer = 0 To CookieList.Count - 1 - If CBool(InStr(CookieList.Item(i).Domain, ".crunchyroll.com")) And CBool(InStr(CookieList.Item(i).Name, "_evidon_suppress")) = False Then - CR_Cookies = CR_Cookies + CookieList.Item(i).Name + "=" + CookieList.Item(i).Value + ";" - End If + ' If CBool(InStr(CookieList.Item(i).Domain, ".crunchyroll.com")) And CBool(InStr(CookieList.Item(i).Name, "_evidon_suppress")) = False Then + ' CR_Cookies = CR_Cookies + CookieList.Item(i).Name + "=" + CookieList.Item(i).Value + ";" + ' End If - Next + ' Next - End If + 'End If - 'MsgBox(Main.CR_Cookies) + ''MsgBox(Main.CR_Cookies) - Dim DeviceRegion As String = Nothing + 'Dim DeviceRegion As String = Nothing - If CBool(InStr(Url, "/series")) Then - Dim locale1() As String = Url.Split(New String() {"crunchyroll.com/"}, System.StringSplitOptions.RemoveEmptyEntries) - Dim locale2() As String = locale1(1).Split(New String() {"/series"}, System.StringSplitOptions.RemoveEmptyEntries) - locale = Convert_locale(locale2(0)) - If locale = "en-US" Then - Url_locale = "" - Else - Url_locale = locale2(0) - End If + 'If CBool(InStr(Url, "/series")) Then + ' Dim locale1() As String = Url.Split(New String() {"crunchyroll.com/"}, System.StringSplitOptions.RemoveEmptyEntries) + ' Dim locale2() As String = locale1(1).Split(New String() {"/series"}, System.StringSplitOptions.RemoveEmptyEntries) + ' locale = Convert_locale(locale2(0)) + ' If locale = "en-US" Then + ' Url_locale = "" + ' Else + ' Url_locale = locale2(0) + ' End If - ElseIf CBool(InStr(Url, "/watch")) Then - Dim locale1() As String = Url.Split(New String() {"crunchyroll.com/"}, System.StringSplitOptions.RemoveEmptyEntries) - Dim locale2() As String = locale1(1).Split(New String() {"/watch"}, System.StringSplitOptions.RemoveEmptyEntries) - 'MsgBox(locale2(0)) + 'ElseIf CBool(InStr(Url, "/watch")) Then + ' Dim locale1() As String = Url.Split(New String() {"crunchyroll.com/"}, System.StringSplitOptions.RemoveEmptyEntries) + ' Dim locale2() As String = locale1(1).Split(New String() {"/watch"}, System.StringSplitOptions.RemoveEmptyEntries) + ' 'MsgBox(locale2(0)) - locale = Convert_locale(locale2(0)) - 'End If - If locale = "en-US" Then - Url_locale = "" - Else - Url_locale = locale2(0) - End If + ' locale = Convert_locale(locale2(0)) + ' 'End If + ' If locale = "en-US" Then + ' Url_locale = "" + ' Else + ' Url_locale = locale2(0) + ' End If - 'If CBool(InStr(Url, "musicvideo/")) Then - ' SetStatusLabel("Status: musicvideo detected - partial support only") + ' 'If CBool(InStr(Url, "musicvideo/")) Then + ' ' SetStatusLabel("Status: musicvideo detected - partial support only") - ' Browser.WebView2.CoreWebView2.Navigate(Url) - ' Exit Sub - 'Else - 'If CBool(InStr(Url, "/concert/")) Then + ' ' Browser.WebView2.CoreWebView2.Navigate(Url) + ' ' Exit Sub + ' 'Else + ' 'If CBool(InStr(Url, "/concert/")) Then - ' SetStatusLabel("Status: concert detected - partial support only") - ' Browser.WebView2.CoreWebView2.Navigate(Url) - ' Exit Sub + ' ' SetStatusLabel("Status: concert detected - partial support only") + ' ' Browser.WebView2.CoreWebView2.Navigate(Url) + ' ' Exit Sub - ' End If + ' ' End If - End If + 'End If - 'Debug.WriteLine("###" + CR_Cookies + "###") + ''Debug.WriteLine("###" + CR_Cookies + "###") - Dim Loc_CR_Cookies = " -H " + Chr(34) + CR_Cookies + Chr(34) + 'Dim Loc_CR_Cookies = " -H " + Chr(34) + CR_Cookies + Chr(34) - 'CR_v1Token = "Get" - 'Browser.WebView2.Source = New Uri(Url) - 'Exit Sub + ''CR_v1Token = "Get" + ''Browser.WebView2.Source = New Uri(Url) + ''Exit Sub #End Region + + + Dim Loc_CR_Cookies As String = "" ' do we need that? does not seem like it. + Dim Auth As String = " -H " + Chr(34) + "Authorization: " + CrBetaBasic + Chr(34) - 'Dim Post As String = " -d " + Chr(34) + "grant_type=etp_rt_cookie" + Chr(34) + " -X POST" - Dim Post As String = " -d " + Chr(34) + "username=" + UrlEncode(Mail) + "&password=" + UrlEncode(PW) + "&grant_type=password&scope=offline_access" + Chr(34) + " -X POST -H " + Chr(34) + "Content-Type: application/x-www-form-urlencoded; charset=utf-8" + Chr(34) + + Dim Post As String = Nothing + Dim UnixTime As Integer + UnixTime = CInt((DateTime.UtcNow - New DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds) + + If CBool(CR_Token.access_token = Nothing) = True Then ' *insert *First time* meme + Post = " -d " + Chr(34) + "username=" + UrlEncode(Mail) + "&password=" + UrlEncode(PW) + "&grant_type=password&scope=offline_access" + Chr(34) + " -X POST -H " + Chr(34) + "Content-Type: application/x-www-form-urlencoded; charset=utf-8" + Chr(34) + SetStatusLabel("Status: using login to authenticate") + Pause(2) + ElseIf CR_Token.expires_Unix + 30 > UnixTime Then 'we are not expired yet (+10% tolleranz) + Post = "Skip!" + SetStatusLabel("Status: Token not expired - skip auth") + Pause(2) + ElseIf CR_Token.expires_Unix + 30 < UnixTime Then 'we should renew it + Post = " -d " + Chr(34) + "refresh_token=" + CR_Token.refresh_token + "&grant_type=refresh_token&scope=offline_access" + Chr(34) + " -X POST -H " + Chr(34) + "Content-Type: application/x-www-form-urlencoded; charset=utf-8" + Chr(34) + SetStatusLabel("Status: Token expired - refreshing") + Pause(2) + End If ' Dim CRBetaBearer As String = "Bearer " + If Post = "Skip!" Then + Dim Auth2 As String = " -H " + Chr(34) + "Authorization: " + CRBetaBearer + CR_Token.access_token + Chr(34) + ProcessLoading(Url, Auth2, Loc_CR_Cookies, RT_count) + Else + Dim v1Token As String = CurlPost("https://www.crunchyroll.com/auth/v1/token", Loc_CR_Cookies, Auth, Post, "add_main_4494") - Dim v1Token As String = CurlPost("https://www.crunchyroll.com/auth/v1/token", Loc_CR_Cookies, Auth, Post, "add_main_4494") + If CBool(InStr(v1Token, "curl:")) = True And CBool(InStr(v1Token, "401")) = True Then + MsgBox("CR reported error 401, this may mean incorrect login detail, please try again.", MsgBoxStyle.Exclamation, "CR-Error 401") + LoginForm.ShowDialog() + Exit Sub + End If - If CBool(InStr(v1Token, "curl:")) = True And CBool(InStr(v1Token, "401")) = True Then - MsgBox("CR reported error 401, this may mean incorrect login detail, please try again.", MsgBoxStyle.Exclamation, "CR-Error 401") - LoginForm.ShowDialog() - Exit Sub - End If + If CBool(InStr(v1Token, "curl:")) = True And CBool(InStr(v1Token, "400")) = True Then + MsgBox("CR reported error 400, idk why tbh", MsgBoxStyle.Exclamation, "CR-Error 400") + SetStatusLabel("Status: Unknown error. #3038") + Exit Sub + End If - If CBool(InStr(v1Token, "curl:")) = True And CBool(InStr(v1Token, "400")) = True Then - Debug.WriteLine("Post error!, 400") - Post = " -d " + Chr(34) + "grant_type=client_id&scope=offline_access" + Chr(34) + " -X POST" - Debug.WriteLine(Post.Replace("etp_rt_cookie", "client_id")) - v1Token = CurlPost("https://www.crunchyroll.com/auth/v1/token", Loc_CR_Cookies, Auth, Post.Replace("etp_rt_cookie", "client_id"), "add_main-4499") + If CBool(InStr(v1Token, "curl: (60)")) = True Then + SetStatusLabel("Status: Critical error. #3043") + MsgBox("Please try the '--insecure' option found on the 'Main' page of the settings.") + Exit Sub + 'ElseIf CBool(InStr(v1Token, "curl:")) Then + + ElseIf CBool(InStr(v1Token, "curl:")) = True Then + ' Browser.WebView2.CoreWebView2.Navigate(Url) + SetStatusLabel("Status: Unknown error. #3050") + Exit Sub + + End If + + Dim Token() As String = v1Token.Split(New String() {Chr(34) + "access_token" + Chr(34) + ":" + Chr(34)}, System.StringSplitOptions.RemoveEmptyEntries) + Dim Token2() As String = Token(1).Split(New String() {Chr(34) + "," + Chr(34)}, System.StringSplitOptions.RemoveEmptyEntries) + CRBetaBearer = CRBetaBearer + Token2(0) + + Dim RefrehToken() As String = v1Token.Split(New String() {Chr(34) + "refresh_token" + Chr(34) + ":" + Chr(34)}, System.StringSplitOptions.RemoveEmptyEntries) + Dim RefrehToken2() As String = RefrehToken(1).Split(New String() {Chr(34) + "," + Chr(34)}, System.StringSplitOptions.RemoveEmptyEntries) + + Dim TokenUnixTime As Integer + TokenUnixTime = CInt((DateTime.UtcNow - New DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds) + 300 + + CR_Token = New CR_Tokens(Token2(0), RefrehToken2(0), TokenUnixTime) + + Dim Auth2 As String = " -H " + Chr(34) + "Authorization: " + CRBetaBearer + Chr(34) + + ProcessLoading(Url, Auth2, Loc_CR_Cookies, RT_count) End If - - - - 'MsgBox(v1Token) - - If CBool(InStr(v1Token, "curl:")) = True And CBool(InStr(v1Token, "400")) = True Then - SetStatusLabel("Status: Failed - bad request, check CR login") - Me.Text = "Status: Failed - bad request, check CR login" - Debug.WriteLine("Status: Failed - bad request, check CR login") - - b = True - Exit Sub - - ElseIf CBool(InStr(v1Token, "curl:")) = True Then - v1Token = CurlPost("https://www.crunchyroll.com/auth/v1/token", Loc_CR_Cookies, Auth, Post, "add_main_4516") - End If - - 'MsgBox(v1Token) - If CBool(InStr(v1Token, "curl: (60)")) = True Then - SetStatusLabel("Status: Critical error. #4478") - MsgBox("Please try the '--insecure' option found on the 'Main' page of the settings.") - Exit Sub - 'ElseIf CBool(InStr(v1Token, "curl:")) Then - - ElseIf CBool(InStr(v1Token, "curl:")) = True Then - Browser.WebView2.CoreWebView2.Navigate(Url) - Exit Sub - - End If - - Dim Token() As String = v1Token.Split(New String() {Chr(34) + "access_token" + Chr(34) + ":" + Chr(34)}, System.StringSplitOptions.RemoveEmptyEntries) - Dim Token2() As String = Token(1).Split(New String() {Chr(34) + "," + Chr(34)}, System.StringSplitOptions.RemoveEmptyEntries) - CRBetaBearer = CRBetaBearer + Token2(0) - - Dim Auth2 As String = " -H " + Chr(34) + "Authorization: " + CRBetaBearer + Chr(34) - - ProcessLoading(Url, Auth2, Loc_CR_Cookies, RT_count) - Else 'to do End If @@ -3181,7 +3093,7 @@ Public Class Main ElseIf CBool(InStr(url, "crunchyroll.com")) = True And CBool(InStr(url, "watch/")) = True And CBool(CrBetaBasic = Nothing) = False And CBool(InStr(url, "/musicvideo/")) = False And CBool(InStr(url, "/concert/")) = False Then #Region "Anime" - + SetStatusLabel("Status: Url match - Anime episode") Dim ObjectsUrl As String = Nothing @@ -3254,7 +3166,7 @@ Public Class Main #End Region ElseIf CBool(InStr(url, "crunchyroll.com")) = True And CBool(InStr(url, "musicvideo/")) = True And CBool(CrBetaBasic = Nothing) = False Then #Region "musik videos" - + SetStatusLabel("Status: Url match - Music video") Dim ObjectsUrl As String = Nothing @@ -3307,6 +3219,8 @@ Public Class Main GetCRVideoProxy(StreamsUrl, Auth2, url, RT_Count) #End Region ElseIf CBool(InStr(url, "crunchyroll.com")) = True And CBool(InStr(url, "concert/")) = True And CBool(CrBetaBasic = Nothing) = False Then +#Region "concert" + SetStatusLabel("Status: Url match - Concert") Dim ObjectsUrl As String = Nothing @@ -3357,8 +3271,10 @@ Public Class Main GetCRVideoProxy(StreamsUrl, Auth2, url, RT_Count) +#End Region Else - Browser.WebView2.CoreWebView2.Navigate(url) + + 'Browser.WebView2.CoreWebView2.Navigate(url) End If @@ -3411,9 +3327,9 @@ Public Class Main Sub SetStatusLabel(ByVal txt As String) If Application.OpenForms().OfType(Of Anime_Add).Any = True Then Anime_Add.StatusLabel.Text = txt - End If - + Me.Text = txt + Debug.WriteLine("StatusLabel: " + Date.Now.ToString + " - " + txt) End Sub Private Sub SaveThumbnailAsImageToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles SaveThumbnailAsImageToolStripMenuItem.Click @@ -3430,20 +3346,6 @@ Public Class Main End If End Sub - Private Sub SaveModeToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles SaveModeToolStripMenuItem.Click - If My.Settings.SaveMode = False Then - My.Settings.SaveMode = True - MsgBox("SaveMode enabled") - My.Settings.Save() - - Else - My.Settings.SaveMode = False - MsgBox("SaveMode disabled") - My.Settings.Save() - - End If - End Sub - Private Sub Panel1_Paint(sender As Object, e As PaintEventArgs) Handles Panel1.Paint End Sub diff --git a/Crunchyroll Downloader/My Project/AssemblyInfo.vb b/Crunchyroll Downloader/My Project/AssemblyInfo.vb index d2eaa1b..526f974 100644 --- a/Crunchyroll Downloader/My Project/AssemblyInfo.vb +++ b/Crunchyroll Downloader/My Project/AssemblyInfo.vb @@ -32,6 +32,6 @@ Imports System.Runtime.InteropServices ' übernehmen, indem Sie "*" eingeben: ' - - + + diff --git a/Crunchyroll Downloader/My Project/Settings.Designer.vb b/Crunchyroll Downloader/My Project/Settings.Designer.vb index ef1efb6..ac30492 100644 --- a/Crunchyroll Downloader/My Project/Settings.Designer.vb +++ b/Crunchyroll Downloader/My Project/Settings.Designer.vb @@ -486,18 +486,6 @@ Namespace My End Set End Property - _ - Public Property SaveMode() As Boolean - Get - Return CType(Me("SaveMode"),Boolean) - End Get - Set - Me("SaveMode") = value - End Set - End Property - _ diff --git a/Crunchyroll Downloader/My Project/Settings.settings b/Crunchyroll Downloader/My Project/Settings.settings index 8bf6289..e83094e 100644 --- a/Crunchyroll Downloader/My Project/Settings.settings +++ b/Crunchyroll Downloader/My Project/Settings.settings @@ -110,9 +110,6 @@ False - - False - 0