provide a shortcut for the currently playing podcast, if any

This commit is contained in:
Sami Samhuri 2012-01-01 18:43:05 -08:00
parent c2122cf5df
commit dff22f33ea
9 changed files with 126 additions and 26 deletions

View file

@ -47,6 +47,7 @@
7B730305149D6714003547E5 /* MWFeedParser_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B7302FE149D6714003547E5 /* MWFeedParser_Private.h */; }; 7B730305149D6714003547E5 /* MWFeedParser_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B7302FE149D6714003547E5 /* MWFeedParser_Private.h */; };
7B730306149D6714003547E5 /* MWFeedParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B7302FF149D6714003547E5 /* MWFeedParser.h */; }; 7B730306149D6714003547E5 /* MWFeedParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B7302FF149D6714003547E5 /* MWFeedParser.h */; };
7B730307149D6714003547E5 /* MWFeedParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B730300149D6714003547E5 /* MWFeedParser.m */; }; 7B730307149D6714003547E5 /* MWFeedParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B730300149D6714003547E5 /* MWFeedParser.m */; };
7B81722014B137D6003EC770 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B81721F14B137D6003EC770 /* MediaPlayer.framework */; };
7B868946149D593C00F3A2C6 /* Episode.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B868945149D593C00F3A2C6 /* Episode.m */; }; 7B868946149D593C00F3A2C6 /* Episode.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B868945149D593C00F3A2C6 /* Episode.m */; };
7B86894B149D5C1000F3A2C6 /* ShowViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B868949149D5C0F00F3A2C6 /* ShowViewController.m */; }; 7B86894B149D5C1000F3A2C6 /* ShowViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B868949149D5C0F00F3A2C6 /* ShowViewController.m */; };
7B868951149D5C6F00F3A2C6 /* ShowViewController_iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7B86894D149D5C6F00F3A2C6 /* ShowViewController_iPad.xib */; }; 7B868951149D5C6F00F3A2C6 /* ShowViewController_iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7B86894D149D5C6F00F3A2C6 /* ShowViewController_iPad.xib */; };
@ -108,6 +109,7 @@
7B7302FE149D6714003547E5 /* MWFeedParser_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWFeedParser_Private.h; sourceTree = "<group>"; }; 7B7302FE149D6714003547E5 /* MWFeedParser_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWFeedParser_Private.h; sourceTree = "<group>"; };
7B7302FF149D6714003547E5 /* MWFeedParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWFeedParser.h; sourceTree = "<group>"; }; 7B7302FF149D6714003547E5 /* MWFeedParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWFeedParser.h; sourceTree = "<group>"; };
7B730300149D6714003547E5 /* MWFeedParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MWFeedParser.m; sourceTree = "<group>"; }; 7B730300149D6714003547E5 /* MWFeedParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MWFeedParser.m; sourceTree = "<group>"; };
7B81721F14B137D6003EC770 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; };
7B868944149D593C00F3A2C6 /* Episode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Episode.h; sourceTree = "<group>"; }; 7B868944149D593C00F3A2C6 /* Episode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Episode.h; sourceTree = "<group>"; };
7B868945149D593C00F3A2C6 /* Episode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Episode.m; sourceTree = "<group>"; }; 7B868945149D593C00F3A2C6 /* Episode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Episode.m; sourceTree = "<group>"; };
7B868948149D5C0F00F3A2C6 /* ShowViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShowViewController.h; sourceTree = "<group>"; }; 7B868948149D5C0F00F3A2C6 /* ShowViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShowViewController.h; sourceTree = "<group>"; };
@ -128,6 +130,7 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
7B81722014B137D6003EC770 /* MediaPlayer.framework in Frameworks */,
7B4CADE9149FE797007E7941 /* Security.framework in Frameworks */, 7B4CADE9149FE797007E7941 /* Security.framework in Frameworks */,
7B1A6ECF149D140600FC5105 /* UIKit.framework in Frameworks */, 7B1A6ECF149D140600FC5105 /* UIKit.framework in Frameworks */,
7B1A6ED1149D140600FC5105 /* Foundation.framework in Frameworks */, 7B1A6ED1149D140600FC5105 /* Foundation.framework in Frameworks */,
@ -160,6 +163,7 @@
7B1A6ECD149D140600FC5105 /* Frameworks */ = { 7B1A6ECD149D140600FC5105 /* Frameworks */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
7B81721F14B137D6003EC770 /* MediaPlayer.framework */,
7B4CADE8149FE797007E7941 /* Security.framework */, 7B4CADE8149FE797007E7941 /* Security.framework */,
7B1A6ECE149D140600FC5105 /* UIKit.framework */, 7B1A6ECE149D140600FC5105 /* UIKit.framework */,
7B1A6ED0149D140600FC5105 /* Foundation.framework */, 7B1A6ED0149D140600FC5105 /* Foundation.framework */,

View file

@ -17,5 +17,6 @@
- (id) initWithBaseURL: (NSString *)baseURL; - (id) initWithBaseURL: (NSString *)baseURL;
- (void) addShow: (Show *)show; - (void) addShow: (Show *)show;
- (Show *) showWithName: (NSString *)name;
@end @end

View file

@ -30,4 +30,12 @@
[self.shows addObject: show]; [self.shows addObject: show];
} }
- (Show *) showWithName: (NSString *)name
{
for (Show *show in self.shows) {
if ([show.name isEqualToString: name]) return show;
}
return nil;
}
@end @end

View file

@ -24,12 +24,12 @@
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
FiveByFive *fiveByFive = [[FiveByFive alloc] initWithBaseURL: @"http:/feeds.feedburner.com/"]; FiveByFive *fiveByFive = [[FiveByFive alloc] initWithBaseURL: @"http:/feeds.feedburner.com/"];
[fiveByFive addShow: [Show showWithName: @"Back to Work" path: @"back2work"]]; [fiveByFive addShow: [Show showWithName: @"Back to Work" feedPath: @"back2work" webPath: @"b2w"]];
[fiveByFive addShow: [Show showWithName: @"Build and Analyze" path: @"buildanalyze"]]; [fiveByFive addShow: [Show showWithName: @"Build and Analyze" feedPath: @"buildanalyze" webPath: @"buildanalyze"]];
[fiveByFive addShow: [Show showWithName: @"The Critical Path" path: @"criticalpath"]]; [fiveByFive addShow: [Show showWithName: @"The Critical Path" feedPath: @"criticalpath" webPath: @"criticalpath"]];
[fiveByFive addShow: [Show showWithName: @"Geek Friday" path: @"GeekFriday"]]; [fiveByFive addShow: [Show showWithName: @"Geek Friday" feedPath: @"GeekFriday" webPath: @"geekfriday"]];
[fiveByFive addShow: [Show showWithName: @"Hypercritical" path: @"hypercritical"]]; [fiveByFive addShow: [Show showWithName: @"Hypercritical" feedPath: @"hypercritical" webPath: @"hypercritical"]];
[fiveByFive addShow: [Show showWithName: @"The Talk Show" path: @"thetalkshow"]]; [fiveByFive addShow: [Show showWithName: @"The Talk Show" feedPath: @"thetalkshow" webPath: @"talkshow"]];
// Override point for customization after application launch. // Override point for customization after application launch.
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
@ -90,6 +90,14 @@
- (void)applicationDidBecomeActive:(UIApplication *)application - (void)applicationDidBecomeActive:(UIApplication *)application
{ {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
SSMasterViewController *masterViewController;
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
masterViewController = [[self.navigationController viewControllers] objectAtIndex: 0];
}
else {
masterViewController = [[[[self.splitViewController viewControllers] objectAtIndex: 0] viewControllers] objectAtIndex: 0];
}
[masterViewController checkNowPlaying];
} }
- (void)applicationWillTerminate:(UIApplication *)application - (void)applicationWillTerminate:(UIApplication *)application

View file

