-
Notifications
You must be signed in to change notification settings - Fork 56
/
AmazonSearch.m
155 lines (134 loc) · 5.66 KB
/
AmazonSearch.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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
//
// AmazonSearch.m
// MetaZ
//
// Created by Brian Olsen on 20/11/09.
// Copyright 2009 Maven-Group. All rights reserved.
//
#import "AmazonSearch.h"
#import "Access.h"
#import "AmazonRequest.h"
@implementation AmazonSearch
+ (Class)restWrapper
{
return [AmazonRequest class];
}
- (id)initWithProvider:(id)theProvider delegate:(id<MZSearchProviderDelegate>)theDelegate url:(NSURL *)url parameters:(NSDictionary *)params;
{
self = [super initWithProvider:theProvider delegate:theDelegate url:url usingVerb:@"GET" parameters:params];
if(self)
{
NSArray* tags = [NSArray arrayWithObjects:
MZTitleTagIdent,
MZDirectorTagIdent, MZProducerTagIdent,
MZScreenwriterTagIdent, MZActorsTagIdent,
MZShortDescriptionTagIdent,
ASINTagIdent,
MZLongDescriptionTagIdent,
MZAdvisoryTagIdent, MZCopyrightTagIdent,
MZCommentTagIdent, MZArtistTagIdent,
MZTVShowTagIdent, MZTVSeasonTagIdent,
MZTVEpisodeTagIdent, MZTVNetworkTagIdent,
MZSortTitleTagIdent, MZSortAlbumArtistTagIdent,
MZSortAlbumTagIdent, MZSortTVShowTagIdent,
MZGenreTagIdent,
nil];
NSArray* keys = [NSArray arrayWithObjects:
@"ItemAttributes/Title",
@"ItemAttributes/Director", @"ItemAttributes/Creator[@Role='Producer']",
@"ItemAttributes/Creator[@Role='Writer']", @"ItemAttributes/Actor",
@"ItemAttributes/Feature",
@"ASIN",
@"movieTags/info/longDescription",
@"movieTags/info/advisory", @"movieTags/info/copyright",
@"movieTags/info/comments", @"movieTags/info/artist/artistName",
@"movieTags/television/showName", @"movieTags/television/season",
@"movieTags/television/episode", @"movieTags/television/network",
@"movieTags/sorting/name", @"movieTags/sorting/albumArtist",
@"movieTags/sorting/album", @"movieTags/sorting/show",
@"movieTags/info/genre",
nil];
mapping = [[NSDictionary alloc] initWithObjects:tags forKeys:keys];
[wrapper setAccessKeyId:AMAZON_ACCESS_ID];
[wrapper setSecretAccessKey:AMAZON_ACCESS_KEY];
}
return self;
}
- (void)dealloc
{
[mapping release];
[super dealloc];
}
#pragma mark - MZRESTWrapperDelegate
- (void)wrapper:(MZRESTWrapper *)theWrapper didRetrieveData:(NSData *)data
{
//NSLog(@"Got amazon response:\n%@", [theWrapper responseAsText]);
NSXMLDocument* doc = [theWrapper responseAsXml];
NSString* errorMessage = [doc stringForXPath:@"/ItemSearchResponse/Items/Request/Errors/Error/Code" error:NULL];
if(![errorMessage isEqual:@""])
NSLog(@"Amazon error: %@", errorMessage);
NSString* totalResults = [doc stringForXPath:@"/ItemSearchResponse/Items/TotalResults" error:NULL];
NSString* totalPages = [doc stringForXPath:@"/ItemSearchResponse/Items/TotalPages" error:NULL];
NSArray* items = [doc nodesForXPath:@"/ItemSearchResponse/Items/Item" error:NULL];
NSMutableArray* results = [NSMutableArray array];
NSLog(@"Got results %d", [items count]);
for(NSXMLElement* item in items)
{
NSMutableDictionary* dict = [NSMutableDictionary dictionary];
for(NSString* xpath in [mapping allKeys])
{
NSString* tagId = [mapping objectForKey:xpath];
MZTag* tag = [MZTag tagForIdentifier:tagId];
NSString* value = [item stringForXPath:xpath error:NULL];
if([value length] > 0)
{
id obj = [tag objectFromString:value];
if(obj)
[dict setObject:obj forKey:tagId];
}
}
NSString* asin = [dict objectForKey:ASINTagIdent];
NSArray* reviews = [item nodesForXPath:@"EditorialReviews/EditorialReview/Content" error:NULL];
if([reviews count] > 0)
{
NSString* review = [[reviews objectAtIndex:0] stringValue];
[dict setObject:review forKey:MZLongDescriptionTagIdent];
}
MZTag* ratingTag = [MZTag tagForIdentifier:MZRatingTagIdent];
NSString* rating = [item stringForXPath:@"ItemAttributes/AudienceRating" error:NULL];
NSNumber* ratingNr = [ratingTag objectFromString:rating];
if([ratingNr intValue] != MZNoRating)
[dict setObject:ratingNr forKey:MZRatingTagIdent];
/*
NSInteger ratingNr = [ratingNames indexOfObject:rating];
if(ratingNr != NSNotFound)
{
[dict setObject:[NSNumber numberWithInt:ratingNr] forKey:MZRatingTagIdent];
}
*/
NSString* coverArtLarge = [item stringForXPath:@"LargeImage/URL" error:NULL];
if([coverArtLarge length] > 0)
{
/*
NSLog(@"ASIN %@", asin);
NSLog(@"Image large url: %@", coverArtLarge);
*/
NSURL* url = [NSURL URLWithString:coverArtLarge];
MZRemoteData* data = [MZRemoteData dataWithURL:url];
[dict setObject:data forKey:MZPictureTagIdent];
if([NSThread mainThread] != [NSThread currentThread])
[data performSelectorOnMainThread:@selector(loadData) withObject:nil waitUntilDone:NO];
else
[data loadData];
}
MZSearchResult* result = [MZSearchResult resultWithOwner:provider dictionary:dict];
[results addObject:result];
}
NSLog(@"Parsed results %d", [results count]);
[delegate searchProvider:provider result:results];
// TODO Make more requests for other pages
[delegate searchFinished];
self.isExecuting = NO;
self.isFinished = YES;
}
@end