-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLYManager.m
99 lines (85 loc) · 3.69 KB
/
LYManager.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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/*
* Lyricalizer *
* v1.3.4 *
* (c) James Long 2011-2014 *
*/
#import "LYManager.h"
@implementation LYManager
static NSString *NSStringURLEncode(NSString *string) {
return (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)string, NULL, CFSTR("!*'();:@&=+$,/?%#[]\" "), kCFStringEncodingUTF8);
}
+ (LYManager*)sharedInstance {
static LYManager *sharedInstance = nil;
static dispatch_once_t onceToken = 0;
dispatch_once(&onceToken, ^{
sharedInstance = [[LYManager alloc] init];
});
return sharedInstance;
}
- (id)init {
if (self = [super init]) {
NSFileManager *manager = [NSFileManager defaultManager];
if ([manager fileExistsAtPath:LYRICS_PATH])
lyricsDict = [[NSDictionary dictionaryWithContentsOfFile:LYRICS_PATH] mutableCopy];
else
lyricsDict = [NSMutableDictionary new];
}
return self;
}
- (void)saveLyrics {
NSDictionary *toSave = [lyricsDict copy];
NSFileManager *manager = [NSFileManager defaultManager];
BOOL isDir;
BOOL dirExists = [manager fileExistsAtPath:LYRICS_DIR isDirectory:&isDir];
if (!dirExists || !isDir) {
BOOL ret = [manager createDirectoryAtPath:LYRICS_DIR withIntermediateDirectories:YES attributes:nil error:nil];
// if (!ret) return;
}
[toSave writeToFile:LYRICS_PATH atomically:YES];
}
- (void)addCachedLyric:(NSString*)lyrics withSong:(NSString*)name andArtist:(NSString*)artist {
[lyricsDict setObject:lyrics forKey:LYFORMAT(name, artist)];
[self saveLyrics];
}
- (NSDictionary*)cachedLyricsWithSong:(NSString*)song andArtist:(NSString*)artist {
if ([lyricsDict objectForKey:LYFORMAT(song, artist)])
return @{@"lyrics":[lyricsDict objectForKey:LYFORMAT(song, artist)],@"song":song,@"artist":artist};
return nil;
}
- (void)fetchLyricsWithSong:(NSString*)song andArtist:(NSString*)artist andTarget:(id)target andSelector:(SEL)selector {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSDictionary *cachedLyrics = [self cachedLyricsWithSong:song andArtist:artist];
if (cachedLyrics && [target respondsToSelector:selector])
[target performSelectorOnMainThread:selector withObject:cachedLyrics waitUntilDone:NO];
if (!cachedLyrics) {
// Fetch lyrics in the background
NSString *queryString = [NSString stringWithFormat:@"/metrolyrics/%@/%@", NSStringURLEncode(artist), NSStringURLEncode(song)];
NSURL *requestURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", LYRICS_API, queryString]];
NSLog(@"Requesting %@", requestURL);
NSURLRequest *request = [NSURLRequest requestWithURL:requestURL];
NSURLResponse *response = nil;
NSError *error = nil;
NSData *respData = [NSURLConnection sendSynchronousRequest:request
returningResponse:&response
error:&error];
// NSString *respString = @"No lyrics found.";
if (!error) {
NSDictionary *respDict = [NSJSONSerialization JSONObjectWithData:respData options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@", respDict);
// respString = [[NSString alloc] initWithData:respData encoding:NSUTF8StringEncoding];
// respString = [respString stringByReplacingOccurrencesOfString:@"\r\n" withString:@"\n"];
// [respString release];
// if ([respString rangeOfString:@"No lyrics found"].location == NSNotFound)
// [self addCachedLyric:respString withSong:song andArtist:artist];
if (![respDict objectForKey:@"statusCode"] && [respDict objectForKey:@"lyrics"])
[self addCachedLyric:[respDict objectForKey:@"lyrics"] withSong:song andArtist:artist];
NSLog(@"resp %@", respDict);
if ([target respondsToSelector:selector]) {
NSLog(@"Responds");
[target performSelectorOnMainThread:selector withObject:respDict waitUntilDone:NO];
}
}
}
});
}
@end