idk maybe i've added DNS services?

Yeah it should
This commit is contained in:
Francesco 2025-03-26 15:39:49 +01:00
parent 0b9dae6b98
commit 37425a2e55
4 changed files with 77 additions and 15 deletions

View file

@ -5,10 +5,55 @@
// Created by Francesco on 05/01/25.
//
import Foundation
import Network
import Foundation
enum DNSProvider: String, CaseIterable, Hashable {
case cloudflare = "Cloudflare"
case google = "Google"
case openDNS = "OpenDNS"
case quad9 = "Quad9"
case adGuard = "AdGuard"
case cleanbrowsing = "CleanBrowsing"
case controld = "ControlD"
var servers: [String] {
switch self {
case .cloudflare:
return ["1.1.1.1", "1.0.0.1"]
case .google:
return ["8.8.8.8", "8.8.4.4"]
case .openDNS:
return ["208.67.222.222", "208.67.220.220"]
case .quad9:
return ["9.9.9.9", "149.112.112.112"]
case .adGuard:
return ["94.140.14.14", "94.140.15.15"]
case .cleanbrowsing:
return ["185.228.168.168", "185.228.169.168"]
case .controld:
return ["76.76.2.0", "76.76.10.0"]
}
}
}
extension URLSession {
private static let dnsSelectorKey = "CustomDNSProvider"
static var currentDNSProvider: DNSProvider {
get {
guard let savedProviderRawValue = UserDefaults.standard.string(forKey: dnsSelectorKey) else {
UserDefaults.standard.set(DNSProvider.cloudflare.rawValue, forKey: dnsSelectorKey)
return .cloudflare
}
return DNSProvider(rawValue: savedProviderRawValue) ?? .cloudflare
}
set {
UserDefaults.standard.set(newValue.rawValue, forKey: dnsSelectorKey)
}
}
static let userAgents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36",
@ -35,31 +80,33 @@ extension URLSession {
"Mozilla/5.0 (Android 13; Mobile; rv:122.0) Gecko/122.0 Firefox/122.0"
]
static let randomUserAgent: String = {
static var randomUserAgent: String {
userAgents.randomElement() ?? userAgents[0]
}()
}
static let custom: URLSession = {
static var custom: URLSession {
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = [
"User-Agent": randomUserAgent
]
return URLSession(configuration: configuration)
}()
}
static let cloudflareCustom: URLSession = {
static var cloudflareCustom: URLSession {
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = [
"User-Agent": randomUserAgent
]
let dnsServers = currentDNSProvider.servers
let dnsSettings: [AnyHashable: Any] = [
"DNSSettings": [
"ServerAddresses": ["1.1.1.1", "1.0.0.1"]
"ServerAddresses": dnsServers
]
]
configuration.connectionProxyDictionary = dnsSettings
return URLSession(configuration: configuration)
}()
}
}

View file

@ -154,7 +154,7 @@ struct ModuleAdditionSettingsView: View {
return
}
do {
let (data, _) = try await URLSession.custom.data(from: url)
let (data, _) = try await URLSession.cloudflareCustom.data(from: url)
let metadata = try JSONDecoder().decode(ModuleMetadata.self, from: data)
await MainActor.run {
self.moduleMetadata = metadata

View file

@ -46,14 +46,14 @@ class ModuleManager: ObservableObject {
throw NSError(domain: "Module already exists", code: -1)
}
let (metadataData, _) = try await URLSession.custom.data(from: url)
let (metadataData, _) = try await URLSession.cloudflareCustom.data(from: url)
let metadata = try JSONDecoder().decode(ModuleMetadata.self, from: metadataData)
guard let scriptUrl = URL(string: metadata.scriptUrl) else {
throw NSError(domain: "Invalid script URL", code: -1)
}
let (scriptData, _) = try await URLSession.custom.data(from: scriptUrl)
let (scriptData, _) = try await URLSession.cloudflareCustom.data(from: scriptUrl)
guard let jsContent = String(data: scriptData, encoding: .utf8) else {
throw NSError(domain: "Invalid script encoding", code: -1)
}
@ -94,7 +94,7 @@ class ModuleManager: ObservableObject {
func refreshModules() async {
for (index, module) in modules.enumerated() {
do {
let (metadataData, _) = try await URLSession.custom.data(from: URL(string: module.metadataUrl)!)
let (metadataData, _) = try await URLSession.cloudflareCustom.data(from: URL(string: module.metadataUrl)!)
let newMetadata = try JSONDecoder().decode(ModuleMetadata.self, from: metadataData)
if newMetadata.version != module.metadata.version {
@ -102,7 +102,7 @@ class ModuleManager: ObservableObject {
throw NSError(domain: "Invalid script URL", code: -1)
}
let (scriptData, _) = try await URLSession.custom.data(from: scriptUrl)
let (scriptData, _) = try await URLSession.cloudflareCustom.data(from: scriptUrl)
guard let jsContent = String(data: scriptData, encoding: .utf8) else {
throw NSError(domain: "Invalid script encoding", code: -1)
}

View file

@ -14,9 +14,11 @@ struct SettingsViewGeneral: View {
@AppStorage("analyticsEnabled") private var analyticsEnabled: Bool = false
@AppStorage("multiThreads") private var multiThreadsEnabled: Bool = false
@AppStorage("metadataProviders") private var metadataProviders: String = "AniList"
@AppStorage("CustomDNSProvider") private var customDNSProvider: String = "Cloudflare"
@AppStorage("mediaColumnsPortrait") private var mediaColumnsPortrait: Int = 2
@AppStorage("mediaColumnsLandscape") private var mediaColumnsLandscape: Int = 4
private let customDNSProviderList = ["Cloudflare", "Google", "OpenDNS", "Quad9", "AdGuard", "CleanBrowsing", "ControlD"]
private let metadataProvidersList = ["AniList"]
@EnvironmentObject var settings: Settings
@ -70,7 +72,6 @@ struct SettingsViewGeneral: View {
}
}
}
}
}
@ -121,9 +122,23 @@ struct SettingsViewGeneral: View {
.tint(.accentColor)
}
Section(header: Text("Analytics"), footer: Text("Allow Sora to collect anonymous data to improve the app. No personal information is collected. This can be disabled at any time.\n\n Information collected: \n- App version\n- Device model\n- Module Name/Version\n- Error Messages\n- Title of Watched Content")) {
Section(header: Text("Advanced"), footer: Text("Thanks to this Sora to collect anonymous data to improve the app. No personal information is collected. This can be disabled at any time.\n\n Information collected: \n- App version\n- Device model\n- Module Name/Version\n- Error Messages\n- Title of Watched Content")) {
Toggle("Enable Analytics", isOn: $analyticsEnabled)
.tint(.accentColor)
HStack {
Text("DNS service")
Spacer()
Menu(customDNSProvider) {
ForEach(customDNSProviderList, id: \.self) { provider in
Button(action: {
customDNSProvider = provider
}) {
Text(provider)
}
}
}
}
}
}
.navigationTitle("General")