Giter Site home page Giter Site logo

tchaik / tchaik Goto Github PK

View Code? Open in Web Editor NEW
343.0 21.0 32.0 2 MB

Music organisation and streaming system in Go

License: BSD 2-Clause "Simplified" License

JavaScript 29.49% CSS 7.51% Go 62.70% Shell 0.04% Makefile 0.12% HTML 0.15%
music-library streaming music-organisation go react

tchaik's Introduction

Music organisation and streaming system

Tchaik is an open source music organisation and streaming system. The backend is written in Go, the frontend is built using React, Flux and PostCSS.

Tchaik UI Tchaik UI (Classical Music)

Features

  • Automatic prefix grouping and enumeration detection (ideal for classical music: properly groups big works together).
  • Multiplatform web-based UI and REST-like API for controlling player.
  • Multiple storage and caching options: Amazon S3, Google Cloud Storage, local and remote file stores.
  • Import music library from iTunes or build from directory-tree of audio tracks.

Requirements

  • Go 1.4+ (recent changes have only been tested on 1.5).
  • NodeJS, NPM and Gulp installed globally (for building the UI).
  • Recent version of Chrome (Firefox may also work, though hasn't been fully tested).

Building

If you haven't setup Go before, you need to first set a GOPATH (see https://golang.org/doc/code.html#GOPATH).

To fetch and build the code for Tchaik:

$ go get tchaik.com/cmd/...

This will fetch the code and build the command line tools into $GOPATH/bin (assumed to be in your PATH already).

Building the UI:

$ cd $GOPATH/src/tchaik.com/cmd/tchaik/ui
$ npm install
$ gulp

Alternatively, if you want the JS and CSS to be recompiled and have the browser refreshed as you change the source files:

$ WS_URL="ws://localhost:8080/socket" gulp serve

Then browse to http://localhost:3000/ to use tchaik.

Starting the UI

To start Tchaik you first need to move into the cmd/tchaik directory:

$ cd $GOPATH/src/tchaik.com/cmd/tchaik

Importing an iTunes Library

The easiest way to begin is to build a Tchaik library on-the-fly and start the UI in one command:

$ tchaik -itlXML ~/path/to/iTunesLibrary.xml

You can also convert the iTunes Library into a Tchaik library using the tchimport tool:

$ tchimport -itlXML ~/path/to/iTunesLibrary.xml -out lib.tch
$ tchaik -lib lib.tch

NB: A Tchaik library will generally be smaller than its corresponding iTunes Library. Tchaik libraries are stored as gzipped-JSON (rather than Apple plist) and contain a subset of the metadata used by iTunes.

Importing Audio Files

Alternatively you can build a Tchaik library on-the-fly from a directory-tree of audio files. Only files with supported metadata (see github.com/dhowden/tag) will be included in the index:

$ tchaik -path /all/my/music

To avoid rescanning your entire collection every time you restart, you can build a Tchaik library using the tchimport tool:

$ tchimport -path /all/my/music -out lib.tch
$ tchaik -lib lib.tch

More Advanced Options

A full list of command line options is available from the --help flag:

$ tchaik --help
Usage of tchaik:
  -add-path-prefix prefix
    	add prefix to every path
  -artwork-cache path
    	path to local artwork cache (content addressable)
  -auth-password password
    	password to use for HTTP authentication
  -auth-user user
    	user to use for HTTP authentication (set to enable)
  -checklist file
    	checklist file (default "checklist.json")
  -cursors file
    	cursors file (default "cursors.json")
  -debug
    	print debugging information
  -favourites file
    	favourites file (default "favourites.json")
  -itlXML file
    	iTunes Library XML file
  -lib file
    	Tchaik library file
  -listen address
    	bind address for main HTTP server (default "localhost:8080")
  -local-store path
    	path to local media store (prefixes all paths) (default "/")
  -media-cache path
    	path to local media cache
  -path directory
    	directory containing music files
  -play-history file
    	play history file (default "history.json")
  -playlists file
    	playlists file (default "playlists.json")
  -remote-store address
    	address for remote media store: tchstore server <host>:<port>, s3://<region>:<bucket>/path/to/root for S3, or gs://<bucket>/path/to/root for Google Cloud Storage
  -tls-cert file
    	certificate file, must also specify -tls-key
  -tls-key file
    	certificate key file, must also specify -tls-cert
  -trace-listen address
    	bind address for trace HTTP server
  -trim-path-prefix prefix
    	remove prefix from every path
  -ui-dir directory
    	UI asset directory (default "ui")

-local-store

Set -local-store to the local path that contains your media files. You can use trim-path-prefix and add-path-prefix to rewrite paths used in the Tchaik library so that file locations can still be correctly resolved.

-remote-store

Set -remote-store to the URI of a running tchstore server (hostname:port). Instead, S3 paths can be used: s3://<region>:<bucket>/path/to/root (set the environment variables AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY to pass credentials to the S3 client), or Google Cloud Storage paths: gs://<bucket>/path/to/root (set environment variable GOOGLE_APPLICATION_CREDENTIALS to point to the JSON credentials file).

-media-cache

Set -media-cache to cache all files loaded from -remote-store (or -local-store if set).

-artwork-cache

Set -artwork-cache to create/use a content addressable filesystem for track artwork. An index file will be created in the path on first use. The folder should initially be empty to ensure that no other files interfere with the system.

-trace-listen

Set -trace-listen to a suitable bind address (i.e. localhost:4040) to start an HTTP server which defines the /debug/requests endpoint used to inspect server requests. Currently we only support tracing for media (track/artwork/icon) requests. See https://godoc.org/golang.org/x/net/trace for more details.

Windows Support

The default value for parameter -local-store is / which does not work on Windows. When all library music is organised under a common path you can set -local-store and -trim-path-prefix to get around this (for instance -local-store C:\Path\To\Music -trim-path-prefix C:\Path\To\Music).

Get Involved!

Development is on-going and the codebase is changing very quickly. If you're interested in contributing then it's safest to jump into our gitter room and chat to people before getting started!

Join the chat at https://gitter.im/tchaik/tchaik

tchaik's People

Contributors

charle692 avatar dhowden avatar gitter-badger avatar grahamgoudeau avatar solarnz avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tchaik's Issues

Add support for showing bitrate

It would be cool to show bitrates and (if possible) encodings in the Web UI.

If possible, we should differentiate between fixed and variable-rate compression

Not working on new installation

I followed the instructions for installation, but when i visit localhost:8080, i see a black page with no content. The javascript console shows a single error which says

Player.js:179 Uncaught TypeError: Cannot read property 'id' of null

I'm not yet familiar with the codebase, so i cant go farther than that yet.

Track Description & Timestamps

I have loved this project ever since I discovered it one year ago. However, I have a few suggestions if you'd like to take into thought. ๐Ÿ‘

  • Implement the ability to set a custom description for each track. [maybe having a carrot that drops down to reveal]
  • Add the ability to set custom timestamps for tracks. [i make lengthy mixes and it would be very beneficial to set timestamps so others can have the ability to seek to certain times in each mix]

Other than that, the UI is very elegant and I love every bit of functionality you have applied to this wonderful application. ๐Ÿ’ฏ

Chromecast Audio?

I am happily listening to some audio tracks from tchaik on my laptop right now, which is cool!

I saw you tweeted chromecast audio support, and it was this tweet which got me interested in tchaik. I can't figure out how to list and target chromecast's from the tchaik command line or UI; if this support is in, and you give me a few pointers, I'm happy to make a wiki page for it.

If it's not in, consider this a request for chromecast support!

Take design elements from Google Music

gm2

gm3

gm4

related_artists

menu_bar

Improvements we can make from this:

  • Move the progress bar to the top of the bottom bar
  • Big search bar at the top
  • Volume bar is only shown when the mouse is near it

Can't turn off automatic grouping

I should be able to turn off the automatic grouping off songs.

If I have an album that has a song that is in two parts (and has tracks between them), those two tracks should not be put into their own group

(Although you might need to tween this for your music @dhowden)

Now Playing song info not updated after playing song with missing info

Steps to reproduce:

  1. Play a song with fully populated info
  2. Play a song with missing info

When playing the song with missing info, only the artwork and name of the song changes

tchaik-timestop-1

Until I switched to a song with fully populated info, the time was fixed at 1:28, and the artist name didn't change

Albums in the Collection should show the Artist rather than AlbumArtist if AlbumArtist isn't set, but the Artist field is the same

collapsed

expanded

As you can see, the Artist is common throughout the group, but the AlbumArtist is not set, so the attribute does not show next to the Album name in the collection view when collapsed.

So, the front end sends

{"action":"FETCH","data":{"path":["Root"]}}

The server responds with

...
            {
               "Key" : "9c509",
               "AlbumArtist" : "Brookes Brothers",
               "Name" : "Carry Me On (feat. Chrom3)"
            },
            {
               "Name" : "City Of Gold",
               "Key" : "2098b"
            },
            {
               "AlbumArtist" : "Logistics",
               "Key" : "5ea2a",
               "Name" : "Crash Bang Wallop!"
            },
...

And the tag for 'Artist' is consistent across the entire album, confirmed with picard.
picard

Windows and http.Filesystem issues

Hi, guys, thank you for great application, but I'm having a problem with it in Windows. When I launch tchaik like this:

$ tchaik -path "C:\Music" -debug true

I get error messages about invalid character in file path from artwork and filesystem submodules. And, obviously no artworks are being rendered, no files can be played in UI.

I've debugged this and found that these messages are generated by go stdlib package here:
https://golang.org/src/net/http/fs.go#36

I'm not sure yet, is it a bug in Go package, but is it really necessary to use http.File? My temporary workaround looks like this (patch for store/filesystem.go):

// Open implements FileSystem.
func (fs *fileSystem) Open(ctx context.Context, path string) (http.File, error) {
    f, err := os.Open(path)
    return f, err
}

Instructions on README are wrong

~/g/s/g/d/t/c/tchaik git:master โฏโฏโฏ cd $TCH/cmd/tchaik
~/g/s/g/d/t/c/tchaik git:master โฏโฏโฏ go build
# github.com/dhowden/tchaik/cmd/tchaik
./main.go:181: undefined: httpauth.NewServeMux

Errors, play buttons don't work, websocket connections drops

CursorStore.js:156 Uncaught TypeError: Cannot read property 'current' of null at Object.ID_7 (CursorStore.js:156) at AppDispatcher._invokeCallback (Dispatcher.js:198) at AppDispatcher.dispatch (Dispatcher.js:174) at AppDispatcher.handleServerAction (AppDispatcher.js:18) at Object.dispatch (WebsocketActions.js:9) at WebsocketAPI._onMessage (WebsocketAPI.js:74) NowPlayingStore.js:37 Uncaught TypeError: Cannot read property 'id' of null at setCurrentTrack (NowPlayingStore.js:37) at Object.ID_8 (NowPlayingStore.js:221) at AppDispatcher._invokeCallback (Dispatcher.js:198) at AppDispatcher.dispatch (Dispatcher.js:174) at AppDispatcher.handleViewAction (AppDispatcher.js:11) at Object.next (CursorActions.js:39) at Controls._onForward (Bottom.js:173) at Object.ReactErrorUtils.invokeGuardedCallback (ReactErrorUtils.js:70) at executeDispatch (EventPluginUtils.js:89) at Object.executeDispatchesInOrder (EventPluginUtils.js:112) NowPlayingStore.js:37 Uncaught TypeError: Cannot read property 'id' of null at setCurrentTrack (NowPlayingStore.js:37) at Object.ID_8 (NowPlayingStore.js:221) at AppDispatcher._invokeCallback (Dispatcher.js:198) at AppDispatcher.dispatch (Dispatcher.js:174) at AppDispatcher.handleViewAction (AppDispatcher.js:11) at Object.next (CursorActions.js:39) at Controls._onForward (Bottom.js:173) at Object.ReactErrorUtils.invokeGuardedCallback (ReactErrorUtils.js:70) at executeDispatch (EventPluginUtils.js:89) at Object.executeDispatchesInOrder (EventPluginUtils.js:112) NowPlayingStore.js:37 Uncaught TypeError: Cannot read property 'id' of null at setCurrentTrack (NowPlayingStore.js:37) at Object.ID_8 (NowPlayingStore.js:221) at AppDispatcher._invokeCallback (Dispatcher.js:198) at AppDispatcher.dispatch (Dispatcher.js:174) at AppDispatcher.handleViewAction (AppDispatcher.js:11) at Object.next (CursorActions.js:39) at Controls._onForward (Bottom.js:173) at Object.ReactErrorUtils.invokeGuardedCallback (ReactErrorUtils.js:70) at executeDispatch (EventPluginUtils.js:89) at Object.executeDispatchesInOrder (EventPluginUtils.js:112) NowPlayingStore.js:37 Uncaught TypeError: Cannot read property 'id' of null at setCurrentTrack (NowPlayingStore.js:37) at Object.ID_8 (NowPlayingStore.js:221) at AppDispatcher._invokeCallback (Dispatcher.js:198) at AppDispatcher.dispatch (Dispatcher.js:174) at AppDispatcher.handleViewAction (AppDispatcher.js:11) at Object.next (CursorActions.js:39) at Controls._onForward (Bottom.js:173) at Object.ReactErrorUtils.invokeGuardedCallback (ReactErrorUtils.js:70) at executeDispatch (EventPluginUtils.js:89) at Object.executeDispatchesInOrder (EventPluginUtils.js:112) NowPlayingStore.js:37 Uncaught TypeError: Cannot read property 'id' of null at setCurrentTrack (NowPlayingStore.js:37) at Object.ID_8 (NowPlayingStore.js:221) at AppDispatcher._invokeCallback (Dispatcher.js:198) at AppDispatcher.dispatch (Dispatcher.js:174) at AppDispatcher.handleViewAction (AppDispatcher.js:11) at Object.prev (CursorActions.js:50) at Controls._onBackward (Bottom.js:162) at Object.ReactErrorUtils.invokeGuardedCallback (ReactErrorUtils.js:70) at executeDispatch (EventPluginUtils.js:89) at Object.executeDispatchesInOrder (EventPluginUtils.js:112) NowPlayingStore.js:37 Uncaught TypeError: Cannot read property 'id' of null at setCurrentTrack (NowPlayingStore.js:37) at Object.ID_8 (NowPlayingStore.js:221) at AppDispatcher._invokeCallback (Dispatcher.js:198) at AppDispatcher.dispatch (Dispatcher.js:174) at AppDispatcher.handleViewAction (AppDispatcher.js:11) at Object.prev (CursorActions.js:50) at Controls._onBackward (Bottom.js:162) at Object.ReactErrorUtils.invokeGuardedCallback (ReactErrorUtils.js:70) at executeDispatch (EventPluginUtils.js:89) at Object.executeDispatchesInOrder (EventPluginUtils.js:112) NowPlayingStore.js:37 Uncaught TypeError: Cannot read property 'id' of null at setCurrentTrack (NowPlayingStore.js:37) at Object.ID_8 (NowPlayingStore.js:221) at AppDispatcher._invokeCallback (Dispatcher.js:198) at AppDispatcher.dispatch (Dispatcher.js:174) at AppDispatcher.handleViewAction (AppDispatcher.js:11) at Object.next (CursorActions.js:39) at Controls._onForward (Bottom.js:173) at Object.ReactErrorUtils.invokeGuardedCallback (ReactErrorUtils.js:70) at executeDispatch (EventPluginUtils.js:89) at Object.executeDispatchesInOrder (EventPluginUtils.js:112) NowPlayingStore.js:37 Uncaught TypeError: Cannot read property 'id' of null at setCurrentTrack (NowPlayingStore.js:37) at Object.ID_8 (NowPlayingStore.js:221) at AppDispatcher._invokeCallback (Dispatcher.js:198) at AppDispatcher.dispatch (Dispatcher.js:174) at AppDispatcher.handleViewAction (AppDispatcher.js:11) at Object.prev (CursorActions.js:50) at Controls._onBackward (Bottom.js:162) at Object.ReactErrorUtils.invokeGuardedCallback (ReactErrorUtils.js:70) at executeDispatch (EventPluginUtils.js:89) at Object.executeDispatchesInOrder (EventPluginUtils.js:112) NowPlayingStore.js:37 Uncaught TypeError: Cannot read property 'id' of null at setCurrentTrack (NowPlayingStore.js:37) at Object.ID_8 (NowPlayingStore.js:221) at AppDispatcher._invokeCallback (Dispatcher.js:198) at AppDispatcher.dispatch (Dispatcher.js:174) at AppDispatcher.handleViewAction (AppDispatcher.js:11) at Object.next (CursorActions.js:39) at Controls._onForward (Bottom.js:173) at Object.ReactErrorUtils.invokeGuardedCallback (ReactErrorUtils.js:70) at executeDispatch (EventPluginUtils.js:89) at Object.executeDispatchesInOrder (EventPluginUtils.js:112)

Mouse pointer not hand on hover.

Mouse pointer for the playlist remove button, controls, and volume button doesn't change to the hand pointer when hovering over them.

Better youtube-dl

Nothing I download with youtube-dl seems to be picked up by tchaik.

Implement play history

Add functionality to record play history, which would include the time each each track/group (hence album) has been played. We want to be able to add a level of decay to old play counts so that the data can be made more relevant to changing music tastes.

This would enable a whole range of "favourite tracks"-style playlists: "Most recent favourites...", "Recently added and not listened to..." etc...

Similar to #44 this data should not be kept in the library itself, but in a separate store so that multiple users of the same tracks can have different play stats.

update Google Cloud API client import paths and more

The Google Cloud API client libraries for Go are making some breaking changes:

  • The import paths are changing from google.golang.org/cloud/... to
    cloud.google.com/go/.... For example, if your code imports the BigQuery client
    it currently reads
    import "google.golang.org/cloud/bigquery"
    It should be changed to
    import "cloud.google.com/go/bigquery"
  • Client options are also moving, from google.golang.org/cloud to
    google.golang.org/api/option. Two have also been renamed:
    • WithBaseGRPC is now WithGRPCConn
    • WithBaseHTTP is now WithHTTPClient
  • The cloud.WithContext and cloud.NewContext methods are gone, as are the
    deprecated pubsub and container functions that required them. Use the Client
    methods of these packages instead.

You should make these changes before September 12, 2016, when the packages at
google.golang.org/cloud will go away.

Gulp exceeds call stack max in cmd/ui

I'm trying to get your changes compiled and in and tested and have this problem starting up the UI.

As a side note, I presume this is intended, but tchaik.com and github.com have different states; the documentation here on github specifies a go get from tchaik.com. I did that and then 'pull'ed from the github repo to get your Issue #58 patch in.

I don't think that patch is hitting this part of the code though.

#pwd
/Users/admin/go/src/tchaik.com/cmd/tchaik/ui

# node -v 
v5.1.0

# gulp -v
[11:53:53] CLI version 3.9.0
[11:53:53] Local version 3.9.0

#gulp
[11:51:12] Using gulpfile ~/go/src/tchaik.com/cmd/tchaik/ui/gulpfile.js
[11:51:12] Starting 'webpack'...
[11:51:13] Starting 'eslint'...
[11:51:20] [webpack] Hash: 6dedad6dd7e4ff53e062
Version: webpack 1.12.9
Time: 6929ms
     Asset     Size  Chunks             Chunk Names
 tchaik.js   2.7 MB       0  [emitted]  app
styles.css  41.2 kB       0  [emitted]  app
chunk    {0} tchaik.js, styles.css (app) 859 kB [rendered]
    [0] multi app 28 bytes {0} [built]
    [1] ./js/src/app.js 2.66 kB {0} [built] [5 errors]
    [2] ./css/screen.css 41 bytes {0} [built]
    [6] ./css/material-icons.css 41 bytes {0} [built]
    [8] ./~/react/react.js 56 bytes {0} [built]
    [9] ./~/react/lib/React.js 1.49 kB {0} [built]
   [10] ./~/react/lib/ReactDOM.js 3.71 kB {0} [built]
   [11] ./~/react/lib/ReactCurrentOwner.js 653 bytes {0} [built]
   [12] ./~/react/lib/ReactDOMTextComponent.js 4.32 kB {0} [built]
   [13] ./~/react/lib/DOMChildrenOperations.js 5 kB {0} [built]
   [14] ./~/react/lib/Danger.js 6.96 kB {0} [built]
   [15] ./~/react/~/fbjs/lib/ExecutionEnvironment.js 1.09 kB {0} [built]
   [16] ./~/react/~/fbjs/lib/createNodesFromMarkup.js 2.71 kB {0} [built]
   [17] ./~/react/~/fbjs/lib/createArrayFromMixed.js 2.36 kB {0} [built]
   [18] ./~/react/~/fbjs/lib/toArray.js 1.98 kB {0} [built]
   [19] ./~/react/~/fbjs/lib/invariant.js 1.51 kB {0} [built]
   [20] ./~/react/~/fbjs/lib/getMarkupWrap.js 3.06 kB {0} [built]
   [21] ./~/react/~/fbjs/lib/emptyFunction.js 1.09 kB {0} [built]
   [22] ./~/react/lib/ReactMultiChildUpdateTypes.js 861 bytes {0} [built]
   [23] ./~/react/~/fbjs/lib/keyMirror.js 1.27 kB {0} [built]
   [24] ./~/react/lib/ReactPerf.js 2.51 kB {0} [built]
   [25] ./~/react/lib/setInnerHTML.js 3.35 kB {0} [built]
   [26] ./~/react/lib/setTextContent.js 1.2 kB {0} [built]
   [27] ./~/react/lib/escapeTextContentForBrowser.js 849 bytes {0} [built]
   [28] ./~/react/lib/DOMPropertyOperations.js 7.88 kB {0} [built]
   [29] ./~/react/lib/DOMProperty.js 9.57 kB {0} [built]
   [30] ./~/react/lib/quoteAttributeValueForBrowser.js 746 bytes {0} [built]
   [31] ./~/react/~/fbjs/lib/warning.js 1.77 kB {0} [built]
   [32] ./~/react/lib/ReactComponentBrowserEnvironment.js 1.26 kB {0} [built]
   [33] ./~/react/lib/ReactDOMIDOperations.js 3.29 kB {0} [built]
   [34] ./~/react/lib/ReactMount.js 36.8 kB {0} [built]
   [35] ./~/react/lib/ReactBrowserEventEmitter.js 12.4 kB {0} [built]
   [36] ./~/react/lib/EventConstants.js 2.04 kB {0} [built]
   [37] ./~/react/lib/EventPluginHub.js 9.22 kB {0} [built]
   [38] ./~/react/lib/EventPluginRegistry.js 8.41 kB {0} [built]
   [39] ./~/react/lib/EventPluginUtils.js 6.79 kB {0} [built]
   [40] ./~/react/lib/ReactErrorUtils.js 2.27 kB {0} [built]
   [41] ./~/react/lib/accumulateInto.js 1.74 kB {0} [built]
   [42] ./~/react/lib/forEachAccumulated.js 893 bytes {0} [built]
   [43] ./~/react/lib/ReactEventEmitterMixin.js 1.3 kB {0} [built]
   [44] ./~/react/lib/ViewportMetrics.js 638 bytes {0} [built]
   [45] ./~/react/lib/Object.assign.js 1.26 kB {0} [built]
   [46] ./~/react/lib/isEventSupported.js 1.97 kB {0} [built]
   [47] ./~/react/lib/ReactDOMFeatureFlags.js 458 bytes {0} [built]
   [48] ./~/react/lib/ReactElement.js 8.07 kB {0} [built]
   [49] ./~/react/lib/canDefineProperty.js 629 bytes {0} [built]
   [50] ./~/react/lib/ReactEmptyComponentRegistry.js 1.38 kB {0} [built]
   [51] ./~/react/lib/ReactInstanceHandles.js 10.6 kB {0} [built]
   [52] ./~/react/lib/ReactRootIndex.js 723 bytes {0} [built]
   [53] ./~/react/lib/ReactInstanceMap.js 1.25 kB {0} [built]
   [54] ./~/react/lib/ReactMarkupChecksum.js 1.39 kB {0} [built]
   [55] ./~/react/lib/adler32.js 1.2 kB {0} [built]
   [56] ./~/react/lib/ReactReconciler.js 3.55 kB {0} [built]
   [57] ./~/react/lib/ReactRef.js 2.34 kB {0} [built]
   [58] ./~/react/lib/ReactOwner.js 3.45 kB {0} [built]
   [59] ./~/react/lib/ReactUpdateQueue.js 10.9 kB {0} [built]
   [60] ./~/react/lib/ReactUpdates.js 8.54 kB {0} [built]
   [61] ./~/react/lib/CallbackQueue.js 2.44 kB {0} [built]
   [62] ./~/react/lib/PooledClass.js 3.55 kB {0} [built]
   [63] ./~/react/lib/Transaction.js 9.55 kB {0} [built]
   [64] ./~/react/~/fbjs/lib/emptyObject.js 482 bytes {0} [built]
   [65] ./~/react/~/fbjs/lib/containsNode.js 1.43 kB {0} [built]
   [66] ./~/react/~/fbjs/lib/isTextNode.js 628 bytes {0} [built]
   [67] ./~/react/~/fbjs/lib/isNode.js 712 bytes {0} [built]
   [68] ./~/react/lib/instantiateReactComponent.js 4.52 kB {0} [built]
   [69] ./~/react/lib/ReactCompositeComponent.js 27.5 kB {0} [built]
   [70] ./~/react/lib/ReactComponentEnvironment.js 1.67 kB {0} [built]
   [71] ./~/react/lib/ReactPropTypeLocations.js 549 bytes {0} [built]
   [72] ./~/react/lib/ReactPropTypeLocationNames.js 611 bytes {0} [built]
   [73] ./~/react/lib/shouldUpdateReactComponent.js 1.49 kB {0} [built]
   [74] ./~/react/lib/ReactEmptyComponent.js 1.68 kB {0} [built]
   [75] ./~/react/lib/ReactNativeComponent.js 3.02 kB {0} [built]
   [76] ./~/react/lib/validateDOMNesting.js 13.1 kB {0} [built]
   [77] ./~/react/lib/ReactDefaultInjection.js 3.99 kB {0} [built]
   [78] ./~/react/lib/BeforeInputEventPlugin.js 14.9 kB {0} [built]
   [79] ./~/react/lib/EventPropagators.js 5.22 kB {0} [built]
   [80] ./~/react/lib/FallbackCompositionState.js 2.49 kB {0} [built]
   [81] ./~/react/lib/getTextContentAccessor.js 994 bytes {0} [built]
   [82] ./~/react/lib/SyntheticCompositionEvent.js 1.16 kB {0} [built]
   [83] ./~/react/lib/SyntheticEvent.js 5.75 kB {0} [built]
   [84] ./~/react/lib/SyntheticInputEvent.js 1.15 kB {0} [built]
   [85] ./~/react/~/fbjs/lib/keyOf.js 1.11 kB {0} [built]
   [86] ./~/react/lib/ChangeEventPlugin.js 11.5 kB {0} [built]
   [87] ./~/react/lib/getEventTarget.js 930 bytes {0} [built]
   [88] ./~/react/lib/isTextInputElement.js 1.03 kB {0} [built]
   [89] ./~/react/lib/ClientReactRootIndex.js 551 bytes {0} [built]
   [90] ./~/react/lib/DefaultEventPluginOrder.js 1.26 kB {0} [built]
   [91] ./~/react/lib/EnterLeaveEventPlugin.js 3.9 kB {0} [built]
   [92] ./~/react/lib/SyntheticMouseEvent.js 2.2 kB {0} [built]
   [93] ./~/react/lib/SyntheticUIEvent.js 1.64 kB {0} [built]
   [94] ./~/react/lib/getEventModifierState.js 1.3 kB {0} [built]
   [95] ./~/react/lib/HTMLDOMPropertyConfig.js 7.67 kB {0} [built]
   [96] ./~/react/lib/ReactBrowserComponentMixin.js 1.15 kB {0} [built]
   [97] ./~/react/lib/findDOMNode.js 2.17 kB {0} [built]
   [98] ./~/react/lib/ReactDefaultBatchingStrategy.js 1.92 kB {0} [built]
   [99] ./~/react/lib/ReactDOMComponent.js 36.9 kB {0} [built]
  [100] ./~/react/lib/AutoFocusUtils.js 816 bytes {0} [built]
  [101] ./~/react/~/fbjs/lib/focusNode.js 725 bytes {0} [built]
  [102] ./~/react/lib/CSSPropertyOperations.js 5.71 kB {0} [built]
  [103] ./~/react/lib/CSSProperty.js 3.5 kB {0} [built]
  [104] ./~/react/~/fbjs/lib/camelizeStyleName.js 1.03 kB {0} [built]
  [105] ./~/react/~/fbjs/lib/camelize.js 729 bytes {0} [built]
  [106] ./~/react/lib/dangerousStyleValue.js 1.93 kB {0} [built]
  [107] ./~/react/~/fbjs/lib/hyphenateStyleName.js 1 kB {0} [built]
  [108] ./~/react/~/fbjs/lib/hyphenate.js 822 bytes {0} [built]
  [109] ./~/react/~/fbjs/lib/memoizeStringOnly.js 778 bytes {0} [built]
  [110] ./~/react/lib/ReactDOMButton.js 1.15 kB {0} [built]
  [111] ./~/react/lib/ReactDOMInput.js 5.74 kB {0} [built]
  [112] ./~/react/lib/LinkedValueUtils.js 5.18 kB {0} [built]
  [113] ./~/react/lib/ReactPropTypes.js 12.3 kB {0} [built]
  [114] ./~/react/lib/getIteratorFn.js 1.17 kB {0} [built]
  [115] ./~/react/lib/ReactDOMOption.js 2.79 kB {0} [built]
  [116] ./~/react/lib/ReactChildren.js 5.83 kB {0} [built]
  [117] ./~/react/lib/traverseAllChildren.js 6.9 kB {0} [built]
  [118] ./~/react/lib/ReactDOMSelect.js 6.09 kB {0} [built]
  [119] ./~/react/lib/ReactDOMTextarea.js 4.35 kB {0} [built]
  [120] ./~/react/lib/ReactMultiChild.js 14.7 kB {0} [built]
  [121] ./~/react/lib/ReactChildReconciler.js 4.52 kB {0} [built]
  [122] ./~/react/lib/flattenChildren.js 1.65 kB {0} [built]
  [123] ./~/react/~/fbjs/lib/shallowEqual.js 1.28 kB {0} [built]
  [124] ./~/react/lib/ReactEventListener.js 7.51 kB {0} [built]
  [125] ./~/react/~/fbjs/lib/EventListener.js 2.65 kB {0} [built]
  [126] ./~/react/~/fbjs/lib/getUnboundedScrollPosition.js 1.09 kB {0} [built]
  [127] ./~/react/lib/ReactInjection.js 1.37 kB {0} [built]
  [128] ./~/react/lib/ReactClass.js 27.8 kB {0} [built]
  [129] ./~/react/lib/ReactComponent.js 5.04 kB {0} [built]
  [130] ./~/react/lib/ReactNoopUpdateQueue.js 3.94 kB {0} [built]
  [131] ./~/react/lib/ReactReconcileTransaction.js 4.58 kB {0} [built]
  [132] ./~/react/lib/ReactInputSelection.js 4.32 kB {0} [built]
  [133] ./~/react/lib/ReactDOMSelection.js 6.83 kB {0} [built]
  [134] ./~/react/lib/getNodeForCharacterOffset.js 1.66 kB {0} [built]
  [135] ./~/react/~/fbjs/lib/getActiveElement.js 876 bytes {0} [built]
  [136] ./~/react/lib/SelectEventPlugin.js 6.71 kB {0} [built]
  [137] ./~/react/lib/ServerReactRootIndex.js 868 bytes {0} [built]
  [138] ./~/react/lib/SimpleEventPlugin.js 17.4 kB {0} [built]
  [139] ./~/react/lib/SyntheticClipboardEvent.js 1.23 kB {0} [built]
  [140] ./~/react/lib/SyntheticFocusEvent.js 1.12 kB {0} [built]
  [141] ./~/react/lib/SyntheticKeyboardEvent.js 2.76 kB {0} [built]
  [142] ./~/react/lib/getEventCharCode.js 1.56 kB {0} [built]
  [143] ./~/react/lib/getEventKey.js 2.93 kB {0} [built]
  [144] ./~/react/lib/SyntheticDragEvent.js 1.13 kB {0} [built]
  [145] ./~/react/lib/SyntheticTouchEvent.js 1.33 kB {0} [built]
  [146] ./~/react/lib/SyntheticWheelEvent.js 1.99 kB {0} [built]
  [147] ./~/react/lib/SVGDOMPropertyConfig.js 3.8 kB {0} [built]
  [148] ./~/react/lib/ReactDefaultPerf.js 8.63 kB {0} [built]
  [149] ./~/react/lib/ReactDefaultPerfAnalysis.js 5.72 kB {0} [built]
  [150] ./~/react/~/fbjs/lib/performanceNow.js 830 bytes {0} [built]
  [151] ./~/react/~/fbjs/lib/performance.js 612 bytes {0} [built]
  [152] ./~/react/lib/ReactVersion.js 379 bytes {0} [built]
  [153] ./~/react/lib/renderSubtreeIntoContainer.js 463 bytes {0} [built]
  [154] ./~/react/lib/ReactDOMServer.js 766 bytes {0} [built]
  [155] ./~/react/lib/ReactServerRendering.js 3.3 kB {0} [built]
  [156] ./~/react/lib/ReactServerBatchingStrategy.js 673 bytes {0} [built]
  [157] ./~/react/lib/ReactServerRenderingTransaction.js 2.3 kB {0} [built]
  [158] ./~/react/lib/ReactIsomorphic.js 2.05 kB {0} [built]
  [159] ./~/react/lib/ReactDOMFactories.js 3.36 kB {0} [built]
  [160] ./~/react/lib/ReactElementValidator.js 10.8 kB {0} [built]
  [161] ./~/react/~/fbjs/lib/mapObject.js 1.47 kB {0} [built]
  [162] ./~/react/lib/onlyChild.js 1.21 kB {0} [built]
  [163] ./~/react/lib/deprecated.js 1.77 kB {0} [built]
  [164] ./~/react-dom/index.js 63 bytes {0} [built]
  [165] ./~/babel-core/polyfill.js 50 bytes {0} [built]
  [166] ./~/babel-core/lib/babel/polyfill.js 203 bytes {0} [built]
  [167] ./~/babel-core/~/core-js/shim.js 1.95 kB {0} [built]
  [168] ./~/babel-core/~/core-js/modules/es5.js 11.3 kB {0} [built]
  [169] ./~/babel-core/~/core-js/modules/$.js 2.72 kB {0} [built]
  [170] ./~/babel-core/~/core-js/modules/$.fw.js 77 bytes {0} [built]
  [171] ./~/babel-core/~/core-js/modules/$.dom-create.js 286 bytes {0} [built]
  [172] ./~/babel-core/~/core-js/modules/$.cof.js 480 bytes {0} [built]
  [173] ./~/babel-core/~/core-js/modules/$.wks.js 235 bytes {0} [built]
  [174] ./~/babel-core/~/core-js/modules/$.shared.js 191 bytes {0} [built]
  [175] ./~/babel-core/~/core-js/modules/$.uid.js 199 bytes {0} [built]
  [176] ./~/babel-core/~/core-js/modules/$.def.js 1.33 kB {0} [built]
  [177] ./~/babel-core/~/core-js/modules/$.redef.js 831 bytes {0} [built]
  [178] ./~/babel-core/~/core-js/modules/$.invoke.js 867 bytes {0} [built]
  [179] ./~/babel-core/~/core-js/modules/$.array-methods.js 1.37 kB {0} [built]
  [180] ./~/babel-core/~/core-js/modules/$.ctx.js 528 bytes {0} [built]
  [181] ./~/babel-core/~/core-js/modules/$.assert.js 548 bytes {0} [built]
  [182] ./~/babel-core/~/core-js/modules/$.array-includes.js 574 bytes {0} [built]
  [183] ./~/babel-core/~/core-js/modules/$.replacer.js 269 bytes {0} [built]
  [184] ./~/babel-core/~/core-js/modules/$.throws.js 108 bytes {0} [built]
  [185] ./~/babel-core/~/core-js/modules/es6.symbol.js 5.82 kB {0} [built]
  [186] ./~/babel-core/~/core-js/modules/$.keyof.js 250 bytes {0} [built]
  [187] ./~/babel-core/~/core-js/modules/$.enum-keys.js 283 bytes {0} [built]
  [188] ./~/babel-core/~/core-js/modules/$.get-names.js 587 bytes {0} [built]
  [189] ./~/babel-core/~/core-js/modules/es6.object.assign.js 129 bytes {0} [built]
  [190] ./~/babel-core/~/core-js/modules/$.assign.js 557 bytes {0} [built]
  [191] ./~/babel-core/~/core-js/modules/es6.object.is.js 124 bytes {0} [built]
  [192] ./~/babel-core/~/core-js/modules/$.same.js 119 bytes {0} [built]
  [193] ./~/babel-core/~/core-js/modules/es6.object.set-prototype-of.js 147 bytes {0} [built]
  [194] ./~/babel-core/~/core-js/modules/$.set-proto.js 812 bytes {0} [built]
  [195] ./~/babel-core/~/core-js/modules/es6.object.to-string.js 321 bytes {0} [built]
  [196] ./~/babel-core/~/core-js/modules/es6.object.statics-accept-primitives.js 1.28 kB {0} [built]
  [197] ./~/babel-core/~/core-js/modules/es6.function.name.js 533 bytes {0} [built]
  [198] ./~/babel-core/~/core-js/modules/es6.function.has-instance.js 562 bytes {0} [built]
  [199] ./~/babel-core/~/core-js/modules/es6.number.constructor.js 1.56 kB {0} [built]
  [200] ./~/babel-core/~/core-js/modules/es6.number.statics.js 1.13 kB {0} [built]
  [201] ./~/babel-core/~/core-js/modules/es6.math.js 3.55 kB {0} [built]
  [202] ./~/babel-core/~/core-js/modules/es6.string.from-code-point.js 817 bytes {0} [built]
  [203] ./~/babel-core/~/core-js/modules/es6.string.raw.js 445 bytes {0} [built]
  [204] ./~/babel-core/~/core-js/modules/es6.string.iterator.js 592 bytes {0} [built]
  [205] ./~/babel-core/~/core-js/modules/$.string-at.js 575 bytes {0} [built]
  [206] ./~/babel-core/~/core-js/modules/$.iter.js 1.62 kB {0} [built]
  [207] ./~/babel-core/~/core-js/modules/$.iter-define.js 1.88 kB {0} [built]
  [208] ./~/babel-core/~/core-js/modules/es6.string.code-point-at.js 237 bytes {0} [built]
  [209] ./~/babel-core/~/core-js/modules/es6.string.ends-with.js 757 bytes {0} [built]
  [210] ./~/babel-core/~/core-js/modules/es6.string.includes.js 404 bytes {0} [built]
  [211] ./~/babel-core/~/core-js/modules/es6.string.repeat.js 145 bytes {0} [built]
  [212] ./~/babel-core/~/core-js/modules/$.string-repeat.js 320 bytes {0} [built]
  [213] ./~/babel-core/~/core-js/modules/es6.string.starts-with.js 642 bytes {0} [built]
  [214] ./~/babel-core/~/core-js/modules/es6.array.from.js 1.36 kB {0} [built]
  [215] ./~/babel-core/~/core-js/modules/$.iter-call.js 383 bytes {0} [built]
  [216] ./~/babel-core/~/core-js/modules/$.iter-detect.js 564 bytes {0} [built]
  [217] ./~/babel-core/~/core-js/modules/es6.array.of.js 436 bytes {0} [built]
  [218] ./~/babel-core/~/core-js/modules/es6.array.iterator.js 1.06 kB {0} [built]
  [219] ./~/babel-core/~/core-js/modules/$.unscope.js 241 bytes {0} [built]
  [220] ./~/babel-core/~/core-js/modules/es6.array.species.js 30 bytes {0} [built]
  [221] ./~/babel-core/~/core-js/modules/$.species.js 207 bytes {0} [built]
  [222] ./~/babel-core/~/core-js/modules/es6.array.copy-within.js 904 bytes {0} [built]
  [223] ./~/babel-core/~/core-js/modules/es6.array.fill.js 587 bytes {0} [built]
  [224] ./~/babel-core/~/core-js/modules/es6.array.find.js 464 bytes {0} [built]
  [225] ./~/babel-core/~/core-js/modules/es6.array.find-index.js 484 bytes {0} [built]
  [226] ./~/babel-core/~/core-js/modules/es6.regexp.js 1.54 kB {0} [built]
  [227] ./~/babel-core/~/core-js/modules/es6.promise.js 7.82 kB {0} [built]
  [228] ./~/babel-core/~/core-js/modules/$.for-of.js 395 bytes {0} [built]
  [229] ./~/babel-core/~/core-js/modules/$.task.js 2.25 kB {0} [built]
  [230] ./~/babel-core/~/core-js/modules/$.mix.js 150 bytes {0} [built]
  [231] ./~/babel-core/~/core-js/modules/es6.map.js 491 bytes {0} [built]
  [232] ./~/babel-core/~/core-js/modules/$.collection-strong.js 5.08 kB {0} [built]
  [233] ./~/babel-core/~/core-js/modules/$.collection.js 2.26 kB {0} [built]
  [234] ./~/babel-core/~/core-js/modules/es6.set.js 346 bytes {0} [built]
  [235] ./~/babel-core/~/core-js/modules/es6.weak-map.js 1.38 kB {0} [built]
  [236] ./~/babel-core/~/core-js/modules/$.collection-weak.js 2.48 kB {0} [built]
  [237] ./~/babel-core/~/core-js/modules/es6.weak-set.js 340 bytes {0} [built]
  [238] ./~/babel-core/~/core-js/modules/es6.reflect.js 5.08 kB {0} [built]
  [239] ./~/babel-core/~/core-js/modules/$.own-keys.js 266 bytes {0} [built]
  [240] ./~/babel-core/~/core-js/modules/es7.array.includes.js 328 bytes {0} [built]
  [241] ./~/babel-core/~/core-js/modules/es7.string.at.js 226 bytes {0} [built]
  [242] ./~/babel-core/~/core-js/modules/es7.string.lpad.js 186 bytes {0} [built]
  [243] ./~/babel-core/~/core-js/modules/$.string-pad.js 1.57 kB {0} [built]
  [244] ./~/babel-core/~/core-js/modules/es7.string.rpad.js 187 bytes {0} [built]
  [245] ./~/babel-core/~/core-js/modules/es7.regexp.escape.js 178 bytes {0} [built]
  [246] ./~/babel-core/~/core-js/modules/es7.object.get-own-property-descriptors.js 443 bytes {0} [built]
  [247] ./~/babel-core/~/core-js/modules/es7.object.to-array.js 562 bytes {0} [built]
  [248] ./~/babel-core/~/core-js/modules/es7.map.to-json.js 100 bytes {0} [built]
  [249] ./~/babel-core/~/core-js/modules/$.collection-to-json.js 305 bytes {0} [built]
  [250] ./~/babel-core/~/core-js/modules/es7.set.to-json.js 100 bytes {0} [built]
  [251] ./~/babel-core/~/core-js/modules/js.array.statics.js 707 bytes {0} [built]
  [252] ./~/babel-core/~/core-js/modules/web.timers.js 655 bytes {0} [built]
  [253] ./~/babel-core/~/core-js/modules/$.partial.js 772 bytes {0} [built]
  [254] ./~/babel-core/~/core-js/modules/web.immediate.js 150 bytes {0} [built]
  [255] ./~/babel-core/~/core-js/modules/web.dom.iterable.js 565 bytes {0} [built]
  [256] ./~/babel-core/~/regenerator/runtime.js 19.9 kB {0} [built]
  [257] ./~/node-libs-browser/~/process/browser.js 2.06 kB {0} [built]
  [258] ./js/src/utils/WebsocketAPI.js 6.43 kB {0} [built]
  [259] ./js/src/utils/ChangeEmitter.js 3.74 kB {0} [built]
  [260] ./~/eventemitter3/index.js 6.08 kB {0} [built]
  [261] ./js/src/dispatcher/AppDispatcher.js 3.62 kB {0} [built]
  [262] ./~/flux/index.js 364 bytes {0} [built]
  [263] ./~/flux/lib/Dispatcher.js 7.28 kB {0} [built]
  [264] ./~/flux/~/fbjs/lib/invariant.js 1.51 kB {0} [built]
  [265] ./js/src/actions/WebsocketActions.js 2.33 kB {0} [built]
  [266] ./js/src/constants/WebsocketConstants.js 1.47 kB {0} [built]
  [267] ./~/keymirror/index.js 1.41 kB {0} [built]
  [268] ./js/src/utils/AudioAPI.js 7.25 kB {0} [built]
  [269] ./js/src/constants/NowPlayingConstants.js 1.69 kB {0} [built]
  [270] ./js/src/actions/NowPlayingActions.js 5.14 kB {0} [built]
  [271] ./js/src/stores/NowPlayingStore.js 10.9 kB {0} [built]
  [272] ./js/src/constants/PlaylistConstants.js 1.64 kB {0} [built]
  [273] ./js/src/constants/CursorConstants.js 1.52 kB {0} [built]
  [274] ./js/src/stores/CursorStore.js 8.97 kB {0} [built]
  [275] ./js/src/stores/CollectionStore.js 4.77 kB {0} [built]
  [276] ./js/src/constants/CollectionConstants.js 1.51 kB {0} [built]
  [277] ./js/src/constants/ControlConstants.js 1.71 kB {0} [built]
  [278] ./js/src/stores/PlaylistStore.js 6.88 kB {0} [built]
  [279] ./js/src/stores/PlayingStatusStore.js 6.99 kB {0} [built]
  [280] ./js/src/stores/VolumeStore.js 5.76 kB {0} [built]
  [281] ./js/src/constants/VolumeConstants.js 1.5 kB {0} [built]

ERROR in ./js/src/components/LeftColumn.js
Module build failed: RangeError: Maximum call stack size exceeded
    at new Reference (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/lib/reference.js:41:21)
    at FunctionScope.__referencing (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/lib/scope.js:405:27)
    at Referencer.Identifier (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/lib/referencer.js:406:37)
    at Referencer.Visitor.visit (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:109:34)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:93:26)
    at Referencer.CallExpression (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/lib/referencer.js:480:22)
    at Referencer.Visitor.visit (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:109:34)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:93:26)
    at Referencer.Visitor.visit (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:112:14)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:93:26)
 @ ./js/src/app.js 16:17-54

