{"action":"created","comment":{"url":"https://api.github.com/repos/WICG/mediasession/pulls/comments/78372303","id":78372303,"diff_hunk":"@@ -0,0 +1,244 @@\n+# MediaSession API Explained\n+\n+## Objectives\n+\n+Media is an important part of the web. A problem of media on the web is that it\n+does not integrate well with the platform. The MediaSession API helps closing\n+the gap between the web and native on mobile.\n+\n+### Allowing pages to specify the currently playing media metadata\n+\n+As many websites provide media content (eg. a video or audio clip) , they may\n+want to let the user know what media is currently playing (which is called\n+**media metadata**). Some sites (YouTube, Soundcloud, etc.) change the page\n+title to display this info. This work around has limitations when integrating\n+with the platform, for example there is no way to specify rich metadata like\n+album title, artist name or album art which can be displayed in platform UI.\n+\n+The MediaSession API gives pages the ability to specify the metadata of the\n+currently playing media. The metadata will be passed to the platform, and can be\n+displayed in media centers, notification, device lockscreen etc. The user then\n+can observe what is currently playing. Here are some screenshots of\n+notification, control center and lockscreen for music & podcast applications\n+take on Android and iOS:\n+\n+![Screenshots](images/screenshots.png)\n+\n+### Allowing pages to respond to media controls\n+\n+Many platforms provide interfaces for native app developers to respond to media\n+controls, which come from headset buttons, keyboard media buttons, media\n+centers, etc. It will improve the user experience significantly if web pages can\n+respond to these controls, especially for commands such as \"play/pause\",\n+\"previous/next track\" and \"seek back/forward\".\n+\n+The MediaSession API gives pages the ability to respond to platform media\n+controls. By implementing the API, the user agent will act as a proxy and pass\n+the media control events to web pages, so that the pages can perform\n+corresponding actions.\n+\n+For example, a podcast website can tell the user agent that it wants to receive\n+\"seek forward/backward\" commands, and when the commands are received, the\n+website changes the playback position accordingly. A music website can tell the\n+user agent that it wants to receive \"previous/next track\" commands, so that it\n+can switch tracks when these commands are received.\n+\n+## API design\n+\n+We want to achieve the two objectives in the same API because media metadata and\n+media controls are usually bonded together at least with regards to UI elements.\n+It is intuitive that a user to control the media whose metadata is displayed on\n+platform UI. On Android, the\n+[MediaSession class](https://developer.android.com/reference/android/media/session/MediaSession.html)\n+both handles media metadata and media controls, while on iOS,\n+[MPNowPlayingInfoCenter](https://developer.apple.com/library/ios/documentation/MediaPlayer/Reference/MPNowPlayingInfoCenter_Class/)\n+handles media metadata and\n+[MPRemoteCommandCenter](https://developer.apple.com/library/ios/documentation/MediaPlayer/Reference/MPRemoteCommandCenter_Ref/)\n+handles media controls but they are both singletons per application. Besides, it\n+is still doable if the page truly wants media metadata without media controls or\n+vice versa.\n+\n+### The MediaSession interface\n+\n+The `MediaSession` object is the main interface for this API, which looks like\n+the following:\n+\n+```js\n+interface MediaSession {\n+    attribute MediaMetadata? metadata;\n+    // TODO: define API for media controls.\n+};\n+```\n+\n+### The `MediaMetadata` interface\n+\n+A `MediaMetadata` object can contain media metadata like title, artist, album\n+and album art. To set the metadata for a `MediaSession`, the page should create\n+a `MediaMetadata` object and assign it to a `MediaSession` object:\n+\n+```js\n+// Let |session| be a MediaSession object\n+session.metadata = new MediaMetadata(/* MediaMetadata constructor */);\n+```\n+\n+The `MediaMetadata` interface generally looks like (details are omitted):\n+\n+```js\n+[Constructor=...]\n+interface MediaMetadata {\n+    attribute DOMString title;\n+    attribute DOMString artist;\n+    attribute DOMString album;\n+    attribute MediaImage artwork;  // Omitting MediaImage details\n+};\n+```\n+\n+### Media controls\n+\n+**Note** The spec will handle these use cases but not as part of the first\n+iteration.\n+\n+The interfaces for media controls will be part of the `MediaSession` interface,\n+but the details are not decided yet. In general, the page should tell which\n+media controls it would like to receive, and register corresponding callbacks to\n+`MediaSession`. Then the user agent should listen to these events from the\n+platform and notify the page by calling the registered callbacks.\n+\n+**Note** Websites might ignore some media control events, especially\n+  \"pause\". These events should be intervened by the user agent or the platform,\n+  and should not be handled by the websites, or maybe we should do both handling\n+  the events in the user agent and notifying the page about the event. This is\n+  still an open question.\n+\n+### `MediaSession` routing\n+\n+It usually makes more sense to display the media metadata of one page and let\n+only that page respond to media controls than doing that for multiple pages at\n+the same time. Since multiple tabs can have `MediaSession` objects, the user\n+agent should have a routing mechanism to select one `MediaSession`. The media\n+metadata of the selected `MediaSession` will be passed to the platform for UI\n+display, and all media controls are routed to that `MediaSession`. The user\n+agent should give control to the page or component that is currently playing the\n+most meaningful media to the user. If the AudioFocus API is being used, it is\n+defined by the API. Otherwise, the user agent should route `MediaSession` based\n+on platform conventions and the preferred user experience.\n+\n+### `MediaSession` as a global instance or a user-constructible object?\n+\n+It is an open question that we make `MediaSession` a global instance or\n+user-constructible, the discussions are as follows:\n+\n+#### `MediaSession` as a global instance\n+\n+If we consider each page as an application, it is straightforward that each page\n+has only one `MediaSession`, and the page takes full responsibility of setting\n+the media metadata and responds to media controls. In this way, we can make\n+`MediaSession` a global object, and it is not user-constructible. For this we\n+provide a partial interface to the Navigator object:\n+\n+```js\n+partial interface Navigator {\n+  readonly attribute MediaSession? mediaSession;\n+};\n+```\n+\n+In this solution, the top-level frame and each child frame will have its own\n+`MediaSession` object, and the user agent should decide to select the\n+`MediaSession` from which frame to select. The top-level frame `MediaSession` is\n+preferred.\n+\n+The advantage of this solution is very simple and easy to use, while the\n+disadvantage is that it may lack some flexibility, and there might be race\n+issues when the metadata is set in multiple places.\n+\n+#### `MediaSession` as a user-constructible object\n+\n+A more flexible solution is to make `MediaSession` a user-constructible\n+object. `MediaSession`s can be activated and deactivated, and they can override\n+each other. In this way, the `MediaSession` interface will look like this:\n+\n+```js\n+[Constructor()]\n+interface MediaSession {\n+    attribute MediaMetadata? metadata;\n+    // TODO: define API for media controls.\n+\n+    Promise<void> activate();\n+    void deactivate();\n+    readonly attribute boolean   active;\n+    attribute EventHandler       onactivationchange;\n+};\n+```\n+\n+The page can have multiple `MediaSession`s that exist at the same time, and it\n+needs to activate/deactivate them to indicate which one is in use. There will be\n+races if multiple `MediaSession`s are active at the same time, and the user\n+agent should decide which one to use (preferably the latest one becoming\n+active). Note that all this is within a page (tab), and does not conflict with\n+`MediaSession` routing.\n+\n+An example is that suppose a video website plays a pre-roll ad before a video\n+plays, it can create one `MediaSession` for the video and one for the ad. The\n+page associates the `MediaSession`s to the video/ad state so that the\n+corresponding `MediaSession` is only active when the video/ad is playing.\n+\n+The advantage of this solution is that we can obtain better composability with\n+other objects, especially AudioFocusEntry (from the AudioFocus API) objects. The\n+lifetime of the `MediaSession`s will be linked to these objects and they can be\n+activated/deactivated automatically when the associated objects start/stop\n+playback.\n+\n+The disadvantage of this solution is that it might make the API complex to use,\n+and there are still race issues websites need to take care. Also, which is more\n+important, if the user agent does not have an automatic activation mechanism for\n+`MediaSession` (for example the AudioFocus API is not implemented), the benefit\n+will be very few since the solution is essentially equivalent to having multiple\n+`MediaMetadata` objects and setting different metadata to the global\n+`MediaSession` instance.\n+\n+### `MediaSession` in iframes\n+\n+`MediaSession` objects can both exist in top-level frame and child frames. It is\n+an open question whether we should use `MediaSession` in child frames. For","path":"explainer.md","position":null,"original_position":202,"commit_id":"4aff1953ad2ef8966d2242741616962c6394c798","original_commit_id":"6d3742cb6c2e5a51a53ba864e64dee5e1879ca76","user":{"login":"xxyzzzq","id":4197173,"avatar_url":"https://avatars.githubusercontent.com/u/4197173?v=3","gravatar_id":"","url":"https://api.github.com/users/xxyzzzq","html_url":"https://github.com/xxyzzzq","followers_url":"https://api.github.com/users/xxyzzzq/followers","following_url":"https://api.github.com/users/xxyzzzq/following{/other_user}","gists_url":"https://api.github.com/users/xxyzzzq/gists{/gist_id}","starred_url":"https://api.github.com/users/xxyzzzq/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xxyzzzq/subscriptions","organizations_url":"https://api.github.com/users/xxyzzzq/orgs","repos_url":"https://api.github.com/users/xxyzzzq/repos","events_url":"https://api.github.com/users/xxyzzzq/events{/privacy}","received_events_url":"https://api.github.com/users/xxyzzzq/received_events","type":"User","site_admin":false},"body":"Done.","created_at":"2016-09-12T13:31:15Z","updated_at":"2016-09-12T13:31:15Z","html_url":"https://github.com/WICG/mediasession/pull/133#discussion_r78372303","pull_request_url":"https://api.github.com/repos/WICG/mediasession/pulls/133","_links":{"self":{"href":"https://api.github.com/repos/WICG/mediasession/pulls/comments/78372303"},"html":{"href":"https://github.com/WICG/mediasession/pull/133#discussion_r78372303"},"pull_request":{"href":"https://api.github.com/repos/WICG/mediasession/pulls/133"}}},"pull_request":{"url":"https://api.github.com/repos/WICG/mediasession/pulls/133","id":84678509,"html_url":"https://github.com/WICG/mediasession/pull/133","diff_url":"https://github.com/WICG/mediasession/pull/133.diff","patch_url":"https://github.com/WICG/mediasession/pull/133.patch","issue_url":"https://api.github.com/repos/WICG/mediasession/issues/133","number":133,"state":"open","locked":false,"title":"Add explainer for MediaSession API (moved out AudioFocus API)","user":{"login":"xxyzzzq","id":4197173,"avatar_url":"https://avatars.githubusercontent.com/u/4197173?v=3","gravatar_id":"","url":"https://api.github.com/users/xxyzzzq","html_url":"https://github.com/xxyzzzq","followers_url":"https://api.github.com/users/xxyzzzq/followers","following_url":"https://api.github.com/users/xxyzzzq/following{/other_user}","gists_url":"https://api.github.com/users/xxyzzzq/gists{/gist_id}","starred_url":"https://api.github.com/users/xxyzzzq/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xxyzzzq/subscriptions","organizations_url":"https://api.github.com/users/xxyzzzq/orgs","repos_url":"https://api.github.com/users/xxyzzzq/repos","events_url":"https://api.github.com/users/xxyzzzq/events{/privacy}","received_events_url":"https://api.github.com/users/xxyzzzq/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-09-09T16:19:08Z","updated_at":"2016-09-12T13:31:15Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9ee02ca7cab99792f399c4d16238599161d19ad0","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/WICG/mediasession/pulls/133/commits","review_comments_url":"https://api.github.com/repos/WICG/mediasession/pulls/133/comments","review_comment_url":"https://api.github.com/repos/WICG/mediasession/pulls/comments{/number}","comments_url":"https://api.github.com/repos/WICG/mediasession/issues/133/comments","statuses_url":"https://api.github.com/repos/WICG/mediasession/statuses/4aff1953ad2ef8966d2242741616962c6394c798","head":{"label":"xxyzzzq:explainer","ref":"explainer","sha":"4aff1953ad2ef8966d2242741616962c6394c798","user":{"login":"xxyzzzq","id":4197173,"avatar_url":"https://avatars.githubusercontent.com/u/4197173?v=3","gravatar_id":"","url":"https://api.github.com/users/xxyzzzq","html_url":"https://github.com/xxyzzzq","followers_url":"https://api.github.com/users/xxyzzzq/followers","following_url":"https://api.github.com/users/xxyzzzq/following{/other_user}","gists_url":"https://api.github.com/users/xxyzzzq/gists{/gist_id}","starred_url":"https://api.github.com/users/xxyzzzq/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xxyzzzq/subscriptions","organizations_url":"https://api.github.com/users/xxyzzzq/orgs","repos_url":"https://api.github.com/users/xxyzzzq/repos","events_url":"https://api.github.com/users/xxyzzzq/events{/privacy}","received_events_url":"https://api.github.com/users/xxyzzzq/received_events","type":"User","site_admin":false},"repo":{"id":59744442,"name":"mediasession","full_name":"xxyzzzq/mediasession","owner":{"login":"xxyzzzq","id":4197173,"avatar_url":"https://avatars.githubusercontent.com/u/4197173?v=3","gravatar_id":"","url":"https://api.github.com/users/xxyzzzq","html_url":"https://github.com/xxyzzzq","followers_url":"https://api.github.com/users/xxyzzzq/followers","following_url":"https://api.github.com/users/xxyzzzq/following{/other_user}","gists_url":"https://api.github.com/users/xxyzzzq/gists{/gist_id}","starred_url":"https://api.github.com/users/xxyzzzq/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xxyzzzq/subscriptions","organizations_url":"https://api.github.com/users/xxyzzzq/orgs","repos_url":"https://api.github.com/users/xxyzzzq/repos","events_url":"https://api.github.com/users/xxyzzzq/events{/privacy}","received_events_url":"https://api.github.com/users/xxyzzzq/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/xxyzzzq/mediasession","description":"Media Session Standard","fork":true,"url":"https://api.github.com/repos/xxyzzzq/mediasession","forks_url":"https://api.github.com/repos/xxyzzzq/mediasession/forks","keys_url":"https://api.github.com/repos/xxyzzzq/mediasession/keys{/key_id}","collaborators_url":"https://api.github.com/repos/xxyzzzq/mediasession/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/xxyzzzq/mediasession/teams","hooks_url":"https://api.github.com/repos/xxyzzzq/mediasession/hooks","issue_events_url":"https://api.github.com/repos/xxyzzzq/mediasession/issues/events{/number}","events_url":"https://api.github.com/repos/xxyzzzq/mediasession/events","assignees_url":"https://api.github.com/repos/xxyzzzq/mediasession/assignees{/user}","branches_url":"https://api.github.com/repos/xxyzzzq/mediasession/branches{/branch}","tags_url":"https://api.github.com/repos/xxyzzzq/mediasession/tags","blobs_url":"https://api.github.com/repos/xxyzzzq/mediasession/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/xxyzzzq/mediasession/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/xxyzzzq/mediasession/git/refs{/sha}","trees_url":"https://api.github.com/repos/xxyzzzq/mediasession/git/trees{/sha}","statuses_url":"https://api.github.com/repos/xxyzzzq/mediasession/statuses/{sha}","languages_url":"https://api.github.com/repos/xxyzzzq/mediasession/languages","stargazers_url":"https://api.github.com/repos/xxyzzzq/mediasession/stargazers","contributors_url":"https://api.github.com/repos/xxyzzzq/mediasession/contributors","subscribers_url":"https://api.github.com/repos/xxyzzzq/mediasession/subscribers","subscription_url":"https://api.github.com/repos/xxyzzzq/mediasession/subscription","commits_url":"https://api.github.com/repos/xxyzzzq/mediasession/commits{/sha}","git_commits_url":"https://api.github.com/repos/xxyzzzq/mediasession/git/commits{/sha}","comments_url":"https://api.github.com/repos/xxyzzzq/mediasession/comments{/number}","issue_comment_url":"https://api.github.com/repos/xxyzzzq/mediasession/issues/comments{/number}","contents_url":"https://api.github.com/repos/xxyzzzq/mediasession/contents/{+path}","compare_url":"https://api.github.com/repos/xxyzzzq/mediasession/compare/{base}...{head}","merges_url":"https://api.github.com/repos/xxyzzzq/mediasession/merges","archive_url":"https://api.github.com/repos/xxyzzzq/mediasession/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/xxyzzzq/mediasession/downloads","issues_url":"https://api.github.com/repos/xxyzzzq/mediasession/issues{/number}","pulls_url":"https://api.github.com/repos/xxyzzzq/mediasession/pulls{/number}","milestones_url":"https://api.github.com/repos/xxyzzzq/mediasession/milestones{/number}","notifications_url":"https://api.github.com/repos/xxyzzzq/mediasession/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/xxyzzzq/mediasession/labels{/name}","releases_url":"https://api.github.com/repos/xxyzzzq/mediasession/releases{/id}","deployments_url":"https://api.github.com/repos/xxyzzzq/mediasession/deployments","created_at":"2016-05-26T11:18:47Z","updated_at":"2016-07-18T16:21:36Z","pushed_at":"2016-09-12T13:29:50Z","git_url":"git://github.com/xxyzzzq/mediasession.git","ssh_url":"git@github.com:xxyzzzq/mediasession.git","clone_url":"https://github.com/xxyzzzq/mediasession.git","svn_url":"https://github.com/xxyzzzq/mediasession","homepage":"https://mediasession.spec.whatwg.org/","size":1037,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"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":"WICG:master","ref":"master","sha":"62d1007de2a33546902066c44089dc74dd730bc4","user":{"login":"WICG","id":13145324,"avatar_url":"https://avatars.githubusercontent.com/u/13145324?v=3","gravatar_id":"","url":"https://api.github.com/users/WICG","html_url":"https://github.com/WICG","followers_url":"https://api.github.com/users/WICG/followers","following_url":"https://api.github.com/users/WICG/following{/other_user}","gists_url":"https://api.github.com/users/WICG/gists{/gist_id}","starred_url":"https://api.github.com/users/WICG/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/WICG/subscriptions","organizations_url":"https://api.github.com/users/WICG/orgs","repos_url":"https://api.github.com/users/WICG/repos","events_url":"https://api.github.com/users/WICG/events{/privacy}","received_events_url":"https://api.github.com/users/WICG/received_events","type":"Organization","site_admin":false},"repo":{"id":30290996,"name":"mediasession","full_name":"WICG/mediasession","owner":{"login":"WICG","id":13145324,"avatar_url":"https://avatars.githubusercontent.com/u/13145324?v=3","gravatar_id":"","url":"https://api.github.com/users/WICG","html_url":"https://github.com/WICG","followers_url":"https://api.github.com/users/WICG/followers","following_url":"https://api.github.com/users/WICG/following{/other_user}","gists_url":"https://api.github.com/users/WICG/gists{/gist_id}","starred_url":"https://api.github.com/users/WICG/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/WICG/subscriptions","organizations_url":"https://api.github.com/users/WICG/orgs","repos_url":"https://api.github.com/users/WICG/repos","events_url":"https://api.github.com/users/WICG/events{/privacy}","received_events_url":"https://api.github.com/users/WICG/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/WICG/mediasession","description":"Media Session Standard","fork":false,"url":"https://api.github.com/repos/WICG/mediasession","forks_url":"https://api.github.com/repos/WICG/mediasession/forks","keys_url":"https://api.github.com/repos/WICG/mediasession/keys{/key_id}","collaborators_url":"https://api.github.com/repos/WICG/mediasession/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/WICG/mediasession/teams","hooks_url":"https://api.github.com/repos/WICG/mediasession/hooks","issue_events_url":"https://api.github.com/repos/WICG/mediasession/issues/events{/number}","events_url":"https://api.github.com/repos/WICG/mediasession/events","assignees_url":"https://api.github.com/repos/WICG/mediasession/assignees{/user}","branches_url":"https://api.github.com/repos/WICG/mediasession/branches{/branch}","tags_url":"https://api.github.com/repos/WICG/mediasession/tags","blobs_url":"https://api.github.com/repos/WICG/mediasession/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/WICG/mediasession/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/WICG/mediasession/git/refs{/sha}","trees_url":"https://api.github.com/repos/WICG/mediasession/git/trees{/sha}","statuses_url":"https://api.github.com/repos/WICG/mediasession/statuses/{sha}","languages_url":"https://api.github.com/repos/WICG/mediasession/languages","stargazers_url":"https://api.github.com/repos/WICG/mediasession/stargazers","contributors_url":"https://api.github.com/repos/WICG/mediasession/contributors","subscribers_url":"https://api.github.com/repos/WICG/mediasession/subscribers","subscription_url":"https://api.github.com/repos/WICG/mediasession/subscription","commits_url":"https://api.github.com/repos/WICG/mediasession/commits{/sha}","git_commits_url":"https://api.github.com/repos/WICG/mediasession/git/commits{/sha}","comments_url":"https://api.github.com/repos/WICG/mediasession/comments{/number}","issue_comment_url":"https://api.github.com/repos/WICG/mediasession/issues/comments{/number}","contents_url":"https://api.github.com/repos/WICG/mediasession/contents/{+path}","compare_url":"https://api.github.com/repos/WICG/mediasession/compare/{base}...{head}","merges_url":"https://api.github.com/repos/WICG/mediasession/merges","archive_url":"https://api.github.com/repos/WICG/mediasession/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/WICG/mediasession/downloads","issues_url":"https://api.github.com/repos/WICG/mediasession/issues{/number}","pulls_url":"https://api.github.com/repos/WICG/mediasession/pulls{/number}","milestones_url":"https://api.github.com/repos/WICG/mediasession/milestones{/number}","notifications_url":"https://api.github.com/repos/WICG/mediasession/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/WICG/mediasession/labels{/name}","releases_url":"https://api.github.com/repos/WICG/mediasession/releases{/id}","deployments_url":"https://api.github.com/repos/WICG/mediasession/deployments","created_at":"2015-02-04T09:21:44Z","updated_at":"2016-08-29T11:58:54Z","pushed_at":"2016-09-12T13:29:51Z","git_url":"git://github.com/WICG/mediasession.git","ssh_url":"git@github.com:WICG/mediasession.git","clone_url":"https://github.com/WICG/mediasession.git","svn_url":"https://github.com/WICG/mediasession","homepage":"https://wicg.github.io/mediasession/","size":876,"stargazers_count":49,"watchers_count":49,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":8,"mirror_url":null,"open_issues_count":30,"forks":8,"open_issues":30,"watchers":49,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/WICG/mediasession/pulls/133"},"html":{"href":"https://github.com/WICG/mediasession/pull/133"},"issue":{"href":"https://api.github.com/repos/WICG/mediasession/issues/133"},"comments":{"href":"https://api.github.com/repos/WICG/mediasession/issues/133/comments"},"review_comments":{"href":"https://api.github.com/repos/WICG/mediasession/pulls/133/comments"},"review_comment":{"href":"https://api.github.com/repos/WICG/mediasession/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/WICG/mediasession/pulls/133/commits"},"statuses":{"href":"https://api.github.com/repos/WICG/mediasession/statuses/4aff1953ad2ef8966d2242741616962c6394c798"}}}}
{"actor":{"display_login":"xxyzzzq"}}