// // Magistrix.m // iLyrics // // Created by Kim Wittenburg on 14.06.12. // Copyright (c) 2012 __MyCompanyName__. All rights reserved. // // #import "Magistrix.h" #import "SearchResult.h" typedef enum { LyricsPage, ResultsPage, NoResultsPage, UnknownPage } PageType; @implementation Magistrix { NSString *query; int loadedResults; int resultCount; NSString *firstPage; } @synthesize enabled; -(NSString*) name { return @"Magistrix"; } -(NSDate *)hosterVersion { return [NSDate dateWithString:@"2012-06-16 11:00:00 +0100"]; } -(void) startNewSearchForQuery: (NSString*) q { [self resetLoadedResults]; query = q; int site = (loadedResults/10) + 1; NSString *searchPath = [NSString stringWithFormat:@"http://www.magistrix.de/lyrics/search?q=%@&page=%i", [query stringByFormattingForURL], site]; NSURL *searchURL = [NSURL URLWithString:searchPath]; NSError *error; firstPage = [NSString stringWithContentsOfURL:searchURL encoding:NSUTF8StringEncoding error:&error]; if (error || firstPage == nil) { firstPage = nil; return; } PageType type = [self typeOfPage:firstPage]; if (type == ResultsPage) { [self shouldSetResultCountFromPage:firstPage]; } else if (type == LyricsPage) { resultCount = 1; } else { resultCount = 0; } } -(BOOL) hasMoreResults { return loadedResults < resultCount; } -(NSArray*) nextResults { int site = (loadedResults/10) + 1; NSString *searchPath = [NSString stringWithFormat:@"http://www.magistrix.de/lyrics/search?q=%@&page=%i", [query stringByFormattingForURL] , site]; NSURL *searchURL = [NSURL URLWithString:searchPath]; NSString *page; if (site == 1 && firstPage != nil) { page = firstPage; } else { NSError *error; page = [NSString stringWithContentsOfURL:searchURL encoding:NSUTF8StringEncoding error:&error]; if (error) { //Network error or invalid query return nil; } } PageType pType = [self typeOfPage:page]; if (pType == LyricsPage) { loadedResults = 1; return [NSArray arrayWithObject:[self searchResultFromLyricsPage:page atURL:searchURL]]; } else if (pType == ResultsPage) { return [self searchResultsFromPage:page]; } else if (pType == NoResultsPage) { return [[NSArray alloc] init]; } else { NSRunAlertPanel(NSLocalizedString(@"Magistrix.messages.unknownPage.title", @""), NSLocalizedString(@"Magistrix.messages.unknownPage.detail", @""), NSLocalizedString(@"OK", @""), nil, nil); return [[NSArray alloc] init]; } } -(PageType) typeOfPage: (NSString *) page { if ([page rangeOfString:@"
" length]; NSRange previewRestRange = NSMakeRange(previewStart, [tag length]-previewStart); int previewEnd = [tag rangeOfString:@"
" options:NSCaseInsensitiveSearch range:previewRestRange].location; NSString *preview = [[tag substringWithRange:NSMakeRange(previewStart, previewEnd-previewStart)] stringByRemovingHTMLTags]; return [[SearchResult alloc] initWithName:songName fromArtist:artist preview:preview link:link loadedByHoster:self]; } -(NSURL*) urlFromHref: (NSString *) link { if ([link hasPrefix:@"/"]) { return [NSURL URLWithString:[NSString stringWithFormat:@"http://www.Magistrix.de%@", link]]; } else { return [NSURL URLWithString:link]; } } -(NSRange) restRangeFromString: (NSString *) page subtractingRange: (NSRange) aRange { int loc = NSMaxRange(aRange); return NSMakeRange(loc, [page length]-loc); } -(void) shouldSetResultCountFromPage: (NSString *) page { if (resultCount <= 0) { //Nothing loaded before NSRange resultsLabelStartRange = [page rangeOfString:@"Ergebnisse 1 bis "]; int resultsLabelEnd = [page rangeOfString:@"
" options:NSCaseInsensitiveSearch range:[self restRangeFromString:page subtractingRange:resultsLabelStartRange]].location; NSString *resultsLabel = [page substringWithRange:NSMakeRange(NSMaxRange(resultsLabelStartRange), resultsLabelEnd-resultsLabelStartRange.location)]; if ([resultsLabel rangeOfString:@"ungefähr"].location != NSNotFound){ //Needs not more than 100 which means 10 sites (which is the maximum) resultCount = 100; } else { int resultsStart = NSMaxRange([resultsLabel rangeOfString:@"von "]); int resultsEnd = [resultsLabel rangeOfString:@"<"].location; NSString *results = [resultsLabel substringWithRange:NSMakeRange(resultsStart, resultsEnd-resultsStart)]; resultCount = [results intValue]; } if (resultCount > 100) { resultCount = 100; } } } -(void) resetLoadedResults { loadedResults = 0; firstPage = nil; } -(Lyrics*) lyricsBySearchResult: (SearchResult *) result { NSError *error = nil; NSString *page = [NSString stringWithContentsOfURL:[result link] encoding:NSUTF8StringEncoding error:&error]; if (error) { return nil; } NSString *lyrics = [self lyricsFromPage:page]; return [[Lyrics alloc] initWithName:[result name] byArtist:[result artist] withLyrics:lyrics]; } -(NSString *) lyricsFromPage: (NSString *)page { int lyricsStart = NSMaxRange([page rangeOfString:@"