Skip to content
This repository has been archived by the owner on Mar 30, 2021. It is now read-only.

Commit

Permalink
Use gmusic.js internally
Browse files Browse the repository at this point in the history
  • Loading branch information
jacobwgillespie committed Mar 30, 2016
1 parent ab38205 commit 8f2cca4
Show file tree
Hide file tree
Showing 8 changed files with 2,012 additions and 385 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,4 @@ DerivedData

# Custom
.env
node_modules/
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ and developed without having CocoaPods installed. Just be sure to open
`radiant-player-mac.xcworkspace` instead of `radiant-player-mac.xcodeproj` in order to
correctly pull in the dependencies into Xcode.

A few JavaScript dependencies are installed via `npm` - to update these dependences, ensure that `package.json` specifies the target version and run `./scripts/update-javascript-dependencies.sh`.

[6]: http://cocoapods.org/

License
Expand Down
6 changes: 6 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"gmusic.js": "^4.2.0"
}
}
33 changes: 17 additions & 16 deletions radiant-player-mac/AppDelegate.m
Original file line number Diff line number Diff line change
Expand Up @@ -625,7 +625,7 @@ - (void)moveWindowWithDeltaX:(CGFloat)deltaX andDeltaY:(CGFloat)deltaY
*/
- (IBAction) setPlaybackTime:(NSInteger)milliseconds
{
NSString *js = [NSString stringWithFormat:@"MusicAPI.Playback.setPlaybackTime(%ld)", (long)milliseconds];
NSString *js = [NSString stringWithFormat:@"gmusic.playback.setPlaybackTime(%ld)", (long)milliseconds];
[webView stringByEvaluatingJavaScriptFromString:js];
}

Expand All @@ -634,47 +634,47 @@ - (IBAction) setPlaybackTime:(NSInteger)milliseconds
*/
- (IBAction) playPause:(id)sender
{
[webView stringByEvaluatingJavaScriptFromString:@"MusicAPI.Playback.playPause()"];
[webView stringByEvaluatingJavaScriptFromString:@"gmusic.playback.playPause()"];
}

/**
* forwardAction skips track forward
*/
- (IBAction) forwardAction:(id)sender
{
[webView stringByEvaluatingJavaScriptFromString:@"MusicAPI.Playback.forward()"];
[webView stringByEvaluatingJavaScriptFromString:@"gmusic.playback.forward()"];
}

/**
* backAction skips track backwards
*/
- (IBAction) backAction:(id)sender
{
[webView stringByEvaluatingJavaScriptFromString:@"MusicAPI.Playback.rewind()"];
[webView stringByEvaluatingJavaScriptFromString:@"gmusic.playback.rewind()"];
}

/**
* Increases volume of Google Play Music by 10.
*/
- (IBAction) volumeUp:(id)sender
{
[webView stringByEvaluatingJavaScriptFromString:@"MusicAPI.Volume.increaseVolume(10)"];
[webView stringByEvaluatingJavaScriptFromString:@"gmusic.volume.increaseVolume(10)"];
}

/**
* Decreases volume of Google Play Music by 10.
*/
- (IBAction) volumeDown:(id)sender
{
[webView stringByEvaluatingJavaScriptFromString:@"MusicAPI.Volume.decreaseVolume(10)"];
[webView stringByEvaluatingJavaScriptFromString:@"gmusic.volume.decreaseVolume(10)"];
}

/**
* Sets the volume of Google Play Music.
*/
- (void) setVolume:(int)volume
{
[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"MusicAPI.Volume.setVolume(%d)", volume]];
[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"gmusic.volume.setVolume(%d)", volume]];
}

- (IBAction) volumeSliderChanged:(id)sender
Expand All @@ -687,63 +687,63 @@ - (IBAction) volumeSliderChanged:(id)sender
*/
- (IBAction) toggleThumbsUp:(id)sender
{
[webView stringByEvaluatingJavaScriptFromString:@"MusicAPI.Rating.toggleThumbsUp()"];
[webView stringByEvaluatingJavaScriptFromString:@"gmusic.rating.toggleThumbsUp()"];
}

/**
* Toggle the song's thumbs down rating.
*/
- (IBAction) toggleThumbsDown:(id)sender
{
[webView stringByEvaluatingJavaScriptFromString:@"MusicAPI.Rating.toggleThumbsDown()"];
[webView stringByEvaluatingJavaScriptFromString:@"gmusic.rating.toggleThumbsDown()"];
}

/**
* Cycle between the repeat modes.
*/
- (IBAction) toggleRepeatMode:(id)sender
{
[webView stringByEvaluatingJavaScriptFromString:@"MusicAPI.Playback.changeRepeat()"];
[webView stringByEvaluatingJavaScriptFromString:@"gmusic.playback.toggleRepeat()"];
}