ERROR in ./js/src/components/RightColumn.js
Module build failed: RangeError: Maximum call stack size exceeded
    at keys (native)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:78:24)
    at Referencer.Visitor.visit (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:112:14)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:93:26)
    at Referencer.Visitor.visit (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:112:14)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:93:26)
    at Referencer.Visitor.visit (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:112:14)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:88:38)
    at Referencer.Visitor.visit (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:112:14)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:93:26)
 @ ./js/src/app.js 17:18-56

ERROR in ./js/src/components/Top.js
Module build failed: RangeError: Maximum call stack size exceeded
    at keys (native)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:78:24)
    at Referencer.Visitor.visit (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:112:14)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:93:26)
    at Referencer.Visitor.visit (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:112:14)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:88:38)
    at Referencer.Visitor.visit (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:112:14)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:93:26)
    at Referencer.Visitor.visit (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:112:14)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:88:38)
 @ ./js/src/app.js 19:10-40

ERROR in ./js/src/components/Bottom.js
Module build failed: RangeError: Maximum call stack size exceeded
    at keys (native)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:78:24)
    at Referencer.Visitor.visit (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:112:14)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:93:26)
    at Referencer.Visitor.visit (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:112:14)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:88:38)
    at Referencer.Visitor.visit (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:112:14)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:93:26)
    at Referencer.Visitor.visit (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:112:14)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:88:38)
 @ ./js/src/app.js 18:13-46

