PageRenderTime 56ms CodeModel.GetById 28ms RepoModel.GetById 1ms app.codeStats 0ms

/krum/webui/static/js/library/library.js.coffee

https://bitbucket.org/satook/krum_server
CoffeeScript | 285 lines | 240 code | 45 blank | 0 comment | 19 complexity | 04c51e388da1d932508021bbd296942c MD5 | raw file
  1. $(document).ready( ->
  2. window.krum ||= {}
  3. krum.pageModule = new LibraryModule(el: $('#content'))
  4. krum.pageModule.on('ready', ->
  5. krum.pageModule.render()
  6. Backbone.history.start()
  7. )
  8. )
  9. LibraryModuleRouter = Backbone.Router.extend(
  10. routes:
  11. '': 'index'
  12. ':media_type': 'media_type'
  13. ':media_type/:id': 'media_type_children'
  14. )
  15. LibraryModule = Backbone.View.extend(
  16. firstRender: true
  17. initialize: (options)->
  18. @router = new LibraryModuleRouter()
  19. @playerCollection = new PlayerCollection()
  20. @mediaTypeCollection = new MediaTypeCollection()
  21. @_setUpRoutes(@router)
  22. @_populateAllCollections()
  23. render: ->
  24. if @firstRender
  25. @firstRender = false
  26. @$el.html('<div id="remote"></div><div id="library-browser"></div>')
  27. @_remoteView = new RemoteView(el: @$el.find('#remote'), playerCollection: @playerCollection)
  28. @_contentBrowserView = @_getMediTypeBrowser()
  29. @_renderAllSubViews()
  30. _renderAllSubViews: ->
  31. _.each(@_getSubViews(), (subView) ->
  32. subView.render()
  33. )
  34. _getSubViews: ->
  35. [@_remoteView]
  36. _getContentBrowserView: ->
  37. @_contentBrowserView
  38. _transitionBrowserViews: (newContentBrowserView) ->
  39. @_contentBrowserView = newContentBrowserView
  40. @_contentBrowserView.render()
  41. _getCategoriesBrowserElement: ->
  42. @$el.find('#library-browser')
  43. _getContentBrowserViewFor: (mediaTypeName) ->
  44. mediaType = @mediaTypeCollection.where(name: mediaTypeName)[0]
  45. unless mediaType
  46. return null
  47. collection = new MediaCollection(mediaType: mediaType)
  48. new MediaCollectionView(el: @_getCategoriesBrowserElement(), collection: collection)
  49. _getMediTypeBrowser: ->
  50. new MediaTypeBrowserView(el: @_getCategoriesBrowserElement(), collection: @mediaTypeCollection)
  51. _getMediaViewFor: (id)->
  52. model = new Media(id: id)
  53. model.fetch()
  54. new MediaView(el: @_getCategoriesBrowserElement(), model: model )
  55. _populateAllCollections: ->
  56. populated = 0
  57. populatedMessage = =>
  58. populated += 1
  59. if populated == 2
  60. @trigger('ready')
  61. @mediaTypeCollection.fetch(success: populatedMessage)
  62. @playerCollection.fetch(success: populatedMessage)
  63. _setUpRoutes: (router)->
  64. @router.on('route:media_type', (mediaTypeName)=>
  65. view = @_getContentBrowserViewFor(mediaTypeName)
  66. if view
  67. @_transitionBrowserViews(view)
  68. else
  69. router.navigate('', trigger: true)
  70. )
  71. @router.on('route:media_type_children', (mediaTypeName,mediaId)=>
  72. view = @_getMediaViewFor(mediaId)
  73. @_transitionBrowserViews(view)
  74. )
  75. @router.on('route:index', =>
  76. @_transitionBrowserViews(@_getMediTypeBrowser())
  77. )
  78. )
  79. PlaylistSession = Backbone.Model.extend(
  80. urlRoot: '/api/1/playback/sessions'
  81. )
  82. Player = Backbone.Model.extend()
  83. PlayerCollection = Backbone.Collection.extend(
  84. model: Player,
  85. url: ->
  86. '/api/1/playback/players'
  87. )
  88. RemoteView = Backbone.View.extend(
  89. rendered: false
  90. events:
  91. 'click button.add-playist-name': '_addPlaylistNameHandler'
  92. 'keydown input.playlist-name': '_inputKeypressHandler'
  93. localStoragePlaylistNameKey: 'playlist_name'
  94. initialize: (options) ->
  95. @playerCollection = options.playerCollection
  96. @playerCollection.on('change add reset', =>
  97. @reRender()
  98. )
  99. @playerCollection.fetch()
  100. render: ->
  101. @rendered = true
  102. playlistName = @_getPlaylistName()
  103. if playlistName
  104. @$el.html(HBT['remote/controls']({playlistName: playlistName, players: @_handlebarsSafeCollection(@playerCollection)}))
  105. else
  106. playlistName = localStorage.getItem(@localStoragePlaylistNameKey)
  107. @$el.html(HBT['remote/choose_playlist']({playlistName: playlistName}))
  108. reRender: ->
  109. if @rendered
  110. @render()
  111. _handlebarsSafeCollection: (collection)->
  112. newObject = []
  113. collection.each( (item)=>
  114. newObject.push(item.toJSON())
  115. )
  116. newObject
  117. _getPlaylistName: ->
  118. @_playlistName
  119. _getPlaylistInputElement: ->
  120. @$el.find('input.playlist-name')
  121. _setPlaylistName: (name)->
  122. localStorage.setItem(@localStoragePlaylistNameKey,name);
  123. @_playlistName = name
  124. @_refreshPlaylist()
  125. _addPlaylistNameHandler: ->
  126. newPlaylistName = @_getPlaylistInputElement().val()
  127. if newPlaylistName && newPlaylistName.trim() != ''
  128. @_setPlaylistName(newPlaylistName)
  129. _refreshPlaylist: ->
  130. @_playlistSession = new PlaylistSession(name: @_getPlaylistName())
  131. request = null
  132. request = @_playlistSession.save({}, success: =>
  133. @_playlistSession.on('sync': =>
  134. @render()
  135. )
  136. if request.status == 201
  137. @_playlistSession.url = request.getResponseHeader('location')
  138. @_playlistSession.fetch( success: =>
  139. @_addContentToPlaylist('/api/1/content/1')
  140. )
  141. else
  142. @render()
  143. )
  144. _inputKeypressHandler: (event)->
  145. if event.which == 13
  146. @$el.find('button.add-playist-name').click()
  147. _addContentToPlaylist: (url)->
  148. @_playlistSession.save({
  149. playlist: [url]
  150. player_url: @playerCollection.at(0).get('url')
  151. },{patch: true})
  152. )
  153. MediaTypeBrowserView = Backbone.View.extend(
  154. rendered: false
  155. initialize: (options)->
  156. @collection.on('add remove reset': =>
  157. @reRender()
  158. )
  159. render: ->
  160. @rendered = true
  161. @$el.html(HBT['library/media_type_list']({collection: @_handlebarsSafeCollection(@collection)}))
  162. _handlebarsSafeCollection: (collection)->
  163. newObject = []
  164. navigateableTypes = collection.filter((item) ->
  165. return item.get('parent_id') == null
  166. )
  167. _.each(navigateableTypes, (item)=>
  168. newObject.push(item.toJSON())
  169. )
  170. newObject
  171. reRender: ->
  172. if @rendered
  173. @render()
  174. )
  175. MediaTypes = Backbone.Model.extend()
  176. MediaTypeCollection = Backbone.Collection.extend(
  177. model: MediaTypes,
  178. url: ->
  179. '/api/1/media_types'
  180. )
  181. Media = Backbone.Model.extend(
  182. urlRoot: '/api/1/media'
  183. isSummary: true
  184. children: ->
  185. 1
  186. )
  187. MediaCollection = Backbone.Collection.extend(
  188. model: Media
  189. inLibrary: true
  190. url: ->
  191. '/api/1/media?in_library='+@inLibrary+'&media_type='+@mediaType.get('id')
  192. initialize: (options)->
  193. @mediaType=options.mediaType
  194. )
  195. MediaView = Backbone.View.extend(
  196. rendered: false
  197. initialize: (options)->
  198. @model.on('change sync': =>
  199. @reRender()
  200. )
  201. render: ->
  202. @rendered = true
  203. content = HBT['library/media_instance'](
  204. model: @model.toJSON()
  205. )
  206. @$el.html(content)
  207. reRender: ->
  208. if @rendered
  209. @render()
  210. )
  211. MediaCollectionView = Backbone.View.extend(
  212. rendered: false
  213. initialize: (options)->
  214. @collection.fetch()
  215. @mediaType = @collection.mediaType
  216. @collection.on('add remove reset': =>
  217. @reRender()
  218. )
  219. render: ->
  220. @rendered = true
  221. if @collection.isEmpty()
  222. content = HBT['library/empty_content']({type: @mediaType.get('name')})
  223. else
  224. content = HBT['library/content_list'](
  225. collection: @_handlebarsSafeCollection()
  226. mediaType: @mediaType.toJSON()
  227. hasChildren: @mediaType.get('child_ids').length > 0
  228. )
  229. @$el.html(content)
  230. _handlebarsSafeCollection: ->
  231. newObject = []
  232. @collection.each( (item)=>
  233. jsonOutput = item.toJSON()
  234. newObject.push(jsonOutput)
  235. )
  236. newObject
  237. reRender: ->
  238. if @rendered
  239. @render()
  240. )