diff --git a/Changelog.md b/Changelog.md index 828d6d5..6c81421 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,3 +1,17 @@ +# 2024.6.25.0 + +*2024-06-25* + +**ATTENTION! To support downloading of DRM protected videos (OnlyFans), please update OF-Scraper to version [3.10.7](https://github.com/datawhores/OF-Scraper/releases/tag/3.10.7) (download `zip`, not `exe`).** + +- Added + - OnlyFans: **new dynamic rules updating algorithm** + - Feed: ability to set the last session as the current one +- Updated + - gallery-dl up to version **1.27.1** +- Fixed + - Minor bugs + # 2024.6.10.0 *2024-06-10* diff --git a/ProgramScreenshots/SettingsSiteOnlyFans.png b/ProgramScreenshots/SettingsSiteOnlyFans.png index 7aa9a9c..f0514a2 100644 Binary files a/ProgramScreenshots/SettingsSiteOnlyFans.png and b/ProgramScreenshots/SettingsSiteOnlyFans.png differ diff --git a/ProgramScreenshots/SettingsSiteOnlyFansAdditional.png b/ProgramScreenshots/SettingsSiteOnlyFansAdditional.png new file mode 100644 index 0000000..3727d80 Binary files /dev/null and b/ProgramScreenshots/SettingsSiteOnlyFansAdditional.png differ diff --git a/SCrawler.YouTube/My Project/AssemblyInfo.vb b/SCrawler.YouTube/My Project/AssemblyInfo.vb index de27cb4..a651acc 100644 --- a/SCrawler.YouTube/My Project/AssemblyInfo.vb +++ b/SCrawler.YouTube/My Project/AssemblyInfo.vb @@ -32,6 +32,6 @@ Imports System.Runtime.InteropServices ' by using the '*' as shown below: ' - - + + diff --git a/SCrawler.YouTube/Objects/YouTubeMediaContainerBase.vb b/SCrawler.YouTube/Objects/YouTubeMediaContainerBase.vb index bc8d2c5..7804a98 100644 --- a/SCrawler.YouTube/Objects/YouTubeMediaContainerBase.vb +++ b/SCrawler.YouTube/Objects/YouTubeMediaContainerBase.vb @@ -1194,7 +1194,7 @@ Namespace API.YouTube.Objects End With If PlaylistCount > 0 And Not CoverDownloaded And Not PlaylistID.IsEmptyString Then DownloadPlaylistCover(PlaylistID, File, UseCookies) - If prExists Then Progress.InformationTemporary = $"Download {MediaType}: post processing" + If prExists Then Progress.InformationTemporary = "Downloading: post processing" _ThumbnailFile = File _ThumbnailFile.Name &= "_thumb" _ThumbnailFile.Extension = "jpg" diff --git a/SCrawler.YouTubeDownloader/My Project/AssemblyInfo.vb b/SCrawler.YouTubeDownloader/My Project/AssemblyInfo.vb index 8779f05..ac7ce54 100644 --- a/SCrawler.YouTubeDownloader/My Project/AssemblyInfo.vb +++ b/SCrawler.YouTubeDownloader/My Project/AssemblyInfo.vb @@ -32,6 +32,6 @@ Imports System.Runtime.InteropServices ' by using the '*' as shown below: ' - - + + diff --git a/SCrawler/API/Instagram/SiteSettings.vb b/SCrawler/API/Instagram/SiteSettings.vb index 01ecf3e..11a0b46 100644 --- a/SCrawler/API/Instagram/SiteSettings.vb +++ b/SCrawler/API/Instagram/SiteSettings.vb @@ -449,8 +449,11 @@ Namespace API.Instagram If CInt(SettingsVersion.Value) < 2 Then SettingsVersion.Value = 2 HH_IG_WWW_CLAIM_UPDATE_INTERVAL.Value = 120 - HH_IG_WWW_CLAIM_USE_DEFAULT_ALGO.Value = 1 - HH_IG_WWW_CLAIM_RESET_EACH_TARGET.Value = 0 + HH_IG_WWW_CLAIM_ALWAYS_ZERO.Value = False + HH_IG_WWW_CLAIM_RESET_EACH_SESSION.Value = True + HH_IG_WWW_CLAIM_RESET_EACH_TARGET.Value = True + HH_IG_WWW_CLAIM_USE.Value = True + HH_IG_WWW_CLAIM_USE_DEFAULT_ALGO.Value = True End If MyBase.EndInit() End Sub diff --git a/SCrawler/API/OnlyFans/Declarations.vb b/SCrawler/API/OnlyFans/Declarations.vb index b6d6532..a7938f3 100644 --- a/SCrawler/API/OnlyFans/Declarations.vb +++ b/SCrawler/API/OnlyFans/Declarations.vb @@ -11,15 +11,6 @@ Namespace API.OnlyFans Friend Module Declarations Friend ReadOnly DateProvider As New ADateTime("O") Friend ReadOnly RegExPostID As RParams = RParams.DM("(?<=onlyfans\.com/)(\d+)", 0, EDP.ReturnValue) - Friend ReadOnly OFScraperConfigPatternFile As SFile = $"{SettingsFolderName}\OFScraperConfigPattern.json" - Friend Function CheckOFSConfig() As Boolean - If Not OFScraperConfigPatternFile.Exists Then - Dim t$ = Text.Encoding.UTF8.GetString(My.Resources.OFResources.OFScraperConfigPattern) - TextSaver.SaveTextToFile(t, OFScraperConfigPatternFile, True) - Return OFScraperConfigPatternFile.Exists - Else - Return True - End If - End Function + Friend Property Rules As DynamicRulesEnv End Module End Namespace \ No newline at end of file diff --git a/SCrawler/API/OnlyFans/DynamicRules.txt b/SCrawler/API/OnlyFans/DynamicRules.txt new file mode 100644 index 0000000..5dc3930 --- /dev/null +++ b/SCrawler/API/OnlyFans/DynamicRules.txt @@ -0,0 +1,6 @@ +https://github.com/datawhores/onlyfans-dynamic-rules/blob/main/dynamicRules.json +https://github.com/riley-access-labs/onlyfans-dynamic-rules-1/blob/main/dynamicRules.json +https://github.com/riley-access-labs/onlyfans-dynamic-rules-1/blob/patch-1/dynamicRules.json +https://github.com/DATAHOARDERS/dynamic-rules/blob/main/onlyfans.json +https://github.com/DIGITALCRIMINAL/dynamic-rules/blob/main/onlyfans.json +https://github.com/deviint/onlyfans-dynamic-rules/blob/main/dynamicRules.json \ No newline at end of file diff --git a/SCrawler/API/OnlyFans/DynamicRulesAll.txt b/SCrawler/API/OnlyFans/DynamicRulesAll.txt new file mode 100644 index 0000000..87d88c4 --- /dev/null +++ b/SCrawler/API/OnlyFans/DynamicRulesAll.txt @@ -0,0 +1,9 @@ +https://github.com/datawhores/onlyfans-dynamic-rules/blob/main/dynamicRules.json +https://github.com/riley-access-labs/onlyfans-dynamic-rules-1/blob/main/dynamicRules.json +https://github.com/riley-access-labs/onlyfans-dynamic-rules-1/blob/patch-1/dynamicRules.json +https://github.com/DATAHOARDERS/dynamic-rules/blob/main/onlyfans.json +https://github.com/DIGITALCRIMINAL/dynamic-rules/blob/main/onlyfans.json +https://github.com/deviint/onlyfans-dynamic-rules/blob/main/dynamicRules.json + +https://github.com/SneakyOvis/onlyfans-dynamic-rules/blob/main/rules.json +https://github.com/Growik/onlyfans-dynamic-rules/blob/main/rules.json \ No newline at end of file diff --git a/SCrawler/API/OnlyFans/DynamicRulesEnv.vb b/SCrawler/API/OnlyFans/DynamicRulesEnv.vb new file mode 100644 index 0000000..446e9c5 --- /dev/null +++ b/SCrawler/API/OnlyFans/DynamicRulesEnv.vb @@ -0,0 +1,744 @@ +' Copyright (C) Andy https://github.com/AAndyProgram +' This program is free software: you can redistribute it and/or modify +' it under the terms of the GNU General Public License as published by +' the Free Software Foundation, either version 3 of the License, or +' (at your option) any later version. +' +' This program is distributed in the hope that it will be useful, +' but WITHOUT ANY WARRANTY +Imports PersonalUtilities.Functions.XML +Imports PersonalUtilities.Functions.XML.Base +Imports PersonalUtilities.Functions.RegularExpressions +Imports PersonalUtilities.Tools +Imports PersonalUtilities.Tools.Web.Clients +Imports PersonalUtilities.Tools.Web.Clients.Base +Imports PersonalUtilities.Tools.Web.Documents.JSON +Imports System.Text.RegularExpressions +Namespace API.OnlyFans + Friend Structure DynamicRulesValue : Implements IComparable(Of DynamicRulesValue), IEquatable(Of DynamicRulesValue), IEContainerProvider +#Region "XML names" + Private Const Name_UrlRepo As String = "UrlRepo" + Private Const Name_UrlRaw As String = "UrlRaw" + Private Const Name_UrlLatestCommit As String = "UrlLatestCommit" + Private Const Name_UpdatedAt As String = "UpdatedAt" + Private Const Name_Broken As String = "Broken" + Private Const Name_Exists As String = "Exists" +#End Region +#Region "Declarations" + Friend UrlRepo As String + Friend UrlRaw As String + Friend UrlLatestCommit As String + Friend UpdatedAt As Date + Friend Broken As Boolean + Friend Exists As Boolean + Friend ReadOnly Property Valid As Boolean + Get + Return Not UrlRepo.IsEmptyString And Not UrlRaw.IsEmptyString + End Get + End Property +#End Region +#Region "Initializers" + Friend Sub New(ByVal e As EContainer) + UrlRepo = e.Value(Name_UrlRepo) + UrlRaw = e.Value(Name_UrlRaw) + UrlLatestCommit = e.Value(Name_UrlLatestCommit) + UpdatedAt = e.Value(Name_UpdatedAt).ToDateDef(Now.AddYears(-10)) + Broken = e.Value(Name_Broken).FromXML(Of Boolean)(False) + Exists = e.Value(Name_Exists).FromXML(Of Boolean)(True) + End Sub + Public Shared Widening Operator CType(ByVal e As EContainer) As DynamicRulesValue + Return New DynamicRulesValue(e) + End Operator + Public Shared Widening Operator CType(ByVal rule As DynamicRulesValue) As String + Return rule.ToString + End Operator +#End Region +#Region "Base functions" + Public Overrides Function GetHashCode() As Integer + Return ToString.GetHashCode + End Function + Public Overrides Function ToString() As String + Return UrlRaw + End Function +#End Region +#Region "IComparable Support" + Private Function CompareTo(ByVal Other As DynamicRulesValue) As Integer Implements IComparable(Of DynamicRulesValue).CompareTo + Return UpdatedAt.CompareTo(Other.UpdatedAt) * -1 + End Function +#End Region +#Region "IEquatable Support" + Public Overloads Overrides Function Equals(ByVal Obj As Object) As Boolean + If Not IsNothing(Obj) Then + If TypeOf Obj Is String Then + Dim _obj$ = CStr(Obj).StringTrim.StringToLower + Return UrlRepo = _obj Or UrlRaw = _obj + Else + Return Equals(DirectCast(Obj, DynamicRulesValue)) + End If + Else + Return False + End If + End Function + Friend Overloads Function Equals(ByVal Other As DynamicRulesValue) As Boolean Implements IEquatable(Of DynamicRulesValue).Equals + Return UrlRepo = Other.UrlRepo Or UrlRaw = Other.UrlRaw + End Function +#End Region +#Region "IEContainerProvider Support" + Private Function ToEContainer(Optional ByVal e As ErrorsDescriber = Nothing) As EContainer Implements IEContainerProvider.ToEContainer + Return New EContainer("Rule") From { + New EContainer(Name_UrlRepo, UrlRepo), + New EContainer(Name_UrlRaw, UrlRaw), + New EContainer(Name_UrlLatestCommit, UrlLatestCommit), + New EContainer(Name_UpdatedAt, UpdatedAt.ToStringDateDef), + New EContainer(Name_Broken, Broken.BoolToInteger), + New EContainer(Name_Exists, Exists.BoolToInteger) + } + End Function +#End Region + End Structure + Friend Class DynamicRulesEnv : Implements ICopier, IEnumerable(Of DynamicRulesValue), IMyEnumerator(Of DynamicRulesValue), IDisposable + Friend Enum Modes As Integer + List = 0 + Personal = 1 + End Enum +#Region "Constants" + Friend Const UpdateIntervalDefault As Integer = 1440 '60 * 24 + Friend Const DynamicRulesConfigNodeName_URL As String = "DYNAMIC_GENERIC_URL" + Friend Const DynamicRulesConfigNodeName_RULES As String = "DYNAMIC_RULE" + + Friend Const DynamicRulesConfig_Mode_NodeName As String = "dynamic-mode-default" + 'Friend Const DynamicRulesConfig_Mode_NodeValue As String = "generic" + + Friend Const DynamicRulesConfigNodeName_URL_CONST_NAME As String = "RULE_VALUE" +#End Region +#Region "XML names" + Private Const Name_LastUpdateTimeFile As String = "LastUpdateTimeFile" + Private Const Name_LastUpdateTimeRules As String = "LastUpdateTimeRules" + Private Const Name_ProtectFile As String = "ProtectFile" + Private Const Name_UpdateInterval As String = "UpdateInterval" + Private Const Name_Mode As String = "Mode" + Private Const Name_PersonalRule As String = "PersonalRule" + Private Const Name_RulesForceUpdateRequired As String = "RulesForceUpdateRequired" + Private Const Name_AddErrorsToLog As String = "AddErrorsToLog" + Private Const Name_ConfigLastDateUpdate As String = "ConfigLastDateUpdate" + Private Const Name_ConfigAutoUpdate As String = "ConfigAutoUpdate" + Private Const Name_RulesConfigManualMode As String = "RulesConfigManualMode" + Private Const Name_RulesUpdateConst As String = "RulesUpdateConst" + Private Const Name_RulesReplaceConfig As String = "RulesReplaceConfig" +#End Region +#Region "Declarations" + Private ReadOnly Rules As List(Of DynamicRulesValue) + Friend ReadOnly Property RulesConstants As Dictionary(Of String, String) +#Region "Regex patterns" + Private ReadOnly ReplacePattern_RepoToRaw As RParams + Private ReadOnly ReplacePattern_RawToRepo As RParams + Private ReadOnly ReplacePattern_JsonInfo As RParams + Private ReadOnly ConfigRulesExtract As RParams +#End Region +#Region "Dates" + Private LastUpdateTimeFile As Date = Now.AddYears(-1) + Private LastUpdateTimeRules As Date = Now.AddYears(-1) +#End Region +#Region "Files" + Friend ReadOnly OFScraperConfigPatternFile As SFile = $"{SettingsFolderName}\OFScraperConfigPattern.json" + Friend ReadOnly OFScraperConfigPatternFileConst As SFile = $"{SettingsFolderName}\OFScraperConfigPatternConstants.txt" + Friend ReadOnly Property AuthFile As New SFile($"{SettingsFolderName}\OnlyFans_Auth.json") + Private ReadOnly DynamicRulesFile As SFile + Private ReadOnly DynamicRulesXml As SFile + Private Shared ReadOnly Property DynamicRulesFileImpl As SFile + Get + Return $"{SettingsFolderName}\OnlyFansDynamicRules.txt" + End Get + End Property + Friend Shared Sub ValidateRulesFile() + Dim f As SFile = DynamicRulesFileImpl + If Not f.Exists Then TextSaver.SaveTextToFile(My.Resources.OFResources.DynamicRules, DynamicRulesFileImpl, True) + End Sub + Friend Property ProtectFile As Boolean = False +#End Region + Friend Property UpdateInterval As Integer = UpdateIntervalDefault + Friend Property Mode As Modes = Modes.List + Friend Property PersonalRule As String = String.Empty + Friend Property RulesForceUpdateRequired As Boolean = False + Friend Property RulesUpdateConst As Boolean = True + Friend Property RulesReplaceConfig As Boolean = True + Private ReadOnly Responser As New Responser With {.Accept = "application/json"} + Private ReadOnly RulesLinesComparer As New FComparer(Of String)(Function(x, y) x.StringToLower = y.StringToLower) + Private ReadOnly OFLOG As TextSaver + Private ReadOnly OFError As ErrorsDescriber + Friend Property AddErrorsToLog As Boolean = True + Friend Property NeedToSave As Boolean = False + Private ReadOnly Property ConfigAddress As DynamicRulesValue + Private ReadOnly Property ConfigConstAddress As DynamicRulesValue + Private Property ConfigLastDateUpdate As Date = Now.AddYears(-1) + Friend Property ConfigAutoUpdate As Boolean = True + Friend Property RulesConfigManualMode As Boolean = True +#End Region +#Region "Current, Item, Count" + Private _CurrentRule As DynamicRulesValue + Private _CurrentContainer As EContainer + Private _CurrentContainerRulesText As String = String.Empty + Friend ReadOnly Property CurrentRule As DynamicRulesValue + Get + Return _CurrentRule + End Get + End Property + Friend ReadOnly Property CurrentContainer As EContainer + Get + Return _CurrentContainer + End Get + End Property + Friend ReadOnly Property CurrentContainerRulesText As String + Get + If _CurrentContainerRulesText.IsEmptyString AndAlso AuthFile.Exists Then _ + _CurrentContainerRulesText = AuthFile.GetText(OFError).StringTrim + Return _CurrentContainerRulesText + End Get + End Property + Friend ReadOnly Property Exists As Boolean + Get + Return CurrentContainer.ListExists + End Get + End Property + Default Friend ReadOnly Property Item(ByVal Index As Integer) As DynamicRulesValue Implements IMyEnumerator(Of DynamicRulesValue).MyEnumeratorObject + Get + Return Rules(Index) + End Get + End Property + Friend ReadOnly Property Count As Integer Implements IMyEnumerator(Of DynamicRulesValue).MyEnumeratorCount + Get + Return Rules.Count + End Get + End Property +#End Region +#Region "Initializer" + Friend Sub New() + Rules = New List(Of DynamicRulesValue) + DynamicRulesFile = DynamicRulesFileImpl + DynamicRulesXml = DynamicRulesFile + DynamicRulesXml.Extension = "xml" + ReplacePattern_RepoToRaw = New RParams("(.*github.com/([^/]+)/([^/]+)/blob/(.+))", Nothing, 0, + RegexReturn.ReplaceChangeListMatch, EDP.ReturnValue) With { + .PatternReplacement = "https://raw.githubusercontent.com/{2}/{3}/{4}"} + ReplacePattern_JsonInfo = ReplacePattern_RepoToRaw.Copy + ReplacePattern_JsonInfo.PatternReplacement = "https://github.com/{2}/{3}/latest-commit/{4}" + ReplacePattern_RawToRepo = ReplacePattern_RepoToRaw.Copy + ReplacePattern_RawToRepo.Pattern = "(.*raw.githubusercontent.com/([^/]+)/([^/]+)/([^/]+)/(.+))" + ReplacePattern_RawToRepo.PatternReplacement = "https://github.com/{2}/{3}/blob/{4}/{5}" + ConfigRulesExtract = RParams.DMS("DYNAMIC_RULE"":(\{.+?\}[\r\n]+)", 1, RegexOptions.Singleline, EDP.ReturnValue) + OFLOG = New TextSaver($"LOGs\OF_{Now:yyyyMMdd_HHmmss}.txt") With {.LogMode = True, .AutoSave = True, .AutoClear = True} + AddHandler OFLOG.TextSaved, AddressOf OFLOG_TextSaved + OFError = New ErrorsDescriber(EDP.SendToLog + EDP.ReturnValue) With {.DeclaredMessage = New MMessage With {.Loggers = {OFLOG}, .Exists = True}} + Responser.DeclaredError = OFError + Responser.ProcessExceptionDecision = + Function(ByVal Status As IResponserStatus, ByVal NullArg As Object, ByVal CurrentError As ErrorsDescriber) As ErrorsDescriber + If Status.StatusCode = Net.HttpStatusCode.NotFound Then + CurrentError.SendToLogOnlyMessage = True + Dim m As MMessage = CurrentError.DeclaredMessage.Clone + m.Text = $"Nothing found at URL: {Responser.LatestUrlString}" + CurrentError.DeclaredMessage = m + Status.ErrorException = New ErrorsDescriberException(m.Text,,, Status.ErrorException) With {.ReplaceMainMessage = True} + End If + Return CurrentError + End Function + ConfigAddress = ParseURL("https://github.com/AAndyProgram/SCrawler/blob/main/SCrawler/API/OnlyFans/OFScraperConfigPattern.json") + ConfigConstAddress = ParseURL("https://github.com/AAndyProgram/SCrawler/blob/main/SCrawler/API/OnlyFans/OFScraperConfigPatternConstants.txt") + RulesConstants = New Dictionary(Of String, String) + End Sub +#End Region +#Region "Log handlers" + Private _OFLOG_ProcessNotify As Boolean = True + Private Sub OFLOG_TextSaved(sender As Object, e As EventArgs) + If _OFLOG_ProcessNotify And AddErrorsToLog Then _OFLOG_ProcessNotify = False : MyMainLOG = $"The OnlyFans log contains errors: {OFLOG.File}" + End Sub +#End Region +#Region "ParseURL" + Private Const SiteGitHub As String = "github.com" + Private Const SiteGitHubRaw As String = "raw.githubusercontent.com" + Friend Function ParseURL(ByVal URL As String) As DynamicRulesValue + URL = URL.StringTrim + If Not URL.IsEmptyString Then + Dim r As New DynamicRulesValue + Dim rGet As Func(Of String, RParams, String) = Function(__url, pattern) DirectCast(RegexReplace(__url, pattern), IEnumerable(Of String)).FirstOrDefault + If URL.ToLower.Contains(SiteGitHubRaw) Then + r.UrlRaw = URL + r.UrlRepo = rGet(URL, ReplacePattern_RawToRepo) + ElseIf URL.ToLower.Contains(SiteGitHub) Then + r.UrlRepo = URL + r.UrlRaw = rGet(URL, ReplacePattern_RepoToRaw) + End If + + If r.Valid Then + r.UpdatedAt = Now.AddYears(-1) + r.UrlLatestCommit = rGet(r.UrlRepo, ReplacePattern_JsonInfo) + r.Exists = True + Return r + End If + End If + Return Nothing + End Function +#End Region +#Region "GetFormat" + Private Shared ReadOnly Property ConfigNodes As String() + Get + Return {"advanced_options", "DYNAMIC_RULE"} + End Get + End Property + Private Const FormatMidPart As String = ":{0}:{1:x}:" + Private ReadOnly FormatExtract As RParams = RParams.DM("(\S+)\s*:\s*\{\s*\d?\s*\}\s*:\s*\{\s*\d?\s*:\s*x\s*\}\s*:\s*(\S+)", 0, RegexReturn.ListByMatch, EDP.ReturnValue) + Private ReadOnly ContainerStrConv As New CustomProvider(Function(input) If(ACheck(Of Integer)(input), input, $"""{input}""")) + Private ReadOnly ContainerConv As New CustomProvider(Function(ByVal e As Object) As Object + With DirectCast(e, EContainer) + Dim value$ = String.Empty + If .ListExists Then + value = .Select(Function(ee) ee(0).Value).ListToStringE(",", ContainerStrConv, False, String.Empty, EDP.ReturnValue) + If Not value.IsEmptyString Then value = $"[{value}]" + Else + value = AConvert(Of String)(.Value, ContainerStrConv, String.Empty, EDP.SendToLog, EDP.ReturnValue) + End If + If Not value.IsEmptyString Then + value = $"""{ .Name}"": {value}" + Else + value = $"""{ .Name}"": """"" + End If + Return value + End With + End Function) + Friend Shared Function GetFormat(ByVal j As EContainer, Optional ByVal Check As Boolean = False, + Optional ByRef CheckResult As Boolean = False, + Optional ByVal TryConfig As Boolean = False, Optional ByRef IsConfig As Boolean = False) As String + Dim pattern$ = String.Empty + With If(TryConfig, j(ConfigNodes), j) + If .ListExists Then + If Not .Value("format").IsEmptyString Then + pattern = .Value("format").Replace("{}", "{0}").Replace("{:x}", "{1:x}") + ElseIf Not .Value("prefix").IsEmptyString And Not .Value("suffix").IsEmptyString Then + pattern = .Value("prefix") & FormatMidPart & .Value("suffix") + ElseIf Not .Value("start").IsEmptyString And Not .Value("end").IsEmptyString Then + pattern = .Value("start") & FormatMidPart & .Value("end") + End If + + Dim result As Boolean = Not pattern.IsEmptyString And .Item("checksum_indexes").ListExists And + Not .Value("static_param").IsEmptyString And Not .Value("checksum_constant").IsEmptyString + If Check Then CheckResult = result + If Not result And Not TryConfig Then Return GetFormat(j, Check, CheckResult, True, IsConfig) + End If + End With + Return pattern + End Function + Private Function ConvertAuthText() As String + Dim result$ = String.Empty + With CurrentContainer + If .ListExists Then + Dim f$ = GetFormat(.Self) + If Not f.IsEmptyString Then + Dim l As List(Of String) = RegexReplace(f, FormatExtract) + If l.ListExists(3) Then + Dim s$ = l(1), e$ = l(2) + .Value("format") = s & FormatMidPart & e + .Value("prefix") = s + .Value("suffix") = e + .Value("start") = s + .Value("end") = e + Dim t$ = .ListToStringE(",", ContainerConv, False) + If Not t.IsEmptyString Then t = "{" & t & "}" + Return t + End If + End If + End If + End With + Return String.Empty + End Function +#End Region +#Region "Load, Save" + Private Function GetTextLines(ByVal Input As String) As List(Of String) + If Not Input.IsEmptyString Then + Return ListAddList(Nothing, Input.StringTrim.Split(vbCrLf), LAP.NotContainsOnly, EDP.ReturnValue, + CType(Function(inp$) inp.StringTrim, Func(Of Object, Object))) + Else + Return New List(Of String) + End If + End Function + Private Sub ParseConsts(ByVal Source As String) + If Not Source.IsEmptyString Then + Dim l As List(Of String) = GetTextLines(Source) + Dim v$() + If l.ListExists Then + RulesConstants.Clear() + For Each value$ In l + If Not value.IsEmptyString Then + v = value.Split("=") + If v.ListExists(2) Then RulesConstants.Add(v(0), v(1)) + End If + Next + End If + End If + End Sub + Private Const RulesNode As String = "Rules" + Private _InitialValuesLoaded As Boolean = False + Private Sub LoadInitialValues() + If Not _InitialValuesLoaded Then + _InitialValuesLoaded = True + + If Not OFScraperConfigPatternFile.Exists Then + Dim t$ = Text.Encoding.UTF8.GetString(My.Resources.OFResources.OFScraperConfigPattern) + TextSaver.SaveTextToFile(t, OFScraperConfigPatternFile, True) + End If + + If Not OFScraperConfigPatternFileConst.Exists Then _ + TextSaver.SaveTextToFile(My.Resources.OFResources.OFScraperConfigPatternConstants, OFScraperConfigPatternFileConst, True) + + If OFScraperConfigPatternFileConst.Exists Then ParseConsts(OFScraperConfigPatternFileConst.GetText(OFError)) + + If DynamicRulesXml.Exists Then + Rules.Clear() + Using x As New XmlFile(DynamicRulesXml, Protector.Modes.All, False) With {.XmlReadOnly = True, .AllowSameNames = True} + x.LoadData(OFError) + Dim dNull As Date = Now.AddYears(-1) + LastUpdateTimeFile = x.Value(Name_LastUpdateTimeFile).ToDateDef(dNull) + LastUpdateTimeRules = x.Value(Name_LastUpdateTimeRules).ToDateDef(dNull) + ProtectFile = x.Value(Name_ProtectFile).FromXML(Of Boolean)(False) + Mode = x.Value(Name_Mode).FromXML(Of Integer)(Modes.List) + UpdateInterval = x.Value(Name_UpdateInterval).FromXML(Of Integer)(UpdateIntervalDefault) + PersonalRule = x.Value(Name_PersonalRule) + RulesForceUpdateRequired = x.Value(Name_RulesForceUpdateRequired).FromXML(Of Boolean)(False) + RulesUpdateConst = x.Value(Name_RulesUpdateConst).FromXML(Of Boolean)(True) + RulesReplaceConfig = x.Value(Name_RulesReplaceConfig).FromXML(Of Boolean)(True) + AddErrorsToLog = x.Value(Name_AddErrorsToLog).FromXML(Of Boolean)(False) + ConfigAutoUpdate = x.Value(Name_ConfigAutoUpdate).FromXML(Of Boolean)(True) + RulesConfigManualMode = x.Value(Name_RulesConfigManualMode).FromXML(Of Boolean)(True) + ConfigLastDateUpdate = x.Value(Name_ConfigLastDateUpdate).ToDateDef(Now.AddYears(-1)) + If x.Contains(RulesNode) Then Rules.ListAddList(x({RulesNode}), LAP.IgnoreICopier, OFError) + End Using + End If + End If + End Sub + Friend Sub Save() + Using x As New XmlFile With {.AllowSameNames = True, .Name = "DynamicRules"} + x.Add(Name_LastUpdateTimeFile, LastUpdateTimeFile.ToStringDateDef) + x.Add(Name_LastUpdateTimeRules, LastUpdateTimeRules.ToStringDateDef) + x.Add(Name_ProtectFile, ProtectFile.BoolToInteger) + x.Add(Name_Mode, CInt(Mode)) + x.Add(Name_UpdateInterval, UpdateInterval) + x.Add(Name_PersonalRule, PersonalRule) + x.Add(Name_RulesForceUpdateRequired, RulesForceUpdateRequired.BoolToInteger) + x.Add(Name_RulesUpdateConst, RulesUpdateConst.BoolToInteger) + x.Add(Name_RulesReplaceConfig, RulesReplaceConfig.BoolToInteger) + x.Add(Name_AddErrorsToLog, AddErrorsToLog.BoolToInteger) + x.Add(Name_ConfigAutoUpdate, ConfigAutoUpdate.BoolToInteger) + x.Add(Name_RulesConfigManualMode, RulesConfigManualMode.BoolToInteger) + x.Add(Name_ConfigLastDateUpdate, ConfigLastDateUpdate.ToStringDateDef) + If Count > 0 Then + Rules.Sort() + x.Add(New EContainer(RulesNode)) + x.Last.AddRange(Rules) + End If + x.Save(DynamicRulesXml, OFError) + End Using + If Count > 0 Then + Using t As New TextSaver(DynamicRulesFile) + Rules.ForEach(Sub(r) If Not r.UrlRepo.IsEmptyString Then t.AppendLine(r.UrlRepo)) + t.Save(OFError) + End Using + End If + End Sub +#End Region +#Region "Update" + Private _UpdateInProgress As Boolean = False + Private _ForcedUpdate As Boolean = False + Friend Function Update(ByVal Force As Boolean, Optional ByVal LoadListOnly As Boolean = False) As Boolean + Dim skip As Boolean = _UpdateInProgress + If skip And _ForcedUpdate Then Force = False + _ForcedUpdate = Force + While _UpdateInProgress : Threading.Thread.Sleep(200) : End While + If Not skip Or Force Then UpdateImpl(Force Or RulesForceUpdateRequired, LoadListOnly) + Return Exists + End Function + Private Sub UpdateImpl(ByVal Force As Boolean, Optional ByVal LoadListOnly As Boolean = False) + Try + If Not _UpdateInProgress Then + _UpdateInProgress = True + + LoadInitialValues() + + Dim r$ + Dim process As Boolean = False, updated As Boolean = False + Dim forceSave As Boolean = RulesForceUpdateRequired Or Not DynamicRulesFile.Exists Or Not DynamicRulesXml.Exists + Dim textLocal As List(Of String) + Dim i% + Dim rule As DynamicRulesValue + Dim e As EContainer + Dim errDate As Date = Now.AddYears(-1) + Dim d As Date? + '2024-06-12T12:44:06.000-05:00 + Dim dateProvider As New ADateTime("yyyy-MM-ddTHH:mm:ss.fff%K") + + RulesForceUpdateRequired = False + + If Not DynamicRulesFile.Exists Then process = True : ValidateRulesFile() + + 'update rules list + If Not LoadListOnly And (LastUpdateTimeFile.AddMinutes(UpdateInterval) < Now Or process Or Force) Then + LastUpdateTimeFile = Now + r = Responser.GetResponse("https://raw.githubusercontent.com/AAndyProgram/SCrawler/main/SCrawler/API/OnlyFans/DynamicRules.txt") + If Not r.IsEmptyString Then + Dim textWeb As List(Of String) = GetTextLines(r) + Dim fileText$ + If textWeb.ListExists Then + Using t As New TextSaver(DynamicRulesFile) + If ProtectFile Then + fileText = DynamicRulesFile.GetText(OFError) + t.Append(fileText) + textLocal = GetTextLines(fileText) + If textLocal.ListExists Then _ + textLocal.ForEach(Sub(tt) If Not tt.IsEmptyString AndAlso Not textWeb.Contains(tt, RulesLinesComparer) Then _ + t.AppendLine(tt) : updated = True) : textLocal.Clear() + Else + t.Append(r) + updated = True + End If + t.Save(OFError) + End Using + textWeb.Clear() + End If + End If + End If + + 'update config and consts + If Not LoadListOnly AndAlso ConfigAutoUpdate AndAlso ConfigLastDateUpdate.AddMinutes(UpdateInterval) < Now Then + Dim __upConf As Boolean = False + Dim __dConf As Date = ConfigLastDateUpdate + Dim parseConfigFiles As Action(Of DynamicRulesValue, SFile, Boolean) = + Sub(ByVal __rule As DynamicRulesValue, ByVal __fileSave As SFile, ByVal isConstFile As Boolean) + r = Responser.GetResponse(__rule.UrlLatestCommit) + If Not r.IsEmptyString Then + e = JsonDocument.Parse(r, OFError) + If e.ListExists Then + d = AConvert(Of Date)(e.Value("date"), dateProvider, Nothing) + Dim dConf As Date = If(d, errDate) + If dConf > __dConf Then + __dConf = dConf + __upConf = True + updated = True + r = Responser.GetResponse(__rule.UrlRaw) + If Not r.IsEmptyString Then + TextSaver.SaveTextToFile(r, __fileSave, True, False, OFError) + If isConstFile Then ParseConsts(r) + End If + End If + e.Dispose() + End If + End If + End Sub + 'Update consts + If RulesUpdateConst Then parseConfigFiles(ConfigConstAddress, OFScraperConfigPatternFileConst, True) + 'Update config + parseConfigFiles(ConfigAddress, OFScraperConfigPatternFile, False) + If __upConf Then ConfigLastDateUpdate = Now + End If + + 'generate rules, update rules dates + If LastUpdateTimeRules.AddMinutes(UpdateInterval) < Now Or updated Or Force Or LoadListOnly Then + process = True + If Mode = Modes.Personal And Not PersonalRule.IsEmptyString Then + If Not LoadListOnly Then LastUpdateTimeRules = Now : updated = True + Else + If Not LoadListOnly Then LastUpdateTimeRules = Now : updated = True + textLocal = GetTextLines(DynamicRulesFile.GetText(OFError)) + If textLocal.ListExists Then + For Each url$ In textLocal + url = url.StringTrim + If Not url.IsEmptyString Then + i = IndexOf(url) + If i >= 0 Then + rule = Rules(i) + Else + rule = ParseURL(url) + If rule.Valid Then + i = Add(rule, False, False) + Else + rule = Nothing + End If + End If + + If Not LoadListOnly Then + If i >= 0 And rule.Valid And Not rule.UrlLatestCommit.IsEmptyString Then + r = Responser.GetResponse(rule.UrlLatestCommit) + If Not r.IsEmptyString Then + e = JsonDocument.Parse(r, OFError) + If e.ListExists Then + d = AConvert(Of Date)(e.Value("date"), dateProvider, Nothing) + rule.UpdatedAt = If(d, errDate) + e.Dispose() + Else + rule.Broken = True + End If + Else + rule.Broken = True + End If + Rules(i) = rule + End If + End If + End If + Next + End If + End If + End If + + If Count > 0 Then Rules.Sort() + + 'download and load the rule + If (LoadListOnly And AuthFile.Exists) Or (Not LoadListOnly And ((updated And Count > 0) Or Not AuthFile.Exists)) Then + _CurrentRule = Nothing + _CurrentContainer.DisposeIfReady + _CurrentContainer = Nothing + Dim processRule As Func(Of DynamicRulesValue, Boolean, DialogResult) = + Function(ByVal __rule As DynamicRulesValue, ByVal reparseAuth As Boolean) As DialogResult + Dim fromAuthFile As Boolean = (LoadListOnly Or reparseAuth) AndAlso AuthFile.Exists + If fromAuthFile Then + r = AuthFile.GetText(OFError) + Else + r = GetWebString(__rule.UrlRaw,, OFError) + End If + Dim j As EContainer = JsonDocument.Parse(r, OFError) + Dim checkResult As Boolean = False + Dim isConfig As Boolean = False + Dim textToSave As String = r + If j.ListExists AndAlso Not GetFormat(j, True, checkResult,, isConfig).IsEmptyString AndAlso checkResult Then + If isConfig Then textToSave = RegexReplace(r, ConfigRulesExtract) + If textToSave.IsEmptyString Then + Return DialogResult.Retry + Else + _CurrentRule = __rule + _CurrentContainer = If(isConfig, j(ConfigNodes), j) + textToSave = ConvertAuthText() + _CurrentContainerRulesText = textToSave + If (Not fromAuthFile Or Not textToSave.StringTrim = r.StringTrim) And Not textToSave.IsEmptyString Then + TextSaver.SaveTextToFile(textToSave, AuthFile, True, False, OFError) + If Not reparseAuth Then processRule(__rule, True) + End If + Return DialogResult.OK + End If + End If + Return DialogResult.No + End Function + If Mode = Modes.Personal And Not PersonalRule.IsEmptyString Then + processRule(New DynamicRulesValue With {.UrlRepo = PersonalRule, .UrlRaw = PersonalRule}, False) + Else + For Each rule In Rules + If rule.Valid And Not rule.Broken Then + Select Case processRule(rule, False) + Case DialogResult.Retry : Continue For + Case DialogResult.OK : Exit For + End Select + End If + Next + End If + End If + + If updated Or forceSave Then Save() + + _UpdateInProgress = False + End If + Catch ex As Exception + ErrorsDescriber.Execute(OFError, ex, "[OnlyFans.DynamicRulesEnv.UpdateImpl]") + _UpdateInProgress = False + End Try + End Sub +#End Region +#Region "Add, IndexOf" + Friend Function Add(ByVal Rule As DynamicRulesValue, Optional ByVal AutoSort As Boolean = True, Optional ByVal AutoSave As Boolean = False) As Integer + If Rule.Valid Then + Dim i% = IndexOf(Rule) + If i = -1 Then + Rules.Add(Rule) + i = Count - 1 + If AutoSort Then Rules.Sort() : i = IndexOf(Rule) + If AutoSave Then Save() + End If + Return i + Else + Return -1 + End If + End Function + Friend Function RemoveAt(ByVal Index As Integer) As Boolean + If Index.ValueBetween(0, Count - 1) Then + Rules.RemoveAt(Index) + Return True + Else + Return False + End If + End Function + Friend Function IndexOf(ByVal URL As String) As Integer + If Count > 0 Then + URL = URL.StringToLower.Trim + Return Rules.FindIndex(Function(r) r.UrlRepo.StringToLower = URL Or r.UrlRaw.StringToLower = URL Or r.UrlLatestCommit.StringToLower = URL) + Else + Return -1 + End If + End Function +#End Region +#Region "ICopier Support" + Friend Overloads Function Copy() As Object Implements ICopier.Copy + Return (New DynamicRulesEnv).Copy(Me) + End Function + Friend Overloads Function Copy(ByVal Source As Object) As Object Implements ICopier.Copy + Return Copy(Source, False) + End Function + Friend Overloads Function Copy(ByVal Source As Object, ByVal UpdateForceProperty As Boolean) As Object + If Not Source Is Nothing Then + With DirectCast(Source, DynamicRulesEnv) + If Not RulesForceUpdateRequired And UpdateForceProperty Then _ + RulesForceUpdateRequired = Not Rules.ListEquals(.Rules) Or Not Mode = .Mode Or + (.Mode = Modes.Personal And Not PersonalRule = .PersonalRule) + ProtectFile = .ProtectFile + Mode = .Mode + UpdateInterval = .UpdateInterval + PersonalRule = .PersonalRule + If Not RulesForceUpdateRequired Then RulesForceUpdateRequired = .RulesForceUpdateRequired + RulesUpdateConst = .RulesUpdateConst + RulesReplaceConfig = .RulesReplaceConfig + AddErrorsToLog = .AddErrorsToLog + ConfigAutoUpdate = .ConfigAutoUpdate + RulesConfigManualMode = .RulesConfigManualMode + Rules.Clear() + If .Count > 0 Then Rules.AddRange(.Rules) + End With + Return Me + Else + Return Nothing + End If + End Function +#End Region +#Region "IEnumerable Support" + Private Function GetEnumerator() As IEnumerator(Of DynamicRulesValue) Implements IEnumerable(Of DynamicRulesValue).GetEnumerator + Return New MyEnumerator(Of DynamicRulesValue)(Me) + End Function + Private Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator + Return GetEnumerator() + End Function +#End Region +#Region "IDisposable Support" + Private disposedValue As Boolean = False + Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean) + If Not disposedValue Then + If disposing Then + Rules.Clear() + _CurrentContainer.DisposeIfReady + Responser.DisposeIfReady + End If + _CurrentContainer = Nothing + disposedValue = True + End If + End Sub + Protected Overrides Sub Finalize() + Dispose(False) + MyBase.Finalize() + End Sub + Friend Overloads Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub +#End Region + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/API/OnlyFans/OFResources.Designer.vb b/SCrawler/API/OnlyFans/OFResources.Designer.vb index 138578b..cbc92de 100644 --- a/SCrawler/API/OnlyFans/OFResources.Designer.vb +++ b/SCrawler/API/OnlyFans/OFResources.Designer.vb @@ -64,6 +64,20 @@ Namespace My.Resources End Set End Property + ''' + ''' Looks up a localized string similar to https://github.com/datawhores/onlyfans-dynamic-rules/blob/main/dynamicRules.json + '''https://github.com/riley-access-labs/onlyfans-dynamic-rules-1/blob/main/dynamicRules.json + '''https://github.com/riley-access-labs/onlyfans-dynamic-rules-1/blob/patch-1/dynamicRules.json + '''https://github.com/DATAHOARDERS/dynamic-rules/blob/main/onlyfans.json + '''https://github.com/DIGITALCRIMINAL/dynamic-rules/blob/main/onlyfans.json + '''https://github.com/deviint/onlyfans-dynamic-rules/blob/main/dynamicRules.json. + ''' + Friend Shared ReadOnly Property DynamicRules() As String + Get + Return ResourceManager.GetString("DynamicRules", resourceCulture) + End Get + End Property + ''' ''' Looks up a localized resource of type System.Byte[]. ''' @@ -73,5 +87,15 @@ Namespace My.Resources Return CType(obj,Byte()) End Get End Property + + ''' + ''' Looks up a localized string similar to dynamic-mode-default=generic + '''RULE_VALUE=DYNAMIC_GENERIC_URL. + ''' + Friend Shared ReadOnly Property OFScraperConfigPatternConstants() As String + Get + Return ResourceManager.GetString("OFScraperConfigPatternConstants", resourceCulture) + End Get + End Property End Class End Namespace diff --git a/SCrawler/API/OnlyFans/OFResources.resx b/SCrawler/API/OnlyFans/OFResources.resx index 31b7c00..9612d0b 100644 --- a/SCrawler/API/OnlyFans/OFResources.resx +++ b/SCrawler/API/OnlyFans/OFResources.resx @@ -118,7 +118,13 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + DynamicRules.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + OFScraperConfigPattern.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + OFScraperConfigPatternConstants.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + \ No newline at end of file diff --git a/SCrawler/API/OnlyFans/OFScraperConfigPattern.json b/SCrawler/API/OnlyFans/OFScraperConfigPattern.json index fb702f7..cee67f6 100644 --- a/SCrawler/API/OnlyFans/OFScraperConfigPattern.json +++ b/SCrawler/API/OnlyFans/OFScraperConfigPattern.json @@ -1,65 +1,63 @@ { - "config": { - "main_profile": "main_profile", - "metadata": "{configpath}/{profile}/.data/{model_username}_{model_id}", - "discord": "", - "file_options": { - "save_location": "", - "dir_format": "", - "file_format": "{filename}.{ext}", - "textlength": 0, - "space-replacer": " ", - "date": "YYYY-MM-DD" - }, - "download_options": { - "file_size_limit": 0, - "file_size_min": 0, - "filter": [ - "Images", - "Audios", - "Videos" - ], - "auto_resume": false - }, - "binary_options": { - "mp4decrypt": "", - "ffmpeg": "" - }, - "cdm_options": { - "private-key": null, - "client-id": null, - "key-mode-default": "cdrm", - "keydb_api": "" - }, - "performance_options": { - "download-sems": 6, - "maxfile-sem": 0, - "threads": 5 - }, - "advanced_options": { - "code-execution": false, - "dynamic-mode-default": "sneaky", - "backend": "aio", - "downloadbars": false, - "cache-mode": "sqlite", - "appendlog": true, - "custom": null, - "sanitize_text": false, - "avatar": true, - "custom_values": { - "SNEAKY": "https://raw.githubusercontent.com/Growik/onlyfans-dynamic-rules/main/rules.json", - "CDRM": "https://old.cdrm-project.com/wv" - } - }, - "responsetype": { - "timeline": "Posts", - "message": "Messages", - "archived": "Archived", - "paid": "Messages", - "stories": "Stories", - "highlights": "Stories", - "profile": "Profile", - "pinned": "Posts" + "main_profile": "main_profile", + "metadata": "{configpath}/{profile}/.data/{model_username}_{model_id}", + "discord": "", + "file_options": { + "save_location": "", + "dir_format": "", + "file_format": "{filename}.{ext}", + "textlength": 0, + "space_replacer": " ", + "date": "YYYY-MM-DD" + }, + "download_options": { + "file_size_max": 0, + "file_size_min": 0, + "filter": [ + "Images", + "Audios", + "Videos" + ], + "auto_resume": false + }, + "binary_options": { + "mp4decrypt": "", + "ffmpeg": "" + }, + "cdm_options": { + "private-key": null, + "client-id": null, + "key-mode-default": "cdrm", + "keydb_api": "" + }, + "performance_options": { + "download-sems": 6, + "maxfile-sem": 0, + "threads": 5 + }, + "advanced_options": { + "code-execution": false, + "dynamic-mode-default": "generic", + "backend": "aio", + "downloadbars": false, + "cache-mode": "sqlite", + "appendlog": true, + "custom": null, + "sanitize_text": false, + "avatar": true, + "custom_values": { + "DYNAMIC_GENERIC_URL": "https://raw.githubusercontent.com/datawhores/onlyfans-dynamic-rules/main/dynamicRules.json", + "CDRM": "https://old.cdrm-project.com/wv" } + }, + "responsetype": { + "timeline": "Posts", + "message": "Messages", + "archived": "Archived", + "paid": "Messages", + "stories": "Stories", + "highlights": "Stories", + "profile": "Profile", + "pinned": "Posts" } } \ No newline at end of file diff --git a/SCrawler/API/OnlyFans/OFScraperConfigPatternConstants.txt b/SCrawler/API/OnlyFans/OFScraperConfigPatternConstants.txt new file mode 100644 index 0000000..1dd4c07 --- /dev/null +++ b/SCrawler/API/OnlyFans/OFScraperConfigPatternConstants.txt @@ -0,0 +1,2 @@ +dynamic-mode-default=generic +RULE_VALUE=DYNAMIC_GENERIC_URL \ No newline at end of file diff --git a/SCrawler/API/OnlyFans/OnlyFansAdvancedSettingsForm.Designer.vb b/SCrawler/API/OnlyFans/OnlyFansAdvancedSettingsForm.Designer.vb new file mode 100644 index 0000000..afee3df --- /dev/null +++ b/SCrawler/API/OnlyFans/OnlyFansAdvancedSettingsForm.Designer.vb @@ -0,0 +1,361 @@ +' Copyright (C) Andy https://github.com/AAndyProgram +' This program is free software: you can redistribute it and/or modify +' it under the terms of the GNU General Public License as published by +' the Free Software Foundation, either version 3 of the License, or +' (at your option) any later version. +' +' This program is distributed in the hope that it will be useful, +' but WITHOUT ANY WARRANTY +Namespace API.OnlyFans + + Partial Friend Class OnlyFansAdvancedSettingsForm : Inherits System.Windows.Forms.Form + + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + Private components As System.ComponentModel.IContainer + + Private Sub InitializeComponent() + Me.components = New System.ComponentModel.Container() + Dim CONTAINER_MAIN As System.Windows.Forms.ToolStripContainer + Dim TP_MAIN As System.Windows.Forms.TableLayoutPanel + Dim ActionButton7 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(OnlyFansAdvancedSettingsForm)) + Dim ActionButton8 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton9 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim TP_RULES_LIST As System.Windows.Forms.TableLayoutPanel + Dim TP_RULES_LIST_LEFT As System.Windows.Forms.TableLayoutPanel + Dim TT_MAIN As System.Windows.Forms.ToolTip + Me.TXT_UP_INTERVAL = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.TXT_PERSONAL_RULE = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.CONTAINER_LIST = New System.Windows.Forms.ToolStripContainer() + Me.LIST_RULES = New System.Windows.Forms.ListBox() + Me.OPT_RULES_LIST = New System.Windows.Forms.RadioButton() + Me.CH_PROTECTED = New System.Windows.Forms.CheckBox() + Me.CH_FORCE_UPDATE = New System.Windows.Forms.CheckBox() + Me.CH_LOG_ERR = New System.Windows.Forms.CheckBox() + Me.CH_RULES_REPLACE_CONFIG = New System.Windows.Forms.CheckBox() + Me.CH_UPDATE_CONF = New System.Windows.Forms.CheckBox() + Me.CH_UPDATE_RULES_CONST = New System.Windows.Forms.CheckBox() + Me.CH_CONFIG_MANUAL_MODE = New System.Windows.Forms.CheckBox() + CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer() + TP_MAIN = New System.Windows.Forms.TableLayoutPanel() + TP_RULES_LIST = New System.Windows.Forms.TableLayoutPanel() + TP_RULES_LIST_LEFT = New System.Windows.Forms.TableLayoutPanel() + TT_MAIN = New System.Windows.Forms.ToolTip(Me.components) + CONTAINER_MAIN.ContentPanel.SuspendLayout() + CONTAINER_MAIN.SuspendLayout() + TP_MAIN.SuspendLayout() + CType(Me.TXT_UP_INTERVAL, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.TXT_PERSONAL_RULE, System.ComponentModel.ISupportInitialize).BeginInit() + TP_RULES_LIST.SuspendLayout() + Me.CONTAINER_LIST.ContentPanel.SuspendLayout() + Me.CONTAINER_LIST.SuspendLayout() + TP_RULES_LIST_LEFT.SuspendLayout() + Me.SuspendLayout() + ' + 'CONTAINER_MAIN + ' + ' + 'CONTAINER_MAIN.ContentPanel + ' + CONTAINER_MAIN.ContentPanel.Controls.Add(TP_MAIN) + CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(464, 341) + CONTAINER_MAIN.Dock = System.Windows.Forms.DockStyle.Fill + CONTAINER_MAIN.LeftToolStripPanelVisible = False + CONTAINER_MAIN.Location = New System.Drawing.Point(0, 0) + CONTAINER_MAIN.Name = "CONTAINER_MAIN" + CONTAINER_MAIN.RightToolStripPanelVisible = False + CONTAINER_MAIN.Size = New System.Drawing.Size(464, 341) + CONTAINER_MAIN.TabIndex = 1 + CONTAINER_MAIN.TopToolStripPanelVisible = False + ' + 'TP_MAIN + ' + TP_MAIN.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single] + TP_MAIN.ColumnCount = 1 + TP_MAIN.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_MAIN.Controls.Add(Me.TXT_UP_INTERVAL, 0, 5) + TP_MAIN.Controls.Add(Me.TXT_PERSONAL_RULE, 0, 6) + TP_MAIN.Controls.Add(TP_RULES_LIST, 0, 7) + TP_MAIN.Controls.Add(Me.CH_LOG_ERR, 0, 0) + TP_MAIN.Controls.Add(Me.CH_RULES_REPLACE_CONFIG, 0, 1) + TP_MAIN.Controls.Add(Me.CH_UPDATE_CONF, 0, 4) + TP_MAIN.Controls.Add(Me.CH_UPDATE_RULES_CONST, 0, 2) + TP_MAIN.Controls.Add(Me.CH_CONFIG_MANUAL_MODE, 0, 3) + TP_MAIN.Dock = System.Windows.Forms.DockStyle.Fill + TP_MAIN.Location = New System.Drawing.Point(0, 0) + TP_MAIN.Name = "TP_MAIN" + TP_MAIN.RowCount = 8 + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_MAIN.Size = New System.Drawing.Size(464, 341) + TP_MAIN.TabIndex = 0 + ' + 'TXT_UP_INTERVAL + ' + ActionButton7.BackgroundImage = CType(resources.GetObject("ActionButton7.BackgroundImage"), System.Drawing.Image) + ActionButton7.Name = "Refresh" + ActionButton7.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh + ActionButton8.BackgroundImage = CType(resources.GetObject("ActionButton8.BackgroundImage"), System.Drawing.Image) + ActionButton8.Name = "Clear" + ActionButton8.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + Me.TXT_UP_INTERVAL.Buttons.Add(ActionButton7) + Me.TXT_UP_INTERVAL.Buttons.Add(ActionButton8) + Me.TXT_UP_INTERVAL.CaptionText = "Dynamic rules update" + Me.TXT_UP_INTERVAL.CaptionToolTipEnabled = True + Me.TXT_UP_INTERVAL.CaptionToolTipText = "'Dynamic rules' update interval (minutes). Default: 1440" + Me.TXT_UP_INTERVAL.CaptionWidth = 120.0R + Me.TXT_UP_INTERVAL.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_UP_INTERVAL.Location = New System.Drawing.Point(4, 134) + Me.TXT_UP_INTERVAL.Name = "TXT_UP_INTERVAL" + Me.TXT_UP_INTERVAL.Size = New System.Drawing.Size(456, 22) + Me.TXT_UP_INTERVAL.TabIndex = 5 + ' + 'TXT_PERSONAL_RULE + ' + Me.TXT_PERSONAL_RULE.AutoShowClearButton = True + ActionButton9.BackgroundImage = CType(resources.GetObject("ActionButton9.BackgroundImage"), System.Drawing.Image) + ActionButton9.Enabled = False + ActionButton9.Name = "Clear" + ActionButton9.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + ActionButton9.Visible = False + Me.TXT_PERSONAL_RULE.Buttons.Add(ActionButton9) + Me.TXT_PERSONAL_RULE.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.RadioButton + Me.TXT_PERSONAL_RULE.CaptionText = "Dynamic rules URL" + Me.TXT_PERSONAL_RULE.CaptionToolTipEnabled = True + Me.TXT_PERSONAL_RULE.CaptionToolTipText = "Overwrite 'Dynamic rules' with this URL." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Change this value only if you know what" & + " you are doing." + Me.TXT_PERSONAL_RULE.CaptionWidth = 120.0R + Me.TXT_PERSONAL_RULE.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_PERSONAL_RULE.LeaveDefaultButtons = True + Me.TXT_PERSONAL_RULE.Location = New System.Drawing.Point(4, 163) + Me.TXT_PERSONAL_RULE.Name = "TXT_PERSONAL_RULE" + Me.TXT_PERSONAL_RULE.Size = New System.Drawing.Size(456, 22) + Me.TXT_PERSONAL_RULE.TabIndex = 6 + ' + 'TP_RULES_LIST + ' + TP_RULES_LIST.ColumnCount = 2 + TP_RULES_LIST.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 120.0!)) + TP_RULES_LIST.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_RULES_LIST.Controls.Add(Me.CONTAINER_LIST, 1, 0) + TP_RULES_LIST.Controls.Add(TP_RULES_LIST_LEFT, 0, 0) + TP_RULES_LIST.Dock = System.Windows.Forms.DockStyle.Fill + TP_RULES_LIST.Location = New System.Drawing.Point(4, 192) + TP_RULES_LIST.Name = "TP_RULES_LIST" + TP_RULES_LIST.RowCount = 1 + TP_RULES_LIST.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_RULES_LIST.Size = New System.Drawing.Size(456, 145) + TP_RULES_LIST.TabIndex = 7 + ' + 'CONTAINER_LIST + ' + Me.CONTAINER_LIST.BottomToolStripPanelVisible = False + ' + 'CONTAINER_LIST.ContentPanel + ' + Me.CONTAINER_LIST.ContentPanel.Controls.Add(Me.LIST_RULES) + Me.CONTAINER_LIST.ContentPanel.Size = New System.Drawing.Size(330, 114) + Me.CONTAINER_LIST.Dock = System.Windows.Forms.DockStyle.Fill + Me.CONTAINER_LIST.LeftToolStripPanelVisible = False + Me.CONTAINER_LIST.Location = New System.Drawing.Point(123, 3) + Me.CONTAINER_LIST.Name = "CONTAINER_LIST" + Me.CONTAINER_LIST.RightToolStripPanelVisible = False + Me.CONTAINER_LIST.Size = New System.Drawing.Size(330, 139) + Me.CONTAINER_LIST.TabIndex = 1 + ' + 'LIST_RULES + ' + Me.LIST_RULES.Dock = System.Windows.Forms.DockStyle.Fill + Me.LIST_RULES.FormattingEnabled = True + Me.LIST_RULES.Location = New System.Drawing.Point(0, 0) + Me.LIST_RULES.Name = "LIST_RULES" + Me.LIST_RULES.Size = New System.Drawing.Size(330, 114) + Me.LIST_RULES.TabIndex = 0 + ' + 'TP_RULES_LIST_LEFT + ' + TP_RULES_LIST_LEFT.ColumnCount = 1 + TP_RULES_LIST_LEFT.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_RULES_LIST_LEFT.Controls.Add(Me.OPT_RULES_LIST, 0, 0) + TP_RULES_LIST_LEFT.Controls.Add(Me.CH_PROTECTED, 0, 1) + TP_RULES_LIST_LEFT.Controls.Add(Me.CH_FORCE_UPDATE, 0, 2) + TP_RULES_LIST_LEFT.Dock = System.Windows.Forms.DockStyle.Fill + TP_RULES_LIST_LEFT.Location = New System.Drawing.Point(0, 0) + TP_RULES_LIST_LEFT.Margin = New System.Windows.Forms.Padding(0) + TP_RULES_LIST_LEFT.Name = "TP_RULES_LIST_LEFT" + TP_RULES_LIST_LEFT.RowCount = 4 + TP_RULES_LIST_LEFT.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) + TP_RULES_LIST_LEFT.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) + TP_RULES_LIST_LEFT.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) + TP_RULES_LIST_LEFT.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_RULES_LIST_LEFT.Size = New System.Drawing.Size(120, 145) + TP_RULES_LIST_LEFT.TabIndex = 0 + ' + 'OPT_RULES_LIST + ' + Me.OPT_RULES_LIST.AutoSize = True + Me.OPT_RULES_LIST.CheckAlign = System.Drawing.ContentAlignment.MiddleRight + Me.OPT_RULES_LIST.Dock = System.Windows.Forms.DockStyle.Fill + Me.OPT_RULES_LIST.Location = New System.Drawing.Point(3, 3) + Me.OPT_RULES_LIST.Margin = New System.Windows.Forms.Padding(3, 3, 0, 3) + Me.OPT_RULES_LIST.Name = "OPT_RULES_LIST" + Me.OPT_RULES_LIST.Size = New System.Drawing.Size(117, 19) + Me.OPT_RULES_LIST.TabIndex = 0 + Me.OPT_RULES_LIST.TabStop = True + Me.OPT_RULES_LIST.Text = "Dynamic rules list" + Me.OPT_RULES_LIST.TextAlign = System.Drawing.ContentAlignment.MiddleRight + TT_MAIN.SetToolTip(Me.OPT_RULES_LIST, "List of dynamic rules sources." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "If selected, the most recently updated source wil" & + "l be selected.") + Me.OPT_RULES_LIST.UseVisualStyleBackColor = True + ' + 'CH_PROTECTED + ' + Me.CH_PROTECTED.AutoSize = True + Me.CH_PROTECTED.CheckAlign = System.Drawing.ContentAlignment.MiddleRight + Me.CH_PROTECTED.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_PROTECTED.Location = New System.Drawing.Point(3, 28) + Me.CH_PROTECTED.Margin = New System.Windows.Forms.Padding(3, 3, 0, 3) + Me.CH_PROTECTED.Name = "CH_PROTECTED" + Me.CH_PROTECTED.Size = New System.Drawing.Size(117, 19) + Me.CH_PROTECTED.TabIndex = 1 + Me.CH_PROTECTED.Text = "Protected list" + Me.CH_PROTECTED.TextAlign = System.Drawing.ContentAlignment.MiddleRight + TT_MAIN.SetToolTip(Me.CH_PROTECTED, "If checked, the new source will be added, but the rules list will not be overwrit" & + "ten by the updated one.") + Me.CH_PROTECTED.UseVisualStyleBackColor = True + ' + 'CH_FORCE_UPDATE + ' + Me.CH_FORCE_UPDATE.AutoSize = True + Me.CH_FORCE_UPDATE.CheckAlign = System.Drawing.ContentAlignment.MiddleRight + Me.CH_FORCE_UPDATE.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_FORCE_UPDATE.Location = New System.Drawing.Point(3, 53) + Me.CH_FORCE_UPDATE.Margin = New System.Windows.Forms.Padding(3, 3, 0, 3) + Me.CH_FORCE_UPDATE.Name = "CH_FORCE_UPDATE" + Me.CH_FORCE_UPDATE.Size = New System.Drawing.Size(117, 19) + Me.CH_FORCE_UPDATE.TabIndex = 2 + Me.CH_FORCE_UPDATE.Text = "Force update" + Me.CH_FORCE_UPDATE.TextAlign = System.Drawing.ContentAlignment.MiddleRight + TT_MAIN.SetToolTip(Me.CH_FORCE_UPDATE, "Check this if you want to force the rules to update.") + Me.CH_FORCE_UPDATE.UseVisualStyleBackColor = True + ' + 'CH_LOG_ERR + ' + Me.CH_LOG_ERR.AutoSize = True + Me.CH_LOG_ERR.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_LOG_ERR.Location = New System.Drawing.Point(4, 4) + Me.CH_LOG_ERR.Name = "CH_LOG_ERR" + Me.CH_LOG_ERR.Size = New System.Drawing.Size(456, 19) + Me.CH_LOG_ERR.TabIndex = 0 + Me.CH_LOG_ERR.Text = "Add dynamic rules errors to the log" + TT_MAIN.SetToolTip(Me.CH_LOG_ERR, "OnlyFans errors will be added to a separate log." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "A checked checkbox means that e" & + "rror notification will be added to the main log.") + Me.CH_LOG_ERR.UseVisualStyleBackColor = True + ' + 'CH_RULES_REPLACE_CONFIG + ' + Me.CH_RULES_REPLACE_CONFIG.AutoSize = True + Me.CH_RULES_REPLACE_CONFIG.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_RULES_REPLACE_CONFIG.Location = New System.Drawing.Point(4, 30) + Me.CH_RULES_REPLACE_CONFIG.Name = "CH_RULES_REPLACE_CONFIG" + Me.CH_RULES_REPLACE_CONFIG.Size = New System.Drawing.Size(456, 19) + Me.CH_RULES_REPLACE_CONFIG.TabIndex = 1 + Me.CH_RULES_REPLACE_CONFIG.Text = "Replace rules in OF-Scraper configuration file" + TT_MAIN.SetToolTip(Me.CH_RULES_REPLACE_CONFIG, "If checked, the dynamic rules (in the config) will be replaced with actual values" & + ".") + Me.CH_RULES_REPLACE_CONFIG.UseVisualStyleBackColor = True + ' + 'CH_UPDATE_CONF + ' + Me.CH_UPDATE_CONF.AutoSize = True + Me.CH_UPDATE_CONF.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_UPDATE_CONF.Location = New System.Drawing.Point(4, 108) + Me.CH_UPDATE_CONF.Name = "CH_UPDATE_CONF" + Me.CH_UPDATE_CONF.Size = New System.Drawing.Size(456, 19) + Me.CH_UPDATE_CONF.TabIndex = 4 + Me.CH_UPDATE_CONF.Text = "Update configuration file during update" + TT_MAIN.SetToolTip(Me.CH_UPDATE_CONF, "Update the configuration pattern from the site during update.") + Me.CH_UPDATE_CONF.UseVisualStyleBackColor = True + ' + 'CH_UPDATE_RULES_CONST + ' + Me.CH_UPDATE_RULES_CONST.AutoSize = True + Me.CH_UPDATE_RULES_CONST.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_UPDATE_RULES_CONST.Location = New System.Drawing.Point(4, 56) + Me.CH_UPDATE_RULES_CONST.Name = "CH_UPDATE_RULES_CONST" + Me.CH_UPDATE_RULES_CONST.Size = New System.Drawing.Size(456, 19) + Me.CH_UPDATE_RULES_CONST.TabIndex = 2 + Me.CH_UPDATE_RULES_CONST.Text = "Update rules constants file during update" + TT_MAIN.SetToolTip(Me.CH_UPDATE_RULES_CONST, "Update rules constants from the site during update") + Me.CH_UPDATE_RULES_CONST.UseVisualStyleBackColor = True + ' + 'CH_CONFIG_MANUAL_MODE + ' + Me.CH_CONFIG_MANUAL_MODE.AutoSize = True + Me.CH_CONFIG_MANUAL_MODE.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_CONFIG_MANUAL_MODE.Location = New System.Drawing.Point(4, 82) + Me.CH_CONFIG_MANUAL_MODE.Name = "CH_CONFIG_MANUAL_MODE" + Me.CH_CONFIG_MANUAL_MODE.Size = New System.Drawing.Size(456, 19) + Me.CH_CONFIG_MANUAL_MODE.TabIndex = 3 + Me.CH_CONFIG_MANUAL_MODE.Text = "Dynamic rules 'Manual' mode" + TT_MAIN.SetToolTip(Me.CH_CONFIG_MANUAL_MODE, "The rules will be added to the config as is, without using a link.") + Me.CH_CONFIG_MANUAL_MODE.UseVisualStyleBackColor = True + ' + 'OnlyFansAdvancedSettingsForm + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(464, 341) + Me.Controls.Add(CONTAINER_MAIN) + Me.Icon = Global.SCrawler.My.Resources.SiteResources.OnlyFansIcon_32 + Me.KeyPreview = True + Me.MinimizeBox = False + Me.MinimumSize = New System.Drawing.Size(480, 380) + Me.Name = "OnlyFansAdvancedSettingsForm" + Me.ShowInTaskbar = False + Me.Text = "Settings" + CONTAINER_MAIN.ContentPanel.ResumeLayout(False) + CONTAINER_MAIN.ResumeLayout(False) + CONTAINER_MAIN.PerformLayout() + TP_MAIN.ResumeLayout(False) + TP_MAIN.PerformLayout() + CType(Me.TXT_UP_INTERVAL, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.TXT_PERSONAL_RULE, System.ComponentModel.ISupportInitialize).EndInit() + TP_RULES_LIST.ResumeLayout(False) + Me.CONTAINER_LIST.ContentPanel.ResumeLayout(False) + Me.CONTAINER_LIST.ResumeLayout(False) + Me.CONTAINER_LIST.PerformLayout() + TP_RULES_LIST_LEFT.ResumeLayout(False) + TP_RULES_LIST_LEFT.PerformLayout() + Me.ResumeLayout(False) + + End Sub + + Private WithEvents TXT_UP_INTERVAL As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents TXT_PERSONAL_RULE As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents CONTAINER_LIST As ToolStripContainer + Private WithEvents LIST_RULES As ListBox + Private WithEvents OPT_RULES_LIST As RadioButton + Private WithEvents CH_PROTECTED As CheckBox + Private WithEvents CH_FORCE_UPDATE As CheckBox + Private WithEvents CH_LOG_ERR As CheckBox + Private WithEvents CH_RULES_REPLACE_CONFIG As CheckBox + Private WithEvents CH_UPDATE_CONF As CheckBox + Private WithEvents CH_UPDATE_RULES_CONST As CheckBox + Private WithEvents CH_CONFIG_MANUAL_MODE As CheckBox + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/API/OnlyFans/OnlyFansAdvancedSettingsForm.resx b/SCrawler/API/OnlyFans/OnlyFansAdvancedSettingsForm.resx new file mode 100644 index 0000000..596c17c --- /dev/null +++ b/SCrawler/API/OnlyFans/OnlyFansAdvancedSettingsForm.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + + False + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 + JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE + QVQ4T2P4//8/QczOJyyqHpzfiE0OQwAZC8iqszAzs7CJ69o4BR768V/W2jcGXQ0KB4aFNS3dDQtnrbCb + ePCK48wTN1wXXXzge/jXf/clV55zC4hIIatF0cjIyMikElzc57z0wX+XHd/+2+//99/ywP//xlu//tdb + +eK/4Zp3/1WTOhYzARViNUAluKjTdf37/0ZTTn9TbdhwXblhwwW1/qOP1Ja9+K8w+95/6cm3/6v2Xvkv + qKjniGGAoIqRpW3/4e8S9uGdzFz82gwMDFxAzCxm4ZegtuLDf+VJ1/8rZM25IqLvnM/CximCYYCic1QN + v7x2JIwPwyrJ3XNUylddE9G2TWNmZOBDl4czmJiZMSRBmFdSyYyJgUEQmxwIYxWEYXZBCUls4sgYq6CA + prWNbtG8nXKeaVPR5XiVjSxEzf0yYXy4BBMLO6eQjoOXZvrkbbazrv53Xf/2v4CSbjBMXkhBl1/CMyNZ + qWnvGy5pNQ+YONwAfjXzAOupl/47LLr333L50/96q9/8l23YdES6cO5KuYqVW+R7Tj6SnfP0v4hryjyY + HhQDmFjYeHVKFp7WX/Xuv9Kq9/+Vd/z7r7rv/3+l7f//y676DEwDN/9L+BVvYkKLCTgDhNkkVUyVlr74 + qbbz73/VOTc/qsy89kWx+9h7qbQpJwS1bbOAscGGrB6EUTggLOqf16C55ft/HlnNAFZOXgVWdi4FRgYG + VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + + + False + + + False + + + False + + + 17, 17 + + + False + + + 17, 17 + + + False + + + False + + + 17, 17 + + \ No newline at end of file diff --git a/SCrawler/API/OnlyFans/OnlyFansAdvancedSettingsForm.vb b/SCrawler/API/OnlyFans/OnlyFansAdvancedSettingsForm.vb new file mode 100644 index 0000000..fb3799b --- /dev/null +++ b/SCrawler/API/OnlyFans/OnlyFansAdvancedSettingsForm.vb @@ -0,0 +1,165 @@ +' Copyright (C) Andy https://github.com/AAndyProgram +' This program is free software: you can redistribute it and/or modify +' it under the terms of the GNU General Public License as published by +' the Free Software Foundation, either version 3 of the License, or +' (at your option) any later version. +' +' This program is distributed in the hope that it will be useful, +' but WITHOUT ANY WARRANTY +Imports PersonalUtilities.Forms +Imports PersonalUtilities.Forms.Controls.Base +Imports PersonalUtilities.Forms.Toolbars +Namespace API.OnlyFans + Friend Class OnlyFansAdvancedSettingsForm +#Region "Declarations" + Private WithEvents MyDefs As DefaultFormOptions + Friend Property CurrentRulesEnv As DynamicRulesEnv + Private ReadOnly Property CurrentRulesEnv_LIST As DynamicRulesEnv +#End Region +#Region "Initializer" + Friend Sub New(ByVal rules As DynamicRulesEnv) + InitializeComponent() + MyDefs = New DefaultFormOptions(Me, Settings.Design) + CurrentRulesEnv = rules + CurrentRulesEnv_LIST = New DynamicRulesEnv + CurrentRulesEnv_LIST.Copy(rules, False) + End Sub +#End Region +#Region "Form handlers" + Private Sub OnlyFansAdvancedSettingsForm_Load(sender As Object, e As EventArgs) Handles Me.Load + With MyDefs + .MyViewInitialize() + .AddOkCancelToolbar() + + .MyEditToolbar = New EditToolbar(Me,, CONTAINER_LIST.TopToolStripPanel) With {.Buttons = Nothing} + .MyEditToolbar.AddThisToolbar() + + With CurrentRulesEnv + Select Case .Mode + Case DynamicRulesEnv.Modes.List : OPT_RULES_LIST.Checked = True + Case DynamicRulesEnv.Modes.Personal : TXT_PERSONAL_RULE.Checked = True + End Select + CH_LOG_ERR.Checked = .AddErrorsToLog + CH_RULES_REPLACE_CONFIG.Checked = .RulesReplaceConfig + CH_UPDATE_RULES_CONST.Checked = .RulesUpdateConst + CH_CONFIG_MANUAL_MODE.Checked = .RulesConfigManualMode + CH_UPDATE_CONF.Checked = .ConfigAutoUpdate + TXT_UP_INTERVAL.Text = .UpdateInterval + If Not .PersonalRule.IsEmptyString Then TXT_PERSONAL_RULE.Text = .PersonalRule + Refill() + CH_PROTECTED.Checked = .ProtectFile + CH_FORCE_UPDATE.Checked = .RulesForceUpdateRequired + End With + + .MyFieldsCheckerE = New FieldsChecker + .MyFieldsCheckerE.AddControl(Of Integer)(TXT_UP_INTERVAL, TXT_UP_INTERVAL.CaptionText,, + New FieldsCheckerProviderSimple(Function(v) IIf(AConvert(Of Integer)(v, 0, EDP.ReturnValue) > 0, v, Nothing), + "The value of [{0}] field must be greater than 0")) + .MyFieldsCheckerE.EndLoaderOperations() + + .EndLoaderOperations() + End With + End Sub + Private Sub OnlyFansAdvancedSettingsForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed + CurrentRulesEnv_LIST.Dispose() + End Sub +#End Region +#Region "Refill" + Private Sub Refill() + With CurrentRulesEnv_LIST + Dim ls% = _LatestSelected + LIST_RULES.Items.Clear() + If .Count > 0 Then LIST_RULES.Items.AddRange(.Select(Function(r) r.UrlRepo).Cast(Of Object).ToArray) + Dim lim% = LIST_RULES.Items.Count - 1 + If (ls - 1).ValueBetween(0, lim) Then + ls -= 1 + ElseIf (ls + 1).ValueBetween(0, lim) Then + ls += 1 + End If + If ls.ValueBetween(0, lim) Then LIST_RULES.SelectedIndex = ls Else ls = -1 + _LatestSelected = ls + End With + End Sub +#End Region +#Region "OK, Cancel" + Private Sub MyDefs_ButtonOkClick(ByVal Sender As Object, ByVal e As KeyHandleEventArgs) Handles MyDefs.ButtonOkClick + If MyDefs.MyFieldsChecker.AllParamsOK Then + With CurrentRulesEnv + .Copy(CurrentRulesEnv_LIST, True) + .ProtectFile = CH_PROTECTED.Checked + .UpdateInterval = AConvert(Of Integer)(TXT_UP_INTERVAL.Text, DynamicRulesEnv.UpdateIntervalDefault) + .Mode = If(TXT_PERSONAL_RULE.Checked, DynamicRulesEnv.Modes.Personal, DynamicRulesEnv.Modes.List) + .PersonalRule = TXT_PERSONAL_RULE.Text + .RulesReplaceConfig = CH_RULES_REPLACE_CONFIG.Checked + .RulesUpdateConst = CH_UPDATE_RULES_CONST.Checked + .RulesConfigManualMode = CH_CONFIG_MANUAL_MODE.Checked + .ConfigAutoUpdate = CH_UPDATE_CONF.Checked + .AddErrorsToLog = CH_LOG_ERR.Checked + If CH_FORCE_UPDATE.Checked Then .RulesForceUpdateRequired = True + .NeedToSave = True + End With + MyDefs.CloseForm() + End If + End Sub +#End Region +#Region "Add, Delete" + Private Sub MyDefs_ButtonAddClick(ByVal Sender As Object, ByVal e As EditToolbarEventArgs) Handles MyDefs.ButtonAddClick + Const msgTitle$ = "Add a rule" + Dim i% + Dim rule As DynamicRulesValue + Dim r$ = InputBoxE("Enter a valid rules URL:", msgTitle) + If Not r.IsEmptyString Then + rule = Rules.ParseURL(r) + If rule.Valid Then + i = CurrentRulesEnv_LIST.IndexOf(r) + If i >= 0 Then + MsgBoxE({$"The rule you entered already exists:{vbCr}{rule.UrlRepo}", msgTitle}, vbCritical) + Else + CurrentRulesEnv_LIST.Add(rule, False, False) + Refill() + End If + Else + MsgBoxE({$"The rule you entered has an incompatible format:{vbCr}{r}", msgTitle}, vbCritical) + End If + End If + End Sub + Private Sub MyDefs_ButtonDeleteClickE(ByVal Sender As Object, ByVal e As EditToolbarEventArgs) Handles MyDefs.ButtonDeleteClickE + If _LatestSelected.ValueBetween(0, LIST_RULES.Items.Count - 1) Then + Dim r$ = LIST_RULES.Items(_LatestSelected) + If MsgBoxE({$"Are you sure you want to delete the following rule?{vbCr}{r}", "Delete a rule"}, vbExclamation,,, {"Process", "Cancel"}) = 0 Then + If CurrentRulesEnv_LIST.RemoveAt(_LatestSelected) Then + LIST_RULES.Items.RemoveAt(_LatestSelected) + Refill() + Else + MsgBoxE({$"The following rule cannot be deleted:{vbCr}{r}", "Delete a rule"}, vbCritical) + End If + End If + End If + End Sub +#End Region +#Region "Options" + Private Sub TXT_UP_INTERVAL_ActionOnButtonClick(ByVal Sender As Object, ByVal e As ActionButtonEventArgs) Handles TXT_UP_INTERVAL.ActionOnButtonClick + If e.DefaultButton = ActionButton.DefaultButtons.Refresh Then TXT_UP_INTERVAL.Text = DynamicRulesEnv.UpdateIntervalDefault + End Sub + Private Sub TXT_PERSONAL_RULE_ActionOnCheckedChange(ByVal Sender As Object, ByVal e As EventArgs, ByVal Checked As Boolean) Handles TXT_PERSONAL_RULE.ActionOnCheckedChange + Mode_CheckedChanged() + End Sub + Private Sub OPT_RULES_LIST_CheckedChanged(sender As Object, e As EventArgs) + Mode_CheckedChanged() + End Sub + Private Sub Mode_CheckedChanged() + Dim e As Boolean = TXT_PERSONAL_RULE.Checked + TXT_PERSONAL_RULE.Enabled(False) = e + CONTAINER_LIST.Enabled = Not e + CH_PROTECTED.Enabled = Not e + CH_FORCE_UPDATE.Enabled = Not e + End Sub +#End Region +#Region "List handlers" + Private _LatestSelected As Integer = -1 + Private Sub LIST_RULES_SelectedIndexChanged(sender As Object, e As EventArgs) Handles LIST_RULES.SelectedIndexChanged + _LatestSelected = LIST_RULES.SelectedIndex + End Sub +#End Region + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/API/OnlyFans/SiteSettings.vb b/SCrawler/API/OnlyFans/SiteSettings.vb index 0698f86..a2ebed7 100644 --- a/SCrawler/API/OnlyFans/SiteSettings.vb +++ b/SCrawler/API/OnlyFans/SiteSettings.vb @@ -9,13 +9,12 @@ Imports SCrawler.API.Base Imports SCrawler.Plugin Imports SCrawler.Plugin.Attributes -Imports PersonalUtilities.Forms Imports PersonalUtilities.Tools.Web.Clients Imports PersonalUtilities.Tools.Web.Cookies Imports PersonalUtilities.Functions.RegularExpressions Imports DN = SCrawler.API.Base.DeclaredNames Namespace API.OnlyFans - + Friend Class SiteSettings : Inherits SiteSettingsBase #Region "Declarations" #Region "Categories" @@ -74,30 +73,6 @@ Namespace API.OnlyFans Return String.Empty End Function #End Region -#Region "Rules" - Private ReadOnly Property LastDateUpdated_XML As PropertyValue - Friend Property LastDateUpdated As Date - Get - Return LastDateUpdated_XML.Value - End Get - Set(ByVal d As Date) - LastDateUpdated_XML.Value = d - End Set - End Property - - Friend ReadOnly Property UseOldAuthRules As PropertyValue - - Friend ReadOnly Property DynamicRulesUpdateInterval As PropertyValue - - Private ReadOnly Property DynamicRulesUpdateIntervalProvider As IFormatProvider - - Friend ReadOnly Property DynamicRules As PropertyValue -#End Region #Region "OFScraper" Private ReadOnly Property OFScraperPath_XML As PropertyValue @@ -150,7 +125,10 @@ Namespace API.OnlyFans Friend Sub New(ByVal AccName As String, ByVal Temp As Boolean) MyBase.New("OnlyFans", ".onlyfans.com", AccName, Temp, My.Resources.SiteResources.OnlyFansIcon_32, My.Resources.SiteResources.OnlyFansPic_32) - CheckOFSConfig() + If Rules Is Nothing Then + Rules = New DynamicRulesEnv + Rules.Update(False, True) + End If _AllowUserAgentUpdate = False @@ -184,13 +162,6 @@ Namespace API.OnlyFans DownloadHighlights = New PropertyValue(True) DownloadChatMedia = New PropertyValue(True) - LastDateUpdated_XML = New PropertyValue(Now.AddYears(-1), GetType(Date)) - 'URGENT: OF [UseOldAuthRules = True] - UseOldAuthRules = New PropertyValue(True) - DynamicRulesUpdateInterval = New PropertyValue(60 * 24) - DynamicRulesUpdateIntervalProvider = New FieldsCheckerProviderSimple(Function(v) IIf(AConvert(Of Integer)(v, 0) > 0, v, Nothing), - "The value of [{0}] field must be greater than 0") - DynamicRules = New PropertyValue(String.Empty, GetType(String)) OFScraperPath_XML = New PropertyValue(String.Empty, GetType(String)) If ACheck(OFScraperPath_XML.Value) Then Dim f As SFile = OFScraperPath_XML.Value @@ -218,21 +189,28 @@ Namespace API.OnlyFans End Function #End Region #Region "Update" - Private __UseOldAuthRules As Boolean = True - Private __DynamicRules As String = String.Empty Friend Overrides Sub BeginUpdate() - __UseOldAuthRules = UseOldAuthRules.Value - __DynamicRules = AConvert(Of String)(DynamicRules.Value, String.Empty) + _TempSettingsEnv.DisposeIfReady + _TempSettingsEnv = Nothing MyBase.BeginUpdate() End Sub Friend Overrides Sub Update() If _SiteEditorFormOpened Then - If Not __UseOldAuthRules = CBool(UseOldAuthRules.Value) Or Not AEquals(Of String)(__DynamicRules, DynamicRules.Value) Then _ - LastDateUpdated = Now.AddYears(-1) Responser.Cookies.Changed = False + If If(_TempSettingsEnv?.NeedToSave, False) Then Rules.Copy(_TempSettingsEnv, True) : Rules.Save() End If MyBase.Update() End Sub + Friend Overrides Sub EndUpdate() + _TempSettingsEnv.DisposeIfReady + _TempSettingsEnv = Nothing + MyBase.EndUpdate() + End Sub + Private _TempSettingsEnv As DynamicRulesEnv = Nothing + Friend Overrides Sub OpenSettingsForm() + If _TempSettingsEnv Is Nothing Then _TempSettingsEnv = New DynamicRulesEnv : _TempSettingsEnv.Copy(Rules, False) + Using f As New OnlyFansAdvancedSettingsForm(_TempSettingsEnv) : f.ShowDialog() : End Using + End Sub #End Region #Region "Download" Friend Overrides Function BaseAuthExists() As Boolean diff --git a/SCrawler/API/OnlyFans/UserData.vb b/SCrawler/API/OnlyFans/UserData.vb index 60e7176..777e623 100644 --- a/SCrawler/API/OnlyFans/UserData.vb +++ b/SCrawler/API/OnlyFans/UserData.vb @@ -91,6 +91,7 @@ Namespace API.OnlyFans End Sub Protected Overrides Sub DownloadDataF(ByVal Token As CancellationToken) Try + _DownloadingException_AuthFileUpdate = False If Not MySettings.SessionAborted Then ValidateOFScraper() _AbsMediaIndex = 0 @@ -537,45 +538,16 @@ Namespace API.OnlyFans End Sub #End Region #Region "Auth" - Private ReadOnly Property AuthFile As SFile - Get - Dim f As SFile = MySettings.Responser.File - f.Name &= "_Auth" - f.Extension = "json" - Return f - End Get - End Property - Private Function UpdateSignature(ByVal Path As String, Optional ByVal ForceUpdateAuth As Boolean = False, - Optional ByVal Round As Integer = 0) As Boolean + Private Function UpdateSignature(ByVal Path As String) As Boolean Try - If UpdateAuthFile(ForceUpdateAuth) Then + If Not Rules.Update(False) Then Rules.Update(True) + If Rules.Exists Then Const nullMsg$ = "The auth parameter(s) is null" - Const formatMidPart$ = ":{0}:{1:x}:" - Dim j As EContainer - Try - j = JsonDocument.Parse(AuthFile.GetText) - Catch jex As Exception - If Round = 0 Then - AuthFile.Delete() - UpdateAuthFile(True) - Return UpdateSignature(Path, ForceUpdateAuth, Round + 1) - Else - MySettings.SessionAborted = True - Return False - End If - End Try + Dim j As EContainer = Rules.CurrentContainer If Not j Is Nothing Then - Dim pattern$ = j.Value("format") + Dim pattern$ = DynamicRulesEnv.GetFormat(j) - If Not pattern.IsEmptyString Then - pattern = pattern.Replace("{}", "{0}").Replace("{:x}", "{1:x}") - ElseIf Not j.Value("prefix").IsEmptyString And Not j.Value("suffix").IsEmptyString Then - pattern = j.Value("prefix") & formatMidPart & j.Value("suffix") - ElseIf Not j.Value("start").IsEmptyString And Not j.Value("end").IsEmptyString Then - pattern = j.Value("start") & formatMidPart & j.Value("end") - Else - Throw New ArgumentNullException("format", nullMsg) - End If + If pattern.IsEmptyString Then Throw New ArgumentNullException("format", nullMsg) Dim li%() = j("checksum_indexes").Select(Function(e) CInt(e(0).Value)).ToArray @@ -599,42 +571,16 @@ Namespace API.OnlyFans Responser.Headers.Add(HeaderSign, sign) Responser.Headers.Add(HeaderTime, t) - j.Dispose() Return True End If + Else + MySettings.SessionAborted = True End If Return False Catch ex As Exception Return ErrorsDescriber.Execute(EDP.SendToLog + EDP.ReturnValue, ex, $"{ToStringForLog()}: UpdateSignature", False) End Try End Function - Private Function UpdateAuthFile(ByVal Force As Boolean) As Boolean - Const urlOld$ = "https://raw.githubusercontent.com/DATAHOARDERS/dynamic-rules/main/onlyfans.json" - Const urlNew$ = "https://raw.githubusercontent.com/DIGITALCRIMINALS/dynamic-rules/main/onlyfans.json" - Try - If MySettings.LastDateUpdated.AddMinutes(CInt(MySettings.DynamicRulesUpdateInterval.Value)) < Now Or Not AuthFile.Exists Or Force Then - Dim r$ = GetWebString(If(ACheck(Of String)(MySettings.DynamicRules.Value), - CStr(MySettings.DynamicRules.Value), - IIf(MySettings.UseOldAuthRules.Value, urlOld, urlNew)),, EDP.ReturnValue) - Dim checkFormat As Func(Of EContainer, Boolean) = - Function(jj) Not jj.Value("format").IsEmptyString OrElse - (Not jj.Value("prefix").IsEmptyString And Not jj.Value("suffix").IsEmptyString) OrElse - (Not jj.Value("start").IsEmptyString And Not jj.Value("end").IsEmptyString) - If Not r.IsEmptyString Then - Using j As EContainer = JsonDocument.Parse(r, EDP.ReturnValue) - If j.ListExists Then - If checkFormat(j) And j("checksum_indexes").ListExists And - Not j.Value("static_param").IsEmptyString And Not j.Value("checksum_constant").IsEmptyString Then _ - TextSaver.SaveTextToFile(r, AuthFile, True, False, EDP.ThrowException) : MySettings.LastDateUpdated = Now - End If - End Using - End If - End If - Return AuthFile.Exists - Catch ex As Exception - Return ErrorsDescriber.Execute(EDP.SendToLog + EDP.ReturnValue, ex, $"{ToStringForLog()}: UpdateAuthFile", False) - End Try - End Function Private Function GetHashSha1(ByVal Input As String) As String Dim s As New Security.Cryptography.SHA1CryptoServiceProvider Dim inputBytes() As Byte = System.Text.Encoding.UTF8.GetBytes(Input) @@ -666,35 +612,51 @@ Namespace API.OnlyFans Private Function OFS_CreateConfig() As SFile Try Const confMainPattern$ = "{0}"": ""([^""]*)""" + Const confMainPatternRulesManual$ = "DYNAMIC_RULE"": (""[^""]*"")" If OFSCache Is Nothing Then OFSCache = If(IsSingleObjectDownload, Settings.Cache.NewInstance, CreateCache()) Dim currentCache As CacheKeeper = OFSCache.NewInstance currentCache.Validate() Dim cacheRoot As SFile = currentCache.NewPath cacheRoot.Exists(SFO.Path, True, EDP.ThrowException) - Dim f As SFile = OFScraperConfigPatternFile + Dim f As SFile = Rules.OFScraperConfigPatternFile Dim configText$ - CheckOFSConfig() If f.Exists Then Dim replaceValue$ = String.Empty Dim rp As RParams = RParams.DMS(String.Empty, 1, RegexReturn.Replace, RegexOptions.IgnoreCase, CType(Function(input) replaceValue, Func(Of String, String)), String.Empty, EDP.ReturnValue) Dim ff As SFile configText = f.GetText - Dim updateConf As Action(Of String, String) = Sub(ByVal patternValue As String, ByVal __replaceValue As String) - rp.Pattern = String.Format(confMainPattern, patternValue) - rp.Nothing = configText - replaceValue = __replaceValue - configText = RegexReplace(configText, rp) - End Sub + Dim updateConf As Action(Of String, String, Boolean) = + Sub(ByVal patternValue As String, ByVal __replaceValue As String, ByVal __isRules As Boolean) + rp.Pattern = String.Format(IIf(__isRules, confMainPatternRulesManual, confMainPattern), patternValue) + rp.Nothing = configText + replaceValue = __replaceValue + configText = RegexReplace(configText, rp) + End Sub If Not configText.IsEmptyString Then - updateConf("save_location", cacheRoot.PathNoSeparator.Replace("\", "/")) + updateConf("save_location", cacheRoot.PathNoSeparator.Replace("\", "/"), False) If ACheck(MySettings.OFScraperMP4decrypt.Value) Then ff = CStr(MySettings.OFScraperMP4decrypt.Value) - If ff.Exists Then updateConf("mp4decrypt", ff.ToString.Replace("\", "/")) + If ff.Exists Then updateConf("mp4decrypt", ff.ToString.Replace("\", "/"), False) + End If + If Settings.FfmpegFile.Exists Then updateConf("ffmpeg", Settings.FfmpegFile.File.ToString.Replace("\", "/"), False) + updateConf("key-mode-default", CStr(MySettings.KeyModeDefault.Value).IfNullOrEmpty(SiteSettings.KeyModeDefault_Default), False) + updateConf("keydb_api", CStr(MySettings.Keydb_Api.Value), False) + If Rules.RulesReplaceConfig Then + If Rules.RulesConfigManualMode Then + updateConf(DynamicRulesEnv.DynamicRulesConfig_Mode_NodeName, "manual", False) + configText = configText.Replace(DynamicRulesEnv.DynamicRulesConfigNodeName_URL, DynamicRulesEnv.DynamicRulesConfigNodeName_RULES) + updateConf(DynamicRulesEnv.DynamicRulesConfigNodeName_RULES, Rules.CurrentContainerRulesText, True) + Else + Dim confUrlNode$ = If(Rules.RulesConstants.ContainsKey(DynamicRulesEnv.DynamicRulesConfigNodeName_URL_CONST_NAME), + Rules.RulesConstants(DynamicRulesEnv.DynamicRulesConfigNodeName_URL_CONST_NAME), + DynamicRulesEnv.DynamicRulesConfigNodeName_URL) + updateConf(DynamicRulesEnv.DynamicRulesConfigNodeName_URL, Rules.CurrentRule.UrlRaw, False) + configText = configText.Replace(DynamicRulesEnv.DynamicRulesConfigNodeName_URL, confUrlNode) + If Rules.RulesConstants.ContainsKey(DynamicRulesEnv.DynamicRulesConfig_Mode_NodeName) Then _ + updateConf(DynamicRulesEnv.DynamicRulesConfig_Mode_NodeName, Rules.RulesConstants(DynamicRulesEnv.DynamicRulesConfig_Mode_NodeName), False) + End If End If - If Settings.FfmpegFile.Exists Then updateConf("ffmpeg", Settings.FfmpegFile.File.ToString.Replace("\", "/")) - updateConf("key-mode-default", CStr(MySettings.KeyModeDefault.Value).IfNullOrEmpty(SiteSettings.KeyModeDefault_Default)) - updateConf("keydb_api", CStr(MySettings.Keydb_Api.Value)) f = currentCache f.Name = "config" f.Extension = "json" @@ -788,7 +750,7 @@ Namespace API.OnlyFans Protected Overrides Function DownloadingException(ByVal ex As Exception, ByVal Message As String, Optional ByVal FromPE As Boolean = False, Optional ByVal EObj As Object = Nothing) As Integer If Responser.StatusCode = Net.HttpStatusCode.BadRequest Then '400 - If Not _DownloadingException_AuthFileUpdate AndAlso UpdateAuthFile(True) Then + If Not _DownloadingException_AuthFileUpdate AndAlso Rules.Update(True) Then _DownloadingException_AuthFileUpdate = True Return 2 Else diff --git a/SCrawler/Download/Feed/DownloadFeedForm.Designer.vb b/SCrawler/Download/Feed/DownloadFeedForm.Designer.vb index 80a407b..3abf7f1 100644 --- a/SCrawler/Download/Feed/DownloadFeedForm.Designer.vb +++ b/SCrawler/Download/Feed/DownloadFeedForm.Designer.vb @@ -45,6 +45,8 @@ Namespace DownloadObjects Me.BTT_LOAD_SESSION_CHOOSE = New System.Windows.Forms.ToolStripMenuItem() Me.BTT_COPY_TO = New System.Windows.Forms.ToolStripMenuItem() Me.BTT_MOVE_TO = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_COPY_SPEC_TO = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_MOVE_SPEC_TO = New System.Windows.Forms.ToolStripMenuItem() Me.BTT_LOAD_FAV = New System.Windows.Forms.ToolStripMenuItem() Me.BTT_LOAD_SPEC = New System.Windows.Forms.ToolStripMenuItem() Me.BTT_FEED_ADD_FAV = New System.Windows.Forms.ToolStripMenuItem() @@ -61,6 +63,7 @@ Namespace DownloadObjects Me.BTT_CURR_SESSION_SET = New System.Windows.Forms.ToolStripMenuItem() Me.BTT_MERGE_SESSIONS = New System.Windows.Forms.ToolStripMenuItem() Me.BTT_CLEAR_DAILY = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_RESET_DAILY = New System.Windows.Forms.ToolStripMenuItem() Me.BTT_MERGE_FEEDS = New System.Windows.Forms.ToolStripMenuItem() Me.BTT_CHECK_ALL = New System.Windows.Forms.ToolStripMenuItem() Me.BTT_CHECK_NONE = New System.Windows.Forms.ToolStripMenuItem() @@ -72,9 +75,7 @@ Namespace DownloadObjects Me.BTT_DOWN_SELECTED = New System.Windows.Forms.ToolStripMenuItem() Me.BTT_REFRESH = New System.Windows.Forms.ToolStripButton() Me.TP_DATA = New System.Windows.Forms.TableLayoutPanel() - Me.BTT_COPY_SPEC_TO = New System.Windows.Forms.ToolStripMenuItem() - Me.BTT_MOVE_SPEC_TO = New System.Windows.Forms.ToolStripMenuItem() - Me.BTT_RESET_DAILY = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_CURR_SESSION_SET_LAST = New System.Windows.Forms.ToolStripMenuItem() SEP_1 = New System.Windows.Forms.ToolStripSeparator() SEP_2 = New System.Windows.Forms.ToolStripSeparator() MENU_VIEW = New System.Windows.Forms.ToolStripDropDownButton() @@ -168,6 +169,11 @@ Namespace DownloadObjects MENU_LOAD_SEP_8.Name = "MENU_LOAD_SEP_8" MENU_LOAD_SEP_8.Size = New System.Drawing.Size(349, 6) ' + 'MENU_LOAD_SEP_9 + ' + MENU_LOAD_SEP_9.Name = "MENU_LOAD_SEP_9" + MENU_LOAD_SEP_9.Size = New System.Drawing.Size(349, 6) + ' 'ToolbarTOP ' Me.ToolbarTOP.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden @@ -181,7 +187,7 @@ Namespace DownloadObjects ' Me.MENU_LOAD_SESSION.AutoToolTip = False Me.MENU_LOAD_SESSION.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image - Me.MENU_LOAD_SESSION.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_LOAD_SESSION_CURRENT, Me.BTT_LOAD_SESSION_LAST, Me.BTT_LOAD_SESSION_CHOOSE, MENU_LOAD_SEP_0, Me.BTT_COPY_TO, Me.BTT_MOVE_TO, MENU_LOAD_SEP_1, Me.BTT_COPY_SPEC_TO, Me.BTT_MOVE_SPEC_TO, MENU_LOAD_SEP_2, Me.BTT_LOAD_FAV, Me.BTT_LOAD_SPEC, MENU_LOAD_SEP_3, Me.BTT_FEED_ADD_FAV, Me.BTT_FEED_ADD_FAV_REMOVE, Me.BTT_FEED_REMOVE_FAV, MENU_LOAD_SEP_4, Me.BTT_FEED_ADD_SPEC, Me.BTT_FEED_ADD_SPEC_REMOVE, Me.BTT_FEED_REMOVE_SPEC, MENU_LOAD_SEP_5, Me.BTT_FEED_CLEAR_FAV, Me.BTT_FEED_CLEAR_SPEC, Me.BTT_FEED_DELETE_SPEC, Me.BTT_FEED_DELETE_DAILY_LIST, Me.BTT_FEED_DELETE_DAILY_DATE, MENU_LOAD_SEP_6, Me.BTT_CURR_SESSION_SET, Me.BTT_MERGE_SESSIONS, Me.BTT_CLEAR_DAILY, Me.BTT_RESET_DAILY, MENU_LOAD_SEP_7, Me.BTT_MERGE_FEEDS, MENU_LOAD_SEP_8, Me.BTT_CHECK_ALL, Me.BTT_CHECK_NONE, MENU_LOAD_SEP_9, Me.BTT_VIEW_SAVE, Me.BTT_VIEW_LOAD}) + Me.MENU_LOAD_SESSION.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_LOAD_SESSION_CURRENT, Me.BTT_LOAD_SESSION_LAST, Me.BTT_LOAD_SESSION_CHOOSE, MENU_LOAD_SEP_0, Me.BTT_COPY_TO, Me.BTT_MOVE_TO, MENU_LOAD_SEP_1, Me.BTT_COPY_SPEC_TO, Me.BTT_MOVE_SPEC_TO, MENU_LOAD_SEP_2, Me.BTT_LOAD_FAV, Me.BTT_LOAD_SPEC, MENU_LOAD_SEP_3, Me.BTT_FEED_ADD_FAV, Me.BTT_FEED_ADD_FAV_REMOVE, Me.BTT_FEED_REMOVE_FAV, MENU_LOAD_SEP_4, Me.BTT_FEED_ADD_SPEC, Me.BTT_FEED_ADD_SPEC_REMOVE, Me.BTT_FEED_REMOVE_SPEC, MENU_LOAD_SEP_5, Me.BTT_FEED_CLEAR_FAV, Me.BTT_FEED_CLEAR_SPEC, Me.BTT_FEED_DELETE_SPEC, Me.BTT_FEED_DELETE_DAILY_LIST, Me.BTT_FEED_DELETE_DAILY_DATE, MENU_LOAD_SEP_6, Me.BTT_CURR_SESSION_SET, Me.BTT_CURR_SESSION_SET_LAST, Me.BTT_MERGE_SESSIONS, Me.BTT_CLEAR_DAILY, Me.BTT_RESET_DAILY, MENU_LOAD_SEP_7, Me.BTT_MERGE_FEEDS, MENU_LOAD_SEP_8, Me.BTT_CHECK_ALL, Me.BTT_CHECK_NONE, MENU_LOAD_SEP_9, Me.BTT_VIEW_SAVE, Me.BTT_VIEW_LOAD}) Me.MENU_LOAD_SESSION.Image = Global.SCrawler.My.Resources.Resources.ArrowDownPic_Blue_24 Me.MENU_LOAD_SESSION.ImageTransparentColor = System.Drawing.Color.Magenta Me.MENU_LOAD_SESSION.Name = "MENU_LOAD_SESSION" @@ -223,6 +229,24 @@ Namespace DownloadObjects Me.BTT_MOVE_TO.Size = New System.Drawing.Size(352, 22) Me.BTT_MOVE_TO.Text = "Move checked to..." ' + 'BTT_COPY_SPEC_TO + ' + Me.BTT_COPY_SPEC_TO.AutoToolTip = True + Me.BTT_COPY_SPEC_TO.Image = Global.SCrawler.My.Resources.Resources.PastePic_32 + Me.BTT_COPY_SPEC_TO.Name = "BTT_COPY_SPEC_TO" + Me.BTT_COPY_SPEC_TO.Size = New System.Drawing.Size(352, 22) + Me.BTT_COPY_SPEC_TO.Text = "Copy feed/session files to..." + Me.BTT_COPY_SPEC_TO.ToolTipText = "Copy all the files of the loaded feed/session to..." + ' + 'BTT_MOVE_SPEC_TO + ' + Me.BTT_MOVE_SPEC_TO.AutoToolTip = True + Me.BTT_MOVE_SPEC_TO.Image = Global.SCrawler.My.Resources.Resources.CutPic_48 + Me.BTT_MOVE_SPEC_TO.Name = "BTT_MOVE_SPEC_TO" + Me.BTT_MOVE_SPEC_TO.Size = New System.Drawing.Size(352, 22) + Me.BTT_MOVE_SPEC_TO.Text = "Move feed/session files to..." + Me.BTT_MOVE_SPEC_TO.ToolTipText = "Move all the files of the loaded feed/session to..." + ' 'BTT_LOAD_FAV ' Me.BTT_LOAD_FAV.Image = Global.SCrawler.My.Resources.Resources.HeartPic_32 @@ -342,6 +366,15 @@ Namespace DownloadObjects Me.BTT_CLEAR_DAILY.Text = "Clear session" Me.BTT_CLEAR_DAILY.ToolTipText = "Clear current session" ' + 'BTT_RESET_DAILY + ' + Me.BTT_RESET_DAILY.AutoToolTip = True + Me.BTT_RESET_DAILY.Image = Global.SCrawler.My.Resources.Resources.RefreshPic_24 + Me.BTT_RESET_DAILY.Name = "BTT_RESET_DAILY" + Me.BTT_RESET_DAILY.Size = New System.Drawing.Size(352, 22) + Me.BTT_RESET_DAILY.Text = "Reset current session" + Me.BTT_RESET_DAILY.ToolTipText = "A new file will be created for the current session" + ' 'BTT_MERGE_FEEDS ' Me.BTT_MERGE_FEEDS.AutoToolTip = True @@ -443,37 +476,12 @@ Namespace DownloadObjects Me.TP_DATA.Size = New System.Drawing.Size(484, 436) Me.TP_DATA.TabIndex = 1 ' - 'MENU_LOAD_SEP_9 - ' - MENU_LOAD_SEP_9.Name = "MENU_LOAD_SEP_9" - MENU_LOAD_SEP_9.Size = New System.Drawing.Size(349, 6) - ' - 'BTT_COPY_SPEC_TO - ' - Me.BTT_COPY_SPEC_TO.AutoToolTip = True - Me.BTT_COPY_SPEC_TO.Image = Global.SCrawler.My.Resources.Resources.PastePic_32 - Me.BTT_COPY_SPEC_TO.Name = "BTT_COPY_SPEC_TO" - Me.BTT_COPY_SPEC_TO.Size = New System.Drawing.Size(352, 22) - Me.BTT_COPY_SPEC_TO.Text = "Copy feed/session files to..." - Me.BTT_COPY_SPEC_TO.ToolTipText = "Copy all the files of the loaded feed/session to..." - ' - 'BTT_MOVE_SPEC_TO - ' - Me.BTT_MOVE_SPEC_TO.AutoToolTip = True - Me.BTT_MOVE_SPEC_TO.Image = Global.SCrawler.My.Resources.Resources.CutPic_48 - Me.BTT_MOVE_SPEC_TO.Name = "BTT_MOVE_SPEC_TO" - Me.BTT_MOVE_SPEC_TO.Size = New System.Drawing.Size(352, 22) - Me.BTT_MOVE_SPEC_TO.Text = "Move feed/session files to..." - Me.BTT_MOVE_SPEC_TO.ToolTipText = "Move all the files of the loaded feed/session to..." + 'BTT_CURR_SESSION_SET_LAST ' - 'BTT_RESET_DAILY - ' - Me.BTT_RESET_DAILY.AutoToolTip = True - Me.BTT_RESET_DAILY.Image = Global.SCrawler.My.Resources.Resources.RefreshPic_24 - Me.BTT_RESET_DAILY.Name = "BTT_RESET_DAILY" - Me.BTT_RESET_DAILY.Size = New System.Drawing.Size(352, 22) - Me.BTT_RESET_DAILY.Text = "Reset current session" - Me.BTT_RESET_DAILY.ToolTipText = "A new file will be created for the current session" + Me.BTT_CURR_SESSION_SET_LAST.Image = Global.SCrawler.My.Resources.Resources.ArrowDownPic_Blue_24 + Me.BTT_CURR_SESSION_SET_LAST.Name = "BTT_CURR_SESSION_SET_LAST" + Me.BTT_CURR_SESSION_SET_LAST.Size = New System.Drawing.Size(352, 22) + Me.BTT_CURR_SESSION_SET_LAST.Text = "Set last download session as current session" ' 'DownloadFeedForm ' @@ -534,5 +542,6 @@ Namespace DownloadObjects Private WithEvents BTT_COPY_SPEC_TO As ToolStripMenuItem Private WithEvents BTT_MOVE_SPEC_TO As ToolStripMenuItem Private WithEvents BTT_RESET_DAILY As ToolStripMenuItem + Private WithEvents BTT_CURR_SESSION_SET_LAST As ToolStripMenuItem End Class End Namespace \ No newline at end of file diff --git a/SCrawler/Download/Feed/DownloadFeedForm.resx b/SCrawler/Download/Feed/DownloadFeedForm.resx index 042d779..b7cdfd6 100644 --- a/SCrawler/Download/Feed/DownloadFeedForm.resx +++ b/SCrawler/Download/Feed/DownloadFeedForm.resx @@ -162,10 +162,10 @@ False - - 17, 17 - False + + 17, 17 + \ No newline at end of file diff --git a/SCrawler/Download/Feed/DownloadFeedForm.vb b/SCrawler/Download/Feed/DownloadFeedForm.vb index 5f2557c..a526191 100644 --- a/SCrawler/Download/Feed/DownloadFeedForm.vb +++ b/SCrawler/Download/Feed/DownloadFeedForm.vb @@ -515,17 +515,21 @@ Namespace DownloadObjects f = Downloader.FilesSessionActual(False) End If If f.Exists Then - If SelectedMode >= 0 Then - If SelectedMode = FeedModes.Saved Then LoadedSessionName = f.Name - FeedChangeMode(SelectedMode) + If GetSessionFile Then + If Not Downloader.FilesSessionActual(False) = f Then SessionFile = f + Else + If SelectedMode >= 0 Then + If SelectedMode = FeedModes.Saved Then LoadedSessionName = f.Name + FeedChangeMode(SelectedMode) + End If + DataList.Clear() + x = New XmlFile(f,, False) With {.AllowSameNames = True, .XmlReadOnly = True} + x.LoadData() + If x.Count > 0 Then DataList.ListAddList(x, lcr) + x.Dispose() + CleanDataList() + RefillList(False, False) End If - DataList.Clear() - x = New XmlFile(f,, False) With {.AllowSameNames = True, .XmlReadOnly = True} - x.LoadData() - If x.Count > 0 Then DataList.ListAddList(x, lcr) - x.Dispose() - CleanDataList() - RefillList(False, False) End If Else m.Text = "Saved sessions not found" @@ -553,6 +557,7 @@ Namespace DownloadObjects Dim data As IEnumerable(Of UserMediaD) = Nothing Dim dd As UserMediaD Dim __user As UserInfo + Dim __isSavedPosts As Boolean Dim data_files As IEnumerable(Of SFile) = Nothing Dim new_files As New List(Of SFile) Dim mm As UserMediaD @@ -671,8 +676,9 @@ Namespace DownloadObjects __user = mm.UserInfo mm_data = mm.Data mm_data.File = df - mm = New UserMediaD(mm_data, If(moveOptions.ReplaceUserProfile_Profile, mm.User), mm.Session, mm.Date) With {.IsSavedPosts = mm.IsSavedPosts} - If moveOptions.ReplaceUserProfile_Profile Is Nothing And mm.IsSavedPosts Then mm.UserInfo = __user + __isSavedPosts = mm.IsSavedPosts And moveOptions.ReplaceUserProfile_Profile Is Nothing + mm = New UserMediaD(mm_data, If(moveOptions.ReplaceUserProfile_Profile, mm.User), mm.Session, mm.Date) With {.IsSavedPosts = __isSavedPosts} + If __isSavedPosts Then mm.UserInfo = __user Downloader.Files(indx) = mm downloaderFilesUpdated = True End If @@ -701,8 +707,9 @@ Namespace DownloadObjects __user = mm.UserInfo mm_data = mm.Data mm_data.File = df - mm = New UserMediaD(mm_data, If(moveOptions.ReplaceUserProfile_Profile, mm.User), mm.Session, mm.Date) With {.IsSavedPosts = mm.IsSavedPosts} - If moveOptions.ReplaceUserProfile_Profile Is Nothing And mm.IsSavedPosts Then mm.UserInfo = __user + __isSavedPosts = mm.IsSavedPosts And moveOptions.ReplaceUserProfile_Profile Is Nothing + mm = New UserMediaD(mm_data, If(moveOptions.ReplaceUserProfile_Profile, mm.User), mm.Session, mm.Date) With {.IsSavedPosts = __isSavedPosts} + If __isSavedPosts Then mm.UserInfo = __user sessionData(indx) = mm sesFilesReplaced = True If DataList.Count > 0 Then @@ -922,10 +929,10 @@ Namespace DownloadObjects End Sub #End Region #Region "Sessions set, merge, clear" - Private Sub BTT_CURR_SESSION_SET_Click(sender As Object, e As EventArgs) Handles BTT_CURR_SESSION_SET.Click + Private Sub BTT_CURR_SESSION_SET_Click(sender As Object, e As EventArgs) Handles BTT_CURR_SESSION_SET.Click, BTT_CURR_SESSION_SET_LAST.Click Try Dim f As SFile = Nothing - SessionChooser(False,,,, True, f) + SessionChooser(sender Is BTT_CURR_SESSION_SET_LAST,,,, True, f) If Not f.IsEmptyString AndAlso f.Exists Then Downloader.FilesLoadLastSession(f) FeedChangeMode(FeedModes.Current) diff --git a/SCrawler/Download/Feed/FeedSpecial.vb b/SCrawler/Download/Feed/FeedSpecial.vb index c283ec7..288ade1 100644 --- a/SCrawler/Download/Feed/FeedSpecial.vb +++ b/SCrawler/Download/Feed/FeedSpecial.vb @@ -157,6 +157,7 @@ Namespace DownloadObjects Else user = Item.User End If + If isSaved Then isSaved = Item.UserInfo.Equals(DirectCast(user, UserDataBase).User) If Not If(user?.IsSubscription, False) Then Item = New UserMediaD(data, user, Item.Session, Item.Date) With {.IsSavedPosts = isSaved} Result = True @@ -176,9 +177,10 @@ Namespace DownloadObjects Dim m As UserMediaD = Items(indx) Dim mm As UserMedia = m.Data Dim user As UserInfo = m.UserInfo + Dim __isSavedPosts As Boolean = m.IsSavedPosts And MCTOptions.ReplaceUserProfile_Profile Is Nothing mm.File = NewFile - m = New UserMediaD(mm, If(MCTOptions.ReplaceUserProfile_Profile, m.User), m.Session, m.Date) With {.IsSavedPosts = m.IsSavedPosts} - If MCTOptions.ReplaceUserProfile_Profile Is Nothing And m.IsSavedPosts Then m.UserInfo = user + m = New UserMediaD(mm, If(MCTOptions.ReplaceUserProfile_Profile, m.User), m.Session, m.Date) With {.IsSavedPosts = __isSavedPosts} + If __isSavedPosts Then m.UserInfo = user Items(indx) = m _FilesUpdated = True End If diff --git a/SCrawler/MainFrameObjects.vb b/SCrawler/MainFrameObjects.vb index b46ff38..297a077 100644 --- a/SCrawler/MainFrameObjects.vb +++ b/SCrawler/MainFrameObjects.vb @@ -26,6 +26,7 @@ Friend Class MainFrameObjects : Implements INotificator AddHandler .TextAdded, AddressOf ProgramLog_TextAdded AddHandler .TextCleared, AddressOf ProgramLog_TextCleared End With + UpdateLogButton() End Sub #Region "Users" Friend Sub FocusUser(ByVal Key As String, Optional ByVal ActivateForm As Boolean = False) diff --git a/SCrawler/MainMod.vb b/SCrawler/MainMod.vb index 60d2d1f..ba5972a 100644 --- a/SCrawler/MainMod.vb +++ b/SCrawler/MainMod.vb @@ -83,6 +83,9 @@ Friend Module MainMod Friend Function ToStringDateDef(ByVal _Date As Date) As String Return ToStringDateDef(_DateN:=_Date) End Function + Friend Function ToDateDef(ByVal DateStr As String, Optional ByVal NothingArg As Object = Nothing) As Object + Return AConvert(Of Date)(DateStr, DateTimeDefaultProvider, NothingArg) + End Function Friend ReadOnly SessionDateTimeProvider As New ADateTime("yyyyMMdd_HHmmss") Friend ReadOnly FeedVideoLengthProvider As New ADateTime("hh\:mm\:ss") With {.TimeParseMode = ADateTime.TimeModes.TimeSpan} Friend ReadOnly LogConnector As New LogHost diff --git a/SCrawler/My Project/AssemblyInfo.vb b/SCrawler/My Project/AssemblyInfo.vb index f00c2f0..c09cf36 100644 --- a/SCrawler/My Project/AssemblyInfo.vb +++ b/SCrawler/My Project/AssemblyInfo.vb @@ -32,6 +32,6 @@ Imports System.Runtime.InteropServices ' by using the '*' as shown below: ' - - + + diff --git a/SCrawler/SCrawler.vbproj b/SCrawler/SCrawler.vbproj index 56dfb9e..cda0848 100644 --- a/SCrawler/SCrawler.vbproj +++ b/SCrawler/SCrawler.vbproj @@ -208,11 +208,18 @@ + True True OFResources.resx + + OnlyFansAdvancedSettingsForm.vb + + + Form + @@ -542,6 +549,9 @@ ResXFileCodeGenerator OFResources.Designer.vb + + OnlyFansAdvancedSettingsForm.vb + RedditViewSettingsForm.vb @@ -784,6 +794,9 @@ + + +