Sources: Move trackers to transformable array
Rather than creating a relationship for every tracker, store a string array in CoreData. Signed-off-by: kingbri <bdashore3@gmail.com>
This commit is contained in:
parent
665c7510a2
commit
8c0e495f93
8 changed files with 48 additions and 129 deletions
|
|
@ -66,8 +66,6 @@
|
|||
0CBC76FD288D914F0054BE44 /* BatchChoiceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CBC76FC288D914F0054BE44 /* BatchChoiceView.swift */; };
|
||||
0CBC76FF288DAAD00054BE44 /* NavigationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CBC76FE288DAAD00054BE44 /* NavigationViewModel.swift */; };
|
||||
0CBC7705288DE7F40054BE44 /* PersistenceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CBC7704288DE7F40054BE44 /* PersistenceController.swift */; };
|
||||
0CF501F2289AE06A0099C785 /* SourceTracker+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CF501F0289AE06A0099C785 /* SourceTracker+CoreDataClass.swift */; };
|
||||
0CF501F3289AE06A0099C785 /* SourceTracker+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CF501F1289AE06A0099C785 /* SourceTracker+CoreDataProperties.swift */; };
|
||||
0CFEFCFD288A006200B3F490 /* GroupBoxStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CFEFCFC288A006200B3F490 /* GroupBoxStyle.swift */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
|
|
@ -128,8 +126,6 @@
|
|||
0CBC76FE288DAAD00054BE44 /* NavigationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationViewModel.swift; sourceTree = "<group>"; };
|
||||
0CBC7704288DE7F40054BE44 /* PersistenceController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersistenceController.swift; sourceTree = "<group>"; };
|
||||
0CC6E4D428A45BA000AF2BCC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
|
||||
0CF501F0289AE06A0099C785 /* SourceTracker+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SourceTracker+CoreDataClass.swift"; sourceTree = "<group>"; };
|
||||
0CF501F1289AE06A0099C785 /* SourceTracker+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SourceTracker+CoreDataProperties.swift"; sourceTree = "<group>"; };
|
||||
0CFEFCFC288A006200B3F490 /* GroupBoxStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupBoxStyle.swift; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
|
|
@ -154,8 +150,6 @@
|
|||
children = (
|
||||
0C750742289B003E004B3906 /* SourceRssParser+CoreDataClass.swift */,
|
||||
0C750743289B003E004B3906 /* SourceRssParser+CoreDataProperties.swift */,
|
||||
0CF501F0289AE06A0099C785 /* SourceTracker+CoreDataClass.swift */,
|
||||
0CF501F1289AE06A0099C785 /* SourceTracker+CoreDataProperties.swift */,
|
||||
0C79DC052899AF3C003F1C5A /* SourceSeedLeech+CoreDataClass.swift */,
|
||||
0C79DC062899AF3C003F1C5A /* SourceSeedLeech+CoreDataProperties.swift */,
|
||||
0C4CFC4728970C8B00AD9FAD /* SourceComplexQuery+CoreDataClass.swift */,
|
||||
|
|
@ -423,7 +417,6 @@
|
|||
0C794B6B289DACF100DD1CC8 /* SourceCatalogView.swift in Sources */,
|
||||
0CA148E9288903F000DE2211 /* MainView.swift in Sources */,
|
||||
0CBC76FD288D914F0054BE44 /* BatchChoiceView.swift in Sources */,
|
||||
0CF501F2289AE06A0099C785 /* SourceTracker+CoreDataClass.swift in Sources */,
|
||||
0C32FB552890D1BF002BD219 /* UIApplication.swift in Sources */,
|
||||
0C7D11FE28AA03FE00ED92DB /* View.swift in Sources */,
|
||||
0C0D50E7288DFF850035ECC8 /* SourcesView.swift in Sources */,
|
||||
|
|
@ -451,7 +444,6 @@
|
|||
0C84F4772895BE680074B7C9 /* FerriteDB.xcdatamodeld in Sources */,
|
||||
0C733287289C4C820058D1FE /* SourceSettingsView.swift in Sources */,
|
||||
0CA05457288EE58200850554 /* SettingsSourceListView.swift in Sources */,
|
||||
0CF501F3289AE06A0099C785 /* SourceTracker+CoreDataProperties.swift in Sources */,
|
||||
0CA148DE288903F000DE2211 /* RealDebridModels.swift in Sources */,
|
||||
0CBC76FF288DAAD00054BE44 /* NavigationViewModel.swift in Sources */,
|
||||
0C4CFC4D28970C8B00AD9FAD /* SourceComplexQuery+CoreDataClass.swift in Sources */,
|
||||
|
|
|
|||
|
|
@ -2,43 +2,32 @@
|
|||
// SourceHtmlParser+CoreDataProperties.swift
|
||||
// Ferrite
|
||||
//
|
||||
// Created by Brian Dashore on 8/3/22.
|
||||
// Created by Brian Dashore on 8/20/22.
|
||||
//
|
||||
//
|
||||
|
||||
import CoreData
|
||||
import Foundation
|
||||
import CoreData
|
||||
|
||||
public extension SourceHtmlParser {
|
||||
@nonobjc class func fetchRequest() -> NSFetchRequest<SourceHtmlParser> {
|
||||
NSFetchRequest<SourceHtmlParser>(entityName: "SourceHtmlParser")
|
||||
|
||||
extension SourceHtmlParser {
|
||||
|
||||
@nonobjc public class func fetchRequest() -> NSFetchRequest<SourceHtmlParser> {
|
||||
return NSFetchRequest<SourceHtmlParser>(entityName: "SourceHtmlParser")
|
||||
}
|
||||
|
||||
@NSManaged var rows: String
|
||||
@NSManaged var searchUrl: String
|
||||
@NSManaged var magnetLink: SourceMagnetLink?
|
||||
@NSManaged var parentSource: Source?
|
||||
@NSManaged var seedLeech: SourceSeedLeech?
|
||||
@NSManaged var size: SourceSize?
|
||||
@NSManaged var title: SourceTitle?
|
||||
@NSManaged var magnetHash: SourceMagnetHash?
|
||||
@NSManaged var trackers: NSSet?
|
||||
@NSManaged public var rows: String
|
||||
@NSManaged public var searchUrl: String
|
||||
@NSManaged public var trackers: [String]?
|
||||
@NSManaged public var magnetHash: SourceMagnetHash?
|
||||
@NSManaged public var magnetLink: SourceMagnetLink?
|
||||
@NSManaged public var parentSource: Source?
|
||||
@NSManaged public var seedLeech: SourceSeedLeech?
|
||||
@NSManaged public var size: SourceSize?
|
||||
@NSManaged public var title: SourceTitle?
|
||||
|
||||
}
|
||||
|
||||
// MARK: Generated accessors for trackers
|
||||
extension SourceHtmlParser : Identifiable {
|
||||
|
||||
public extension SourceHtmlParser {
|
||||
@objc(addTrackersObject:)
|
||||
@NSManaged func addToTrackers(_ value: SourceTracker)
|
||||
|
||||
@objc(removeTrackersObject:)
|
||||
@NSManaged func removeFromTrackers(_ value: SourceTracker)
|
||||
|
||||
@objc(addTrackers:)
|
||||
@NSManaged func addToTrackers(_ values: NSSet)
|
||||
|
||||
@objc(removeTrackers:)
|
||||
@NSManaged func removeFromTrackers(_ values: NSSet)
|
||||
}
|
||||
|
||||
extension SourceHtmlParser: Identifiable {}
|
||||
|
|
|
|||
|
|
@ -2,50 +2,33 @@
|
|||
// SourceRssParser+CoreDataProperties.swift
|
||||
// Ferrite
|
||||
//
|
||||
// Created by Brian Dashore on 8/3/22.
|
||||
// Created by Brian Dashore on 8/20/22.
|
||||
//
|
||||
//
|
||||
|
||||
import CoreData
|
||||
import Foundation
|
||||
import CoreData
|
||||
|
||||
public extension SourceRssParser {
|
||||
@nonobjc class func fetchRequest() -> NSFetchRequest<SourceRssParser> {
|
||||
NSFetchRequest<SourceRssParser>(entityName: "SourceRssParser")
|
||||
|
||||
extension SourceRssParser {
|
||||
|
||||
@nonobjc public class func fetchRequest() -> NSFetchRequest<SourceRssParser> {
|
||||
return NSFetchRequest<SourceRssParser>(entityName: "SourceRssParser")
|
||||
}
|
||||
|
||||
@NSManaged var items: String
|
||||
@NSManaged var searchUrl: String
|
||||
@NSManaged var rssUrl: String?
|
||||
@NSManaged var parentSource: Source?
|
||||
@NSManaged var trackers: NSSet?
|
||||
@NSManaged var magnetLink: SourceMagnetLink?
|
||||
@NSManaged var size: SourceSize?
|
||||
@NSManaged var title: SourceTitle?
|
||||
@NSManaged var seedLeech: SourceSeedLeech?
|
||||
@NSManaged var magnetHash: SourceMagnetHash?
|
||||
@NSManaged public var items: String
|
||||
@NSManaged public var rssUrl: String?
|
||||
@NSManaged public var searchUrl: String
|
||||
@NSManaged public var trackers: [String]?
|
||||
@NSManaged public var magnetHash: SourceMagnetHash?
|
||||
@NSManaged public var magnetLink: SourceMagnetLink?
|
||||
@NSManaged public var parentSource: Source?
|
||||
@NSManaged public var seedLeech: SourceSeedLeech?
|
||||
@NSManaged public var size: SourceSize?
|
||||
@NSManaged public var title: SourceTitle?
|
||||
|
||||
internal var trackerArray: [SourceTracker] {
|
||||
let trackerSet = trackers as? Set<SourceTracker> ?? []
|
||||
|
||||
return trackerSet.map { $0 }
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: Generated accessors for trackers
|
||||
extension SourceRssParser : Identifiable {
|
||||
|
||||
public extension SourceRssParser {
|
||||
@objc(addTrackersObject:)
|
||||
@NSManaged func addToTrackers(_ value: SourceTracker)
|
||||
|
||||
@objc(removeTrackersObject:)
|
||||
@NSManaged func removeFromTrackers(_ value: SourceTracker)
|
||||
|
||||
@objc(addTrackers:)
|
||||
@NSManaged func addToTrackers(_ values: NSSet)
|
||||
|
||||
@objc(removeTrackers:)
|
||||
@NSManaged func removeFromTrackers(_ values: NSSet)
|
||||
}
|
||||
|
||||
extension SourceRssParser: Identifiable {}
|
||||
|
|
|
|||
|
|
@ -1,13 +0,0 @@
|
|||
//
|
||||
// SourceTracker+CoreDataClass.swift
|
||||
// Ferrite
|
||||
//
|
||||
// Created by Brian Dashore on 8/3/22.
|
||||
//
|
||||
//
|
||||
|
||||
import CoreData
|
||||
import Foundation
|
||||
|
||||
@objc(SourceTracker)
|
||||
public class SourceTracker: NSManagedObject {}
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
//
|
||||
// SourceTracker+CoreDataProperties.swift
|
||||
// Ferrite
|
||||
//
|
||||
// Created by Brian Dashore on 8/3/22.
|
||||
//
|
||||
//
|
||||
|
||||
import CoreData
|
||||
import Foundation
|
||||
|
||||
public extension SourceTracker {
|
||||
@nonobjc class func fetchRequest() -> NSFetchRequest<SourceTracker> {
|
||||
NSFetchRequest<SourceTracker>(entityName: "SourceTracker")
|
||||
}
|
||||
|
||||
@NSManaged var urlString: String
|
||||
@NSManaged var parentRssParser: SourceRssParser?
|
||||
@NSManaged var parentHtmlParser: SourceHtmlParser?
|
||||
}
|
||||
|
||||
extension SourceTracker: Identifiable {}
|
||||
|
|
@ -29,13 +29,13 @@
|
|||
<entity name="SourceHtmlParser" representedClassName="SourceHtmlParser" syncable="YES">
|
||||
<attribute name="rows" attributeType="String" defaultValueString=""/>
|
||||
<attribute name="searchUrl" attributeType="String" defaultValueString=""/>
|
||||
<attribute name="trackers" optional="YES" attributeType="Transformable" valueTransformerName="NSSecureUnarchiveFromData" customClassName="[String]"/>
|
||||
<relationship name="magnetHash" optional="YES" maxCount="1" deletionRule="Cascade" destinationEntity="SourceMagnetHash" inverseName="parentHtmlParser" inverseEntity="SourceMagnetHash"/>
|
||||
<relationship name="magnetLink" optional="YES" maxCount="1" deletionRule="Cascade" destinationEntity="SourceMagnetLink" inverseName="parentHtmlParser" inverseEntity="SourceMagnetLink"/>
|
||||
<relationship name="parentSource" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Source" inverseName="htmlParser" inverseEntity="Source"/>
|
||||
<relationship name="seedLeech" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="SourceSeedLeech" inverseName="parentHtmlParser" inverseEntity="SourceSeedLeech"/>
|
||||
<relationship name="size" optional="YES" maxCount="1" deletionRule="Cascade" destinationEntity="SourceSize" inverseName="parentHtmlParser" inverseEntity="SourceSize"/>
|
||||
<relationship name="title" optional="YES" maxCount="1" deletionRule="Cascade" destinationEntity="SourceTitle" inverseName="parentHtmlParser" inverseEntity="SourceTitle"/>
|
||||
<relationship name="trackers" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="SourceTracker" inverseName="parentHtmlParser" inverseEntity="SourceTracker"/>
|
||||
</entity>
|
||||
<entity name="SourceList" representedClassName="SourceList" syncable="YES">
|
||||
<attribute name="author" attributeType="String" defaultValueString=""/>
|
||||
|
|
@ -56,13 +56,13 @@
|
|||
<attribute name="items" attributeType="String" defaultValueString=""/>
|
||||
<attribute name="rssUrl" optional="YES" attributeType="String"/>
|
||||
<attribute name="searchUrl" attributeType="String" defaultValueString=""/>
|
||||
<attribute name="trackers" optional="YES" attributeType="Transformable" valueTransformerName="NSSecureUnarchiveFromData" customClassName="[String]"/>
|
||||
<relationship name="magnetHash" optional="YES" maxCount="1" deletionRule="Cascade" destinationEntity="SourceMagnetHash" inverseName="parentRssParser" inverseEntity="SourceMagnetHash"/>
|
||||
<relationship name="magnetLink" optional="YES" maxCount="1" deletionRule="Cascade" destinationEntity="SourceMagnetLink" inverseName="parentRssParser" inverseEntity="SourceMagnetLink"/>
|
||||
<relationship name="parentSource" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Source" inverseName="rssParser" inverseEntity="Source"/>
|
||||
<relationship name="seedLeech" optional="YES" maxCount="1" deletionRule="Cascade" destinationEntity="SourceSeedLeech" inverseName="parentRssParser" inverseEntity="SourceSeedLeech"/>
|
||||
<relationship name="size" optional="YES" maxCount="1" deletionRule="Cascade" destinationEntity="SourceSize" inverseName="parentRssParser" inverseEntity="SourceSize"/>
|
||||
<relationship name="title" optional="YES" maxCount="1" deletionRule="Cascade" destinationEntity="SourceTitle" inverseName="parentRssParser" inverseEntity="SourceTitle"/>
|
||||
<relationship name="trackers" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="SourceTracker" inverseName="parentRssParser" inverseEntity="SourceTracker"/>
|
||||
</entity>
|
||||
<entity name="SourceSeedLeech" representedClassName="SourceSeedLeech" syncable="YES">
|
||||
<attribute name="attribute" attributeType="String" defaultValueString=""/>
|
||||
|
|
@ -83,9 +83,4 @@
|
|||
<relationship name="parentHtmlParser" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="SourceHtmlParser" inverseName="title" inverseEntity="SourceHtmlParser"/>
|
||||
<relationship name="parentRssParser" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="SourceRssParser" inverseName="title" inverseEntity="SourceRssParser"/>
|
||||
</entity>
|
||||
<entity name="SourceTracker" representedClassName="SourceTracker" syncable="YES">
|
||||
<attribute name="urlString" attributeType="String" defaultValueString=""/>
|
||||
<relationship name="parentHtmlParser" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="SourceHtmlParser" inverseName="trackers" inverseEntity="SourceHtmlParser"/>
|
||||
<relationship name="parentRssParser" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="SourceRssParser" inverseName="trackers" inverseEntity="SourceRssParser"/>
|
||||
</entity>
|
||||
</model>
|
||||
|
|
@ -211,7 +211,7 @@ class ScrapingViewModel: ObservableObject {
|
|||
regexString: magnetLinkParser.regex
|
||||
)
|
||||
} else if let magnetHash = magnetHash {
|
||||
link = generateMagnetLink(magnetHash: magnetHash, title: title, trackers: rssParser.trackerArray)
|
||||
link = generateMagnetLink(magnetHash: magnetHash, title: title, trackers: rssParser.trackers)
|
||||
} else {
|
||||
continue
|
||||
}
|
||||
|
|
@ -533,7 +533,7 @@ class ScrapingViewModel: ObservableObject {
|
|||
}
|
||||
}
|
||||
|
||||
public func generateMagnetLink(magnetHash: String, title: String?, trackers: [SourceTracker]) -> String {
|
||||
public func generateMagnetLink(magnetHash: String, title: String?, trackers: [String]?) -> String {
|
||||
var magnetLinkArray = ["magnet:?xt=urn:btih:"]
|
||||
|
||||
magnetLinkArray.append(magnetHash)
|
||||
|
|
@ -542,11 +542,13 @@ class ScrapingViewModel: ObservableObject {
|
|||
magnetLinkArray.append("&dn=\(encodedTitle)")
|
||||
}
|
||||
|
||||
for tracker in trackers {
|
||||
if URL(string: tracker.urlString) != nil,
|
||||
let encodedUrlString = tracker.urlString.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed)
|
||||
{
|
||||
magnetLinkArray.append("&tr=\(encodedUrlString)")
|
||||
if let trackers = trackers {
|
||||
for trackerUrl in trackers {
|
||||
if URL(string: trackerUrl) != nil,
|
||||
let encodedUrlString = trackerUrl.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed)
|
||||
{
|
||||
magnetLinkArray.append("&tr=\(encodedUrlString)")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -143,6 +143,7 @@ public class SourceManager: ObservableObject {
|
|||
newSourceRssParser.rssUrl = rssParserJson.rssUrl
|
||||
newSourceRssParser.searchUrl = rssParserJson.searchUrl
|
||||
newSourceRssParser.items = rssParserJson.items
|
||||
newSourceRssParser.trackers = rssParserJson.trackers
|
||||
|
||||
if let magnetLinkJson = rssParserJson.magnetLink {
|
||||
let newSourceMagnetLink = SourceMagnetLink(context: backgroundContext)
|
||||
|
|
@ -193,14 +194,6 @@ public class SourceManager: ObservableObject {
|
|||
newSourceRssParser.seedLeech = newSourceSeedLeech
|
||||
}
|
||||
|
||||
if let trackerJson = rssParserJson.trackers {
|
||||
for urlString in trackerJson {
|
||||
let newSourceTracker = SourceTracker(context: backgroundContext)
|
||||
newSourceTracker.urlString = urlString
|
||||
newSourceTracker.parentRssParser = newSourceRssParser
|
||||
}
|
||||
}
|
||||
|
||||
newSource.rssParser = newSourceRssParser
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue