├── .gitignore ├── .htaccess ├── Gruntfile.js ├── LICENSE.md ├── MANIFEST.in ├── README.md ├── Screenshots ├── desktop-artist.jpg ├── desktop-artists.jpg ├── desktop-dragging.jpg ├── desktop-featured.jpg ├── desktop-genre.jpg ├── desktop-playlist.jpg ├── desktop-queue.jpg ├── desktop-search.jpg └── overview.jpg ├── mopidy_spotmop ├── __init__.py ├── ext.conf ├── frontend.py ├── mem.py ├── pusher.py └── static │ ├── app-annotated.js │ ├── app.css │ ├── app.css.map │ ├── app.js │ ├── app.min.css │ ├── app.min.css.map │ ├── app.min.js │ ├── app.min.js.map │ ├── app │ ├── app.js │ ├── browse │ │ ├── album │ │ │ ├── controller.js │ │ │ └── template.html │ │ ├── artist │ │ │ ├── biography.template.html │ │ │ ├── controller.js │ │ │ ├── overview.template.html │ │ │ ├── related.template.html │ │ │ └── template.html │ │ ├── controller.js │ │ ├── featured │ │ │ ├── controller.js │ │ │ └── template.html │ │ ├── genre │ │ │ ├── category.template.html │ │ │ ├── controller.js │ │ │ └── template.html │ │ ├── new │ │ │ ├── controller.js │ │ │ └── template.html │ │ ├── playlist │ │ │ ├── controller.js │ │ │ └── template.html │ │ ├── template.html │ │ └── user │ │ │ ├── controller.js │ │ │ └── template.html │ ├── common │ │ ├── artistlist.template.html │ │ ├── contextmenu │ │ │ ├── directive.js │ │ │ └── template.html │ │ ├── directives.js │ │ ├── dropdown-field.template.html │ │ ├── genrelist.template.html │ │ ├── mainmenu.template.html │ │ ├── slider.template.html │ │ ├── thumbnail.template.html │ │ └── tracklist │ │ │ ├── localtrack.template.html │ │ │ ├── service.js │ │ │ ├── template.html │ │ │ ├── tltrack.template.html │ │ │ ├── track.directive.js │ │ │ ├── track.template.html │ │ │ └── tracklist.directive.js │ ├── discover │ │ ├── controller.js │ │ ├── recommendations.template.html │ │ ├── similar.template.html │ │ └── template.html │ ├── library │ │ ├── albums.template.html │ │ ├── artists.template.html │ │ ├── controller.js │ │ ├── files.template.html │ │ ├── local.template.html │ │ ├── playlists.template.html │ │ ├── template.html │ │ └── tracks.template.html │ ├── local │ │ ├── albums.html │ │ ├── artists.html │ │ ├── controller.js │ │ ├── directory.html │ │ ├── index.html │ │ └── template.html │ ├── player │ │ ├── controller.js │ │ ├── service.js │ │ └── template.html │ ├── queue │ │ ├── controller.js │ │ └── template.html │ ├── search │ │ ├── controller.js │ │ └── template.html │ ├── services │ │ ├── dialog │ │ │ ├── addbyuri.template.html │ │ │ ├── addtoplaylist.template.html │ │ │ ├── createplaylist.template.html │ │ │ ├── editplaylist.template.html │ │ │ ├── initialsetup.template.html │ │ │ ├── service.js │ │ │ ├── template.html │ │ │ └── volumecontrols.template.html │ │ ├── lastfm │ │ │ └── service.js │ │ ├── mopidy │ │ │ └── service.js │ │ ├── notify │ │ │ ├── service.js │ │ │ └── template.html │ │ ├── playlist-manager │ │ │ └── service.js │ │ ├── pusher │ │ │ └── service.js │ │ └── spotify │ │ │ ├── service.js │ │ │ └── spotify.js │ └── settings │ │ ├── controller.js │ │ ├── service.js │ │ ├── template.html │ │ └── testing.template.html │ ├── assets │ ├── backgrounds │ │ ├── afternoon.jpg │ │ ├── category-albums.jpg │ │ ├── category-artists.jpg │ │ ├── category-directory.jpg │ │ ├── commute.jpg │ │ ├── dinner.jpg │ │ ├── evening.jpg │ │ ├── late.jpg │ │ ├── midday.jpg │ │ └── morning.jpg │ ├── css │ │ ├── style.css │ │ └── style.min.css │ ├── favicon.ico │ ├── favicon.psd │ ├── fonts │ │ ├── Archivo-Narrow-700.eot │ │ ├── Archivo-Narrow-700.svg │ │ ├── Archivo-Narrow-700.ttf │ │ ├── Archivo-Narrow-700.woff │ │ ├── Archivo-Narrow-700.woff2 │ │ ├── Archivo-Narrow-regular.eot │ │ ├── Archivo-Narrow-regular.svg │ │ ├── Archivo-Narrow-regular.ttf │ │ ├── Archivo-Narrow-regular.woff │ │ ├── Archivo-Narrow-regular.woff2 │ │ ├── FontAwesome.otf │ │ ├── Roboto-regular.eot │ │ ├── Roboto-regular.svg │ │ ├── Roboto-regular.ttf │ │ ├── Roboto-regular.woff │ │ ├── Roboto-regular.woff2 │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ └── fontawesome-webfont.woff2 │ ├── icons │ │ ├── cd.svg │ │ ├── chevron-left.svg │ │ ├── chevron-right.svg │ │ ├── close-black.svg │ │ ├── close-white.svg │ │ ├── cog.svg │ │ ├── compass.svg │ │ ├── filter.svg │ │ ├── folder.svg │ │ ├── grid.svg │ │ ├── icons-single.ai │ │ ├── icons.ai │ │ ├── icons.svg │ │ ├── leaf.svg │ │ ├── list.svg │ │ ├── local.svg │ │ ├── mic.svg │ │ ├── music.svg │ │ ├── play.svg │ │ ├── playlist.svg │ │ ├── search.svg │ │ ├── sections.svg │ │ ├── soundcloud.svg │ │ ├── source-icons.ai │ │ ├── source-icons.svg │ │ ├── spotify.svg │ │ └── star.svg │ └── svg │ │ ├── blur.svg │ │ ├── local.svg │ │ ├── no-image.svg │ │ ├── soundcloud.svg │ │ ├── spinner-black.svg │ │ ├── spinner-white.svg │ │ ├── spinner.svg │ │ ├── spotify.svg │ │ └── white-diamond.svg │ ├── dev.html │ ├── index.html │ ├── scss │ ├── app.scss │ ├── components │ │ ├── _context-menu.scss │ │ ├── _dialog.scss │ │ ├── _loading-bar.scss │ │ ├── _player.scss │ │ ├── _slider.scss │ │ └── _tracklist.scss │ ├── global │ │ ├── _core.scss │ │ ├── _forms.scss │ │ ├── _icons.scss │ │ ├── _responsive.scss │ │ └── _touch-devices.scss │ └── vendor │ │ ├── _font-awesome.scss │ │ └── _fonts.scss │ ├── testing.html │ └── vendor │ ├── angular-google-analytics.min.js │ ├── angular-resource.min.js │ ├── angular-storage.min.js │ ├── angular-touch.js │ ├── angular-touch.min.js │ ├── angular-ui-router.min.js │ ├── angular.js │ ├── background-check.min.js │ ├── clipboard.min.js │ ├── jquery.event.drag.js │ ├── jquery.event.drop.js │ ├── jquery.min.js │ ├── loading-bar.js │ ├── mopidy.min.js │ └── ngclipboard.js ├── package.json ├── setup.cfg ├── setup.py ├── spotmop.php └── src ├── app ├── app.js ├── browse │ ├── album │ │ ├── controller.js │ │ └── template.html │ ├── artist │ │ ├── biography.template.html │ │ ├── controller.js │ │ ├── overview.template.html │ │ ├── related.template.html │ │ └── template.html │ ├── controller.js │ ├── featured │ │ ├── controller.js │ │ └── template.html │ ├── genre │ │ ├── category.template.html │ │ ├── controller.js │ │ └── template.html │ ├── new │ │ ├── controller.js │ │ └── template.html │ ├── playlist │ │ ├── controller.js │ │ └── template.html │ ├── template.html │ └── user │ │ ├── controller.js │ │ └── template.html ├── common │ ├── artistlist.template.html │ ├── contextmenu │ │ ├── directive.js │ │ └── template.html │ ├── directives.js │ ├── dropdown-field.template.html │ ├── genrelist.template.html │ ├── mainmenu.template.html │ ├── slider.template.html │ ├── thumbnail.template.html │ └── tracklist │ │ ├── template.html │ │ ├── track.directive.js │ │ ├── track.template.html │ │ └── tracklist.directive.js ├── discover │ ├── controller.js │ ├── recommendations.template.html │ ├── similar.template.html │ └── template.html ├── library │ ├── albums.template.html │ ├── artists.template.html │ ├── controller.js │ ├── playlists.template.html │ ├── template.html │ └── tracks.template.html ├── local │ ├── albums.html │ ├── artists.html │ ├── controller.js │ ├── directory.html │ ├── index.html │ └── template.html ├── player │ ├── controller.js │ ├── service.js │ └── template.html ├── queue │ ├── controller.js │ └── template.html ├── search │ ├── controller.js │ └── template.html ├── services │ ├── dialog │ │ ├── addbyuri.template.html │ │ ├── addtoplaylist.template.html │ │ ├── createplaylist.template.html │ │ ├── editplaylist.template.html │ │ ├── service.js │ │ ├── template.html │ │ └── volumecontrols.template.html │ ├── lastfm │ │ └── service.js │ ├── mopidy │ │ └── service.js │ ├── notify │ │ ├── service.js │ │ └── template.html │ ├── playlist-manager │ │ └── service.js │ ├── pusher │ │ └── service.js │ └── spotify │ │ └── service.js └── settings │ ├── controller.js │ ├── service.js │ ├── template.html │ └── testing.template.html ├── assets ├── backgrounds │ ├── afternoon.jpg │ ├── category-albums.jpg │ ├── category-artists.jpg │ ├── category-directory.jpg │ ├── commute.jpg │ ├── dinner.jpg │ ├── evening.jpg │ ├── late.jpg │ ├── midday.jpg │ └── morning.jpg ├── favicon.ico ├── favicon.psd ├── fonts │ ├── Archivo-Narrow-700.eot │ ├── Archivo-Narrow-700.svg │ ├── Archivo-Narrow-700.ttf │ ├── Archivo-Narrow-700.woff │ ├── Archivo-Narrow-700.woff2 │ ├── Archivo-Narrow-regular.eot │ ├── Archivo-Narrow-regular.svg │ ├── Archivo-Narrow-regular.ttf │ ├── Archivo-Narrow-regular.woff │ ├── Archivo-Narrow-regular.woff2 │ ├── FontAwesome.otf │ ├── Roboto-regular.eot │ ├── Roboto-regular.svg │ ├── Roboto-regular.ttf │ ├── Roboto-regular.woff │ ├── Roboto-regular.woff2 │ ├── fontawesome-webfont.eot │ ├── fontawesome-webfont.svg │ ├── fontawesome-webfont.ttf │ ├── fontawesome-webfont.woff │ └── fontawesome-webfont.woff2 ├── icons │ ├── cd.svg │ ├── chevron-left.svg │ ├── chevron-right.svg │ ├── close-black.svg │ ├── close-white.svg │ ├── cog.svg │ ├── compass.svg │ ├── filter.svg │ ├── folder.svg │ ├── grid.svg │ ├── icons-single.ai │ ├── icons.ai │ ├── leaf.svg │ ├── list.svg │ ├── local.svg │ ├── mic.svg │ ├── music.svg │ ├── play.svg │ ├── playlist.svg │ ├── search.svg │ ├── sections.svg │ ├── soundcloud.svg │ ├── spotify.svg │ └── star.svg └── svg │ ├── blur.svg │ ├── local.svg │ ├── no-image.svg │ ├── soundcloud.svg │ ├── spinner-black.svg │ ├── spinner-white.svg │ ├── spinner.svg │ ├── spotify.svg │ └── white-diamond.svg ├── dev.html ├── scss ├── app.scss ├── components │ ├── _context-menu.scss │ ├── _dialog.scss │ ├── _loading-bar.scss │ ├── _player.scss │ ├── _slider.scss │ └── _tracklist.scss ├── global │ ├── _core.scss │ ├── _forms.scss │ ├── _icons.scss │ ├── _responsive.scss │ └── _touch-devices.scss └── vendor │ ├── _font-awesome.scss │ └── _fonts.scss └── vendor ├── angular-google-analytics.min.js ├── angular-resource.min.js ├── angular-storage.min.js ├── angular-touch.js ├── angular-touch.min.js ├── angular-ui-router.min.js ├── angular.js ├── background-check.min.js ├── clipboard.min.js ├── jquery.event.drag.js ├── jquery.event.drop.js ├── jquery.min.js ├── loading-bar.js ├── mopidy.min.js └── ngclipboard.js /.gitignore: -------------------------------------------------------------------------------- 1 | /Concepts/ 2 | /dist/ 3 | /node_modules/ 4 | /build/ 5 | /.sass-cache/ 6 | *.orig 7 | @eaDir 8 | Thumbs.db 9 | *.egg-info 10 | *.pyc 11 | -------------------------------------------------------------------------------- /.htaccess: -------------------------------------------------------------------------------- 1 | # If you've pulled Spotmop via GitHub, you can run this using any webserver 2 | # by navigating to localhost/test. Otherwise we'll redirect it to the Mopidy instance as per below 3 | 4 | RewriteEngine On 5 | 6 | # rewrite all image requests to our default mopidy port 7 | RewriteRule ^images/(.*)$ http://%{HTTP_HOST}:6680/images/$1 [NC,L] 8 | 9 | # rewrite all root-level requests to the static folder 10 | RewriteCond %{REQUEST_URI} !/mopidy_spotmop/ [NC] 11 | RewriteRule (.*) /mopidy_spotmop/static/$1 [NC,L] 12 | 13 | # redirect our old /src/ dev link to the new dev.html file 14 | RewriteRule /src/ /dev.html? [L,R=301] -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include mopidy_spotmop/ext.conf 2 | recursive-include mopidy_spotmop/static * -------------------------------------------------------------------------------- /Screenshots/desktop-artist.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/Screenshots/desktop-artist.jpg -------------------------------------------------------------------------------- /Screenshots/desktop-artists.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/Screenshots/desktop-artists.jpg -------------------------------------------------------------------------------- /Screenshots/desktop-dragging.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/Screenshots/desktop-dragging.jpg -------------------------------------------------------------------------------- /Screenshots/desktop-featured.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/Screenshots/desktop-featured.jpg -------------------------------------------------------------------------------- /Screenshots/desktop-genre.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/Screenshots/desktop-genre.jpg -------------------------------------------------------------------------------- /Screenshots/desktop-playlist.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/Screenshots/desktop-playlist.jpg -------------------------------------------------------------------------------- /Screenshots/desktop-queue.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/Screenshots/desktop-queue.jpg -------------------------------------------------------------------------------- /Screenshots/desktop-search.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/Screenshots/desktop-search.jpg -------------------------------------------------------------------------------- /Screenshots/overview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/Screenshots/overview.jpg -------------------------------------------------------------------------------- /mopidy_spotmop/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import unicode_literals 2 | 3 | import logging, os, json 4 | import tornado.web 5 | import tornado.websocket 6 | from mopidy import config, ext 7 | from frontend import SpotmopFrontend 8 | 9 | logger = logging.getLogger(__name__) 10 | __version__ = '2.10.1' 11 | 12 | ## 13 | # Core extension class 14 | # 15 | # Loads config and gets the party started. Initiates any additional frontends, etc. 16 | ## 17 | class SpotmopExtension( ext.Extension ): 18 | 19 | dist_name = 'Mopidy-Spotmop' 20 | ext_name = 'spotmop' 21 | version = __version__ 22 | 23 | def get_default_config(self): 24 | conf_file = os.path.join(os.path.dirname(__file__), 'ext.conf') 25 | return config.read(conf_file) 26 | 27 | def get_config_schema(self): 28 | schema = super(SpotmopExtension, self).get_config_schema() 29 | schema['debug'] = config.Boolean() 30 | schema['pusherport'] = config.String() 31 | return schema 32 | 33 | def setup(self, registry): 34 | 35 | # Add web extension 36 | registry.add('http:app', { 37 | 'name': self.ext_name, 38 | 'factory': factory 39 | }) 40 | 41 | # add our frontend 42 | registry.add('frontend', SpotmopFrontend) 43 | 44 | def factory(config, core): 45 | 46 | path = os.path.join( os.path.dirname(__file__), 'static') 47 | 48 | return [ 49 | (r"/images/(.*)", tornado.web.StaticFileHandler, { 50 | "path": config['local-images']['image_dir'] 51 | }), 52 | (r'/(.*)', tornado.web.StaticFileHandler, { 53 | "path": path, 54 | "default_filename": "index.html" 55 | }), 56 | ] 57 | -------------------------------------------------------------------------------- /mopidy_spotmop/ext.conf: -------------------------------------------------------------------------------- 1 | [spotmop] 2 | enabled = true 3 | debug = false 4 | pusherport = 6681 -------------------------------------------------------------------------------- /mopidy_spotmop/mem.py: -------------------------------------------------------------------------------- 1 | queuemanager = None 2 | localfiles = None -------------------------------------------------------------------------------- /mopidy_spotmop/static/app/browse/artist/biography.template.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Biography