ERROR in ./js/src/components/Container.js
Module build failed: RangeError: Maximum call stack size exceeded
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:67:48)
    at Referencer.Visitor.visit (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:112:14)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:93:26)
    at Referencer.Visitor.visit (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:112:14)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:88:38)
    at Referencer.Visitor.visit (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:112:14)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:93:26)
    at Referencer.Visitor.visit (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:112:14)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:88:38)
    at Referencer.Visitor.visit (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:112:14)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:93:26)
 @ ./js/src/app.js 20:16-52
Child extract-text-webpack-plugin:
    chunk    {0} extract-text-webpack-plugin-output-filename 43.3 kB [rendered]
        [0] ./~/css-loader!./~/postcss-loader!./css/screen.css 41.8 kB {0} [built]
        [1] ./~/css-loader/lib/css-base.js 1.51 kB {0} [built]
Child extract-text-webpack-plugin:
    chunk    {0} extract-text-webpack-plugin-output-filename 2.74 kB [rendered]
        [0] ./~/css-loader!./~/postcss-loader!./css/material-icons.css 1.23 kB {0} [built]
        [1] ./~/css-loader/lib/css-base.js 1.51 kB {0} [built]
[11:51:20] Finished 'webpack' after 7.72 s
/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:78
            children = objectKeys(node);
                       ^

