{"action":"created","comment":{"url":"https://api.github.com/repos/gaia-components/gaia-media-controls/pulls/comments/29528822","id":29528822,"diff_hunk":"@@ -0,0 +1,524 @@\n+;(function(define){'use strict';define(function(require,exports,module){\n+\n+/*\n+** MediaControlsImpl object\n+*/\n+function MediaControlsImpl(mediaControlsElement, shadowRoot, player) {\n+  this.mediaControlsElement = mediaControlsElement;\n+  this.shadowRoot = shadowRoot;\n+  this.touchStartID = null;\n+  this.isPausedWhileDragging = null;\n+  this.dragging = false;\n+  this.sliderRect = null;\n+  this.playedUntilEnd = false;\n+  this.intervalId = null;\n+  this.pausedAtEndWhilePlaying = false;\n+  this.mediaPlayer = player;\n+  this.seekIncrement = 10; // Seek forward/backward in 10 second increments\n+  this.mouseEventHandlerRegistered = false;\n+\n+  this.els = {\n+    durationText: this.shadowRoot.querySelector('.duration-text'),\n+    elapsedText: this.shadowRoot.querySelector('.elapsed-text'),\n+    elapsedTime: this.shadowRoot.querySelector('.elapsed-time'),\n+    play: this.shadowRoot.querySelector('.play'),\n+    playHead: this.shadowRoot.querySelector('.play-head'),\n+    seekForward: this.shadowRoot.querySelector('.seek-forward'),\n+    seekBackward: this.shadowRoot.querySelector('.seek-backward'),\n+    sliderWrapper: this.shadowRoot.querySelector('.slider-wrapper')\n+  };\n+\n+  this.addEventListeners();\n+}\n+\n+MediaControlsImpl.prototype.addEventListeners = function() {\n+  this.shadowRoot.addEventListener('touchstart', this);\n+  this.shadowRoot.addEventListener('touchmove', this);\n+  this.shadowRoot.addEventListener('touchend', this);\n+  this.shadowRoot.addEventListener('mousedown', this);\n+\n+  this.mediaPlayer.addEventListener('loadedmetadata', this);\n+  this.mediaPlayer.addEventListener('play', this);\n+  this.mediaPlayer.addEventListener('pause', this);\n+  this.mediaPlayer.addEventListener('timeupdate', this)\n+  this.mediaPlayer.addEventListener('seeked', this);\n+  this.mediaPlayer.addEventListener('ended', this);\n+};\n+\n+MediaControlsImpl.prototype.removeEventListeners = function() {\n+  this.shadowRoot.removeEventListener('touchstart', this);\n+  this.shadowRoot.removeEventListener('touchmove', this);\n+  this.shadowRoot.removeEventListener('touchend', this);\n+  this.shadowRoot.removeEventListener('mousedown', this);\n+\n+  this.mediaPlayer.removeEventListener('loadedmetadata', this);\n+  this.mediaPlayer.removeEventListener('play', this);\n+  this.mediaPlayer.removeEventListener('pause', this);\n+  this.mediaPlayer.removeEventListener('timeupdate', this)\n+  this.mediaPlayer.removeEventListener('seeked', this);\n+  this.mediaPlayer.removeEventListener('ended', this);\n+\n+  if (this.mouseEventHandlerRegistered) {\n+    this.shadowRoot.removeEventListener('mousemove', this, true);\n+    this.shadowRoot.removeEventListener('mouseup', this, true);\n+  }\n+\n+  this.mouseEventHandlerRegistered = false;\n+};\n+\n+MediaControlsImpl.prototype.handleEvent = function(e) {\n+\n+  // If we get a touchstart, don't process mouse events\n+  if (e.type === 'touchstart') {\n+    this.shadowRoot.removeEventListener('mousedown', this);\n+    this.shadowRoot.removeEventListener('mousemove', this);\n+    this.shadowRoot.removeEventListener('mouseup', this);\n+  }\n+\n+  switch(e.type) {\n+\n+    case 'mousedown':\n+      //\n+      // The component is listening to window 'mousemove' events so\n+      // that the slider movement will function even when the mouse\n+      // moves off the play head. However, if the component is always\n+      // listening to the window events, it would receive very many\n+      // spurious 'mousemove' events. To prevent this, the component\n+      // only listens to 'mousemove' events after receiving a 'mousedown'\n+      // event.\n+      //\n+      if (!this.mouseEventHandlerRegistered) {\n+        window.addEventListener('mousemove', this, true);\n+        window.addEventListener('mouseup', this, true);\n+        this.mouseEventHandlerRegistered = true;\n+      }\n+\n+      // fall through to touchstart...\n+\n+    case 'touchstart':\n+      switch(e.target) {\n+        case this.els.play:\n+          //\n+          // Let the 'play' and 'pause' handlers take care of changing\n+          // the icon and setting the l10n-id (for the screen reader).\n+          //\n+          if (this.mediaPlayer.paused) {\n+            this.mediaPlayer.play();\n+          }\n+          else {\n+            this.mediaPlayer.pause();\n+          }\n+          break;\n+\n+        case this.els.seekForward:\n+        case this.els.seekBackward:\n+\n+          var direction = null;\n+          if (e.target === this.els.seekForward) {\n+            direction = 1;\n+          } else if (e.target === this.els.seekBackward) {\n+            direction = -1;\n+          } else {\n+            return;\n+          }\n+\n+          var offset = direction * 10;\n+          this.seekBy(this.mediaPlayer.currentTime + offset);\n+\n+          // Begin the \"longpress\" movement after a one second delay.\n+          var self = this;\n+          this.intervalId = window.setInterval(function() {\n+              self.seekBy(self.mediaPlayer.currentTime + offset);\n+            }, 1000);\n+          break;\n+      }\n+      break;\n+\n+      case 'touchend':\n+      case 'mouseup':\n+        //\n+        // If ending a long-press forward or backward, clear timer\n+        //\n+        if (this.intervalId) {\n+           window.clearInterval(this.intervalId);\n+           this.intervalId = null;\n+        }\n+        else if (this.dragging) {\n+          // If ending a movement of the slider, end slider movement\n+          this.handleSliderMoveEnd();\n+        }\n+\n+        if (e.type === 'mouseup') {\n+          // Don't listen for mousemove and mouseup until we get a mousedown\n+          window.removeEventListener('mousemove', this, true);\n+          window.removeEventListener('mouseup', this, true);\n+          this.mouseEventHandlerRegistered = false;\n+        }\n+        break;\n+\n+    case 'loadedmetadata':\n+      //\n+      // Metadata has been loaded, now we can set the duration of the media\n+      //\n+      this.els.durationText.textContent = this.formatTime(this.mediaPlayer.duration);\n+      break;\n+\n+    case 'play':\n+      //\n+      // Media is playing, display 'paused' icon\n+      //\n+      this.els.play.classList.remove('paused');\n+\n+      // Update l10n-id for the benefit of the screen reader\n+      this.els.play.setAttribute('data-l10n-id', 'playbackPlay');\n+      break;\n+\n+    case 'pause':\n+      //\n+      // Media is paused, display 'play' icon\n+      //\n+      this.els.play.classList.add('paused');\n+\n+      // Update l10n-id for the benefit of the screen reader\n+      this.els.play.setAttribute('data-l10n-id', 'playbackPause');\n+\n+      // If the paused event comes when the media is at the end,\n+      // set our 'played-till-end' flag. The one exception is when\n+      // the paused event comes from pausing the media when the\n+      // forward button was used to seek to the end while the media\n+      // was playing. In this case, we don't consider the media being\n+      // played until the end.\n+      if (this.mediaPlayer.currentTime === this.mediaPlayer.duration) {\n+        if (this.pausedAtEndWhilePlaying) {\n+          this.pausedAtEndWhilePlaying = false;\n+        }\n+        else {\n+          this.playedUntilEnd = true;\n+        }\n+      }\n+      break;\n+\n+    case 'timeupdate':\n+      //\n+      // Update the progress bar and play head as the video plays\n+      //\n+      if (!this.mediaControlsElement.hidden) {\n+        this.updateMediaControlSlider();\n+      }\n+      break;\n+\n+    case 'seeked':\n+      //\n+      // Update the position of the slider when the video position has been\n+      // moved.\n+      //\n+      this.updateMediaControlSlider();\n+      break;\n+\n+    case 'ended':\n+      //\n+      // Ignore ended events that occur while the user is dragging the slider\n+      //\n+      if (this.dragging) {\n+        return;\n+      }\n+\n+      // If the media was played until the end (as opposed to being forwarded\n+      // to the end), position the player at the beginning of the video.\n+      if (this.playedUntilEnd) {","path":"lib/media-controls-impl.js","position":228,"original_position":228,"commit_id":"8cbf440ef6686213e0e881b9919e4316e67309f0","original_commit_id":"8cbf440ef6686213e0e881b9919e4316e67309f0","user":{"login":"davidflanagan","id":516914,"avatar_url":"https://avatars.githubusercontent.com/u/516914?v=3","gravatar_id":"","url":"https://api.github.com/users/davidflanagan","html_url":"https://github.com/davidflanagan","followers_url":"https://api.github.com/users/davidflanagan/followers","following_url":"https://api.github.com/users/davidflanagan/following{/other_user}","gists_url":"https://api.github.com/users/davidflanagan/gists{/gist_id}","starred_url":"https://api.github.com/users/davidflanagan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davidflanagan/subscriptions","organizations_url":"https://api.github.com/users/davidflanagan/orgs","repos_url":"https://api.github.com/users/davidflanagan/repos","events_url":"https://api.github.com/users/davidflanagan/events{/privacy}","received_events_url":"https://api.github.com/users/davidflanagan/received_events","type":"User","site_admin":false},"body":"This is kind of complicated logic, and it is also app-specific. For the music app, when we reach the end we would want to move on to the next song, not go back to the start.  I wonder if the better solution would be to fire an event in the normal played-until-end case and let the app handle it.\r\n\r\nFor now, what if we just ignored ended events? And if you did that, can you get rid of the special case code on the paused event, too?","created_at":"2015-05-01T19:54:53Z","updated_at":"2015-05-01T19:54:53Z","html_url":"https://github.com/gaia-components/gaia-media-controls/pull/1#discussion_r29528822","pull_request_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/pulls/1","_links":{"self":{"href":"https://api.github.com/repos/gaia-components/gaia-media-controls/pulls/comments/29528822"},"html":{"href":"https://github.com/gaia-components/gaia-media-controls/pull/1#discussion_r29528822"},"pull_request":{"href":"https://api.github.com/repos/gaia-components/gaia-media-controls/pulls/1"}}},"pull_request":{"url":"https://api.github.com/repos/gaia-components/gaia-media-controls/pulls/1","id":32731147,"html_url":"https://github.com/gaia-components/gaia-media-controls/pull/1","diff_url":"https://github.com/gaia-components/gaia-media-controls/pull/1.diff","patch_url":"https://github.com/gaia-components/gaia-media-controls/pull/1.patch","issue_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/issues/1","number":1,"state":"open","locked":false,"title":"Initial commit","user":{"login":"russnicoletti","id":5983096,"avatar_url":"https://avatars.githubusercontent.com/u/5983096?v=3","gravatar_id":"","url":"https://api.github.com/users/russnicoletti","html_url":"https://github.com/russnicoletti","followers_url":"https://api.github.com/users/russnicoletti/followers","following_url":"https://api.github.com/users/russnicoletti/following{/other_user}","gists_url":"https://api.github.com/users/russnicoletti/gists{/gist_id}","starred_url":"https://api.github.com/users/russnicoletti/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/russnicoletti/subscriptions","organizations_url":"https://api.github.com/users/russnicoletti/orgs","repos_url":"https://api.github.com/users/russnicoletti/repos","events_url":"https://api.github.com/users/russnicoletti/events{/privacy}","received_events_url":"https://api.github.com/users/russnicoletti/received_events","type":"User","site_admin":false},"body":"The README has two issues that I know of. 1) I have not registered the component with bower so it is not yet installable by bower. 2) The url of the demo needs to be updated when it is pushed to its proper github location. ","created_at":"2015-04-07T03:39:51Z","updated_at":"2015-05-01T19:54:53Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d81f2d6dbc4c6957f4afe32b0a58e22d402011d9","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/pulls/1/commits","review_comments_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/pulls/1/comments","review_comment_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/pulls/comments{/number}","comments_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/issues/1/comments","statuses_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/statuses/8cbf440ef6686213e0e881b9919e4316e67309f0","head":{"label":"russnicoletti:media-controls-component","ref":"media-controls-component","sha":"8cbf440ef6686213e0e881b9919e4316e67309f0","user":{"login":"russnicoletti","id":5983096,"avatar_url":"https://avatars.githubusercontent.com/u/5983096?v=3","gravatar_id":"","url":"https://api.github.com/users/russnicoletti","html_url":"https://github.com/russnicoletti","followers_url":"https://api.github.com/users/russnicoletti/followers","following_url":"https://api.github.com/users/russnicoletti/following{/other_user}","gists_url":"https://api.github.com/users/russnicoletti/gists{/gist_id}","starred_url":"https://api.github.com/users/russnicoletti/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/russnicoletti/subscriptions","organizations_url":"https://api.github.com/users/russnicoletti/orgs","repos_url":"https://api.github.com/users/russnicoletti/repos","events_url":"https://api.github.com/users/russnicoletti/events{/privacy}","received_events_url":"https://api.github.com/users/russnicoletti/received_events","type":"User","site_admin":false},"repo":{"id":33512368,"name":"gaia-media-controls","full_name":"russnicoletti/gaia-media-controls","owner":{"login":"russnicoletti","id":5983096,"avatar_url":"https://avatars.githubusercontent.com/u/5983096?v=3","gravatar_id":"","url":"https://api.github.com/users/russnicoletti","html_url":"https://github.com/russnicoletti","followers_url":"https://api.github.com/users/russnicoletti/followers","following_url":"https://api.github.com/users/russnicoletti/following{/other_user}","gists_url":"https://api.github.com/users/russnicoletti/gists{/gist_id}","starred_url":"https://api.github.com/users/russnicoletti/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/russnicoletti/subscriptions","organizations_url":"https://api.github.com/users/russnicoletti/orgs","repos_url":"https://api.github.com/users/russnicoletti/repos","events_url":"https://api.github.com/users/russnicoletti/events{/privacy}","received_events_url":"https://api.github.com/users/russnicoletti/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/russnicoletti/gaia-media-controls","description":"Playback controls for audio or video elements","fork":true,"url":"https://api.github.com/repos/russnicoletti/gaia-media-controls","forks_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/forks","keys_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/keys{/key_id}","collaborators_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/teams","hooks_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/hooks","issue_events_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/issues/events{/number}","events_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/events","assignees_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/assignees{/user}","branches_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/branches{/branch}","tags_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/tags","blobs_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/git/refs{/sha}","trees_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/git/trees{/sha}","statuses_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/statuses/{sha}","languages_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/languages","stargazers_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/stargazers","contributors_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/contributors","subscribers_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/subscribers","subscription_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/subscription","commits_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/commits{/sha}","git_commits_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/git/commits{/sha}","comments_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/comments{/number}","issue_comment_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/issues/comments{/number}","contents_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/contents/{+path}","compare_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/compare/{base}...{head}","merges_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/merges","archive_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/downloads","issues_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/issues{/number}","pulls_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/pulls{/number}","milestones_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/milestones{/number}","notifications_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/labels{/name}","releases_url":"https://api.github.com/repos/russnicoletti/gaia-media-controls/releases{/id}","created_at":"2015-04-07T00:05:13Z","updated_at":"2015-04-07T00:25:47Z","pushed_at":"2015-04-23T16:54:40Z","git_url":"git://github.com/russnicoletti/gaia-media-controls.git","ssh_url":"git@github.com:russnicoletti/gaia-media-controls.git","clone_url":"https://github.com/russnicoletti/gaia-media-controls.git","svn_url":"https://github.com/russnicoletti/gaia-media-controls","homepage":null,"size":131,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"gaia-components:master","ref":"master","sha":"5ebbf937c9f20ef3baf29b2bb905a8c6b5a01d18","user":{"login":"gaia-components","id":7851599,"avatar_url":"https://avatars.githubusercontent.com/u/7851599?v=3","gravatar_id":"","url":"https://api.github.com/users/gaia-components","html_url":"https://github.com/gaia-components","followers_url":"https://api.github.com/users/gaia-components/followers","following_url":"https://api.github.com/users/gaia-components/following{/other_user}","gists_url":"https://api.github.com/users/gaia-components/gists{/gist_id}","starred_url":"https://api.github.com/users/gaia-components/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gaia-components/subscriptions","organizations_url":"https://api.github.com/users/gaia-components/orgs","repos_url":"https://api.github.com/users/gaia-components/repos","events_url":"https://api.github.com/users/gaia-components/events{/privacy}","received_events_url":"https://api.github.com/users/gaia-components/received_events","type":"Organization","site_admin":false},"repo":{"id":33142913,"name":"gaia-media-controls","full_name":"gaia-components/gaia-media-controls","owner":{"login":"gaia-components","id":7851599,"avatar_url":"https://avatars.githubusercontent.com/u/7851599?v=3","gravatar_id":"","url":"https://api.github.com/users/gaia-components","html_url":"https://github.com/gaia-components","followers_url":"https://api.github.com/users/gaia-components/followers","following_url":"https://api.github.com/users/gaia-components/following{/other_user}","gists_url":"https://api.github.com/users/gaia-components/gists{/gist_id}","starred_url":"https://api.github.com/users/gaia-components/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gaia-components/subscriptions","organizations_url":"https://api.github.com/users/gaia-components/orgs","repos_url":"https://api.github.com/users/gaia-components/repos","events_url":"https://api.github.com/users/gaia-components/events{/privacy}","received_events_url":"https://api.github.com/users/gaia-components/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/gaia-components/gaia-media-controls","description":"Playback controls for audio or video elements","fork":false,"url":"https://api.github.com/repos/gaia-components/gaia-media-controls","forks_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/forks","keys_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/keys{/key_id}","collaborators_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/teams","hooks_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/hooks","issue_events_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/issues/events{/number}","events_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/events","assignees_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/assignees{/user}","branches_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/branches{/branch}","tags_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/tags","blobs_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/git/refs{/sha}","trees_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/git/trees{/sha}","statuses_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/statuses/{sha}","languages_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/languages","stargazers_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/stargazers","contributors_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/contributors","subscribers_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/subscribers","subscription_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/subscription","commits_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/commits{/sha}","git_commits_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/git/commits{/sha}","comments_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/comments{/number}","issue_comment_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/issues/comments{/number}","contents_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/contents/{+path}","compare_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/compare/{base}...{head}","merges_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/merges","archive_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/downloads","issues_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/issues{/number}","pulls_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/pulls{/number}","milestones_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/milestones{/number}","notifications_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/labels{/name}","releases_url":"https://api.github.com/repos/gaia-components/gaia-media-controls/releases{/id}","created_at":"2015-03-30T19:20:10Z","updated_at":"2015-03-30T19:20:10Z","pushed_at":"2015-04-22T21:58:40Z","git_url":"git://github.com/gaia-components/gaia-media-controls.git","ssh_url":"git@github.com:gaia-components/gaia-media-controls.git","clone_url":"https://github.com/gaia-components/gaia-media-controls.git","svn_url":"https://github.com/gaia-components/gaia-media-controls","homepage":null,"size":224,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":1,"forks":1,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/gaia-components/gaia-media-controls/pulls/1"},"html":{"href":"https://github.com/gaia-components/gaia-media-controls/pull/1"},"issue":{"href":"https://api.github.com/repos/gaia-components/gaia-media-controls/issues/1"},"comments":{"href":"https://api.github.com/repos/gaia-components/gaia-media-controls/issues/1/comments"},"review_comments":{"href":"https://api.github.com/repos/gaia-components/gaia-media-controls/pulls/1/comments"},"review_comment":{"href":"https://api.github.com/repos/gaia-components/gaia-media-controls/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/gaia-components/gaia-media-controls/pulls/1/commits"},"statuses":{"href":"https://api.github.com/repos/gaia-components/gaia-media-controls/statuses/8cbf440ef6686213e0e881b9919e4316e67309f0"}}}}