4 |
5 | 6 |
7 |

8 | Origin: 9 |

10 |

11 | Published: 12 |

13 |
14 | 15 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/browse/artist/overview.template.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Top tracks

4 | 5 | 6 |
7 | 8 |
9 | 10 |

Related Artists

11 | 12 | 28 | 29 |
30 | 31 |
32 | 33 |

Albums

34 | 35 |
36 |
37 | 42 |
43 | 44 |
45 |
46 |
47 |
48 |
49 | 54 |
55 | 56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 | 64 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/browse/artist/related.template.html: -------------------------------------------------------------------------------- 1 |

Related Artists

2 | 3 |
4 |
5 | 9 |
10 | 11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | 20 |
21 | No items 22 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/browse/controller.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('spotmop.browse', []) 4 | 5 | /** 6 | * Routing 7 | **/ 8 | .config(function($stateProvider) { 9 | $stateProvider 10 | .state('browse', { 11 | url: "/browse", 12 | templateUrl: "app/browse/template.html" 13 | }); 14 | }); -------------------------------------------------------------------------------- /mopidy_spotmop/static/app/browse/featured/controller.js: -------------------------------------------------------------------------------- 1 | angular.module('spotmop.browse.featured', []) 2 | 3 | /** 4 | * Routing 5 | **/ 6 | .config(function($stateProvider) { 7 | $stateProvider 8 | .state('browse.featured', { 9 | url: "/featured", 10 | templateUrl: "app/browse/featured/template.html", 11 | controller: 'FeaturedController' 12 | }) 13 | .state('browse.featuredplaylist', { 14 | url: "/featured/:uri", 15 | templateUrl: "app/browse/playlist/template.html", 16 | controller: 'PlaylistController' 17 | }); 18 | }) 19 | 20 | /** 21 | * Main controller 22 | **/ 23 | .controller('FeaturedController', function FeaturedController( $scope, $rootScope, $filter, SpotifyService, NotifyService ){ 24 | 25 | // set the default items 26 | $scope.playlists = []; 27 | $scope.featured = function(){ 28 | return $scope.playlists[0]; 29 | } 30 | 31 | // figure out the most appropriate background image to show (based on current local time) 32 | $scope.partofday = function(){ 33 | 34 | // convert to decimal (remembering that minutes are base-6) 35 | var hour = parseFloat($filter('date')(new Date(),'H.m')); 36 | 37 | if( hour >= 4 && hour < 9.3 ) 38 | return 'commute'; 39 | else if( hour >= 9.3 && hour < 11 ) 40 | return 'morning'; 41 | else if( hour >= 11 && hour < 13.5 ) 42 | return 'midday'; 43 | else if( hour >= 13.5 && hour < 17 ) 44 | return 'afternoon'; 45 | else if( hour >= 17 && hour < 19 ) 46 | return 'evening'; 47 | else if( hour >= 19 && hour < 21 ) 48 | return 'dinner'; 49 | else if( hour >= 21 && hour < 23 || hour >= 0 && hour < 4 ) 50 | return 'late'; 51 | }; 52 | 53 | SpotifyService.featuredPlaylists( 50 ) 54 | .then(function( response ) { 55 | $scope.message = response.message; 56 | $scope.playlists = response.playlists.items; 57 | }); 58 | }); -------------------------------------------------------------------------------- /mopidy_spotmop/static/app/browse/featured/template.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/app/browse/genre/category.template.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 14 | 15 |
16 | 17 | 33 | 34 |
35 | No items 36 |
37 | 38 |
39 | 40 |
41 | 42 |
43 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/browse/genre/template.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 14 | 15 |
16 | 17 | 25 | 26 |
27 | No items 28 |
29 | 30 |
31 | 32 |
33 | 34 |
35 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/browse/new/controller.js: -------------------------------------------------------------------------------- 1 | angular.module('spotmop.browse.new', []) 2 | 3 | /** 4 | * Routing 5 | **/ 6 | .config(function($stateProvider) { 7 | $stateProvider 8 | .state('browse.new', { 9 | url: "/new", 10 | templateUrl: "app/browse/new/template.html", 11 | controller: 'NewController' 12 | }) 13 | .state('browse.newalbum', { 14 | url: "/new/:uri", 15 | templateUrl: "app/browse/album/template.html", 16 | controller: 'AlbumController' 17 | }); 18 | }) 19 | 20 | /** 21 | * Main controller 22 | **/ 23 | .controller('NewController', function NewController( $scope, $element, $rootScope, SpotifyService, MopidyService ){ 24 | 25 | // set the default items 26 | $scope.albums = []; 27 | 28 | SpotifyService.newReleases() 29 | .then(function( response ) { 30 | $scope.albums = response.albums; 31 | $scope.checkForLazyLoading(); 32 | }); 33 | 34 | var nextOffset = 50; 35 | 36 | 37 | /** 38 | * Load more of the category's playlists 39 | * Triggered by scrolling to the bottom 40 | **/ 41 | 42 | var loadingMoreNewReleases = false; 43 | 44 | // go off and get more of this playlist's tracks 45 | function loadMoreNewReleases( offset ){ 46 | 47 | // update our switch to prevent spamming for every scroll event 48 | loadingMoreNewReleases = true; 49 | 50 | // go get our 'next' URL 51 | SpotifyService.newReleases( false, offset ) 52 | .then(function( response ){ 53 | 54 | // append these new tracks to the main tracklist 55 | $scope.albums.items = $scope.albums.items.concat( response.albums.items ); 56 | 57 | // save the next set's url (if it exists) 58 | nextOffset = response.albums.offset + response.albums.limit; 59 | 60 | // update loader and re-open for further pagination objects 61 | loadingMoreNewReleases = false; 62 | }); 63 | } 64 | 65 | // once we're told we're ready to load more albums 66 | $scope.$on('spotmop:loadMore', function(){ 67 | if( !loadingMoreNewReleases && nextOffset ){ 68 | loadMoreNewReleases( nextOffset ); 69 | } 70 | }); 71 | 72 | }); -------------------------------------------------------------------------------- /mopidy_spotmop/static/app/browse/new/template.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 14 | 15 |
16 | 17 | 37 | 38 |
39 | No items 40 |
41 | 42 |
43 | 44 |
45 | 46 |
47 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/browse/template.html: -------------------------------------------------------------------------------- 1 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/browse/user/controller.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('spotmop.browse.user', []) 4 | 5 | /** 6 | * Routing 7 | **/ 8 | .config(function($stateProvider) { 9 | $stateProvider 10 | .state('browse.user', { 11 | url: "/user/:uri", 12 | templateUrl: "app/browse/user/template.html", 13 | controller: 'UserController' 14 | }); 15 | }) 16 | 17 | /** 18 | * Main controller 19 | **/ 20 | .controller('UserController', function UserController( $scope, $rootScope, SpotifyService, $stateParams ){ 21 | 22 | $scope.user = {}; 23 | $scope.playlists = []; 24 | 25 | // get the user 26 | SpotifyService.getUser( $stateParams.uri ) 27 | .then(function( response ) { 28 | $scope.user = response; 29 | 30 | // get their playlists 31 | SpotifyService.getPlaylists( response.id ) 32 | .then(function( response ) { 33 | $scope.playlists = response.items; 34 | $scope.next = response.next; 35 | $scope.totalPlaylists = response.total; 36 | }); 37 | }); 38 | 39 | /** 40 | * Load more of the user's playlists 41 | * Triggered by scrolling to the bottom 42 | **/ 43 | 44 | var loadingMorePlaylists = false; 45 | 46 | // go off and get more of this playlist's tracks 47 | function loadMorePlaylists( $nextUrl ){ 48 | 49 | if( typeof( $nextUrl ) === 'undefined' ) 50 | return false; 51 | 52 | // update our switch to prevent spamming for every scroll event 53 | loadingMorePlaylists = true; 54 | 55 | // go get our 'next' URL 56 | SpotifyService.getUrl( $nextUrl ) 57 | .then(function( response ){ 58 | 59 | // append these new playlists to our existing array 60 | $scope.playlists = $scope.playlists.concat( response.items ); 61 | 62 | // save the next set's url (if it exists) 63 | $scope.next = response.next; 64 | 65 | // update loader and re-open for further pagination objects 66 | loadingMorePlaylists = false; 67 | }); 68 | } 69 | 70 | // once we're told we're ready to load more albums 71 | $scope.$on('spotmop:loadMore', function(){ 72 | if( !loadingMorePlaylists && typeof( $scope.next ) !== 'undefined' && $scope.next ){ 73 | loadMorePlaylists( $scope.next ); 74 | } 75 | }); 76 | }); -------------------------------------------------------------------------------- /mopidy_spotmop/static/app/browse/user/template.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 8 | 9 |
10 |
11 | 12 |
13 |
14 |

15 | 16 | 17 | You 18 |

19 |
20 | 21 |  |  Playlists 22 |  |  {{ user.followers.total | number:0 }} Followers 23 |
24 |
25 |
26 |
27 | 28 | 29 |

Playlists

30 | 31 |
32 | 33 | 44 | 45 |
46 | No items 47 |
48 | 49 |
50 | 51 |
52 | 53 |
54 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/common/artistlist.template.html: -------------------------------------------------------------------------------- 1 | 2 | and , 3 | and , 4 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/app/common/dropdown-field.template.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/app/common/genrelist.template.html: -------------------------------------------------------------------------------- 1 | 2 | and , 3 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/app/common/thumbnail.template.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/common/tracklist/localtrack.template.html: -------------------------------------------------------------------------------- 1 |
7 | 8 |
9 | 10 | 11 |
12 | 13 |
14 | 15 |
16 | 17 | 18 | 19 | 20 | , 21 | 22 | 23 |
24 | 25 |
26 | 27 | 28 |
29 | 30 |
31 | {{ track.length | formatMilliseconds }} 32 |
33 | 34 |
35 | 36 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/common/tracklist/service.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('spotmop.common.tracklist.service', []) 4 | 5 | .factory("TracklistService", function( $rootScope ){ 6 | 7 | return { 8 | getSelectedTracks: function(){ 9 | console.log('triggered getSelectedTracks'); 10 | } 11 | } 12 | }); 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/app/common/tracklist/template.html: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 |
7 | No items 8 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/common/tracklist/tltrack.template.html: -------------------------------------------------------------------------------- 1 |
8 | 9 |
10 | 11 | 12 |
13 | 14 |
Local
15 | 16 |
17 | 18 |
19 | 20 |
21 | 22 |
23 | 24 |
25 | 26 | 27 | {{ track.length | formatMilliseconds }} 28 | 29 | 30 |
31 | 32 |
33 | 34 |
35 | 36 |
37 | 38 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/common/tracklist/track.template.html: -------------------------------------------------------------------------------- 1 |
8 | 9 |
10 | 11 | 12 |
13 | 14 |
19 |
23 |
27 | 28 |
29 | 30 |
31 | 32 |
33 | 34 | 35 |
36 | 37 |
38 | 39 | 40 | {{ track.duration_ms | formatMilliseconds }} 41 | {{ track.length | formatMilliseconds }} 42 | 43 | 44 |
45 | 46 | 47 | 48 | % 49 |
50 | 51 |
52 | 53 |
54 | 55 |
56 | 57 |
58 | 59 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/discover/recommendations.template.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 | 6 | 22 | 23 |
24 |

25 | Because you're listening to 26 | 27 |

28 | 29 |
30 | 31 |
32 |

33 | {{ section.title }} 34 | 35 |

36 | 37 |
38 | 39 |
40 |

41 | Some old favorites 42 |

43 | 44 |
45 | 46 |
47 | 48 |
49 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/discover/similar.template.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 | 6 | 16 | 17 |

18 | Tracks similar to: 19 | and , 20 |

21 | 22 | 23 | 24 |
25 | 26 |
27 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/discover/template.html: -------------------------------------------------------------------------------- 1 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/library/files.template.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 14 | 15 | 23 | 24 | 25 | 26 |
27 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/library/local.template.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 22 | 23 | 31 | 32 | 33 | 34 |
35 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/library/template.html: -------------------------------------------------------------------------------- 1 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/library/tracks.template.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 20 | 21 | 22 | 23 |
24 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/local/directory.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 22 | 23 | 34 | 35 | 36 | 37 |
38 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/local/index.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 16 | 17 |
18 | 19 | 27 | 28 | 36 | 37 | 45 | 46 |
47 | 48 |
49 | 50 |
51 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/local/template.html: -------------------------------------------------------------------------------- 1 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/player/template.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 |
6 | 7 | , 8 | 9 |
10 |
11 | 12 |
13 |
14 | 15 | 16 | 17 | 18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 | 26 |
27 |
28 | 29 | 30 | 31 |
32 |
33 | 34 |
35 |
36 | 37 | 38 | 39 | 40 | 41 | 42 |
43 |
44 | 45 |
46 | 47 |
48 |
49 |
50 |
51 |
52 | 53 |
54 | 55 |
56 | 57 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/services/dialog/addbyuri.template.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Add by URI

4 |
Add an album, artist, playlist or track as a URI (ie spotify:track:123)
5 | 6 |
7 | 8 |
9 | 10 | Unable to add this URI 11 |
12 | 13 |
14 | 15 |   Add 16 | 17 | 18 | 19 | 20 |
21 | 22 |
23 | 24 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/services/dialog/addtoplaylist.template.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Select playlist

4 | 5 |
6 |
7 |
8 |
9 |
10 | 11 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/services/dialog/createplaylist.template.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Create playlist

4 | 5 |
6 | 7 |
8 | 9 | Please enter a title 10 |
11 | 12 |
13 | 17 | 21 |
22 |
23 | 24 |
25 | 29 | 33 | 37 |
38 |
39 | 40 |
41 | 44 | 45 | 46 | 47 |
48 | 49 |
50 | 51 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/services/dialog/editplaylist.template.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Edit playlist

4 | 5 |
6 | 7 |
8 | 9 | Please enter a title 10 |
11 | 12 |
13 | 17 | 21 |
22 |
23 | 24 |
25 | 28 | 29 | 30 | 31 |
32 | 33 |
34 | 35 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/services/dialog/initialsetup.template.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Initial Setup

4 |
These options can be changed later in Settings
5 | 6 |
7 | 8 |
9 | 10 | Please enter your name 11 |
12 | 13 |
14 |
15 | 16 |
17 |
Disable browser notifications
18 |
19 | 20 |
21 |
22 | 23 |
24 |
Keyboard shortcuts
25 |
26 | 27 |
28 |
29 | 30 |
31 |
Connect with Spotify
32 |
33 | 34 |
35 | 38 | 39 | 40 | 41 |
42 | 43 |
44 | 45 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/services/dialog/template.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 5 | 6 |
7 | 8 |
9 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/services/dialog/volumecontrols.template.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Adjust volume

4 | 5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 | 15 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/services/notify/template.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 5 | 6 |
7 | 8 |
9 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/app/settings/testing.template.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 14 | 15 |

Server requests

16 |
17 | 18 |
19 |
Method
20 |
21 | 22 |
23 |
24 | 25 |
26 |
Payload (JSON string)
27 |
28 | 29 |
30 |
31 | 32 |
33 |
34 |
35 | 36 |
37 |
38 | 39 |
40 | 41 |

Pusher connection

42 |
43 | 44 |
45 |
Payload (JSON string)
46 |
47 | 48 |
49 |
50 | 51 |
52 |
53 |
54 | 55 |
56 |
57 | 58 |
59 | 60 |

Response

61 |

62 |         
63 | 	
64 |
-------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/backgrounds/afternoon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/backgrounds/afternoon.jpg -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/backgrounds/category-albums.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/backgrounds/category-albums.jpg -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/backgrounds/category-artists.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/backgrounds/category-artists.jpg -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/backgrounds/category-directory.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/backgrounds/category-directory.jpg -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/backgrounds/commute.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/backgrounds/commute.jpg -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/backgrounds/dinner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/backgrounds/dinner.jpg -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/backgrounds/evening.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/backgrounds/evening.jpg -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/backgrounds/late.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/backgrounds/late.jpg -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/backgrounds/midday.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/backgrounds/midday.jpg -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/backgrounds/morning.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/backgrounds/morning.jpg -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/favicon.ico -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/favicon.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/favicon.psd -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/fonts/Archivo-Narrow-700.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/fonts/Archivo-Narrow-700.eot -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/fonts/Archivo-Narrow-700.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/fonts/Archivo-Narrow-700.ttf -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/fonts/Archivo-Narrow-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/fonts/Archivo-Narrow-700.woff -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/fonts/Archivo-Narrow-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/fonts/Archivo-Narrow-700.woff2 -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/fonts/Archivo-Narrow-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/fonts/Archivo-Narrow-regular.eot -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/fonts/Archivo-Narrow-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/fonts/Archivo-Narrow-regular.ttf -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/fonts/Archivo-Narrow-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/fonts/Archivo-Narrow-regular.woff -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/fonts/Archivo-Narrow-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/fonts/Archivo-Narrow-regular.woff2 -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/fonts/Roboto-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/fonts/Roboto-regular.eot -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/fonts/Roboto-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/fonts/Roboto-regular.ttf -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/fonts/Roboto-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/fonts/Roboto-regular.woff -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/fonts/Roboto-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/fonts/Roboto-regular.woff2 -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/icons/cd.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 10 | 11 | 12 | 15 | 16 | 18 | 20 | 21 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/icons/chevron-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 8 | 9 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/icons/chevron-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 8 | 9 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/icons/close-black.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/icons/close-white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/icons/cog.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 11 | 12 | 13 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/icons/compass.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 11 | 12 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/icons/filter.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/icons/folder.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/icons/grid.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/icons/icons-single.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/icons/icons-single.ai -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/icons/icons.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/icons/icons.ai -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/icons/leaf.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/icons/list.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/icons/local.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 8 | 9 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/icons/mic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 9 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/icons/music.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 10 | 11 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/icons/play.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/icons/playlist.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/icons/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/icons/sections.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/icons/soundcloud.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 21 | 22 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/icons/source-icons.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/mopidy_spotmop/static/assets/icons/source-icons.ai -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/icons/spotify.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 14 | 15 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/icons/star.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/svg/blur.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/svg/local.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 8 | 9 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/svg/no-image.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/svg/soundcloud.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 20 | 21 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/svg/spinner-black.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/svg/spinner-white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/svg/spinner.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 11 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/svg/spotify.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 14 | 15 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/assets/svg/white-diamond.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/scss/app.scss: -------------------------------------------------------------------------------- 1 | 2 | @import 'global/core'; 3 | @import 'global/forms'; 4 | @import 'global/icons'; 5 | @import 'global/touch-devices'; 6 | 7 | @import 'components/tracklist'; 8 | @import 'components/context-menu'; 9 | @import 'components/loading-bar'; 10 | @import 'components/dialog'; 11 | @import 'components/player'; 12 | @import 'components/slider'; 13 | 14 | @import 'global/responsive'; 15 | 16 | @import 'vendor/font-awesome'; 17 | @import 'vendor/fonts'; 18 | 19 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/scss/components/_loading-bar.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * angular-loading-bar v0.8.0 3 | * https://chieffancypants.github.io/angular-loading-bar 4 | * Copyright (c) 2015 Wes Cruver 5 | * License: MIT 6 | */ 7 | 8 | /* Make clicks pass-through */ 9 | #loading-bar, 10 | #loading-bar-spinner { 11 | pointer-events: none; 12 | -webkit-pointer-events: none; 13 | -webkit-transition: 350ms linear all; 14 | -moz-transition: 350ms linear all; 15 | -o-transition: 350ms linear all; 16 | transition: 350ms linear all; 17 | } 18 | 19 | #loading-bar-spinner.ng-enter, 20 | #loading-bar-spinner.ng-leave.ng-leave-active { 21 | opacity: 0; 22 | } 23 | 24 | #loading-bar-spinner.ng-enter.ng-enter-active, 25 | #loading-bar-spinner.ng-leave { 26 | opacity: 1; 27 | } 28 | 29 | #loading-bar-spinner { 30 | display: block; 31 | position: fixed; 32 | z-index: 10002; 33 | top: 10px; 34 | left: 10px; 35 | } 36 | 37 | #loading-bar-spinner .spinner-icon { 38 | width: 14px; 39 | height: 14px; 40 | 41 | border: solid 2px transparent; 42 | border-top-color: #29d; 43 | border-left-color: #29d; 44 | border-radius: 50%; 45 | 46 | -webkit-animation: loading-bar-spinner 400ms linear infinite; 47 | -moz-animation: loading-bar-spinner 400ms linear infinite; 48 | -ms-animation: loading-bar-spinner 400ms linear infinite; 49 | -o-animation: loading-bar-spinner 400ms linear infinite; 50 | animation: loading-bar-spinner 400ms linear infinite; 51 | } 52 | 53 | @-webkit-keyframes loading-bar-spinner { 54 | 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 55 | 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } 56 | } 57 | @-moz-keyframes loading-bar-spinner { 58 | 0% { -moz-transform: rotate(0deg); transform: rotate(0deg); } 59 | 100% { -moz-transform: rotate(360deg); transform: rotate(360deg); } 60 | } 61 | @-o-keyframes loading-bar-spinner { 62 | 0% { -o-transform: rotate(0deg); transform: rotate(0deg); } 63 | 100% { -o-transform: rotate(360deg); transform: rotate(360deg); } 64 | } 65 | @-ms-keyframes loading-bar-spinner { 66 | 0% { -ms-transform: rotate(0deg); transform: rotate(0deg); } 67 | 100% { -ms-transform: rotate(360deg); transform: rotate(360deg); } 68 | } 69 | @keyframes loading-bar-spinner { 70 | 0% { transform: rotate(0deg); transform: rotate(0deg); } 71 | 100% { transform: rotate(360deg); transform: rotate(360deg); } 72 | } 73 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/scss/components/_slider.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Sliders 3 | * Side-scrolling content (ie discover sections) 4 | **/ 5 | 6 | slider { 7 | height: 250px; 8 | display: block; 9 | position: relative; 10 | margin-bottom: 40px; 11 | 12 | &.square-panels { 13 | margin-left: 0; 14 | margin-right: -40px; 15 | } 16 | 17 | .controls { 18 | position: absolute; 19 | top: -40px; 20 | right: 20px; 21 | z-index: 5; 22 | 23 | .si { 24 | margin: 5px; 25 | opacity: 0.2; 26 | 27 | &.can-slide { 28 | cursor: pointer; 29 | opacity: 0.7; 30 | } 31 | 32 | &.can-slide:hover { 33 | opacity: 1; 34 | } 35 | } 36 | } 37 | 38 | .slides { 39 | overflow: hidden; 40 | position: relative; 41 | height: 100%; 42 | } 43 | 44 | .slides-content { 45 | position: absolute; 46 | top: 0; 47 | left: 0; 48 | width: 400%; 49 | } 50 | 51 | .item-container { 52 | float: left; 53 | width: 5%; 54 | 55 | & > .square-panel { 56 | width: 80%; 57 | margin: 0; 58 | } 59 | } 60 | } 61 | 62 | 63 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/scss/global/_icons.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Spotmop 3 | * Icons 4 | **/ 5 | 6 | .si { 7 | display: inline-block; 8 | width: 16px; 9 | height: 16px; 10 | background-position: 50% 50%; 11 | background-repeat: no-repeat; 12 | vertical-align: top; 13 | margin-top: 2px; 14 | margin-right: 5px; 15 | padding: 0; 16 | background-size: contain; 17 | } 18 | 19 | .si.doublesize { 20 | width: 32px; 21 | height: 32px; 22 | } 23 | 24 | .si.play { background-image: url('assets/icons/play.svg'); } 25 | .si.compass { background-image: url('assets/icons/compass.svg'); } 26 | .si.playlist { background-image: url('assets/icons/playlist.svg'); } 27 | .si.music { background-image: url('assets/icons/music.svg'); } 28 | .si.cog { background-image: url('assets/icons/cog.svg'); } 29 | .si.folder { background-image: url('assets/icons/folder.svg'); } 30 | .si.leaf { background-image: url('assets/icons/leaf.svg'); } 31 | .si.star { background-image: url('assets/icons/star.svg'); } 32 | .si.mic { background-image: url('assets/icons/mic.svg'); } 33 | .si.cd { background-image: url('assets/icons/cd.svg'); } 34 | .si.grid { background-image: url('assets/icons/grid.svg'); } 35 | .si.search { background-image: url('assets/icons/search.svg'); } 36 | .si.chevron-right { background-image: url('assets/icons/chevron-right.svg'); } 37 | .si.chevron-left { background-image: url('assets/icons/chevron-left.svg'); } 38 | .si.sections { background-image: url('assets/icons/sections.svg'); } 39 | .si.list { background-image: url('assets/icons/list.svg'); } 40 | .si.spotify { background-image: url('assets/icons/spotify.svg'); } 41 | .si.soundcloud { background-image: url('assets/icons/soundcloud.svg'); } 42 | .si.local { background-image: url('assets/icons/local.svg'); } 43 | .si.filter { background-image: url('assets/icons/filter.svg'); } 44 | 45 | .si.white { 46 | -webkit-filter: invert(1); 47 | -moz-filter: invert(1); 48 | filter: invert(1); 49 | } 50 | 51 | @media ( max-width: 800px ){ 52 | .si.mobile-white { 53 | -webkit-filter: invert(1); 54 | -moz-filter: invert(1); 55 | filter: invert(1); 56 | } 57 | } 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/scss/global/_touch-devices.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * touchDevice specific elements 3 | * This is how we show touch-friendly track selection and context menus, etc 4 | * 5 | * Spotmop 6 | **/ 7 | 8 | 9 | 10 | /** 11 | * Player 12 | **/ 13 | 14 | .touchDevice #full-player .volume, 15 | .touchDevice #player .volume.touch-friendly { 16 | display: inline-block; 17 | } 18 | 19 | #app:not(.touchDevice) #player .volume.touch-friendly, 20 | .touchDevice #player .volume:not(.touch-friendly) { 21 | display: none; 22 | } 23 | 24 | 25 | 26 | /** 27 | * Tracklist context menu 28 | **/ 29 | 30 | .touchDevice .tracklist .track { 31 | padding-left: 30px; 32 | } 33 | 34 | .tracklist .track .selected-state { 35 | display: none; 36 | } 37 | 38 | .touchDevice .tracklist .track .selected-state { 39 | display: block; 40 | width: 10px; 41 | position: absolute; 42 | top: 2px; 43 | left: 0; 44 | padding: 10px; 45 | font-size: 14px; 46 | } 47 | 48 | .tracklist-context-menu { 49 | background: rgba(50,50,50,0.95); 50 | color: #FFFFFF; 51 | z-index: 9; 52 | position: fixed; 53 | top: 0; 54 | right: 0; 55 | left: 0; 56 | box-shadow: 0px 2px 10px rgba(0,0,0,0.5); 57 | } 58 | 59 | .tracklist-context-menu .menu-item:first-child { 60 | margin-left: 6px; 61 | } 62 | 63 | .tracklist-context-menu .menu-item { 64 | display: block; 65 | float: left; 66 | text-align: center; 67 | padding: 20px 16px; 68 | margin-right: 5px; 69 | font-weight: bold; 70 | text-transform: uppercase; 71 | cursor: pointer; 72 | } 73 | 74 | .tracklist-context-menu .menu-item .fa { 75 | display: block; 76 | font-size: 16px; 77 | } 78 | 79 | .tracklist-context-menu .menu-item .text { 80 | padding-top: 5px; 81 | display: block; 82 | font-size: 10px; 83 | } 84 | 85 | .tracklist-context-menu .menu-item.cancel { 86 | float: right; 87 | opacity: 0.5; 88 | } 89 | 90 | 91 | 92 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/scss/vendor/_fonts.scss: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Archivo Narrow'; 3 | font-weight: 400; 4 | font-style: normal; 5 | src: url('assets/fonts/Archivo-Narrow-regular.eot'); 6 | src: url('assets/fonts/Archivo-Narrow-regular.eot?#iefix') format('embedded-opentype'), 7 | local('Archivo Narrow Regular'), 8 | local('Archivo-Narrow-regular'), 9 | url('assets/fonts/Archivo-Narrow-regular.woff2') format('woff2'), 10 | url('assets/fonts/Archivo-Narrow-regular.woff') format('woff'), 11 | url('assets/fonts/Archivo-Narrow-regular.ttf') format('truetype'), 12 | url('assets/fonts/Archivo-Narrow-regular.svg#ArchivoNarrow') format('svg'); 13 | } 14 | 15 | @font-face { 16 | font-family: 'Archivo Narrow'; 17 | font-weight: 700; 18 | font-style: normal; 19 | src: url('assets/fonts/Archivo-Narrow-700.eot'); 20 | src: url('assets/fonts/Archivo-Narrow-700.eot?#iefix') format('embedded-opentype'), 21 | local('Archivo Narrow Bold'), 22 | local('Archivo-Narrow-700'), 23 | url('assets/fonts/Archivo-Narrow-700.woff2') format('woff2'), 24 | url('assets/fonts/Archivo-Narrow-700.woff') format('woff'), 25 | url('assets/fonts/Archivo-Narrow-700.ttf') format('truetype'), 26 | url('assets/fonts/Archivo-Narrow-700.svg#ArchivoNarrow') format('svg'); 27 | } 28 | 29 | @font-face { 30 | font-family: 'Roboto'; 31 | font-weight: 400; 32 | font-style: normal; 33 | src: url('assets/fonts/Roboto-regular.eot'); 34 | src: url('assets/fonts/Roboto-regular.eot?#iefix') format('embedded-opentype'), 35 | local('Roboto'), 36 | local('Roboto-regular'), 37 | url('assets/fonts/Roboto-regular.woff2') format('woff2'), 38 | url('assets/fonts/Roboto-regular.woff') format('woff'), 39 | url('assets/fonts/Roboto-regular.ttf') format('truetype'), 40 | url('assets/fonts/Roboto-regular.svg#Roboto') format('svg'); 41 | } 42 | -------------------------------------------------------------------------------- /mopidy_spotmop/static/vendor/angular-storage.min.js: -------------------------------------------------------------------------------- 1 | /*! ngStorage 0.3.0 | Copyright (c) 2013 Gias Kay Lee | MIT License */"use strict";!function(){function a(a){return["$rootScope","$window",function(b,c){for(var d,e,f,g=c[a]||(console.warn("This browser does not support Web Storage!"),{}),h={$default:function(a){for(var b in a)angular.isDefined(h[b])||(h[b]=a[b]);return h},$reset:function(a){for(var b in h)"$"===b[0]||delete h[b];return h.$default(a)}},i=0;i= 3.3', 24 | 'pylast', 25 | 'spotipy', 26 | 'Mopidy >= 2.0', 27 | 'Mopidy-Local-Images >= 1.0', 28 | 'ConfigObj' 29 | ], 30 | classifiers=[ 31 | 'Environment :: No Input/Output (Daemon)', 32 | 'Intended Audience :: End Users/Desktop', 33 | 'License :: OSI Approved :: Apache Software License', 34 | 'Operating System :: OS Independent', 35 | 'Programming Language :: Python :: 2', 36 | 'Topic :: Multimedia :: Sound/Audio :: Players', 37 | ], 38 | entry_points={ 39 | 'mopidy.ext': [ 40 | 'spotmop = mopidy_spotmop:SpotmopExtension', 41 | ], 42 | }, 43 | ) 44 | -------------------------------------------------------------------------------- /src/app/browse/artist/biography.template.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Biography

4 |
5 | 6 |
7 |

8 | Origin: 9 |

10 |

11 | Published: 12 |

13 |
14 | 15 |
-------------------------------------------------------------------------------- /src/app/browse/artist/overview.template.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Top tracks

4 | 5 | 6 |
7 | 8 |
9 | 10 |

Related Artists

11 | 12 | 28 | 29 |
30 | 31 |
32 | 33 |

Albums

34 | 35 |
36 | 62 |
63 | 64 |
-------------------------------------------------------------------------------- /src/app/browse/artist/related.template.html: -------------------------------------------------------------------------------- 1 |

Related Artists

2 | 3 |
4 | 17 |
18 |
19 | 20 |
21 | No items 22 |
-------------------------------------------------------------------------------- /src/app/browse/controller.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('spotmop.browse', []) 4 | 5 | /** 6 | * Routing 7 | **/ 8 | .config(function($stateProvider) { 9 | $stateProvider 10 | .state('browse', { 11 | url: "/browse", 12 | templateUrl: "app/browse/template.html" 13 | }); 14 | }); -------------------------------------------------------------------------------- /src/app/browse/featured/controller.js: -------------------------------------------------------------------------------- 1 | angular.module('spotmop.browse.featured', []) 2 | 3 | /** 4 | * Routing 5 | **/ 6 | .config(function($stateProvider) { 7 | $stateProvider 8 | .state('browse.featured', { 9 | url: "/featured", 10 | templateUrl: "app/browse/featured/template.html", 11 | controller: 'FeaturedController' 12 | }) 13 | .state('browse.featuredplaylist', { 14 | url: "/featured/:uri", 15 | templateUrl: "app/browse/playlist/template.html", 16 | controller: 'PlaylistController' 17 | }); 18 | }) 19 | 20 | /** 21 | * Main controller 22 | **/ 23 | .controller('FeaturedController', function FeaturedController( $scope, $rootScope, $filter, SpotifyService, NotifyService ){ 24 | 25 | // set the default items 26 | $scope.playlists = []; 27 | $scope.featured = function(){ 28 | return $scope.playlists[0]; 29 | } 30 | 31 | // figure out the most appropriate background image to show (based on current local time) 32 | $scope.partofday = function(){ 33 | 34 | // convert to decimal (remembering that minutes are base-6) 35 | var hour = parseFloat($filter('date')(new Date(),'H.m')); 36 | 37 | if( hour >= 4 && hour < 9.3 ) 38 | return 'commute'; 39 | else if( hour >= 9.3 && hour < 11 ) 40 | return 'morning'; 41 | else if( hour >= 11 && hour < 13.5 ) 42 | return 'midday'; 43 | else if( hour >= 13.5 && hour < 17 ) 44 | return 'afternoon'; 45 | else if( hour >= 17 && hour < 19 ) 46 | return 'evening'; 47 | else if( hour >= 19 && hour < 21 ) 48 | return 'dinner'; 49 | else if( hour >= 21 && hour < 23 || hour >= 0 && hour < 4 ) 50 | return 'late'; 51 | }; 52 | 53 | SpotifyService.featuredPlaylists( 50 ) 54 | .then(function( response ) { 55 | $scope.message = response.message; 56 | $scope.playlists = response.playlists.items; 57 | }); 58 | }); -------------------------------------------------------------------------------- /src/app/browse/featured/template.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/browse/genre/category.template.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 14 | 15 |
16 | 17 | 33 | 34 |
35 | No items 36 |
37 | 38 |
39 | 40 |
41 | 42 |
43 |
-------------------------------------------------------------------------------- /src/app/browse/genre/template.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 14 | 15 |
16 | 17 | 25 | 26 |
27 | No items 28 |
29 | 30 |
31 | 32 |
33 | 34 |
35 |
-------------------------------------------------------------------------------- /src/app/browse/new/controller.js: -------------------------------------------------------------------------------- 1 | angular.module('spotmop.browse.new', []) 2 | 3 | /** 4 | * Routing 5 | **/ 6 | .config(function($stateProvider) { 7 | $stateProvider 8 | .state('browse.new', { 9 | url: "/new", 10 | templateUrl: "app/browse/new/template.html", 11 | controller: 'NewController' 12 | }) 13 | .state('browse.newalbum', { 14 | url: "/new/:uri", 15 | templateUrl: "app/browse/album/template.html", 16 | controller: 'AlbumController' 17 | }); 18 | }) 19 | 20 | /** 21 | * Main controller 22 | **/ 23 | .controller('NewController', function NewController( $scope, $element, $rootScope, SpotifyService, MopidyService ){ 24 | 25 | // set the default items 26 | $scope.albums = []; 27 | 28 | SpotifyService.newReleases() 29 | .then(function( response ) { 30 | $scope.albums = response.albums; 31 | $scope.checkForLazyLoading(); 32 | }); 33 | 34 | var nextOffset = 50; 35 | 36 | 37 | /** 38 | * Load more of the category's playlists 39 | * Triggered by scrolling to the bottom 40 | **/ 41 | 42 | var loadingMoreNewReleases = false; 43 | 44 | // go off and get more of this playlist's tracks 45 | function loadMoreNewReleases( offset ){ 46 | 47 | // update our switch to prevent spamming for every scroll event 48 | loadingMoreNewReleases = true; 49 | 50 | // go get our 'next' URL 51 | SpotifyService.newReleases( false, offset ) 52 | .then(function( response ){ 53 | 54 | // append these new tracks to the main tracklist 55 | $scope.albums.items = $scope.albums.items.concat( response.albums.items ); 56 | 57 | // save the next set's url (if it exists) 58 | nextOffset = response.albums.offset + response.albums.limit; 59 | 60 | // update loader and re-open for further pagination objects 61 | loadingMoreNewReleases = false; 62 | }); 63 | } 64 | 65 | // once we're told we're ready to load more albums 66 | $scope.$on('spotmop:loadMore', function(){ 67 | if( !loadingMoreNewReleases && nextOffset ){ 68 | loadMoreNewReleases( nextOffset ); 69 | } 70 | }); 71 | 72 | }); -------------------------------------------------------------------------------- /src/app/browse/new/template.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 14 | 15 |
16 | 17 | 37 | 38 |
39 | No items 40 |
41 | 42 |
43 | 44 |
45 | 46 |
47 |
-------------------------------------------------------------------------------- /src/app/browse/template.html: -------------------------------------------------------------------------------- 1 |
-------------------------------------------------------------------------------- /src/app/browse/user/controller.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('spotmop.browse.user', []) 4 | 5 | /** 6 | * Routing 7 | **/ 8 | .config(function($stateProvider) { 9 | $stateProvider 10 | .state('browse.user', { 11 | url: "/user/:uri", 12 | templateUrl: "app/browse/user/template.html", 13 | controller: 'UserController' 14 | }); 15 | }) 16 | 17 | /** 18 | * Main controller 19 | **/ 20 | .controller('UserController', function UserController( $scope, $rootScope, SpotifyService, $stateParams ){ 21 | 22 | $scope.user = {}; 23 | $scope.playlists = []; 24 | 25 | // get the user 26 | SpotifyService.getUser( $stateParams.uri ) 27 | .then(function( response ) { 28 | $scope.user = response; 29 | 30 | // get their playlists 31 | SpotifyService.getPlaylists( response.id ) 32 | .then(function( response ) { 33 | $scope.playlists = response.items; 34 | $scope.next = response.next; 35 | $scope.totalPlaylists = response.total; 36 | }); 37 | }); 38 | 39 | /** 40 | * Load more of the user's playlists 41 | * Triggered by scrolling to the bottom 42 | **/ 43 | 44 | var loadingMorePlaylists = false; 45 | 46 | // go off and get more of this playlist's tracks 47 | function loadMorePlaylists( $nextUrl ){ 48 | 49 | if( typeof( $nextUrl ) === 'undefined' ) 50 | return false; 51 | 52 | // update our switch to prevent spamming for every scroll event 53 | loadingMorePlaylists = true; 54 | 55 | // go get our 'next' URL 56 | SpotifyService.getUrl( $nextUrl ) 57 | .then(function( response ){ 58 | 59 | // append these new playlists to our existing array 60 | $scope.playlists = $scope.playlists.concat( response.items ); 61 | 62 | // save the next set's url (if it exists) 63 | $scope.next = response.next; 64 | 65 | // update loader and re-open for further pagination objects 66 | loadingMorePlaylists = false; 67 | }); 68 | } 69 | 70 | // once we're told we're ready to load more albums 71 | $scope.$on('spotmop:loadMore', function(){ 72 | if( !loadingMorePlaylists && typeof( $scope.next ) !== 'undefined' && $scope.next ){ 73 | loadMorePlaylists( $scope.next ); 74 | } 75 | }); 76 | }); -------------------------------------------------------------------------------- /src/app/browse/user/template.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 8 | 9 |
10 |
11 | 12 |
13 |
14 |

15 | 16 | 17 | You 18 |

19 |
20 | 21 |  |  Playlists 22 |  |  {{ user.followers.total | number:0 }} Followers 23 |
24 |
25 |
26 |
27 | 28 | 29 |

Playlists

30 | 31 |
32 | 33 | 44 | 45 |
46 | No items 47 |
48 | 49 |
50 | 51 |
52 | 53 |
54 |
-------------------------------------------------------------------------------- /src/app/common/artistlist.template.html: -------------------------------------------------------------------------------- 1 | 2 | and , 3 | and , 4 | -------------------------------------------------------------------------------- /src/app/common/dropdown-field.template.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/common/genrelist.template.html: -------------------------------------------------------------------------------- 1 | 2 | and , 3 | -------------------------------------------------------------------------------- /src/app/common/thumbnail.template.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
-------------------------------------------------------------------------------- /src/app/common/tracklist/template.html: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 |
7 | No items 8 |
-------------------------------------------------------------------------------- /src/app/common/tracklist/track.template.html: -------------------------------------------------------------------------------- 1 |
8 | 9 |
10 | 11 | 12 |
13 | 14 |
19 |
23 |
27 | 28 |
29 | 30 |
31 | 32 |
33 | 34 | 35 |
36 | 37 |
38 | 39 | 40 | {{ track.duration_ms | formatMilliseconds }} 41 | {{ track.length | formatMilliseconds }} 42 | 43 | 44 |
45 | 46 | 47 | 48 | % 49 |
50 | 51 |
52 | 53 |
54 | 55 |
56 | 57 |
58 | 59 |
-------------------------------------------------------------------------------- /src/app/discover/recommendations.template.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 | 6 | 22 | 23 |
24 |

25 | Because you're listening to 26 | 27 |

28 | 29 |
30 | 31 |
32 |

33 | {{ section.title }} 34 | 35 |

36 | 37 |
38 | 39 |
40 |

41 | Some old favorites 42 |

43 | 44 |
45 | 46 |
47 | 48 |
49 |
-------------------------------------------------------------------------------- /src/app/discover/similar.template.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 | 6 | 16 | 17 |

18 | Tracks similar to: 19 | and , 20 |

21 | 22 | 23 | 24 |
25 | 26 |
27 |
-------------------------------------------------------------------------------- /src/app/discover/template.html: -------------------------------------------------------------------------------- 1 |
-------------------------------------------------------------------------------- /src/app/library/template.html: -------------------------------------------------------------------------------- 1 |
-------------------------------------------------------------------------------- /src/app/library/tracks.template.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 20 | 21 | 22 | 23 |
24 |
-------------------------------------------------------------------------------- /src/app/local/directory.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 22 | 23 | 34 | 35 | 36 | 37 |
38 |
-------------------------------------------------------------------------------- /src/app/local/index.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 16 | 17 |
18 | 19 | 27 | 28 | 36 | 37 | 45 | 46 |
47 | 48 |
49 | 50 |
51 |
-------------------------------------------------------------------------------- /src/app/local/template.html: -------------------------------------------------------------------------------- 1 |
-------------------------------------------------------------------------------- /src/app/player/template.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 |
6 | 7 | , 8 | 9 |
10 |
11 | 12 |
13 |
14 | 15 | 16 | 17 | 18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 | 26 |
27 |
28 | 29 | 30 | 31 |
32 |
33 | 34 |
35 |
36 | 37 | 38 | 39 | 40 | 41 | 42 |
43 |
44 | 45 |
46 | 47 |
48 |
49 |
50 |
51 |
52 | 53 |
54 | 55 |
56 | 57 |
-------------------------------------------------------------------------------- /src/app/services/dialog/addbyuri.template.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Add by URI

4 |
Add an album, artist, playlist or track as a URI (ie spotify:track:123)
5 | 6 |
7 | 8 |
9 | 10 | Unable to add this URI 11 |
12 | 13 |
14 | 15 |   Add 16 | 17 | 18 | 19 | 20 |
21 | 22 |
23 | 24 |
-------------------------------------------------------------------------------- /src/app/services/dialog/addtoplaylist.template.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Select playlist

4 | 5 |
6 |
7 |
8 |
9 |
10 | 11 |
-------------------------------------------------------------------------------- /src/app/services/dialog/createplaylist.template.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Create playlist

4 | 5 |
6 | 7 |
8 | 9 | Please enter a title 10 |
11 | 12 |
13 | 17 | 21 |
22 |
23 | 24 |
25 | 29 | 33 | 37 |
38 |
39 | 40 |
41 | 44 | 45 | 46 | 47 |
48 | 49 |
50 | 51 |
-------------------------------------------------------------------------------- /src/app/services/dialog/editplaylist.template.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Edit playlist

4 | 5 |
6 | 7 |
8 | 9 | Please enter a title 10 |
11 | 12 |
13 | 17 | 21 |
22 |
23 | 24 |
25 | 28 | 29 | 30 | 31 |
32 | 33 |
34 | 35 |
-------------------------------------------------------------------------------- /src/app/services/dialog/template.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 5 | 6 |
7 | 8 |
9 |
-------------------------------------------------------------------------------- /src/app/services/dialog/volumecontrols.template.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Adjust volume

4 | 5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 | 15 |
-------------------------------------------------------------------------------- /src/app/services/notify/template.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 5 | 6 |
7 | 8 |
9 |
-------------------------------------------------------------------------------- /src/app/settings/testing.template.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 14 | 15 |

Server requests

16 |
17 | 18 |
19 |
Method
20 |
21 | 22 |
23 |
24 | 25 |
26 |
Payload (JSON string)
27 |
28 | 29 |
30 |
31 | 32 |
33 |
34 |
35 | 36 |
37 |
38 | 39 |
40 | 41 |

Pusher connection

42 |
43 | 44 |
45 |
Payload (JSON string)
46 |
47 | 48 |
49 |
50 | 51 |
52 |
53 |
54 | 55 |
56 |
57 | 58 |
59 | 60 |

Response

61 |

62 |         
63 | 	
64 |
-------------------------------------------------------------------------------- /src/assets/backgrounds/afternoon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/backgrounds/afternoon.jpg -------------------------------------------------------------------------------- /src/assets/backgrounds/category-albums.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/backgrounds/category-albums.jpg -------------------------------------------------------------------------------- /src/assets/backgrounds/category-artists.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/backgrounds/category-artists.jpg -------------------------------------------------------------------------------- /src/assets/backgrounds/category-directory.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/backgrounds/category-directory.jpg -------------------------------------------------------------------------------- /src/assets/backgrounds/commute.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/backgrounds/commute.jpg -------------------------------------------------------------------------------- /src/assets/backgrounds/dinner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/backgrounds/dinner.jpg -------------------------------------------------------------------------------- /src/assets/backgrounds/evening.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/backgrounds/evening.jpg -------------------------------------------------------------------------------- /src/assets/backgrounds/late.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/backgrounds/late.jpg -------------------------------------------------------------------------------- /src/assets/backgrounds/midday.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/backgrounds/midday.jpg -------------------------------------------------------------------------------- /src/assets/backgrounds/morning.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/backgrounds/morning.jpg -------------------------------------------------------------------------------- /src/assets/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/favicon.ico -------------------------------------------------------------------------------- /src/assets/favicon.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/favicon.psd -------------------------------------------------------------------------------- /src/assets/fonts/Archivo-Narrow-700.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/fonts/Archivo-Narrow-700.eot -------------------------------------------------------------------------------- /src/assets/fonts/Archivo-Narrow-700.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/fonts/Archivo-Narrow-700.ttf -------------------------------------------------------------------------------- /src/assets/fonts/Archivo-Narrow-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/fonts/Archivo-Narrow-700.woff -------------------------------------------------------------------------------- /src/assets/fonts/Archivo-Narrow-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/fonts/Archivo-Narrow-700.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/Archivo-Narrow-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/fonts/Archivo-Narrow-regular.eot -------------------------------------------------------------------------------- /src/assets/fonts/Archivo-Narrow-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/fonts/Archivo-Narrow-regular.ttf -------------------------------------------------------------------------------- /src/assets/fonts/Archivo-Narrow-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/fonts/Archivo-Narrow-regular.woff -------------------------------------------------------------------------------- /src/assets/fonts/Archivo-Narrow-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/fonts/Archivo-Narrow-regular.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /src/assets/fonts/Roboto-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/fonts/Roboto-regular.eot -------------------------------------------------------------------------------- /src/assets/fonts/Roboto-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/fonts/Roboto-regular.ttf -------------------------------------------------------------------------------- /src/assets/fonts/Roboto-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/fonts/Roboto-regular.woff -------------------------------------------------------------------------------- /src/assets/fonts/Roboto-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/fonts/Roboto-regular.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /src/assets/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /src/assets/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /src/assets/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /src/assets/icons/cd.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 10 | 11 | 12 | 15 | 16 | 18 | 20 | 21 | -------------------------------------------------------------------------------- /src/assets/icons/chevron-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 8 | 9 | -------------------------------------------------------------------------------- /src/assets/icons/chevron-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 8 | 9 | -------------------------------------------------------------------------------- /src/assets/icons/close-black.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/assets/icons/close-white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/assets/icons/cog.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 11 | 12 | 13 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/assets/icons/compass.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 11 | 12 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/assets/icons/filter.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /src/assets/icons/folder.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/assets/icons/grid.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/assets/icons/icons-single.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/icons/icons-single.ai -------------------------------------------------------------------------------- /src/assets/icons/icons.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaedb/spotmop/7f8c20117773c883cff11a2ececdd7f8409c0b96/src/assets/icons/icons.ai -------------------------------------------------------------------------------- /src/assets/icons/leaf.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /src/assets/icons/list.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/assets/icons/local.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 8 | 9 | -------------------------------------------------------------------------------- /src/assets/icons/mic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 9 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/assets/icons/music.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 10 | 11 | -------------------------------------------------------------------------------- /src/assets/icons/play.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/assets/icons/playlist.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/assets/icons/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/assets/icons/sections.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/assets/icons/soundcloud.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 21 | 22 | -------------------------------------------------------------------------------- /src/assets/icons/spotify.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 14 | 15 | -------------------------------------------------------------------------------- /src/assets/icons/star.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/assets/svg/blur.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/svg/local.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 8 | 9 | -------------------------------------------------------------------------------- /src/assets/svg/no-image.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/assets/svg/soundcloud.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 20 | 21 | -------------------------------------------------------------------------------- /src/assets/svg/spinner-black.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/assets/svg/spinner-white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /src/assets/svg/spinner.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 11 | -------------------------------------------------------------------------------- /src/assets/svg/spotify.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 14 | 15 | -------------------------------------------------------------------------------- /src/assets/svg/white-diamond.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/scss/app.scss: -------------------------------------------------------------------------------- 1 | 2 | @import 'global/core'; 3 | @import 'global/forms'; 4 | @import 'global/icons'; 5 | @import 'global/touch-devices'; 6 | 7 | @import 'components/tracklist'; 8 | @import 'components/context-menu'; 9 | @import 'components/loading-bar'; 10 | @import 'components/dialog'; 11 | @import 'components/player'; 12 | @import 'components/slider'; 13 | 14 | @import 'global/responsive'; 15 | 16 | @import 'vendor/font-awesome'; 17 | @import 'vendor/fonts'; 18 | 19 | -------------------------------------------------------------------------------- /src/scss/components/_loading-bar.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * angular-loading-bar v0.8.0 3 | * https://chieffancypants.github.io/angular-loading-bar 4 | * Copyright (c) 2015 Wes Cruver 5 | * License: MIT 6 | */ 7 | 8 | /* Make clicks pass-through */ 9 | #loading-bar, 10 | #loading-bar-spinner { 11 | pointer-events: none; 12 | -webkit-pointer-events: none; 13 | -webkit-transition: 350ms linear all; 14 | -moz-transition: 350ms linear all; 15 | -o-transition: 350ms linear all; 16 | transition: 350ms linear all; 17 | } 18 | 19 | #loading-bar-spinner.ng-enter, 20 | #loading-bar-spinner.ng-leave.ng-leave-active { 21 | opacity: 0; 22 | } 23 | 24 | #loading-bar-spinner.ng-enter.ng-enter-active, 25 | #loading-bar-spinner.ng-leave { 26 | opacity: 1; 27 | } 28 | 29 | #loading-bar-spinner { 30 | display: block; 31 | position: fixed; 32 | z-index: 10002; 33 | top: 10px; 34 | left: 10px; 35 | } 36 | 37 | #loading-bar-spinner .spinner-icon { 38 | width: 14px; 39 | height: 14px; 40 | 41 | border: solid 2px transparent; 42 | border-top-color: #29d; 43 | border-left-color: #29d; 44 | border-radius: 50%; 45 | 46 | -webkit-animation: loading-bar-spinner 400ms linear infinite; 47 | -moz-animation: loading-bar-spinner 400ms linear infinite; 48 | -ms-animation: loading-bar-spinner 400ms linear infinite; 49 | -o-animation: loading-bar-spinner 400ms linear infinite; 50 | animation: loading-bar-spinner 400ms linear infinite; 51 | } 52 | 53 | @-webkit-keyframes loading-bar-spinner { 54 | 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 55 | 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } 56 | } 57 | @-moz-keyframes loading-bar-spinner { 58 | 0% { -moz-transform: rotate(0deg); transform: rotate(0deg); } 59 | 100% { -moz-transform: rotate(360deg); transform: rotate(360deg); } 60 | } 61 | @-o-keyframes loading-bar-spinner { 62 | 0% { -o-transform: rotate(0deg); transform: rotate(0deg); } 63 | 100% { -o-transform: rotate(360deg); transform: rotate(360deg); } 64 | } 65 | @-ms-keyframes loading-bar-spinner { 66 | 0% { -ms-transform: rotate(0deg); transform: rotate(0deg); } 67 | 100% { -ms-transform: rotate(360deg); transform: rotate(360deg); } 68 | } 69 | @keyframes loading-bar-spinner { 70 | 0% { transform: rotate(0deg); transform: rotate(0deg); } 71 | 100% { transform: rotate(360deg); transform: rotate(360deg); } 72 | } 73 | -------------------------------------------------------------------------------- /src/scss/components/_slider.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Sliders 3 | * Side-scrolling content (ie discover sections) 4 | **/ 5 | 6 | slider { 7 | height: 250px; 8 | display: block; 9 | position: relative; 10 | margin-bottom: 40px; 11 | 12 | &.square-panels { 13 | margin-left: 0; 14 | margin-right: -40px; 15 | } 16 | 17 | .controls { 18 | position: absolute; 19 | top: -40px; 20 | right: 20px; 21 | z-index: 5; 22 | 23 | .si { 24 | margin: 5px; 25 | opacity: 0.2; 26 | 27 | &.can-slide { 28 | cursor: pointer; 29 | opacity: 0.7; 30 | } 31 | 32 | &.can-slide:hover { 33 | opacity: 1; 34 | } 35 | } 36 | } 37 | 38 | .slides { 39 | overflow: hidden; 40 | position: relative; 41 | height: 100%; 42 | } 43 | 44 | .slides-content { 45 | position: absolute; 46 | top: 0; 47 | left: 0; 48 | width: 400%; 49 | } 50 | 51 | .item-container { 52 | float: left; 53 | width: 5%; 54 | 55 | & > .square-panel { 56 | width: 80%; 57 | margin: 0; 58 | } 59 | } 60 | } 61 | 62 | 63 | -------------------------------------------------------------------------------- /src/scss/global/_icons.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Spotmop 3 | * Icons 4 | **/ 5 | 6 | .si { 7 | display: inline-block; 8 | width: 16px; 9 | height: 16px; 10 | background-position: 50% 50%; 11 | background-repeat: no-repeat; 12 | vertical-align: top; 13 | margin-top: 2px; 14 | margin-right: 5px; 15 | padding: 0; 16 | background-size: contain; 17 | } 18 | 19 | .si.doublesize { 20 | width: 32px; 21 | height: 32px; 22 | } 23 | 24 | .si.play { background-image: url('assets/icons/play.svg'); } 25 | .si.compass { background-image: url('assets/icons/compass.svg'); } 26 | .si.playlist { background-image: url('assets/icons/playlist.svg'); } 27 | .si.music { background-image: url('assets/icons/music.svg'); } 28 | .si.cog { background-image: url('assets/icons/cog.svg'); } 29 | .si.folder { background-image: url('assets/icons/folder.svg'); } 30 | .si.leaf { background-image: url('assets/icons/leaf.svg'); } 31 | .si.star { background-image: url('assets/icons/star.svg'); } 32 | .si.mic { background-image: url('assets/icons/mic.svg'); } 33 | .si.cd { background-image: url('assets/icons/cd.svg'); } 34 | .si.grid { background-image: url('assets/icons/grid.svg'); } 35 | .si.search { background-image: url('assets/icons/search.svg'); } 36 | .si.chevron-right { background-image: url('assets/icons/chevron-right.svg'); } 37 | .si.chevron-left { background-image: url('assets/icons/chevron-left.svg'); } 38 | .si.sections { background-image: url('assets/icons/sections.svg'); } 39 | .si.list { background-image: url('assets/icons/list.svg'); } 40 | .si.spotify { background-image: url('assets/icons/spotify.svg'); } 41 | .si.soundcloud { background-image: url('assets/icons/soundcloud.svg'); } 42 | .si.local { background-image: url('assets/icons/local.svg'); } 43 | .si.filter { background-image: url('assets/icons/filter.svg'); } 44 | 45 | .si.white { 46 | -webkit-filter: invert(1); 47 | -moz-filter: invert(1); 48 | filter: invert(1); 49 | } 50 | 51 | @media ( max-width: 800px ){ 52 | .si.mobile-white { 53 | -webkit-filter: invert(1); 54 | -moz-filter: invert(1); 55 | filter: invert(1); 56 | } 57 | } 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /src/scss/global/_touch-devices.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * touchDevice specific elements 3 | * This is how we show touch-friendly track selection and context menus, etc 4 | * 5 | * Spotmop 6 | **/ 7 | 8 | 9 | 10 | /** 11 | * Player 12 | **/ 13 | 14 | .touchDevice #full-player .volume, 15 | .touchDevice #player .volume.touch-friendly { 16 | display: inline-block; 17 | } 18 | 19 | #app:not(.touchDevice) #player .volume.touch-friendly, 20 | .touchDevice #player .volume:not(.touch-friendly) { 21 | display: none; 22 | } 23 | 24 | 25 | 26 | /** 27 | * Tracklist context menu 28 | **/ 29 | 30 | .touchDevice .tracklist .track { 31 | padding-left: 30px; 32 | } 33 | 34 | .tracklist .track .selected-state { 35 | display: none; 36 | } 37 | 38 | .touchDevice .tracklist .track .selected-state { 39 | display: block; 40 | width: 10px; 41 | position: absolute; 42 | top: 2px; 43 | left: 0; 44 | padding: 10px; 45 | font-size: 14px; 46 | } 47 | 48 | .tracklist-context-menu { 49 | background: rgba(50,50,50,0.95); 50 | color: #FFFFFF; 51 | z-index: 9; 52 | position: fixed; 53 | top: 0; 54 | right: 0; 55 | left: 0; 56 | box-shadow: 0px 2px 10px rgba(0,0,0,0.5); 57 | } 58 | 59 | .tracklist-context-menu .menu-item:first-child { 60 | margin-left: 6px; 61 | } 62 | 63 | .tracklist-context-menu .menu-item { 64 | display: block; 65 | float: left; 66 | text-align: center; 67 | padding: 20px 16px; 68 | margin-right: 5px; 69 | font-weight: bold; 70 | text-transform: uppercase; 71 | cursor: pointer; 72 | } 73 | 74 | .tracklist-context-menu .menu-item .fa { 75 | display: block; 76 | font-size: 16px; 77 | } 78 | 79 | .tracklist-context-menu .menu-item .text { 80 | padding-top: 5px; 81 | display: block; 82 | font-size: 10px; 83 | } 84 | 85 | .tracklist-context-menu .menu-item.cancel { 86 | float: right; 87 | opacity: 0.5; 88 | } 89 | 90 | 91 | 92 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /src/scss/vendor/_fonts.scss: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Archivo Narrow'; 3 | font-weight: 400; 4 | font-style: normal; 5 | src: url('assets/fonts/Archivo-Narrow-regular.eot'); 6 | src: url('assets/fonts/Archivo-Narrow-regular.eot?#iefix') format('embedded-opentype'), 7 | local('Archivo Narrow Regular'), 8 | local('Archivo-Narrow-regular'), 9 | url('assets/fonts/Archivo-Narrow-regular.woff2') format('woff2'), 10 | url('assets/fonts/Archivo-Narrow-regular.woff') format('woff'), 11 | url('assets/fonts/Archivo-Narrow-regular.ttf') format('truetype'), 12 | url('assets/fonts/Archivo-Narrow-regular.svg#ArchivoNarrow') format('svg'); 13 | } 14 | 15 | @font-face { 16 | font-family: 'Archivo Narrow'; 17 | font-weight: 700; 18 | font-style: normal; 19 | src: url('assets/fonts/Archivo-Narrow-700.eot'); 20 | src: url('assets/fonts/Archivo-Narrow-700.eot?#iefix') format('embedded-opentype'), 21 | local('Archivo Narrow Bold'), 22 | local('Archivo-Narrow-700'), 23 | url('assets/fonts/Archivo-Narrow-700.woff2') format('woff2'), 24 | url('assets/fonts/Archivo-Narrow-700.woff') format('woff'), 25 | url('assets/fonts/Archivo-Narrow-700.ttf') format('truetype'), 26 | url('assets/fonts/Archivo-Narrow-700.svg#ArchivoNarrow') format('svg'); 27 | } 28 | 29 | @font-face { 30 | font-family: 'Roboto'; 31 | font-weight: 400; 32 | font-style: normal; 33 | src: url('assets/fonts/Roboto-regular.eot'); 34 | src: url('assets/fonts/Roboto-regular.eot?#iefix') format('embedded-opentype'), 35 | local('Roboto'), 36 | local('Roboto-regular'), 37 | url('assets/fonts/Roboto-regular.woff2') format('woff2'), 38 | url('assets/fonts/Roboto-regular.woff') format('woff'), 39 | url('assets/fonts/Roboto-regular.ttf') format('truetype'), 40 | url('assets/fonts/Roboto-regular.svg#Roboto') format('svg'); 41 | } 42 | -------------------------------------------------------------------------------- /src/vendor/angular-storage.min.js: -------------------------------------------------------------------------------- 1 | /*! ngStorage 0.3.0 | Copyright (c) 2013 Gias Kay Lee | MIT License */"use strict";!function(){function a(a){return["$rootScope","$window",function(b,c){for(var d,e,f,g=c[a]||(console.warn("This browser does not support Web Storage!"),{}),h={$default:function(a){for(var b in a)angular.isDefined(h[b])||(h[b]=a[b]);return h},$reset:function(a){for(var b in h)"$"===b[0]||delete h[b];return h.$default(a)}},i=0;i