RangeError: Maximum call stack size exceeded
    at keys (native)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:78:24)
    at Referencer.Visitor.visit (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:112:14)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:93:26)
    at Referencer.Visitor.visit (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:112:14)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:93:26)
    at Referencer.Visitor.visit (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:112:14)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:88:38)
    at Referencer.Visitor.visit (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:112:14)
    at Referencer.Visitor.visitChildren (/Users/admin/go/src/tchaik.com/cmd/tchaik/ui/node_modules/eslint/node_modules/escope/node_modules/esrecurse/esrecurse.js:93:26)

Implement ratings for tracks/albums

Add functionality to be able to rate tracks/groups (and hence albums). This data should be kept in a separate store (so that the library and the user-specific data are separate, and multiple users can set different ratings).

Documentation for the REST API

There is currently no official documentation which describes the REST API (other than reading the code). We need to pick a standard and then start writing it all out!

FLAC support

I would like flax support because I am a lossless audio snob.

Transcoding

There is no proper music server without transcoding. Would it be possible to implement?

Multiple users support

Is it able to implement multi-user functionality, so every user can use own playlists, etc. ?

cloudstorage api change?

From a totally fresh install:

# go get -v
tchaik.com/store
# tchaik.com/store
./cloudstorage.go:43: undefined: "google.golang.org/cloud/storage".StatObject
./cloudstorage.go:48: undefined: "google.golang.org/cloud/storage".NewReader

The repos linked to don't seem to provide those functions anymore from the docs, at least.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.