@ -15,5 +15,10 @@
@property (nonatomic, retain) FiveByFive *fiveByFive; @property (nonatomic, retain) FiveByFive *fiveByFive;
@property (nonatomic, retain) ShowViewController *showViewController; @property (nonatomic, retain) ShowViewController *showViewController;
@property (nonatomic, retain) Show *currentShow;
@property (nonatomic, retain) NSString *currentEpisodeNumber;
@property (nonatomic, retain) NSString *currentEpisodeName;
- (void) checkNowPlaying;
@end @end

View file

@ -6,13 +6,18 @@
// Copyright (c) 2011 Guru Logic. All rights reserved. // Copyright (c) 2011 Guru Logic. All rights reserved.
// //
#import <MediaPlayer/MediaPlayer.h>
#import "SSMasterViewController.h" #import "SSMasterViewController.h"
#import "Show.h" #import "Show.h"
#import "NSString+marshmallows.h"
@implementation SSMasterViewController @implementation SSMasterViewController
@synthesize showViewController = _showViewController; @synthesize showViewController = _showViewController;
@synthesize fiveByFive = _fiveByFive; @synthesize fiveByFive = _fiveByFive;
@synthesize currentShow = _currentShow;
@synthesize currentEpisodeNumber = _currentEpisodeNumber;
@synthesize currentEpisodeName = _currentEpisodeName;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{ {
@ -35,6 +40,8 @@
cell.accessoryView = nil; cell.accessoryView = nil;
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
} }
[self checkNowPlaying];
} }
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
@ -46,6 +53,30 @@
} }
} }
- (void) checkNowPlaying
{
// Determine of the current playing track is a known show
MPMediaItem *song = [[MPMusicPlayerController iPodMusicPlayer] nowPlayingItem];
if (song) {
NSString *title = [song valueForProperty: MPMediaItemPropertyTitle];
self.currentEpisodeNumber = [title firstMatch: @"\\d+"];
self.currentEpisodeName = [title substringFromIndex: [title rangeOfString: @": "].location + 2];
NSString *showName = [song valueForProperty: MPMediaItemPropertyAlbumTitle];
self.currentShow = [self.fiveByFive showWithName: showName];
if (self.currentShow) {
NSLog(@"show: %@, episode: %@, name: %@", showName, self.currentEpisodeNumber, self.currentEpisodeName);
NSLog(@"show url: %@", [self.currentShow webURLForEpisodeNumber: self.currentEpisodeNumber]);
}
else {
NSLog(@"no show named %@", showName);
}
}
else {
NSLog(@"no song is currently playing");
}
[self.tableView reloadData];
}
- (void) setFiveByFive: (FiveByFive *)fiveByFive - (void) setFiveByFive: (FiveByFive *)fiveByFive
{ {
_fiveByFive = fiveByFive; _fiveByFive = fiveByFive;
@ -56,12 +87,25 @@
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{ {
return 1; return self.currentShow ? 2 : 1;
} }
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{ {
return self.fiveByFive.shows.count; if (self.currentShow && section == 0) {
return 1;
}
else {
return self.fiveByFive.shows.count;
}
}
- (NSString *) tableView: (UITableView *)tableView titleForHeaderInSection: (NSInteger)section
{
if (self.currentShow && section == 0) {
return @"Now Playing";
}
return @"Shows";
} }
// Customize the appearance of table view cells. // Customize the appearance of table view cells.
@ -71,23 +115,44 @@
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) { if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
} }
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
Show *show = [self.fiveByFive.shows objectAtIndex: indexPath.row]; if (self.currentShow && indexPath.section == 0) {
show.delegate = self; self.currentShow.delegate = self;
cell.textLabel.text = show.name; cell.textLabel.text = self.currentEpisodeName;
cell.detailTextLabel.text = [NSString stringWithFormat: @"%@ %@", self.currentShow.name, self.currentEpisodeNumber];
}
else {
Show *show = [self.fiveByFive.shows objectAtIndex: indexPath.row];
show.delegate = self;
cell.textLabel.text = show.name;
if (show.episodes.count > 0) {
cell.detailTextLabel.text = [NSString stringWithFormat: @"%d episodes", show.episodes.count];
}
else {
cell.detailTextLabel.text = nil;
}
}
return cell; return cell;
} }
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{ {
[[self.fiveByFive.shows objectAtIndex: indexPath.row] getEpisodes]; if (self.currentShow && indexPath.section == 0) {
UIActivityIndicatorView *indicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleWhite]; NSURL *url = [NSURL URLWithString: [self.currentShow webURLForEpisodeNumber: self.currentEpisodeNumber]];
[indicatorView startAnimating]; Episode *episode = [Episode episodeWithShow: self.currentShow name: self.currentEpisodeName number: self.currentEpisodeNumber url: url];
[tableView cellForRowAtIndexPath: indexPath].accessoryView = indicatorView; self.showViewController.detailViewController.episode = episode;
[self.navigationController pushViewController: self.showViewController.detailViewController animated: YES];
}
else {
[[self.fiveByFive.shows objectAtIndex: indexPath.row] getEpisodes];
UIActivityIndicatorView *indicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleWhite];
[indicatorView startAnimating];
[tableView cellForRowAtIndexPath: indexPath].accessoryView = indicatorView;
}
} }
- (void) gotEpisodesForShow: (Show *)show - (void) gotEpisodesForShow: (Show *)show

