/flash/echo-nest-flash-api/src/com/ryanberdeen/echonest/api/v3/track/utils/TrackLoader.as

http://echo-nest-remix.googlecode.com/ · ActionScript · 129 lines · 106 code · 23 blank · 0 comment · 2 complexity · 562b4201dc1333708f6250bb20b3d049 MD5 · raw file

  1. package com.ryanberdeen.echonest.api.v3.track.utils {
  2. import com.ryanberdeen.echonest.api.v3.EchoNestError;
  3. import com.ryanberdeen.echonest.api.v3.EchoNestErrorEvent;
  4. import com.ryanberdeen.echonest.api.v3.track.AnalysisEvent;
  5. import com.ryanberdeen.echonest.api.v3.track.AnalysisLoader;
  6. import com.ryanberdeen.echonest.api.v3.track.TrackApi;
  7. import com.ryanberdeen.utils.MD5Calculator;
  8. import flash.events.Event;
  9. import flash.events.EventDispatcher;
  10. import flash.events.IOErrorEvent;
  11. import flash.events.SecurityErrorEvent;
  12. import flash.media.Sound;
  13. import flash.net.FileReference;
  14. import org.audiofx.mp3.MP3FileReferenceLoader;
  15. import org.audiofx.mp3.MP3SoundEvent;
  16. public class TrackLoader extends EventDispatcher {
  17. private var trackApi:TrackApi;
  18. private var _fileReference:FileReference;
  19. private var mp3Loader:MP3FileReferenceLoader;
  20. private var _md5Calculator:MD5Calculator;
  21. private var _analysisLoader:AnalysisLoader;
  22. private var _alwaysUpload:Boolean;
  23. private var _sound:Sound;
  24. private var _md5:String;
  25. private var _id:String;
  26. public function TrackLoader(trackApi:TrackApi) {
  27. this.trackApi = trackApi;
  28. _fileReference = new FileReference();
  29. _md5Calculator = new MD5Calculator();
  30. _analysisLoader = new AnalysisLoader(trackApi);
  31. _alwaysUpload = false;
  32. }
  33. public function set alwaysUpload(alwaysUpload:Boolean):void {
  34. _alwaysUpload = alwaysUpload;
  35. }
  36. public function get fileReference():FileReference {
  37. return _fileReference;
  38. }
  39. public function get md5Calculator():MD5Calculator {
  40. return _md5Calculator;
  41. }
  42. public function get analysisLoader():AnalysisLoader {
  43. return _analysisLoader;
  44. }
  45. public function get sound():Sound {
  46. return _sound;
  47. }
  48. public function load(...properties):void {
  49. _analysisLoader.properties = properties;
  50. _fileReference.addEventListener(Event.SELECT, fileReferenceSelectHandler);
  51. _fileReference.browse();
  52. }
  53. private function fileReferenceSelectHandler(e:Event):void {
  54. dispatchEvent(new TrackLoaderEvent(TrackLoaderEvent.LOADING_SOUND));
  55. mp3Loader = new MP3FileReferenceLoader();
  56. mp3Loader.addEventListener(Event.COMPLETE, soundLoadCompleteHandler);
  57. mp3Loader.getSound(_fileReference);
  58. }
  59. private function soundLoadCompleteHandler(e:MP3SoundEvent):void {
  60. _sound = e.sound;
  61. dispatchEvent(new TrackLoaderEvent(TrackLoaderEvent.SOUND_LOADED));
  62. mp3Loader.removeEventListener(Event.COMPLETE, soundLoadCompleteHandler);
  63. if (_alwaysUpload) {
  64. uploadFile();
  65. }
  66. else {
  67. calculateMd5();
  68. }
  69. }
  70. private function calculateMd5():void {
  71. dispatchEvent(new TrackLoaderEvent(TrackLoaderEvent.CALCULATING_MD5));
  72. _md5Calculator.addEventListener(Event.COMPLETE, md5CompleteHandler);
  73. _md5Calculator.calculate(_fileReference.data);
  74. }
  75. private function md5CompleteHandler(e:Event):void {
  76. dispatchEvent(new TrackLoaderEvent(TrackLoaderEvent.MD5_CALCULATED));
  77. _md5 = _md5Calculator.md5;
  78. _md5Calculator = null;
  79. dispatchEvent(new TrackLoaderEvent(TrackLoaderEvent.CHECKING_ANALYSIS));
  80. loadAnalysis({md5: _md5});
  81. }
  82. private function uploadFile():void {
  83. dispatchEvent(new TrackLoaderEvent(TrackLoaderEvent.UPLOADING_FILE));
  84. trackApi.uploadFileReference({file: _fileReference, wait: "N"}, {
  85. onResponse: function(track:Object):void {
  86. _id = track.id;
  87. dispatchEvent(new TrackLoaderEvent(TrackLoaderEvent.FILE_UPLOADED));
  88. dispatchEvent(new TrackLoaderEvent(TrackLoaderEvent.LOADING_ANALYSIS));
  89. loadAnalysis({id: _id});
  90. },
  91. onEchoNestError: function(error:EchoNestError):void {
  92. dispatchEvent(error.createEvent());
  93. },
  94. onError: dispatchEvent
  95. });
  96. }
  97. private function loadAnalysis(parameters:Object):void {
  98. _analysisLoader.addEventListener(AnalysisEvent.UNKNOWN, analysisUnknownHandler);
  99. _analysisLoader.load(parameters);
  100. }
  101. private function analysisUnknownHandler(e:Event):void {
  102. uploadFile();
  103. dispatchEvent(e);
  104. }
  105. }
  106. }