Commit cd488100 authored by Felix Paul Kühne's avatar Felix Paul Kühne

Add Hatchet support

parent a4e009db
......@@ -9,7 +9,7 @@
#import "ViewController.h"
#import "MetaDataFetcherKit.h"
@interface ViewController ()
@interface ViewController () <MDFHatchetFetcherDataRecipient>
@end
......@@ -17,12 +17,30 @@
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
MDFHatchetFetcher *fetcher = [[MDFHatchetFetcher alloc] init];
fetcher.dataRecipient = self;
[fetcher searchForArtist:@"Muse"];
}
- (void)MDFHatchetFetcher:(MDFHatchetFetcher *)aFetcher didFailToFindAlbum:(NSString *)albumName forArtistName:(NSString *)artistName
{
NSLog(@"%@: failed to find album '%@' for artist '%@'", aFetcher, albumName, artistName);
}
- (void)MDFHatchetFetcher:(MDFHatchetFetcher *)aFetcher didFindAlbum:(MDFMusicAlbum *)album forArtistName:(NSString *)artistName
{
NSLog(@"%@: found album %@ for artist '%@'", aFetcher, album, artistName);
}
- (void)MDFHatchetFetcher:(MDFHatchetFetcher *)aFetcher didFindArtist:(MDFArtist *)artist forSearchRequest:(NSString *)searchRequest
{
NSLog(@"%@: found artist %@ for search request '%@'", aFetcher, artist, searchRequest);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
- (void)MDFHatchetFetcher:(MDFHatchetFetcher *)aFetcher didFailToFindArtistForSearchRequest:(NSString *)searchRequest
{
NSLog(@"%@: failed to find artist '%@'", aFetcher, searchRequest);
}
@end
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0600"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "6003F589195388D20070C39A"
BuildableName = "MetaDataFetcherKit_Example.app"
BlueprintName = "MetaDataFetcherKit_Example"
ReferencedContainer = "container:MetaDataFetcherKit.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "6003F5AD195388D20070C39A"
BuildableName = "MetaDataFetcherKit_Tests.xctest"
BlueprintName = "MetaDataFetcherKit_Tests"
ReferencedContainer = "container:MetaDataFetcherKit.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "6003F589195388D20070C39A"
BuildableName = "MetaDataFetcherKit_Example.app"
BlueprintName = "MetaDataFetcherKit_Example"
ReferencedContainer = "container:MetaDataFetcherKit.xcodeproj">
</BuildableReference>
</MacroExpansion>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
buildConfiguration = "Debug"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "6003F589195388D20070C39A"
BuildableName = "MetaDataFetcherKit_Example.app"
BlueprintName = "MetaDataFetcherKit_Example"
ReferencedContainer = "container:MetaDataFetcherKit.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "6003F589195388D20070C39A"
BuildableName = "MetaDataFetcherKit_Example.app"
BlueprintName = "MetaDataFetcherKit_Example"
ReferencedContainer = "container:MetaDataFetcherKit.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
This diff is collapsed.
......@@ -14,7 +14,7 @@
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = 'primary'
BlueprintIdentifier = 'E241156371C71BA954B8FBAC'
BlueprintIdentifier = '0098FBE5F77C46B8272F6E7F'
BlueprintName = 'MetaDataFetcherKit'
ReferencedContainer = 'container:Pods.xcodeproj'
BuildableName = 'MetaDataFetcherKit.framework'>
......
#import <UIKit/UIKit.h>
#import "MDFArtist.h"
#import "MDFHatchetFetcher.h"
#import "MDFHatchetSessionManager.h"
#import "MDFMediaObject.h"
#import "MDFMovie.h"
#import "MDFMovieDBFetcher.h"
#import "MDFMovieDBSessionManager.h"
#import "MDFMusicAlbum.h"
#import "MDFTVShow.h"
#import "MetaDataFetcherKit.h"
#import "MLTitleDecrapifier.h"
......
/*****************************************************************************
* MDFArtist.h
*****************************************************************************
* Copyright (C) 2015 Felix Paul Kühne
* $Id$
*
* Authors: Felix Paul Kühne <fkuehne # videolan.org>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#import <Foundation/Foundation.h>
@interface MDFArtist : NSObject
/**
* the name of the artist [STRING]
*/
@property (readwrite, nonatomic, nullable) NSString *name;
/**
* medium sized image URL string(s) with a width < 1000px
* \note base URL included
*/
@property (readwrite, nonatomic, nullable) NSArray<NSString *> *mediumSizedImages;
/**
* large image URL string(s) with a width > 1000px
* \note base URL included
*/
@property (readwrite, nonatomic, nullable) NSArray<NSString *> *largeSizedImages;
/**
* the Hatchet id of the artist [NSInteger]
*/
@property (readwrite, nonatomic) NSInteger hatchetArtistID;
@end
/*****************************************************************************
* MDFArtist.m
*****************************************************************************
* Copyright (C) 2015 Felix Paul Kühne
* $Id$
*
* Authors: Felix Paul Kühne <fkuehne # videolan.org>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#import "MDFArtist.h"
@implementation MDFArtist
- (NSString *)description
{
return [NSString stringWithFormat:@"%s: name:'%@', Hatchet-ID:%li, medium artist images %@, large artist images %@",
__PRETTY_FUNCTION__,
self.name,
(long)self.hatchetArtistID,
self.mediumSizedImages,
self.largeSizedImages];
}
@end
/*****************************************************************************
* MDFHatchetFetcher.h
*****************************************************************************
* Copyright (C) 2015 Felix Paul Kühne
* $Id$
*
* Authors: Felix Paul Kühne <fkuehne # videolan.org>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#import <Foundation/Foundation.h>
@class MDFHatchetFetcher;
@class MDFArtist;
@class MDFMusicAlbum;
@protocol MDFHatchetFetcherDataRecipient <NSObject>
@optional
- (void)MDFHatchetFetcher:(MDFHatchetFetcher * _Nonnull)aFetcher didFindArtist:(MDFArtist * _Nonnull)artist forSearchRequest:(NSString * _Nonnull)searchRequest;
- (void)MDFHatchetFetcher:(MDFHatchetFetcher * _Nonnull)aFetcher didFailToFindArtistForSearchRequest:(NSString * _Nonnull)searchRequest;
- (void)MDFHatchetFetcher:(MDFHatchetFetcher * _Nonnull)aFetcher didFindAlbum:(MDFMusicAlbum * _Nonnull)album forArtistName:(NSString * _Nonnull)artistName;
- (void)MDFHatchetFetcher:(MDFHatchetFetcher * _Nonnull)aFetcher didFailToFindAlbum:(NSString * _Nonnull)albumName forArtistName:(NSString * _Nonnull)artistName;
@end
@interface MDFHatchetFetcher : NSObject
/**
* the object receiving the responses to requests send to instances of the fetcher
* \param any NSObject implementing the MDFMovieDBFetcherDataRecipient protocol
* \return the current receiver
* \note should be set before doing any requests
*/
@property (weak, nonatomic) id<MDFHatchetFetcherDataRecipient> dataRecipient;
- (void)searchForArtist:(NSString * _Nonnull)artistName;
- (void)searchForAlbum:(NSString * _Nonnull)albumName ofArtist:(NSString * _Nonnull)artistName;
@end
/*****************************************************************************
* MDFHatchetFetcher.m
*****************************************************************************
* Copyright (C) 2015 Felix Paul Kühne
* $Id$
*
* Authors: Felix Paul Kühne <fkuehne # videolan.org>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#import "MDFHatchetFetcher.h"
#import "MDFHatchetSessionManager.h"
#import "MDFArtist.h"
#import "MDFMusicAlbum.h"
@interface MDFHatchetFetcher ()
{
NSMutableArray<NSURLSessionTask *> *_requests;
}
@end
@implementation MDFHatchetFetcher
- (NSString *)description
{
NSString *ret;
@synchronized(_requests) {
ret = [NSString stringWithFormat:@"%s: %lu pending requests",
__PRETTY_FUNCTION__,
(unsigned long)_requests.count];
}
return ret;
}
- (void)cancelAllRequests
{
@synchronized(_requests) {
NSUInteger requestCount = [_requests count];
for (NSUInteger i = 0; i < requestCount; i++) {
[_requests[i] cancel];
}
_requests = [NSMutableArray array];
}
}
- (void)searchForArtist:(NSString *)artistName
{
if (!artistName)
return;
MDFHatchetSessionManager *sessionManager = [MDFHatchetSessionManager sharedInstance];
if (!sessionManager.apiKey)
return;
artistName = [artistName stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet alphanumericCharacterSet]];
NSURLSessionTask *task = [sessionManager GET:@"artists" parameters:@{ @"name" : artistName }
success:^(NSURLSessionDataTask *task, NSDictionary *responseObject) {
@synchronized(_requests) {
[_requests removeObject:task];
}
MDFArtist *artist = [[MDFArtist alloc] init];
if (responseObject != nil) {
NSArray *artistsArray = responseObject[@"artists"];
NSArray *imagesArray = responseObject[@"images"];
if (artistsArray != nil) {
NSDictionary *artistDict = [artistsArray firstObject];
artist.hatchetArtistID = [artistDict[@"id"] integerValue];
artist.name = artistDict[@"name"];
}
if (imagesArray != nil) {
NSMutableArray *mediumImages = [NSMutableArray array];
NSMutableArray *largeImages = [NSMutableArray array];
NSUInteger imageCount = imagesArray.count;
for (NSUInteger x = 0; x < imageCount; x++) {
NSDictionary *imageDict = imagesArray[x];
if ([imageDict[@"width"] integerValue] > 1000) {
[largeImages addObject:imageDict[@"url"]];
} else {
[mediumImages addObject:imageDict[@"url"]];
}
}
artist.mediumSizedImages = [mediumImages copy];
artist.largeSizedImages = [largeImages copy];
}
}
if (self.dataRecipient) {
if ([self.dataRecipient respondsToSelector:@selector(MDFHatchetFetcher:didFindArtist:forSearchRequest:)]) {
[self.dataRecipient MDFHatchetFetcher:self
didFindArtist:artist
forSearchRequest:artistName];
}
}
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
@synchronized(_requests) {
[_requests removeObject:task];
}
if (self.dataRecipient) {
if ([self.dataRecipient respondsToSelector:@selector(MDFHatchetFetcher:didFailToFindArtistForSearchRequest:)]) {
[self.dataRecipient MDFHatchetFetcher:self didFailToFindArtistForSearchRequest:artistName];
}
}
}];
@synchronized(_requests) {
[_requests addObject:task];
}
}
- (void)searchForAlbum:(NSString *)albumName ofArtist:(NSString *)artistName
{
if (!artistName)
return;
if (!albumName)
return;
MDFHatchetSessionManager *sessionManager = [MDFHatchetSessionManager sharedInstance];
if (!sessionManager.apiKey)
return;
albumName = [albumName stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet alphanumericCharacterSet]];
artistName = [artistName stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet alphanumericCharacterSet]];
NSURLSessionTask *task = [sessionManager GET:@"albums" parameters:@{ @"artist_name" : artistName,
@"name" : albumName }
success:^(NSURLSessionDataTask *task, NSDictionary *responseObject) {
@synchronized(_requests) {
[_requests removeObject:task];
}
NSLog(@"response: %@", responseObject);
MDFMusicAlbum *musicAlbum = [[MDFMusicAlbum alloc] init];
if (responseObject != nil) {
NSArray *albumsArray = responseObject[@"albums"];
NSArray *imagesArray = responseObject[@"images"];
NSInteger albumArtImageID = 0;
if (albumsArray != nil) {
NSDictionary *albumDict = [albumsArray firstObject];
musicAlbum.name = albumDict[@"name"];
musicAlbum.releaseDate = [NSDate date]; // FIXME: enter correct date from "releasedate" key
musicAlbum.hatchetAlbumID = [albumDict[@"id"] integerValue];
NSArray *albumImages = albumDict[@"images"];
if (albumImages != nil) {
if (albumImages.count > 0 ) {
albumArtImageID = [[albumImages firstObject] integerValue];
}
}
}
if (imagesArray != nil) {
NSUInteger imageCount = imagesArray.count;
NSMutableArray *mediumImages = [NSMutableArray array];
NSMutableArray *largeImages = [NSMutableArray array];
for (NSUInteger x = 0; x < imageCount; x++) {
NSDictionary *imageDict = imagesArray[x];
if (albumArtImageID > 0) {
if ([imageDict[@"id"] integerValue] == albumArtImageID) {
musicAlbum.artworkImage = imageDict[@"url"];
albumArtImageID = 0; // speed-up the further processing
continue;
}
if ([imageDict[@"width"] integerValue] > 1000) {
[largeImages addObject:imageDict[@"url"]];
} else {
[mediumImages addObject:imageDict[@"url"]];
}
}
}
musicAlbum.largeSizedArtistImages = [largeImages copy];
musicAlbum.mediumSizedArtistImages = [mediumImages copy];
}
}
if (self.dataRecipient) {
if ([self.dataRecipient respondsToSelector:@selector(MDFHatchetFetcher:didFindAlbum:forArtistName:)]) {
[self.dataRecipient MDFHatchetFetcher:self
didFindAlbum:musicAlbum
forArtistName:artistName];
}
}
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
@synchronized(_requests) {
[_requests removeObject:task];
}
if (self.dataRecipient) {
if ([self.dataRecipient respondsToSelector:@selector(MDFHatchetFetcher:didFailToFindAlbum:forArtistName:)]) {
[self.dataRecipient MDFHatchetFetcher:self
didFailToFindAlbum:albumName
forArtistName:artistName];
}
}
}];
@synchronized(_requests) {
[_requests addObject:task];
}
}
@end
/*****************************************************************************
* MDFHatchetSessionManager.h
*****************************************************************************
* Copyright (C) 2015 Felix Paul Kühne
* $Id$
*
* Authors: Felix Paul Kühne <fkuehne # videolan.org>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#import <AFNetworking/AFNetworking.h>
@interface MDFHatchetSessionManager : AFHTTPSessionManager
+ (_Nonnull instancetype)sharedInstance;
/**
* the API key to use for the fetches
* \param the API key to set [STRING]
* \return the current API key [STRING]
* \note API key must be set before doing any requests
*/
@property (retain, nonatomic, nonnull) NSString *apiKey;
@end
/*****************************************************************************
* MDFHatchetSessionManager.m
*****************************************************************************
* Copyright (C) 2015 Felix Paul Kühne
* $Id$
*
* Authors: Felix Paul Kühne <fkuehne # videolan.org>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#import "MDFHatchetSessionManager.h"
static NSString * const HatchetBaseURLString = @"https://api.hatchet.is/v2";
@implementation MDFHatchetSessionManager
+ (instancetype)sharedInstance
{
static MDFHatchetSessionManager *_sharedClient = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedClient = [[MDFHatchetSessionManager alloc] initWithBaseURL:[NSURL URLWithString:HatchetBaseURLString]];
_sharedClient.requestSerializer = [AFJSONRequestSerializer serializer];
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
securityPolicy.validatesDomainName = YES;
securityPolicy.allowInvalidCertificates = NO;
_sharedClient.securityPolicy = securityPolicy;
_sharedClient.apiKey = @"none needed so far";
});
return _sharedClient;
}
@end
/*****************************************************************************
* MDFMusicAlbum.h
*****************************************************************************
* Copyright (C) 2015 Felix Paul Kühne
* $Id$
*
* Authors: Felix Paul Kühne <fkuehne # videolan.org>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#import <Foundation/Foundation.h>
@interface MDFMusicAlbum : NSObject
/**
* the name of the album [STRING]
*/
@property (readwrite, nonatomic, nullable) NSString *name;
/**
* the release date of the album [DATE]
*/
@property (readwrite, nonatomic, nullable) NSDate *releaseDate;
/**
* album artwork URL string
* \note base URL included
*/
@property (readwrite, nonatomic, nullable) NSString *artworkImage;
/**
* medium sized image URL string(s) with a width < 1000px
* \note base URL included
*/
@property (readwrite, nonatomic, nullable) NSArray<NSString *> *mediumSizedArtistImages;
/**
* large image URL string(s) with a width > 1000px
* \note base URL included
*/
@property (readwrite, nonatomic, nullable) NSArray<NSString *> *largeSizedArtistImages;
/**
* the Hatchet id of the album [NSInteger]
*/
@property (readwrite, nonatomic) NSInteger hatchetAlbumID;
/**
* the Hatchet id of the album artist [NSInteger]
*/
@property (readwrite, nonatomic) NSInteger hatchetArtistID;
@end
/*****************************************************************************
* MDFMusicAlbum.m
*****************************************************************************
* Copyright (C) 2015 Felix Paul Kühne
* $Id$
*
* Authors: Felix Paul Kühne <fkuehne # videolan.org>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#import "MDFMusicAlbum.h"
@implementation MDFMusicAlbum