View file

@ -22,12 +22,14 @@
@property (nonatomic, assign) id<ShowDelegate> delegate; @property (nonatomic, assign) id<ShowDelegate> delegate;
@property (nonatomic, retain) FiveByFive *fiveByFive; @property (nonatomic, retain) FiveByFive *fiveByFive;
@property (nonatomic, retain) NSString *name; @property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSString *path; @property (nonatomic, retain) NSString *feedPath;
@property (nonatomic, retain) NSString *webPath;
@property (nonatomic, retain) NSMutableArray *episodes; @property (nonatomic, retain) NSMutableArray *episodes;
+ (id) showWithName: (NSString *)name path: (NSString *)path; + (id) showWithName: (NSString *)name feedPath: (NSString *)feedPath webPath: (NSString *)webPath;
- (id) initWithName: (NSString *)name path: (NSString *)path; - (id) initWithName: (NSString *)name feedPath: (NSString *)feedPath webPath: (NSString *)webPath;
- (void) addEpisode: (Episode *)episode; - (void) addEpisode: (Episode *)episode;
- (void) getEpisodes; - (void) getEpisodes;
- (NSString *) webURLForEpisodeNumber: (NSString *)episodeNumber;
@end @end

View file

@ -20,20 +20,22 @@
@synthesize delegate = _delegate; @synthesize delegate = _delegate;
@synthesize fiveByFive = _fiveByFive; @synthesize fiveByFive = _fiveByFive;
@synthesize name = _name; @synthesize name = _name;
@synthesize path = _path; @synthesize feedPath = _feedPath;
@synthesize webPath = _webPath;
@synthesize episodes = _episodes; @synthesize episodes = _episodes;
+ (id) showWithName: (NSString *)name path: (NSString *)path + (id) showWithName: (NSString *)name feedPath: (NSString *)feedPath webPath: (NSString *)webPath
{ {
return [[self alloc] initWithName: name path: path]; return [[self alloc] initWithName: name feedPath: feedPath webPath: webPath];
} }
- (id) initWithName: (NSString *)name path: (NSString *)path - (id) initWithName: (NSString *)name feedPath: (NSString *)feedPath webPath: (NSString *)webPath
{ {
self = [super init]; self = [super init];
if (self) { if (self) {
self.name = name; self.name = name;
self.path = path; self.feedPath = feedPath;
self.webPath = webPath;
self.episodes = [NSMutableArray array]; self.episodes = [NSMutableArray array];
} }
return self; return self;
@ -60,7 +62,12 @@
- (NSURL *) feedURL - (NSURL *) feedURL
{ {
return [NSURL URLWithString: [[self.fiveByFive baseURL] stringByAppendingPathComponent: self.path]]; return [NSURL URLWithString: [[self.fiveByFive baseURL] stringByAppendingPathComponent: self.feedPath]];
}
- (NSString *) webURLForEpisodeNumber: (NSString *)episodeNumber
{
return [NSString stringWithFormat: @"http://5by5.tv/%@/%@", self.webPath, episodeNumber];
} }