// // Magistrix.m // iLyrics // // Created by Kim Wittenburg on 14.06.12. // Copyright (c) 2012 __MyCompanyName__. All rights reserved. // // //TODO: Use correct Date #import "Magistrix.h" typedef enum { LyricsPage, ResultsPage, NoResultsPage, UnknownPage } PageType; @implementation Magistrix { NSString *query; int loadedResults; int resultCount; } -(NSString*) name { return @"Magistrix"; } -(NSDate *)hosterVersion { return [NSDate dateWithString:@"2012-06-16 11:00:00 +0100"]; } -(void) startNewSearchForQuery: (NSString*) q { [self resetLoadedResults]; query = q; } -(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", [self stringByFormattingQuery:query], site]; NSURL *searchURL = [NSURL URLWithString:searchPath]; NSError *error; NSString *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) { resultCount = 1; loadedResults = 1; return [NSArray arrayWithObject:[self searchResultFromLyricsPage:page atURL:searchURL]]; } else if (pType == ResultsPage) { [self shouldSetResultCountFromPage:page]; return [self searchResultsFromPage:page]; } else if (pType == NoResultsPage) { resultCount = 0; return [[NSArray alloc] init]; } else { NSRunAlertPanel(NSLocalizedString(@"Magistrix.messages.unknownPage.title", @""), NSLocalizedString(@"Magistrix.messages.unknownPage.detail", @""), NSLocalizedString(@"OK", @""), nil, nil); resultCount = 0; return [[NSArray alloc] init]; } } -(NSString *) stringByFormattingQuery: (NSString *) q { NSRange stringRange = NSMakeRange(0, [q length]); //Can replace äöü with aou, no difference in results NSCharacterSet *characters = [[NSCharacterSet alphanumericCharacterSet] invertedSet]; return [[[[[[q stringByReplacingOccurrencesOfString:@" " withString:@"+"] stringByReplacingOccurrencesOfString:@"Ö" withString:@"o" options:NSCaseInsensitiveSearch range:stringRange] stringByReplacingOccurrencesOfString:@"Ä" withString:@"a" options:NSCaseInsensitiveSearch range:stringRange] stringByReplacingOccurrencesOfString:@"Ü" withString:@"ü" options:NSCaseInsensitiveSearch range:stringRange] stringByReplacingOccurrencesOfString:@"&" withString:@"%26"] stringByTrimmingCharactersInSet:characters]; } -(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 = [self stringByRemovingHTMLTags:[tag substringWithRange:NSMakeRange(previewStart, previewEnd-previewStart)]]; return [[SearchResult alloc] initWithName:songName fromArtist:artist preview:preview link:link]; } -(NSURL*) urlFromHref: (NSString *) link { if ([link hasPrefix:@"/"]) { return [NSURL URLWithString:[NSString stringWithFormat:@"http://www.Magistrix.de%@", link]]; } else { return [NSURL URLWithString:link]; } } -(NSString*) stringByRemovingHTMLTags: (NSString *)string { return [[[[[[[[[[[string stringByReplacingOccurrencesOfString:@"" withString:@""] stringByReplacingOccurrencesOfString:@"" withString:@""] stringByReplacingOccurrencesOfString:@"" withString:@""] stringByReplacingOccurrencesOfString:@"" withString:@""] stringByReplacingOccurrencesOfString:@"" withString:@""] stringByReplacingOccurrencesOfString:@"" withString:@""] stringByReplacingOccurrencesOfString:@"" withString:@""] stringByReplacingOccurrencesOfString:@"
" withString:@""] stringByReplacingOccurrencesOfString:@"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; } -(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:@"