/**
* Set to NO_REPEAT.
*/
- (IBAction) repeatNone:(id)sender
{
[webView stringByEvaluatingJavaScriptFromString:@"MusicAPI.Playback.changeRepeat(MusicAPI.Playback.NO_REPEAT)"];
[webView stringByEvaluatingJavaScriptFromString:@"gmusic.playback.changeRepeat(GMusic.Playback.NO_REPEAT)"];
}

/**
* Set to SINGLE_REPEAT.
*/
- (IBAction) repeatSingle:(id)sender
{
[webView stringByEvaluatingJavaScriptFromString:@"MusicAPI.Playback.changeRepeat(MusicAPI.Playback.SINGLE_REPEAT)"];
[webView stringByEvaluatingJavaScriptFromString:@"gmusic.playback.changeRepeat(GMusic.Playback.SINGLE_REPEAT)"];
}

/**
* Set to LIST_REPEAT.
*/
- (IBAction) repeatList:(id)sender
{
[webView stringByEvaluatingJavaScriptFromString:@"MusicAPI.Playback.changeRepeat(MusicAPI.Playback.LIST_REPEAT)"];
[webView stringByEvaluatingJavaScriptFromString:@"gmusic.playback.changeRepeat(GMusic.Playback.LIST_REPEAT)"];
}

/**
* Toggle the shuffle mode.
*/
- (IBAction) toggleShuffle:(id)sender
{
[webView stringByEvaluatingJavaScriptFromString:@"MusicAPI.Playback.toggleShuffle()"];
[webView stringByEvaluatingJavaScriptFromString:@"gmusic.playback.toggleShuffle()"];
}

/**
* Toggle the player's visualization.
*/
- (IBAction) toggleVisualization:(id)sender
{
[webView stringByEvaluatingJavaScriptFromString:@"MusicAPI.Playback.toggleVisualization()"];
[webView stringByEvaluatingJavaScriptFromString:@"gmusic.playback.toggleVisualization()"];
}

