reproductor javascript angularjs angular angularjs-directive angularjs-scope

javascript - reproductor m3u8 html5



maneja APlayer a través de js angulares-reproduce música dinámicamente (1)

Soy nuevo en js angulares: intento construir una reproducción de audio con Aplayer

Tarea: - 1. Reproducir música dinámicamente 2. Al hacer clic en el álbum, obtén datos json y agrégalo al reproductor

(function() { ''use strict''; angular.module(''app'', []); angular .module(''app'') .directive(''aplayer'', aplayer); function aplayer() { return { restrict: ''AC'', link: function(scope, element, attrs) { // `element` is the angular element the directive is attached to // APlayer need the native one var nativeElement = element[0]; var ap1 = new APlayer({ element: nativeElement, narrow: false, autoplay: true, showlrc: false, mutex: true, theme: ''#e6d0b2'', preload: ''metadata'', mode: ''circulation'', music: { title: attrs["playerTitle"], author: attrs["playerAuthor"], url: attrs["playerUrl"], pic: attrs["playerPic"] } }); ap1.on(''play'', function() { console.log(''play''); }); ap1.on(''play'', function() { console.log(''play play''); }); ap1.on(''pause'', function() { console.log(''pause''); }); ap1.on(''canplay'', function() { console.log(''canplay''); }); ap1.on(''playing'', function() { console.log(''playing''); }); ap1.on(''ended'', function() { console.log(''ended''); }); ap1.on(''error'', function() { console.log(''error''); }); } }; } })();

<!doctype html> <html lang="en" ng-app="app"> <head> <meta charset="utf-8"> <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.4/angular.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/aplayer/1.6.0/APlayer.min.js"></script> <script src="script.js"></script> </head> <body> <div class="aplayer" data-player-title="Preparation" data-player-author="Hans Zimmer/Richard Harvey" data-player-url="http://devtest.qiniudn.com/Preparation.mp3" data-player-pic="http://devtest.qiniudn.com/Preparation.jpg"></div> </body> </html>

Cómo pasar archivos de música dinámicamente a Aplayer al hacer clic en un álbum.


De acuerdo con el código fuente de Aplayer, no es posible reemplazar la pista de música o la lista de reproducción de forma dinámica. API solo expone el método setMusic que permite elegir el índice de seguimiento en la lista de reproducción de música.

Para mostrar sus álbumes, primero debe cargarlos usando un servicio que llamará a su API de pistas .

Una vez cargados, puedes insertarlos en tu directiva de jugadores y elegir el índice de la pista para jugar.

Aquí hay un fragmento de muestra con:

  • un servicio de música para manejar su biblioteca de música

  • un TrackController para cargar y mostrar su biblioteca de música

  • una directiva de aplayer modificada para manejar las pistas y el índice de seguimiento actual

Nota: estoy usando música gratuita de Free Music Archive para esta demostración.

(function() { ''use strict''; angular.module(''app'', []); angular .module(''app'') .factory(''musicService'', [''$timeout'', musicService]) .controller(''TracksController'', [''$scope'', ''musicService'', TracksController]) .directive(''aplayer'', aplayer); function musicService($timeout) { return { loadTracks: function() { // Simulate a 1500 ms $http api call return $timeout(function() { return [{ title: ''Procrastinating in the Sun'', author: ''The Spin Wires'', url: ''https://freemusicarchive.org/music/download/e7fee95c2d7f7b1ea8d4260850a6128842eb85a4'', pic: ''https://freemusicarchive.org/file/images/artists/The_Spin_Wires_-_20170510154106040.jpg?width=290&height=290'' }, { title: ''осоле'', author: ''Kosta T'', url: ''https://freemusicarchive.org/music/download/0e4d722be7bd7ca334970b5407b3e5654b95f7a2'', pic: ''https://freemusicarchive.org/file/images/tracks/Track_-_2017050264944176?method=crop&width=290&height=290'' } ]; }, 1500); } } } function TracksController($scope, musicService) { $scope.loadingTracks = true; $scope.showPlayer = false; musicService.loadTracks() .then(function(tracks) { // Once tracks are loaded, update scope $scope.tracks = tracks; $scope.loadingTracks = false; }); $scope.play = function(trackIndex) { $scope.trackIndex = trackIndex; $scope.showPlayer = true; } } function aplayer() { return { restrict: ''AC'', scope: { tracks: ''='', trackIndex: ''='' }, link: link }; function link(scope, element, attrs) { var player = new APlayer({ narrow: true, mode: "order", music: scope.tracks }); // Watch for trackIndex changes scope.$watch( function(scope) { // Return the "result" of the watch expression as it''s more efficient // @see http://www.bennadel.com/blog/2852-understanding-how-to-use-scope-watch-with-controller-as-in-angularjs.htm return scope.trackIndex; }, function(currentIndex, previousIndex) { // As currentIndex is an integer, if(0) equals if(false) // But we can use a regular expression to check it''s an integer if (//d/.test(currentIndex)) { player.setMusic(parseInt(currentIndex)); player.play(); } }); } } })();

<!doctype html> <html lang="en" ng-app="app"> <head> <meta charset="utf-8"> <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.4/angular.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/aplayer/1.6.0/APlayer.min.js"></script> <style> ul li { list-style-type: none; } ul li * { vertical-align: middle } </style> </head> <body ng-controller="TracksController"> <div ng-if="loadingTracks">Loading tracks, please wait...</div> <ul> <li ng-repeat="track in tracks"> <img ng-src="{{track.pic}}" width="64" height="64"> <button ng-click="play($index)">Play</button> {{track.author}} / {{track.title}} </li> </ul> <div ng-if="tracks && showPlayer"> <h2>Now playing</h2> <div>{{tracks[trackIndex].author}} / {{tracks[trackIndex].title}}</div> <div class="aplayer" data-tracks="tracks" data-track-index="trackIndex"></div> </div> </body> </html>