summaryrefslogtreecommitdiff
path: root/QSDeliciousAPIProvider.m
diff options
context:
space:
mode:
authorRuben Beltran del Rio <git@r.bdr.sh>2025-09-08 10:38:39 +0200
committerRuben Beltran del Rio <git@r.bdr.sh>2025-09-08 10:38:39 +0200
commita5e25cc05e5e33e114331cc826211c89adbcfa6a (patch)
tree2ea647b5117e5c3b530ec66d4caafd04969e0fbe /QSDeliciousAPIProvider.m
parent0f26c5c3b3e606c89724067d4785323de3fee751 (diff)
Reorganize code, WIP save for tag handling
Diffstat (limited to 'QSDeliciousAPIProvider.m')
-rw-r--r--QSDeliciousAPIProvider.m190
1 files changed, 0 insertions, 190 deletions
diff --git a/QSDeliciousAPIProvider.m b/QSDeliciousAPIProvider.m
deleted file mode 100644
index d97d1d2..0000000
--- a/QSDeliciousAPIProvider.m
+++ /dev/null
@@ -1,190 +0,0 @@
-//
-// QSDeliciousAPIProvider.m
-// QSDeliciousPlugIn
-//
-
-#import "QSDeliciousAPIProvider.h"
-#import "SocialSite.h"
-#import <QSCore/QSCore.h>
-
-@implementation QSDeliciousAPIProvider
-
-- (instancetype)initWithSite:(SocialSite)site {
- self = [super init];
- if (self) {
- _site = site;
- _posts = [NSMutableArray array];
- }
- return self;
-}
-
-- (BOOL)canHandleSite:(SocialSite)site username:(NSString *)username password:(NSString *)password host:(NSString *)host {
- return (site == self.site) &&
- username.length > 0 &&
- password.length > 0 &&
- (site != SocialSiteLinkding); // This provider doesn't handle Linkding
-}
-
-- (SocialSite)supportedSite {
- return self.site;
-}
-
-- (NSString *)providerName {
- return [SocialSiteHelper displayNameForSite:self.site];
-}
-
-- (NSString *)apiURLForSite:(SocialSite)site {
- switch (site) {
- case SocialSiteDelicious:
- return @"api.del.icio.us/v1";
- case SocialSiteMagnolia:
- return @"ma.gnolia.com/api/mirrord/v1";
- case SocialSitePinboard:
- return @"api.pinboard.in/v1";
- default:
- return nil;
- }
-}
-
-- (NSURL *)requestURLForSite:(SocialSite)site username:(NSString *)username password:(NSString *)password host:(NSString *)host {
- NSString *apiURL = [self apiURLForSite:site];
- if (!apiURL) return nil;
-
- NSString *urlString = [NSString stringWithFormat:@"https://%@:%@@%@/posts/all?", username, password, apiURL];
- return [NSURL URLWithString:urlString];
-}
-
-- (NSData *)cachedBookmarkDataForSite:(SocialSite)site username:(NSString *)username {
- NSString *siteURL = [SocialSiteHelper siteURLForSite:site];
- NSString *cachePath = [QSApplicationSupportSubPath([NSString stringWithFormat:@"Caches/%@/", siteURL], NO) stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.xml", username]];
- return [NSData dataWithContentsOfFile:cachePath];
-}
-
-- (void)cacheBookmarkData:(NSData *)data forSite:(SocialSite)site username:(NSString *)username {
- NSString *siteURL = [SocialSiteHelper siteURLForSite:site];
- NSString *cachePath = [QSApplicationSupportSubPath([NSString stringWithFormat:@"Caches/%@/", siteURL], YES) stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.xml", username]];
- [data writeToFile:cachePath atomically:NO];
-}
-
-- (NSString *)tagURLType {
- return [NSString stringWithFormat:@"tag.%@", [SocialSiteHelper reversedSiteURLForSite:self.site]];
-}
-
-- (NSArray *)fetchBookmarksForSite:(SocialSite)site username:(NSString *)username password:(NSString *)password host:(NSString *)host includeTags:(BOOL)includeTags {
-
- // Try cached data first
- NSData *data = [self cachedBookmarkDataForSite:site username:username];
-
- // If no cached data, fetch from API
- if (![data length]) {
- NSURL *requestURL = [self requestURLForSite:site username:username password:password host:host];
- if (!requestURL) return @[];
-
- NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:requestURL
- cachePolicy:NSURLRequestUseProtocolCachePolicy
- timeoutInterval:60.0];
- [theRequest setHTTPMethod:@"POST"];
- [theRequest setValue:@"text/xml" forHTTPHeaderField:@"Content-type"];
- [theRequest setValue:@"Quicksilver (Blacktree,MacOSX)" forHTTPHeaderField:@"User-Agent"];
-
- NSError *error;
- data = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:nil error:&error];
-
- if (error) {
- NSLog(@"Error fetching bookmarks: %@", error.localizedDescription);
- return @[];
- }
-
- // Cache the data
- [self cacheBookmarkData:data forSite:site username:username];
- }
-
- // Parse XML data
- NSXMLParser *postParser = [[NSXMLParser alloc] initWithData:data];
- [postParser setDelegate:self];
-
- self.posts = [NSMutableArray arrayWithCapacity:1];
- [postParser parse];
-
- NSMutableArray *objects = [NSMutableArray arrayWithCapacity:1];
- NSMutableSet *tagSet = [NSMutableSet set];
-
- // Create bookmark objects
- for (NSDictionary *post in self.posts) {
- QSObject *newObject = [self objectForPost:post];
- if (newObject) {
- [objects addObject:newObject];
-
- // Collect tags if requested
- if (includeTags) {
- NSString *tagString = [post objectForKey:@"tag"];
- if (tagString.length > 0) {
- [tagSet addObjectsFromArray:[tagString componentsSeparatedByString:@" "]];
- }
- }
- }
- }
-
- // Create tag objects if requested
- if (includeTags) {
- for (NSString *tag in tagSet) {
- if (tag.length > 0) {
- QSObject *tagObject = [QSObject makeObjectWithIdentifier:[NSString stringWithFormat:@"[%@ tag]:%@", [self providerName], tag]];
- [tagObject setObject:tag forType:[self tagURLType]];
- [tagObject setObject:username forMeta:[NSString stringWithFormat:@"%@.username", [SocialSiteHelper reversedSiteURLForSite:site]]];
- [tagObject setName:tag];
- [tagObject setPrimaryType:[self tagURLType]];
- [objects addObject:tagObject];
- }
- }
- }
-
- return objects;
-}
-
-- (NSArray *)fetchBookmarksForTag:(NSString *)tag site:(SocialSite)site username:(NSString *)username password:(NSString *)password host:(NSString *)host {
- NSData *data = [self cachedBookmarkDataForSite:site username:username];
- if (!data) return @[];
-
- NSXMLParser *postParser = [[NSXMLParser alloc] initWithData:data];
- [postParser setDelegate:self];
- self.posts = [NSMutableArray arrayWithCapacity:1];
- [postParser parse];
-
- NSMutableArray *objects = [NSMutableArray arrayWithCapacity:1];
-
- for (NSDictionary *post in self.posts) {
- NSString *postTags = [post objectForKey:@"tag"];
- if ([postTags rangeOfString:tag].location != NSNotFound) {
- QSObject *newObject = [self objectForPost:post];
- if (newObject) {
- [objects addObject:newObject];
- }
- }
- }
-
- return objects;
-}
-
-- (QSObject *)objectForPost:(NSDictionary *)post {
- QSObject *newObject = [QSObject makeObjectWithIdentifier:[post objectForKey:@"hash"]];
- [newObject setObject:[post objectForKey:@"href"] forType:QSURLType];
- [newObject setName:[post objectForKey:@"description"]];
- [newObject setDetails:[post objectForKey:@"extended"]];
- [newObject setPrimaryType:QSURLType];
- return newObject;
-}
-
-#pragma mark - NSXMLParserDelegate
-
-- (void)parser:(NSXMLParser*)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
- if ([elementName isEqualToString:@"post"] && attributeDict) {
- [self.posts addObject:attributeDict];
- }
-}
-
-- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
- // Implementation if needed
-}
-
-@end