├── .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 |
63 |
64 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/app/browse/artist/related.template.html:
--------------------------------------------------------------------------------
1 | Related Artists
2 |
3 |
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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
33 |
34 |
35 | No items
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/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 |
2 |
3 |
4 |
5 |
6 |
7 |
16 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/app/common/genrelist.template.html:
--------------------------------------------------------------------------------
1 |
2 | and ,
3 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/app/common/thumbnail.template.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
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 |
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 |
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 |
31 |
32 |
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 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
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 |
52 |
53 |
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 |
23 |
24 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/app/services/dialog/addtoplaylist.template.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Select playlist
4 |
5 |
10 |
11 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/app/services/dialog/createplaylist.template.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Create playlist
4 |
5 |
50 |
51 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/app/services/dialog/editplaylist.template.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Edit playlist
4 |
5 |
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 |
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 |
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 |
40 |
41 |
Pusher connection
42 |
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 |
21 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/icons/chevron-left.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/icons/chevron-right.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/icons/close-black.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/icons/close-white.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/icons/cog.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
45 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/icons/compass.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
16 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/icons/filter.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/icons/folder.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
15 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/icons/grid.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
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 |
10 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/icons/list.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
13 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/icons/local.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/icons/mic.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
15 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/icons/music.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/icons/play.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
12 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/icons/playlist.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
13 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/icons/search.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/icons/sections.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
27 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/icons/soundcloud.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
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 |
15 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/icons/star.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
17 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/svg/blur.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/svg/local.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/svg/no-image.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/svg/soundcloud.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
21 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/svg/spinner-black.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/svg/spinner-white.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/svg/spinner.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/svg/spotify.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
15 |
--------------------------------------------------------------------------------
/mopidy_spotmop/static/assets/svg/white-diamond.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
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 |
63 |
64 |
--------------------------------------------------------------------------------
/src/app/browse/artist/related.template.html:
--------------------------------------------------------------------------------
1 | Related Artists
2 |
3 |
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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
33 |
34 |
35 | No items
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/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 |
2 |
3 |
4 |
5 |
6 |
7 |
16 |
--------------------------------------------------------------------------------
/src/app/common/genrelist.template.html:
--------------------------------------------------------------------------------
1 |
2 | and ,
3 |
--------------------------------------------------------------------------------
/src/app/common/thumbnail.template.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/app/common/tracklist/template.html:
--------------------------------------------------------------------------------
1 |
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 |
31 |
32 |
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 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
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 |
52 |
53 |
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 |
23 |
24 |
--------------------------------------------------------------------------------
/src/app/services/dialog/addtoplaylist.template.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Select playlist
4 |
5 |
10 |
11 |
--------------------------------------------------------------------------------
/src/app/services/dialog/createplaylist.template.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Create playlist
4 |
5 |
50 |
51 |
--------------------------------------------------------------------------------
/src/app/services/dialog/editplaylist.template.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Edit playlist
4 |
5 |
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 |
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 |
40 |
41 |
Pusher connection
42 |
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 |
21 |
--------------------------------------------------------------------------------
/src/assets/icons/chevron-left.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
--------------------------------------------------------------------------------
/src/assets/icons/chevron-right.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
--------------------------------------------------------------------------------
/src/assets/icons/close-black.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
--------------------------------------------------------------------------------
/src/assets/icons/close-white.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
--------------------------------------------------------------------------------
/src/assets/icons/cog.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
45 |
--------------------------------------------------------------------------------
/src/assets/icons/compass.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
16 |
--------------------------------------------------------------------------------
/src/assets/icons/filter.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
--------------------------------------------------------------------------------
/src/assets/icons/folder.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
15 |
--------------------------------------------------------------------------------
/src/assets/icons/grid.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
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 |
10 |
--------------------------------------------------------------------------------
/src/assets/icons/list.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
13 |
--------------------------------------------------------------------------------
/src/assets/icons/local.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
--------------------------------------------------------------------------------
/src/assets/icons/mic.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
15 |
--------------------------------------------------------------------------------
/src/assets/icons/music.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
--------------------------------------------------------------------------------
/src/assets/icons/play.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
12 |
--------------------------------------------------------------------------------
/src/assets/icons/playlist.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
13 |
--------------------------------------------------------------------------------
/src/assets/icons/search.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
--------------------------------------------------------------------------------
/src/assets/icons/sections.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
27 |
--------------------------------------------------------------------------------
/src/assets/icons/soundcloud.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
22 |
--------------------------------------------------------------------------------
/src/assets/icons/spotify.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
15 |
--------------------------------------------------------------------------------
/src/assets/icons/star.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
17 |
--------------------------------------------------------------------------------
/src/assets/svg/blur.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/assets/svg/local.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
--------------------------------------------------------------------------------
/src/assets/svg/no-image.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
--------------------------------------------------------------------------------
/src/assets/svg/soundcloud.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
21 |
--------------------------------------------------------------------------------
/src/assets/svg/spinner-black.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
--------------------------------------------------------------------------------
/src/assets/svg/spinner-white.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
--------------------------------------------------------------------------------
/src/assets/svg/spinner.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/assets/svg/spotify.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
15 |
--------------------------------------------------------------------------------
/src/assets/svg/white-diamond.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
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