Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

initial commit for OSS Play

  • Loading branch information...
commit e1d6aad46ce62aaf500c69125512ab409da68f4b 0 parents
@maddox maddox authored
Showing with 14,812 additions and 0 deletions.
  1. +16 −0 .gitignore
  2. +16 −0 CHANGELOG.md
  3. +17 −0 Play Client/PLAPlayClient.h
  4. +48 −0 Play Client/PLAPlayClient.m
  5. +31 −0 Play Client/PLATrack.h
  6. +55 −0 Play Client/PLATrack.m
  7. +860 −0 Play Item.xcodeproj/project.pbxproj
  8. +31 −0 Play Item/PLAItemAppDelegate.h
  9. +193 −0 Play Item/PLAItemAppDelegate.m
  10. +8 −0 Play Item/Supporting Files/IgnoredAudioProcesses.plist
  11. +38 −0 Play Item/Supporting Files/Play-Info.plist
  12. +7 −0 Play Item/Supporting Files/Play-Prefix.pch
  13. +29 −0 Play Item/Supporting Files/en.lproj/Credits.rtf
  14. +2 −0  Play Item/Supporting Files/en.lproj/InfoPlist.strings
  15. +3,285 −0 Play Item/Supporting Files/en.lproj/MainMenu.xib
  16. BIN  Play Item/Supporting Files/icon.icns
  17. +14 −0 Play Item/Supporting Files/main.m
  18. BIN  Play Item/images/status-icon-inverted.png
  19. BIN  Play Item/images/status-icon-off.png
  20. BIN  Play Item/images/status-icon-on.png
  21. +43 −0 Play iOS/Classes/Controllers/PLAPlayerViewController.h
  22. +272 −0 Play iOS/Classes/Controllers/PLAPlayerViewController.m
  23. +108 −0 Play iOS/Classes/Controllers/PLAPlayerViewController_iPad.xib
  24. +474 −0 Play iOS/Classes/Controllers/PLAPlayerViewController_iPhone.xib
  25. +19 −0 Play iOS/PLAIOSAppDelegate.h
  26. +54 −0 Play iOS/PLAIOSAppDelegate.m
  27. +69 −0 Play iOS/Supporting Files/Play-iOS-Info.plist
  28. +14 −0 Play iOS/Supporting Files/Play-iOS-Prefix.pch
  29. +2 −0  Play iOS/Supporting Files/en.lproj/InfoPlist.strings
  30. +18 −0 Play iOS/Supporting Files/main.m
  31. BIN  Play iOS/images/Default.png
  32. BIN  Play iOS/images/Default@2x.png
  33. BIN  Play iOS/images/bottom-shadow.png
  34. BIN  Play iOS/images/bottom-shadow@2x.png
  35. BIN  Play iOS/images/button-pause.png
  36. BIN  Play iOS/images/button-pause@2x.png
  37. BIN  Play iOS/images/button-play.png
  38. BIN  Play iOS/images/button-play@2x.png
  39. BIN  Play iOS/images/default_album.png
  40. BIN  Play iOS/images/default_album@2x.png
  41. BIN  Play iOS/images/icon-72.png
  42. BIN  Play iOS/images/icon.png
  43. BIN  Play iOS/images/icon@2x.png
  44. BIN  Play iOS/images/shadow.png
  45. BIN  Play iOS/images/shadow@2x.png
  46. +16 −0 README.md
  47. +475 −0 vendor/AFNetworking/AFHTTPClient.h
  48. +602 −0 vendor/AFNetworking/AFHTTPClient.m
  49. +96 −0 vendor/AFNetworking/AFHTTPRequestOperation.h
  50. +118 −0 vendor/AFNetworking/AFHTTPRequestOperation.m
  51. +123 −0 vendor/AFNetworking/AFImageRequestOperation.h
  52. +249 −0 vendor/AFNetworking/AFImageRequestOperation.m
  53. +68 −0 vendor/AFNetworking/AFJSONRequestOperation.h
  54. +152 −0 vendor/AFNetworking/AFJSONRequestOperation.m
  55. +26 −0 vendor/AFNetworking/AFJSONUtilities.h
  56. +169 −0 vendor/AFNetworking/AFJSONUtilities.m
  57. +66 −0 vendor/AFNetworking/AFNetworkActivityIndicatorManager.h
  58. +114 −0 vendor/AFNetworking/AFNetworkActivityIndicatorManager.m
  59. +44 −0 vendor/AFNetworking/AFNetworking.h
  60. +74 −0 vendor/AFNetworking/AFPropertyListRequestOperation.h
  61. +152 −0 vendor/AFNetworking/AFPropertyListRequestOperation.m
  62. +198 −0 vendor/AFNetworking/AFURLConnectionOperation.h
  63. +459 −0 vendor/AFNetworking/AFURLConnectionOperation.m
  64. +96 −0 vendor/AFNetworking/AFXMLRequestOperation.h
  65. +203 −0 vendor/AFNetworking/AFXMLRequestOperation.m
  66. +75 −0 vendor/AFNetworking/UIImageView+AFNetworking.h
  67. +191 −0 vendor/AFNetworking/UIImageView+AFNetworking.m
  68. +218 −0 vendor/AudioStreamer/AudioStreamer.h
  69. +2,426 −0 vendor/AudioStreamer/AudioStreamer.m
  70. +136 −0 vendor/AudioStreamer/UIDevice+Hardware.h
  71. +622 −0 vendor/AudioStreamer/UIDevice+Hardware.m
  72. +32 −0 vendor/SDWebImage/SDImageCache.h
  73. +340 −0 vendor/SDWebImage/SDImageCache.m
  74. +19 −0 vendor/SDWebImage/SDImageCacheDelegate.h
  75. +21 −0 vendor/SDWebImage/SDWebImageCompat.h
  76. +36 −0 vendor/SDWebImage/SDWebImageDecoder.h
  77. +124 −0 vendor/SDWebImage/SDWebImageDecoder.m
  78. +42 −0 vendor/SDWebImage/SDWebImageDownloader.h
  79. +174 −0 vendor/SDWebImage/SDWebImageDownloader.m
  80. +21 −0 vendor/SDWebImage/SDWebImageDownloaderDelegate.h
  81. +39 −0 vendor/SDWebImage/SDWebImageManager.h
  82. +290 −0 vendor/SDWebImage/SDWebImageManager.m
  83. +19 −0 vendor/SDWebImage/SDWebImageManagerDelegate.h
  84. +44 −0 vendor/SDWebImage/SDWebImagePrefetcher.h
  85. +112 −0 vendor/SDWebImage/SDWebImagePrefetcher.m
  86. +39 −0 vendor/SDWebImage/UIButton+WebCache.h
  87. +44 −0 vendor/SDWebImage/UIButton+WebCache.m
  88. +52 −0 vendor/SDWebImage/UIImageView+WebCache.h
  89. +48 −0 vendor/SDWebImage/UIImageView+WebCache.m
  90. +41 −0 vendor/SFHFKeychainUtils.h
  91. +384 −0 vendor/SFHFKeychainUtils.m