/**
Expand Down Expand Up @@ -821,7 +821,7 @@ - (void)downloadAlbumArt:(NSString *)art
- (NSString *)currentSongURL
{
// Get the shareable URL of the current song.
return [webView stringByEvaluatingJavaScriptFromString:@"window.MusicAPI.Extras.getSongURL()"];
return [webView stringByEvaluatingJavaScriptFromString:@"window.gmusic.extras.getSongURL()"];
}

#pragma mark - Playback Notifications
Expand Down Expand Up @@ -921,6 +921,7 @@ - (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
{
// Only apply the main script file when the player is ready.
if ([[webView mainFrameDocument] querySelector:@"#playerSongInfo"]) {
[self evaluateJavaScriptFile:@"gmusic"];
[self evaluateJavaScriptFile:@"main"];
}

Expand Down
62 changes: 31 additions & 31 deletions radiant-player-mac/LastFm/LastFmService.m
Original file line number Diff line number Diff line change
Expand Up @@ -19,33 +19,33 @@ @implementation LastFmService
- (id)init
{
self = [super init];

if (self != nil)
{
tracks = [[NSMutableArray alloc] init];
_lovedStatus = [NSMutableDictionary dictionary];
}

return self;
}

- (void)refreshTracks
{
[loadProgress startAnimation:self];

id successHandler = ^(NSArray *result) {
[tracks removeAllObjects];

for (NSDictionary *trackResult in result)
{
NSURL *imageUrl = [trackResult objectForKey:@"image"];
NSString *title = [trackResult objectForKey:@"name"];
NSString *artist = [trackResult objectForKey:@"artist"];
NSString *album = [trackResult objectForKey:@"album"];
NSDate *date = [trackResult objectForKey:@"date"];

NSMutableDictionary *track = [[NSMutableDictionary alloc] init];

if (imageUrl) [track setObject:[[NSImage alloc] initWithContentsOfURL:imageUrl] forKey:@"image"];
if (title) [track setObject:title forKey:@"title"];
if (artist) [track setObject:artist forKey:@"artist"];
Expand All @@ -60,19 +60,19 @@ - (void)refreshTracks
else {
[track setObject:[NSNumber numberWithBool:YES] forKey:@"now-playing"];
}

[tracks addObject:track];
}

[loadProgress performSelectorOnMainThread:@selector(stopAnimation:) withObject:self waitUntilDone:NO];
[tracksTable performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
};

id failureHandler = ^(NSError *error) {
NSLog(@"%@", error);
[loadProgress performSelectorOnMainThread:@selector(stopAnimation:) withObject:self waitUntilDone:NO];
};

[LastFmService getRecentTracksWithLimit:10 successHandler:successHandler failureHandler:failureHandler];
}

Expand All @@ -82,24 +82,24 @@ - (void)toggleTrackLovedStatus:(id)sender
{
LastFmTrackTableCellView *trackView = (LastFmTrackTableCellView *)[sender superview];
NSDictionary *track = [trackView trackData];

NSString *title = [track objectForKey:@"title"];
NSString *artist = [track objectForKey:@"artist"];
NSString *path = [NSString stringWithFormat:@"%@/%@", title, artist];

id loveSuccessHandler = ^(NSDictionary *result) {
[_lovedStatus setObject:[NSNumber numberWithBool:YES] forKey:path];
};

id unloveSuccessHandler = ^(NSDictionary *result) {
[_lovedStatus removeObjectForKey:path];
};

id failureHandler = ^(NSError *error) {
[self fetchTrackLovedStatus:title artist:artist sender:trackView];
NSLog(@"%@", error);
};

if ([[_lovedStatus objectForKey:path] isEqualToNumber:[NSNumber numberWithBool:YES]]) {
// Track is already loved, so unlove it.
[LastFmService unloveTrack:title artist:artist successHandler:unloveSuccessHandler failureHandler:failureHandler];
Expand All @@ -117,7 +117,7 @@ - (void)fetchTrackLovedStatus:(NSString *)track artist:(NSString *)artist sender
{
NSString *path = [NSString stringWithFormat:@"%@/%@", track, artist];
NSNumber *loved = [_lovedStatus objectForKey:path];

// Initially use the cached status.
if (loved != nil) {
if ([loved isEqualToNumber:[NSNumber numberWithBool:YES]]) {
Expand All @@ -127,10 +127,10 @@ - (void)fetchTrackLovedStatus:(NSString *)track artist:(NSString *)artist sender
[sender.loveButton setImage:[Utilities imageFromName:@"heart-outline"]];
}
}

id successHandler = ^(NSDictionary *result) {
NSNumber *loved = [result objectForKey:@"userloved"];

if ([loved isEqualToNumber:[NSNumber numberWithBool:YES]]) {
[_lovedStatus setObject:loved forKey:path];
[sender.loveButton setImage:[Utilities imageFromName:@"heart"]];
Expand All @@ -140,11 +140,11 @@ - (void)fetchTrackLovedStatus:(NSString *)track artist:(NSString *)artist sender
[sender.loveButton setImage:[Utilities imageFromName:@"heart-outline"]];
}
};

id failureHandler = ^(NSError *error) {
NSLog(@"%@", error);
};

[LastFmService getTrackInfo:track artist:artist successHandler:successHandler failureHandler:failureHandler];
}

Expand All @@ -153,7 +153,7 @@ - (void)openRecentTracksPage:(id)sender
NSString *username = [[[LastFm sharedInstance] username] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *page = [NSString stringWithFormat:@"https://www.last.fm/user/%@", username];
NSURL *url = [NSURL URLWithString:page];

[[NSWorkspace sharedWorkspace] openURL:url];
}

Expand All @@ -165,7 +165,7 @@ - (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
NSDictionary *track = [tracks objectAtIndex:row];

if (track != nil)
{
LastFmTrackTableCellView *view = [tableView makeViewWithIdentifier:@"TrackCellView" owner:self];
Expand All @@ -177,10 +177,10 @@ - (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn
NSImage *image = [track objectForKey:@"image"];
NSDate *date = [track objectForKey:@"date"];
NSString *dateString = @"";

if (artist == nil) artist = @"Unknown Artist";
if (album == nil) album = @"Unknown Album";

if (date != nil) {
dateString = [date timeAgoSimple];
}
Expand All @@ -189,21 +189,21 @@ - (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn
dateString = @"";
}
}

// Set up the track view.
[view setTrackData:[track copy]];
[view.titleView setStringValue:title];
[view.artistAlbumView setStringValue:[NSString stringWithFormat:@"%@ - %@", artist, album]];
[view.timestampView setStringValue:dateString];
[view.artView setImage:image];

// Get the track's loved status.
[view.loveButton setImage:[Utilities imageFromName:@"heart-outline"]];
[self fetchTrackLovedStatus:title artist:artist sender:view];

return view;
}

return nil;
}

Expand All @@ -212,8 +212,8 @@ + (void)scrobbleSong:(NSString *)title withArtist:(NSString *)artist album:(NSSt
NSTimeInterval curTimestamp = [[NSDate date] timeIntervalSince1970];

long percent = [percentage integerValue];
long scrobbleAt = (duration / 100) * percent;
long scrobbleAt = ((duration / 100) * percent) / 1000;

if ([title length] && curTimestamp - timestamp >= scrobbleAt) {
[[LastFm sharedInstance] sendScrobbledTrack:title
byArtist:artist
Expand All @@ -239,7 +239,7 @@ + (void)sendNowPlaying:(NSString *)title withArtist:(NSString *)artist album:(NS
successHandler:^(NSDictionary *result) {
return;
}

failureHandler:^(NSError *error) {
NSLog(@"Error sending now playing song: %@, %@", error, [error userInfo]);
}
Expand Down
Loading

0 comments on commit 8f2cca4

Please sign in to comment.