{"action":"created","comment":{"url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/pulls/comments/23251606","id":23251606,"diff_hunk":"@@ -0,0 +1,194 @@\n+// This file is part of playd.\n+// playd is licensed under the MIT licence: see LICENSE.txt.\n+\n+/**\n+ * @file\n+ * Implementation of the Mp3AudioSource class.\n+ * @see audio/sources/mp3.hpp\n+ */\n+\n+#include <cassert>\n+#include <cstdint>\n+#include <cstdio>\n+#include <cstdlib>\n+#include <iostream>\n+#include <map>\n+#include <memory>\n+#include <sstream>\n+#include <string>\n+\n+extern \"C\" {\n+#include <mpg123.h>\n+}\n+\n+#include \"../../errors.hpp\"\n+#include \"../../messages.h\"\n+#include \"../audio_source.hpp\"\n+#include \"../sample_formats.hpp\"\n+#include \"mp3.hpp\"\n+\n+// This value is somewhat arbitrary, but corresponds to the minimum buffer size\n+// used by ffmpeg, so it's probably sensible.\n+const size_t Mp3AudioSource::BUFFER_SIZE = 16384;\n+\n+/* static */ std::unique_ptr<AudioSource> Mp3AudioSource::Build(\n+                const std::string &path)\n+{\n+\treturn std::unique_ptr<AudioSource>(new Mp3AudioSource(path));\n+}\n+\n+Mp3AudioSource::Mp3AudioSource(const std::string &path)\n+    : AudioSource(path), buffer(BUFFER_SIZE), context(nullptr)\n+{\n+\tthis->context = mpg123_new(nullptr, nullptr);\n+\tmpg123_format_none(this->context);\n+\n+\tconst long *rates = nullptr;\n+\tsize_t nrates = 0;\n+\tmpg123_rates(&rates, &nrates);\n+\tfor (size_t r = 0; r < nrates; r++) {\n+\t\tDebug() << \"trying to enable formats at \" << rates[r]\n+\t\t        << std::endl;\n+\t\tAddFormat(rates[r]);\n+\t}\n+\n+\tif (mpg123_open(this->context, path.c_str()) == MPG123_ERR) {\n+\t\tthrow FileError(\"mp3: can't open \" + path + \": \" +\n+\t\t                mpg123_strerror(this->context));\n+\t}\n+\n+\tDebug() << \"mp3: sample rate:\" << this->SampleRate() << std::endl;\n+\tDebug() << \"mp3: bytes per sample:\" << this->BytesPerSample()\n+\t        << std::endl;\n+\tDebug() << \"mp3: channels:\" << (int)this->ChannelCount() << std::endl;\n+\tDebug() << \"mp3: playd format:\" << (int)this->OutputSampleFormat()\n+\t        << std::endl;\n+}\n+\n+Mp3AudioSource::~Mp3AudioSource()\n+{\n+\tmpg123_delete(this->context);\n+\tthis->context = nullptr;\n+}\n+\n+void Mp3AudioSource::AddFormat(long rate)\n+{\n+\t// The requested encodings correspond to the sample formats available in\n+\t// the SampleFormat enum.\n+\tif (mpg123_format(this->context, rate, MPG123_STEREO | MPG123_MONO,\n+\t                  (MPG123_ENC_UNSIGNED_8 | MPG123_ENC_SIGNED_8 |\n+\t                   MPG123_ENC_SIGNED_16 | MPG123_ENC_SIGNED_32 |\n+\t                   MPG123_ENC_FLOAT_32)) == MPG123_ERR) {\n+\t\t// Ignore the error for now -- another sample rate may be\n+\t\t// available.\n+\t\t// If no sample rates work, loading a file will fail anyway.\n+\t\tDebug() << \"can't support\" << rate << std::endl;\n+\t};\n+}\n+\n+std::uint8_t Mp3AudioSource::ChannelCount() const\n+{\n+\tassert(this->context != nullptr);\n+\n+\tint chans = 0;\n+\tmpg123_getformat(this->context, nullptr, &chans, nullptr);\n+\tassert(chans != 0);\n+\treturn static_cast<std::uint8_t>(chans);\n+}\n+\n+std::uint32_t Mp3AudioSource::SampleRate() const\n+{\n+\tassert(this->context != nullptr);\n+\n+\tlong rate = 0;\n+\tmpg123_getformat(this->context, &rate, nullptr, nullptr);\n+\n+\tassert(0 < rate);\n+\t// INT32_MAX isn't a typo; if we compare against UINT32_MAX, we'll\n+\t// set off sign-compare errors, and the sample rate shouldn't be above\n+\t// INT32_MAX anyroad.","path":"src/audio/sources/mp3.cpp","position":109,"original_position":109,"commit_id":"5db3d8913fe39d71bf21c32b3a66362c9685dd56","original_commit_id":"5db3d8913fe39d71bf21c32b3a66362c9685dd56","user":{"login":"LordAro","id":4007992,"avatar_url":"https://avatars.githubusercontent.com/u/4007992?v=3","gravatar_id":"","url":"https://api.github.com/users/LordAro","html_url":"https://github.com/LordAro","followers_url":"https://api.github.com/users/LordAro/followers","following_url":"https://api.github.com/users/LordAro/following{/other_user}","gists_url":"https://api.github.com/users/LordAro/gists{/gist_id}","starred_url":"https://api.github.com/users/LordAro/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LordAro/subscriptions","organizations_url":"https://api.github.com/users/LordAro/orgs","repos_url":"https://api.github.com/users/LordAro/repos","events_url":"https://api.github.com/users/LordAro/events{/privacy}","received_events_url":"https://api.github.com/users/LordAro/received_events","type":"User","site_admin":false},"body":"wait, redundant assert?","created_at":"2015-01-20T20:12:51Z","updated_at":"2015-01-20T20:12:51Z","html_url":"https://github.com/UniversityRadioYork/ury-playd/pull/77#discussion_r23251606","pull_request_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/pulls/77","_links":{"self":{"href":"https://api.github.com/repos/UniversityRadioYork/ury-playd/pulls/comments/23251606"},"html":{"href":"https://github.com/UniversityRadioYork/ury-playd/pull/77#discussion_r23251606"},"pull_request":{"href":"https://api.github.com/repos/UniversityRadioYork/ury-playd/pulls/77"}}},"pull_request":{"url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/pulls/77","id":26615821,"html_url":"https://github.com/UniversityRadioYork/ury-playd/pull/77","diff_url":"https://github.com/UniversityRadioYork/ury-playd/pull/77.diff","patch_url":"https://github.com/UniversityRadioYork/ury-playd/pull/77.patch","issue_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/issues/77","number":77,"state":"open","locked":false,"title":"Audio reform, general cleanups, and config.sh","user":{"login":"CaptainHayashi","id":374963,"avatar_url":"https://avatars.githubusercontent.com/u/374963?v=3","gravatar_id":"","url":"https://api.github.com/users/CaptainHayashi","html_url":"https://github.com/CaptainHayashi","followers_url":"https://api.github.com/users/CaptainHayashi/followers","following_url":"https://api.github.com/users/CaptainHayashi/following{/other_user}","gists_url":"https://api.github.com/users/CaptainHayashi/gists{/gist_id}","starred_url":"https://api.github.com/users/CaptainHayashi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CaptainHayashi/subscriptions","organizations_url":"https://api.github.com/users/CaptainHayashi/orgs","repos_url":"https://api.github.com/users/CaptainHayashi/repos","events_url":"https://api.github.com/users/CaptainHayashi/events{/privacy}","received_events_url":"https://api.github.com/users/CaptainHayashi/received_events","type":"User","site_admin":false},"body":"**DON'T MERGE THIS JUST YET.** This is a large PRQ, so there's a fairly hefty set of conditions on merging, and help with them would be much appreciated:\r\n\r\n* [ ] Test build on/fix build on:\r\n  * [x] Travis\r\n  * [ ] Windows VS2013\r\n  * [ ] Windows mingw32\r\n  * [x] Debian\r\n  * [ ] FreeBSD\r\n* [ ] Make sure the following work:\r\n  * [ ] FLAC\r\n    * [x] Playback\r\n    * [x] Seeking\r\n    * [ ] Seeking to EOF\r\n  * [ ] MP3\r\n    * [x] Playback\r\n    * [x] Seeking\r\n    * [ ] Seeking to EOF\r\n  * [ ] libsndfile\r\n    * [ ] Playback\r\n    * [ ] Seeking\r\n    * [ ] Seeking to EOF\r\n  * [ ] Questions/decisions\r\n    * [ ] Do we need libflac++?\r\n    * [ ] Build system - keep config.sh or try something else?\r\n    * [ ] Should we have a more sophisticated library selection scheme?\r\n\r\n**What does this PRQ do?** The main change is that it _replaces libsox with three smaller libraries_: [libsndfile] (Ogg Vorbis, Wave files, etc.), [libmpg123] (MP3), and [libflac++] (FLAC).\r\n\r\nWhy?  Because:\r\n  * SoX is difficult to compile, partly because it includes a vast array of dependency libraries that we don't need (speex?  GSM!?), and we can easily just use the dependency libraries we _do_ use directly.\r\n  * SoX is buggy, and I think it'll be quicker and easier just to move away from it in the short-term.\r\n  * The libraries we're using here have perfectly sensible APIs, so we're not losing much in the way of understandability.\r\n  * Having a framework for multiple different output drivers will make it easier to add, say, AAC support later.\r\n\r\nIn addition, because I couldn't help myself, there are a few random cleanups and changes, some of which may be contentious.  One of them involves using `make_unique`, which has _bumped the C++ version to C++14_ (but VS2013 supports this one concession to modern C++).\r\n\r\nI expect a lot of comment below.  Don't fail me now!\r\n\r\n[libsndfile]: http://www.mega-nerd.com/libsndfile/ \"Home page for libsndfile.\"\r\n[libmpg123]: http://mpg123.de/ \"Home page for libmpg123.\"\r\n[libflac++]: https://xiph.org/flac \"Home page for FLAC.\"","created_at":"2014-12-27T16:20:16Z","updated_at":"2015-01-20T20:12:51Z","closed_at":null,"merged_at":null,"merge_commit_sha":"58bb001cad4a9b24de35689234f5e11d81cdb97c","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/pulls/77/commits","review_comments_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/pulls/77/comments","review_comment_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/pulls/comments/{number}","comments_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/issues/77/comments","statuses_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/statuses/5db3d8913fe39d71bf21c32b3a66362c9685dd56","head":{"label":"UniversityRadioYork:mw-direct-audio","ref":"mw-direct-audio","sha":"5db3d8913fe39d71bf21c32b3a66362c9685dd56","user":{"login":"UniversityRadioYork","id":823554,"avatar_url":"https://avatars.githubusercontent.com/u/823554?v=3","gravatar_id":"","url":"https://api.github.com/users/UniversityRadioYork","html_url":"https://github.com/UniversityRadioYork","followers_url":"https://api.github.com/users/UniversityRadioYork/followers","following_url":"https://api.github.com/users/UniversityRadioYork/following{/other_user}","gists_url":"https://api.github.com/users/UniversityRadioYork/gists{/gist_id}","starred_url":"https://api.github.com/users/UniversityRadioYork/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/UniversityRadioYork/subscriptions","organizations_url":"https://api.github.com/users/UniversityRadioYork/orgs","repos_url":"https://api.github.com/users/UniversityRadioYork/repos","events_url":"https://api.github.com/users/UniversityRadioYork/events{/privacy}","received_events_url":"https://api.github.com/users/UniversityRadioYork/received_events","type":"Organization","site_admin":false},"repo":{"id":16463926,"name":"ury-playd","full_name":"UniversityRadioYork/ury-playd","owner":{"login":"UniversityRadioYork","id":823554,"avatar_url":"https://avatars.githubusercontent.com/u/823554?v=3","gravatar_id":"","url":"https://api.github.com/users/UniversityRadioYork","html_url":"https://github.com/UniversityRadioYork","followers_url":"https://api.github.com/users/UniversityRadioYork/followers","following_url":"https://api.github.com/users/UniversityRadioYork/following{/other_user}","gists_url":"https://api.github.com/users/UniversityRadioYork/gists{/gist_id}","starred_url":"https://api.github.com/users/UniversityRadioYork/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/UniversityRadioYork/subscriptions","organizations_url":"https://api.github.com/users/UniversityRadioYork/orgs","repos_url":"https://api.github.com/users/UniversityRadioYork/repos","events_url":"https://api.github.com/users/UniversityRadioYork/events{/privacy}","received_events_url":"https://api.github.com/users/UniversityRadioYork/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/UniversityRadioYork/ury-playd","description":"Minimal C++ audio player","fork":false,"url":"https://api.github.com/repos/UniversityRadioYork/ury-playd","forks_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/forks","keys_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/keys{/key_id}","collaborators_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/teams","hooks_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/hooks","issue_events_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/issues/events{/number}","events_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/events","assignees_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/assignees{/user}","branches_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/branches{/branch}","tags_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/tags","blobs_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/git/refs{/sha}","trees_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/git/trees{/sha}","statuses_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/statuses/{sha}","languages_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/languages","stargazers_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/stargazers","contributors_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/contributors","subscribers_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/subscribers","subscription_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/subscription","commits_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/commits{/sha}","git_commits_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/git/commits{/sha}","comments_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/comments{/number}","issue_comment_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/issues/comments/{number}","contents_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/contents/{+path}","compare_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/compare/{base}...{head}","merges_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/merges","archive_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/downloads","issues_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/issues{/number}","pulls_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/pulls{/number}","milestones_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/milestones{/number}","notifications_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/labels{/name}","releases_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/releases{/id}","created_at":"2014-02-02T21:38:25Z","updated_at":"2014-12-10T01:39:23Z","pushed_at":"2015-01-18T19:58:44Z","git_url":"git://github.com/UniversityRadioYork/ury-playd.git","ssh_url":"git@github.com:UniversityRadioYork/ury-playd.git","clone_url":"https://github.com/UniversityRadioYork/ury-playd.git","svn_url":"https://github.com/UniversityRadioYork/ury-playd","homepage":"https://UniversityRadioYork.github.io/ury-playd","size":8015,"stargazers_count":2,"watchers_count":2,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":2,"mirror_url":null,"open_issues_count":12,"forks":2,"open_issues":12,"watchers":2,"default_branch":"master"}},"base":{"label":"UniversityRadioYork:master","ref":"master","sha":"3aca05a104638d1ab120542b41b1b8b864b58027","user":{"login":"UniversityRadioYork","id":823554,"avatar_url":"https://avatars.githubusercontent.com/u/823554?v=3","gravatar_id":"","url":"https://api.github.com/users/UniversityRadioYork","html_url":"https://github.com/UniversityRadioYork","followers_url":"https://api.github.com/users/UniversityRadioYork/followers","following_url":"https://api.github.com/users/UniversityRadioYork/following{/other_user}","gists_url":"https://api.github.com/users/UniversityRadioYork/gists{/gist_id}","starred_url":"https://api.github.com/users/UniversityRadioYork/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/UniversityRadioYork/subscriptions","organizations_url":"https://api.github.com/users/UniversityRadioYork/orgs","repos_url":"https://api.github.com/users/UniversityRadioYork/repos","events_url":"https://api.github.com/users/UniversityRadioYork/events{/privacy}","received_events_url":"https://api.github.com/users/UniversityRadioYork/received_events","type":"Organization","site_admin":false},"repo":{"id":16463926,"name":"ury-playd","full_name":"UniversityRadioYork/ury-playd","owner":{"login":"UniversityRadioYork","id":823554,"avatar_url":"https://avatars.githubusercontent.com/u/823554?v=3","gravatar_id":"","url":"https://api.github.com/users/UniversityRadioYork","html_url":"https://github.com/UniversityRadioYork","followers_url":"https://api.github.com/users/UniversityRadioYork/followers","following_url":"https://api.github.com/users/UniversityRadioYork/following{/other_user}","gists_url":"https://api.github.com/users/UniversityRadioYork/gists{/gist_id}","starred_url":"https://api.github.com/users/UniversityRadioYork/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/UniversityRadioYork/subscriptions","organizations_url":"https://api.github.com/users/UniversityRadioYork/orgs","repos_url":"https://api.github.com/users/UniversityRadioYork/repos","events_url":"https://api.github.com/users/UniversityRadioYork/events{/privacy}","received_events_url":"https://api.github.com/users/UniversityRadioYork/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/UniversityRadioYork/ury-playd","description":"Minimal C++ audio player","fork":false,"url":"https://api.github.com/repos/UniversityRadioYork/ury-playd","forks_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/forks","keys_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/keys{/key_id}","collaborators_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/teams","hooks_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/hooks","issue_events_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/issues/events{/number}","events_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/events","assignees_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/assignees{/user}","branches_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/branches{/branch}","tags_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/tags","blobs_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/git/refs{/sha}","trees_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/git/trees{/sha}","statuses_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/statuses/{sha}","languages_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/languages","stargazers_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/stargazers","contributors_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/contributors","subscribers_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/subscribers","subscription_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/subscription","commits_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/commits{/sha}","git_commits_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/git/commits{/sha}","comments_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/comments{/number}","issue_comment_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/issues/comments/{number}","contents_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/contents/{+path}","compare_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/compare/{base}...{head}","merges_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/merges","archive_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/downloads","issues_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/issues{/number}","pulls_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/pulls{/number}","milestones_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/milestones{/number}","notifications_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/labels{/name}","releases_url":"https://api.github.com/repos/UniversityRadioYork/ury-playd/releases{/id}","created_at":"2014-02-02T21:38:25Z","updated_at":"2014-12-10T01:39:23Z","pushed_at":"2015-01-18T19:58:44Z","git_url":"git://github.com/UniversityRadioYork/ury-playd.git","ssh_url":"git@github.com:UniversityRadioYork/ury-playd.git","clone_url":"https://github.com/UniversityRadioYork/ury-playd.git","svn_url":"https://github.com/UniversityRadioYork/ury-playd","homepage":"https://UniversityRadioYork.github.io/ury-playd","size":8015,"stargazers_count":2,"watchers_count":2,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":2,"mirror_url":null,"open_issues_count":12,"forks":2,"open_issues":12,"watchers":2,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/UniversityRadioYork/ury-playd/pulls/77"},"html":{"href":"https://github.com/UniversityRadioYork/ury-playd/pull/77"},"issue":{"href":"https://api.github.com/repos/UniversityRadioYork/ury-playd/issues/77"},"comments":{"href":"https://api.github.com/repos/UniversityRadioYork/ury-playd/issues/77/comments"},"review_comments":{"href":"https://api.github.com/repos/UniversityRadioYork/ury-playd/pulls/77/comments"},"review_comment":{"href":"https://api.github.com/repos/UniversityRadioYork/ury-playd/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/UniversityRadioYork/ury-playd/pulls/77/commits"},"statuses":{"href":"https://api.github.com/repos/UniversityRadioYork/ury-playd/statuses/5db3d8913fe39d71bf21c32b3a66362c9685dd56"}}}}