From e7346be5a905c120b0ef81966b51bf8f90282859 Mon Sep 17 00:00:00 2001 From: Duncan Robertson Date: Mon, 6 Jan 2014 16:51:34 +0000 Subject: [PATCH 1/5] Show/Hide Jukebox HUD --- app/app_delegate.rb | 15 +++++++++++++-- app/config/constants.rb | 3 +++ app/menu.rb | 35 +++++++++++++++++++++++++++++------ 3 files changed, 45 insertions(+), 8 deletions(-) diff --git a/app/app_delegate.rb b/app/app_delegate.rb index 831a999..5ed13ce 100644 --- a/app/app_delegate.rb +++ b/app/app_delegate.rb @@ -36,6 +36,13 @@ def build_jukebox_controls(sender) @jukebox_controls.setup(jukebox) @jukebox_controls.window.makeKeyAndOrderFront(self) App.shared.activateIgnoringOtherApps(true) + + update_jukebox_controls_button_state(NSOnState) + end + + def hide_jukebox_controls + update_jukebox_controls_button_state(NSOffState) + @jukebox_controls.close unless @jukebox_controls.nil? end def build_jukebox @@ -47,8 +54,7 @@ def jukebox end def jukebox_available? - true - #WebsocketConnector.instance.connected? && !jukebox.nil? + WebsocketConnector.instance.connected? && !jukebox.nil? end def connect_to_websocket_server @@ -61,4 +67,9 @@ def connect_to_websocket_server def userNotificationCenter(center, shouldPresentNotification:notification) true end + + def update_jukebox_controls_button_state(state) + butt = @menu.itemWithTag(MENU_CONSOLE_BUTT) + butt.setState(state) unless butt.nil? + end end diff --git a/app/config/constants.rb b/app/config/constants.rb index ce86147..3713d17 100644 --- a/app/config/constants.rb +++ b/app/config/constants.rb @@ -2,12 +2,15 @@ WEBSOCKET_URL = "ws://#{WEBSOCKET_HOST}:8081" VOTE_URL = "http://#{WEBSOCKET_HOST}/external?" +DEFAULT_MENU_WIDTH=250.0 + TRACK_TITLE=1 TRACK_ARTIST=2 TRACK_ARTWORK_URL=3 TRACK_ALBUM=4 MENU_NOWPLAYING=111 +MENU_CONSOLE_BUTT=222 JB_MESSAGE_RECEIVED="JukeboxMessageReceived" JB_UPDATED="JukeboxUpdated" \ No newline at end of file diff --git a/app/menu.rb b/app/menu.rb index 50fdc3d..9fd1cc7 100644 --- a/app/menu.rb +++ b/app/menu.rb @@ -4,6 +4,7 @@ def build_menu @menu = NSMenu.new @menu.delegate = self @menu.initWithTitle App.name + @menu.setMinimumWidth(DEFAULT_MENU_WIDTH) links.each_with_index do |data, i| m = NSMenuItem.new @@ -34,6 +35,8 @@ def menuNeedsUpdate(menu) build_now_playing end end + + update_console_status(menu) end private @@ -88,16 +91,36 @@ def build_now_playing @menu.insertItem(NSMenuItem.separatorItem, atIndex:1) - jrmi = NSMenuItem.new - jrmi.title = 'Launch Remote...' - jrmi.action = 'build_jukebox_controls:' - jrmi.setKeyEquivalent("0") - jrmi.setKeyEquivalentModifierMask(NSCommandKeyMask) - @menu.insertItem(jrmi, atIndex:2) + update_console_status(@menu) @menu.insertItem(NSMenuItem.separatorItem, atIndex:3) end + def update_console_status(menu) + butt = menu.itemWithTag(MENU_CONSOLE_BUTT) + + if butt + if butt.state == NSOffState + butt.title = 'Show Jukebox HUD' + butt.action = 'build_jukebox_controls:' + butt.setState(NSOffState) + else + butt.title = 'Hide Jukebox HUD' + butt.action = 'hide_jukebox_controls' + butt.setState(NSOnState) + end + else + butt = NSMenuItem.new + butt.title = 'Show Jukebox HUD' + butt.action = 'build_jukebox_controls:' + butt.tag = MENU_CONSOLE_BUTT + butt.setKeyEquivalent("0") + butt.setKeyEquivalentModifierMask(NSCommandKeyMask) + butt.setState(NSOffState) + menu.insertItem(butt, atIndex:2) + end + end + def open_link(sender) url = NSURL.URLWithString( url_for_index(sender.tag) ) NSWorkspace.sharedWorkspace.openURL(url) From 1e01bb3e52921cdbccf6be194da8aa0eb652073a Mon Sep 17 00:00:00 2001 From: Duncan Robertson Date: Wed, 8 Jan 2014 09:04:56 +0000 Subject: [PATCH 2/5] trying out vote feedback --- .gitignore | 1 + Gemfile.lock | 4 +- app/_views/album_art_view.rb | 89 ++++++++++++++++++++++++++++++++++ app/_views/nowplaying_view.rb | 33 +++++++++++-- app/_views/vote_view.rb | 64 ++++++++++++++++++++++++ app/config/constants.rb | 3 ++ app/lib/jukebox_handler.rb | 2 +- resources/missing_artwork.png | Bin 7975 -> 13625 bytes 8 files changed, 188 insertions(+), 8 deletions(-) create mode 100644 app/_views/album_art_view.rb create mode 100644 app/_views/vote_view.rb diff --git a/.gitignore b/.gitignore index 63a4d56..2d4bcee 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ nbproject sparkle/release sparkle/release/* sparkle/config/dsa_priv.pem +*.dat* diff --git a/Gemfile.lock b/Gemfile.lock index b54fa27..287217d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,8 +1,8 @@ GIT remote: git@github.com:kyan/kyan_jukebox_websocket_lib.git - revision: 93fe1c35e8065ee8710c59648f287b3fdc1963ed + revision: 092ab4ee680b0c382919d41ede1d9b9731fdb470 specs: - kyan_jukebox (0.1.6) + kyan_jukebox (0.1.7) GEM remote: https://rubygems.org/ diff --git a/app/_views/album_art_view.rb b/app/_views/album_art_view.rb new file mode 100644 index 0000000..97a540b --- /dev/null +++ b/app/_views/album_art_view.rb @@ -0,0 +1,89 @@ +class AlbumArtView < NSImageView + + def init + super.tap do |v| + v.setTranslatesAutoresizingMaskIntoConstraints(false) + v.setEditable(false) + v.setImageScaling(NSImageScaleAxesIndependently) + + @vote_view = VoteView.new + v.addSubview(@vote_view) + + @vote_slider_in_progress = false + + slidein_vote_view + end + end + + def slidein_vote_view + return if @vote_slider_in_progress + + new_frame = @vote_view.frame + new_frame.origin.x += VOTE_VIEW_W + + @vote_slider_in_progress = true + NSAnimationContext.beginGrouping + NSAnimationContext.currentContext.setCompletionHandler( + lambda do + timer = NSTimer.scheduledTimerWithTimeInterval( + 4.0, + target:self, + selector:'slideout_vote_view', + userInfo:nil, + repeats: false + ) + NSRunLoop.mainRunLoop.addTimer(timer, forMode:NSRunLoopCommonModes) + end + ) + NSAnimationContext.currentContext.setDuration(0.5) + @vote_view.animator.setFrame(new_frame) + NSAnimationContext.endGrouping + end + + def slideout_vote_view + new_frame = @vote_view.frame + new_frame.origin.x -= VOTE_VIEW_W + + NSAnimationContext.beginGrouping + NSAnimationContext.currentContext.setCompletionHandler( + lambda do + @vote_slider_in_progress = false + end + ) + NSAnimationContext.currentContext.setDuration(0.5) + @vote_view.animator.setFrame(new_frame) + NSAnimationContext.endGrouping + end + + def handle_vote(rating) + @vote_view.do_vote(rating) + slidein_vote_view + end + + def drawRect(dirtyRect) + super dirtyRect + + @vote_view.removeFromSuperview + addSubview(@vote_view, positioned:NSWindowAbove, relativeTo:nil) + end + + def mouseEntered(event) + slidein_vote_view + end + + def updateTrackingAreas + if @trackingArea != nil + removeTrackingArea(@trackingArea) + end + + @trackingArea = NSTrackingArea.alloc.initWithRect( + [[0,frame.size.height-VOTE_VIEW_H],[VOTE_VIEW_W,frame.size.height]], + options:NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways, + owner:self, + userInfo:nil + ) + + addTrackingArea(@trackingArea) + end + +end \ No newline at end of file diff --git a/app/_views/nowplaying_view.rb b/app/_views/nowplaying_view.rb index 09cf23d..b046f7f 100644 --- a/app/_views/nowplaying_view.rb +++ b/app/_views/nowplaying_view.rb @@ -87,15 +87,28 @@ def track @jukebox.track unless @jukebox.nil? end + def rating + @jukebox.rating unless @jukebox.nil? + end + private + def valid_jb_data?(key) + @jukebox.whats_changed.include?(key) + end + + def should_update? + valid_jb_data?(:track) || valid_jb_data?(:rating) + end + def update_data! - if @jukebox + if @jukebox && should_update? update_image update_title update_artist update_album update_addedby + update_votes end invalidateIntrinsicContentSize @@ -133,10 +146,7 @@ def draw_album_box end def draw_image_box - NSImageView.new.tap do |v| - v.setTranslatesAutoresizingMaskIntoConstraints(false) - v.setEditable(false) - end + AlbumArtView.new end def draw_addedby_box @@ -216,4 +226,17 @@ def update_image end end end + + def update_votes + puts "Changed: #{@jukebox.whats_changed}" + + score = if valid_jb_data?(:track) + track.rating unless track.nil? + elsif valid_jb_data?(:rating) + rating.rating unless rating.nil? + end + + score = 0 if score.nil? + @image.handle_vote(score) + end end \ No newline at end of file diff --git a/app/_views/vote_view.rb b/app/_views/vote_view.rb new file mode 100644 index 0000000..fa9e954 --- /dev/null +++ b/app/_views/vote_view.rb @@ -0,0 +1,64 @@ +class VoteView < NSView + + def init + super.tap do |v| + v.frame = [[0-VOTE_VIEW_W,50-VOTE_VIEW_H],[VOTE_VIEW_W,VOTE_VIEW_H]] + + @label = NSTextField.new.tap do |txt| + txt.setEditable(false) + txt.frame = [[3,2],[20,14]] + txt.setSelectable(false) + txt.setBezeled(false) + txt.setDrawsBackground(false) + txt.setAlignment(NSCenterTextAlignment) + end + + v.addSubview(@label) + end + end + + def do_vote(rating) + # grey + bg_col = NSColor.colorWithCalibratedRed(0.227, green:0.251, blue:0.337, alpha:0.8) + fg_col = NSColor.whiteColor + + # green + if rating > 0 + bg_col = NSColor.colorWithCalibratedRed(0, green:0.93, blue:0, alpha:0.8) + fg_col = NSColor.blackColor + end + + # red + if rating < 0 + bg_col = NSColor.colorWithCalibratedRed(0.9, green:0.4, blue:0.3, alpha:0.8) + fg_col = NSColor.blackColor + end + + txt = rating.to_s.attrd({ + 'NSFont' => NSFont.fontWithName("Helvetica Bold", size:10), + 'NSColor' => fg_col + }) + @label.setAttributedStringValue(txt) + @bg_color = bg_col + end + + def drawRect(dirtyRect) + draw_backing if @bg_color + + super dirtyRect + end + + def draw_backing + radius = 15.0 + + path = NSBezierPath.bezierPath + path.moveToPoint([0,0]) + path.lineToPoint([VOTE_VIEW_W-radius,0]) + path.curveToPoint([VOTE_VIEW_W,0+radius], controlPoint1:[VOTE_VIEW_W,0], controlPoint2:[VOTE_VIEW_W,0]) + path.lineToPoint([VOTE_VIEW_W,VOTE_VIEW_H]) + path.lineToPoint([0,VOTE_VIEW_H]) + path.lineToPoint([0,0]) + @bg_color.setFill + path.fill + end +end \ No newline at end of file diff --git a/app/config/constants.rb b/app/config/constants.rb index 3713d17..387770a 100644 --- a/app/config/constants.rb +++ b/app/config/constants.rb @@ -9,6 +9,9 @@ TRACK_ARTWORK_URL=3 TRACK_ALBUM=4 +VOTE_VIEW_H=19 +VOTE_VIEW_W=21 + MENU_NOWPLAYING=111 MENU_CONSOLE_BUTT=222 diff --git a/app/lib/jukebox_handler.rb b/app/lib/jukebox_handler.rb index db81a6c..0e28c8a 100644 --- a/app/lib/jukebox_handler.rb +++ b/app/lib/jukebox_handler.rb @@ -11,7 +11,7 @@ def initialize(jukebox) end def self.build - jb = KyanJukebox::Notify.new([:track, :playlist]) + jb = KyanJukebox::Notify.new([:track, :playlist, :rating]) jb.json_parser = BW::JSON new jb diff --git a/resources/missing_artwork.png b/resources/missing_artwork.png index 5c0575b6afa7bbc3ec599aff6ba8684f3457aa14..e7c1a91fb558f56a3a7059e9350ec6b3dd5ab6c0 100644 GIT binary patch literal 13625 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 literal 7975 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 From fd030dffb4f6282bd6a33297f9448c73f89f2dcc Mon Sep 17 00:00:00 2001 From: Duncan Robertson Date: Wed, 8 Jan 2014 09:44:26 +0000 Subject: [PATCH 3/5] add state for non voted --- app/_views/nowplaying_view.rb | 1 - app/_views/vote_view.rb | 25 ++++++++++++++++--------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/app/_views/nowplaying_view.rb b/app/_views/nowplaying_view.rb index b046f7f..c1e970c 100644 --- a/app/_views/nowplaying_view.rb +++ b/app/_views/nowplaying_view.rb @@ -236,7 +236,6 @@ def update_votes rating.rating unless rating.nil? end - score = 0 if score.nil? @image.handle_vote(score) end end \ No newline at end of file diff --git a/app/_views/vote_view.rb b/app/_views/vote_view.rb index fa9e954..88f5133 100644 --- a/app/_views/vote_view.rb +++ b/app/_views/vote_view.rb @@ -22,16 +22,23 @@ def do_vote(rating) bg_col = NSColor.colorWithCalibratedRed(0.227, green:0.251, blue:0.337, alpha:0.8) fg_col = NSColor.whiteColor - # green - if rating > 0 - bg_col = NSColor.colorWithCalibratedRed(0, green:0.93, blue:0, alpha:0.8) - fg_col = NSColor.blackColor - end + if rating.nil? + rating = "#" + # lightgrey + bg_col = NSColor.colorWithCalibratedRed(0.7, green:0.7, blue:0.7, alpha:0.8) + fg_col = NSColor.whiteColor + else + # green + if rating > 0 + bg_col = NSColor.colorWithCalibratedRed(0, green:0.93, blue:0, alpha:0.8) + fg_col = NSColor.blackColor + end - # red - if rating < 0 - bg_col = NSColor.colorWithCalibratedRed(0.9, green:0.4, blue:0.3, alpha:0.8) - fg_col = NSColor.blackColor + # red + if rating < 0 + bg_col = NSColor.colorWithCalibratedRed(0.9, green:0.4, blue:0.3, alpha:0.8) + fg_col = NSColor.blackColor + end end txt = rating.to_s.attrd({ From 049f70ed279b2afbaa62770d5e8dd23b5808401f Mon Sep 17 00:00:00 2001 From: Duncan Robertson Date: Wed, 8 Jan 2014 10:18:35 +0000 Subject: [PATCH 4/5] pass through rating and show votes on tooltip --- app/_views/album_art_view.rb | 6 +++--- app/_views/nowplaying_view.rb | 10 +++++----- app/_views/vote_view.rb | 13 +++++++------ app/_windows/jukebox_control_window.rb | 2 +- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/app/_views/album_art_view.rb b/app/_views/album_art_view.rb index 97a540b..53e4cc9 100644 --- a/app/_views/album_art_view.rb +++ b/app/_views/album_art_view.rb @@ -26,7 +26,7 @@ def slidein_vote_view NSAnimationContext.currentContext.setCompletionHandler( lambda do timer = NSTimer.scheduledTimerWithTimeInterval( - 4.0, + 5.0, target:self, selector:'slideout_vote_view', userInfo:nil, @@ -55,8 +55,8 @@ def slideout_vote_view NSAnimationContext.endGrouping end - def handle_vote(rating) - @vote_view.do_vote(rating) + def handle_vote(score, rating) + @vote_view.do_vote(score, rating) slidein_vote_view end diff --git a/app/_views/nowplaying_view.rb b/app/_views/nowplaying_view.rb index c1e970c..c9cb172 100644 --- a/app/_views/nowplaying_view.rb +++ b/app/_views/nowplaying_view.rb @@ -190,7 +190,7 @@ def update_album paragraph.setLineBreakMode(NSLineBreakByTruncatingTail) txt = track.album.attrd({ - 'NSFont' => NSFont.fontWithName("Lucida Grande", size:10), + 'NSFont' => NSFont.fontWithName("Lucida Grande", size:9), 'NSColor' => NSColor.grayColor, 'NSParagraphStyle' => paragraph }) unless track.album.nil? @@ -230,12 +230,12 @@ def update_image def update_votes puts "Changed: #{@jukebox.whats_changed}" - score = if valid_jb_data?(:track) - track.rating unless track.nil? - elsif valid_jb_data?(:rating) + score = if valid_jb_data?(:rating) rating.rating unless rating.nil? + elsif valid_jb_data?(:track) + track.rating unless track.nil? end - @image.handle_vote(score) + @image.handle_vote(score, rating) end end \ No newline at end of file diff --git a/app/_views/vote_view.rb b/app/_views/vote_view.rb index 88f5133..14e8537 100644 --- a/app/_views/vote_view.rb +++ b/app/_views/vote_view.rb @@ -17,35 +17,36 @@ def init end end - def do_vote(rating) + def do_vote(score, rating) # grey bg_col = NSColor.colorWithCalibratedRed(0.227, green:0.251, blue:0.337, alpha:0.8) fg_col = NSColor.whiteColor - if rating.nil? - rating = "#" + if score.nil? + score = "#" # lightgrey bg_col = NSColor.colorWithCalibratedRed(0.7, green:0.7, blue:0.7, alpha:0.8) fg_col = NSColor.whiteColor else # green - if rating > 0 + if score > 0 bg_col = NSColor.colorWithCalibratedRed(0, green:0.93, blue:0, alpha:0.8) fg_col = NSColor.blackColor end # red - if rating < 0 + if score < 0 bg_col = NSColor.colorWithCalibratedRed(0.9, green:0.4, blue:0.3, alpha:0.8) fg_col = NSColor.blackColor end end - txt = rating.to_s.attrd({ + txt = score.to_s.attrd({ 'NSFont' => NSFont.fontWithName("Helvetica Bold", size:10), 'NSColor' => fg_col }) @label.setAttributedStringValue(txt) + @label.setToolTip(rating.description) unless rating.nil? @bg_color = bg_col end diff --git a/app/_windows/jukebox_control_window.rb b/app/_windows/jukebox_control_window.rb index 4d16320..27f26f5 100644 --- a/app/_windows/jukebox_control_window.rb +++ b/app/_windows/jukebox_control_window.rb @@ -22,7 +22,7 @@ def canBecomeMainWindow def register_vote(button) if VoteHandler.register(button.vote) - puts "#{button.vote} vote registered" + puts "vote registered" else puts "vote registerinf failed!" end From 714e1e12523e2c972725b3a80396ba14bec108ee Mon Sep 17 00:00:00 2001 From: Duncan Robertson Date: Wed, 8 Jan 2014 13:28:16 +0000 Subject: [PATCH 5/5] better vote info and add jukebox link --- Gemfile.lock | 4 ++-- app/_buttons/vote_button.rb | 2 -- app/_views/nowplaying_view.rb | 21 ++++++++++++++++----- app/_views/vote_buttons_view.rb | 6 ++++++ app/_views/vote_view.rb | 1 - app/config/constants.rb | 3 +++ app/menu.rb | 3 ++- resources/jukebox.png | Bin 0 -> 3554 bytes 8 files changed, 29 insertions(+), 11 deletions(-) create mode 100644 resources/jukebox.png diff --git a/Gemfile.lock b/Gemfile.lock index 287217d..7bb8c71 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,8 +1,8 @@ GIT remote: git@github.com:kyan/kyan_jukebox_websocket_lib.git - revision: 092ab4ee680b0c382919d41ede1d9b9731fdb470 + revision: f702e1268351d140d8c7ee7ba6b587ade0cfeaa3 specs: - kyan_jukebox (0.1.7) + kyan_jukebox (0.1.9) GEM remote: https://rubygems.org/ diff --git a/app/_buttons/vote_button.rb b/app/_buttons/vote_button.rb index 91cf1be..6475c66 100644 --- a/app/_buttons/vote_button.rb +++ b/app/_buttons/vote_button.rb @@ -12,10 +12,8 @@ def initWithVote vote if vote button.cell.setImage(NSImage.imageNamed(NSImageNameAddTemplate)) - button.setToolTip(" Vote Up ") else button.cell.setImage(NSImage.imageNamed(NSImageNameRemoveTemplate)) - button.setToolTip(" Vote Down ") end end end diff --git a/app/_views/nowplaying_view.rb b/app/_views/nowplaying_view.rb index c9cb172..294cdfe 100644 --- a/app/_views/nowplaying_view.rb +++ b/app/_views/nowplaying_view.rb @@ -228,12 +228,23 @@ def update_image end def update_votes - puts "Changed: #{@jukebox.whats_changed}" - - score = if valid_jb_data?(:rating) - rating.rating unless rating.nil? - elsif valid_jb_data?(:track) + score = if valid_jb_data?(:track) track.rating unless track.nil? + elsif valid_jb_data?(:rating) + rating.rating unless rating.nil? + end + + if superview + uvote_button = superview.viewWithTag(U_VOTE_BUTTON) + dvote_button = superview.viewWithTag(D_VOTE_BUTTON) + + if !uvote_button.nil? + uvote_button.setToolTip(rating.p_ratings) + end + + if !dvote_button.nil? + dvote_button.setToolTip(rating.n_ratings) + end end @image.handle_vote(score, rating) diff --git a/app/_views/vote_buttons_view.rb b/app/_views/vote_buttons_view.rb index c0d98e1..41367aa 100644 --- a/app/_views/vote_buttons_view.rb +++ b/app/_views/vote_buttons_view.rb @@ -1,5 +1,7 @@ class VoteButtonsView < NSView + attr_reader :up_vote_button, :down_vote_button + def init super.tap do |v| v.translatesAutoresizingMaskIntoConstraints = false @@ -51,10 +53,14 @@ def init def up_vote_button @up_vote_button ||= VoteButton.alloc.initWithVote(true) + @up_vote_button.tag = U_VOTE_BUTTON + @up_vote_button end def down_vote_button @down_vote_button ||= VoteButton.alloc.initWithVote(false) + @down_vote_button.tag = D_VOTE_BUTTON + @down_vote_button end end \ No newline at end of file diff --git a/app/_views/vote_view.rb b/app/_views/vote_view.rb index 14e8537..65c04bb 100644 --- a/app/_views/vote_view.rb +++ b/app/_views/vote_view.rb @@ -46,7 +46,6 @@ def do_vote(score, rating) 'NSColor' => fg_col }) @label.setAttributedStringValue(txt) - @label.setToolTip(rating.description) unless rating.nil? @bg_color = bg_col end diff --git a/app/config/constants.rb b/app/config/constants.rb index 387770a..c98a792 100644 --- a/app/config/constants.rb +++ b/app/config/constants.rb @@ -12,6 +12,9 @@ VOTE_VIEW_H=19 VOTE_VIEW_W=21 +U_VOTE_BUTTON=32 +D_VOTE_BUTTON=33 + MENU_NOWPLAYING=111 MENU_CONSOLE_BUTT=222 diff --git a/app/menu.rb b/app/menu.rb index 9fd1cc7..537b981 100644 --- a/app/menu.rb +++ b/app/menu.rb @@ -136,7 +136,8 @@ def links ["Pivotal" , "https://www.pivotaltracker.com/google_domain_openid/redirect_for_auth?domain=kyanmedia.com"], ["Support" , "https://kyan.sirportly.com"], ["Holiday" , "https://appogee-leave.appspot.com/login?domain=kyanmedia.com"], - ["Campfire" , "https://kyanmedia.campfirenow.com"] + ["Campfire" , "https://kyanmedia.campfirenow.com"], + ["Jukebox" , "http://jukebox.local"] ] end diff --git a/resources/jukebox.png b/resources/jukebox.png new file mode 100644 index 0000000000000000000000000000000000000000..103d27d1328d5d2564849538e2404c4e114d616b GIT binary patch literal 3554 zcmZu!2UJr_8omjkcj<@{ks=BSRi%Ya2%vz1CP+)@H5iakq)L${-2h4x1pz4vN;4ou z`Vx^QDj?FO3sQ|Nyyxz|eYzo4o-cqebj=xtZ^T<35Q~ma;trb|PeZwcICKGY*;e(K5kqg?QbO4j?(0SEhalRRF+SRJJ0&)kC z?#*;bxhPpV-h9SK&qSu$D%`hwCa^qRmHx2xow1Nap> zO~*oFP`EJ@P$_3@9ToZFdmuC$;)Lz z%gdPIS?ArR(TS76SE*{90sH3b;!Bhq&G;P5g!|GnIGGpN618}6qN*|79H{o7)0mlj zX1odozS9EL;}17ZM!8$3w0&ifV2)c_a`y)1y1~xPU)awL$9FeHDQ#!=tn6P?DdbZR zJB{LzchH?FEGjhA>Fs43kYvM2vGoq-q#C z31-g}5i&Fx!hc?ZULZKzjobN_4G{Q&a4$wh9Ox7smD94Q*R@5G<-pS@F( zuWh2XdD=&?p26zQULO5Br~(}o6coXk0Up4zegIyDj#jD&F(6xdzUcVzJf!D)^J&tc zmKVWR)514-d<~F_v}s9Y(CB2K>DNOu9ADSbNt-dfJw9HSpr3qm znuabqADh9?+b%E_jftPcUBeFJ3}l8f>@uzy@y(uh=9Xad&Z9 zxES1>uZnL?#a^d`rPLfVF4kD6d@uIol%UqY6aV+M)t9Q3KRSGrIf1a?NV;P>C_S;n$Q(b!J(OMIQDQtO<0|fobscrxAA*%8P>LwT97?v0!ol><=x>$v zF#)xEu0LA8seMZo%o1!A6c98QBq_8j3S@a^b!E+D%_($LJ6kZngjmd2%)PXhNzYvA zHFFfJic`ujD_<^>?ngWxD^)AAds>BdD!5$L$7PiQyKzCY#ji8`DuP^eiJqaTQF&Nx+J-@|7?LpflB*DyH_`3*AY`U z#4BU6Q7Nc|u1i-x433-G)>En}EN-*T;tHjT4IPgvKVvY@^oH}4T2(u57x+KeJ;$sT zhmOnU9pkl;T9&#hy(lG&k;KrVJ*vM|?zMhw%W|`_3+jk+owBRyD;%4BSyn7P;oGzv zq>^P-ImX*?xq-69wk5JJzAsC!7VQ^JX50SY<9ntdB4~(naelJ4Z#{mBULsK9`2ebD zA{)~u*~i*fz|6w8#y2RWy!l~L3eUus{A+a!3B}v*#|)#VmcBAgt-$0h?^i8-B)ps{?xBK}dEA%B9IMJ)KaoVN`+wkizQ%qv7Wr0K-us3en zvb!YOCsxZneL*&;a77LkeS7>ZOfWHPmi#TSW;y#~$ET5|36GEgPy)?cdc;X?q1Pdu z+a_*hnjUYlpC_NSQWhV5t8a1&u?f*x)?ZJiAS01aI$9EM4XF%{TzGmR?R-l@O8fJv zn;m%Smmk`JT%`*p@&$D}kc+33*1vY_2(RX_sE+!_29+#GP;<9ly|ak5$RGYZ9P{e& zd6z(=z=?&>f$S4~C#2OM9NgZF-^$FY>UJ`uB=_+=e4vy|4F0aw9=RSD!xyc5-3L)$ zJ^enrys~_}CyZ2KyOo%c zs-oVXD!bQ68#K3PwGSWPst=mEcaVLYCXQ}z1=bjNVEtKbA!wZ1PhZS#t==1Ok?Ksf zTbg<#!DM_kr$oJsI2N=7ez zj5h!Ox)(z%y?=8^>jjsE$-w`g$j8O;KjHnC z>S*Op*&kW`=}h&oG|Jip2dodCV1~!LBQ)*s1W%~11HtVJ`nV4G1QBckZtM0AfbzXqsK*w6o3Qkiqq@(sMJ@qHTXJXAYb`3RE6(qmKU-e{;;L1$ixH$2_0P=l