-
Notifications
You must be signed in to change notification settings - Fork 6
/
BandCampAPI.m
84 lines (75 loc) · 3.46 KB
/
BandCampAPI.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
//
// BandCampAPI.m
// IncrementalStoreTest
//
// Created by Chris Eidhof on 2/14/12.
// Copyright (c) 2012 Chris Eidhof. All rights reserved.
//
#import "BandCampAPI.h"
@implementation BandCampAPI
+ (NSString*)generateQueryPartForPredicate:(NSPredicate*)predicate {
if([predicate isKindOfClass:[NSComparisonPredicate class]]) {
NSComparisonPredicate* cp = (NSComparisonPredicate*)predicate;
if(cp.predicateOperatorType == NSEqualToPredicateOperatorType &&
cp.leftExpression.expressionType == NSKeyPathExpressionType &&
cp.rightExpression.expressionType == NSConstantValueExpressionType
) {
id rightExpression = cp.rightExpression.constantValue;
NSString* value = nil;
if([rightExpression isKindOfClass:[NSString class]]) {
value = [rightExpression stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
} else if([rightExpression isKindOfClass:[NSNumber class]]) {
value = [rightExpression stringValue];
}
if(value) {
NSString* key = cp.leftExpression.keyPath;
NSString* queryPart = [NSString stringWithFormat:@"&%@=%@", key, value];
return queryPart;
}
}
}
NSLog(@"didn't understand predicate");
return nil;
}
+ (NSString*)apiMethodForPredicate:(NSPredicate*)predicate {
if([predicate isKindOfClass:[NSComparisonPredicate class]]) {
NSComparisonPredicate* cp = (NSComparisonPredicate*)predicate;
if(cp.leftExpression.expressionType == NSKeyPathExpressionType &&
[cp.leftExpression.keyPath isEqualToString:@"name"]) {
return @"search";
}
}
return @"info";
}
+ (NSInteger)apiVersionForEntityName:(NSString*)entityName {
if([entityName isEqualToString:@"Band"]) return 3;
if([entityName isEqualToString:@"Album"]) return 2;
if([entityName isEqualToString:@"Track"]) return 1;
if([entityName isEqualToString:@"URL"]) return 1;
return 1;
}
+ (NSArray*)apiRequestEntitiesWithName:(NSString*)name predicate:(NSPredicate*)predicate {
NSString* lowercaseName = [name lowercaseString];
NSInteger version = [self apiVersionForEntityName:name];
NSString* method = [self apiMethodForPredicate:predicate];
NSString* searchURLString = [NSString stringWithFormat:@"http://api.bandcamp.com/api/%@/%d/%@?key=snaefellsjokull", lowercaseName, version, method];
if(predicate != nil) {
NSString* queryPart = [self generateQueryPartForPredicate:predicate];
searchURLString = [searchURLString stringByAppendingString:queryPart];
}
NSURL* searchURL = [NSURL URLWithString:searchURLString];
NSData* data = [NSData dataWithContentsOfURL:searchURL];
NSDictionary* response = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
if([method isEqualToString:@"search"]) {
return [response objectForKey:@"results"];
}
return [NSArray arrayWithObject:response];
}
+ (NSArray*)apiDiscographyForBandWithId:(NSString*)bandId {
// todo cache?
NSString* searchURLString = [NSString stringWithFormat:@"http://api.bandcamp.com/api/band/3/discography?key=snaefellsjokull&band_id=%@", bandId];
NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:searchURLString]];
NSDictionary* discography = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
return [discography objectForKey:@"discography"];
}
@end