16 .gitignore
@@ -0,0 +1,16 @@
+# Xcode
+build/*
+*.pbxuser
+!default.pbxuser
+*.mode1v3
+!default.mode1v3
+*.mode2v3
+!default.mode2v3
+*.perspectivev3
+!default.perspectivev3
+*.xcworkspace
+!default.xcworkspace
+xcuserdata
+profile
+*.moved-aside
+*.DS_Store
16 CHANGELOG.md
@@ -0,0 +1,16 @@
+Verion 1.2.1
+
+* Fixed bug where a nil metadata string crashes app
+* Now parses the infamous Deadmau5 song's metadata
+
+Version 1.2
+* Added ability to play/pause with media keys (@dannygreg)
+* Replaced the streaming backend with something way better - No more garbled music.
+
+Version 1.1
+* Added: Quit item
+* Added: Item to go straight to the Play website
+
+Version 1.0
+First Release
+
17 Play Client/PLAPlayClient.h
@@ -0,0 +1,17 @@
+//
+// PLPlayClient.h
+// Play
+//
+// Created by Jon Maddox on 2/9/12.
+// Copyright (c) 2012 GitHub, Inc. All rights reserved.
+//
+
+#import "AFHTTPClient.h"
+
+extern NSString * const kPLBaseURLString;
+
+@interface PLAPlayClient : AFHTTPClient
+
++ (id)sharedClient;
+
+@end
48 Play Client/PLAPlayClient.m
@@ -0,0 +1,48 @@
+//
+// PLPlayClient.m
+// Play
+//
+// Created by Jon Maddox on 2/9/12.
+// Copyright (c) 2012 GitHub, Inc. All rights reserved.
+//
+
+#import "PLAPlayClient.h"
+#import "AFJSONRequestOperation.h"
+
+NSString * const kPLBaseURLString = @"https://play.githubapp.com";
+
+@implementation PLAPlayClient
+
++ (PLAPlayClient *)sharedClient {
+ static PLAPlayClient *_sharedClient = nil;
+ static dispatch_once_t oncePredicate;
+
+ dispatch_once(&oncePredicate, ^{
+ _sharedClient = [[self alloc] initWithBaseURL:[NSURL URLWithString:kPLBaseURLString]];
+ });
+
+ return _sharedClient;
+}
+
+- (id)initWithBaseURL:(NSURL *)url {
+ self = [super initWithBaseURL:url];
+ if (!self) {
+ return nil;
+ }
+
+ [self registerHTTPOperationClass:[AFJSONRequestOperation class]];
+ [self setDefaultHeader:@"Accept" value:@"application/json"];
+ [self setDefaultHeader:@"Accept-Encoding" value:@"gzip,deflate"];
+
+ return self;
+}
+
+
+
+
+
+
+
+
+
+@end
31 Play Client/PLATrack.h
@@ -0,0 +1,31 @@
+//
+// PLTrack.h
+// Play
+//
+// Created by Jon Maddox on 2/9/12.
+// Copyright (c) 2012 GitHub, Inc. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@interface PLATrack : NSObject{
+ NSString *trackId;
+ NSString *name;
+ NSString *album;
+ NSString *artist;
+ BOOL starred;
+ BOOL queued;
+}
+
+@property (nonatomic, retain) NSString *trackId;
+@property (nonatomic, retain) NSString *name;
+@property (nonatomic, retain) NSString *album;
+@property (nonatomic, retain) NSString *artist;
+@property (nonatomic, assign) BOOL starred;
+@property (nonatomic, assign) BOOL queued;
+
+- (id)initWithAttributes:(NSDictionary *)attributes;
+- (NSString *)albumArtUrl;
++ (void)currentTrackWithBlock:(void(^)(PLATrack *track))block;
+
+@end
55 Play Client/PLATrack.m
@@ -0,0 +1,55 @@
+//
+// PLTrack.m
+// Play
+//
+// Created by Jon Maddox on 2/9/12.
+// Copyright (c) 2012 GitHub, Inc. All rights reserved.
+//
+
+#import "PLATrack.h"
+#import "PLAPlayClient.h"
+
+@implementation PLATrack
+@synthesize trackId, name, album, artist, queued, starred;
+
+- (void)dealloc{
+ [trackId release];
+ [name release];
+ [album release];
+ [artist release];
+}
+
+- (id)initWithAttributes:(NSDictionary *)attributes {
+ self = [super init];
+ if (!self) {
+ return nil;
+ }
+
+ self.trackId = [attributes valueForKeyPath:@"id"];
+ self.name = [attributes valueForKeyPath:@"name"];
+ self.album = [attributes valueForKeyPath:@"album"];
+ self.artist = [attributes valueForKeyPath:@"artist"];
+ queued = [[attributes valueForKeyPath:@"queued"] boolValue];
+ starred = [[attributes valueForKeyPath:@"starred"] boolValue];
+
+ return self;
+}
+
++ (void)currentTrackWithBlock:(void(^)(PLATrack *track))block{
+ NSDictionary *parameters = [NSDictionary dictionaryWithObject:@"hubot" forKey:@"login"];
+
+ [[PLAPlayClient sharedClient] getPath:@"/now_playing" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
+ PLATrack *track = [[[PLATrack alloc] initWithAttributes:responseObject] autorelease];
+ block(track);
+ } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
+ NSLog(@"error: %@", error);
+ block(nil);
+ }];
+}
+
+- (NSString *)albumArtUrl{
+ return [NSString stringWithFormat:@"%@/images/art/%@.png?login=hubot", kPLBaseURLString, trackId];
+}
+
+
+@end
860 Play Item.xcodeproj/project.pbxproj
@@ -0,0 +1,860 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 306D109514E5189E009053C0 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 306D109414E5189E009053C0 /* Carbon.framework */; };
+ E058E22415332C4C0079B226 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = E058E21F15332C4C0079B226 /* Default.png */; };
+ E058E22515332C4C0079B226 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E058E22015332C4C0079B226 /* Default@2x.png */; };
+ E058E22615332C4C0079B226 /* icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = E058E22115332C4C0079B226 /* icon-72.png */; };
+ E058E22715332C4C0079B226 /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = E058E22215332C4C0079B226 /* icon.png */; };
+ E058E22815332C4C0079B226 /* icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E058E22315332C4C0079B226 /* icon@2x.png */; };
+ E0783E9D1533168C003EA138 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E0783E9C1533168C003EA138 /* UIKit.framework */; };
+ E0783E9F1533168C003EA138 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E0783E9E1533168C003EA138 /* Foundation.framework */; };
+ E0783EA11533168C003EA138 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E0783EA01533168C003EA138 /* CoreGraphics.framework */; };
+ E0783EDD153317E8003EA138 /* PLAPlayClient.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783EDA153317E8003EA138 /* PLAPlayClient.m */; };
+ E0783EDE153317E8003EA138 /* PLATrack.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783EDC153317E8003EA138 /* PLATrack.m */; };
+ E0783F301533187E003EA138 /* AFHTTPClient.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783EE21533187D003EA138 /* AFHTTPClient.m */; };
+ E0783F311533187E003EA138 /* AFHTTPRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783EE41533187D003EA138 /* AFHTTPRequestOperation.m */; };
+ E0783F321533187E003EA138 /* AFImageRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783EE61533187D003EA138 /* AFImageRequestOperation.m */; };
+ E0783F331533187E003EA138 /* AFJSONRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783EE81533187D003EA138 /* AFJSONRequestOperation.m */; };
+ E0783F341533187E003EA138 /* AFJSONUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783EEA1533187D003EA138 /* AFJSONUtilities.m */; };
+ E0783F351533187E003EA138 /* AFNetworkActivityIndicatorManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783EEC1533187D003EA138 /* AFNetworkActivityIndicatorManager.m */; };
+ E0783F361533187E003EA138 /* AFPropertyListRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783EEF1533187D003EA138 /* AFPropertyListRequestOperation.m */; };
+ E0783F371533187E003EA138 /* AFURLConnectionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783EF11533187D003EA138 /* AFURLConnectionOperation.m */; };
+ E0783F381533187E003EA138 /* AFXMLRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783EF31533187D003EA138 /* AFXMLRequestOperation.m */; };
+ E0783F391533187E003EA138 /* UIImageView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783EF51533187D003EA138 /* UIImageView+AFNetworking.m */; };
+ E0783F3A1533187E003EA138 /* AudioStreamer.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783EF81533187D003EA138 /* AudioStreamer.m */; };
+ E0783F3B1533187E003EA138 /* UIDevice+Hardware.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783EFA1533187D003EA138 /* UIDevice+Hardware.m */; };
+ E0783F3C1533187E003EA138 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783EFD1533187D003EA138 /* SDImageCache.m */; };
+ E0783F3D1533187E003EA138 /* SDWebImageDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783F011533187D003EA138 /* SDWebImageDecoder.m */; };
+ E0783F3E1533187E003EA138 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783F031533187D003EA138 /* SDWebImageDownloader.m */; };
+ E0783F3F1533187E003EA138 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783F061533187D003EA138 /* SDWebImageManager.m */; };
+ E0783F401533187E003EA138 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783F091533187D003EA138 /* SDWebImagePrefetcher.m */; };
+ E0783F411533187E003EA138 /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783F0B1533187D003EA138 /* UIButton+WebCache.m */; };
+ E0783F421533187E003EA138 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783F0D1533187D003EA138 /* UIImageView+WebCache.m */; };
+ E0783F431533187E003EA138 /* SFHFKeychainUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783F0F1533187D003EA138 /* SFHFKeychainUtils.m */; };
+ E0783F5B15331A1E003EA138 /* AudioStreamer.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783EF81533187D003EA138 /* AudioStreamer.m */; };
+ E0783F7415331ADF003EA138 /* AFHTTPClient.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783EE21533187D003EA138 /* AFHTTPClient.m */; };
+ E0783F7515331ADF003EA138 /* AFHTTPRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783EE41533187D003EA138 /* AFHTTPRequestOperation.m */; };
+ E0783F7615331ADF003EA138 /* AFImageRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783EE61533187D003EA138 /* AFImageRequestOperation.m */; };
+ E0783F7715331ADF003EA138 /* AFJSONRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783EE81533187D003EA138 /* AFJSONRequestOperation.m */; };
+ E0783F7815331ADF003EA138 /* AFJSONUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783EEA1533187D003EA138 /* AFJSONUtilities.m */; };
+ E0783F7915331ADF003EA138 /* AFNetworkActivityIndicatorManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783EEC1533187D003EA138 /* AFNetworkActivityIndicatorManager.m */; };
+ E0783F7A15331ADF003EA138 /* AFPropertyListRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783EEF1533187D003EA138 /* AFPropertyListRequestOperation.m */; };
+ E0783F7B15331ADF003EA138 /* AFURLConnectionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783EF11533187D003EA138 /* AFURLConnectionOperation.m */; };
+ E0783F7C15331ADF003EA138 /* AFXMLRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783EF31533187D003EA138 /* AFXMLRequestOperation.m */; };
+ E0783F7D15331ADF003EA138 /* UIImageView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = E0783EF51533187D003EA138 /* UIImageView+AFNetworking.m */; };
+ E09B1E4D14E3FD4C001BD57E /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E09B1E4C14E3FD4C001BD57E /* Cocoa.framework */; };
+ E09B1E6A14E3FDDA001BD57E /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E09B1E6914E3FDDA001BD57E /* CoreServices.framework */; };
+ E09B1E8114E3FFC8001BD57E /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E09B1E8014E3FFC8001BD57E /* AudioToolbox.framework */; };
+ E09B1E8314E3FFE4001BD57E /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E09B1E8214E3FFE4001BD57E /* AVFoundation.framework */; };
+ E09B1E8514E3FFEF001BD57E /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E09B1E8414E3FFEF001BD57E /* CoreAudio.framework */; };
+ E0C965BE1533279D001D52BF /* PLAItemAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = E0C965AD1533279D001D52BF /* PLAItemAppDelegate.m */; };
+ E0C965BF1533279D001D52BF /* IgnoredAudioProcesses.plist in Resources */ = {isa = PBXBuildFile; fileRef = E0C965AF1533279D001D52BF /* IgnoredAudioProcesses.plist */; };
+ E0C965C01533279D001D52BF /* Play-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = E0C965B01533279D001D52BF /* Play-Info.plist */; };
+ E0C965C11533279D001D52BF /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = E0C965B21533279D001D52BF /* Credits.rtf */; };
+ E0C965C21533279D001D52BF /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = E0C965B41533279D001D52BF /* InfoPlist.strings */; };
+ E0C965C31533279D001D52BF /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = E0C965B61533279D001D52BF /* MainMenu.xib */; };
+ E0C965C41533279D001D52BF /* icon.icns in Resources */ = {isa = PBXBuildFile; fileRef = E0C965B81533279D001D52BF /* icon.icns */; };
+ E0C965C51533279D001D52BF /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = E0C965B91533279D001D52BF /* main.m */; };
+ E0C965C61533279D001D52BF /* status-icon-inverted.png in Resources */ = {isa = PBXBuildFile; fileRef = E0C965BB1533279D001D52BF /* status-icon-inverted.png */; };
+ E0C965C71533279D001D52BF /* status-icon-off.png in Resources */ = {isa = PBXBuildFile; fileRef = E0C965BC1533279D001D52BF /* status-icon-off.png */; };
+ E0C965C81533279D001D52BF /* status-icon-on.png in Resources */ = {isa = PBXBuildFile; fileRef = E0C965BD1533279D001D52BF /* status-icon-on.png */; };
+ E0C965E3153327A6001D52BF /* PLAPlayerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E0C965CD153327A6001D52BF /* PLAPlayerViewController.m */; };
+ E0C965E4153327A6001D52BF /* PLAPlayerViewController_iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = E0C965CE153327A6001D52BF /* PLAPlayerViewController_iPad.xib */; };
+ E0C965E5153327A6001D52BF /* PLAPlayerViewController_iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = E0C965CF153327A6001D52BF /* PLAPlayerViewController_iPhone.xib */; };
+ E0C965E6153327A6001D52BF /* PLAIOSAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = E0C965D1153327A6001D52BF /* PLAIOSAppDelegate.m */; };
+ E0C965E7153327A6001D52BF /* Play-iOS-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = E0C965D3153327A6001D52BF /* Play-iOS-Info.plist */; };
+ E0C965E8153327A6001D52BF /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = E0C965D5153327A6001D52BF /* InfoPlist.strings */; };
+ E0C965E9153327A6001D52BF /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = E0C965D7153327A6001D52BF /* main.m */; };
+ E0C965EA153327A6001D52BF /* bottom-shadow.png in Resources */ = {isa = PBXBuildFile; fileRef = E0C965D9153327A6001D52BF /* bottom-shadow.png */; };
+ E0C965EB153327A6001D52BF /* bottom-shadow@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E0C965DA153327A6001D52BF /* bottom-shadow@2x.png */; };
+ E0C965EC153327A6001D52BF /* button-pause.png in Resources */ = {isa = PBXBuildFile; fileRef = E0C965DB153327A6001D52BF /* button-pause.png */; };
+ E0C965ED153327A6001D52BF /* button-pause@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E0C965DC153327A6001D52BF /* button-pause@2x.png */; };
+ E0C965EE153327A6001D52BF /* button-play.png in Resources */ = {isa = PBXBuildFile; fileRef = E0C965DD153327A6001D52BF /* button-play.png */; };
+ E0C965EF153327A6001D52BF /* button-play@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E0C965DE153327A6001D52BF /* button-play@2x.png */; };
+ E0C965F0153327A6001D52BF /* default_album.png in Resources */ = {isa = PBXBuildFile; fileRef = E0C965DF153327A6001D52BF /* default_album.png */; };
+ E0C965F1153327A6001D52BF /* default_album@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E0C965E0153327A6001D52BF /* default_album@2x.png */; };
+ E0C965F2153327A6001D52BF /* shadow.png in Resources */ = {isa = PBXBuildFile; fileRef = E0C965E1153327A6001D52BF /* shadow.png */; };
+ E0C965F3153327A6001D52BF /* shadow@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E0C965E2153327A6001D52BF /* shadow@2x.png */; };
+ E0CAF63B153325DB007EE510 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E0CAF63A153325DB007EE510 /* MediaPlayer.framework */; };
+ E0CAF642153325FA007EE510 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E0CAF641153325FA007EE510 /* CoreAudio.framework */; };
+ E0CAF64415332610007EE510 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E0CAF64315332610007EE510 /* AudioToolbox.framework */; };
+ E0CAF64615332619007EE510 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E0CAF64515332619007EE510 /* CFNetwork.framework */; };
+ E0CAF64815332623007EE510 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E0CAF64715332623007EE510 /* AVFoundation.framework */; };
+ E0CAF64A15332631007EE510 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E0CAF64915332631007EE510 /* Security.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 306D109414E5189E009053C0 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
+ E058E21F15332C4C0079B226 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = "<group>"; };
+ E058E22015332C4C0079B226 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = "<group>"; };
+ E058E22115332C4C0079B226 /* icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon-72.png"; sourceTree = "<group>"; };
+ E058E22215332C4C0079B226 /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon.png; sourceTree = "<group>"; };
+ E058E22315332C4C0079B226 /* icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon@2x.png"; sourceTree = "<group>"; };
+ E0783E9A1533168C003EA138 /* Play iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Play iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ E0783E9C1533168C003EA138 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
+ E0783E9E1533168C003EA138 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
+ E0783EA01533168C003EA138 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; };
+ E0783ED9153317E8003EA138 /* PLAPlayClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLAPlayClient.h; sourceTree = "<group>"; };
+ E0783EDA153317E8003EA138 /* PLAPlayClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PLAPlayClient.m; sourceTree = "<group>"; };
+ E0783EDB153317E8003EA138 /* PLATrack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLATrack.h; sourceTree = "<group>"; };
+ E0783EDC153317E8003EA138 /* PLATrack.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PLATrack.m; sourceTree = "<group>"; };
+ E0783EE11533187D003EA138 /* AFHTTPClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFHTTPClient.h; sourceTree = "<group>"; };
+ E0783EE21533187D003EA138 /* AFHTTPClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFHTTPClient.m; sourceTree = "<group>"; };
+ E0783EE31533187D003EA138 /* AFHTTPRequestOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFHTTPRequestOperation.h; sourceTree = "<group>"; };
+ E0783EE41533187D003EA138 /* AFHTTPRequestOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFHTTPRequestOperation.m; sourceTree = "<group>"; };
+ E0783EE51533187D003EA138 /* AFImageRequestOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFImageRequestOperation.h; sourceTree = "<group>"; };
+ E0783EE61533187D003EA138 /* AFImageRequestOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFImageRequestOperation.m; sourceTree = "<group>"; };
+ E0783EE71533187D003EA138 /* AFJSONRequestOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFJSONRequestOperation.h; sourceTree = "<group>"; };
+ E0783EE81533187D003EA138 /* AFJSONRequestOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFJSONRequestOperation.m; sourceTree = "<group>"; };
+ E0783EE91533187D003EA138 /* AFJSONUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFJSONUtilities.h; sourceTree = "<group>"; };
+ E0783EEA1533187D003EA138 /* AFJSONUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFJSONUtilities.m; sourceTree = "<group>"; };
+ E0783EEB1533187D003EA138 /* AFNetworkActivityIndicatorManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFNetworkActivityIndicatorManager.h; sourceTree = "<group>"; };
+ E0783EEC1533187D003EA138 /* AFNetworkActivityIndicatorManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFNetworkActivityIndicatorManager.m; sourceTree = "<group>"; };
+ E0783EED1533187D003EA138 /* AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFNetworking.h; sourceTree = "<group>"; };
+ E0783EEE1533187D003EA138 /* AFPropertyListRequestOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFPropertyListRequestOperation.h; sourceTree = "<group>"; };
+ E0783EEF1533187D003EA138 /* AFPropertyListRequestOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFPropertyListRequestOperation.m; sourceTree = "<group>"; };
+ E0783EF01533187D003EA138 /* AFURLConnectionOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFURLConnectionOperation.h; sourceTree = "<group>"; };
+ E0783EF11533187D003EA138 /* AFURLConnectionOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFURLConnectionOperation.m; sourceTree = "<group>"; };
+ E0783EF21533187D003EA138 /* AFXMLRequestOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFXMLRequestOperation.h; sourceTree = "<group>"; };
+ E0783EF31533187D003EA138 /* AFXMLRequestOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFXMLRequestOperation.m; sourceTree = "<group>"; };
+ E0783EF41533187D003EA138 /* UIImageView+AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImageView+AFNetworking.h"; sourceTree = "<group>"; };
+ E0783EF51533187D003EA138 /* UIImageView+AFNetworking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImageView+AFNetworking.m"; sourceTree = "<group>"; };
+ E0783EF71533187D003EA138 /* AudioStreamer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioStreamer.h; sourceTree = "<group>"; };
+ E0783EF81533187D003EA138 /* AudioStreamer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AudioStreamer.m; sourceTree = "<group>"; };
+ E0783EF91533187D003EA138 /* UIDevice+Hardware.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIDevice+Hardware.h"; sourceTree = "<group>"; };
+ E0783EFA1533187D003EA138 /* UIDevice+Hardware.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIDevice+Hardware.m"; sourceTree = "<group>"; };
+ E0783EFC1533187D003EA138 /* SDImageCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDImageCache.h; sourceTree = "<group>"; };
+ E0783EFD1533187D003EA138 /* SDImageCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDImageCache.m; sourceTree = "<group>"; };
+ E0783EFE1533187D003EA138 /* SDImageCacheDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDImageCacheDelegate.h; sourceTree = "<group>"; };
+ E0783EFF1533187D003EA138 /* SDWebImageCompat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageCompat.h; sourceTree = "<group>"; };
+ E0783F001533187D003EA138 /* SDWebImageDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageDecoder.h; sourceTree = "<group>"; };
+ E0783F011533187D003EA138 /* SDWebImageDecoder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageDecoder.m; sourceTree = "<group>"; };
+ E0783F021533187D003EA138 /* SDWebImageDownloader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageDownloader.h; sourceTree = "<group>"; };
+ E0783F031533187D003EA138 /* SDWebImageDownloader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageDownloader.m; sourceTree = "<group>"; };
+ E0783F041533187D003EA138 /* SDWebImageDownloaderDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageDownloaderDelegate.h; sourceTree = "<group>"; };
+ E0783F051533187D003EA138 /* SDWebImageManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageManager.h; sourceTree = "<group>"; };
+ E0783F061533187D003EA138 /* SDWebImageManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageManager.m; sourceTree = "<group>"; };
+ E0783F071533187D003EA138 /* SDWebImageManagerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageManagerDelegate.h; sourceTree = "<group>"; };
+ E0783F081533187D003EA138 /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImagePrefetcher.h; sourceTree = "<group>"; };
+ E0783F091533187D003EA138 /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImagePrefetcher.m; sourceTree = "<group>"; };
+ E0783F0A1533187D003EA138 /* UIButton+WebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIButton+WebCache.h"; sourceTree = "<group>"; };
+ E0783F0B1533187D003EA138 /* UIButton+WebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIButton+WebCache.m"; sourceTree = "<group>"; };
+ E0783F0C1533187D003EA138 /* UIImageView+WebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImageView+WebCache.h"; sourceTree = "<group>"; };
+ E0783F0D1533187D003EA138 /* UIImageView+WebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImageView+WebCache.m"; sourceTree = "<group>"; };
+ E0783F0E1533187D003EA138 /* SFHFKeychainUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFHFKeychainUtils.h; sourceTree = "<group>"; };
+ E0783F0F1533187D003EA138 /* SFHFKeychainUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SFHFKeychainUtils.m; sourceTree = "<group>"; };
+ E09B1E4814E3FD4C001BD57E /* Play.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Play.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ E09B1E4C14E3FD4C001BD57E /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
+ E09B1E4F14E3FD4C001BD57E /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
+ E09B1E5014E3FD4C001BD57E /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };
+ E09B1E5114E3FD4C001BD57E /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ E09B1E6914E3FDDA001BD57E /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = System/Library/Frameworks/CoreServices.framework; sourceTree = SDKROOT; };
+ E09B1E8014E3FFC8001BD57E /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
+ E09B1E8214E3FFE4001BD57E /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
+ E09B1E8414E3FFEF001BD57E /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
+ E0C965AC1533279D001D52BF /* PLAItemAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLAItemAppDelegate.h; sourceTree = "<group>"; };
+ E0C965AD1533279D001D52BF /* PLAItemAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PLAItemAppDelegate.m; sourceTree = "<group>"; };
+ E0C965AF1533279D001D52BF /* IgnoredAudioProcesses.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = IgnoredAudioProcesses.plist; sourceTree = "<group>"; };
+ E0C965B01533279D001D52BF /* Play-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Play-Info.plist"; sourceTree = "<group>"; };
+ E0C965B11533279D001D52BF /* Play-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Play-Prefix.pch"; sourceTree = "<group>"; };
+ E0C965B31533279D001D52BF /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = "<group>"; };
+ E0C965B51533279D001D52BF /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ E0C965B71533279D001D52BF /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = "<group>"; };
+ E0C965B81533279D001D52BF /* icon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = icon.icns; sourceTree = "<group>"; };
+ E0C965B91533279D001D52BF /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ E0C965BB1533279D001D52BF /* status-icon-inverted.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "status-icon-inverted.png"; sourceTree = "<group>"; };
+ E0C965BC1533279D001D52BF /* status-icon-off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "status-icon-off.png"; sourceTree = "<group>"; };
+ E0C965BD1533279D001D52BF /* status-icon-on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "status-icon-on.png"; sourceTree = "<group>"; };
+ E0C965CC153327A6001D52BF /* PLAPlayerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLAPlayerViewController.h; sourceTree = "<group>"; };
+ E0C965CD153327A6001D52BF /* PLAPlayerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PLAPlayerViewController.m; sourceTree = "<group>"; };
+ E0C965CE153327A6001D52BF /* PLAPlayerViewController_iPad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PLAPlayerViewController_iPad.xib; sourceTree = "<group>"; };
+ E0C965CF153327A6001D52BF /* PLAPlayerViewController_iPhone.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PLAPlayerViewController_iPhone.xib; sourceTree = "<group>"; };
+ E0C965D0153327A6001D52BF /* PLAIOSAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLAIOSAppDelegate.h; sourceTree = "<group>"; };
+ E0C965D1153327A6001D52BF /* PLAIOSAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PLAIOSAppDelegate.m; sourceTree = "<group>"; };
+ E0C965D3153327A6001D52BF /* Play-iOS-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Play-iOS-Info.plist"; sourceTree = "<group>"; };
+ E0C965D4153327A6001D52BF /* Play-iOS-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Play-iOS-Prefix.pch"; sourceTree = "<group>"; };
+ E0C965D6153327A6001D52BF /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ E0C965D7153327A6001D52BF /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ E0C965D9153327A6001D52BF /* bottom-shadow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "bottom-shadow.png"; sourceTree = "<group>"; };
+ E0C965DA153327A6001D52BF /* bottom-shadow@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "bottom-shadow@2x.png"; sourceTree = "<group>"; };
+ E0C965DB153327A6001D52BF /* button-pause.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "button-pause.png"; sourceTree = "<group>"; };
+ E0C965DC153327A6001D52BF /* button-pause@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "button-pause@2x.png"; sourceTree = "<group>"; };
+ E0C965DD153327A6001D52BF /* button-play.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "button-play.png"; sourceTree = "<group>"; };
+ E0C965DE153327A6001D52BF /* button-play@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "button-play@2x.png"; sourceTree = "<group>"; };
+ E0C965DF153327A6001D52BF /* default_album.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = default_album.png; sourceTree = "<group>"; };
+ E0C965E0153327A6001D52BF /* default_album@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "default_album@2x.png"; sourceTree = "<group>"; };
+ E0C965E1153327A6001D52BF /* shadow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = shadow.png; sourceTree = "<group>"; };
+ E0C965E2153327A6001D52BF /* shadow@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shadow@2x.png"; sourceTree = "<group>"; };
+ E0CAF63A153325DB007EE510 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/MediaPlayer.framework; sourceTree = DEVELOPER_DIR; };
+ E0CAF641153325FA007EE510 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/CoreAudio.framework; sourceTree = DEVELOPER_DIR; };
+ E0CAF64315332610007EE510 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/AudioToolbox.framework; sourceTree = DEVELOPER_DIR; };
+ E0CAF64515332619007EE510 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; };
+ E0CAF64715332623007EE510 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/AVFoundation.framework; sourceTree = DEVELOPER_DIR; };
+ E0CAF64915332631007EE510 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ E0783E971533168C003EA138 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E0CAF64A15332631007EE510 /* Security.framework in Frameworks */,
+ E0CAF64815332623007EE510 /* AVFoundation.framework in Frameworks */,
+ E0CAF64615332619007EE510 /* CFNetwork.framework in Frameworks */,
+ E0CAF64415332610007EE510 /* AudioToolbox.framework in Frameworks */,
+ E0CAF642153325FA007EE510 /* CoreAudio.framework in Frameworks */,
+ E0CAF63B153325DB007EE510 /* MediaPlayer.framework in Frameworks */,
+ E0783E9D1533168C003EA138 /* UIKit.framework in Frameworks */,
+ E0783E9F1533168C003EA138 /* Foundation.framework in Frameworks */,
+ E0783EA11533168C003EA138 /* CoreGraphics.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E09B1E4514E3FD4C001BD57E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 306D109514E5189E009053C0 /* Carbon.framework in Frameworks */,
+ E09B1E8514E3FFEF001BD57E /* CoreAudio.framework in Frameworks */,
+ E09B1E8314E3FFE4001BD57E /* AVFoundation.framework in Frameworks */,
+ E09B1E8114E3FFC8001BD57E /* AudioToolbox.framework in Frameworks */,
+ E09B1E6A14E3FDDA001BD57E /* CoreServices.framework in Frameworks */,
+ E09B1E4D14E3FD4C001BD57E /* Cocoa.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ E0783ED8153317CC003EA138 /* Play Client */ = {
+ isa = PBXGroup;
+ children = (
+ E0783ED9153317E8003EA138 /* PLAPlayClient.h */,
+ E0783EDA153317E8003EA138 /* PLAPlayClient.m */,
+ E0783EDB153317E8003EA138 /* PLATrack.h */,
+ E0783EDC153317E8003EA138 /* PLATrack.m */,
+ );
+ path = "Play Client";
+ sourceTree = "<group>";
+ };
+ E0783EDF1533187D003EA138 /* vendor */ = {
+ isa = PBXGroup;
+ children = (
+ E0783EE01533187D003EA138 /* AFNetworking */,
+ E0783EF61533187D003EA138 /* AudioStreamer */,
+ E0783EFB1533187D003EA138 /* SDWebImage */,
+ E0783F0E1533187D003EA138 /* SFHFKeychainUtils.h */,
+ E0783F0F1533187D003EA138 /* SFHFKeychainUtils.m */,
+ );
+ path = vendor;
+ sourceTree = "<group>";
+ };
+ E0783EE01533187D003EA138 /* AFNetworking */ = {
+ isa = PBXGroup;
+ children = (
+ E0783EE11533187D003EA138 /* AFHTTPClient.h */,
+ E0783EE21533187D003EA138 /* AFHTTPClient.m */,
+ E0783EE31533187D003EA138 /* AFHTTPRequestOperation.h */,
+ E0783EE41533187D003EA138 /* AFHTTPRequestOperation.m */,
+ E0783EE51533187D003EA138 /* AFImageRequestOperation.h */,
+ E0783EE61533187D003EA138 /* AFImageRequestOperation.m */,
+ E0783EE71533187D003EA138 /* AFJSONRequestOperation.h */,
+ E0783EE81533187D003EA138 /* AFJSONRequestOperation.m */,
+ E0783EE91533187D003EA138 /* AFJSONUtilities.h */,
+ E0783EEA1533187D003EA138 /* AFJSONUtilities.m */,
+ E0783EEB1533187D003EA138 /* AFNetworkActivityIndicatorManager.h */,
+ E0783EEC1533187D003EA138 /* AFNetworkActivityIndicatorManager.m */,
+ E0783EED1533187D003EA138 /* AFNetworking.h */,
+ E0783EEE1533187D003EA138 /* AFPropertyListRequestOperation.h */,
+ E0783EEF1533187D003EA138 /* AFPropertyListRequestOperation.m */,
+ E0783EF01533187D003EA138 /* AFURLConnectionOperation.h */,
+ E0783EF11533187D003EA138 /* AFURLConnectionOperation.m */,
+ E0783EF21533187D003EA138 /* AFXMLRequestOperation.h */,
+ E0783EF31533187D003EA138 /* AFXMLRequestOperation.m */,
+ E0783EF41533187D003EA138 /* UIImageView+AFNetworking.h */,
+ E0783EF51533187D003EA138 /* UIImageView+AFNetworking.m */,
+ );
+ path = AFNetworking;
+ sourceTree = "<group>";
+ };
+ E0783EF61533187D003EA138 /* AudioStreamer */ = {
+ isa = PBXGroup;
+ children = (
+ E0783EF71533187D003EA138 /* AudioStreamer.h */,
+ E0783EF81533187D003EA138 /* AudioStreamer.m */,
+ E0783EF91533187D003EA138 /* UIDevice+Hardware.h */,
+ E0783EFA1533187D003EA138 /* UIDevice+Hardware.m */,
+ );
+ path = AudioStreamer;
+ sourceTree = "<group>";
+ };
+ E0783EFB1533187D003EA138 /* SDWebImage */ = {
+ isa = PBXGroup;
+ children = (
+ E0783EFC1533187D003EA138 /* SDImageCache.h */,
+ E0783EFD1533187D003EA138 /* SDImageCache.m */,
+ E0783EFE1533187D003EA138 /* SDImageCacheDelegate.h */,
+ E0783EFF1533187D003EA138 /* SDWebImageCompat.h */,
+ E0783F001533187D003EA138 /* SDWebImageDecoder.h */,
+ E0783F011533187D003EA138 /* SDWebImageDecoder.m */,
+ E0783F021533187D003EA138 /* SDWebImageDownloader.h */,
+ E0783F031533187D003EA138 /* SDWebImageDownloader.m */,
+ E0783F041533187D003EA138 /* SDWebImageDownloaderDelegate.h */,
+ E0783F051533187D003EA138 /* SDWebImageManager.h */,
+ E0783F061533187D003EA138 /* SDWebImageManager.m */,
+ E0783F071533187D003EA138 /* SDWebImageManagerDelegate.h */,
+ E0783F081533187D003EA138 /* SDWebImagePrefetcher.h */,
+ E0783F091533187D003EA138 /* SDWebImagePrefetcher.m */,
+ E0783F0A1533187D003EA138 /* UIButton+WebCache.h */,
+ E0783F0B1533187D003EA138 /* UIButton+WebCache.m */,
+ E0783F0C1533187D003EA138 /* UIImageView+WebCache.h */,
+ E0783F0D1533187D003EA138 /* UIImageView+WebCache.m */,
+ );
+ path = SDWebImage;
+ sourceTree = "<group>";
+ };
+ E09B1E3D14E3FD4C001BD57E = {
+ isa = PBXGroup;
+ children = (
+ E0783EDF1533187D003EA138 /* vendor */,
+ E0783ED8153317CC003EA138 /* Play Client */,
+ E0C965A91533279D001D52BF /* Play Item */,
+ E0C965C9153327A6001D52BF /* Play iOS */,
+ E0CAF64B15332643007EE510 /* iOS Frameworks */,
+ E09B1E4B14E3FD4C001BD57E /* Frameworks */,
+ E09B1E4914E3FD4C001BD57E /* Products */,
+ );
+ sourceTree = "<group>";
+ };
+ E09B1E4914E3FD4C001BD57E /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ E09B1E4814E3FD4C001BD57E /* Play.app */,
+ E0783E9A1533168C003EA138 /* Play iOS.app */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ E09B1E4B14E3FD4C001BD57E /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 306D109414E5189E009053C0 /* Carbon.framework */,
+ E09B1E8414E3FFEF001BD57E /* CoreAudio.framework */,
+ E09B1E8214E3FFE4001BD57E /* AVFoundation.framework */,
+ E09B1E8014E3FFC8001BD57E /* AudioToolbox.framework */,
+ E09B1E6914E3FDDA001BD57E /* CoreServices.framework */,
+ E09B1E4C14E3FD4C001BD57E /* Cocoa.framework */,
+ E09B1E4E14E3FD4C001BD57E /* Other Frameworks */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+ E09B1E4E14E3FD4C001BD57E /* Other Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ E09B1E4F14E3FD4C001BD57E /* AppKit.framework */,
+ E09B1E5014E3FD4C001BD57E /* CoreData.framework */,
+ E09B1E5114E3FD4C001BD57E /* Foundation.framework */,
+ );
+ name = "Other Frameworks";
+ sourceTree = "<group>";
+ };
+ E0C965A91533279D001D52BF /* Play Item */ = {
+ isa = PBXGroup;
+ children = (
+ E0C965AC1533279D001D52BF /* PLAItemAppDelegate.h */,
+ E0C965AD1533279D001D52BF /* PLAItemAppDelegate.m */,
+ E0C965BA1533279D001D52BF /* images */,
+ E0C965AA1533279D001D52BF /* Classes */,
+ E0C965AE1533279D001D52BF /* Supporting Files */,
+ );
+ path = "Play Item";
+ sourceTree = SOURCE_ROOT;
+ };
+ E0C965AA1533279D001D52BF /* Classes */ = {
+ isa = PBXGroup;
+ children = (
+ E0C965AB1533279D001D52BF /* Controllers */,
+ );
+ path = Classes;
+ sourceTree = "<group>";
+ };
+ E0C965AB1533279D001D52BF /* Controllers */ = {
+ isa = PBXGroup;
+ children = (
+ );
+ path = Controllers;
+ sourceTree = "<group>";
+ };
+ E0C965AE1533279D001D52BF /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ E0C965AF1533279D001D52BF /* IgnoredAudioProcesses.plist */,
+ E0C965B01533279D001D52BF /* Play-Info.plist */,
+ E0C965B11533279D001D52BF /* Play-Prefix.pch */,
+ E0C965B21533279D001D52BF /* Credits.rtf */,
+ E0C965B41533279D001D52BF /* InfoPlist.strings */,
+ E0C965B61533279D001D52BF /* MainMenu.xib */,
+ E0C965B81533279D001D52BF /* icon.icns */,
+ E0C965B91533279D001D52BF /* main.m */,
+ );
+ path = "Supporting Files";
+ sourceTree = "<group>";
+ };
+ E0C965BA1533279D001D52BF /* images */ = {
+ isa = PBXGroup;
+ children = (
+ E0C965BB1533279D001D52BF /* status-icon-inverted.png */,
+ E0C965BC1533279D001D52BF /* status-icon-off.png */,
+ E0C965BD1533279D001D52BF /* status-icon-on.png */,
+ );
+ path = images;
+ sourceTree = "<group>";
+ };
+ E0C965C9153327A6001D52BF /* Play iOS */ = {
+ isa = PBXGroup;
+ children = (
+ E0C965D0153327A6001D52BF /* PLAIOSAppDelegate.h */,
+ E0C965D1153327A6001D52BF /* PLAIOSAppDelegate.m */,
+ E0C965D8153327A6001D52BF /* images */,
+ E0C965CA153327A6001D52BF /* Classes */,
+ E0C965D2153327A6001D52BF /* Supporting Files */,
+ );
+ path = "Play iOS";
+ sourceTree = "<group>";
+ };
+ E0C965CA153327A6001D52BF /* Classes */ = {
+ isa = PBXGroup;
+ children = (
+ E0C965CB153327A6001D52BF /* Controllers */,
+ );
+ path = Classes;
+ sourceTree = "<group>";
+ };
+ E0C965CB153327A6001D52BF /* Controllers */ = {
+ isa = PBXGroup;
+ children = (
+ E0C965CC153327A6001D52BF /* PLAPlayerViewController.h */,
+ E0C965CD153327A6001D52BF /* PLAPlayerViewController.m */,
+ E0C965CE153327A6001D52BF /* PLAPlayerViewController_iPad.xib */,
+ E0C965CF153327A6001D52BF /* PLAPlayerViewController_iPhone.xib */,
+ );
+ path = Controllers;
+ sourceTree = "<group>";
+ };
+ E0C965D2153327A6001D52BF /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ E0C965D3153327A6001D52BF /* Play-iOS-Info.plist */,
+ E0C965D4153327A6001D52BF /* Play-iOS-Prefix.pch */,
+ E0C965D5153327A6001D52BF /* InfoPlist.strings */,
+ E0C965D7153327A6001D52BF /* main.m */,
+ );
+ path = "Supporting Files";
+ sourceTree = "<group>";
+ };
+ E0C965D8153327A6001D52BF /* images */ = {
+ isa = PBXGroup;
+ children = (
+ E058E21F15332C4C0079B226 /* Default.png */,
+ E058E22015332C4C0079B226 /* Default@2x.png */,
+ E058E22115332C4C0079B226 /* icon-72.png */,
+ E058E22215332C4C0079B226 /* icon.png */,
+ E058E22315332C4C0079B226 /* icon@2x.png */,
+ E0C965D9153327A6001D52BF /* bottom-shadow.png */,
+ E0C965DA153327A6001D52BF /* bottom-shadow@2x.png */,
+ E0C965DB153327A6001D52BF /* button-pause.png */,
+ E0C965DC153327A6001D52BF /* button-pause@2x.png */,
+ E0C965DD153327A6001D52BF /* button-play.png */,
+ E0C965DE153327A6001D52BF /* button-play@2x.png */,
+ E0C965DF153327A6001D52BF /* default_album.png */,
+ E0C965E0153327A6001D52BF /* default_album@2x.png */,
+ E0C965E1153327A6001D52BF /* shadow.png */,
+ E0C965E2153327A6001D52BF /* shadow@2x.png */,
+ );
+ path = images;
+ sourceTree = "<group>";
+ };
+ E0CAF64B15332643007EE510 /* iOS Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ E0783E9C1533168C003EA138 /* UIKit.framework */,
+ E0783E9E1533168C003EA138 /* Foundation.framework */,
+ E0783EA01533168C003EA138 /* CoreGraphics.framework */,
+ E0CAF64915332631007EE510 /* Security.framework */,
+ E0CAF64715332623007EE510 /* AVFoundation.framework */,
+ E0CAF64515332619007EE510 /* CFNetwork.framework */,
+ E0CAF64315332610007EE510 /* AudioToolbox.framework */,
+ E0CAF641153325FA007EE510 /* CoreAudio.framework */,
+ E0CAF63A153325DB007EE510 /* MediaPlayer.framework */,
+ );
+ name = "iOS Frameworks";
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ E0783E991533168C003EA138 /* Play iOS */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = E0783EB01533168C003EA138 /* Build configuration list for PBXNativeTarget "Play iOS" */;
+ buildPhases = (
+ E0783E961533168C003EA138 /* Sources */,
+ E0783E971533168C003EA138 /* Frameworks */,
+ E0783E981533168C003EA138 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Play iOS";
+ productName = "Play iOS";
+ productReference = E0783E9A1533168C003EA138 /* Play iOS.app */;
+ productType = "com.apple.product-type.application";
+ };
+ E09B1E4714E3FD4C001BD57E /* Play */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = E09B1E6614E3FD4C001BD57E /* Build configuration list for PBXNativeTarget "Play" */;
+ buildPhases = (
+ E09B1E4414E3FD4C001BD57E /* Sources */,
+ E09B1E4514E3FD4C001BD57E /* Frameworks */,
+ E09B1E4614E3FD4C001BD57E /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = Play;
+ productName = Play;
+ productReference = E09B1E4814E3FD4C001BD57E /* Play.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ E09B1E3F14E3FD4C001BD57E /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0420;
+ ORGANIZATIONNAME = "GitHub, Inc.";
+ };
+ buildConfigurationList = E09B1E4214E3FD4C001BD57E /* Build configuration list for PBXProject "Play Item" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ English,
+ );
+ mainGroup = E09B1E3D14E3FD4C001BD57E;
+ productRefGroup = E09B1E4914E3FD4C001BD57E /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ E09B1E4714E3FD4C001BD57E /* Play */,
+ E0783E991533168C003EA138 /* Play iOS */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ E0783E981533168C003EA138 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E0C965E4153327A6001D52BF /* PLAPlayerViewController_iPad.xib in Resources */,
+ E0C965E5153327A6001D52BF /* PLAPlayerViewController_iPhone.xib in Resources */,
+ E0C965E7153327A6001D52BF /* Play-iOS-Info.plist in Resources */,
+ E0C965E8153327A6001D52BF /* InfoPlist.strings in Resources */,
+ E0C965EA153327A6001D52BF /* bottom-shadow.png in Resources */,
+ E0C965EB153327A6001D52BF /* bottom-shadow@2x.png in Resources */,
+ E0C965EC153327A6001D52BF /* button-pause.png in Resources */,
+ E0C965ED153327A6001D52BF /* button-pause@2x.png in Resources */,
+ E0C965EE153327A6001D52BF /* button-play.png in Resources */,
+ E0C965EF153327A6001D52BF /* button-play@2x.png in Resources */,
+ E0C965F0153327A6001D52BF /* default_album.png in Resources */,
+ E0C965F1153327A6001D52BF /* default_album@2x.png in Resources */,
+ E0C965F2153327A6001D52BF /* shadow.png in Resources */,
+ E0C965F3153327A6001D52BF /* shadow@2x.png in Resources */,
+ E058E22415332C4C0079B226 /* Default.png in Resources */,
+ E058E22515332C4C0079B226 /* Default@2x.png in Resources */,
+ E058E22615332C4C0079B226 /* icon-72.png in Resources */,
+ E058E22715332C4C0079B226 /* icon.png in Resources */,
+ E058E22815332C4C0079B226 /* icon@2x.png in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E09B1E4614E3FD4C001BD57E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E0C965BF1533279D001D52BF /* IgnoredAudioProcesses.plist in Resources */,
+ E0C965C01533279D001D52BF /* Play-Info.plist in Resources */,
+ E0C965C11533279D001D52BF /* Credits.rtf in Resources */,
+ E0C965C21533279D001D52BF /* InfoPlist.strings in Resources */,
+ E0C965C31533279D001D52BF /* MainMenu.xib in Resources */,
+ E0C965C41533279D001D52BF /* icon.icns in Resources */,
+ E0C965C61533279D001D52BF /* status-icon-inverted.png in Resources */,
+ E0C965C71533279D001D52BF /* status-icon-off.png in Resources */,
+ E0C965C81533279D001D52BF /* status-icon-on.png in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ E0783E961533168C003EA138 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E0783EDD153317E8003EA138 /* PLAPlayClient.m in Sources */,
+ E0783EDE153317E8003EA138 /* PLATrack.m in Sources */,
+ E0783F301533187E003EA138 /* AFHTTPClient.m in Sources */,
+ E0783F311533187E003EA138 /* AFHTTPRequestOperation.m in Sources */,
+ E0783F321533187E003EA138 /* AFImageRequestOperation.m in Sources */,
+ E0783F331533187E003EA138 /* AFJSONRequestOperation.m in Sources */,
+ E0783F341533187E003EA138 /* AFJSONUtilities.m in Sources */,
+ E0783F351533187E003EA138 /* AFNetworkActivityIndicatorManager.m in Sources */,
+ E0783F361533187E003EA138 /* AFPropertyListRequestOperation.m in Sources */,
+ E0783F371533187E003EA138 /* AFURLConnectionOperation.m in Sources */,
+ E0783F381533187E003EA138 /* AFXMLRequestOperation.m in Sources */,
+ E0783F391533187E003EA138 /* UIImageView+AFNetworking.m in Sources */,
+ E0783F3A1533187E003EA138 /* AudioStreamer.m in Sources */,
+ E0783F3B1533187E003EA138 /* UIDevice+Hardware.m in Sources */,
+ E0783F3C1533187E003EA138 /* SDImageCache.m in Sources */,
+ E0783F3D1533187E003EA138 /* SDWebImageDecoder.m in Sources */,
+ E0783F3E1533187E003EA138 /* SDWebImageDownloader.m in Sources */,
+ E0783F3F1533187E003EA138 /* SDWebImageManager.m in Sources */,
+ E0783F401533187E003EA138 /* SDWebImagePrefetcher.m in Sources */,
+ E0783F411533187E003EA138 /* UIButton+WebCache.m in Sources */,
+ E0783F421533187E003EA138 /* UIImageView+WebCache.m in Sources */,
+ E0783F431533187E003EA138 /* SFHFKeychainUtils.m in Sources */,
+ E0C965E3153327A6001D52BF /* PLAPlayerViewController.m in Sources */,
+ E0C965E6153327A6001D52BF /* PLAIOSAppDelegate.m in Sources */,
+ E0C965E9153327A6001D52BF /* main.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E09B1E4414E3FD4C001BD57E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E0783F5B15331A1E003EA138 /* AudioStreamer.m in Sources */,
+ E0783F7415331ADF003EA138 /* AFHTTPClient.m in Sources */,
+ E0783F7515331ADF003EA138 /* AFHTTPRequestOperation.m in Sources */,
+ E0783F7615331ADF003EA138 /* AFImageRequestOperation.m in Sources */,
+ E0783F7715331ADF003EA138 /* AFJSONRequestOperation.m in Sources */,
+ E0783F7815331ADF003EA138 /* AFJSONUtilities.m in Sources */,
+ E0783F7915331ADF003EA138 /* AFNetworkActivityIndicatorManager.m in Sources */,
+ E0783F7A15331ADF003EA138 /* AFPropertyListRequestOperation.m in Sources */,
+ E0783F7B15331ADF003EA138 /* AFURLConnectionOperation.m in Sources */,
+ E0783F7C15331ADF003EA138 /* AFXMLRequestOperation.m in Sources */,
+ E0783F7D15331ADF003EA138 /* UIImageView+AFNetworking.m in Sources */,
+ E0C965BE1533279D001D52BF /* PLAItemAppDelegate.m in Sources */,
+ E0C965C51533279D001D52BF /* main.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ E0C965B21533279D001D52BF /* Credits.rtf */ = {
+ isa = PBXVariantGroup;
+ children = (
+ E0C965B31533279D001D52BF /* en */,
+ );
+ name = Credits.rtf;
+ sourceTree = "<group>";
+ };
+ E0C965B41533279D001D52BF /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ E0C965B51533279D001D52BF /* en */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+ E0C965B61533279D001D52BF /* MainMenu.xib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ E0C965B71533279D001D52BF /* en */,
+ );
+ name = MainMenu.xib;
+ sourceTree = "<group>";
+ };
+ E0C965D5153327A6001D52BF /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ E0C965D6153327A6001D52BF /* en */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ E0783EAE1533168C003EA138 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Developer/Library/Frameworks\"",
+ "\"$(SRCROOT)/vendor\"",
+ );
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Play iOS/Supporting Files/Play-iOS-Prefix.pch";
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ INFOPLIST_FILE = "Play iOS/Supporting Files/Play-iOS-Info.plist";
+ IPHONEOS_DEPLOYMENT_TARGET = 5.1;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ WRAPPER_EXTENSION = app;
+ };
+ name = Debug;
+ };
+ E0783EAF1533168C003EA138 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Developer/Library/Frameworks\"",
+ "\"$(SRCROOT)/vendor\"",
+ );
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Play iOS/Supporting Files/Play-iOS-Prefix.pch";
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ INFOPLIST_FILE = "Play iOS/Supporting Files/Play-iOS-Info.plist";
+ IPHONEOS_DEPLOYMENT_TARGET = 5.1;
+ OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ WRAPPER_EXTENSION = app;
+ };
+ name = Release;
+ };
+ E09B1E6414E3FD4C001BD57E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+ COPY_PHASE_STRIP = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.7;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = macosx;
+ };
+ name = Debug;
+ };
+ E09B1E6514E3FD4C001BD57E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.7;
+ SDKROOT = macosx;
+ };
+ name = Release;
+ };
+ E09B1E6714E3FD4C001BD57E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/Play/vendor\"",
+ "\"$(SRCROOT)/vendor\"",
+ );
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Play Item/Supporting Files/Play-Prefix.pch";
+ INFOPLIST_FILE = "Play Item/Supporting Files/Play-Info.plist";
+ OTHER_CFLAGS = "-DTARGET_OS_IPHONE=NO";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ WRAPPER_EXTENSION = app;
+ };
+ name = Debug;
+ };
+ E09B1E6814E3FD4C001BD57E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/Play/vendor\"",
+ "\"$(SRCROOT)/vendor\"",
+ );
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Play Item/Supporting Files/Play-Prefix.pch";
+ INFOPLIST_FILE = "Play Item/Supporting Files/Play-Info.plist";
+ OTHER_CFLAGS = "-DTARGET_OS_IPHONE=NO";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ WRAPPER_EXTENSION = app;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ E0783EB01533168C003EA138 /* Build configuration list for PBXNativeTarget "Play iOS" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E0783EAE1533168C003EA138 /* Debug */,
+ E0783EAF1533168C003EA138 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ E09B1E4214E3FD4C001BD57E /* Build configuration list for PBXProject "Play Item" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E09B1E6414E3FD4C001BD57E /* Debug */,
+ E09B1E6514E3FD4C001BD57E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ E09B1E6614E3FD4C001BD57E /* Build configuration list for PBXNativeTarget "Play" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E09B1E6714E3FD4C001BD57E /* Debug */,
+ E09B1E6814E3FD4C001BD57E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = E09B1E3F14E3FD4C001BD57E /* Project object */;
+}
31 Play Item/PLAItemAppDelegate.h
@@ -0,0 +1,31 @@
+//
+// PLAItemAppDelegate.h
+// Play
+//
+// Created by Jon Maddox on 2/9/12.
+// Copyright (c) 2012 GitHub, Inc. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+#import "AudioStreamer.h"
+
+@interface PLAItemAppDelegate : NSObject <NSApplicationDelegate>{
+ NSStatusItem *statusItem;
+ NSMenu *statusMenu;
+ AudioStreamer *streamer;
+}
+
+@property (strong) NSStatusItem *statusItem;
+@property (strong) IBOutlet NSMenu *statusMenu;
+@property (assign) IBOutlet NSWindow *window;
+
+- (NSMenuItem *)playStatusItem;
+- (NSMenuItem *)playActionItem;
+- (void)setPlayStatus:(NSString *)statusString;
+- (void)setPlayActionTitle:(NSString *)actionTitle;
+- (void)createStreamer;
+- (void)destroyStreamer;
+- (IBAction)togglePlayState;
+- (IBAction)goToPlay;
+
+@end
193 Play Item/PLAItemAppDelegate.m
@@ -0,0 +1,193 @@
+//
+// PLAItemAppDelegate.m
+// Play
+//
+// Created by Jon Maddox on 2/9/12.
+// Copyright (c) 2012 GitHub, Inc. All rights reserved.
+//
+
+#import "PLAItemAppDelegate.h"
+//#import "SPMediaKeyTap.h"
+
+@interface PLAItemAppDelegate ()
+
+//@property (nonatomic, retain) SPMediaKeyTap *keyTap;
+
+@end
+
+@implementation PLAItemAppDelegate
+
+@synthesize window = _window;
+@synthesize statusItem;
+@synthesize statusMenu;
+
+//@synthesize keyTap = _keyTap;
+
+- (void)dealloc{
+ [self destroyStreamer];
+ [statusItem release];
+ [statusMenu release];
+// [_keyTap release], _keyTap = nil;
+ [super dealloc];
+}
+
+-(void)awakeFromNib{
+ self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
+ [statusItem setMenu:statusMenu];
+ [statusItem setAction:@selector(toggleWindow:)];
+ [statusItem setImage:[NSImage imageNamed:@"status-icon-off.png"]];
+ [statusItem setAlternateImage:[NSImage imageNamed:@"status-icon-inverted.png"]];
+ [statusItem setHighlightMode:YES];
+
+ [self setPlayActionTitle:@"Play"];
+ [[self playActionItem] setTarget:self];
+ [[self playActionItem] setAction:@selector(toggelPlayState)];
+ [[self playActionItem] setEnabled:YES];
+
+ [[statusMenu itemAtIndex:1] setTarget:self];
+ [[statusMenu itemAtIndex:1] setAction:@selector(goToPlay)];
+
+ [self setPlayStatus:@""];
+
+ [_window makeKeyWindow];
+}
+
+- (void)applicationDidFinishLaunching:(NSNotification *)aNotification{
+
+// self.keyTap = [[[SPMediaKeyTap alloc] initWithDelegate:self] autorelease];
+// [self.keyTap startWatchingMediaKeys];
+
+}
+
+- (NSMenuItem *)playStatusItem{
+ return [statusMenu itemAtIndex:4];
+}
+
+- (NSMenuItem *)playActionItem{
+ return [statusMenu itemAtIndex:0];
+}
+
+- (void)setPlayStatus:(NSString *)statusString{
+ if (statusString && statusString.length > 0) {
+ [[self playStatusItem] setHidden:NO];
+ [[statusMenu itemAtIndex:3] setHidden:NO];
+ [[self playStatusItem] setTitle:statusString];
+ }else{
+ [[self playStatusItem] setHidden:YES];
+ [[statusMenu itemAtIndex:3] setHidden:YES];
+ }
+}
+
+- (void)setPlayActionTitle:(NSString *)actionTitle{
+ [[self playActionItem] setTitle:actionTitle];
+}
+
+- (IBAction)toggelPlayState{
+ if (streamer && [streamer isPlaying]) {
+ [self destroyStreamer];
+ [self setPlayActionTitle:@"Play"];
+ [statusItem setImage:[NSImage imageNamed:@"status-icon-off.png"]];
+ [self setPlayStatus:@""];
+ }else{
+ [self createStreamer];
+ [self setPlayStatus:@"Buffering..."];
+ [streamer start];
+ }
+}
+
+- (IBAction)goToPlay{
+ [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://play.githubapp.com"]];
+}
+
+
+#pragma mark - Play Methods
+
+- (void)createStreamer{
+ if (streamer){
+ return;
+ }
+
+ [self destroyStreamer];
+
+ NSURL *url = [NSURL URLWithString:@"http://play.githubapp.com:8000/listen"];
+ streamer = [[AudioStreamer alloc] initWithURL:url];
+
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackStateChanged:) name:ASStatusChangedNotification object:streamer];
+#ifdef SHOUTCAST_METADATA
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(metadataChanged:) name:ASUpdateMetadataNotification object:streamer];
+#endif
+}
+
+- (void)destroyStreamer{
+ if (streamer){
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:ASStatusChangedNotification object:streamer];
+
+ [streamer stop];
+ [streamer release];
+ streamer = nil;
+ }
+}
+
+
+#pragma mark - Audio player callbacks
+
+- (void)playbackStateChanged:(NSNotification *)aNotification{
+ if ([streamer isWaiting]){
+ [self setPlayActionTitle:@"Play"];
+ [statusItem setImage:[NSImage imageNamed:@"status-icon-off.png"]];
+ }else if ([streamer isPlaying]){
+ [self setPlayActionTitle:@"Stop"];
+ [statusItem setImage:[NSImage imageNamed:@"status-icon-on.png"]];
+ }else if ([streamer isPaused]){
+ [self setPlayActionTitle:@"Play"];
+ [self setPlayStatus:@""];
+ [statusItem setImage:[NSImage imageNamed:@"status-icon-off.png"]];
+ }else if ([streamer isIdle]){
+ [self setPlayActionTitle:@"Play"];
+ [self setPlayStatus:@""];
+ [statusItem setImage:[NSImage imageNamed:@"status-icon-off.png"]];
+ }
+}
+
+#ifdef SHOUTCAST_METADATA
+- (void)metadataChanged:(NSNotification *)aNotification{
+ //NSLog(@"Raw meta data = %@", [[aNotification userInfo] objectForKey:@"metadata"]);
+ NSArray *metaParts = [[[aNotification userInfo] objectForKey:@"metadata"] componentsSeparatedByString:@";"];
+ NSString *item;
+
+ NSMutableDictionary *hash = [[NSMutableDictionary alloc] init];
+ for (item in metaParts) {
+ // split the key/value pair
+ NSArray *pair = [item componentsSeparatedByString:@"='"];
+ // don't bother with bad metadata
+ if ([pair count] == 2)
+ [hash setObject:[pair objectAtIndex:1] forKey:[pair objectAtIndex:0]];
+ }
+
+ // do something with the StreamTitle
+ NSString *streamString = [[hash objectForKey:@"StreamTitle"] stringByReplacingOccurrencesOfString:@"'" withString:@""];
+ [self setPlayStatus:streamString];
+}
+#endif
+
+
+#pragma mark -
+//#pragma mark SPMediaKeyTap Delegate
+//
+//-(void)mediaKeyTap:(SPMediaKeyTap*)keyTap receivedMediaKeyEvent:(NSEvent*)event;
+//{
+// if ([event type] != NSSystemDefined || [event subtype] != SPSystemDefinedEventMediaKeys)
+// return;
+//
+// int keyCode = (([event data1] & 0xFFFF0000) >> 16);
+// int keyFlags = ([event data1] & 0x0000FFFF);
+// int keyState = (((keyFlags & 0xFF00) >> 8)) == 0xA;
+// int keyRepeat = (keyFlags & 0x1);
+//
+// if (keyState != 1 || keyRepeat > 1 || keyCode != NX_KEYTYPE_PLAY) //Only supporting play/pause for now
+// return;
+//
+// [self toggelPlayState];
+//}
+
+@end
8 Play Item/Supporting Files/IgnoredAudioProcesses.plist
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+ <array>
+ <string>iTunes</string>
+ <string>Spotify</string>
+ </array>
+</plist>
38 Play Item/Supporting Files/Play-Info.plist
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIconFile</key>
+ <string>icon.icns</string>
+ <key>CFBundleIdentifier</key>
+ <string>com.github.play-item</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.2.1</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.2.1</string>
+ <key>LSApplicationCategoryType</key>
+ <string>public.app-category.music</string>
+ <key>LSMinimumSystemVersion</key>
+ <string>${MACOSX_DEPLOYMENT_TARGET}</string>
+ <key>LSUIElement</key>
+ <true/>
+ <key>NSHumanReadableCopyright</key>
+ <string>Copyright © 2012 GitHub, Inc. All rights reserved.</string>
+ <key>NSMainNibFile</key>
+ <string>MainMenu</string>
+ <key>NSPrincipalClass</key>
+ <string>NSApplication</string>
+</dict>
+</plist>
7 Play Item/Supporting Files/Play-Prefix.pch
@@ -0,0 +1,7 @@
+//
+// Prefix header for all source files of the 'Play' target in the 'Play' project
+//
+
+#ifdef __OBJC__
+ #import <Cocoa/Cocoa.h>
+#endif
29 Play Item/Supporting Files/en.lproj/Credits.rtf
@@ -0,0 +1,29 @@
+{\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\paperw9840\paperh8400
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
+
+\f0\b\fs24 \cf0 Engineering:
+\b0 \
+ Some people\
+\
+
+\b Human Interface Design:
+\b0 \
+ Some other people\
+\
+
+\b Testing:
+\b0 \
+ Hopefully not nobody\
+\
+
+\b Documentation:
+\b0 \
+ Whoever\
+\
+
+\b With special thanks to:
+\b0 \
+ Mom\
+}
2  Play Item/Supporting Files/en.lproj/InfoPlist.strings
@@ -0,0 +1,2 @@
+/* Localized versions of Info.plist keys */
+
3,285 Play Item/Supporting Files/en.lproj/MainMenu.xib
3,285 additions, 0 deletions not shown
BIN  Play Item/Supporting Files/icon.icns
Binary file not shown
14 Play Item/Supporting Files/main.m
@@ -0,0 +1,14 @@
+//
+// main.m
+// Play
+//
+// Created by Jon Maddox on 2/9/12.
+// Copyright (c) 2012 GitHub, Inc. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+
+int main(int argc, char *argv[])
+{
+ return NSApplicationMain(argc, (const char **)argv);
+}
BIN  Play Item/images/status-icon-inverted.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  Play Item/images/status-icon-off.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  Play Item/images/status-icon-on.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
43 Play iOS/Classes/Controllers/PLAPlayerViewController.h
@@ -0,0 +1,43 @@
+//
+// PLViewController.h
+// Play
+//
+// Created by Jon Maddox on 2/9/12.
+// Copyright (c) 2012 GitHub, Inc. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+#import "AudioStreamer.h"
+#import "PLATrack.h"
+#import "SDWebImageDownloader.h"
+
+@interface PLAPlayerViewController : UIViewController <SDWebImageDownloaderDelegate>{
+ UILabel *songLabel;
+ UILabel *artistLabel;
+ UIImageView *albumArtImageView;
+ UIButton *playButton;
+ UIView *nowPlayingView;
+ UIView *sliderView;
+ UILabel *statusLabel;
+ PLATrack *currentTrack;
+ AudioStreamer *streamer;
+}
+
+@property (retain, nonatomic) IBOutlet UILabel *songLabel;
+@property (retain, nonatomic) IBOutlet UILabel *artistLabel;
+@property (retain, nonatomic) IBOutlet UIImageView *albumArtImageView;
+@property (retain, nonatomic) IBOutlet UIButton *playButton;
+@property (retain, nonatomic) IBOutlet UIView *nowPlayingView;
+@property (retain, nonatomic) IBOutlet UIView *sliderView;
+@property (retain, nonatomic) IBOutlet UILabel *statusLabel;
+@property (retain, nonatomic) PLATrack *currentTrack;
+
+- (void)hideNowPlaying:(BOOL)animated;
+- (void)showNowPlaying:(BOOL)animated;
+- (void)adjustLabels;
+- (void)createStreamer;
+- (void)destroyStreamer;
+- (IBAction)togglePlayState:(id)sender;
+- (void)updateMetaData;
+
+@end
272 Play iOS/Classes/Controllers/PLAPlayerViewController.m
@@ -0,0 +1,272 @@
+//
+// PLViewController.m
+// Play
+//
+// Created by Jon Maddox on 2/9/12.
+// Copyright (c) 2012 GitHub, Inc. All rights reserved.
+//
+
+#import "PLAPlayerViewController.h"
+#import "PLAIOSAppDelegate.h"
+#import "UIImageView+WebCache.h"
+#import "SDWebImageDownloader.h"
+#import <MediaPlayer/MediaPlayer.h>
+
+@implementation PLAPlayerViewController
+@synthesize songLabel, artistLabel, albumArtImageView, playButton, nowPlayingView, sliderView, statusLabel, currentTrack;
+
+- (void)dealloc {
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
+
+ [self destroyStreamer];
+
+ [currentTrack release];
+ [songLabel release];
+ [artistLabel release];
+ [albumArtImageView release];
+ [playButton release];
+ [nowPlayingView release];
+ [sliderView release];
+ [statusLabel release];
+ [super dealloc];
+}
+
+
+#pragma mark - View lifecycle
+
+- (void)viewDidLoad{
+ [super viewDidLoad];
+
+ [self hideNowPlaying:NO];
+}
+
+- (void)viewDidUnload{
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
+ [self setSongLabel:nil];
+ [self setArtistLabel:nil];
+ [self setAlbumArtImageView:nil];
+ [self setPlayButton:nil];
+ [self setNowPlayingView:nil];
+ [self setSliderView:nil];
+ [self setStatusLabel:nil];
+ [super viewDidUnload];
+}
+
+- (void)viewDidAppear:(BOOL)animated{
+ [super viewDidAppear:animated];
+
+ UIApplication *application = [UIApplication sharedApplication];
+ [application beginReceivingRemoteControlEvents];
+ [self becomeFirstResponder]; // this enables listening for events
+ NSNotification *notification = [NSNotification notificationWithName:ASStatusChangedNotification object:self];
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+}
+
+
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
+ return interfaceOrientation == UIInterfaceOrientationPortrait;
+ // Return YES for supported orientations
+ if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
+ return (interfaceOrientation == UIInterfaceOrientationPortrait);
+ } else {
+ return YES;
+ }
+}
+
+#pragma mark - View State methods
+
+- (BOOL)canBecomeFirstResponder {
+ return YES;
+}
+
+- (void)hideNowPlaying:(BOOL)animated{
+ float duration = 0.0;
+ if (animated) {
+ duration = 0.3;
+ }
+
+ [UIView animateWithDuration:duration delay:0.0 options:UIViewAnimationCurveEaseOut animations:^{
+ [sliderView setFrame:CGRectMake(sliderView.frame.origin.x, 170.0, sliderView.frame.size.width, sliderView.frame.size.height)];
+ } completion:^(BOOL finished) {
+ }];
+
+}
+
+- (void)showNowPlaying:(BOOL)animated{
+ float duration = 0.0;
+ if (animated) {
+ duration = 0.3;
+ }
+
+ [UIView animateWithDuration:duration delay:0.0 options:UIViewAnimationCurveEaseIn animations:^{
+ [sliderView setFrame:CGRectMake(sliderView.frame.origin.x, 290.0, sliderView.frame.size.width, sliderView.frame.size.height)];
+ } completion:^(BOOL finished) {
+ }];
+}
+
+- (void)adjustLabels{
+ CGRect songLabelFrame = songLabel.frame;
+ CGRect artistLabelFrame = artistLabel.frame;
+
+ songLabelFrame.origin.x = 10.0;
+ songLabelFrame.origin.y = 10.0;
+ songLabelFrame.size.width = 192.0;
+
+ CGSize maximumSongLabelSize = CGSizeMake(songLabelFrame.size.width,9999);
+ CGSize expectedSongLabelSize = [[songLabel text] sizeWithFont:[songLabel font] constrainedToSize:maximumSongLabelSize lineBreakMode:[songLabel lineBreakMode]];
+
+ songLabelFrame.size = expectedSongLabelSize;
+
+
+ artistLabelFrame.origin.x = songLabelFrame.origin.x;
+ artistLabelFrame.origin.y = songLabelFrame.origin.y + songLabelFrame.size.height + 2.0;
+ artistLabelFrame.size.width = 192.0;
+
+ CGSize maximumArtistLabelSize = CGSizeMake(artistLabelFrame.size.width,9999);
+ CGSize expectedArtistLabelSize = [[artistLabel text] sizeWithFont:[artistLabel font] constrainedToSize:maximumArtistLabelSize lineBreakMode:[artistLabel lineBreakMode]];
+
+ artistLabelFrame.size = expectedArtistLabelSize;
+
+
+ self.songLabel.frame = songLabelFrame;
+ self.artistLabel.frame = artistLabelFrame;
+}
+
+#pragma mark - Play Methods
+
+- (void)createStreamer{
+ if (streamer){
+ return;
+ }
+
+ [self destroyStreamer];
+
+ NSURL *url = [NSURL URLWithString:@"http://play.githubapp.com:8000/listen"];
+ streamer = [[AudioStreamer alloc] initWithURL:url];
+
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackStateChanged:) name:ASStatusChangedNotification object:streamer];
+#ifdef SHOUTCAST_METADATA
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(metadataChanged:) name:ASUpdateMetadataNotification object:streamer];
+#endif
+}
+
+- (void)destroyStreamer{
+ if (streamer){
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:ASStatusChangedNotification object:streamer];
+
+ self.currentTrack = nil;
+
+ [streamer stop];
+ [streamer release];
+ streamer = nil;
+ }
+}
+
+
+- (IBAction)togglePlayState:(id)sender{
+ if ([streamer isPlaying]) {
+ [self destroyStreamer];
+ [playButton setImage:[UIImage imageNamed:@"button-play.png"] forState:UIControlStateNormal];
+ [self hideNowPlaying:YES];
+ [statusLabel setHidden:YES];
+ }else{
+ [self createStreamer];
+ [statusLabel setHidden:NO];
+ [streamer start];
+ }
+}
+
+#pragma mark - Audio player callbacks
+
+- (void)playbackStateChanged:(NSNotification *)aNotification{
+ if ([streamer isWaiting]){
+ }else if ([streamer isPlaying]){
+ [statusLabel setHidden:YES];
+ [playButton setImage:[UIImage imageNamed:@"button-pause.png"] forState:UIControlStateNormal];
+ }else if ([streamer isPaused]){
+ [statusLabel setHidden:YES];
+ [playButton setImage:[UIImage imageNamed:@"button-play.png"] forState:UIControlStateNormal];
+ }else if ([streamer isIdle]){
+ [statusLabel setHidden:YES];
+ [playButton setImage:[UIImage imageNamed:@"button-play.png"] forState:UIControlStateNormal];
+ }
+}
+
+#ifdef SHOUTCAST_METADATA
+- (void)metadataChanged:(NSNotification *)aNotification{
+ [PLATrack currentTrackWithBlock:^(PLATrack *track) {
+ self.currentTrack = track;
+
+ dispatch_async(dispatch_get_main_queue(), ^(void) {
+ [albumArtImageView setImage:[UIImage imageNamed:@"default_album.png"]];
+ [self updateMetaData];
+ [SDWebImageDownloader downloaderWithURL:[NSURL URLWithString:[currentTrack albumArtUrl]] delegate:self];
+ });
+
+ }];
+}
+#endif
+
+- (void)imageDownloader:(SDWebImageDownloader *)imageDownloader didFinishWithImage:(UIImage *)image{
+ [albumArtImageView setImage:image];
+ [self updateMetaData];
+}
+
+- (void)updateMetaData{
+ if (currentTrack) {
+ self.songLabel.text = [currentTrack name];
+ self.artistLabel.text = [currentTrack artist];
+
+ [self adjustLabels];
+ [self showNowPlaying:YES];
+
+ MPMediaItemArtwork *mediaItemArtwork = [[MPMediaItemArtwork alloc] initWithImage:albumArtImageView.image];
+
+ NSDictionary *nowPlayingMetaDict = [NSDictionary dictionaryWithObjectsAndKeys:[currentTrack name], MPMediaItemPropertyTitle, [currentTrack album], MPMediaItemPropertyAlbumTitle, [currentTrack artist], MPMediaItemPropertyArtist, mediaItemArtwork, MPMediaItemPropertyArtwork, nil];
+
+ [[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:nowPlayingMetaDict];
+
+ [mediaItemArtwork release];
+ }else{
+ self.songLabel.text = @"";
+ self.artistLabel.text = @"";
+ [self hideNowPlaying:NO];
+
+ [[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:nil];
+ }
+}
+
+
+
+#pragma mark Remote Control Events
+- (void)remoteControlReceivedWithEvent:(UIEvent *)event {
+ switch (event.subtype) {
+ case UIEventSubtypeRemoteControlTogglePlayPause:
+ if (streamer && [streamer isPlaying]) {
+ [streamer pause];
+ }else{
+ [streamer start];
+ [self updateMetaData];
+ }
+ break;
+ case UIEventSubtypeRemoteControlPlay:
+ [self createStreamer];
+ break;
+ case UIEventSubtypeRemoteControlPause:
+ [self destroyStreamer];
+ break;
+ case UIEventSubtypeRemoteControlStop:
+ [self destroyStreamer];
+ break;
+ default:
+ break;
+ }
+
+ [self updateMetaData];
+}
+
+- (void)didReceiveMemoryWarning{
+ [super didReceiveMemoryWarning];
+}
+
+@end
108 Play iOS/Classes/Controllers/PLAPlayerViewController_iPad.xib
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="8.00">
+ <data>
+ <int key="IBDocument.SystemTarget">1280</int>
+ <string key="IBDocument.SystemVersion">11D50b</string>
+ <string key="IBDocument.InterfaceBuilderVersion">2182</string>
+ <string key="IBDocument.AppKitVersion">1138.32</string>
+ <string key="IBDocument.HIToolboxVersion">568.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="NS.object.0">1181</string>
+ </object>
+ <array key="IBDocument.IntegratedClassDependencies">
+ <string>IBProxyObject</string>
+ <string>IBUIView</string>
+ </array>
+ <array key="IBDocument.PluginDependencies">
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </array>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <string key="NS.key.0">PluginDependencyRecalculationVersion</string>
+ <integer value="1" key="NS.object.0"/>
+ </object>
+ <array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
+ <object class="IBProxyObject" id="841351856">
+ <string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
+ <string key="targetRuntimeIdentifier">IBIPadFramework</string>
+ </object>
+ <object class="IBProxyObject" id="606714003">
+ <string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
+ <string key="targetRuntimeIdentifier">IBIPadFramework</string>
+ </object>
+ <object class="IBUIView" id="766721923">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">274</int>
+ <string key="NSFrame">{{0, 20}, {768, 1004}}</string>
+ <object class="NSColor" key="IBUIBackgroundColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MQA</bytes>
+ <object class="NSColorSpace" key="NSCustomColorSpace">
+ <int key="NSID">2</int>
+ </object>
+ </object>
+ <object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics">
+ <int key="IBUIStatusBarStyle">2</int>
+ </object>
+ <string key="targetRuntimeIdentifier">IBIPadFramework</string>
+ </object>
+ </array>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <array class="NSMutableArray" key="connectionRecords">
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">view</string>
+ <reference key="source" ref="841351856"/>
+ <reference key="destination" ref="766721923"/>
+ </object>
+ <int key="connectionID">3</int>
+ </object>
+ </array>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <array key="orderedObjects">
+ <object class="IBObjectRecord">
+ <int key="objectID">0</int>
+ <array key="object" id="0"/>
+ <reference key="children" ref="1000"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="841351856"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">File's Owner</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="606714003"/>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">2</int>
+ <reference key="object" ref="766721923"/>
+ <array class="NSMutableArray" key="children"/>
+ <reference key="parent" ref="0"/>
+ </object>
+ </array>
+ </object>
+ <dictionary class="NSMutableDictionary" key="flattenedProperties">
+ <string key="-1.CustomClassName">PLAPlayerViewController</string>
+ <string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="-2.CustomClassName">UIResponder</string>
+ <string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="2.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
+ <nil key="activeLocalization"/>
+ <dictionary class="NSMutableDictionary" key="localizations"/>
+ <nil key="sourceID"/>
+ <int key="maxID">24</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes"/>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.TargetRuntimeIdentifier">IBIPadFramework</string>
+ <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ <string key="IBCocoaTouchPluginVersion">1181</string>
+ </data>
+</archive>
474 Play iOS/Classes/Controllers/PLAPlayerViewController_iPhone.xib
@@ -0,0 +1,474 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="8.00">
+ <data>
+ <int key="IBDocument.SystemTarget">1280</int>
+ <string key="IBDocument.SystemVersion">11D50b</string>
+ <string key="IBDocument.InterfaceBuilderVersion">2182</string>
+ <string key="IBDocument.AppKitVersion">1138.32</string>
+ <string key="IBDocument.HIToolboxVersion">568.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="NS.object.0">1181</string>
+ </object>
+ <array key="IBDocument.IntegratedClassDependencies">
+ <string>IBUIButton</string>
+ <string>IBUIImageView</string>
+ <string>IBUIView</string>
+ <string>IBUILabel</string>
+ <string>IBProxyObject</string>
+ </array>
+ <array key="IBDocument.PluginDependencies">
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </array>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <string key="NS.key.0">PluginDependencyRecalculationVersion</string>
+ <integer value="1" key="NS.object.0"/>
+ </object>
+ <array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
+ <object class="IBProxyObject" id="372490531">
+ <string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ <object class="IBProxyObject" id="843779117">
+ <string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ <object class="IBUIView" id="774585933">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">274</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="IBUIView" id="920122340">
+ <reference key="NSNextResponder" ref="774585933"/>
+ <int key="NSvFlags">274</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="IBUIImageView" id="708035922">
+ <reference key="NSNextResponder" ref="920122340"/>
+ <int key="NSvFlags">292</int>
+ <string key="NSFrameSize">{320, 4}</string>
+ <reference key="NSSuperview" ref="920122340"/>
+ <reference key="NSNextKeyView" ref="376136679"/>
+ <string key="NSReuseIdentifierKey">_NS:567</string>
+ <bool key="IBUIUserInteractionEnabled">NO</bool>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ <object class="NSCustomResource" key="IBUIImage">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">shadow.png</string>
+ </object>
+ </object>
+ <object class="IBUILabel" id="376136679">
+ <reference key="NSNextResponder" ref="920122340"/>
+ <int key="NSvFlags">292</int>
+ <string key="NSFrame">{{10, 10}, {192, 20}}</string>
+ <reference key="NSSuperview" ref="920122340"/>
+ <reference key="NSNextKeyView" ref="280543994"/>
+ <string key="NSReuseIdentifierKey">_NS:328</string>
+ <bool key="IBUIOpaque">NO</bool>
+ <bool key="IBUIClipsSubviews">YES</bool>
+ <int key="IBUIContentMode">7</int>
+ <bool key="IBUIUserInteractionEnabled">NO</bool>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ <string key="IBUIText">N.Y. State of Mind</string>
+ <object class="NSColor" key="IBUITextColor">
+ <int key="NSColorSpace">1</int>
+ <bytes key="NSRGB">MCAwIDAAA</bytes>
+ </object>
+ <nil key="IBUIHighlightedColor"/>
+ <int key="IBUIBaselineAdjustment">1</int>
+ <float key="IBUIMinimumFontSize">10</float>
+ <int key="IBUINumberOfLines">11</int>
+ <object class="IBUIFontDescription" key="IBUIFontDescription">
+ <int key="type">1</int>
+ <double key="pointSize">17</double>
+ </object>
+ <object class="NSFont" key="IBUIFont">
+ <string key="NSName">Helvetica</string>
+ <double key="NSSize">17</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <bool key="IBUIAdjustsFontSizeToFit">NO</bool>
+ </object>
+ <object class="IBUILabel" id="280543994">
+ <reference key="NSNextResponder" ref="920122340"/>
+ <int key="NSvFlags">292</int>
+ <string key="NSFrame">{{10, 38}, {192, 20}}</string>
+ <reference key="NSSuperview" ref="920122340"/>
+ <reference key="NSNextKeyView" ref="918875352"/>
+ <string key="NSReuseIdentifierKey">_NS:328</string>
+ <bool key="IBUIOpaque">NO</bool>
+ <bool key="IBUIClipsSubviews">YES</bool>
+ <int key="IBUIContentMode">7</int>
+ <bool key="IBUIUserInteractionEnabled">NO</bool>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ <string key="IBUIText">Label</string>
+ <object class="NSColor" key="IBUITextColor">
+ <int key="NSColorSpace">2</int>
+ <bytes key="NSRGB">MC45NDExNzY1MzM3IDAuNDM5MjE1NzE5NyAwLjk2ODYyNzUxMjUAA</bytes>
+ </object>
+ <nil key="IBUIHighlightedColor"/>
+ <int key="IBUIBaselineAdjustment">1</int>
+ <float key="IBUIMinimumFontSize">10</float>
+ <int key="IBUINumberOfLines">9</int>
+ <object class="IBUIFontDescription" key="IBUIFontDescription">
+ <int key="type">1</int>
+ <double key="pointSize">13</double>
+ </object>
+ <object class="NSFont" key="IBUIFont">
+ <string key="NSName">Helvetica</string>
+ <double key="NSSize">13</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <bool key="IBUIAdjustsFontSizeToFit">NO</bool>
+ </object>
+ <object class="IBUIImageView" id="918875352">
+ <reference key="NSNextResponder" ref="920122340"/>
+ <int key="NSvFlags">289</int>
+ <string key="NSFrame">{{210, 10}, {100, 100}}</string>
+ <reference key="NSSuperview" ref="920122340"/>
+ <string key="NSReuseIdentifierKey">_NS:567</string>
+ <bool key="IBUIUserInteractionEnabled">NO</bool>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ </array>
+ <string key="NSFrame">{{0, 170}, {320, 120}}</string>
+ <reference key="NSSuperview" ref="774585933"/>
+ <reference key="NSNextKeyView" ref="708035922"/>
+ <string key="NSReuseIdentifierKey">_NS:196</string>
+ <object class="NSColor" key="IBUIBackgroundColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MQA</bytes>
+ <object class="NSColorSpace" key="NSCustomColorSpace">
+ <int key="NSID">2</int>
+ </object>
+ </object>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ <object class="IBUIView" id="366045586">
+ <reference key="NSNextResponder" ref="774585933"/>
+ <int key="NSvFlags">290</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="IBUIImageView" id="709362501">
+ <reference key="NSNextResponder" ref="366045586"/>
+ <int key="NSvFlags">290</int>
+ <string key="NSFrame">{{0, -4}, {320, 4}}</string>
+ <reference key="NSSuperview" ref="366045586"/>
+ <reference key="NSNextKeyView" ref="920122340"/>
+ <string key="NSReuseIdentifierKey">_NS:567</string>
+ <bool key="IBUIUserInteractionEnabled">NO</bool>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ <object class="NSCustomResource" key="IBUIImage">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">bottom-shadow.png</string>
+ </object>
+ </object>
+ </array>
+ <string key="NSFrame">{{0, 145}, {320, 170}}</string>
+ <reference key="NSSuperview" ref="774585933"/>
+ <reference key="NSNextKeyView" ref="709362501"/>
+ <string key="NSReuseIdentifierKey">_NS:196</string>
+ <object class="NSColor" key="IBUIBackgroundColor">
+ <int key="NSColorSpace">2</int>
+ <bytes key="NSRGB">MC44ODYyNzQ1NzYyIDAuODgyMzUzMDA3OCAwLjg3MDU4ODMwMjYAA</bytes>
+ </object>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ <object class="IBUIView" id="361563700">
+ <reference key="NSNextResponder" ref="774585933"/>
+ <int key="NSvFlags">292</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="IBUIButton" id="65390049">
+ <reference key="NSNextResponder" ref="361563700"/>
+ <int key="NSvFlags">292</int>
+ <string key="NSFrame">{{20, 39}, {50, 50}}</string>
+ <reference key="NSSuperview" ref="361563700"/>
+ <reference key="NSNextKeyView" ref="366045586"/>
+ <string key="NSReuseIdentifierKey">_NS:225</string>
+ <bool key="IBUIOpaque">NO</bool>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ <int key="IBUIContentHorizontalAlignment">0</int>
+ <int key="IBUIContentVerticalAlignment">0</int>
+ <object class="NSColor" key="IBUIHighlightedTitleColor" id="6513102">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MQA</bytes>
+ </object>
+ <object class="NSColor" key="IBUINormalTitleColor">
+ <int key="NSColorSpace">1</int>
+ <bytes key="NSRGB">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>
+ </object>
+ <object class="NSColor" key="IBUINormalTitleShadowColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC41AA</bytes>
+ </object>
+ <object class="NSCustomResource" key="IBUINormalImage">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">button-play.png</string>
+ </object>
+ <object class="IBUIFontDescription" key="IBUIFontDescription">
+ <int key="type">2</int>
+ <double key="pointSize">15</double>
+ </object>
+ <object class="NSFont" key="IBUIFont">
+ <string key="NSName">Helvetica-Bold</string>
+ <double key="NSSize">15</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ </object>
+ <object class="IBUILabel" id="410097108">
+ <reference key="NSNextResponder" ref="361563700"/>
+ <int key="NSvFlags">-2147483356</int>
+ <string key="NSFrame">{{83, 53}, {182, 21}}</string>
+ <reference key="NSSuperview" ref="361563700"/>
+ <string key="NSReuseIdentifierKey">_NS:328</string>
+ <bool key="IBUIOpaque">NO</bool>
+ <bool key="IBUIClipsSubviews">YES</bool>
+ <int key="IBUIContentMode">7</int>
+ <bool key="IBUIUserInteractionEnabled">NO</bool>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ <string key="IBUIText">Buffering...</string>
+ <object class="NSColor" key="IBUITextColor">
+ <int key="NSColorSpace">1</int>
+ <bytes key="NSRGB">MC4xOTI0NDY1MDE0IDAuMTkyNDQ2NTAxNCAwLjE5MjQ0NjUwMTQAA</bytes>
+ </object>
+ <nil key="IBUIHighlightedColor"/>
+ <reference key="IBUIShadowColor" ref="6513102"/>
+ <string key="IBUIShadowOffset">{0, 1}</string>
+ <int key="IBUIBaselineAdjustment">1</int>
+ <float key="IBUIMinimumFontSize">10</float>
+ <object class="IBUIFontDescription" key="IBUIFontDescription">
+ <int key="type">1</int>
+ <double key="pointSize">14</double>
+ </object>
+ <object class="NSFont" key="IBUIFont">
+ <string key="NSName">Helvetica</string>
+ <double key="NSSize">14</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ </object>
+ </array>
+ <string key="NSFrameSize">{320, 170}</string>
+ <reference key="NSSuperview" ref="774585933"/>
+ <reference key="NSNextKeyView" ref="65390049"/>
+ <string key="NSReuseIdentifierKey">_NS:196</string>
+ <object class="NSColor" key="IBUIBackgroundColor">
+ <int key="NSColorSpace">2</int>
+ <bytes key="NSRGB">MC44ODYyNzQ1NzYyIDAuODgyMzUzMDA3OCAwLjg3MDU4ODMwMjYAA</bytes>
+ </object>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ </array>
+ <string key="NSFrame">{{0, 20}, {320, 460}}</string>
+ <reference key="NSNextKeyView" ref="361563700"/>
+ <object class="NSColor" key="IBUIBackgroundColor">
+ <int key="NSColorSpace">2</int>
+ <bytes key="NSRGB">MC44ODYyNzQ1NzYyIDAuODgyMzUzMDA3OCAwLjg3MDU4ODMwMjYAA</bytes>
+ </object>
+ <bool key="IBUIClearsContextBeforeDrawing">NO</bool>
+ <object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ </array>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <array class="NSMutableArray" key="connectionRecords">
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">view</string>
+ <reference key="source" ref="372490531"/>
+ <reference key="destination" ref="774585933"/>
+ </object>
+ <int key="connectionID">7</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">artistLabel</string>
+ <reference key="source" ref="372490531"/>
+ <reference key="destination" ref="280543994"/>
+ </object>
+ <int key="connectionID">14</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">albumArtImageView</string>
+ <reference key="source" ref="372490531"/>
+ <reference key="destination" ref="918875352"/>
+ </object>
+ <int key="connectionID">20</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">nowPlayingView</string>
+ <reference key="source" ref="372490531"/>
+ <reference key="destination" ref="920122340"/>
+ </object>
+ <int key="connectionID">22</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">songLabel</string>
+ <reference key="source" ref="372490531"/>
+ <reference key="destination" ref="376136679"/>
+ </object>
+ <int key="connectionID">13</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">sliderView</string>
+ <reference key="source" ref="372490531"/>
+ <reference key="destination" ref="366045586"/>
+ </object>
+ <int key="connectionID">24</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">playButton</string>
+ <reference key="source" ref="372490531"/>
+ <reference key="destination" ref="65390049"/>
+ </object>
+ <int key="connectionID">16</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">statusLabel</string>
+ <reference key="source" ref="372490531"/>
+ <reference key="destination" ref="410097108"/>
+ </object>
+ <int key="connectionID">29</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchEventConnection" key=