/krum/webui/static/js/library/library.js.coffee
CoffeeScript | 285 lines | 240 code | 45 blank | 0 comment | 19 complexity | 04c51e388da1d932508021bbd296942c MD5 | raw file
- $(document).ready( ->
- window.krum ||= {}
- krum.pageModule = new LibraryModule(el: $('#content'))
- krum.pageModule.on('ready', ->
- krum.pageModule.render()
- Backbone.history.start()
- )
- )
- LibraryModuleRouter = Backbone.Router.extend(
- routes:
- '': 'index'
- ':media_type': 'media_type'
- ':media_type/:id': 'media_type_children'
- )
- LibraryModule = Backbone.View.extend(
- firstRender: true
- initialize: (options)->
- @router = new LibraryModuleRouter()
- @playerCollection = new PlayerCollection()
- @mediaTypeCollection = new MediaTypeCollection()
- @_setUpRoutes(@router)
- @_populateAllCollections()
- render: ->
- if @firstRender
- @firstRender = false
- @$el.html('<div id="remote"></div><div id="library-browser"></div>')
- @_remoteView = new RemoteView(el: @$el.find('#remote'), playerCollection: @playerCollection)
- @_contentBrowserView = @_getMediTypeBrowser()
- @_renderAllSubViews()
- _renderAllSubViews: ->
- _.each(@_getSubViews(), (subView) ->
- subView.render()
- )
- _getSubViews: ->
- [@_remoteView]
- _getContentBrowserView: ->
- @_contentBrowserView
- _transitionBrowserViews: (newContentBrowserView) ->
- @_contentBrowserView = newContentBrowserView
- @_contentBrowserView.render()
- _getCategoriesBrowserElement: ->
- @$el.find('#library-browser')
- _getContentBrowserViewFor: (mediaTypeName) ->
- mediaType = @mediaTypeCollection.where(name: mediaTypeName)[0]
- unless mediaType
- return null
- collection = new MediaCollection(mediaType: mediaType)
- new MediaCollectionView(el: @_getCategoriesBrowserElement(), collection: collection)
- _getMediTypeBrowser: ->
- new MediaTypeBrowserView(el: @_getCategoriesBrowserElement(), collection: @mediaTypeCollection)
- _getMediaViewFor: (id)->
- model = new Media(id: id)
- model.fetch()
- new MediaView(el: @_getCategoriesBrowserElement(), model: model )
- _populateAllCollections: ->
- populated = 0
- populatedMessage = =>
- populated += 1
- if populated == 2
- @trigger('ready')
- @mediaTypeCollection.fetch(success: populatedMessage)
- @playerCollection.fetch(success: populatedMessage)
- _setUpRoutes: (router)->
- @router.on('route:media_type', (mediaTypeName)=>
- view = @_getContentBrowserViewFor(mediaTypeName)
- if view
- @_transitionBrowserViews(view)
- else
- router.navigate('', trigger: true)
- )
- @router.on('route:media_type_children', (mediaTypeName,mediaId)=>
- view = @_getMediaViewFor(mediaId)
- @_transitionBrowserViews(view)
- )
- @router.on('route:index', =>
- @_transitionBrowserViews(@_getMediTypeBrowser())
- )
- )
- PlaylistSession = Backbone.Model.extend(
- urlRoot: '/api/1/playback/sessions'
- )
- Player = Backbone.Model.extend()
- PlayerCollection = Backbone.Collection.extend(
- model: Player,
- url: ->
- '/api/1/playback/players'
- )
- RemoteView = Backbone.View.extend(
- rendered: false
- events:
- 'click button.add-playist-name': '_addPlaylistNameHandler'
- 'keydown input.playlist-name': '_inputKeypressHandler'
- localStoragePlaylistNameKey: 'playlist_name'
- initialize: (options) ->
- @playerCollection = options.playerCollection
- @playerCollection.on('change add reset', =>
- @reRender()
- )
- @playerCollection.fetch()
- render: ->
- @rendered = true
- playlistName = @_getPlaylistName()
- if playlistName
- @$el.html(HBT['remote/controls']({playlistName: playlistName, players: @_handlebarsSafeCollection(@playerCollection)}))
- else
- playlistName = localStorage.getItem(@localStoragePlaylistNameKey)
- @$el.html(HBT['remote/choose_playlist']({playlistName: playlistName}))
- reRender: ->
- if @rendered
- @render()
- _handlebarsSafeCollection: (collection)->
- newObject = []
- collection.each( (item)=>
- newObject.push(item.toJSON())
- )
- newObject
- _getPlaylistName: ->
- @_playlistName
- _getPlaylistInputElement: ->
- @$el.find('input.playlist-name')
- _setPlaylistName: (name)->
- localStorage.setItem(@localStoragePlaylistNameKey,name);
- @_playlistName = name
- @_refreshPlaylist()
- _addPlaylistNameHandler: ->
- newPlaylistName = @_getPlaylistInputElement().val()
- if newPlaylistName && newPlaylistName.trim() != ''
- @_setPlaylistName(newPlaylistName)
-
- _refreshPlaylist: ->
- @_playlistSession = new PlaylistSession(name: @_getPlaylistName())
- request = null
- request = @_playlistSession.save({}, success: =>
- @_playlistSession.on('sync': =>
- @render()
- )
- if request.status == 201
- @_playlistSession.url = request.getResponseHeader('location')
- @_playlistSession.fetch( success: =>
- @_addContentToPlaylist('/api/1/content/1')
- )
- else
- @render()
- )
- _inputKeypressHandler: (event)->
- if event.which == 13
- @$el.find('button.add-playist-name').click()
- _addContentToPlaylist: (url)->
- @_playlistSession.save({
- playlist: [url]
- player_url: @playerCollection.at(0).get('url')
- },{patch: true})
- )
- MediaTypeBrowserView = Backbone.View.extend(
- rendered: false
- initialize: (options)->
- @collection.on('add remove reset': =>
- @reRender()
- )
- render: ->
- @rendered = true
- @$el.html(HBT['library/media_type_list']({collection: @_handlebarsSafeCollection(@collection)}))
- _handlebarsSafeCollection: (collection)->
- newObject = []
- navigateableTypes = collection.filter((item) ->
- return item.get('parent_id') == null
- )
- _.each(navigateableTypes, (item)=>
- newObject.push(item.toJSON())
- )
- newObject
- reRender: ->
- if @rendered
- @render()
- )
- MediaTypes = Backbone.Model.extend()
- MediaTypeCollection = Backbone.Collection.extend(
- model: MediaTypes,
- url: ->
- '/api/1/media_types'
- )
- Media = Backbone.Model.extend(
- urlRoot: '/api/1/media'
- isSummary: true
- children: ->
- 1
- )
- MediaCollection = Backbone.Collection.extend(
- model: Media
- inLibrary: true
- url: ->
- '/api/1/media?in_library='+@inLibrary+'&media_type='+@mediaType.get('id')
- initialize: (options)->
- @mediaType=options.mediaType
- )
- MediaView = Backbone.View.extend(
- rendered: false
- initialize: (options)->
- @model.on('change sync': =>
- @reRender()
- )
- render: ->
- @rendered = true
- content = HBT['library/media_instance'](
- model: @model.toJSON()
- )
- @$el.html(content)
- reRender: ->
- if @rendered
- @render()
- )
- MediaCollectionView = Backbone.View.extend(
- rendered: false
- initialize: (options)->
- @collection.fetch()
- @mediaType = @collection.mediaType
- @collection.on('add remove reset': =>
- @reRender()
- )
- render: ->
- @rendered = true
- if @collection.isEmpty()
- content = HBT['library/empty_content']({type: @mediaType.get('name')})
- else
- content = HBT['library/content_list'](
- collection: @_handlebarsSafeCollection()
- mediaType: @mediaType.toJSON()
- hasChildren: @mediaType.get('child_ids').length > 0
- )
- @$el.html(content)
- _handlebarsSafeCollection: ->
- newObject = []
- @collection.each( (item)=>
- jsonOutput = item.toJSON()
- newObject.push(jsonOutput)
- )
- newObject
- reRender: ->
- if @rendered
- @render()
- )