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:
kingbri 2022-08-20 16:24:47 -04:00 committed by kingbri
parent 665c7510a2
commit 8c0e495f93
8 changed files with 48 additions and 129 deletions

View file

@ -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 */,

View file

@ -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 {}

View file

@ -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 {}

View file

@ -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 {}

View file

@ -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 {}

View file

@ -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>

View file

@ -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)")
}
}
}

View file

@ -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
}