Added:
EyeTunes/trunk/ETUserPlaylistEnumerator.h
EyeTunes/trunk/ETUserPlaylistEnumerator.m
Modified:
EyeTunes/trunk/DebugController.h
EyeTunes/trunk/DebugController.m
EyeTunes/trunk/ETEyeTunes.h
EyeTunes/trunk/ETEyeTunes.m
EyeTunes/trunk/ETPlaylist.h
EyeTunes/trunk/ETPlaylist.m
EyeTunes/trunk/ETPlaylistEnumerator.h
EyeTunes/trunk/ETPlaylistEnumerator.m
EyeTunes/trunk/ETTrack.m
EyeTunes/trunk/EyeTunes.xcodeproj/project.pbxproj
EyeTunes/trunk/EyeTunesEventCodes.h
EyeTunes/trunk/MainMenu.nib/classes.nib
EyeTunes/trunk/MainMenu.nib/keyedobjects.nib
EyeTunes/trunk/NSString+LongLongValue.m
Log:
* added support for special kind playlist enumerators
* added user playlist enumerator
* added test methods to the test project
* changed -[NSString cString] to -[NSString UTF8String] (cString is
deprecated since 10.4)
* small stuff
Modified: EyeTunes/trunk/DebugController.h
==============================================================================
--- EyeTunes/trunk/DebugController.h (original)
+++ EyeTunes/trunk/DebugController.h Thu Aug 28 09:13:53 2008
@@ -27,6 +27,10 @@
- (IBAction) next:(id)sender;
- (IBAction) playPause:(id)sender;
+- (IBAction) enumerate:(id)sender;
+- (IBAction) enumerateUser:(id)sender;
+- (IBAction) addTrack:(id)sender;
+
- (IBAction) goButtonPressed:(id)sender;
@end
Modified: EyeTunes/trunk/DebugController.m
==============================================================================
--- EyeTunes/trunk/DebugController.m (original)
+++ EyeTunes/trunk/DebugController.m Thu Aug 28 09:13:53 2008
@@ -78,6 +78,78 @@
[[EyeTunes sharedInstance] playPause];
}
+
+- (IBAction) enumerate:(id)sender;
+{
+ EyeTunes *et = [EyeTunes sharedInstance];
+ NSTextStorage *text = [output textStorage];
+
+ NSDictionary *attr = [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSFont fontWithName:@"Monaco" size:12], NSFontAttributeName, nil];
+
+ NSArray * playlists = [et playlists];
+ unsigned int i=0;
+ for (i=0; i<[playlists count]; i++)
+ {
+ ETPlaylist * playlist = [playlists objectAtIndex:i];
+ [self _append:[playlist name]];
+ [self _append:@"\n"];
+ }
+}
+
+
+- (IBAction) enumerateUser:(id)sender;
+{
+ EyeTunes *et = [EyeTunes sharedInstance];
+ NSTextStorage *text = [output textStorage];
+
+ NSDictionary *attr = [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSFont fontWithName:@"Monaco" size:12], NSFontAttributeName, nil];
+
+ NSArray * playlists = [et userPlaylists];
+ unsigned int i;
+ for (i=0; i<[playlists count]; i++)
+ {
+ ETPlaylist * playlist = [playlists objectAtIndex:i];
+ [self _append:[playlist name]];
+ [self _append:@"\n"];
+ }
+}
+
+
+- (IBAction) addTrack:(id)sender;
+{
+ EyeTunes *et = [EyeTunes sharedInstance];
+
+ NSArray * playlists = [et playlists];
+ ETPlaylist * playlist = nil;
+ unsigned int i;
+ for (i=0; i<[playlists count]; i++)
+ {
+ playlist = [playlists objectAtIndex:i];
+ if ([[playlist name] isEqualToString:@"Test"])
+ break;
+ }
+
+ if (![[playlist name] isEqualToString:@"Test"])
+ {
+ NSRunAlertPanel(@"Needs Playlist called 'Test'", @"To run this test
please create a playlist called Test", @"Ok", nil, nil);
+ return;
+ }
+
+ NSOpenPanel * panel = [NSOpenPanel openPanel];
+ if ([panel runModalForTypes:[NSArray arrayWithObjects:@"mp3", @"m4a",
@"mp4", nil]] == NSCancelButton)
+ return;
+
+ if (![[panel URLs] count])
+ return;
+
+ [et addTrack:[[panel URLs] objectAtIndex:0] toPlaylist:playlist];
+ [self _append:[NSString stringWithFormat:@"added %@ to playlist %@",
[[[panel URLs] objectAtIndex:0] path], [playlist name]]];
+
+}
+
+
- (IBAction) goButtonPressed:(id)sender
{
EyeTunes *e = [EyeTunes sharedInstance];
@@ -86,15 +158,16 @@
NSDictionary *attr = [NSDictionary dictionaryWithObjectsAndKeys:
[NSFont fontWithName:@"Monaco" size:12], NSFontAttributeName, nil];
+ ETTrack * currentTrack = [e currentTrack];
- [self _append:[[e currentTrack] name]];
+ [self _append:[currentTrack name]];
[self _append:@"\n"];
[self _append:@"Persistent ID for track: (String): "];
- [self _append:[[e currentTrack] persistentIdAsString]];
+ [self _append:[currentTrack persistentIdAsString]];
[self _append:@"\n"];
- long long int trackId = [[e currentTrack] persistentId];
- NSString *trackIdString = [[e currentTrack] persistentIdAsString];
+ long long int trackId = [currentTrack persistentId];
+ NSString *trackIdString = [currentTrack persistentIdAsString];
[self _append:@"Persistent ID for track (long): "];
[self _append:[NSString stringWithFormat:@"%016llX",trackId]];
[self _append:@"\n"];
Modified: EyeTunes/trunk/ETEyeTunes.h
==============================================================================
--- EyeTunes/trunk/ETEyeTunes.h (original)
+++ EyeTunes/trunk/ETEyeTunes.h Thu Aug 28 09:13:53 2008
@@ -55,6 +55,11 @@
- (NSArray *)playlists;
- (NSEnumerator *)playlistEnumerator;
+// get user playlists
+- (int)userPlaylistCount;
+- (NSArray *)userPlaylists;
+- (NSEnumerator *)userPlaylistEnumerator;
+
// search for playlist by reference
- (ETPlaylist *)playlistWithPersistentId:(long long int)persistentId;
- (ETTrack *)trackWithPersistentId:(long long int)persistentId;
Modified: EyeTunes/trunk/ETEyeTunes.m
==============================================================================
--- EyeTunes/trunk/ETEyeTunes.m (original)
+++ EyeTunes/trunk/ETEyeTunes.m Thu Aug 28 09:13:53 2008
@@ -40,6 +40,7 @@
#import "ETTrack.h"
#import "ETPlaylist.h"
#import "ETPlaylistEnumerator.h"
+#import "ETUserPlaylistEnumerator.h"
#import "ETDebug.h"
@@ -626,6 +627,25 @@
return [[[ETPlaylistEnumerator alloc] init] autorelease];
}
+
+
+- (int)userPlaylistCount;
+{
+ // I know this is not very elegant since we can't use
getCountOfElementsOfClass here
+ // just don't use it, Ruotger
+ return [[self userPlaylists] count];
+}
+
+- (NSArray *)userPlaylists;
+{
+ return [[self userPlaylistEnumerator] allObjects];
+}
+
+- (NSEnumerator *)userPlaylistEnumerator;
+{
+ return [[[ETUserPlaylistEnumerator alloc] init] autorelease];
+}
+
// Applescript example:
//
Modified: EyeTunes/trunk/ETPlaylist.h
==============================================================================
--- EyeTunes/trunk/ETPlaylist.h (original)
+++ EyeTunes/trunk/ETPlaylist.h Thu Aug 28 09:13:53 2008
@@ -46,6 +46,7 @@
- (id) initWithDescriptor:(AEDesc *)desc;
- (NSString *)name;
+- (DescType) specialKind;
- (NSArray *)tracks;
- (int) trackCount;
Modified: EyeTunes/trunk/ETPlaylist.m
==============================================================================
--- EyeTunes/trunk/ETPlaylist.m (original)
+++ EyeTunes/trunk/ETPlaylist.m Thu Aug 28 09:13:53 2008
@@ -56,6 +56,12 @@
return [self getPropertyAsStringForDesc:ET_ITEM_PROP_NAME];
}
+
+- (DescType) specialKind;
+{
+ return [self getPropertyAsEnumForDesc:ET_PLAYLIST_PROP_SPECIAL_KIND];
+}
+
- (NSArray *)tracks
{
return [[self trackEnumerator] allObjects];
@@ -65,6 +71,7 @@
{
return [self getCountOfElementsOfClass:ET_CLASS_TRACK];
}
+
- (NSEnumerator *)trackEnumerator
{
Modified: EyeTunes/trunk/ETPlaylistEnumerator.h
==============================================================================
--- EyeTunes/trunk/ETPlaylistEnumerator.h (original)
+++ EyeTunes/trunk/ETPlaylistEnumerator.h Thu Aug 28 09:13:53 2008
@@ -40,4 +40,7 @@
int seq;
}
+- (DescType) appleEventClass; // override in subclass
+
+
@end
Modified: EyeTunes/trunk/ETPlaylistEnumerator.m
==============================================================================
--- EyeTunes/trunk/ETPlaylistEnumerator.m (original)
+++ EyeTunes/trunk/ETPlaylistEnumerator.m Thu Aug 28 09:13:53 2008
@@ -45,7 +45,7 @@
{
self = [super init];
if (self) {
- count = (int)[[EyeTunes sharedInstance] playlistCount];
+ count = (int)[[EyeTunes sharedInstance] getCountOfElementsOfClass:[self
appleEventClass]];
seq = 0;
}
return self;
@@ -59,7 +59,7 @@
if (seq >= count)
return nil;
- AppleEvent *replyEvent = [[EyeTunes sharedInstance]
getElementOfClass:ET_CLASS_PLAYLIST atIndex:seq];
+ AppleEvent *replyEvent = [[EyeTunes sharedInstance]
getElementOfClass:[self appleEventClass] atIndex:seq];
if (!replyEvent)
return nil;
@@ -84,4 +84,8 @@
return objects;
}
+- (DescType) appleEventClass
+{
+ return ET_CLASS_PLAYLIST;
+}
@end
Modified: EyeTunes/trunk/ETTrack.m
==============================================================================
--- EyeTunes/trunk/ETTrack.m (original)
+++ EyeTunes/trunk/ETTrack.m Thu Aug 28 09:13:53 2008
@@ -202,7 +202,7 @@
#pragma mark -
-#pragma mark Setters
+#pragma mark Getters
#pragma mark -
- (NSString *)name
@@ -493,7 +493,7 @@
- (DescType)videoKind
{
- return nil; //TODO
+ return 0; //TODO
}
Added: EyeTunes/trunk/ETUserPlaylistEnumerator.h
==============================================================================
--- (empty file)
+++ EyeTunes/trunk/ETUserPlaylistEnumerator.h Thu Aug 28 09:13:53 2008
@@ -0,0 +1,17 @@
+//
+// ETUserPlaylistEnumerator.h
+// EyeTunes
+//
+// Created by Ruotger Skupin on 15.08.08.
+// Copyright 2008 __MyCompanyName__. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+#import "ETPlaylistEnumerator.h"
+
+@interface ETUserPlaylistEnumerator : ETPlaylistEnumerator
+{
+
+}
+
+@end
Added: EyeTunes/trunk/ETUserPlaylistEnumerator.m
==============================================================================
--- (empty file)
+++ EyeTunes/trunk/ETUserPlaylistEnumerator.m Thu Aug 28 09:13:53 2008
@@ -0,0 +1,33 @@
+//
+// ETUserPlaylistEnumerator.m
+// EyeTunes
+//
+// Created by Ruotger Skupin on 15.08.08.
+// Copyright 2008 __MyCompanyName__. All rights reserved.
+//
+
+#import "ETUserPlaylistEnumerator.h"
+#import "EyeTunesEventCodes.h"
+#import "ETPlaylist.h"
+
+@implementation ETUserPlaylistEnumerator
+
+- (id) nextObject
+{
+ // iTunes (well 7.7.1 anyway) returns all non-folder playlists if you ask
for ET_CLASS_USER_PLAYLIST
+ // so we filter here and only return truly non-special playlists, Ruotger
+ while (YES)
+ {
+ ETPlaylist * result = [super nextObject];
+ if (!result || [result specialKind] == kETSpecialPlaylistNone)
+ return result;
+ }
+}
+
+
+- (DescType) appleEventClass
+{
+ return ET_CLASS_USER_PLAYLIST;
+}
+
+@end
Modified: EyeTunes/trunk/EyeTunes.xcodeproj/project.pbxproj
==============================================================================
--- EyeTunes/trunk/EyeTunes.xcodeproj/project.pbxproj (original)
+++ EyeTunes/trunk/EyeTunes.xcodeproj/project.pbxproj Thu Aug 28 09:13:53
2008
@@ -49,6 +49,8 @@
039620AC0C0DE78200786326 /* EyeTunes.framework in CopyFiles */ = {isa =
PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* EyeTunes.framework */;
};
039620C80C0DE7CC00786326 /* EyeTunes.framework in Frameworks */ = {isa =
PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* EyeTunes.framework */;
};
8DC2EF530486A6940098B216 /* InfoPlist.strings in Resources */ = {isa =
PBXBuildFile; fileRef = 089C1666FE841158C02AAC07 /* InfoPlist.strings */; };
+ DD233EB70E66FD45004B210F /* ETUserPlaylistEnumerator.m in Sources */ =
{isa = PBXBuildFile; fileRef = DD233EAB0E66FCC4004B210F /*
ETUserPlaylistEnumerator.m */; };
+ DD233EB80E66FD45004B210F /* ETUserPlaylistEnumerator.h in Headers */ =
{isa = PBXBuildFile; fileRef = DD233EAA0E66FCC4004B210F /*
ETUserPlaylistEnumerator.h */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -109,6 +111,8 @@
32DBCF5E0370ADEE00C91783 /* EyeTunes_Prefix.pch */ = {isa =
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h;
path = EyeTunes_Prefix.pch; sourceTree = "<group>"; };
8DC2EF5A0486A6940098B216 /* Info.plist */ = {isa = PBXFileReference;
fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist;
sourceTree = "<group>"; };
8DC2EF5B0486A6940098B216 /* EyeTunes.framework */ = {isa =
PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0;
path = EyeTunes.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ DD233EAA0E66FCC4004B210F /* ETUserPlaylistEnumerator.h */ = {isa =
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h;
path = ETUserPlaylistEnumerator.h; sourceTree = "<group>"; };
+ DD233EAB0E66FCC4004B210F /* ETUserPlaylistEnumerator.m */ = {isa =
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc;
path = ETUserPlaylistEnumerator.m; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -233,6 +237,8 @@
032E44AE098A4F2B00C55ECB /* ETTrackEnumerator.m */,
032E476A098A8FDF00C55ECB /* ETPlaylistEnumerator.h */,
032E476B098A8FDF00C55ECB /* ETPlaylistEnumerator.m */,
+ DD233EAA0E66FCC4004B210F /* ETUserPlaylistEnumerator.h */,
+ DD233EAB0E66FCC4004B210F /* ETUserPlaylistEnumerator.m */,
030BF9AB098CFFD100D68616 /* ETDebug.h */,
030BF9AC098CFFD100D68616 /* ETDebug.m */,
039620970C0DE71600786326 /* NSString+LongLongValue.h */,
@@ -284,6 +290,7 @@
039620990C0DE71600786326 /* NSString+LongLongValue.h in Headers */,
0313DDED0C10DFB400F401BB /* ETEyeTunes.h in Headers */,
0313DE1D0C10E09900F401BB /* EyeTunesVersions.h in Headers */,
+ DD233EB80E66FD45004B210F /* ETUserPlaylistEnumerator.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -421,6 +428,7 @@
030BF9AE098CFFD100D68616 /* ETDebug.m in Sources */,
0396209A0C0DE71600786326 /* NSString+LongLongValue.m in Sources */,
0313DE490C10E1ED00F401BB /* ETEyeTunes.m in Sources */,
+ DD233EB70E66FD45004B210F /* ETUserPlaylistEnumerator.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Modified: EyeTunes/trunk/EyeTunesEventCodes.h
==============================================================================
--- EyeTunes/trunk/EyeTunesEventCodes.h (original)
+++ EyeTunes/trunk/EyeTunesEventCodes.h Thu Aug 28 09:13:53 2008
@@ -271,4 +271,9 @@
#define ET_PLAYLIST_PROP_PARENT 'pPlP' // <property name="parent"
code="pPlP" type="playlist" access="r" description="folder which contains
this playlist (if any)"/>
// generic playlist properies ---
+// -- special playlists --
+#define ET_CLASS_CD_PLAYLIST 'cCDP' // <class name="audio CD playlist"
code="cCDP" description="a playlist representing an audio CD"
inherits="playlist" plural="audio CD playlists">
+#define ET_CLASS_DEVICE_PLAYLIST 'cDvP' // <class name="device playlist"
code="cDvP" description="a playlist representing the contents of a portable
device" inherits="playlist" plural="device playlists">
+#define ET_CLASS_FOLDER_PLAYLIST 'cFoP' // <class name="folder playlist"
code="cFoP" description="a folder that contains other playlists"
inherits="user playlist" plural="folder playlists"/>
+#define ET_CLASS_USER_PLAYLIST 'cUsP' // <class name="user playlist"
code="cUsP" description="custom playlists created by the user"
inherits="playlist" plural="user playlists">
Modified: EyeTunes/trunk/MainMenu.nib/classes.nib
==============================================================================
--- EyeTunes/trunk/MainMenu.nib/classes.nib (original)
+++ EyeTunes/trunk/MainMenu.nib/classes.nib Thu Aug 28 09:13:53 2008
@@ -15,6 +15,12 @@
<dict>
<key>ACTIONS</key>
<dict>
+ <key>addTrack</key>
+ <string>id</string>
+ <key>enumerate</key>
+ <string>id</string>
+ <key>enumerateUser</key>
+ <string>id</string>
<key>goButtonPressed</key>
<string>id</string>
<key>next</key>
Modified: EyeTunes/trunk/MainMenu.nib/keyedobjects.nib
==============================================================================
Binary files. No diff available.
Modified: EyeTunes/trunk/NSString+LongLongValue.m
==============================================================================
--- EyeTunes/trunk/NSString+LongLongValue.m (original)
+++ EyeTunes/trunk/NSString+LongLongValue.m Thu Aug 28 09:13:53 2008
@@ -12,7 +12,7 @@
- (long long int)longlongValue
{
- long long int v = strtoull([self cString], NULL, 16);
+ long long int v = strtoull([self UTF8String], NULL, 16);
return v;
}
@end