Status for Dolphin Central
Recent events
2026-11-03T17:48:16.339206 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-ubu-x64', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/#/builders/27/builds/10919', 'description': 'Auto build in progress on builder pr-ubu-x64', 'type': 'build_status'}
2026-11-03T17:48:15.665211 {'source': 'webserver', 'raw': {'buildid': 196344, 'number': 10919, 'builderid': 27, 'buildrequestid': 196927, 'workerid': 10, 'masterid': 1, 'started_at': 1793728063, 'complete_at': None, 'locks_duration_s': 0, 'complete': False, 'state_string': 'starting', 'results': None, 'properties': {'shortrev': ['815909', 'Change'], 'codebase': ['', 'Build'], 'scheduler': ['pr', 'Scheduler'], 'buildnumber': [10919, 'Build'], 'workername': ['ubuntu-lts', 'Worker'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build'], 'branchname': ['pr-14979', 'Change'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'pr_id': [14979, 'Change'], 'builderid': [27, 'Builder'], 'project': ['', 'Build'], 'headrev': ['8159092533e9160c64df47f9001b55a24ae16633', 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'buildername': ['pr-ubu-x64', 'Builder'], 'branch': ['refs/pull/14979/head', 'Build'], 'revision': ['8159092533e9160c64df47f9001b55a24ae16633', 'Build'], 'repository': ['', 'Build']}, 'buildrequest': {'buildrequestid': 196927, 'buildsetid': 44103, 'builderid': 27, 'priority': 0, 'claimed': True, 'claimed_at': 1793728063, 'claimed_by_masterid': 1, 'complete': False, 'results': -1, 'submitted_at': 1793728059, 'complete_at': None, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44103, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793728059, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13235, 'branch': 'refs/pull/14979/head', 'revision': '8159092533e9160c64df47f9001b55a24ae16633', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793728059, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 27, 'name': 'pr-ubu-x64', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/27/builds/10919'}, 'type': 'raw_bb_hook'}
2026-11-03T17:48:14.819505 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-freebsd-x64', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/#/builders/11/builds/10929', 'description': 'Auto build in progress on builder pr-freebsd-x64', 'type': 'build_status'}
2026-11-03T17:48:14.047060 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-deb-x64', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/#/builders/26/builds/10917', 'description': 'Auto build in progress on builder pr-deb-x64', 'type': 'build_status'}
2026-11-03T17:48:13.588025 {'source': 'webserver', 'raw': {'buildid': 196338, 'number': 10929, 'builderid': 11, 'buildrequestid': 196923, 'workerid': 1, 'masterid': 1, 'started_at': 1793728060, 'complete_at': None, 'locks_duration_s': 0, 'complete': False, 'state_string': 'starting', 'results': None, 'properties': {'branchname': ['pr-14979', 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'scheduler': ['pr', 'Scheduler'], 'builderid': [11, 'Builder'], 'workername': ['freebsd', 'Worker'], 'buildnumber': [10929, 'Build'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'headrev': ['8159092533e9160c64df47f9001b55a24ae16633', 'Change'], 'shortrev': ['815909', 'Change'], 'buildername': ['pr-freebsd-x64', 'Builder'], 'pr_id': [14979, 'Change'], 'branch': ['refs/pull/14979/head', 'Build'], 'revision': ['8159092533e9160c64df47f9001b55a24ae16633', 'Build'], 'repository': ['', 'Build'], 'project': ['', 'Build'], 'codebase': ['', 'Build'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build']}, 'buildrequest': {'buildrequestid': 196923, 'buildsetid': 44103, 'builderid': 11, 'priority': 0, 'claimed': True, 'claimed_at': 1793728060, 'claimed_by_masterid': 1, 'complete': False, 'results': -1, 'submitted_at': 1793728059, 'complete_at': None, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44103, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793728059, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13235, 'branch': 'refs/pull/14979/head', 'revision': '8159092533e9160c64df47f9001b55a24ae16633', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793728059, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 11, 'name': 'pr-freebsd-x64', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/11/builds/10929'}, 'type': 'raw_bb_hook'}
2026-11-03T17:48:13.297822 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-osx-universal', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/#/builders/7/builds/10938', 'description': 'Auto build in progress on builder pr-osx-universal', 'type': 'build_status'}
2026-11-03T17:48:13.034957 {'source': 'webserver', 'raw': {'buildid': 196342, 'number': 10917, 'builderid': 26, 'buildrequestid': 196926, 'workerid': 9, 'masterid': 1, 'started_at': 1793728060, 'complete_at': None, 'locks_duration_s': 0, 'complete': False, 'state_string': 'starting', 'results': None, 'properties': {'revision': ['8159092533e9160c64df47f9001b55a24ae16633', 'Build'], 'branchname': ['pr-14979', 'Change'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'shortrev': ['815909', 'Change'], 'headrev': ['8159092533e9160c64df47f9001b55a24ae16633', 'Change'], 'buildnumber': [10917, 'Build'], 'project': ['', 'Build'], 'pr_id': [14979, 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'scheduler': ['pr', 'Scheduler'], 'buildername': ['pr-deb-x64', 'Builder'], 'builderid': [26, 'Builder'], 'workername': ['debian', 'Worker'], 'branch': ['refs/pull/14979/head', 'Build'], 'repository': ['', 'Build'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build'], 'codebase': ['', 'Build']}, 'buildrequest': {'buildrequestid': 196926, 'buildsetid': 44103, 'builderid': 26, 'priority': 0, 'claimed': True, 'claimed_at': 1793728060, 'claimed_by_masterid': 1, 'complete': False, 'results': -1, 'submitted_at': 1793728059, 'complete_at': None, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44103, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793728059, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13235, 'branch': 'refs/pull/14979/head', 'revision': '8159092533e9160c64df47f9001b55a24ae16633', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793728059, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 26, 'name': 'pr-deb-x64', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/26/builds/10917'}, 'type': 'raw_bb_hook'}
2026-11-03T17:48:12.611030 {'source': 'webserver', 'raw': {'buildid': 196343, 'number': 10938, 'builderid': 7, 'buildrequestid': 196921, 'workerid': 8, 'masterid': 1, 'started_at': 1793728060, 'complete_at': None, 'locks_duration_s': 0, 'complete': False, 'state_string': 'starting', 'results': None, 'properties': {'headrev': ['8159092533e9160c64df47f9001b55a24ae16633', 'Change'], 'shortrev': ['815909', 'Change'], 'buildnumber': [10938, 'Build'], 'pr_id': [14979, 'Change'], 'workername': ['osx-m1', 'Worker'], 'repository': ['', 'Build'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'scheduler': ['pr', 'Scheduler'], 'buildername': ['pr-osx-universal', 'Builder'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build'], 'branch': ['refs/pull/14979/head', 'Build'], 'codebase': ['', 'Build'], 'project': ['', 'Build'], 'branchname': ['pr-14979', 'Change'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'builderid': [7, 'Builder'], 'revision': ['8159092533e9160c64df47f9001b55a24ae16633', 'Build']}, 'buildrequest': {'buildrequestid': 196921, 'buildsetid': 44103, 'builderid': 7, 'priority': 0, 'claimed': True, 'claimed_at': 1793728060, 'claimed_by_masterid': 1, 'complete': False, 'results': -1, 'submitted_at': 1793728059, 'complete_at': None, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44103, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793728059, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13235, 'branch': 'refs/pull/14979/head', 'revision': '8159092533e9160c64df47f9001b55a24ae16633', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793728059, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 7, 'name': 'pr-osx-universal', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/7/builds/10938'}, 'type': 'raw_bb_hook'}
2026-11-03T17:48:09.840942 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '889421211027958ff6af2264b2ba970b5645b142', 'shortrev': '889421', 'service': 'pr-flatpak-x64', 'pr': 14979, 'success': True, 'pending': False, 'url': 'https://dolphin.ci/#/builders/43/builds/6066', 'description': 'Build succeeded on builder pr-flatpak-x64', 'type': 'build_status'}
2026-11-03T17:48:09.079148 {'source': 'webserver', 'raw': {'buildid': 196332, 'number': 6066, 'builderid': 43, 'buildrequestid': 196915, 'workerid': 13, 'masterid': 1, 'started_at': 1793727862, 'complete_at': 1793728069, 'locks_duration_s': 0, 'complete': True, 'state_string': 'build successful', 'results': 0, 'properties': {'branchname': ['pr-14979', 'Change'], 'workername': ['altair-flatpak', 'Worker'], 'basedir': ['/var/lib/flatpak-worker/worker', 'Worker'], 'builddir': ['/var/lib/flatpak-worker/worker/pr-flatpak-x64', 'Worker'], 'fm_build_url': ['https://flat-manager.dolphin-emu.org/api/v1/build/13391', 'SetPropertyFromCommand Step'], 'shortrev': ['889421', 'Change'], 'buildnumber': [6066, 'Build'], 'got_revision': ['889421211027958ff6af2264b2ba970b5645b142', 'GitNoBranch'], 'headrev': ['889421211027958ff6af2264b2ba970b5645b142', 'Change'], 'pr_id': [14979, 'Change'], 'branch': ['refs/pull/14979/head', 'Build'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'codebase': ['', 'Build'], 'revision': ['889421211027958ff6af2264b2ba970b5645b142', 'Build'], 'buildername': ['pr-flatpak-x64', 'Builder'], 'repository': ['', 'Build'], 'scheduler': ['pr', 'Scheduler'], 'project': ['', 'Build'], 'builderid': [43, 'Builder'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build']}, 'buildrequest': {'buildrequestid': 196915, 'buildsetid': 44102, 'builderid': 43, 'priority': 0, 'claimed': True, 'claimed_at': 1793727862, 'claimed_by_masterid': 1, 'complete': True, 'results': 0, 'submitted_at': 1793727862, 'complete_at': 1793728069, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44102, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793727862, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13234, 'branch': 'refs/pull/14979/head', 'revision': '889421211027958ff6af2264b2ba970b5645b142', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793727862, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 43, 'name': 'pr-flatpak-x64', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/43/builds/6066'}, 'type': 'raw_bb_hook'}
2026-11-03T17:47:58.509970 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-android', 'pr': 14979, 'success': True, 'pending': False, 'url': 'https://dolphin.ci/#/builders/22/builds/10925', 'description': 'Build succeeded on builder pr-android', 'type': 'build_status'}
2026-11-03T17:47:57.206183 {'source': 'webserver', 'raw': {'buildid': 196341, 'number': 10925, 'builderid': 22, 'buildrequestid': 196925, 'workerid': 12, 'masterid': 1, 'started_at': 1793728060, 'complete_at': 1793728077, 'locks_duration_s': 0, 'complete': True, 'state_string': 'build successful', 'results': 0, 'properties': {'branchname': ['pr-14979', 'Change'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'headrev': ['8159092533e9160c64df47f9001b55a24ae16633', 'Change'], 'builderid': [22, 'Builder'], 'shortrev': ['815909', 'Change'], 'pr_id': [14979, 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'branch': ['refs/pull/14979/head', 'Build'], 'revision': ['8159092533e9160c64df47f9001b55a24ae16633', 'Build'], 'workername': ['android', 'Worker'], 'buildername': ['pr-android', 'Builder'], 'scheduler': ['pr', 'Scheduler'], 'buildnumber': [10925, 'Build'], 'codebase': ['', 'Build'], 'repository': ['', 'Build'], 'project': ['', 'Build'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build'], 'basedir': ['/buildbot', 'Worker'], 'builddir': ['/buildbot/pr-android', 'Worker'], 'got_revision': ['8159092533e9160c64df47f9001b55a24ae16633', 'GitNoBranch']}, 'buildrequest': {'buildrequestid': 196925, 'buildsetid': 44103, 'builderid': 22, 'priority': 0, 'claimed': True, 'claimed_at': 1793728060, 'claimed_by_masterid': 1, 'complete': False, 'results': -1, 'submitted_at': 1793728059, 'complete_at': None, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44103, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793728059, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13235, 'branch': 'refs/pull/14979/head', 'revision': '8159092533e9160c64df47f9001b55a24ae16633', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793728059, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 22, 'name': 'pr-android', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/22/builds/10925'}, 'type': 'raw_bb_hook'}
2026-11-03T17:47:50.517205 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-flatpak-x64', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/#/builders/43/builds/6067', 'description': 'Auto build in progress on builder pr-flatpak-x64', 'type': 'build_status'}
2026-11-03T17:47:49.762349 {'source': 'webserver', 'raw': {'buildid': 196345, 'number': 6067, 'builderid': 43, 'buildrequestid': 196929, 'workerid': 13, 'masterid': 1, 'started_at': 1793728069, 'complete_at': None, 'locks_duration_s': 0, 'complete': False, 'state_string': 'starting', 'results': None, 'properties': {'branchname': ['pr-14979', 'Change'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'headrev': ['8159092533e9160c64df47f9001b55a24ae16633', 'Change'], 'shortrev': ['815909', 'Change'], 'pr_id': [14979, 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'codebase': ['', 'Build'], 'scheduler': ['pr', 'Scheduler'], 'buildername': ['pr-flatpak-x64', 'Builder'], 'builderid': [43, 'Builder'], 'workername': ['altair-flatpak', 'Worker'], 'branch': ['refs/pull/14979/head', 'Build'], 'revision': ['8159092533e9160c64df47f9001b55a24ae16633', 'Build'], 'repository': ['', 'Build'], 'buildnumber': [6067, 'Build'], 'project': ['', 'Build'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build']}, 'buildrequest': {'buildrequestid': 196929, 'buildsetid': 44103, 'builderid': 43, 'priority': 0, 'claimed': True, 'claimed_at': 1793728069, 'claimed_by_masterid': 1, 'complete': False, 'results': -1, 'submitted_at': 1793728059, 'complete_at': None, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44103, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793728059, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13235, 'branch': 'refs/pull/14979/head', 'revision': '8159092533e9160c64df47f9001b55a24ae16633', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793728059, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 43, 'name': 'pr-flatpak-x64', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/43/builds/6067'}, 'type': 'raw_bb_hook'}
2026-11-03T17:47:44.499573 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'lint', 'pr': 14979, 'success': True, 'pending': False, 'url': 'https://dolphin.ci/#/builders/9/builds/10922', 'description': 'Build succeeded on builder lint', 'type': 'build_status'}
2026-11-03T17:47:43.584027 {'source': 'webserver', 'raw': {'buildid': 196337, 'number': 10922, 'builderid': 9, 'buildrequestid': 196922, 'workerid': 10, 'masterid': 1, 'started_at': 1793728060, 'complete_at': 1793728063, 'locks_duration_s': 0, 'complete': True, 'state_string': 'build successful', 'results': 0, 'properties': {'branchname': ['pr-14979', 'Change'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'buildername': ['lint', 'Builder'], 'buildnumber': [10922, 'Build'], 'repository': ['', 'Build'], 'codebase': ['', 'Build'], 'project': ['', 'Build'], 'headrev': ['8159092533e9160c64df47f9001b55a24ae16633', 'Change'], 'shortrev': ['815909', 'Change'], 'pr_id': [14979, 'Change'], 'branch': ['refs/pull/14979/head', 'Build'], 'revision': ['8159092533e9160c64df47f9001b55a24ae16633', 'Build'], 'scheduler': ['pr', 'Scheduler'], 'workername': ['ubuntu-lts', 'Worker'], 'builderid': [9, 'Builder'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build'], 'basedir': ['/buildbot', 'Worker'], 'builddir': ['/buildbot/lint', 'Worker'], 'got_revision': ['8159092533e9160c64df47f9001b55a24ae16633', 'GitNoBranch']}, 'buildrequest': {'buildrequestid': 196922, 'buildsetid': 44103, 'builderid': 9, 'priority': 0, 'claimed': True, 'claimed_at': 1793728060, 'claimed_by_masterid': 1, 'complete': False, 'results': -1, 'submitted_at': 1793728059, 'complete_at': None, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44103, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793728059, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13235, 'branch': 'refs/pull/14979/head', 'revision': '8159092533e9160c64df47f9001b55a24ae16633', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793728059, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 9, 'name': 'lint', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/9/builds/10922'}, 'type': 'raw_bb_hook'}
2026-11-03T17:47:43.305697 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-android', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/#/builders/22/builds/10925', 'description': 'Auto build in progress on builder pr-android', 'type': 'build_status'}
2026-11-03T17:47:42.619065 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-appimage-arm64', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/#/builders/50/builds/165', 'description': 'Auto build in progress on builder pr-appimage-arm64', 'type': 'build_status'}
2026-11-03T17:47:41.875172 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-appimage-x64', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/#/builders/49/builds/171', 'description': 'Auto build in progress on builder pr-appimage-x64', 'type': 'build_status'}
2026-11-03T17:47:41.133339 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'lint', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/#/builders/9/builds/10922', 'description': 'Auto build in progress on builder lint', 'type': 'build_status'}
2026-11-03T17:47:40.546162 {'source': 'webserver', 'raw': {'buildid': 196341, 'number': 10925, 'builderid': 22, 'buildrequestid': 196925, 'workerid': 12, 'masterid': 1, 'started_at': 1793728060, 'complete_at': None, 'locks_duration_s': 0, 'complete': False, 'state_string': 'starting', 'results': None, 'properties': {'branchname': ['pr-14979', 'Change'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'headrev': ['8159092533e9160c64df47f9001b55a24ae16633', 'Change'], 'builderid': [22, 'Builder'], 'shortrev': ['815909', 'Change'], 'pr_id': [14979, 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'branch': ['refs/pull/14979/head', 'Build'], 'revision': ['8159092533e9160c64df47f9001b55a24ae16633', 'Build'], 'workername': ['android', 'Worker'], 'buildername': ['pr-android', 'Builder'], 'scheduler': ['pr', 'Scheduler'], 'buildnumber': [10925, 'Build'], 'codebase': ['', 'Build'], 'repository': ['', 'Build'], 'project': ['', 'Build'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build']}, 'buildrequest': {'buildrequestid': 196925, 'buildsetid': 44103, 'builderid': 22, 'priority': 0, 'claimed': True, 'claimed_at': 1793728060, 'claimed_by_masterid': 1, 'complete': False, 'results': -1, 'submitted_at': 1793728059, 'complete_at': None, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44103, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793728059, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13235, 'branch': 'refs/pull/14979/head', 'revision': '8159092533e9160c64df47f9001b55a24ae16633', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793728059, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 22, 'name': 'pr-android', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/22/builds/10925'}, 'type': 'raw_bb_hook'}
2026-11-03T17:47:40.432069 {'source': 'webserver', 'raw': {'buildid': 196340, 'number': 165, 'builderid': 50, 'buildrequestid': 196932, 'workerid': 16, 'masterid': 1, 'started_at': 1793728060, 'complete_at': None, 'locks_duration_s': 0, 'complete': False, 'state_string': 'starting', 'results': None, 'properties': {'workername': ['deneb-appimage', 'Worker'], 'pr_id': [14979, 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'scheduler': ['pr', 'Scheduler'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'headrev': ['8159092533e9160c64df47f9001b55a24ae16633', 'Change'], 'branchname': ['pr-14979', 'Change'], 'shortrev': ['815909', 'Change'], 'buildername': ['pr-appimage-arm64', 'Builder'], 'builderid': [50, 'Builder'], 'buildnumber': [165, 'Build'], 'branch': ['refs/pull/14979/head', 'Build'], 'revision': ['8159092533e9160c64df47f9001b55a24ae16633', 'Build'], 'repository': ['', 'Build'], 'codebase': ['', 'Build'], 'project': ['', 'Build'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build']}, 'buildrequest': {'buildrequestid': 196932, 'buildsetid': 44103, 'builderid': 50, 'priority': 0, 'claimed': True, 'claimed_at': 1793728060, 'claimed_by_masterid': 1, 'complete': False, 'results': -1, 'submitted_at': 1793728059, 'complete_at': None, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44103, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793728059, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13235, 'branch': 'refs/pull/14979/head', 'revision': '8159092533e9160c64df47f9001b55a24ae16633', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793728059, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 50, 'name': 'pr-appimage-arm64', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/50/builds/165'}, 'type': 'raw_bb_hook'}
2026-11-03T17:47:40.411500 {'source': 'webserver', 'raw': {'buildid': 196339, 'number': 171, 'builderid': 49, 'buildrequestid': 196931, 'workerid': 15, 'masterid': 1, 'started_at': 1793728060, 'complete_at': None, 'locks_duration_s': 0, 'complete': False, 'state_string': 'starting', 'results': None, 'properties': {'branchname': ['pr-14979', 'Change'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'pr_id': [14979, 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'shortrev': ['815909', 'Change'], 'builderid': [49, 'Builder'], 'project': ['', 'Build'], 'headrev': ['8159092533e9160c64df47f9001b55a24ae16633', 'Change'], 'repository': ['', 'Build'], 'codebase': ['', 'Build'], 'scheduler': ['pr', 'Scheduler'], 'buildername': ['pr-appimage-x64', 'Builder'], 'workername': ['altair-appimage', 'Worker'], 'buildnumber': [171, 'Build'], 'branch': ['refs/pull/14979/head', 'Build'], 'revision': ['8159092533e9160c64df47f9001b55a24ae16633', 'Build'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build']}, 'buildrequest': {'buildrequestid': 196931, 'buildsetid': 44103, 'builderid': 49, 'priority': 0, 'claimed': True, 'claimed_at': 1793728060, 'claimed_by_masterid': 1, 'complete': False, 'results': -1, 'submitted_at': 1793728059, 'complete_at': None, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44103, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793728059, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13235, 'branch': 'refs/pull/14979/head', 'revision': '8159092533e9160c64df47f9001b55a24ae16633', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793728059, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 49, 'name': 'pr-appimage-x64', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/49/builds/171'}, 'type': 'raw_bb_hook'}
2026-11-03T17:47:40.356522 {'source': 'webserver', 'raw': {'buildid': 196337, 'number': 10922, 'builderid': 9, 'buildrequestid': 196922, 'workerid': 10, 'masterid': 1, 'started_at': 1793728060, 'complete_at': None, 'locks_duration_s': 0, 'complete': False, 'state_string': 'starting', 'results': None, 'properties': {'branchname': ['pr-14979', 'Change'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'buildername': ['lint', 'Builder'], 'buildnumber': [10922, 'Build'], 'repository': ['', 'Build'], 'codebase': ['', 'Build'], 'project': ['', 'Build'], 'headrev': ['8159092533e9160c64df47f9001b55a24ae16633', 'Change'], 'shortrev': ['815909', 'Change'], 'pr_id': [14979, 'Change'], 'branch': ['refs/pull/14979/head', 'Build'], 'revision': ['8159092533e9160c64df47f9001b55a24ae16633', 'Build'], 'scheduler': ['pr', 'Scheduler'], 'workername': ['ubuntu-lts', 'Worker'], 'builderid': [9, 'Builder'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build']}, 'buildrequest': {'buildrequestid': 196922, 'buildsetid': 44103, 'builderid': 9, 'priority': 0, 'claimed': True, 'claimed_at': 1793728060, 'claimed_by_masterid': 1, 'complete': False, 'results': -1, 'submitted_at': 1793728059, 'complete_at': None, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44103, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793728059, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13235, 'branch': 'refs/pull/14979/head', 'revision': '8159092533e9160c64df47f9001b55a24ae16633', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793728059, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 9, 'name': 'lint', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/9/builds/10922'}, 'type': 'raw_bb_hook'}
2026-11-03T17:47:39.669038 {'source': 'prbuilder', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'lint', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/', 'description': 'Auto build pending', 'type': 'build_status'}
Recent 'build_status' events
2026-11-03T17:48:16.339206 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-ubu-x64', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/#/builders/27/builds/10919', 'description': 'Auto build in progress on builder pr-ubu-x64', 'type': 'build_status'}
2026-11-03T17:48:14.819505 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-freebsd-x64', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/#/builders/11/builds/10929', 'description': 'Auto build in progress on builder pr-freebsd-x64', 'type': 'build_status'}
2026-11-03T17:48:14.047060 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-deb-x64', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/#/builders/26/builds/10917', 'description': 'Auto build in progress on builder pr-deb-x64', 'type': 'build_status'}
2026-11-03T17:48:13.297822 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-osx-universal', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/#/builders/7/builds/10938', 'description': 'Auto build in progress on builder pr-osx-universal', 'type': 'build_status'}
2026-11-03T17:48:09.840942 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '889421211027958ff6af2264b2ba970b5645b142', 'shortrev': '889421', 'service': 'pr-flatpak-x64', 'pr': 14979, 'success': True, 'pending': False, 'url': 'https://dolphin.ci/#/builders/43/builds/6066', 'description': 'Build succeeded on builder pr-flatpak-x64', 'type': 'build_status'}
2026-11-03T17:47:58.509970 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-android', 'pr': 14979, 'success': True, 'pending': False, 'url': 'https://dolphin.ci/#/builders/22/builds/10925', 'description': 'Build succeeded on builder pr-android', 'type': 'build_status'}
2026-11-03T17:47:50.517205 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-flatpak-x64', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/#/builders/43/builds/6067', 'description': 'Auto build in progress on builder pr-flatpak-x64', 'type': 'build_status'}
2026-11-03T17:47:44.499573 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'lint', 'pr': 14979, 'success': True, 'pending': False, 'url': 'https://dolphin.ci/#/builders/9/builds/10922', 'description': 'Build succeeded on builder lint', 'type': 'build_status'}
2026-11-03T17:47:43.305697 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-android', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/#/builders/22/builds/10925', 'description': 'Auto build in progress on builder pr-android', 'type': 'build_status'}
2026-11-03T17:47:42.619065 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-appimage-arm64', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/#/builders/50/builds/165', 'description': 'Auto build in progress on builder pr-appimage-arm64', 'type': 'build_status'}
2026-11-03T17:47:41.875172 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-appimage-x64', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/#/builders/49/builds/171', 'description': 'Auto build in progress on builder pr-appimage-x64', 'type': 'build_status'}
2026-11-03T17:47:41.133339 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'lint', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/#/builders/9/builds/10922', 'description': 'Auto build in progress on builder lint', 'type': 'build_status'}
2026-11-03T17:47:39.669038 {'source': 'prbuilder', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'lint', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/', 'description': 'Auto build pending', 'type': 'build_status'}
2026-11-03T17:47:38.891473 {'source': 'prbuilder', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-appimage-arm64', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/', 'description': 'Auto build pending', 'type': 'build_status'}
2026-11-03T17:47:38.116818 {'source': 'prbuilder', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-appimage-x64', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/', 'description': 'Auto build pending', 'type': 'build_status'}
2026-11-03T17:47:37.398394 {'source': 'prbuilder', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-flatpak-arm64', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/', 'description': 'Auto build pending', 'type': 'build_status'}
2026-11-03T17:47:36.656628 {'source': 'prbuilder', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-flatpak-x64', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/', 'description': 'Auto build pending', 'type': 'build_status'}
2026-11-03T17:47:35.747695 {'source': 'prbuilder', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-freebsd-x64', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/', 'description': 'Auto build pending', 'type': 'build_status'}
2026-11-03T17:47:34.886076 {'source': 'prbuilder', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-win-dbg-x64', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/', 'description': 'Auto build pending', 'type': 'build_status'}
2026-11-03T17:47:33.905696 {'source': 'prbuilder', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-win-arm64', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/', 'description': 'Auto build pending', 'type': 'build_status'}
2026-11-03T17:47:33.132995 {'source': 'prbuilder', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-win-x64', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/', 'description': 'Auto build pending', 'type': 'build_status'}
2026-11-03T17:47:32.277461 {'source': 'prbuilder', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-ubu-x64', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/', 'description': 'Auto build pending', 'type': 'build_status'}
2026-11-03T17:47:31.491343 {'source': 'prbuilder', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-osx-universal', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/', 'description': 'Auto build pending', 'type': 'build_status'}
2026-11-03T17:47:30.671258 {'source': 'prbuilder', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-deb-dbg-x64', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/', 'description': 'Auto build pending', 'type': 'build_status'}
2026-11-03T17:47:29.923769 {'source': 'prbuilder', 'repo': 'dolphin-emu/dolphin', 'hash': '8159092533e9160c64df47f9001b55a24ae16633', 'shortrev': '815909', 'service': 'pr-deb-x64', 'pr': 14979, 'success': False, 'pending': True, 'url': 'https://dolphin.ci/', 'description': 'Auto build pending', 'type': 'build_status'}
Recent 'command_message' events
2026-11-03T04:33:32.849720 {'source': 'discord', 'who': 'billiard26', 'what': '<@1320924779556900984> please rebuild PR 14976', 'type': 'command_message'}
2026-11-03T00:54:46.597895 {'source': 'discord', 'who': 'oatmealdome', 'what': '<@1320924779556900984> please rebuild 14974', 'type': 'command_message'}
2026-11-03T00:54:40.466839 {'source': 'discord', 'who': 'oatmealdome', 'what': '<@1320924779556900984> please rebuild 14973', 'type': 'command_message'}
2026-11-03T00:54:34.946966 {'source': 'discord', 'who': 'oatmealdome', 'what': '<@1320924779556900984> please rebuild 14971', 'type': 'command_message'}
2026-11-03T00:54:29.214769 {'source': 'discord', 'who': 'oatmealdome', 'what': '<@1320924779556900984> please rebuild 14970', 'type': 'command_message'}
2026-11-03T00:54:22.253871 {'source': 'discord', 'who': 'oatmealdome', 'what': '<@1320924779556900984> please rebuild 14968', 'type': 'command_message'}
2026-11-03T00:54:17.087271 {'source': 'discord', 'who': 'oatmealdome', 'what': '<@1320924779556900984> please rebuild 14969', 'type': 'command_message'}
2026-11-03T00:48:44.202589 {'source': 'discord', 'who': 'billiard26', 'what': '<@1320924779556900984> please rebuild PR 14923', 'type': 'command_message'}
2026-11-02T23:13:58.810667 {'source': 'discord', 'who': 'oatmealdome', 'what': '<@1320924779556900984> please rebuild 14972', 'type': 'command_message'}
2026-11-02T17:11:49.601973 {'source': 'discord', 'who': 'josjuice', 'what': '<@1320924779556900984> please rebuild 14962', 'type': 'command_message'}
2026-11-02T01:43:57.146928 {'source': 'discord', 'who': 'billiard26', 'what': '<@1320924779556900984> please rebuild PR 14969', 'type': 'command_message'}
2026-11-02T01:38:36.056172 {'source': 'discord', 'who': 'billiard26', 'what': '<@1320924779556900984> please rebuild PR 14968', 'type': 'command_message'}
Recent 'dev_wark' events
2026-11-03T04:33:32.849747 {'source': 'discord', 'accepted': True, 'type': 'dev_wark'}
2026-11-03T00:48:44.202673 {'source': 'discord', 'accepted': True, 'type': 'dev_wark'}
2026-11-02T01:43:57.146980 {'source': 'discord', 'accepted': True, 'type': 'dev_wark'}
2026-11-02T01:38:36.056200 {'source': 'discord', 'accepted': True, 'type': 'dev_wark'}
Recent 'gh_issue_comment' events
2026-11-03T17:20:35.099650 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'JMC47', 'action': 'created', 'id': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6610744775', 'safe_author': True, 'body': "I tested this. On Linux, using a shitty slim portable drive.\r\n\r\nHonestly, it seems pretty good in the games I tested. Datel games did not work, but maybe that's because of a setting I had on. I'll try it again later.\r\n\r\nGameCube and Wii. My only issue was first boot didn't work due to the drive not being initialized, after that everything was fine.", 'raw': {'action': 'created', 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'id': 6162397505, 'node_id': 'PR_kwDOALCn2M8AAAABMS-vaA', 'number': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 17, 'created_at': '2026-11-02T12:18:18Z', 'updated_at': '2026-11-03T17:20:32Z', 'closed_at': None, 'assignee': None, 'author_association': 'MEMBER', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.patch', 'merged_at': None}, 'body': 'At long last, this PR restores the ability of running games from DVD backups (originally removed on PR #11456) and, for the first time in Dolphin, allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive):\r\n\r\nhttps://github.com/user-attachments/assets/626b3c7e-cd6a-48f0-9962-eaa6b1f0805a\r\n\r\nOn supported OSes (currently Windows and Linux), there\'s a new "Boot From Optical Disc" menu entry on File, and "Change Disc" now opens a popup that lets you change between a disc image or a physical disc or vice-versa:\r\n\r\nhttps://github.com/user-attachments/assets/0af57155-391c-41c8-b78c-bc70a63a7703\r\n\r\nThis implementation is heavily inspired on [redumper](https://github.com/superg/redumper), so Dolphin directly talks to the optical drive via low level SCSI multimedia commands instead of relying on the old approach that was derived from a very outdated version of libcdio.\r\n\r\n### Features and limitations\r\n* Although the UI changes are minimal (for now), I\'ve tried to make this work as intuitively as possible behind the scenes. I think the most noteworthy ones are that optical drives can be hot plugged at any time (if you\'re using USB to SATA adapters or portable drives) and if you boot from a physical disc and then eject it (either via File => Eject Disc or by pressing the Eject button on the drive itself), the disc will be ejected from the emulated console too. If you reinsert a disc later, it\'ll automatically reinsert the disc on the emulated console too (e.g. multi disc games that ask you to insert the next disc)\r\n* I didn\'t initially plan for this, but the `-i` flag from DolphinTool now accepts disc drive paths (e.g. `-i D:` or `-i /dev/sr0`). A side effect of that is you can now rip original discs to ISO, RVZ, GCZ or WIA directly from DolphinTool, if you have an OmniDrive-enabled drive\r\n* Emulated disc speed code is bypassed when using physical discs, as well as "Load Whole Game Into Memory". Beware of speeding up the emulation by setting the speed limit above 100% though, that can cause audio/video issues and even break games if you let them run too fast for too long, since the optical drive can\'t keep up ("An error occurred, please turn the GC/Wii off and refer to the operating manual")\r\n* Loading speeds are a bit slower than what I remember from playing on a real GC/Wii. The handful of games I tried still worked fine, though\r\n* When RetroAchievements are enabled, its hashing can cause a bit of slow loading speeds right after booting a game. It\'s more noticeable with Wii titles\r\n* Currently, [GameCube games that uses DTK Audio](https://wiki.dolphin-emu.org/index.php?title=Category:DTK_Audio_games) are nearly unplayable from physical discs, as the DTK audio path causes constant drive seeking, which consequently reduces the read speeds significantly. I intend to explore a few caching techniques to fix this, but it will be on a separate PR\r\n* Minimal testing was done on Linux, apart from compiling from source on Ubuntu 26.04.1 LTS and ensuring it could boot a game\r\n* Currently there\'s no macOS support, and I won\'t be adding it as I have no access to any Apple hardware. Porting should be easy, though, as all OS-specific code are isolated on `SCSIDevice.cpp/.h`\r\n\r\n### Generative AI disclosure\r\nThe source code from [redumper (b705)](https://github.com/superg/redumper/tree/b705) was fed into a LLM, which was tasked on creating a technical specs document about how it handles standard and raw OmniDrive reads. Then, I\'ve made a Windows-only CLI tool implementing only the absolute minimum required for the features that would be relevant for us, based on that document. DVD descrambling was added next and used this [reference implementation](https://github.com/Deterous/DVD-Scrambler) from Deterous. Once the CLI tool was feature complete, I used a LLM again, this time feeding it parts of the Linux (6.18 LTS) kernel source code, to assist with adding Linux compatibility to it.\r\n\r\nFinally, I started working with the Dolphin\'s source. The code this PR adds is directly derived from the CLI tool, but no LLMs were used beyond that point. I\'m also not touching any emulation code, the changes in DVDInterface reuses existing behavior or are based in code comments that already existed in Dolphin before this PR.\r\n\r\n### Licenses and attribuition\r\nThe bulk of this PR was heavily based on [redumper](https://github.com/superg/redumper), which is licensed under the GPLv3. As mentioned earlier, I also used the [descrambling implementation from Deterous](https://github.com/Deterous/DVD-Scrambler) as a reference, which the repo itself doesn\'t define a license, but directly mentions being made as the reference for redumper, so I think we\'re good? I can try contacting Deterous too for explicit approval, if needed...', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/reactions', 'total_count': 6, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 6, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6610744775', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6610744775', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'id': 6610744775, 'node_id': 'IC_kwDOALCn2M8AAAABigf1xw', 'user': {'login': 'JMC47', 'id': 6598209, 'node_id': 'MDQ6VXNlcjY1OTgyMDk=', 'avatar_url': 'https://avatars.githubusercontent.com/u/6598209?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JMC47', 'html_url': 'https://github.com/JMC47', 'followers_url': 'https://api.github.com/users/JMC47/followers', 'following_url': 'https://api.github.com/users/JMC47/following{/other_user}', 'gists_url': 'https://api.github.com/users/JMC47/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JMC47/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JMC47/subscriptions', 'organizations_url': 'https://api.github.com/users/JMC47/orgs', 'repos_url': 'https://api.github.com/users/JMC47/repos', 'events_url': 'https://api.github.com/users/JMC47/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JMC47/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T17:20:32Z', 'updated_at': '2026-11-03T17:20:32Z', 'body': "I tested this. On Linux, using a shitty slim portable drive.\r\n\r\nHonestly, it seems pretty good in the games I tested. Datel games did not work, but maybe that's because of a setting I had on. I'll try it again later.\r\n\r\nGameCube and Wii. My only issue was first boot didn't work due to the drive not being initialized, after that everything was fine.", 'author_association': 'MEMBER', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6610744775/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T17:06:13Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15760, 'watchers_count': 15760, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3378, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 480, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3378, 'open_issues': 480, 'watchers': 15760, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'JMC47', 'id': 6598209, 'node_id': 'MDQ6VXNlcjY1OTgyMDk=', 'avatar_url': 'https://avatars.githubusercontent.com/u/6598209?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JMC47', 'html_url': 'https://github.com/JMC47', 'followers_url': 'https://api.github.com/users/JMC47/followers', 'following_url': 'https://api.github.com/users/JMC47/following{/other_user}', 'gists_url': 'https://api.github.com/users/JMC47/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JMC47/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JMC47/subscriptions', 'organizations_url': 'https://api.github.com/users/JMC47/orgs', 'repos_url': 'https://api.github.com/users/JMC47/repos', 'events_url': 'https://api.github.com/users/JMC47/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JMC47/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'gh_issue_comment'}
2026-11-03T16:04:15.404350 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'debug687', 'action': 'edited', 'id': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6608556659', 'safe_author': False, 'body': "> what optical drive are you using? \r\n\r\nIt is a big internal desktop drive. I'm not sure what the model number is. I changed the firmware so much, I don't think even the drive knows what model it is anymore.\r\n\r\n> Are you trying original game discs or backups?\r\n\r\nI was only testing original game discs.\r\n\r\n> There's not a lot to work from in your screenshots, so I'll kindly ask you to retry again with the logs enabled, then \r\npost them here so I can investigate.\r\n\r\nI did, but what I found is strange. I tested a few different games, and some did work. But after opening and closing the disc drive, the same game stopped working. I haven't found any pattern in what makes it work/not work, but when it does not work (more than 90% of the time), this is the output you were asking for (it's the same output every time):\r\n\r\n## First attempt\r\n\r\n```\r\n06:41:696 DiscIO/OpticalDiscBlob.cpp:363 N[DIO]: Optical drive /dev/sr0 runs OmniDrive firmware v1.0.2\r\n06:42:107 DiscIO/OpticalDiscBlob.cpp:382 N[DIO]: GameCube/Wii book type in /dev/sr0, using OmniDrive raw reads\r\n06:51:110 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: FF\r\n07:00:910 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n07:00:910 DiscIO/OpticalDiscBlob.cpp:514 E[DIO]: Read error at LBA 0 on /dev/sr0\r\n07:10:749 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n07:20:521 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n07:20:521 DiscIO/OpticalDiscBlob.cpp:514 E[DIO]: Read error at LBA 0 on /dev/sr0\r\n```\r\n\r\n## Second attempt (without opening the disc drive)\r\n\r\n```\r\n08:12:722 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n08:12:722 DiscIO/OpticalDiscBlob.cpp:379 E[DIO]: Failed to read LBA 0 to derive the disc key from /dev/sr0\r\n```", 'raw': {'action': 'edited', 'changes': {'body': {'from': "> what optical drive are you using? \r\n\r\nIt is a big internal desktop drive. I'm not sure what the model number is. I changed the firmware so much, I don't think even the drive knows what model it is anymore.\r\n\r\n> Are you trying original game discs or backups?\r\n\r\nI was only testing original game discs.\r\n\r\n> There's not a lot to work from in your screenshots, so I'll kindly ask you to retry again with the logs enabled, then \r\npost them here so I can investigate.\r\n\r\nI did, but what I found is strange. I tested a few different games, and some did work. But after opening and closing the disc drive, the same game stopped working. I haven't found any pattern in what makes it work/not work, but when it does not work, this is the output you were asking for (it's the same output every time):\r\n\r\n## First attempt\r\n\r\n```\r\n06:41:696 DiscIO/OpticalDiscBlob.cpp:363 N[DIO]: Optical drive /dev/sr0 runs OmniDrive firmware v1.0.2\r\n06:42:107 DiscIO/OpticalDiscBlob.cpp:382 N[DIO]: GameCube/Wii book type in /dev/sr0, using OmniDrive raw reads\r\n06:51:110 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: FF\r\n07:00:910 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n07:00:910 DiscIO/OpticalDiscBlob.cpp:514 E[DIO]: Read error at LBA 0 on /dev/sr0\r\n07:10:749 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n07:20:521 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n07:20:521 DiscIO/OpticalDiscBlob.cpp:514 E[DIO]: Read error at LBA 0 on /dev/sr0\r\n```\r\n\r\n## Second attempt (without opening the disc drive)\r\n\r\n```\r\n08:12:722 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n08:12:722 DiscIO/OpticalDiscBlob.cpp:379 E[DIO]: Failed to read LBA 0 to derive the disc key from /dev/sr0\r\n```"}}, 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'id': 6162397505, 'node_id': 'PR_kwDOALCn2M8AAAABMS-vaA', 'number': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 16, 'created_at': '2026-11-02T12:18:18Z', 'updated_at': '2026-11-03T15:53:32Z', 'closed_at': None, 'assignee': None, 'author_association': 'MEMBER', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.patch', 'merged_at': None}, 'body': 'At long last, this PR restores the ability of running games from DVD backups (originally removed on PR #11456) and, for the first time in Dolphin, allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive):\r\n\r\nhttps://github.com/user-attachments/assets/626b3c7e-cd6a-48f0-9962-eaa6b1f0805a\r\n\r\nOn supported OSes (currently Windows and Linux), there\'s a new "Boot From Optical Disc" menu entry on File, and "Change Disc" now opens a popup that lets you change between a disc image or a physical disc or vice-versa:\r\n\r\nhttps://github.com/user-attachments/assets/0af57155-391c-41c8-b78c-bc70a63a7703\r\n\r\nThis implementation is heavily inspired on [redumper](https://github.com/superg/redumper), so Dolphin directly talks to the optical drive via low level SCSI multimedia commands instead of relying on the old approach that was derived from a very outdated version of libcdio.\r\n\r\n### Features and limitations\r\n* Although the UI changes are minimal (for now), I\'ve tried to make this work as intuitively as possible behind the scenes. I think the most noteworthy ones are that optical drives can be hot plugged at any time (if you\'re using USB to SATA adapters or portable drives) and if you boot from a physical disc and then eject it (either via File => Eject Disc or by pressing the Eject button on the drive itself), the disc will be ejected from the emulated console too. If you reinsert a disc later, it\'ll automatically reinsert the disc on the emulated console too (e.g. multi disc games that ask you to insert the next disc)\r\n* I didn\'t initially plan for this, but the `-i` flag from DolphinTool now accepts disc drive paths (e.g. `-i D:` or `-i /dev/sr0`). A side effect of that is you can now rip original discs to ISO, RVZ, GCZ or WIA directly from DolphinTool, if you have an OmniDrive-enabled drive\r\n* Emulated disc speed code is bypassed when using physical discs, as well as "Load Whole Game Into Memory". Beware of speeding up the emulation by setting the speed limit above 100% though, that can cause audio/video issues and even break games if you let them run too fast for too long, since the optical drive can\'t keep up ("An error occurred, please turn the GC/Wii off and refer to the operating manual")\r\n* Loading speeds are a bit slower than what I remember from playing on a real GC/Wii. The handful of games I tried still worked fine, though\r\n* When RetroAchievements are enabled, its hashing can cause a bit of slow loading speeds right after booting a game. It\'s more noticeable with Wii titles\r\n* Currently, [GameCube games that uses DTK Audio](https://wiki.dolphin-emu.org/index.php?title=Category:DTK_Audio_games) are nearly unplayable from physical discs, as the DTK audio path causes constant drive seeking, which consequently reduces the read speeds significantly. I intend to explore a few caching techniques to fix this, but it will be on a separate PR\r\n* Minimal testing was done on Linux, apart from compiling from source on Ubuntu 26.04.1 LTS and ensuring it could boot a game\r\n* Currently there\'s no macOS support, and I won\'t be adding it as I have no access to any Apple hardware. Porting should be easy, though, as all OS-specific code are isolated on `SCSIDevice.cpp/.h`\r\n\r\n### Generative AI disclosure\r\nThe source code from [redumper (b705)](https://github.com/superg/redumper/tree/b705) was fed into a LLM, which was tasked on creating a technical specs document about how it handles standard and raw OmniDrive reads. Then, I\'ve made a Windows-only CLI tool implementing only the absolute minimum required for the features that would be relevant for us, based on that document. DVD descrambling was added next and used this [reference implementation](https://github.com/Deterous/DVD-Scrambler) from Deterous. Once the CLI tool was feature complete, I used a LLM again, this time feeding it parts of the Linux (6.18 LTS) kernel source code, to assist with adding Linux compatibility to it.\r\n\r\nFinally, I started working with the Dolphin\'s source. The code this PR adds is directly derived from the CLI tool, but no LLMs were used beyond that point. I\'m also not touching any emulation code, the changes in DVDInterface reuses existing behavior or are based in code comments that already existed in Dolphin before this PR.\r\n\r\n### Licenses and attribuition\r\nThe bulk of this PR was heavily based on [redumper](https://github.com/superg/redumper), which is licensed under the GPLv3. As mentioned earlier, I also used the [descrambling implementation from Deterous](https://github.com/Deterous/DVD-Scrambler) as a reference, which the repo itself doesn\'t define a license, but directly mentions being made as the reference for redumper, so I think we\'re good? I can try contacting Deterous too for explicit approval, if needed...', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/reactions', 'total_count': 6, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 6, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6608556659', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6608556659', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'id': 6608556659, 'node_id': 'IC_kwDOALCn2M8AAAABieaScw', 'user': {'login': 'debug687', 'id': 313431556, 'node_id': 'U_kgDOEq6WBA', 'avatar_url': 'https://avatars.githubusercontent.com/u/313431556?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/debug687', 'html_url': 'https://github.com/debug687', 'followers_url': 'https://api.github.com/users/debug687/followers', 'following_url': 'https://api.github.com/users/debug687/following{/other_user}', 'gists_url': 'https://api.github.com/users/debug687/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/debug687/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/debug687/subscriptions', 'organizations_url': 'https://api.github.com/users/debug687/orgs', 'repos_url': 'https://api.github.com/users/debug687/repos', 'events_url': 'https://api.github.com/users/debug687/events{/privacy}', 'received_events_url': 'https://api.github.com/users/debug687/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T15:53:32Z', 'updated_at': '2026-11-03T16:04:05Z', 'body': "> what optical drive are you using? \r\n\r\nIt is a big internal desktop drive. I'm not sure what the model number is. I changed the firmware so much, I don't think even the drive knows what model it is anymore.\r\n\r\n> Are you trying original game discs or backups?\r\n\r\nI was only testing original game discs.\r\n\r\n> There's not a lot to work from in your screenshots, so I'll kindly ask you to retry again with the logs enabled, then \r\npost them here so I can investigate.\r\n\r\nI did, but what I found is strange. I tested a few different games, and some did work. But after opening and closing the disc drive, the same game stopped working. I haven't found any pattern in what makes it work/not work, but when it does not work (more than 90% of the time), this is the output you were asking for (it's the same output every time):\r\n\r\n## First attempt\r\n\r\n```\r\n06:41:696 DiscIO/OpticalDiscBlob.cpp:363 N[DIO]: Optical drive /dev/sr0 runs OmniDrive firmware v1.0.2\r\n06:42:107 DiscIO/OpticalDiscBlob.cpp:382 N[DIO]: GameCube/Wii book type in /dev/sr0, using OmniDrive raw reads\r\n06:51:110 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: FF\r\n07:00:910 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n07:00:910 DiscIO/OpticalDiscBlob.cpp:514 E[DIO]: Read error at LBA 0 on /dev/sr0\r\n07:10:749 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n07:20:521 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n07:20:521 DiscIO/OpticalDiscBlob.cpp:514 E[DIO]: Read error at LBA 0 on /dev/sr0\r\n```\r\n\r\n## Second attempt (without opening the disc drive)\r\n\r\n```\r\n08:12:722 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n08:12:722 DiscIO/OpticalDiscBlob.cpp:379 E[DIO]: Failed to read LBA 0 to derive the disc key from /dev/sr0\r\n```", 'author_association': 'CONTRIBUTOR', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6608556659/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T14:47:59Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15759, 'watchers_count': 15759, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3378, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 480, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3378, 'open_issues': 480, 'watchers': 15759, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'debug687', 'id': 313431556, 'node_id': 'U_kgDOEq6WBA', 'avatar_url': 'https://avatars.githubusercontent.com/u/313431556?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/debug687', 'html_url': 'https://github.com/debug687', 'followers_url': 'https://api.github.com/users/debug687/followers', 'following_url': 'https://api.github.com/users/debug687/following{/other_user}', 'gists_url': 'https://api.github.com/users/debug687/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/debug687/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/debug687/subscriptions', 'organizations_url': 'https://api.github.com/users/debug687/orgs', 'repos_url': 'https://api.github.com/users/debug687/repos', 'events_url': 'https://api.github.com/users/debug687/events{/privacy}', 'received_events_url': 'https://api.github.com/users/debug687/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'gh_issue_comment'}
2026-11-03T15:53:34.139516 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'debug687', 'action': 'created', 'id': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6608556659', 'safe_author': False, 'body': "> what optical drive are you using? \r\n\r\nIt is a big internal desktop drive. I'm not sure what the model number is. I changed the firmware so much, I don't think even the drive knows what model it is anymore.\r\n\r\n> Are you trying original game discs or backups?\r\n\r\nI was only testing original game discs.\r\n\r\n> There's not a lot to work from in your screenshots, so I'll kindly ask you to retry again with the logs enabled, then \r\npost them here so I can investigate.\r\n\r\nI did, but what I found is strange. I tested a few different games, and some did work. But after opening and closing the disc drive, the same game stopped working. I haven't found any pattern in what makes it work/not work, but when it does not work, this is the output you were asking for (it's the same output every time):\r\n\r\n## First attempt\r\n\r\n```\r\n06:41:696 DiscIO/OpticalDiscBlob.cpp:363 N[DIO]: Optical drive /dev/sr0 runs OmniDrive firmware v1.0.2\r\n06:42:107 DiscIO/OpticalDiscBlob.cpp:382 N[DIO]: GameCube/Wii book type in /dev/sr0, using OmniDrive raw reads\r\n06:51:110 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: FF\r\n07:00:910 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n07:00:910 DiscIO/OpticalDiscBlob.cpp:514 E[DIO]: Read error at LBA 0 on /dev/sr0\r\n07:10:749 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n07:20:521 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n07:20:521 DiscIO/OpticalDiscBlob.cpp:514 E[DIO]: Read error at LBA 0 on /dev/sr0\r\n```\r\n\r\n## Second attempt (without opening the disc drive)\r\n\r\n```\r\n08:12:722 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n08:12:722 DiscIO/OpticalDiscBlob.cpp:379 E[DIO]: Failed to read LBA 0 to derive the disc key from /dev/sr0\r\n```", 'raw': {'action': 'created', 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'id': 6162397505, 'node_id': 'PR_kwDOALCn2M8AAAABMS-vaA', 'number': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 16, 'created_at': '2026-11-02T12:18:18Z', 'updated_at': '2026-11-03T15:53:32Z', 'closed_at': None, 'assignee': None, 'author_association': 'MEMBER', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.patch', 'merged_at': None}, 'body': 'At long last, this PR restores the ability of running games from DVD backups (originally removed on PR #11456) and, for the first time in Dolphin, allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive):\r\n\r\nhttps://github.com/user-attachments/assets/626b3c7e-cd6a-48f0-9962-eaa6b1f0805a\r\n\r\nOn supported OSes (currently Windows and Linux), there\'s a new "Boot From Optical Disc" menu entry on File, and "Change Disc" now opens a popup that lets you change between a disc image or a physical disc or vice-versa:\r\n\r\nhttps://github.com/user-attachments/assets/0af57155-391c-41c8-b78c-bc70a63a7703\r\n\r\nThis implementation is heavily inspired on [redumper](https://github.com/superg/redumper), so Dolphin directly talks to the optical drive via low level SCSI multimedia commands instead of relying on the old approach that was derived from a very outdated version of libcdio.\r\n\r\n### Features and limitations\r\n* Although the UI changes are minimal (for now), I\'ve tried to make this work as intuitively as possible behind the scenes. I think the most noteworthy ones are that optical drives can be hot plugged at any time (if you\'re using USB to SATA adapters or portable drives) and if you boot from a physical disc and then eject it (either via File => Eject Disc or by pressing the Eject button on the drive itself), the disc will be ejected from the emulated console too. If you reinsert a disc later, it\'ll automatically reinsert the disc on the emulated console too (e.g. multi disc games that ask you to insert the next disc)\r\n* I didn\'t initially plan for this, but the `-i` flag from DolphinTool now accepts disc drive paths (e.g. `-i D:` or `-i /dev/sr0`). A side effect of that is you can now rip original discs to ISO, RVZ, GCZ or WIA directly from DolphinTool, if you have an OmniDrive-enabled drive\r\n* Emulated disc speed code is bypassed when using physical discs, as well as "Load Whole Game Into Memory". Beware of speeding up the emulation by setting the speed limit above 100% though, that can cause audio/video issues and even break games if you let them run too fast for too long, since the optical drive can\'t keep up ("An error occurred, please turn the GC/Wii off and refer to the operating manual")\r\n* Loading speeds are a bit slower than what I remember from playing on a real GC/Wii. The handful of games I tried still worked fine, though\r\n* When RetroAchievements are enabled, its hashing can cause a bit of slow loading speeds right after booting a game. It\'s more noticeable with Wii titles\r\n* Currently, [GameCube games that uses DTK Audio](https://wiki.dolphin-emu.org/index.php?title=Category:DTK_Audio_games) are nearly unplayable from physical discs, as the DTK audio path causes constant drive seeking, which consequently reduces the read speeds significantly. I intend to explore a few caching techniques to fix this, but it will be on a separate PR\r\n* Minimal testing was done on Linux, apart from compiling from source on Ubuntu 26.04.1 LTS and ensuring it could boot a game\r\n* Currently there\'s no macOS support, and I won\'t be adding it as I have no access to any Apple hardware. Porting should be easy, though, as all OS-specific code are isolated on `SCSIDevice.cpp/.h`\r\n\r\n### Generative AI disclosure\r\nThe source code from [redumper (b705)](https://github.com/superg/redumper/tree/b705) was fed into a LLM, which was tasked on creating a technical specs document about how it handles standard and raw OmniDrive reads. Then, I\'ve made a Windows-only CLI tool implementing only the absolute minimum required for the features that would be relevant for us, based on that document. DVD descrambling was added next and used this [reference implementation](https://github.com/Deterous/DVD-Scrambler) from Deterous. Once the CLI tool was feature complete, I used a LLM again, this time feeding it parts of the Linux (6.18 LTS) kernel source code, to assist with adding Linux compatibility to it.\r\n\r\nFinally, I started working with the Dolphin\'s source. The code this PR adds is directly derived from the CLI tool, but no LLMs were used beyond that point. I\'m also not touching any emulation code, the changes in DVDInterface reuses existing behavior or are based in code comments that already existed in Dolphin before this PR.\r\n\r\n### Licenses and attribuition\r\nThe bulk of this PR was heavily based on [redumper](https://github.com/superg/redumper), which is licensed under the GPLv3. As mentioned earlier, I also used the [descrambling implementation from Deterous](https://github.com/Deterous/DVD-Scrambler) as a reference, which the repo itself doesn\'t define a license, but directly mentions being made as the reference for redumper, so I think we\'re good? I can try contacting Deterous too for explicit approval, if needed...', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/reactions', 'total_count': 6, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 6, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6608556659', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6608556659', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'id': 6608556659, 'node_id': 'IC_kwDOALCn2M8AAAABieaScw', 'user': {'login': 'debug687', 'id': 313431556, 'node_id': 'U_kgDOEq6WBA', 'avatar_url': 'https://avatars.githubusercontent.com/u/313431556?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/debug687', 'html_url': 'https://github.com/debug687', 'followers_url': 'https://api.github.com/users/debug687/followers', 'following_url': 'https://api.github.com/users/debug687/following{/other_user}', 'gists_url': 'https://api.github.com/users/debug687/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/debug687/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/debug687/subscriptions', 'organizations_url': 'https://api.github.com/users/debug687/orgs', 'repos_url': 'https://api.github.com/users/debug687/repos', 'events_url': 'https://api.github.com/users/debug687/events{/privacy}', 'received_events_url': 'https://api.github.com/users/debug687/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T15:53:32Z', 'updated_at': '2026-11-03T15:53:32Z', 'body': "> what optical drive are you using? \r\n\r\nIt is a big internal desktop drive. I'm not sure what the model number is. I changed the firmware so much, I don't think even the drive knows what model it is anymore.\r\n\r\n> Are you trying original game discs or backups?\r\n\r\nI was only testing original game discs.\r\n\r\n> There's not a lot to work from in your screenshots, so I'll kindly ask you to retry again with the logs enabled, then \r\npost them here so I can investigate.\r\n\r\nI did, but what I found is strange. I tested a few different games, and some did work. But after opening and closing the disc drive, the same game stopped working. I haven't found any pattern in what makes it work/not work, but when it does not work, this is the output you were asking for (it's the same output every time):\r\n\r\n## First attempt\r\n\r\n```\r\n06:41:696 DiscIO/OpticalDiscBlob.cpp:363 N[DIO]: Optical drive /dev/sr0 runs OmniDrive firmware v1.0.2\r\n06:42:107 DiscIO/OpticalDiscBlob.cpp:382 N[DIO]: GameCube/Wii book type in /dev/sr0, using OmniDrive raw reads\r\n06:51:110 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: FF\r\n07:00:910 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n07:00:910 DiscIO/OpticalDiscBlob.cpp:514 E[DIO]: Read error at LBA 0 on /dev/sr0\r\n07:10:749 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n07:20:521 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n07:20:521 DiscIO/OpticalDiscBlob.cpp:514 E[DIO]: Read error at LBA 0 on /dev/sr0\r\n```\r\n\r\n## Second attempt (without opening the disc drive)\r\n\r\n```\r\n08:12:722 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n08:12:722 DiscIO/OpticalDiscBlob.cpp:379 E[DIO]: Failed to read LBA 0 to derive the disc key from /dev/sr0\r\n```", 'author_association': 'CONTRIBUTOR', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6608556659/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T14:47:59Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15759, 'watchers_count': 15759, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3378, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 480, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3378, 'open_issues': 480, 'watchers': 15759, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'debug687', 'id': 313431556, 'node_id': 'U_kgDOEq6WBA', 'avatar_url': 'https://avatars.githubusercontent.com/u/313431556?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/debug687', 'html_url': 'https://github.com/debug687', 'followers_url': 'https://api.github.com/users/debug687/followers', 'following_url': 'https://api.github.com/users/debug687/following{/other_user}', 'gists_url': 'https://api.github.com/users/debug687/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/debug687/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/debug687/subscriptions', 'organizations_url': 'https://api.github.com/users/debug687/orgs', 'repos_url': 'https://api.github.com/users/debug687/repos', 'events_url': 'https://api.github.com/users/debug687/events{/privacy}', 'received_events_url': 'https://api.github.com/users/debug687/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'gh_issue_comment'}
2026-11-03T11:23:59.207608 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'Linkinworm', 'action': 'created', 'id': 14827, 'title': 'Android: Implement Save File Manager', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14827#issuecomment-6602531884', 'safe_author': True, 'body': 'Quick note , import fails should give a more discript reasonings , after some tests I\'ve realised that "import failed" for something like not starting the game first boot isn\'t great, so custom reasoning toasts would help users', 'raw': {'action': 'created', 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14827', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14827/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14827/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14827/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14827', 'id': 5248387336, 'node_id': 'PR_kwDOALCn2M8AAAABA93Kaw', 'number': 14827, 'title': 'Android: Implement Save File Manager', 'user': {'login': 'Linkinworm', 'id': 32615992, 'node_id': 'MDQ6VXNlcjMyNjE1OTky', 'avatar_url': 'https://avatars.githubusercontent.com/u/32615992?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/Linkinworm', 'html_url': 'https://github.com/Linkinworm', 'followers_url': 'https://api.github.com/users/Linkinworm/followers', 'following_url': 'https://api.github.com/users/Linkinworm/following{/other_user}', 'gists_url': 'https://api.github.com/users/Linkinworm/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/Linkinworm/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/Linkinworm/subscriptions', 'organizations_url': 'https://api.github.com/users/Linkinworm/orgs', 'repos_url': 'https://api.github.com/users/Linkinworm/repos', 'events_url': 'https://api.github.com/users/Linkinworm/events{/privacy}', 'received_events_url': 'https://api.github.com/users/Linkinworm/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 2, 'created_at': '2026-08-25T16:52:00Z', 'updated_at': '2026-11-03T11:23:56Z', 'closed_at': None, 'assignee': None, 'author_association': 'NONE', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14827', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14827', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14827.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14827.patch', 'merged_at': None}, 'body': 'Adds a save file manager allowing users to manage GameCube, Wii, and GBA save files.\r\n\r\nSince gameTDB doesnt have GB/GBA covers I just use colour coding for blocks of saves, this is easier on the eyes than a list of saves\r\n\r\nIncludes everything for importing exporting etc, suports GC GCI folders and .raw for moving saves around, wii saves at least need 1st run. The GBA save manager has some unique features for the GBA implimentation so the user can play on the gameboy player and then move their save easily for linking (pokemon colosium/XD, Sonic advance, what ever other games)\r\n\r\nThe main use for this was originally just for the GBA game saves for the purpose above, but expanded for GC and wii since theres no real easy way to manage save data for those\r\n<img width="720" height="1120" alt="gbasave" src="https://github.com/user-attachments/assets/c39c3736-e3a3-4212-8b94-c08ca0874bc5" />\r\n<img width="720" height="1120" alt="gc" src="https://github.com/user-attachments/assets/7d0ba656-79b8-4c0f-aa6b-ab0cf96c4203" />\r\n<img width="720" height="1120" alt="wii" src="https://github.com/user-attachments/assets/88d23546-fdb3-4bca-87f7-ec48ddbe64f0" />\r\n', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14827/reactions', 'total_count': 2, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 2, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14827/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6602531884', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14827#issuecomment-6602531884', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14827', 'id': 6602531884, 'node_id': 'IC_kwDOALCn2M8AAAABiYqkLA', 'user': {'login': 'Linkinworm', 'id': 32615992, 'node_id': 'MDQ6VXNlcjMyNjE1OTky', 'avatar_url': 'https://avatars.githubusercontent.com/u/32615992?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/Linkinworm', 'html_url': 'https://github.com/Linkinworm', 'followers_url': 'https://api.github.com/users/Linkinworm/followers', 'following_url': 'https://api.github.com/users/Linkinworm/following{/other_user}', 'gists_url': 'https://api.github.com/users/Linkinworm/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/Linkinworm/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/Linkinworm/subscriptions', 'organizations_url': 'https://api.github.com/users/Linkinworm/orgs', 'repos_url': 'https://api.github.com/users/Linkinworm/repos', 'events_url': 'https://api.github.com/users/Linkinworm/events{/privacy}', 'received_events_url': 'https://api.github.com/users/Linkinworm/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T11:23:56Z', 'updated_at': '2026-11-03T11:23:56Z', 'body': 'Quick note , import fails should give a more discript reasonings , after some tests I\'ve realised that "import failed" for something like not starting the game first boot isn\'t great, so custom reasoning toasts would help users', 'author_association': 'MEMBER', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6602531884/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3377, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 479, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3377, 'open_issues': 479, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'Linkinworm', 'id': 32615992, 'node_id': 'MDQ6VXNlcjMyNjE1OTky', 'avatar_url': 'https://avatars.githubusercontent.com/u/32615992?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/Linkinworm', 'html_url': 'https://github.com/Linkinworm', 'followers_url': 'https://api.github.com/users/Linkinworm/followers', 'following_url': 'https://api.github.com/users/Linkinworm/following{/other_user}', 'gists_url': 'https://api.github.com/users/Linkinworm/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/Linkinworm/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/Linkinworm/subscriptions', 'organizations_url': 'https://api.github.com/users/Linkinworm/orgs', 'repos_url': 'https://api.github.com/users/Linkinworm/repos', 'events_url': 'https://api.github.com/users/Linkinworm/events{/privacy}', 'received_events_url': 'https://api.github.com/users/Linkinworm/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'gh_issue_comment'}
2026-11-03T10:14:35.778929 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'MayImilae', 'action': 'created', 'id': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6600903825', 'safe_author': True, 'body': '> I think it\'s unlikely to cause too many people to try to stick an original GC/Wii game in their standard optical drive, mainly because so few people even have an optical drive these days.\r\n\r\nYea I guess that\'s a good point. We can make adjustments if people start asking about it.\r\n\r\n> An early iteration used the full term inside the tag (like "[OmniDrive]") but the menu became too wide IMO, but this can be reverted or further tweaked, if you think it\'d be more intuitive.\r\n\r\nHonestly I kind of like it saying OmniDrive as a tag and I don\'t think the length is an issue. But I suppose users will have had to already flashed their firmware to OmniDrive and they\'ll have an idea what OD means when they see it.', 'raw': {'action': 'created', 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'id': 6162397505, 'node_id': 'PR_kwDOALCn2M8AAAABMS-vaA', 'number': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 15, 'created_at': '2026-11-02T12:18:18Z', 'updated_at': '2026-11-03T10:14:33Z', 'closed_at': None, 'assignee': None, 'author_association': 'MEMBER', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.patch', 'merged_at': None}, 'body': 'At long last, this PR restores the ability of running games from DVD backups (originally removed on PR #11456) and, for the first time in Dolphin, allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive):\r\n\r\nhttps://github.com/user-attachments/assets/626b3c7e-cd6a-48f0-9962-eaa6b1f0805a\r\n\r\nOn supported OSes (currently Windows and Linux), there\'s a new "Boot From Optical Disc" menu entry on File, and "Change Disc" now opens a popup that lets you change between a disc image or a physical disc or vice-versa:\r\n\r\nhttps://github.com/user-attachments/assets/0af57155-391c-41c8-b78c-bc70a63a7703\r\n\r\nThis implementation is heavily inspired on [redumper](https://github.com/superg/redumper), so Dolphin directly talks to the optical drive via low level SCSI multimedia commands instead of relying on the old approach that was derived from a very outdated version of libcdio.\r\n\r\n### Features and limitations\r\n* Although the UI changes are minimal (for now), I\'ve tried to make this work as intuitively as possible behind the scenes. I think the most noteworthy ones are that optical drives can be hot plugged at any time (if you\'re using USB to SATA adapters or portable drives) and if you boot from a physical disc and then eject it (either via File => Eject Disc or by pressing the Eject button on the drive itself), the disc will be ejected from the emulated console too. If you reinsert a disc later, it\'ll automatically reinsert the disc on the emulated console too (e.g. multi disc games that ask you to insert the next disc)\r\n* I didn\'t initially plan for this, but the `-i` flag from DolphinTool now accepts disc drive paths (e.g. `-i D:` or `-i /dev/sr0`). A side effect of that is you can now rip original discs to ISO, RVZ, GCZ or WIA directly from DolphinTool, if you have an OmniDrive-enabled drive\r\n* Emulated disc speed code is bypassed when using physical discs, as well as "Load Whole Game Into Memory". Beware of speeding up the emulation by setting the speed limit above 100% though, that can cause audio/video issues and even break games if you let them run too fast for too long, since the optical drive can\'t keep up ("An error occurred, please turn the GC/Wii off and refer to the operating manual")\r\n* Loading speeds are a bit slower than what I remember from playing on a real GC/Wii. The handful of games I tried still worked fine, though\r\n* When RetroAchievements are enabled, its hashing can cause a bit of slow loading speeds right after booting a game. It\'s more noticeable with Wii titles\r\n* Currently, [GameCube games that uses DTK Audio](https://wiki.dolphin-emu.org/index.php?title=Category:DTK_Audio_games) are nearly unplayable from physical discs, as the DTK audio path causes constant drive seeking, which consequently reduces the read speeds significantly. I intend to explore a few caching techniques to fix this, but it will be on a separate PR\r\n* Minimal testing was done on Linux, apart from compiling from source on Ubuntu 26.04.1 LTS and ensuring it could boot a game\r\n* Currently there\'s no macOS support, and I won\'t be adding it as I have no access to any Apple hardware. Porting should be easy, though, as all OS-specific code are isolated on `SCSIDevice.cpp/.h`\r\n\r\n### Generative AI disclosure\r\nThe source code from [redumper (b705)](https://github.com/superg/redumper/tree/b705) was fed into a LLM, which was tasked on creating a technical specs document about how it handles standard and raw OmniDrive reads. Then, I\'ve made a Windows-only CLI tool implementing only the absolute minimum required for the features that would be relevant for us, based on that document. DVD descrambling was added next and used this [reference implementation](https://github.com/Deterous/DVD-Scrambler) from Deterous. Once the CLI tool was feature complete, I used a LLM again, this time feeding it parts of the Linux (6.18 LTS) kernel source code, to assist with adding Linux compatibility to it.\r\n\r\nFinally, I started working with the Dolphin\'s source. The code this PR adds is directly derived from the CLI tool, but no LLMs were used beyond that point. I\'m also not touching any emulation code, the changes in DVDInterface reuses existing behavior or are based in code comments that already existed in Dolphin before this PR.\r\n\r\n### Licenses and attribuition\r\nThe bulk of this PR was heavily based on [redumper](https://github.com/superg/redumper), which is licensed under the GPLv3. As mentioned earlier, I also used the [descrambling implementation from Deterous](https://github.com/Deterous/DVD-Scrambler) as a reference, which the repo itself doesn\'t define a license, but directly mentions being made as the reference for redumper, so I think we\'re good? I can try contacting Deterous too for explicit approval, if needed...', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/reactions', 'total_count': 6, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 6, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6600903825', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6600903825', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'id': 6600903825, 'node_id': 'IC_kwDOALCn2M8AAAABiXHMkQ', 'user': {'login': 'MayImilae', 'id': 6551020, 'node_id': 'MDQ6VXNlcjY1NTEwMjA=', 'avatar_url': 'https://avatars.githubusercontent.com/u/6551020?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/MayImilae', 'html_url': 'https://github.com/MayImilae', 'followers_url': 'https://api.github.com/users/MayImilae/followers', 'following_url': 'https://api.github.com/users/MayImilae/following{/other_user}', 'gists_url': 'https://api.github.com/users/MayImilae/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/MayImilae/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/MayImilae/subscriptions', 'organizations_url': 'https://api.github.com/users/MayImilae/orgs', 'repos_url': 'https://api.github.com/users/MayImilae/repos', 'events_url': 'https://api.github.com/users/MayImilae/events{/privacy}', 'received_events_url': 'https://api.github.com/users/MayImilae/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T10:14:33Z', 'updated_at': '2026-11-03T10:14:33Z', 'body': '> I think it\'s unlikely to cause too many people to try to stick an original GC/Wii game in their standard optical drive, mainly because so few people even have an optical drive these days.\r\n\r\nYea I guess that\'s a good point. We can make adjustments if people start asking about it.\r\n\r\n> An early iteration used the full term inside the tag (like "[OmniDrive]") but the menu became too wide IMO, but this can be reverted or further tweaked, if you think it\'d be more intuitive.\r\n\r\nHonestly I kind of like it saying OmniDrive as a tag and I don\'t think the length is an issue. But I suppose users will have had to already flashed their firmware to OmniDrive and they\'ll have an idea what OD means when they see it.', 'author_association': 'MEMBER', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6600903825/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3377, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 478, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3377, 'open_issues': 478, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'MayImilae', 'id': 6551020, 'node_id': 'MDQ6VXNlcjY1NTEwMjA=', 'avatar_url': 'https://avatars.githubusercontent.com/u/6551020?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/MayImilae', 'html_url': 'https://github.com/MayImilae', 'followers_url': 'https://api.github.com/users/MayImilae/followers', 'following_url': 'https://api.github.com/users/MayImilae/following{/other_user}', 'gists_url': 'https://api.github.com/users/MayImilae/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/MayImilae/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/MayImilae/subscriptions', 'organizations_url': 'https://api.github.com/users/MayImilae/orgs', 'repos_url': 'https://api.github.com/users/MayImilae/repos', 'events_url': 'https://api.github.com/users/MayImilae/events{/privacy}', 'received_events_url': 'https://api.github.com/users/MayImilae/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'gh_issue_comment'}
2026-11-03T09:32:36.231524 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'created', 'id': 13653, 'title': 'UICommon/GameFile: File name column will show the directory name for extracted games', 'url': 'https://github.com/dolphin-emu/dolphin/pull/13653#issuecomment-6600080894', 'safe_author': True, 'body': 'This PR has aged a bit. Can you please rebase it on latest master. There have since been some minor changes to these files.', 'raw': {'action': 'created', 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13653', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13653/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13653/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13653/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/13653', 'id': 3055146256, 'node_id': 'PR_kwDOALCn2M6VvgId', 'number': 13653, 'title': 'UICommon/GameFile: File name column will show the directory name for extracted games', 'user': {'login': 'tygyh', 'id': 32486062, 'node_id': 'MDQ6VXNlcjMyNDg2MDYy', 'avatar_url': 'https://avatars.githubusercontent.com/u/32486062?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/tygyh', 'html_url': 'https://github.com/tygyh', 'followers_url': 'https://api.github.com/users/tygyh/followers', 'following_url': 'https://api.github.com/users/tygyh/following{/other_user}', 'gists_url': 'https://api.github.com/users/tygyh/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/tygyh/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/tygyh/subscriptions', 'organizations_url': 'https://api.github.com/users/tygyh/orgs', 'repos_url': 'https://api.github.com/users/tygyh/repos', 'events_url': 'https://api.github.com/users/tygyh/events{/privacy}', 'received_events_url': 'https://api.github.com/users/tygyh/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 7, 'created_at': '2025-05-11T18:37:32Z', 'updated_at': '2026-11-03T09:32:33Z', 'closed_at': None, 'assignee': None, 'author_association': 'CONTRIBUTOR', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/13653', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/13653', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/13653.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/13653.patch', 'merged_at': None}, 'body': 'Rebases #8798', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13653/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13653/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6600080894', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/13653#issuecomment-6600080894', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13653', 'id': 6600080894, 'node_id': 'IC_kwDOALCn2M8AAAABiWU9_g', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T09:32:33Z', 'updated_at': '2026-11-03T09:32:33Z', 'body': 'This PR has aged a bit. Can you please rebase it on latest master. There have since been some minor changes to these files.', 'author_association': 'MEMBER', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6600080894/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3376, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 478, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3376, 'open_issues': 478, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'gh_issue_comment'}
2026-11-03T09:05:23.489277 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'edited', 'id': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6599524923', 'safe_author': True, 'body': 'I mostly agree that the current wording is fine, and I think it\'s unlikely to cause too many people to try to stick an original GC/Wii game in their standard optical drive, mainly because so few people even have an optical drive these days.\r\n\r\ni.e. I think "Boot From Optical Disc" is fine.', 'raw': {'action': 'edited', 'changes': {'body': {'from': 'I mostly agree that the current wording is unlikely to cause too many people to try to stick an original GC/Wii game in their standard optical drive, mainly because so few people even have an optical drive these days.\r\n\r\ni.e. I think "Boot From Optical Disc" is fine.'}}, 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'id': 6162397505, 'node_id': 'PR_kwDOALCn2M8AAAABMS-vaA', 'number': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 14, 'created_at': '2026-11-02T12:18:18Z', 'updated_at': '2026-11-03T09:04:44Z', 'closed_at': None, 'assignee': None, 'author_association': 'MEMBER', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.patch', 'merged_at': None}, 'body': 'At long last, this PR restores the ability of running games from DVD backups (originally removed on PR #11456) and, for the first time in Dolphin, allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive):\r\n\r\nhttps://github.com/user-attachments/assets/626b3c7e-cd6a-48f0-9962-eaa6b1f0805a\r\n\r\nOn supported OSes (currently Windows and Linux), there\'s a new "Boot From Optical Disc" menu entry on File, and "Change Disc" now opens a popup that lets you change between a disc image or a physical disc or vice-versa:\r\n\r\nhttps://github.com/user-attachments/assets/0af57155-391c-41c8-b78c-bc70a63a7703\r\n\r\nThis implementation is heavily inspired on [redumper](https://github.com/superg/redumper), so Dolphin directly talks to the optical drive via low level SCSI multimedia commands instead of relying on the old approach that was derived from a very outdated version of libcdio.\r\n\r\n### Features and limitations\r\n* Although the UI changes are minimal (for now), I\'ve tried to make this work as intuitively as possible behind the scenes. I think the most noteworthy ones are that optical drives can be hot plugged at any time (if you\'re using USB to SATA adapters or portable drives) and if you boot from a physical disc and then eject it (either via File => Eject Disc or by pressing the Eject button on the drive itself), the disc will be ejected from the emulated console too. If you reinsert a disc later, it\'ll automatically reinsert the disc on the emulated console too (e.g. multi disc games that ask you to insert the next disc)\r\n* I didn\'t initially plan for this, but the `-i` flag from DolphinTool now accepts disc drive paths (e.g. `-i D:` or `-i /dev/sr0`). A side effect of that is you can now rip original discs to ISO, RVZ, GCZ or WIA directly from DolphinTool, if you have an OmniDrive-enabled drive\r\n* Emulated disc speed code is bypassed when using physical discs, as well as "Load Whole Game Into Memory". Beware of speeding up the emulation by setting the speed limit above 100% though, that can cause audio/video issues and even break games if you let them run too fast for too long, since the optical drive can\'t keep up ("An error occurred, please turn the GC/Wii off and refer to the operating manual")\r\n* Loading speeds are a bit slower than what I remember from playing on a real GC/Wii. The handful of games I tried still worked fine, though\r\n* When RetroAchievements are enabled, its hashing can cause a bit of slow loading speeds right after booting a game. It\'s more noticeable with Wii titles\r\n* Currently, [GameCube games that uses DTK Audio](https://wiki.dolphin-emu.org/index.php?title=Category:DTK_Audio_games) are nearly unplayable from physical discs, as the DTK audio path causes constant drive seeking, which consequently reduces the read speeds significantly. I intend to explore a few caching techniques to fix this, but it will be on a separate PR\r\n* Minimal testing was done on Linux, apart from compiling from source on Ubuntu 26.04.1 LTS and ensuring it could boot a game\r\n* Currently there\'s no macOS support, and I won\'t be adding it as I have no access to any Apple hardware. Porting should be easy, though, as all OS-specific code are isolated on `SCSIDevice.cpp/.h`\r\n\r\n### Generative AI disclosure\r\nThe source code from [redumper (b705)](https://github.com/superg/redumper/tree/b705) was fed into a LLM, which was tasked on creating a technical specs document about how it handles standard and raw OmniDrive reads. Then, I\'ve made a Windows-only CLI tool implementing only the absolute minimum required for the features that would be relevant for us, based on that document. DVD descrambling was added next and used this [reference implementation](https://github.com/Deterous/DVD-Scrambler) from Deterous. Once the CLI tool was feature complete, I used a LLM again, this time feeding it parts of the Linux (6.18 LTS) kernel source code, to assist with adding Linux compatibility to it.\r\n\r\nFinally, I started working with the Dolphin\'s source. The code this PR adds is directly derived from the CLI tool, but no LLMs were used beyond that point. I\'m also not touching any emulation code, the changes in DVDInterface reuses existing behavior or are based in code comments that already existed in Dolphin before this PR.\r\n\r\n### Licenses and attribuition\r\nThe bulk of this PR was heavily based on [redumper](https://github.com/superg/redumper), which is licensed under the GPLv3. As mentioned earlier, I also used the [descrambling implementation from Deterous](https://github.com/Deterous/DVD-Scrambler) as a reference, which the repo itself doesn\'t define a license, but directly mentions being made as the reference for redumper, so I think we\'re good? I can try contacting Deterous too for explicit approval, if needed...', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/reactions', 'total_count': 6, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 6, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6599524923', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6599524923', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'id': 6599524923, 'node_id': 'IC_kwDOALCn2M8AAAABiVzCOw', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T09:03:07Z', 'updated_at': '2026-11-03T09:05:21Z', 'body': 'I mostly agree that the current wording is fine, and I think it\'s unlikely to cause too many people to try to stick an original GC/Wii game in their standard optical drive, mainly because so few people even have an optical drive these days.\r\n\r\ni.e. I think "Boot From Optical Disc" is fine.', 'author_association': 'MEMBER', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6599524923/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3376, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 478, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3376, 'open_issues': 478, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'gh_issue_comment'}
2026-11-03T09:04:46.353701 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'edited', 'id': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6599524923', 'safe_author': True, 'body': 'I mostly agree that the current wording is unlikely to cause too many people to try to stick an original GC/Wii game in their standard optical drive, mainly because so few people even have an optical drive these days.\r\n\r\ni.e. I think "Boot From Optical Disc" is fine.', 'raw': {'action': 'edited', 'changes': {'body': {'from': 'I mostly agree that the current wording is unlikely to cause too many people to try to stick an original GC/Wii game in their standard optical drive, mainly because so few people even have an optical drive these days.'}}, 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'id': 6162397505, 'node_id': 'PR_kwDOALCn2M8AAAABMS-vaA', 'number': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 14, 'created_at': '2026-11-02T12:18:18Z', 'updated_at': '2026-11-03T09:03:07Z', 'closed_at': None, 'assignee': None, 'author_association': 'MEMBER', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.patch', 'merged_at': None}, 'body': 'At long last, this PR restores the ability of running games from DVD backups (originally removed on PR #11456) and, for the first time in Dolphin, allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive):\r\n\r\nhttps://github.com/user-attachments/assets/626b3c7e-cd6a-48f0-9962-eaa6b1f0805a\r\n\r\nOn supported OSes (currently Windows and Linux), there\'s a new "Boot From Optical Disc" menu entry on File, and "Change Disc" now opens a popup that lets you change between a disc image or a physical disc or vice-versa:\r\n\r\nhttps://github.com/user-attachments/assets/0af57155-391c-41c8-b78c-bc70a63a7703\r\n\r\nThis implementation is heavily inspired on [redumper](https://github.com/superg/redumper), so Dolphin directly talks to the optical drive via low level SCSI multimedia commands instead of relying on the old approach that was derived from a very outdated version of libcdio.\r\n\r\n### Features and limitations\r\n* Although the UI changes are minimal (for now), I\'ve tried to make this work as intuitively as possible behind the scenes. I think the most noteworthy ones are that optical drives can be hot plugged at any time (if you\'re using USB to SATA adapters or portable drives) and if you boot from a physical disc and then eject it (either via File => Eject Disc or by pressing the Eject button on the drive itself), the disc will be ejected from the emulated console too. If you reinsert a disc later, it\'ll automatically reinsert the disc on the emulated console too (e.g. multi disc games that ask you to insert the next disc)\r\n* I didn\'t initially plan for this, but the `-i` flag from DolphinTool now accepts disc drive paths (e.g. `-i D:` or `-i /dev/sr0`). A side effect of that is you can now rip original discs to ISO, RVZ, GCZ or WIA directly from DolphinTool, if you have an OmniDrive-enabled drive\r\n* Emulated disc speed code is bypassed when using physical discs, as well as "Load Whole Game Into Memory". Beware of speeding up the emulation by setting the speed limit above 100% though, that can cause audio/video issues and even break games if you let them run too fast for too long, since the optical drive can\'t keep up ("An error occurred, please turn the GC/Wii off and refer to the operating manual")\r\n* Loading speeds are a bit slower than what I remember from playing on a real GC/Wii. The handful of games I tried still worked fine, though\r\n* When RetroAchievements are enabled, its hashing can cause a bit of slow loading speeds right after booting a game. It\'s more noticeable with Wii titles\r\n* Currently, [GameCube games that uses DTK Audio](https://wiki.dolphin-emu.org/index.php?title=Category:DTK_Audio_games) are nearly unplayable from physical discs, as the DTK audio path causes constant drive seeking, which consequently reduces the read speeds significantly. I intend to explore a few caching techniques to fix this, but it will be on a separate PR\r\n* Minimal testing was done on Linux, apart from compiling from source on Ubuntu 26.04.1 LTS and ensuring it could boot a game\r\n* Currently there\'s no macOS support, and I won\'t be adding it as I have no access to any Apple hardware. Porting should be easy, though, as all OS-specific code are isolated on `SCSIDevice.cpp/.h`\r\n\r\n### Generative AI disclosure\r\nThe source code from [redumper (b705)](https://github.com/superg/redumper/tree/b705) was fed into a LLM, which was tasked on creating a technical specs document about how it handles standard and raw OmniDrive reads. Then, I\'ve made a Windows-only CLI tool implementing only the absolute minimum required for the features that would be relevant for us, based on that document. DVD descrambling was added next and used this [reference implementation](https://github.com/Deterous/DVD-Scrambler) from Deterous. Once the CLI tool was feature complete, I used a LLM again, this time feeding it parts of the Linux (6.18 LTS) kernel source code, to assist with adding Linux compatibility to it.\r\n\r\nFinally, I started working with the Dolphin\'s source. The code this PR adds is directly derived from the CLI tool, but no LLMs were used beyond that point. I\'m also not touching any emulation code, the changes in DVDInterface reuses existing behavior or are based in code comments that already existed in Dolphin before this PR.\r\n\r\n### Licenses and attribuition\r\nThe bulk of this PR was heavily based on [redumper](https://github.com/superg/redumper), which is licensed under the GPLv3. As mentioned earlier, I also used the [descrambling implementation from Deterous](https://github.com/Deterous/DVD-Scrambler) as a reference, which the repo itself doesn\'t define a license, but directly mentions being made as the reference for redumper, so I think we\'re good? I can try contacting Deterous too for explicit approval, if needed...', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/reactions', 'total_count': 6, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 6, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6599524923', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6599524923', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'id': 6599524923, 'node_id': 'IC_kwDOALCn2M8AAAABiVzCOw', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T09:03:07Z', 'updated_at': '2026-11-03T09:04:44Z', 'body': 'I mostly agree that the current wording is unlikely to cause too many people to try to stick an original GC/Wii game in their standard optical drive, mainly because so few people even have an optical drive these days.\r\n\r\ni.e. I think "Boot From Optical Disc" is fine.', 'author_association': 'MEMBER', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6599524923/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3376, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 478, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3376, 'open_issues': 478, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'gh_issue_comment'}
2026-11-03T09:03:10.227310 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'created', 'id': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6599524923', 'safe_author': True, 'body': 'I mostly agree that the current wording is unlikely to cause too many people to try to stick an original GC/Wii game in their standard optical drive, mainly because so few people even have an optical drive these days.', 'raw': {'action': 'created', 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'id': 6162397505, 'node_id': 'PR_kwDOALCn2M8AAAABMS-vaA', 'number': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 14, 'created_at': '2026-11-02T12:18:18Z', 'updated_at': '2026-11-03T09:03:07Z', 'closed_at': None, 'assignee': None, 'author_association': 'MEMBER', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.patch', 'merged_at': None}, 'body': 'At long last, this PR restores the ability of running games from DVD backups (originally removed on PR #11456) and, for the first time in Dolphin, allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive):\r\n\r\nhttps://github.com/user-attachments/assets/626b3c7e-cd6a-48f0-9962-eaa6b1f0805a\r\n\r\nOn supported OSes (currently Windows and Linux), there\'s a new "Boot From Optical Disc" menu entry on File, and "Change Disc" now opens a popup that lets you change between a disc image or a physical disc or vice-versa:\r\n\r\nhttps://github.com/user-attachments/assets/0af57155-391c-41c8-b78c-bc70a63a7703\r\n\r\nThis implementation is heavily inspired on [redumper](https://github.com/superg/redumper), so Dolphin directly talks to the optical drive via low level SCSI multimedia commands instead of relying on the old approach that was derived from a very outdated version of libcdio.\r\n\r\n### Features and limitations\r\n* Although the UI changes are minimal (for now), I\'ve tried to make this work as intuitively as possible behind the scenes. I think the most noteworthy ones are that optical drives can be hot plugged at any time (if you\'re using USB to SATA adapters or portable drives) and if you boot from a physical disc and then eject it (either via File => Eject Disc or by pressing the Eject button on the drive itself), the disc will be ejected from the emulated console too. If you reinsert a disc later, it\'ll automatically reinsert the disc on the emulated console too (e.g. multi disc games that ask you to insert the next disc)\r\n* I didn\'t initially plan for this, but the `-i` flag from DolphinTool now accepts disc drive paths (e.g. `-i D:` or `-i /dev/sr0`). A side effect of that is you can now rip original discs to ISO, RVZ, GCZ or WIA directly from DolphinTool, if you have an OmniDrive-enabled drive\r\n* Emulated disc speed code is bypassed when using physical discs, as well as "Load Whole Game Into Memory". Beware of speeding up the emulation by setting the speed limit above 100% though, that can cause audio/video issues and even break games if you let them run too fast for too long, since the optical drive can\'t keep up ("An error occurred, please turn the GC/Wii off and refer to the operating manual")\r\n* Loading speeds are a bit slower than what I remember from playing on a real GC/Wii. The handful of games I tried still worked fine, though\r\n* When RetroAchievements are enabled, its hashing can cause a bit of slow loading speeds right after booting a game. It\'s more noticeable with Wii titles\r\n* Currently, [GameCube games that uses DTK Audio](https://wiki.dolphin-emu.org/index.php?title=Category:DTK_Audio_games) are nearly unplayable from physical discs, as the DTK audio path causes constant drive seeking, which consequently reduces the read speeds significantly. I intend to explore a few caching techniques to fix this, but it will be on a separate PR\r\n* Minimal testing was done on Linux, apart from compiling from source on Ubuntu 26.04.1 LTS and ensuring it could boot a game\r\n* Currently there\'s no macOS support, and I won\'t be adding it as I have no access to any Apple hardware. Porting should be easy, though, as all OS-specific code are isolated on `SCSIDevice.cpp/.h`\r\n\r\n### Generative AI disclosure\r\nThe source code from [redumper (b705)](https://github.com/superg/redumper/tree/b705) was fed into a LLM, which was tasked on creating a technical specs document about how it handles standard and raw OmniDrive reads. Then, I\'ve made a Windows-only CLI tool implementing only the absolute minimum required for the features that would be relevant for us, based on that document. DVD descrambling was added next and used this [reference implementation](https://github.com/Deterous/DVD-Scrambler) from Deterous. Once the CLI tool was feature complete, I used a LLM again, this time feeding it parts of the Linux (6.18 LTS) kernel source code, to assist with adding Linux compatibility to it.\r\n\r\nFinally, I started working with the Dolphin\'s source. The code this PR adds is directly derived from the CLI tool, but no LLMs were used beyond that point. I\'m also not touching any emulation code, the changes in DVDInterface reuses existing behavior or are based in code comments that already existed in Dolphin before this PR.\r\n\r\n### Licenses and attribuition\r\nThe bulk of this PR was heavily based on [redumper](https://github.com/superg/redumper), which is licensed under the GPLv3. As mentioned earlier, I also used the [descrambling implementation from Deterous](https://github.com/Deterous/DVD-Scrambler) as a reference, which the repo itself doesn\'t define a license, but directly mentions being made as the reference for redumper, so I think we\'re good? I can try contacting Deterous too for explicit approval, if needed...', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/reactions', 'total_count': 6, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 6, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6599524923', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6599524923', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'id': 6599524923, 'node_id': 'IC_kwDOALCn2M8AAAABiVzCOw', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T09:03:07Z', 'updated_at': '2026-11-03T09:03:07Z', 'body': 'I mostly agree that the current wording is unlikely to cause too many people to try to stick an original GC/Wii game in their standard optical drive, mainly because so few people even have an optical drive these days.', 'author_association': 'MEMBER', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6599524923/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3376, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 478, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3376, 'open_issues': 478, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'gh_issue_comment'}
2026-11-03T08:57:52.276671 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'mbc07', 'action': 'created', 'id': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6599431123', 'safe_author': True, 'body': '> I am opposed to altering the Change Disc feature, as that feature will see orders of magnitude more users than optical disc users, and adding an additional step is a usability drop that outweighs this feature.\r\n\r\nFair point. I needed to wire that popup somewhere as it has proven to be extremely useful during testing; as long as it\'s still accessible from the GUI, moving the entry point to another place is not a big deal. The fact we have two "Change Disc" options (on file menu and on the context menu from the game list) behaving differently (as of this PR) also bothers me a bit.\r\n<br/>\r\n\r\n> Also, "Boot from Optical Disc" implies you can just stick a retail disc into your standard optical drive and it\'ll work. This still doesn\'t do that, so don\'t call it that. This will confuse users. My next suggestion would be to call it "Boot from Omnidrive" as that resolves this confusion very easily and nicely. Unfortunately we have an additional factor, so the best solution would be to rename it to "Boot from Omnidrive or DVD Backup". That\'s inelegant, but that is simple and resolves the confusion.\r\n\r\nSorry, but nope. I intentionally picked "Boot From Optical Disc" because the feature can now accept both, and I\'m not willing to replace that with neither "Boot From OmniDrive" since it\'s factually wrong as it accepts any drive, nor with a long mess like "Boot from OmniDrive or DVD Backup" unless you provide me a really good reason other than "it will confuse users".\r\n\r\nI already dedicated a considerate amount of time and effort to make the feature intuitive to the user, such as making sure the error messages that could come from a failed physical disc boot attempt are clear and direct on informing why it failed (that includes a "OmniDrive required" message), as well as clearly communicating why the submenu might be empty (disabled "no optical drives found" entry when none are attached) and what drives are actually running OmniDrive firmware with a "[OD]" tag at the end of the entry.\r\n\r\nAn early iteration used the full term inside the tag (like "[OmniDrive]") but the menu became too wide IMO, but this can be reverted or further tweaked, if you think it\'d be more intuitive.', 'raw': {'action': 'created', 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'id': 6162397505, 'node_id': 'PR_kwDOALCn2M8AAAABMS-vaA', 'number': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 13, 'created_at': '2026-11-02T12:18:18Z', 'updated_at': '2026-11-03T08:57:49Z', 'closed_at': None, 'assignee': None, 'author_association': 'MEMBER', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.patch', 'merged_at': None}, 'body': 'At long last, this PR restores the ability of running games from DVD backups (originally removed on PR #11456) and, for the first time in Dolphin, allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive):\r\n\r\nhttps://github.com/user-attachments/assets/626b3c7e-cd6a-48f0-9962-eaa6b1f0805a\r\n\r\nOn supported OSes (currently Windows and Linux), there\'s a new "Boot From Optical Disc" menu entry on File, and "Change Disc" now opens a popup that lets you change between a disc image or a physical disc or vice-versa:\r\n\r\nhttps://github.com/user-attachments/assets/0af57155-391c-41c8-b78c-bc70a63a7703\r\n\r\nThis implementation is heavily inspired on [redumper](https://github.com/superg/redumper), so Dolphin directly talks to the optical drive via low level SCSI multimedia commands instead of relying on the old approach that was derived from a very outdated version of libcdio.\r\n\r\n### Features and limitations\r\n* Although the UI changes are minimal (for now), I\'ve tried to make this work as intuitively as possible behind the scenes. I think the most noteworthy ones are that optical drives can be hot plugged at any time (if you\'re using USB to SATA adapters or portable drives) and if you boot from a physical disc and then eject it (either via File => Eject Disc or by pressing the Eject button on the drive itself), the disc will be ejected from the emulated console too. If you reinsert a disc later, it\'ll automatically reinsert the disc on the emulated console too (e.g. multi disc games that ask you to insert the next disc)\r\n* I didn\'t initially plan for this, but the `-i` flag from DolphinTool now accepts disc drive paths (e.g. `-i D:` or `-i /dev/sr0`). A side effect of that is you can now rip original discs to ISO, RVZ, GCZ or WIA directly from DolphinTool, if you have an OmniDrive-enabled drive\r\n* Emulated disc speed code is bypassed when using physical discs, as well as "Load Whole Game Into Memory". Beware of speeding up the emulation by setting the speed limit above 100% though, that can cause audio/video issues and even break games if you let them run too fast for too long, since the optical drive can\'t keep up ("An error occurred, please turn the GC/Wii off and refer to the operating manual")\r\n* Loading speeds are a bit slower than what I remember from playing on a real GC/Wii. The handful of games I tried still worked fine, though\r\n* When RetroAchievements are enabled, its hashing can cause a bit of slow loading speeds right after booting a game. It\'s more noticeable with Wii titles\r\n* Currently, [GameCube games that uses DTK Audio](https://wiki.dolphin-emu.org/index.php?title=Category:DTK_Audio_games) are nearly unplayable from physical discs, as the DTK audio path causes constant drive seeking, which consequently reduces the read speeds significantly. I intend to explore a few caching techniques to fix this, but it will be on a separate PR\r\n* Minimal testing was done on Linux, apart from compiling from source on Ubuntu 26.04.1 LTS and ensuring it could boot a game\r\n* Currently there\'s no macOS support, and I won\'t be adding it as I have no access to any Apple hardware. Porting should be easy, though, as all OS-specific code are isolated on `SCSIDevice.cpp/.h`\r\n\r\n### Generative AI disclosure\r\nThe source code from [redumper (b705)](https://github.com/superg/redumper/tree/b705) was fed into a LLM, which was tasked on creating a technical specs document about how it handles standard and raw OmniDrive reads. Then, I\'ve made a Windows-only CLI tool implementing only the absolute minimum required for the features that would be relevant for us, based on that document. DVD descrambling was added next and used this [reference implementation](https://github.com/Deterous/DVD-Scrambler) from Deterous. Once the CLI tool was feature complete, I used a LLM again, this time feeding it parts of the Linux (6.18 LTS) kernel source code, to assist with adding Linux compatibility to it.\r\n\r\nFinally, I started working with the Dolphin\'s source. The code this PR adds is directly derived from the CLI tool, but no LLMs were used beyond that point. I\'m also not touching any emulation code, the changes in DVDInterface reuses existing behavior or are based in code comments that already existed in Dolphin before this PR.\r\n\r\n### Licenses and attribuition\r\nThe bulk of this PR was heavily based on [redumper](https://github.com/superg/redumper), which is licensed under the GPLv3. As mentioned earlier, I also used the [descrambling implementation from Deterous](https://github.com/Deterous/DVD-Scrambler) as a reference, which the repo itself doesn\'t define a license, but directly mentions being made as the reference for redumper, so I think we\'re good? I can try contacting Deterous too for explicit approval, if needed...', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/reactions', 'total_count': 6, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 6, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6599431123', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6599431123', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'id': 6599431123, 'node_id': 'IC_kwDOALCn2M8AAAABiVtT0w', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T08:57:49Z', 'updated_at': '2026-11-03T08:57:49Z', 'body': '> I am opposed to altering the Change Disc feature, as that feature will see orders of magnitude more users than optical disc users, and adding an additional step is a usability drop that outweighs this feature.\r\n\r\nFair point. I needed to wire that popup somewhere as it has proven to be extremely useful during testing; as long as it\'s still accessible from the GUI, moving the entry point to another place is not a big deal. The fact we have two "Change Disc" options (on file menu and on the context menu from the game list) behaving differently (as of this PR) also bothers me a bit.\r\n<br/>\r\n\r\n> Also, "Boot from Optical Disc" implies you can just stick a retail disc into your standard optical drive and it\'ll work. This still doesn\'t do that, so don\'t call it that. This will confuse users. My next suggestion would be to call it "Boot from Omnidrive" as that resolves this confusion very easily and nicely. Unfortunately we have an additional factor, so the best solution would be to rename it to "Boot from Omnidrive or DVD Backup". That\'s inelegant, but that is simple and resolves the confusion.\r\n\r\nSorry, but nope. I intentionally picked "Boot From Optical Disc" because the feature can now accept both, and I\'m not willing to replace that with neither "Boot From OmniDrive" since it\'s factually wrong as it accepts any drive, nor with a long mess like "Boot from OmniDrive or DVD Backup" unless you provide me a really good reason other than "it will confuse users".\r\n\r\nI already dedicated a considerate amount of time and effort to make the feature intuitive to the user, such as making sure the error messages that could come from a failed physical disc boot attempt are clear and direct on informing why it failed (that includes a "OmniDrive required" message), as well as clearly communicating why the submenu might be empty (disabled "no optical drives found" entry when none are attached) and what drives are actually running OmniDrive firmware with a "[OD]" tag at the end of the entry.\r\n\r\nAn early iteration used the full term inside the tag (like "[OmniDrive]") but the menu became too wide IMO, but this can be reverted or further tweaked, if you think it\'d be more intuitive.', 'author_association': 'MEMBER', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6599431123/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3376, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 478, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3376, 'open_issues': 478, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'gh_issue_comment'}
2026-11-03T08:10:55.602607 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'sepalani', 'action': 'created', 'id': 14774, 'title': 'Refactor the GameCube microphone code', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14774#issuecomment-6598613359', 'safe_author': True, 'body': "Rebased and fixed the Android warning since `MicrophoneGameCube`'s `const GameCubeMicState& m_sampler` wasn't used anymore, so I removed it.", 'raw': {'action': 'created', 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14774', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14774/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14774/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14774/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14774', 'id': 5003138525, 'node_id': 'PR_kwDOALCn2M73rHGd', 'number': 14774, 'title': 'Refactor the GameCube microphone code', 'user': {'login': 'sepalani', 'id': 7890055, 'node_id': 'MDQ6VXNlcjc4OTAwNTU=', 'avatar_url': 'https://avatars.githubusercontent.com/u/7890055?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/sepalani', 'html_url': 'https://github.com/sepalani', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 2, 'created_at': '2026-07-28T21:29:25Z', 'updated_at': '2026-11-03T08:10:54Z', 'closed_at': None, 'assignee': None, 'author_association': 'CONTRIBUTOR', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14774', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14774', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14774.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14774.patch', 'merged_at': None}, 'body': 'This PR replaces https://github.com/dolphin-emu/dolphin/pull/14203 and is based on https://github.com/dolphin-emu/dolphin/pull/14772. It deduplicates the Wii and GameCube microphones code. ~~I\'ll put it as a draft for now, as I\'d like to implement some more features~~:\r\n - [x] Move the code to AudioCommon\r\n - [x] Refactor the GC microphone code\r\n - [x] Check the GC microphone code for regressions/improvements\r\n * _I haven\'t seen nor heard regression so far_\r\n - [x] Allow to configure the GC microphone device (like WiiSpeak/Logitech USB)\r\n - [x] Ensure 2 GC microphones can work simultaneously\r\n\r\nI\'m able to test the following GC games:\r\n - [x] Karaoke Revolution Party\r\n - You can hear your voice back\r\n - It supports 2 microphones when playing duet songs\r\n - [x] Mario Party 6\r\n - [x] Mario Party 7\r\n\r\nKaraoke Revolution Party with two different microphones connected:\r\n<img width="583" height="480" alt="image" src="https://github.com/user-attachments/assets/62816d0b-b128-4d1e-be64-66390efd845e" />\r\n\r\nI also have several Wii games compatible with the Wii Speak and USB microphones.\r\n\r\nReady to be reviewed & tested.', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14774/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14774/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6598613359', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14774#issuecomment-6598613359', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14774', 'id': 6598613359, 'node_id': 'IC_kwDOALCn2M8AAAABiU7Zbw', 'user': {'login': 'sepalani', 'id': 7890055, 'node_id': 'MDQ6VXNlcjc4OTAwNTU=', 'avatar_url': 'https://avatars.githubusercontent.com/u/7890055?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/sepalani', 'html_url': 'https://github.com/sepalani', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T08:10:53Z', 'updated_at': '2026-11-03T08:10:53Z', 'body': "Rebased and fixed the Android warning since `MicrophoneGameCube`'s `const GameCubeMicState& m_sampler` wasn't used anymore, so I removed it.", 'author_association': 'MEMBER', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6598613359/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T05:54:53Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15759, 'watchers_count': 15759, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3376, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 478, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3376, 'open_issues': 478, 'watchers': 15759, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'sepalani', 'id': 7890055, 'node_id': 'MDQ6VXNlcjc4OTAwNTU=', 'avatar_url': 'https://avatars.githubusercontent.com/u/7890055?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/sepalani', 'html_url': 'https://github.com/sepalani', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'gh_issue_comment'}
2026-11-03T06:53:48.971667 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'Yola-cola', 'action': 'created', 'id': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6597403443', 'safe_author': False, 'body': '> > allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive)\r\n> \r\n> This is great! Especially dumping with cleanrip using Dolphin, that\'s super cool and extremely interesting. Realistically very few people will use it, but it\'s awesome!\r\n> \r\n> > this PR restores the ability of running games from DVD backups\r\n> \r\n> Aaand you ruined the moment.\r\n> \r\n> For now I\'ll only be doing a review of the user experience impact of this feature, and this post will not evaluate it\'s code or testing for stutters or anything like that.\r\n> \r\n> I\'ll start with context. In 2026, the amount of people who could use any optical disc features in Dolphin is astronomically low. It will be more than the number of people who were affected by the [Android version bump a few months ago](https://dolphin-emu.org/blog/2026/06/25/dolphin-progress-report-release-2606/#android-minimum-version-bumped-to-android-7), _but not many more._ We\'re talking a few dozen users, and that\'s optimistic.\r\n> \r\n> For Omnidrive, users need an optical drive connected to their computer (optimistically a couple of percent), one of the specific drives that can be flashed with omnidrive (a few percent of those), the knowledge and skill required to flash firmwares (a few percent again), and the strong desire to boot their original optical discs directly in Dolphin (a few percent again). A percent of a percent of a percent means it\'ll be a fraction of a percent of our userbase. Omnidrive is _extremely cool_, but I\'m just being realistic.\r\n> \r\n> For Boot from DVD Backup, users need an optical drive connected to their computer (optimistically a couple of percent), own DVD writable media (a few percent of people with optical drives, [while supplies last](https://www.techspot.com/news/106477-sony-cease-blu-ray-production-leaving-physical-media.html)), and the desire to use said optical media when they could just _fire up the ISO that\'s already sitting on their computer_ that they used to write to the DVD. _sigh_ And unfortunately [optical media production is being wound down right now](https://www.techspot.com/news/106477-sony-cease-blu-ray-production-leaving-physical-media.html), why would anyone waste a precious limited resource on something so-\r\n> \r\n> The point being, in 2026, _extremely_ few people are going to take advantage of optical disc features in Dolphin, and time will only reduce that number as writable optical media rides into the sunset. We\'re talking a few dozen users here. _And that\'s fine._ As long as a niche feature doesn\'t get in the way of more normal use cases, isn\'t intrusive to the user experience, and it isn\'t awful, there\'s room for interesting little side features like this. There is value simply from having them.\r\n> \r\n> But, I\'ll say this very concretely, optical drive features should not negatively impact our image user experience AT ALL. _Any_ impact to our image users and their user experience is _too much_.\r\n> \r\n> With that in mind...\r\n> \r\n> I am opposed to altering the Change Disc feature, as that feature will see orders of magnitude more users than optical disc users, and adding an additional step is a usability drop that outweighs this feature. This is solvable though. IMO, a better solution would be to leave the Change Disc feature unmodified, rename it to "Change Disc Image", turn the boot disc menu bar item into an "Optical Disc" submenu, and add a new "change optical disc" option there. It\'s a little redundant, but it negates the impact on our ISO users, and it gives you a submenu that you could add more things to in the future, like potentially future built-in dumping features, or instructions for omnidrive. Those would be cool.\r\n> \r\n> Also, "Boot from Optical Disc" implies you can just stick a retail disc into your standard optical drive and it\'ll work. _This still doesn\'t do that_, so don\'t call it that. This will confuse users. My next suggestion would be to call it "Boot from Omnidrive" as that resolves this confusion very easily and nicely. Unfortunately we have an additional factor, so the best solution would be to rename it to "Boot from Omnidrive or DVD Backup". That\'s inelegant, but that is simple and resolves the confusion.\r\n\r\nDude it\'s not a big deal', 'raw': {'action': 'created', 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'id': 6162397505, 'node_id': 'PR_kwDOALCn2M8AAAABMS-vaA', 'number': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 12, 'created_at': '2026-11-02T12:18:18Z', 'updated_at': '2026-11-03T06:53:46Z', 'closed_at': None, 'assignee': None, 'author_association': 'MEMBER', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.patch', 'merged_at': None}, 'body': 'At long last, this PR restores the ability of running games from DVD backups (originally removed on PR #11456) and, for the first time in Dolphin, allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive):\r\n\r\nhttps://github.com/user-attachments/assets/626b3c7e-cd6a-48f0-9962-eaa6b1f0805a\r\n\r\nOn supported OSes (currently Windows and Linux), there\'s a new "Boot From Optical Disc" menu entry on File, and "Change Disc" now opens a popup that lets you change between a disc image or a physical disc or vice-versa:\r\n\r\nhttps://github.com/user-attachments/assets/0af57155-391c-41c8-b78c-bc70a63a7703\r\n\r\nThis implementation is heavily inspired on [redumper](https://github.com/superg/redumper), so Dolphin directly talks to the optical drive via low level SCSI multimedia commands instead of relying on the old approach that was derived from a very outdated version of libcdio.\r\n\r\n### Features and limitations\r\n* Although the UI changes are minimal (for now), I\'ve tried to make this work as intuitively as possible behind the scenes. I think the most noteworthy ones are that optical drives can be hot plugged at any time (if you\'re using USB to SATA adapters or portable drives) and if you boot from a physical disc and then eject it (either via File => Eject Disc or by pressing the Eject button on the drive itself), the disc will be ejected from the emulated console too. If you reinsert a disc later, it\'ll automatically reinsert the disc on the emulated console too (e.g. multi disc games that ask you to insert the next disc)\r\n* I didn\'t initially plan for this, but the `-i` flag from DolphinTool now accepts disc drive paths (e.g. `-i D:` or `-i /dev/sr0`). A side effect of that is you can now rip original discs to ISO, RVZ, GCZ or WIA directly from DolphinTool, if you have an OmniDrive-enabled drive\r\n* Emulated disc speed code is bypassed when using physical discs, as well as "Load Whole Game Into Memory". Beware of speeding up the emulation by setting the speed limit above 100% though, that can cause audio/video issues and even break games if you let them run too fast for too long, since the optical drive can\'t keep up ("An error occurred, please turn the GC/Wii off and refer to the operating manual")\r\n* Loading speeds are a bit slower than what I remember from playing on a real GC/Wii. The handful of games I tried still worked fine, though\r\n* When RetroAchievements are enabled, its hashing can cause a bit of slow loading speeds right after booting a game. It\'s more noticeable with Wii titles\r\n* Currently, [GameCube games that uses DTK Audio](https://wiki.dolphin-emu.org/index.php?title=Category:DTK_Audio_games) are nearly unplayable from physical discs, as the DTK audio path causes constant drive seeking, which consequently reduces the read speeds significantly. I intend to explore a few caching techniques to fix this, but it will be on a separate PR\r\n* Minimal testing was done on Linux, apart from compiling from source on Ubuntu 26.04.1 LTS and ensuring it could boot a game\r\n* Currently there\'s no macOS support, and I won\'t be adding it as I have no access to any Apple hardware. Porting should be easy, though, as all OS-specific code are isolated on `SCSIDevice.cpp/.h`\r\n\r\n### Generative AI disclosure\r\nThe source code from [redumper (b705)](https://github.com/superg/redumper/tree/b705) was fed into a LLM, which was tasked on creating a technical specs document about how it handles standard and raw OmniDrive reads. Then, I\'ve made a Windows-only CLI tool implementing only the absolute minimum required for the features that would be relevant for us, based on that document. DVD descrambling was added next and used this [reference implementation](https://github.com/Deterous/DVD-Scrambler) from Deterous. Once the CLI tool was feature complete, I used a LLM again, this time feeding it parts of the Linux (6.18 LTS) kernel source code, to assist with adding Linux compatibility to it.\r\n\r\nFinally, I started working with the Dolphin\'s source. The code this PR adds is directly derived from the CLI tool, but no LLMs were used beyond that point. I\'m also not touching any emulation code, the changes in DVDInterface reuses existing behavior or are based in code comments that already existed in Dolphin before this PR.\r\n\r\n### Licenses and attribuition\r\nThe bulk of this PR was heavily based on [redumper](https://github.com/superg/redumper), which is licensed under the GPLv3. As mentioned earlier, I also used the [descrambling implementation from Deterous](https://github.com/Deterous/DVD-Scrambler) as a reference, which the repo itself doesn\'t define a license, but directly mentions being made as the reference for redumper, so I think we\'re good? I can try contacting Deterous too for explicit approval, if needed...', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/reactions', 'total_count': 6, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 6, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6597403443', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6597403443', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'id': 6597403443, 'node_id': 'IC_kwDOALCn2M8AAAABiTxjMw', 'user': {'login': 'Yola-cola', 'id': 53379032, 'node_id': 'MDQ6VXNlcjUzMzc5MDMy', 'avatar_url': 'https://avatars.githubusercontent.com/u/53379032?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/Yola-cola', 'html_url': 'https://github.com/Yola-cola', 'followers_url': 'https://api.github.com/users/Yola-cola/followers', 'following_url': 'https://api.github.com/users/Yola-cola/following{/other_user}', 'gists_url': 'https://api.github.com/users/Yola-cola/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/Yola-cola/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/Yola-cola/subscriptions', 'organizations_url': 'https://api.github.com/users/Yola-cola/orgs', 'repos_url': 'https://api.github.com/users/Yola-cola/repos', 'events_url': 'https://api.github.com/users/Yola-cola/events{/privacy}', 'received_events_url': 'https://api.github.com/users/Yola-cola/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T06:53:46Z', 'updated_at': '2026-11-03T06:53:46Z', 'body': '> > allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive)\r\n> \r\n> This is great! Especially dumping with cleanrip using Dolphin, that\'s super cool and extremely interesting. Realistically very few people will use it, but it\'s awesome!\r\n> \r\n> > this PR restores the ability of running games from DVD backups\r\n> \r\n> Aaand you ruined the moment.\r\n> \r\n> For now I\'ll only be doing a review of the user experience impact of this feature, and this post will not evaluate it\'s code or testing for stutters or anything like that.\r\n> \r\n> I\'ll start with context. In 2026, the amount of people who could use any optical disc features in Dolphin is astronomically low. It will be more than the number of people who were affected by the [Android version bump a few months ago](https://dolphin-emu.org/blog/2026/06/25/dolphin-progress-report-release-2606/#android-minimum-version-bumped-to-android-7), _but not many more._ We\'re talking a few dozen users, and that\'s optimistic.\r\n> \r\n> For Omnidrive, users need an optical drive connected to their computer (optimistically a couple of percent), one of the specific drives that can be flashed with omnidrive (a few percent of those), the knowledge and skill required to flash firmwares (a few percent again), and the strong desire to boot their original optical discs directly in Dolphin (a few percent again). A percent of a percent of a percent means it\'ll be a fraction of a percent of our userbase. Omnidrive is _extremely cool_, but I\'m just being realistic.\r\n> \r\n> For Boot from DVD Backup, users need an optical drive connected to their computer (optimistically a couple of percent), own DVD writable media (a few percent of people with optical drives, [while supplies last](https://www.techspot.com/news/106477-sony-cease-blu-ray-production-leaving-physical-media.html)), and the desire to use said optical media when they could just _fire up the ISO that\'s already sitting on their computer_ that they used to write to the DVD. _sigh_ And unfortunately [optical media production is being wound down right now](https://www.techspot.com/news/106477-sony-cease-blu-ray-production-leaving-physical-media.html), why would anyone waste a precious limited resource on something so-\r\n> \r\n> The point being, in 2026, _extremely_ few people are going to take advantage of optical disc features in Dolphin, and time will only reduce that number as writable optical media rides into the sunset. We\'re talking a few dozen users here. _And that\'s fine._ As long as a niche feature doesn\'t get in the way of more normal use cases, isn\'t intrusive to the user experience, and it isn\'t awful, there\'s room for interesting little side features like this. There is value simply from having them.\r\n> \r\n> But, I\'ll say this very concretely, optical drive features should not negatively impact our image user experience AT ALL. _Any_ impact to our image users and their user experience is _too much_.\r\n> \r\n> With that in mind...\r\n> \r\n> I am opposed to altering the Change Disc feature, as that feature will see orders of magnitude more users than optical disc users, and adding an additional step is a usability drop that outweighs this feature. This is solvable though. IMO, a better solution would be to leave the Change Disc feature unmodified, rename it to "Change Disc Image", turn the boot disc menu bar item into an "Optical Disc" submenu, and add a new "change optical disc" option there. It\'s a little redundant, but it negates the impact on our ISO users, and it gives you a submenu that you could add more things to in the future, like potentially future built-in dumping features, or instructions for omnidrive. Those would be cool.\r\n> \r\n> Also, "Boot from Optical Disc" implies you can just stick a retail disc into your standard optical drive and it\'ll work. _This still doesn\'t do that_, so don\'t call it that. This will confuse users. My next suggestion would be to call it "Boot from Omnidrive" as that resolves this confusion very easily and nicely. Unfortunately we have an additional factor, so the best solution would be to rename it to "Boot from Omnidrive or DVD Backup". That\'s inelegant, but that is simple and resolves the confusion.\r\n\r\nDude it\'s not a big deal', 'author_association': 'NONE', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6597403443/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T05:54:53Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15759, 'watchers_count': 15759, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3376, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 478, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3376, 'open_issues': 478, 'watchers': 15759, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'Yola-cola', 'id': 53379032, 'node_id': 'MDQ6VXNlcjUzMzc5MDMy', 'avatar_url': 'https://avatars.githubusercontent.com/u/53379032?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/Yola-cola', 'html_url': 'https://github.com/Yola-cola', 'followers_url': 'https://api.github.com/users/Yola-cola/followers', 'following_url': 'https://api.github.com/users/Yola-cola/following{/other_user}', 'gists_url': 'https://api.github.com/users/Yola-cola/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/Yola-cola/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/Yola-cola/subscriptions', 'organizations_url': 'https://api.github.com/users/Yola-cola/orgs', 'repos_url': 'https://api.github.com/users/Yola-cola/repos', 'events_url': 'https://api.github.com/users/Yola-cola/events{/privacy}', 'received_events_url': 'https://api.github.com/users/Yola-cola/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'gh_issue_comment'}
2026-11-03T06:47:38.036605 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'MayImilae', 'action': 'created', 'id': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6597315632', 'safe_author': True, 'body': '> allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive)\r\n\r\nThis is great! Especially dumping with cleanrip using Dolphin, that\'s super cool and extremely interesting. Realistically very few people will use it, but it\'s awesome!\r\n\r\n> this PR restores the ability of running games from DVD backups\r\n\r\nAaand you ruined the moment.\r\n\r\n----\r\n\r\nFor now I\'ll only be doing a review of the user experience impact of this feature, and this post will not evaluate it\'s code or testing for stutters or anything like that.\r\n\r\nI\'ll start with context. In 2026, the amount of people who could use any optical disc features in Dolphin is astronomically low. It will be more than the number of people who were affected by the [Android version bump a few months ago](https://dolphin-emu.org/blog/2026/06/25/dolphin-progress-report-release-2606/#android-minimum-version-bumped-to-android-7), _but not many more._ We\'re talking a few dozen users, and that\'s optimistic.\r\n\r\nFor Omnidrive, users need an optical drive connected to their computer (optimistically a couple of percent), one of the specific drives that can be flashed with omnidrive (a few percent of those), the knowledge and skill required to flash firmwares (a few percent again), and the strong desire to boot their original optical discs directly in Dolphin (a few percent again). A percent of a percent of a percent means it\'ll be a fraction of a percent of our userbase. Omnidrive is _extremely cool_, but I\'m just being realistic.\r\n\r\nFor Boot from DVD Backup, users need an optical drive connected to their computer (optimistically a couple of percent), own DVD writable media (a few percent of people with optical drives, [while supplies last](https://www.techspot.com/news/106477-sony-cease-blu-ray-production-leaving-physical-media.html)), and the desire to use said optical media when they could just _fire up the ISO that\'s already sitting on their computer_ that they used to write to the DVD. _sigh_ And unfortunately [optical media production is being wound down right now](https://www.techspot.com/news/106477-sony-cease-blu-ray-production-leaving-physical-media.html), why would anyone waste a precious limited resource on something so-\r\n\r\nThe point being, in 2026, _extremely_ few people are going to take advantage of optical disc features in Dolphin, and time will only reduce that number as writable optical media rides into the sunset. We\'re talking a few dozen users here. _And that\'s fine._ As long as a niche feature doesn\'t get in the way of more normal use cases, isn\'t intrusive to the user experience, and it isn\'t awful, there\'s room for interesting little side features like this. There is value simply from having them.\r\n\r\nBut, I\'ll say this very concretely, optical drive features should not negatively impact our image user experience AT ALL. _Any_ impact to our image users and their user experience is _too much_.\r\n\r\nWith that in mind...\r\n\r\nI am opposed to altering the Change Disc feature, as that feature will see orders of magnitude more users than optical disc users, and adding an additional step is a usability drop that outweighs this feature. This is solvable though. IMO, a better solution would be to leave the Change Disc feature unmodified, rename it to "Change Disc Image", turn the boot disc menu bar item into an "Optical Disc" submenu, and add a new "change optical disc" option there. It\'s a little redundant, but it negates the impact on our ISO users, and it gives you a submenu that you could add more things to in the future, like potentially future built-in dumping features, or instructions for omnidrive. Those would be cool.\r\n\r\nAlso, "Boot from Optical Disc" implies you can just stick a retail disc into your standard optical drive and it\'ll work. _This still doesn\'t do that_, so don\'t call it that. This will confuse users. My next suggestion would be to call it "Boot from Omnidrive" as that resolves this confusion very easily and nicely. Unfortunately we have an additional factor, so the best solution would be to rename it to "Boot from Omnidrive or DVD Backup". That\'s inelegant, but that is simple and resolves the confusion.', 'raw': {'action': 'created', 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'id': 6162397505, 'node_id': 'PR_kwDOALCn2M8AAAABMS-vaA', 'number': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 11, 'created_at': '2026-11-02T12:18:18Z', 'updated_at': '2026-11-03T06:47:35Z', 'closed_at': None, 'assignee': None, 'author_association': 'MEMBER', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.patch', 'merged_at': None}, 'body': 'At long last, this PR restores the ability of running games from DVD backups (originally removed on PR #11456) and, for the first time in Dolphin, allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive):\r\n\r\nhttps://github.com/user-attachments/assets/626b3c7e-cd6a-48f0-9962-eaa6b1f0805a\r\n\r\nOn supported OSes (currently Windows and Linux), there\'s a new "Boot From Optical Disc" menu entry on File, and "Change Disc" now opens a popup that lets you change between a disc image or a physical disc or vice-versa:\r\n\r\nhttps://github.com/user-attachments/assets/0af57155-391c-41c8-b78c-bc70a63a7703\r\n\r\nThis implementation is heavily inspired on [redumper](https://github.com/superg/redumper), so Dolphin directly talks to the optical drive via low level SCSI multimedia commands instead of relying on the old approach that was derived from a very outdated version of libcdio.\r\n\r\n### Features and limitations\r\n* Although the UI changes are minimal (for now), I\'ve tried to make this work as intuitively as possible behind the scenes. I think the most noteworthy ones are that optical drives can be hot plugged at any time (if you\'re using USB to SATA adapters or portable drives) and if you boot from a physical disc and then eject it (either via File => Eject Disc or by pressing the Eject button on the drive itself), the disc will be ejected from the emulated console too. If you reinsert a disc later, it\'ll automatically reinsert the disc on the emulated console too (e.g. multi disc games that ask you to insert the next disc)\r\n* I didn\'t initially plan for this, but the `-i` flag from DolphinTool now accepts disc drive paths (e.g. `-i D:` or `-i /dev/sr0`). A side effect of that is you can now rip original discs to ISO, RVZ, GCZ or WIA directly from DolphinTool, if you have an OmniDrive-enabled drive\r\n* Emulated disc speed code is bypassed when using physical discs, as well as "Load Whole Game Into Memory". Beware of speeding up the emulation by setting the speed limit above 100% though, that can cause audio/video issues and even break games if you let them run too fast for too long, since the optical drive can\'t keep up ("An error occurred, please turn the GC/Wii off and refer to the operating manual")\r\n* Loading speeds are a bit slower than what I remember from playing on a real GC/Wii. The handful of games I tried still worked fine, though\r\n* When RetroAchievements are enabled, its hashing can cause a bit of slow loading speeds right after booting a game. It\'s more noticeable with Wii titles\r\n* Currently, [GameCube games that uses DTK Audio](https://wiki.dolphin-emu.org/index.php?title=Category:DTK_Audio_games) are nearly unplayable from physical discs, as the DTK audio path causes constant drive seeking, which consequently reduces the read speeds significantly. I intend to explore a few caching techniques to fix this, but it will be on a separate PR\r\n* Minimal testing was done on Linux, apart from compiling from source on Ubuntu 26.04.1 LTS and ensuring it could boot a game\r\n* Currently there\'s no macOS support, and I won\'t be adding it as I have no access to any Apple hardware. Porting should be easy, though, as all OS-specific code are isolated on `SCSIDevice.cpp/.h`\r\n\r\n### Generative AI disclosure\r\nThe source code from [redumper (b705)](https://github.com/superg/redumper/tree/b705) was fed into a LLM, which was tasked on creating a technical specs document about how it handles standard and raw OmniDrive reads. Then, I\'ve made a Windows-only CLI tool implementing only the absolute minimum required for the features that would be relevant for us, based on that document. DVD descrambling was added next and used this [reference implementation](https://github.com/Deterous/DVD-Scrambler) from Deterous. Once the CLI tool was feature complete, I used a LLM again, this time feeding it parts of the Linux (6.18 LTS) kernel source code, to assist with adding Linux compatibility to it.\r\n\r\nFinally, I started working with the Dolphin\'s source. The code this PR adds is directly derived from the CLI tool, but no LLMs were used beyond that point. I\'m also not touching any emulation code, the changes in DVDInterface reuses existing behavior or are based in code comments that already existed in Dolphin before this PR.\r\n\r\n### Licenses and attribuition\r\nThe bulk of this PR was heavily based on [redumper](https://github.com/superg/redumper), which is licensed under the GPLv3. As mentioned earlier, I also used the [descrambling implementation from Deterous](https://github.com/Deterous/DVD-Scrambler) as a reference, which the repo itself doesn\'t define a license, but directly mentions being made as the reference for redumper, so I think we\'re good? I can try contacting Deterous too for explicit approval, if needed...', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/reactions', 'total_count': 6, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 6, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6597315632', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6597315632', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'id': 6597315632, 'node_id': 'IC_kwDOALCn2M8AAAABiTsMMA', 'user': {'login': 'MayImilae', 'id': 6551020, 'node_id': 'MDQ6VXNlcjY1NTEwMjA=', 'avatar_url': 'https://avatars.githubusercontent.com/u/6551020?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/MayImilae', 'html_url': 'https://github.com/MayImilae', 'followers_url': 'https://api.github.com/users/MayImilae/followers', 'following_url': 'https://api.github.com/users/MayImilae/following{/other_user}', 'gists_url': 'https://api.github.com/users/MayImilae/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/MayImilae/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/MayImilae/subscriptions', 'organizations_url': 'https://api.github.com/users/MayImilae/orgs', 'repos_url': 'https://api.github.com/users/MayImilae/repos', 'events_url': 'https://api.github.com/users/MayImilae/events{/privacy}', 'received_events_url': 'https://api.github.com/users/MayImilae/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T06:47:35Z', 'updated_at': '2026-11-03T06:47:35Z', 'body': '> allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive)\r\n\r\nThis is great! Especially dumping with cleanrip using Dolphin, that\'s super cool and extremely interesting. Realistically very few people will use it, but it\'s awesome!\r\n\r\n> this PR restores the ability of running games from DVD backups\r\n\r\nAaand you ruined the moment.\r\n\r\n----\r\n\r\nFor now I\'ll only be doing a review of the user experience impact of this feature, and this post will not evaluate it\'s code or testing for stutters or anything like that.\r\n\r\nI\'ll start with context. In 2026, the amount of people who could use any optical disc features in Dolphin is astronomically low. It will be more than the number of people who were affected by the [Android version bump a few months ago](https://dolphin-emu.org/blog/2026/06/25/dolphin-progress-report-release-2606/#android-minimum-version-bumped-to-android-7), _but not many more._ We\'re talking a few dozen users, and that\'s optimistic.\r\n\r\nFor Omnidrive, users need an optical drive connected to their computer (optimistically a couple of percent), one of the specific drives that can be flashed with omnidrive (a few percent of those), the knowledge and skill required to flash firmwares (a few percent again), and the strong desire to boot their original optical discs directly in Dolphin (a few percent again). A percent of a percent of a percent means it\'ll be a fraction of a percent of our userbase. Omnidrive is _extremely cool_, but I\'m just being realistic.\r\n\r\nFor Boot from DVD Backup, users need an optical drive connected to their computer (optimistically a couple of percent), own DVD writable media (a few percent of people with optical drives, [while supplies last](https://www.techspot.com/news/106477-sony-cease-blu-ray-production-leaving-physical-media.html)), and the desire to use said optical media when they could just _fire up the ISO that\'s already sitting on their computer_ that they used to write to the DVD. _sigh_ And unfortunately [optical media production is being wound down right now](https://www.techspot.com/news/106477-sony-cease-blu-ray-production-leaving-physical-media.html), why would anyone waste a precious limited resource on something so-\r\n\r\nThe point being, in 2026, _extremely_ few people are going to take advantage of optical disc features in Dolphin, and time will only reduce that number as writable optical media rides into the sunset. We\'re talking a few dozen users here. _And that\'s fine._ As long as a niche feature doesn\'t get in the way of more normal use cases, isn\'t intrusive to the user experience, and it isn\'t awful, there\'s room for interesting little side features like this. There is value simply from having them.\r\n\r\nBut, I\'ll say this very concretely, optical drive features should not negatively impact our image user experience AT ALL. _Any_ impact to our image users and their user experience is _too much_.\r\n\r\nWith that in mind...\r\n\r\nI am opposed to altering the Change Disc feature, as that feature will see orders of magnitude more users than optical disc users, and adding an additional step is a usability drop that outweighs this feature. This is solvable though. IMO, a better solution would be to leave the Change Disc feature unmodified, rename it to "Change Disc Image", turn the boot disc menu bar item into an "Optical Disc" submenu, and add a new "change optical disc" option there. It\'s a little redundant, but it negates the impact on our ISO users, and it gives you a submenu that you could add more things to in the future, like potentially future built-in dumping features, or instructions for omnidrive. Those would be cool.\r\n\r\nAlso, "Boot from Optical Disc" implies you can just stick a retail disc into your standard optical drive and it\'ll work. _This still doesn\'t do that_, so don\'t call it that. This will confuse users. My next suggestion would be to call it "Boot from Omnidrive" as that resolves this confusion very easily and nicely. Unfortunately we have an additional factor, so the best solution would be to rename it to "Boot from Omnidrive or DVD Backup". That\'s inelegant, but that is simple and resolves the confusion.', 'author_association': 'MEMBER', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6597315632/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T05:54:53Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15759, 'watchers_count': 15759, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3376, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 478, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3376, 'open_issues': 478, 'watchers': 15759, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'MayImilae', 'id': 6551020, 'node_id': 'MDQ6VXNlcjY1NTEwMjA=', 'avatar_url': 'https://avatars.githubusercontent.com/u/6551020?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/MayImilae', 'html_url': 'https://github.com/MayImilae', 'followers_url': 'https://api.github.com/users/MayImilae/followers', 'following_url': 'https://api.github.com/users/MayImilae/following{/other_user}', 'gists_url': 'https://api.github.com/users/MayImilae/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/MayImilae/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/MayImilae/subscriptions', 'organizations_url': 'https://api.github.com/users/MayImilae/orgs', 'repos_url': 'https://api.github.com/users/MayImilae/repos', 'events_url': 'https://api.github.com/users/MayImilae/events{/privacy}', 'received_events_url': 'https://api.github.com/users/MayImilae/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'gh_issue_comment'}
2026-11-03T02:38:53.511138 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'edited', 'id': 11466, 'title': 'cubeb: re-enable and polish IAudioClient3 to achieve lower latencies', 'url': 'https://github.com/dolphin-emu/dolphin/pull/11466#issuecomment-6594026556', 'safe_author': True, 'body': "I don't think it's a good idea to move to a Cubeb fork that has an unmaintained backend re-enabled.\r\nIf anything we could have our own `IAudioClient3` audio backend, but I'd really rather just stick with Cubeb.", 'raw': {'action': 'edited', 'changes': {'body': {'from': "I don't think it's a good idea to move to a Cubeb fork that has an unmaintained backend re-enabled.\r\nIf anything we could have our own `IAudioClient` audio backend, but I'd really rather just stick with Cubeb."}}, 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/11466', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/11466/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/11466/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/11466/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/11466', 'id': 1551277313, 'node_id': 'PR_kwDOALCn2M5IPF4W', 'number': 11466, 'title': 'cubeb: re-enable and polish IAudioClient3 to achieve lower latencies', 'user': {'login': 'Filoppi', 'id': 7011366, 'node_id': 'MDQ6VXNlcjcwMTEzNjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/7011366?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/Filoppi', 'html_url': 'https://github.com/Filoppi', 'followers_url': 'https://api.github.com/users/Filoppi/followers', 'following_url': 'https://api.github.com/users/Filoppi/following{/other_user}', 'gists_url': 'https://api.github.com/users/Filoppi/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/Filoppi/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/Filoppi/subscriptions', 'organizations_url': 'https://api.github.com/users/Filoppi/orgs', 'repos_url': 'https://api.github.com/users/Filoppi/repos', 'events_url': 'https://api.github.com/users/Filoppi/events{/privacy}', 'received_events_url': 'https://api.github.com/users/Filoppi/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 5, 'created_at': '2023-01-20T18:25:19Z', 'updated_at': '2026-11-03T02:38:36Z', 'closed_at': None, 'assignee': None, 'author_association': 'CONTRIBUTOR', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/11466', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/11466', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/11466.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/11466.patch', 'merged_at': None}, 'body': "**This PR re-activates ```IAudioClient3``` on cubeb**. This allows PCs with Windows 10+ to achieve lower latencies:\r\n[Microsoft doc](https://learn.microsoft.com/en-us/windows-hardware/drivers/audio/low-latency-audio)\r\ntheoretically the **latency should be pretty similar to the WASAPI exclusive** mode (depending on the device driver), but without its limitations.\r\nIf not supported, it will fall back to the classic/old ```IAudioClient``` audio mode.\r\n\r\nMost of the code was already there, though **Mozilla disabled it because it gave problems with input streams** ([bug report](https://bugzilla.mozilla.org/show_bug.cgi?id=1590652)). For that reason, we are only using it with output streams, and additionally, I have polished the code a lot and added handling of many edge/error cases that were not acknowledged before.\r\n**Chromium has safely used ```IAudioClient3``` for years**, so I have analyzed its implementation, and multiple other open source applications, to find out what might have been **improved in the cubeb implementation**.\r\n\r\nOne major problem was that the latency set by the user was in samples (48Khz on Dolphin), not in ms, but cubeb failed to convert it for device actual output sample rate, so the latency could have been set to extremely low or high values, which could have made it starve for samples. ~~Also, cubeb failed to check if the mixer format it generated was fully supported by ```IAudioClient3```, and thus sometimes it wouldn't initialized correctly (I've been testing this with @eliasreid, who can confirm as his audio device only supports 24bit formats, and cubeb forced 16bit on it).~~ (This was only partially true)\r\n\r\nThe code is kind of done, but there are quite a few things that **could benefit from testing**. I had already tried this for months without any problems (https://github.com/dolphin-emu/dolphin/pull/8920), though every audio device is different.\r\nIf testing goes well, we might either merge directly on dolphin, or wait for Mozilla to merge.\r\nIn any case, this change is not compatibility breaking and wouldn't prevent us from updating to new cubeb versions in the future.", 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/11466/reactions', 'total_count': 1, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 1}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/11466/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6594026556', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/11466#issuecomment-6594026556', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/11466', 'id': 6594026556, 'node_id': 'IC_kwDOALCn2M8AAAABiQjcPA', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T02:38:36Z', 'updated_at': '2026-11-03T02:38:52Z', 'body': "I don't think it's a good idea to move to a Cubeb fork that has an unmaintained backend re-enabled.\r\nIf anything we could have our own `IAudioClient3` audio backend, but I'd really rather just stick with Cubeb.", 'author_association': 'MEMBER', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6594026556/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T02:10:03Z', 'pushed_at': '2026-11-02T20:16:21Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563749, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3375, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 478, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3375, 'open_issues': 478, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'gh_issue_comment'}
2026-11-03T02:38:38.172766 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'created', 'id': 11466, 'title': 'cubeb: re-enable and polish IAudioClient3 to achieve lower latencies', 'url': 'https://github.com/dolphin-emu/dolphin/pull/11466#issuecomment-6594026556', 'safe_author': True, 'body': "I don't think it's a good idea to move to a Cubeb fork that has an unmaintained backend re-enabled.\r\nIf anything we could have our own `IAudioClient` audio backend, but I'd really rather just stick with Cubeb.", 'raw': {'action': 'created', 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/11466', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/11466/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/11466/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/11466/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/11466', 'id': 1551277313, 'node_id': 'PR_kwDOALCn2M5IPF4W', 'number': 11466, 'title': 'cubeb: re-enable and polish IAudioClient3 to achieve lower latencies', 'user': {'login': 'Filoppi', 'id': 7011366, 'node_id': 'MDQ6VXNlcjcwMTEzNjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/7011366?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/Filoppi', 'html_url': 'https://github.com/Filoppi', 'followers_url': 'https://api.github.com/users/Filoppi/followers', 'following_url': 'https://api.github.com/users/Filoppi/following{/other_user}', 'gists_url': 'https://api.github.com/users/Filoppi/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/Filoppi/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/Filoppi/subscriptions', 'organizations_url': 'https://api.github.com/users/Filoppi/orgs', 'repos_url': 'https://api.github.com/users/Filoppi/repos', 'events_url': 'https://api.github.com/users/Filoppi/events{/privacy}', 'received_events_url': 'https://api.github.com/users/Filoppi/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 5, 'created_at': '2023-01-20T18:25:19Z', 'updated_at': '2026-11-03T02:38:36Z', 'closed_at': None, 'assignee': None, 'author_association': 'CONTRIBUTOR', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/11466', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/11466', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/11466.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/11466.patch', 'merged_at': None}, 'body': "**This PR re-activates ```IAudioClient3``` on cubeb**. This allows PCs with Windows 10+ to achieve lower latencies:\r\n[Microsoft doc](https://learn.microsoft.com/en-us/windows-hardware/drivers/audio/low-latency-audio)\r\ntheoretically the **latency should be pretty similar to the WASAPI exclusive** mode (depending on the device driver), but without its limitations.\r\nIf not supported, it will fall back to the classic/old ```IAudioClient``` audio mode.\r\n\r\nMost of the code was already there, though **Mozilla disabled it because it gave problems with input streams** ([bug report](https://bugzilla.mozilla.org/show_bug.cgi?id=1590652)). For that reason, we are only using it with output streams, and additionally, I have polished the code a lot and added handling of many edge/error cases that were not acknowledged before.\r\n**Chromium has safely used ```IAudioClient3``` for years**, so I have analyzed its implementation, and multiple other open source applications, to find out what might have been **improved in the cubeb implementation**.\r\n\r\nOne major problem was that the latency set by the user was in samples (48Khz on Dolphin), not in ms, but cubeb failed to convert it for device actual output sample rate, so the latency could have been set to extremely low or high values, which could have made it starve for samples. ~~Also, cubeb failed to check if the mixer format it generated was fully supported by ```IAudioClient3```, and thus sometimes it wouldn't initialized correctly (I've been testing this with @eliasreid, who can confirm as his audio device only supports 24bit formats, and cubeb forced 16bit on it).~~ (This was only partially true)\r\n\r\nThe code is kind of done, but there are quite a few things that **could benefit from testing**. I had already tried this for months without any problems (https://github.com/dolphin-emu/dolphin/pull/8920), though every audio device is different.\r\nIf testing goes well, we might either merge directly on dolphin, or wait for Mozilla to merge.\r\nIn any case, this change is not compatibility breaking and wouldn't prevent us from updating to new cubeb versions in the future.", 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/11466/reactions', 'total_count': 1, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 1}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/11466/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6594026556', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/11466#issuecomment-6594026556', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/11466', 'id': 6594026556, 'node_id': 'IC_kwDOALCn2M8AAAABiQjcPA', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T02:38:36Z', 'updated_at': '2026-11-03T02:38:36Z', 'body': "I don't think it's a good idea to move to a Cubeb fork that has an unmaintained backend re-enabled.\r\nIf anything we could have our own `IAudioClient` audio backend, but I'd really rather just stick with Cubeb.", 'author_association': 'MEMBER', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6594026556/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T02:10:03Z', 'pushed_at': '2026-11-02T20:16:21Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563749, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3375, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 478, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3375, 'open_issues': 478, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'gh_issue_comment'}
2026-11-03T02:20:35.810127 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'created', 'id': 12563, 'title': 'Renaming SIDevice into SerialDevice to make device numbers match other controller parameters', 'url': 'https://github.com/dolphin-emu/dolphin/pull/12563#issuecomment-6593759318', 'safe_author': True, 'body': "I think our current 0/1-indexing inconsistency is unfortunate, but I don't think it's worth changing at this point.\r\n\r\nPersonally, I'd like to transition away from ini-files in general, and switch to maybe JSON, and maybe that would be a good time to standardize how things are named/numbered?", 'raw': {'action': 'created', 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/12563', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/12563/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/12563/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/12563/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/12563', 'id': 2117413468, 'node_id': 'PR_kwDOALCn2M5l9mLa', 'number': 12563, 'title': 'Renaming SIDevice into SerialDevice to make device numbers match other controller parameters', 'user': {'login': 'GregoireLD', 'id': 48733955, 'node_id': 'MDQ6VXNlcjQ4NzMzOTU1', 'avatar_url': 'https://avatars.githubusercontent.com/u/48733955?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/GregoireLD', 'html_url': 'https://github.com/GregoireLD', 'followers_url': 'https://api.github.com/users/GregoireLD/followers', 'following_url': 'https://api.github.com/users/GregoireLD/following{/other_user}', 'gists_url': 'https://api.github.com/users/GregoireLD/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/GregoireLD/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/GregoireLD/subscriptions', 'organizations_url': 'https://api.github.com/users/GregoireLD/orgs', 'repos_url': 'https://api.github.com/users/GregoireLD/repos', 'events_url': 'https://api.github.com/users/GregoireLD/events{/privacy}', 'received_events_url': 'https://api.github.com/users/GregoireLD/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 5, 'created_at': '2024-02-05T00:26:30Z', 'updated_at': '2026-11-03T02:20:33Z', 'closed_at': None, 'assignee': None, 'author_association': 'CONTRIBUTOR', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/12563', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/12563', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/12563.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/12563.patch', 'merged_at': None}, 'body': 'This PR aims to unify the numberings of configuration parameters regarding controllers.\r\n\r\nPrior to this PR, PadType (legacy) and SIDevice (current) parameters are numbered starting at 0, while other controller parameters (like PadProfile) starts at 1.\r\n\r\nI propose the use of a replacement parameter "SerialDevice" numbered from 1 to 4.\r\n\r\nThis PR does the following :\r\n- When loading an already existing config it primarily loads it\'s settings from SerialDevice parameters\r\n\xa0\xa0\xa0- if absent, it falls back to loading from legacy SIDevice parameters\r\n\xa0\xa0\xa0- if missing too, it sets the device to the default value (Behavior identical to master)\r\n- When creating/saving, it only cares about SerialDevice parameters, making sure the only parameters that gets created, modified, and saved are done so using the new naming convention\r\n\xa0\xa0\xa0- this ensure the bulk of people will slowly migrate to the new naming convention (at some point, when the fall back mechanism is considered superfluous, this PR also include the (commented but tested) simpler code without the fall back mechanism, more akin to the current one)\r\n- When loading from game-specifics INIs, it will load PadType, SIDevice, and SerialDevice parameters alike, allowing for full backward compatibility\r\n\xa0\xa0\xa0- In this case, the SIDevice is handled by the same mechanism as PadType, designed to handle legacy parameters (I did so to match how similar situations were handled before)\r\n\r\nI think this PR fixes the numbering problem I was targeting, while making sure it\'s fully compatible with all pre-existing configurations.\r\n\r\nI hope I did so following coding conventions, but as I\'m a completely new contributor, I am aware I might\'ve made mistakes. I will gladly accept any remarks or correction, the sole existence of this PR is open for comments or discutions.\r\n', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/12563/reactions', 'total_count': 2, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 1, 'eyes': 1}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/12563/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6593759318', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/12563#issuecomment-6593759318', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/12563', 'id': 6593759318, 'node_id': 'IC_kwDOALCn2M8AAAABiQTIVg', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T02:20:33Z', 'updated_at': '2026-11-03T02:20:33Z', 'body': "I think our current 0/1-indexing inconsistency is unfortunate, but I don't think it's worth changing at this point.\r\n\r\nPersonally, I'd like to transition away from ini-files in general, and switch to maybe JSON, and maybe that would be a good time to standardize how things are named/numbered?", 'author_association': 'MEMBER', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6593759318/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T02:10:03Z', 'pushed_at': '2026-11-02T20:16:21Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563749, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3375, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 478, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3375, 'open_issues': 478, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'gh_issue_comment'}
2026-11-03T02:09:09.484583 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'created', 'id': 13018, 'title': 'Convert variables to structured bindings', 'url': 'https://github.com/dolphin-emu/dolphin/pull/13018#issuecomment-6593596002', 'safe_author': True, 'body': "This PR has aged, needs a rebase, and a few of us disagree with what's being done so I'm going to close this PR for now.\r\nFeel free to re-open this if the scope is changed.", 'raw': {'action': 'created', 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13018', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13018/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13018/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13018/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/13018', 'id': 2471360453, 'node_id': 'PR_kwDOALCn2M54ogm2', 'number': 13018, 'title': 'Convert variables to structured bindings', 'user': {'login': 'tygyh', 'id': 32486062, 'node_id': 'MDQ6VXNlcjMyNDg2MDYy', 'avatar_url': 'https://avatars.githubusercontent.com/u/32486062?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/tygyh', 'html_url': 'https://github.com/tygyh', 'followers_url': 'https://api.github.com/users/tygyh/followers', 'following_url': 'https://api.github.com/users/tygyh/following{/other_user}', 'gists_url': 'https://api.github.com/users/tygyh/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/tygyh/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/tygyh/subscriptions', 'organizations_url': 'https://api.github.com/users/tygyh/orgs', 'repos_url': 'https://api.github.com/users/tygyh/repos', 'events_url': 'https://api.github.com/users/tygyh/events{/privacy}', 'received_events_url': 'https://api.github.com/users/tygyh/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'closed', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 7, 'created_at': '2024-08-17T05:51:09Z', 'updated_at': '2026-11-03T02:09:07Z', 'closed_at': '2026-11-03T02:09:06Z', 'assignee': None, 'author_association': 'CONTRIBUTOR', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/13018', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/13018', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/13018.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/13018.patch', 'merged_at': None}, 'body': None, 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13018/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13018/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6593596002', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/13018#issuecomment-6593596002', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13018', 'id': 6593596002, 'node_id': 'IC_kwDOALCn2M8AAAABiQJKYg', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T02:09:06Z', 'updated_at': '2026-11-03T02:09:06Z', 'body': "This PR has aged, needs a rebase, and a few of us disagree with what's being done so I'm going to close this PR for now.\r\nFeel free to re-open this if the scope is changed.", 'author_association': 'MEMBER', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6593596002/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-02T23:54:02Z', 'pushed_at': '2026-11-02T20:16:21Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563749, 'stargazers_count': 15759, 'watchers_count': 15759, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3375, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 478, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3375, 'open_issues': 478, 'watchers': 15759, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'gh_issue_comment'}
2026-11-03T01:54:58.422769 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'created', 'id': 13132, 'title': 'Expand GameConfig Editor Preset Options', 'url': 'https://github.com/dolphin-emu/dolphin/pull/13132#issuecomment-6593396776', 'safe_author': True, 'body': 'This PR has aged and the "Presets" menu has been removed in #14559 so I\'m going to close this PR for now.\r\nThank you.', 'raw': {'action': 'created', 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13132', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13132/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13132/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13132/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/13132', 'id': 2584829590, 'node_id': 'PR_kwDOALCn2M5-e6wD', 'number': 13132, 'title': 'Expand GameConfig Editor Preset Options', 'user': {'login': 'ChibiChoko', 'id': 18494128, 'node_id': 'MDQ6VXNlcjE4NDk0MTI4', 'avatar_url': 'https://avatars.githubusercontent.com/u/18494128?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/ChibiChoko', 'html_url': 'https://github.com/ChibiChoko', 'followers_url': 'https://api.github.com/users/ChibiChoko/followers', 'following_url': 'https://api.github.com/users/ChibiChoko/following{/other_user}', 'gists_url': 'https://api.github.com/users/ChibiChoko/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/ChibiChoko/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/ChibiChoko/subscriptions', 'organizations_url': 'https://api.github.com/users/ChibiChoko/orgs', 'repos_url': 'https://api.github.com/users/ChibiChoko/repos', 'events_url': 'https://api.github.com/users/ChibiChoko/events{/privacy}', 'received_events_url': 'https://api.github.com/users/ChibiChoko/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'closed', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 1, 'created_at': '2024-10-14T05:54:04Z', 'updated_at': '2026-11-03T01:54:54Z', 'closed_at': '2026-11-03T01:54:53Z', 'assignee': None, 'author_association': 'NONE', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/13132', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/13132', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/13132.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/13132.patch', 'merged_at': None}, 'body': 'Recreated from PR #13131 (I messed up), using the latest commit before I broke everything.\r\n\r\nThis removes duplicate options provided on the GameConfig window as well as all options provided in PR #13063 while adding options currently missing to the Config Editor.\r\n\r\n\r\n\r\n', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13132/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13132/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6593396776', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/13132#issuecomment-6593396776', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13132', 'id': 6593396776, 'node_id': 'IC_kwDOALCn2M8AAAABiP9AKA', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T01:54:53Z', 'updated_at': '2026-11-03T01:54:53Z', 'body': 'This PR has aged and the "Presets" menu has been removed in #14559 so I\'m going to close this PR for now.\r\nThank you.', 'author_association': 'MEMBER', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6593396776/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-02T23:54:02Z', 'pushed_at': '2026-11-02T20:16:21Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563749, 'stargazers_count': 15759, 'watchers_count': 15759, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3375, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 479, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3375, 'open_issues': 479, 'watchers': 15759, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'gh_issue_comment'}
2026-11-03T01:47:05.804748 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'created', 'id': 14826, 'title': 'Add IPv6 handling for NetPlay address paths', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14826#issuecomment-6593274503', 'safe_author': True, 'body': 'This only alters the UI and doesn\'t actually make IPv6 work so I\'m going to close this PR for now.\r\nFeel free to re-open the PR if the situation changes.\r\n\r\nFYI, I am working on eliminating our reliance on ENet so hopefully we should have IPv6 functionality "soon".', 'raw': {'action': 'created', 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14826', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14826/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14826/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14826/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14826', 'id': 5245762271, 'node_id': 'PR_kwDOALCn2M8AAAABA7wgiA', 'number': 14826, 'title': 'Add IPv6 handling for NetPlay address paths', 'user': {'login': '65dph43039', 'id': 187355778, 'node_id': 'U_kgDOCyrSgg', 'avatar_url': 'https://avatars.githubusercontent.com/u/187355778?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/65dph43039', 'html_url': 'https://github.com/65dph43039', 'followers_url': 'https://api.github.com/users/65dph43039/followers', 'following_url': 'https://api.github.com/users/65dph43039/following{/other_user}', 'gists_url': 'https://api.github.com/users/65dph43039/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/65dph43039/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/65dph43039/subscriptions', 'organizations_url': 'https://api.github.com/users/65dph43039/orgs', 'repos_url': 'https://api.github.com/users/65dph43039/repos', 'events_url': 'https://api.github.com/users/65dph43039/events{/privacy}', 'received_events_url': 'https://api.github.com/users/65dph43039/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'closed', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 2, 'created_at': '2026-08-25T12:21:03Z', 'updated_at': '2026-11-03T01:47:03Z', 'closed_at': '2026-11-03T01:47:03Z', 'assignee': None, 'author_association': 'NONE', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14826', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14826', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14826.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14826.patch', 'merged_at': None}, 'body': None, 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14826/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14826/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6593274503', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14826#issuecomment-6593274503', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14826', 'id': 6593274503, 'node_id': 'IC_kwDOALCn2M8AAAABiP1ihw', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T01:47:03Z', 'updated_at': '2026-11-03T01:47:03Z', 'body': 'This only alters the UI and doesn\'t actually make IPv6 work so I\'m going to close this PR for now.\r\nFeel free to re-open the PR if the situation changes.\r\n\r\nFYI, I am working on eliminating our reliance on ENet so hopefully we should have IPv6 functionality "soon".', 'author_association': 'MEMBER', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6593274503/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-02T23:54:02Z', 'pushed_at': '2026-11-02T20:16:21Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563749, 'stargazers_count': 15759, 'watchers_count': 15759, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3375, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 480, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3375, 'open_issues': 480, 'watchers': 15759, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'gh_issue_comment'}
2026-11-03T00:41:23.110341 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'acts-1631', 'action': 'created', 'id': 14923, 'title': 'NetPlay: bound pending timebase reports', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14923#issuecomment-6592276635', 'safe_author': False, 'body': 'The inner map prevents duplicate reports for one frame, but the frame number is client-controlled. A client can still send a stream of unique frame numbers, leaving an unbounded number of incomplete outer-map entries. The per-player cap is intended to bound that case.', 'raw': {'action': 'created', 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14923', 'id': 5752591823, 'node_id': 'PR_kwDOALCn2M8AAAABHNsHaQ', 'number': 14923, 'title': 'NetPlay: bound pending timebase reports', 'user': {'login': 'acts-1631', 'id': 69813585, 'node_id': 'MDQ6VXNlcjY5ODEzNTg1', 'avatar_url': 'https://avatars.githubusercontent.com/u/69813585?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/acts-1631', 'html_url': 'https://github.com/acts-1631', 'followers_url': 'https://api.github.com/users/acts-1631/followers', 'following_url': 'https://api.github.com/users/acts-1631/following{/other_user}', 'gists_url': 'https://api.github.com/users/acts-1631/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/acts-1631/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/acts-1631/subscriptions', 'organizations_url': 'https://api.github.com/users/acts-1631/orgs', 'repos_url': 'https://api.github.com/users/acts-1631/repos', 'events_url': 'https://api.github.com/users/acts-1631/events{/privacy}', 'received_events_url': 'https://api.github.com/users/acts-1631/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 5, 'created_at': '2026-10-07T22:09:32Z', 'updated_at': '2026-11-03T00:41:21Z', 'closed_at': None, 'assignee': None, 'author_association': 'CONTRIBUTOR', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14923', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14923', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14923.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14923.patch', 'merged_at': None}, 'body': "NetPlayServer::OnData stores TimeBase messages in m_timebase_by_frame using a frame number supplied by each client. Entries remain until every player reports the same frame, so a connected client can continuously submit distinct frames and grow the host's memory usage without bound.\n\nValidate the complete packet, ignore reports outside an active game, ignore duplicate reports from the same player for a frame, and limit each player to 60 pending frame reports. Normal clients send one report every 60 emulated frames, so this preserves a minute of pending reports while placing a fixed bound on retained state.\n\nFixes: 04ca54623cb896c06776668f2cb6abb5bd25d7f8\n", 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6592276635', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14923#issuecomment-6592276635', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923', 'id': 6592276635, 'node_id': 'IC_kwDOALCn2M8AAAABiO4omw', 'user': {'login': 'acts-1631', 'id': 69813585, 'node_id': 'MDQ6VXNlcjY5ODEzNTg1', 'avatar_url': 'https://avatars.githubusercontent.com/u/69813585?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/acts-1631', 'html_url': 'https://github.com/acts-1631', 'followers_url': 'https://api.github.com/users/acts-1631/followers', 'following_url': 'https://api.github.com/users/acts-1631/following{/other_user}', 'gists_url': 'https://api.github.com/users/acts-1631/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/acts-1631/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/acts-1631/subscriptions', 'organizations_url': 'https://api.github.com/users/acts-1631/orgs', 'repos_url': 'https://api.github.com/users/acts-1631/repos', 'events_url': 'https://api.github.com/users/acts-1631/events{/privacy}', 'received_events_url': 'https://api.github.com/users/acts-1631/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T00:41:21Z', 'updated_at': '2026-11-03T00:41:21Z', 'body': 'The inner map prevents duplicate reports for one frame, but the frame number is client-controlled. A client can still send a stream of unique frame numbers, leaving an unbounded number of incomplete outer-map entries. The per-player cap is intended to bound that case.', 'author_association': 'CONTRIBUTOR', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6592276635/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-02T23:54:02Z', 'pushed_at': '2026-11-02T20:16:21Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563749, 'stargazers_count': 15759, 'watchers_count': 15759, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3375, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 481, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3375, 'open_issues': 481, 'watchers': 15759, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'acts-1631', 'id': 69813585, 'node_id': 'MDQ6VXNlcjY5ODEzNTg1', 'avatar_url': 'https://avatars.githubusercontent.com/u/69813585?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/acts-1631', 'html_url': 'https://github.com/acts-1631', 'followers_url': 'https://api.github.com/users/acts-1631/followers', 'following_url': 'https://api.github.com/users/acts-1631/following{/other_user}', 'gists_url': 'https://api.github.com/users/acts-1631/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/acts-1631/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/acts-1631/subscriptions', 'organizations_url': 'https://api.github.com/users/acts-1631/orgs', 'repos_url': 'https://api.github.com/users/acts-1631/repos', 'events_url': 'https://api.github.com/users/acts-1631/events{/privacy}', 'received_events_url': 'https://api.github.com/users/acts-1631/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'gh_issue_comment'}
2026-11-03T00:37:48.598692 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'created', 'id': 14923, 'title': 'NetPlay: bound pending timebase reports', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14923#issuecomment-6592224865', 'safe_author': True, 'body': "I don't think you need any of that `MAX_PENDING_TIMEBASE_FRAMES_PER_PLAYER` logic anymore? I think this PR can just change the vector to a map and add those minor checks:\r\n```cpp\r\n if (!packet)\r\n return 1;\r\n\r\n if (!m_is_running || m_desync_detected)\r\n break;\r\n```", 'raw': {'action': 'created', 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14923', 'id': 5752591823, 'node_id': 'PR_kwDOALCn2M8AAAABHNsHaQ', 'number': 14923, 'title': 'NetPlay: bound pending timebase reports', 'user': {'login': 'acts-1631', 'id': 69813585, 'node_id': 'MDQ6VXNlcjY5ODEzNTg1', 'avatar_url': 'https://avatars.githubusercontent.com/u/69813585?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/acts-1631', 'html_url': 'https://github.com/acts-1631', 'followers_url': 'https://api.github.com/users/acts-1631/followers', 'following_url': 'https://api.github.com/users/acts-1631/following{/other_user}', 'gists_url': 'https://api.github.com/users/acts-1631/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/acts-1631/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/acts-1631/subscriptions', 'organizations_url': 'https://api.github.com/users/acts-1631/orgs', 'repos_url': 'https://api.github.com/users/acts-1631/repos', 'events_url': 'https://api.github.com/users/acts-1631/events{/privacy}', 'received_events_url': 'https://api.github.com/users/acts-1631/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 4, 'created_at': '2026-10-07T22:09:32Z', 'updated_at': '2026-11-03T00:37:46Z', 'closed_at': None, 'assignee': None, 'author_association': 'CONTRIBUTOR', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14923', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14923', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14923.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14923.patch', 'merged_at': None}, 'body': "NetPlayServer::OnData stores TimeBase messages in m_timebase_by_frame using a frame number supplied by each client. Entries remain until every player reports the same frame, so a connected client can continuously submit distinct frames and grow the host's memory usage without bound.\n\nValidate the complete packet, ignore reports outside an active game, ignore duplicate reports from the same player for a frame, and limit each player to 60 pending frame reports. Normal clients send one report every 60 emulated frames, so this preserves a minute of pending reports while placing a fixed bound on retained state.\n\nFixes: 04ca54623cb896c06776668f2cb6abb5bd25d7f8\n", 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6592224865', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14923#issuecomment-6592224865', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923', 'id': 6592224865, 'node_id': 'IC_kwDOALCn2M8AAAABiO1eYQ', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T00:37:46Z', 'updated_at': '2026-11-03T00:37:46Z', 'body': "I don't think you need any of that `MAX_PENDING_TIMEBASE_FRAMES_PER_PLAYER` logic anymore? I think this PR can just change the vector to a map and add those minor checks:\r\n```cpp\r\n if (!packet)\r\n return 1;\r\n\r\n if (!m_is_running || m_desync_detected)\r\n break;\r\n```", 'author_association': 'MEMBER', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6592224865/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-02T23:54:02Z', 'pushed_at': '2026-11-02T20:16:21Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563749, 'stargazers_count': 15759, 'watchers_count': 15759, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3375, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 481, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3375, 'open_issues': 481, 'watchers': 15759, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'gh_issue_comment'}
2026-11-03T00:33:18.430207 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'Yola-cola', 'action': 'created', 'id': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6592157962', 'safe_author': False, 'body': "\r\n> Sorry, but anything that can't be already run today when using a disc image is out of scope for me. I'm implementing this as a new Blob type for DiscIO (existing blobs includes the different disc image formats, an extracted game folder, and so on), plus small modifications to skip emulated disc access times when using the optical disc blob. That's also why this plugs almost seamlessly with the DolphinTool, Riivolution, RetroAchivements and other existing features, for them it's simply a new blob type under the hood.\r\n> \r\n> I assume homebrew like WiiMC issues specific DI commands that very likely we don't emulate yet in order to support DVD Video discs, this is various layers of code below what I'm touching and I currently don't have neither the free time, nor the knowlegde or the desire to pursue. Hope you understand...\r\n\r\nI understand i was more so referring to the possibility of Homebrew integration in the future especially for wiimcss", 'raw': {'action': 'created', 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'id': 6162397505, 'node_id': 'PR_kwDOALCn2M8AAAABMS-vaA', 'number': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 10, 'created_at': '2026-11-02T12:18:18Z', 'updated_at': '2026-11-03T00:33:16Z', 'closed_at': None, 'assignee': None, 'author_association': 'MEMBER', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.patch', 'merged_at': None}, 'body': 'At long last, this PR restores the ability of running games from DVD backups (originally removed on PR #11456) and, for the first time in Dolphin, allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive):\r\n\r\nhttps://github.com/user-attachments/assets/626b3c7e-cd6a-48f0-9962-eaa6b1f0805a\r\n\r\nOn supported OSes (currently Windows and Linux), there\'s a new "Boot From Optical Disc" menu entry on File, and "Change Disc" now opens a popup that lets you change between a disc image or a physical disc or vice-versa:\r\n\r\nhttps://github.com/user-attachments/assets/0af57155-391c-41c8-b78c-bc70a63a7703\r\n\r\nThis implementation is heavily inspired on [redumper](https://github.com/superg/redumper), so Dolphin directly talks to the optical drive via low level SCSI multimedia commands instead of relying on the old approach that was derived from a very outdated version of libcdio.\r\n\r\n### Features and limitations\r\n* Although the UI changes are minimal (for now), I\'ve tried to make this work as intuitively as possible behind the scenes. I think the most noteworthy ones are that optical drives can be hot plugged at any time (if you\'re using USB to SATA adapters or portable drives) and if you boot from a physical disc and then eject it (either via File => Eject Disc or by pressing the Eject button on the drive itself), the disc will be ejected from the emulated console too. If you reinsert a disc later, it\'ll automatically reinsert the disc on the emulated console too (e.g. multi disc games that ask you to insert the next disc)\r\n* I didn\'t initially plan for this, but the `-i` flag from DolphinTool now accepts disc drive paths (e.g. `-i D:` or `-i /dev/sr0`). A side effect of that is you can now rip original discs to ISO, RVZ, GCZ or WIA directly from DolphinTool, if you have an OmniDrive-enabled drive\r\n* Emulated disc speed code is bypassed when using physical discs, as well as "Load Whole Game Into Memory". Beware of speeding up the emulation by setting the speed limit above 100% though, that can cause audio/video issues and even break games if you let them run too fast for too long, since the optical drive can\'t keep up ("An error occurred, please turn the GC/Wii off and refer to the operating manual")\r\n* Loading speeds are a bit slower than what I remember from playing on a real GC/Wii. The handful of games I tried still worked fine, though\r\n* When RetroAchievements are enabled, its hashing can cause a bit of slow loading speeds right after booting a game. It\'s more noticeable with Wii titles\r\n* Currently, [GameCube games that uses DTK Audio](https://wiki.dolphin-emu.org/index.php?title=Category:DTK_Audio_games) are nearly unplayable from physical discs, as the DTK audio path causes constant drive seeking, which consequently reduces the read speeds significantly. I intend to explore a few caching techniques to fix this, but it will be on a separate PR\r\n* Minimal testing was done on Linux, apart from compiling from source on Ubuntu 26.04.1 LTS and ensuring it could boot a game\r\n* Currently there\'s no macOS support, and I won\'t be adding it as I have no access to any Apple hardware. Porting should be easy, though, as all OS-specific code are isolated on `SCSIDevice.cpp/.h`\r\n\r\n### Generative AI disclosure\r\nThe source code from [redumper (b705)](https://github.com/superg/redumper/tree/b705) was fed into a LLM, which was tasked on creating a technical specs document about how it handles standard and raw OmniDrive reads. Then, I\'ve made a Windows-only CLI tool implementing only the absolute minimum required for the features that would be relevant for us, based on that document. DVD descrambling was added next and used this [reference implementation](https://github.com/Deterous/DVD-Scrambler) from Deterous. Once the CLI tool was feature complete, I used a LLM again, this time feeding it parts of the Linux (6.18 LTS) kernel source code, to assist with adding Linux compatibility to it.\r\n\r\nFinally, I started working with the Dolphin\'s source. The code this PR adds is directly derived from the CLI tool, but no LLMs were used beyond that point. I\'m also not touching any emulation code, the changes in DVDInterface reuses existing behavior or are based in code comments that already existed in Dolphin before this PR.\r\n\r\n### Licenses and attribuition\r\nThe bulk of this PR was heavily based on [redumper](https://github.com/superg/redumper), which is licensed under the GPLv3. As mentioned earlier, I also used the [descrambling implementation from Deterous](https://github.com/Deterous/DVD-Scrambler) as a reference, which the repo itself doesn\'t define a license, but directly mentions being made as the reference for redumper, so I think we\'re good? I can try contacting Deterous too for explicit approval, if needed...', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/reactions', 'total_count': 6, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 6, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6592157962', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6592157962', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'id': 6592157962, 'node_id': 'IC_kwDOALCn2M8AAAABiOxZCg', 'user': {'login': 'Yola-cola', 'id': 53379032, 'node_id': 'MDQ6VXNlcjUzMzc5MDMy', 'avatar_url': 'https://avatars.githubusercontent.com/u/53379032?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/Yola-cola', 'html_url': 'https://github.com/Yola-cola', 'followers_url': 'https://api.github.com/users/Yola-cola/followers', 'following_url': 'https://api.github.com/users/Yola-cola/following{/other_user}', 'gists_url': 'https://api.github.com/users/Yola-cola/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/Yola-cola/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/Yola-cola/subscriptions', 'organizations_url': 'https://api.github.com/users/Yola-cola/orgs', 'repos_url': 'https://api.github.com/users/Yola-cola/repos', 'events_url': 'https://api.github.com/users/Yola-cola/events{/privacy}', 'received_events_url': 'https://api.github.com/users/Yola-cola/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T00:33:16Z', 'updated_at': '2026-11-03T00:33:16Z', 'body': "\r\n> Sorry, but anything that can't be already run today when using a disc image is out of scope for me. I'm implementing this as a new Blob type for DiscIO (existing blobs includes the different disc image formats, an extracted game folder, and so on), plus small modifications to skip emulated disc access times when using the optical disc blob. That's also why this plugs almost seamlessly with the DolphinTool, Riivolution, RetroAchivements and other existing features, for them it's simply a new blob type under the hood.\r\n> \r\n> I assume homebrew like WiiMC issues specific DI commands that very likely we don't emulate yet in order to support DVD Video discs, this is various layers of code below what I'm touching and I currently don't have neither the free time, nor the knowlegde or the desire to pursue. Hope you understand...\r\n\r\nI understand i was more so referring to the possibility of Homebrew integration in the future especially for wiimcss", 'author_association': 'NONE', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6592157962/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-02T23:54:02Z', 'pushed_at': '2026-11-02T20:16:21Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563749, 'stargazers_count': 15759, 'watchers_count': 15759, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3375, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 481, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3375, 'open_issues': 481, 'watchers': 15759, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'Yola-cola', 'id': 53379032, 'node_id': 'MDQ6VXNlcjUzMzc5MDMy', 'avatar_url': 'https://avatars.githubusercontent.com/u/53379032?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/Yola-cola', 'html_url': 'https://github.com/Yola-cola', 'followers_url': 'https://api.github.com/users/Yola-cola/followers', 'following_url': 'https://api.github.com/users/Yola-cola/following{/other_user}', 'gists_url': 'https://api.github.com/users/Yola-cola/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/Yola-cola/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/Yola-cola/subscriptions', 'organizations_url': 'https://api.github.com/users/Yola-cola/orgs', 'repos_url': 'https://api.github.com/users/Yola-cola/repos', 'events_url': 'https://api.github.com/users/Yola-cola/events{/privacy}', 'received_events_url': 'https://api.github.com/users/Yola-cola/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'gh_issue_comment'}
2026-11-03T00:33:06.162157 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'acts-1631', 'action': 'created', 'id': 14923, 'title': 'NetPlay: bound pending timebase reports', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14923#issuecomment-6592154881', 'safe_author': False, 'body': 'Good idea, thanks', 'raw': {'action': 'created', 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14923', 'id': 5752591823, 'node_id': 'PR_kwDOALCn2M8AAAABHNsHaQ', 'number': 14923, 'title': 'NetPlay: bound pending timebase reports', 'user': {'login': 'acts-1631', 'id': 69813585, 'node_id': 'MDQ6VXNlcjY5ODEzNTg1', 'avatar_url': 'https://avatars.githubusercontent.com/u/69813585?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/acts-1631', 'html_url': 'https://github.com/acts-1631', 'followers_url': 'https://api.github.com/users/acts-1631/followers', 'following_url': 'https://api.github.com/users/acts-1631/following{/other_user}', 'gists_url': 'https://api.github.com/users/acts-1631/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/acts-1631/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/acts-1631/subscriptions', 'organizations_url': 'https://api.github.com/users/acts-1631/orgs', 'repos_url': 'https://api.github.com/users/acts-1631/repos', 'events_url': 'https://api.github.com/users/acts-1631/events{/privacy}', 'received_events_url': 'https://api.github.com/users/acts-1631/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 3, 'created_at': '2026-10-07T22:09:32Z', 'updated_at': '2026-11-03T00:33:04Z', 'closed_at': None, 'assignee': None, 'author_association': 'CONTRIBUTOR', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14923', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14923', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14923.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14923.patch', 'merged_at': None}, 'body': "NetPlayServer::OnData stores TimeBase messages in m_timebase_by_frame using a frame number supplied by each client. Entries remain until every player reports the same frame, so a connected client can continuously submit distinct frames and grow the host's memory usage without bound.\n\nValidate the complete packet, ignore reports outside an active game, ignore duplicate reports from the same player for a frame, and limit each player to 60 pending frame reports. Normal clients send one report every 60 emulated frames, so this preserves a minute of pending reports while placing a fixed bound on retained state.\n\nFixes: 04ca54623cb896c06776668f2cb6abb5bd25d7f8\n", 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6592154881', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14923#issuecomment-6592154881', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923', 'id': 6592154881, 'node_id': 'IC_kwDOALCn2M8AAAABiOxNAQ', 'user': {'login': 'acts-1631', 'id': 69813585, 'node_id': 'MDQ6VXNlcjY5ODEzNTg1', 'avatar_url': 'https://avatars.githubusercontent.com/u/69813585?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/acts-1631', 'html_url': 'https://github.com/acts-1631', 'followers_url': 'https://api.github.com/users/acts-1631/followers', 'following_url': 'https://api.github.com/users/acts-1631/following{/other_user}', 'gists_url': 'https://api.github.com/users/acts-1631/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/acts-1631/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/acts-1631/subscriptions', 'organizations_url': 'https://api.github.com/users/acts-1631/orgs', 'repos_url': 'https://api.github.com/users/acts-1631/repos', 'events_url': 'https://api.github.com/users/acts-1631/events{/privacy}', 'received_events_url': 'https://api.github.com/users/acts-1631/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T00:33:04Z', 'updated_at': '2026-11-03T00:33:04Z', 'body': 'Good idea, thanks', 'author_association': 'CONTRIBUTOR', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6592154881/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-02T23:54:02Z', 'pushed_at': '2026-11-02T20:16:21Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563749, 'stargazers_count': 15759, 'watchers_count': 15759, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3375, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 481, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3375, 'open_issues': 481, 'watchers': 15759, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'acts-1631', 'id': 69813585, 'node_id': 'MDQ6VXNlcjY5ODEzNTg1', 'avatar_url': 'https://avatars.githubusercontent.com/u/69813585?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/acts-1631', 'html_url': 'https://github.com/acts-1631', 'followers_url': 'https://api.github.com/users/acts-1631/followers', 'following_url': 'https://api.github.com/users/acts-1631/following{/other_user}', 'gists_url': 'https://api.github.com/users/acts-1631/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/acts-1631/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/acts-1631/subscriptions', 'organizations_url': 'https://api.github.com/users/acts-1631/orgs', 'repos_url': 'https://api.github.com/users/acts-1631/repos', 'events_url': 'https://api.github.com/users/acts-1631/events{/privacy}', 'received_events_url': 'https://api.github.com/users/acts-1631/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'gh_issue_comment'}
2026-11-03T00:27:30.822193 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'created', 'id': 14923, 'title': 'NetPlay: bound pending timebase reports', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14923#issuecomment-6592067149', 'safe_author': True, 'body': "I think this `TimeBase` handler would be simpler if the map here was changed from holding a vector of pairs to instead hold a map ?\r\nhttps://github.com/dolphin-emu/dolphin/blob/e8c42467964da77011f7da93a06f9e0a72ca868f/Source/Core/Core/NetPlayServer.h#L184\r\ne.g. Changed to:\r\n```cpp\r\nstd::unordered_map<u32, std::unordered_map<PlayerId, u64>> m_timebase_by_frame;\r\n```\r\n\r\nI don't think there's a reason for a player to send more than one timebase for a particular frame?\r\nUsing a map would eliminate the possibility of storing multiples in the first place.\r\n\r\nThen `timebases.emplace_back(player.pid, timebase);` would become `timebases.emplace(player.pid, timebase);`\r\nAnd a few other minor changes.", 'raw': {'action': 'created', 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14923', 'id': 5752591823, 'node_id': 'PR_kwDOALCn2M8AAAABHNsHaQ', 'number': 14923, 'title': 'NetPlay: bound pending timebase reports', 'user': {'login': 'acts-1631', 'id': 69813585, 'node_id': 'MDQ6VXNlcjY5ODEzNTg1', 'avatar_url': 'https://avatars.githubusercontent.com/u/69813585?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/acts-1631', 'html_url': 'https://github.com/acts-1631', 'followers_url': 'https://api.github.com/users/acts-1631/followers', 'following_url': 'https://api.github.com/users/acts-1631/following{/other_user}', 'gists_url': 'https://api.github.com/users/acts-1631/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/acts-1631/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/acts-1631/subscriptions', 'organizations_url': 'https://api.github.com/users/acts-1631/orgs', 'repos_url': 'https://api.github.com/users/acts-1631/repos', 'events_url': 'https://api.github.com/users/acts-1631/events{/privacy}', 'received_events_url': 'https://api.github.com/users/acts-1631/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 2, 'created_at': '2026-10-07T22:09:32Z', 'updated_at': '2026-11-03T00:27:21Z', 'closed_at': None, 'assignee': None, 'author_association': 'CONTRIBUTOR', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14923', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14923', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14923.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14923.patch', 'merged_at': None}, 'body': "NetPlayServer::OnData stores TimeBase messages in m_timebase_by_frame using a frame number supplied by each client. Entries remain until every player reports the same frame, so a connected client can continuously submit distinct frames and grow the host's memory usage without bound.\n\nValidate the complete packet, ignore reports outside an active game, ignore duplicate reports from the same player for a frame, and limit each player to 60 pending frame reports. Normal clients send one report every 60 emulated frames, so this preserves a minute of pending reports while placing a fixed bound on retained state.\n\nFixes: 04ca54623cb896c06776668f2cb6abb5bd25d7f8\n", 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6592067149', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14923#issuecomment-6592067149', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14923', 'id': 6592067149, 'node_id': 'IC_kwDOALCn2M8AAAABiOr2TQ', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T00:27:20Z', 'updated_at': '2026-11-03T00:27:20Z', 'body': "I think this `TimeBase` handler would be simpler if the map here was changed from holding a vector of pairs to instead hold a map ?\r\nhttps://github.com/dolphin-emu/dolphin/blob/e8c42467964da77011f7da93a06f9e0a72ca868f/Source/Core/Core/NetPlayServer.h#L184\r\ne.g. Changed to:\r\n```cpp\r\nstd::unordered_map<u32, std::unordered_map<PlayerId, u64>> m_timebase_by_frame;\r\n```\r\n\r\nI don't think there's a reason for a player to send more than one timebase for a particular frame?\r\nUsing a map would eliminate the possibility of storing multiples in the first place.\r\n\r\nThen `timebases.emplace_back(player.pid, timebase);` would become `timebases.emplace(player.pid, timebase);`\r\nAnd a few other minor changes.", 'author_association': 'MEMBER', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6592067149/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-02T23:54:02Z', 'pushed_at': '2026-11-02T20:16:21Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563749, 'stargazers_count': 15759, 'watchers_count': 15759, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3375, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 481, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3375, 'open_issues': 481, 'watchers': 15759, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'gh_issue_comment'}
2026-11-02T22:47:29.123420 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'mbc07', 'action': 'created', 'id': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6590433062', 'safe_author': True, 'body': "> It was a lot harder to reproduce than when I originally stumbled upon it, it appears to occur completely at random... But I can confirm that the drive hasn't stopped completely, and is just almost silent in this state. It should be worth noting that this was never during a no-activity period, but always while audio was actively being streamed from the disc.\r\n\r\nHmm, that sounds like a throughput issue then (e.g. drive not returning the data requested by the game fast enough due to seeking or similar). That was on Super Mario Galaxy, right? I have that game, will do some tests with it, the laptop drives are slower than their desktop counterparts, so it should be easier to trigger here. If it's indeed a throughput issue, I probably won't be able to do much until I implement some sort of caching (it's on my to-do list especially for DTK audio games, but whenever I do that it will be on a separate PR).\r\n<br/>\r\n\r\n> I tested it with Wii Play on windows and it works great. However, one oversight i did noticed is that when you eject the disc from the drive on the wii menu, the disc channel still thinks It's in the console.\r\n\r\nThis made me realize I programmed the test for a physical disc to trigger only when a read error occurs. So, if the emulated console doesn't try to access the disc after it has been physically ejected, the probe will never trigger and thus the emulated disc drive will never be ejected either. System menu reads the banner when the disc arrives and doesn't access it anymore until you actually launch the game, and that also likely explains why Super Mario Galaxy takes 3 to 4 seconds before noticing the disc is gone on Joshua's test, as once it loads the stage it likely only periodically streams chunks of audio. Should be easy to fix.\r\n<br/>\r\n\r\n> I also do hope this also gives more functionality to homebrew apps. (i.e playing dvd videos with WiiMC-SS)\r\n\r\nSorry, but anything that can't be already run today when using a disc image is out of scope for me. I'm implementing this as a new Blob type for DiscIO (existing blobs includes the different disc image formats, an extracted game folder, and so on), plus small modifications to skip emulated disc access times when using the optical disc blob. That's also why this plugs almost seamlessly with the DolphinTool, Riivolution, RetroAchivements and other existing features, for them it's simply a new blob type under the hood. \r\n\r\nI assume homebrew like WiiMC issues specific DI commands that very likely we don't emulate yet in order to support DVD Video discs, this is various layers of code below what I'm touching and I currently don't have neither the free time, nor the knowlegde or the desire to pursue. Hope you understand...", 'raw': {'action': 'created', 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'id': 6162397505, 'node_id': 'PR_kwDOALCn2M8AAAABMS-vaA', 'number': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 9, 'created_at': '2026-11-02T12:18:18Z', 'updated_at': '2026-11-02T22:47:27Z', 'closed_at': None, 'assignee': None, 'author_association': 'MEMBER', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.patch', 'merged_at': None}, 'body': 'At long last, this PR restores the ability of running games from DVD backups (originally removed on PR #11456) and, for the first time in Dolphin, allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive):\r\n\r\nhttps://github.com/user-attachments/assets/626b3c7e-cd6a-48f0-9962-eaa6b1f0805a\r\n\r\nOn supported OSes (currently Windows and Linux), there\'s a new "Boot From Optical Disc" menu entry on File, and "Change Disc" now opens a popup that lets you change between a disc image or a physical disc or vice-versa:\r\n\r\nhttps://github.com/user-attachments/assets/0af57155-391c-41c8-b78c-bc70a63a7703\r\n\r\nThis implementation is heavily inspired on [redumper](https://github.com/superg/redumper), so Dolphin directly talks to the optical drive via low level SCSI multimedia commands instead of relying on the old approach that was derived from a very outdated version of libcdio.\r\n\r\n### Features and limitations\r\n* Although the UI changes are minimal (for now), I\'ve tried to make this work as intuitively as possible behind the scenes. I think the most noteworthy ones are that optical drives can be hot plugged at any time (if you\'re using USB to SATA adapters or portable drives) and if you boot from a physical disc and then eject it (either via File => Eject Disc or by pressing the Eject button on the drive itself), the disc will be ejected from the emulated console too. If you reinsert a disc later, it\'ll automatically reinsert the disc on the emulated console too (e.g. multi disc games that ask you to insert the next disc)\r\n* I didn\'t initially plan for this, but the `-i` flag from DolphinTool now accepts disc drive paths (e.g. `-i D:` or `-i /dev/sr0`). A side effect of that is you can now rip original discs to ISO, RVZ, GCZ or WIA directly from DolphinTool, if you have an OmniDrive-enabled drive\r\n* Emulated disc speed code is bypassed when using physical discs, as well as "Load Whole Game Into Memory". Beware of speeding up the emulation by setting the speed limit above 100% though, that can cause audio/video issues and even break games if you let them run too fast for too long, since the optical drive can\'t keep up ("An error occurred, please turn the GC/Wii off and refer to the operating manual")\r\n* Loading speeds are a bit slower than what I remember from playing on a real GC/Wii. The handful of games I tried still worked fine, though\r\n* When RetroAchievements are enabled, its hashing can cause a bit of slow loading speeds right after booting a game. It\'s more noticeable with Wii titles\r\n* Currently, [GameCube games that uses DTK Audio](https://wiki.dolphin-emu.org/index.php?title=Category:DTK_Audio_games) are nearly unplayable from physical discs, as the DTK audio path causes constant drive seeking, which consequently reduces the read speeds significantly. I intend to explore a few caching techniques to fix this, but it will be on a separate PR\r\n* Minimal testing was done on Linux, apart from compiling from source on Ubuntu 26.04.1 LTS and ensuring it could boot a game\r\n* Currently there\'s no macOS support, and I won\'t be adding it as I have no access to any Apple hardware. Porting should be easy, though, as all OS-specific code are isolated on `SCSIDevice.cpp/.h`\r\n\r\n### Generative AI disclosure\r\nThe source code from [redumper (b705)](https://github.com/superg/redumper/tree/b705) was fed into a LLM, which was tasked on creating a technical specs document about how it handles standard and raw OmniDrive reads. Then, I\'ve made a Windows-only CLI tool implementing only the absolute minimum required for the features that would be relevant for us, based on that document. DVD descrambling was added next and used this [reference implementation](https://github.com/Deterous/DVD-Scrambler) from Deterous. Once the CLI tool was feature complete, I used a LLM again, this time feeding it parts of the Linux (6.18 LTS) kernel source code, to assist with adding Linux compatibility to it.\r\n\r\nFinally, I started working with the Dolphin\'s source. The code this PR adds is directly derived from the CLI tool, but no LLMs were used beyond that point. I\'m also not touching any emulation code, the changes in DVDInterface reuses existing behavior or are based in code comments that already existed in Dolphin before this PR.\r\n\r\n### Licenses and attribuition\r\nThe bulk of this PR was heavily based on [redumper](https://github.com/superg/redumper), which is licensed under the GPLv3. As mentioned earlier, I also used the [descrambling implementation from Deterous](https://github.com/Deterous/DVD-Scrambler) as a reference, which the repo itself doesn\'t define a license, but directly mentions being made as the reference for redumper, so I think we\'re good? I can try contacting Deterous too for explicit approval, if needed...', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/reactions', 'total_count': 5, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 5, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6590433062', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6590433062', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'id': 6590433062, 'node_id': 'IC_kwDOALCn2M8AAAABiNIHJg', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-02T22:47:27Z', 'updated_at': '2026-11-02T22:47:27Z', 'body': "> It was a lot harder to reproduce than when I originally stumbled upon it, it appears to occur completely at random... But I can confirm that the drive hasn't stopped completely, and is just almost silent in this state. It should be worth noting that this was never during a no-activity period, but always while audio was actively being streamed from the disc.\r\n\r\nHmm, that sounds like a throughput issue then (e.g. drive not returning the data requested by the game fast enough due to seeking or similar). That was on Super Mario Galaxy, right? I have that game, will do some tests with it, the laptop drives are slower than their desktop counterparts, so it should be easier to trigger here. If it's indeed a throughput issue, I probably won't be able to do much until I implement some sort of caching (it's on my to-do list especially for DTK audio games, but whenever I do that it will be on a separate PR).\r\n<br/>\r\n\r\n> I tested it with Wii Play on windows and it works great. However, one oversight i did noticed is that when you eject the disc from the drive on the wii menu, the disc channel still thinks It's in the console.\r\n\r\nThis made me realize I programmed the test for a physical disc to trigger only when a read error occurs. So, if the emulated console doesn't try to access the disc after it has been physically ejected, the probe will never trigger and thus the emulated disc drive will never be ejected either. System menu reads the banner when the disc arrives and doesn't access it anymore until you actually launch the game, and that also likely explains why Super Mario Galaxy takes 3 to 4 seconds before noticing the disc is gone on Joshua's test, as once it loads the stage it likely only periodically streams chunks of audio. Should be easy to fix.\r\n<br/>\r\n\r\n> I also do hope this also gives more functionality to homebrew apps. (i.e playing dvd videos with WiiMC-SS)\r\n\r\nSorry, but anything that can't be already run today when using a disc image is out of scope for me. I'm implementing this as a new Blob type for DiscIO (existing blobs includes the different disc image formats, an extracted game folder, and so on), plus small modifications to skip emulated disc access times when using the optical disc blob. That's also why this plugs almost seamlessly with the DolphinTool, Riivolution, RetroAchivements and other existing features, for them it's simply a new blob type under the hood. \r\n\r\nI assume homebrew like WiiMC issues specific DI commands that very likely we don't emulate yet in order to support DVD Video discs, this is various layers of code below what I'm touching and I currently don't have neither the free time, nor the knowlegde or the desire to pursue. Hope you understand...", 'author_association': 'MEMBER', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6590433062/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-02T20:16:28Z', 'pushed_at': '2026-11-02T20:16:21Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563749, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3375, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 481, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3375, 'open_issues': 481, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'gh_issue_comment'}
Recent 'gh_pull_request' events
2026-11-03T17:47:25.785024 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'JoshuaVandaele', 'action': 'synchronize', 'id': 14979, 'title': 'Externals/gettext: Update to 1.0, vendor-in from source on non-Windows host platforms', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14979', 'head_ref_name': 'vendored-gettext', 'safe_author': True, 'base_sha': 'df4bd441dec5d6f3cff606eea76f183963e97a44', 'head_sha': '8159092533e9160c64df47f9001b55a24ae16633', 'merged': False, 'requested_reviewers': [], 'type': 'gh_pull_request'}
2026-11-03T17:44:08.318399 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'JoshuaVandaele', 'action': 'opened', 'id': 14979, 'title': 'Externals/gettext: Update to 1.0, vendor-in from source on non-Windows host platforms', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14979', 'head_ref_name': 'vendored-gettext', 'safe_author': True, 'base_sha': 'df4bd441dec5d6f3cff606eea76f183963e97a44', 'head_sha': '889421211027958ff6af2264b2ba970b5645b142', 'merged': False, 'requested_reviewers': [], 'type': 'gh_pull_request'}
2026-11-03T13:27:00.906391 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'JoshuaVandaele', 'action': 'edited', 'id': 14978, 'title': 'CPU: Fix quickly-stopped games hanging Dolphin', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14978', 'head_ref_name': 'quick-stop-hang', 'safe_author': True, 'base_sha': 'df4bd441dec5d6f3cff606eea76f183963e97a44', 'head_sha': '0436c9f60eb1e815a65f01d5edb6a5a155911553', 'merged': False, 'requested_reviewers': [], 'type': 'gh_pull_request'}
2026-11-03T13:25:13.030234 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'JoshuaVandaele', 'action': 'opened', 'id': 14978, 'title': 'CPU: Fix quickly-stopped games hanging Dolphin', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14978', 'head_ref_name': 'quick-stop-hang', 'safe_author': True, 'base_sha': 'df4bd441dec5d6f3cff606eea76f183963e97a44', 'head_sha': '0436c9f60eb1e815a65f01d5edb6a5a155911553', 'merged': False, 'requested_reviewers': [], 'type': 'gh_pull_request'}
2026-11-03T11:08:40.291246 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'edited', 'id': 14977, 'title': 'Common/Logging: Eliminate fstream and mutex in FileLogListener with new LogIOFile class.', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14977', 'head_ref_name': 'log-file-no-mutex', 'safe_author': True, 'base_sha': 'df4bd441dec5d6f3cff606eea76f183963e97a44', 'head_sha': 'd2c0bddaf1035e483965c73724f549814ba7b374', 'merged': False, 'requested_reviewers': [], 'type': 'gh_pull_request'}
2026-11-03T11:01:41.729125 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'opened', 'id': 14977, 'title': 'Common/Logging: Eliminate fstream and mutex in FileLogListener with new LogIOFile class.', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14977', 'head_ref_name': 'log-file-no-mutex', 'safe_author': True, 'base_sha': 'df4bd441dec5d6f3cff606eea76f183963e97a44', 'head_sha': 'd2c0bddaf1035e483965c73724f549814ba7b374', 'merged': False, 'requested_reviewers': [], 'type': 'gh_pull_request'}
2026-11-03T07:00:16.124967 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'sepalani', 'action': 'synchronize', 'id': 14774, 'title': 'Refactor the GameCube microphone code', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14774', 'head_ref_name': 'mic-dedup2', 'safe_author': True, 'base_sha': 'df4bd441dec5d6f3cff606eea76f183963e97a44', 'head_sha': 'ed0e14952a6797d33e14d9a377fa413c1f2de917', 'merged': False, 'requested_reviewers': [], 'type': 'gh_pull_request'}
2026-11-03T04:44:54.414639 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'closed', 'id': 14972, 'title': 'Minor cleanups with "parenthesized initialization of aggregates".', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14972', 'head_ref_name': 'paren-init-aggregate', 'safe_author': True, 'base_sha': '833d8c05965ac1e2242799d3c9b0e0fadbcbb7f8', 'head_sha': 'd08bddeaabbfba79f76407018ab02bdf68fa2d46', 'merged': True, 'requested_reviewers': [], 'type': 'gh_pull_request'}
2026-11-03T04:31:52.543389 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'JoeysRetroHandhelds', 'action': 'synchronize', 'id': 14976, 'title': "WiimoteDevice: Don't send output reports to a null HID source", 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14976', 'head_ref_name': 'wiimote-null-hid-source', 'safe_author': False, 'base_sha': 'e8c42467964da77011f7da93a06f9e0a72ca868f', 'head_sha': '81ac5fe3798f401e68bbe6f2e073bf87c3fac890', 'merged': False, 'requested_reviewers': [], 'type': 'gh_pull_request'}
2026-11-03T04:01:48.140923 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'JoeysRetroHandhelds', 'action': 'opened', 'id': 14976, 'title': "WiimoteDevice: Don't send output reports to a null HID source", 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14976', 'head_ref_name': 'wiimote-null-hid-source', 'safe_author': False, 'base_sha': 'e8c42467964da77011f7da93a06f9e0a72ca868f', 'head_sha': 'eb3c2ac446b6613a4a82b56034420d2f600b5a7c', 'merged': False, 'requested_reviewers': [], 'type': 'gh_pull_request'}
2026-11-03T03:05:16.855396 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'synchronize', 'id': 14973, 'title': 'CubebUtils: Allow selecting the backend that Cubeb uses and update Cubeb in Externals.', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14973', 'head_ref_name': 'cubeb-backend-selection', 'safe_author': True, 'base_sha': 'e8c42467964da77011f7da93a06f9e0a72ca868f', 'head_sha': '267ac1b044ff3279fdfb0ffbe385cd7e832321d7', 'merged': False, 'requested_reviewers': [], 'type': 'gh_pull_request'}
2026-11-03T02:09:08.821310 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'closed', 'id': 13018, 'title': 'Convert variables to structured bindings', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/13018', 'head_ref_name': 'Use-structured-bindings', 'safe_author': True, 'base_sha': '5f39db5876cebc343409c2bc84feef0f9b39d03b', 'head_sha': '13e343c30b9dde3feb350213393fee811d370287', 'merged': False, 'requested_reviewers': [], 'type': 'gh_pull_request'}
2026-11-03T01:54:56.906799 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'closed', 'id': 13132, 'title': 'Expand GameConfig Editor Preset Options', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/13132', 'head_ref_name': 'gameini-config', 'safe_author': True, 'base_sha': '8d5b6e8e8690b6c1470aa66d33aea3a7c1da24b3', 'head_sha': 'f999e48452408ab5bcafb6a3d5f6109c3e1f753a', 'merged': False, 'requested_reviewers': [], 'type': 'gh_pull_request'}
2026-11-03T01:51:05.639550 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'labeled', 'id': 13137, 'title': 'Interface: Static Game Window Title option', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/13137', 'head_ref_name': 'static-game-window-title-option', 'safe_author': True, 'base_sha': '1b8cc192200c6e9fdc429c43d0be152ec4dff0d0', 'head_sha': 'cd12197d4ace3f95db4814c19fae1c802189f0e9', 'merged': False, 'requested_reviewers': [], 'type': 'gh_pull_request'}
2026-11-03T01:47:05.888761 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'closed', 'id': 14826, 'title': 'Add IPv6 handling for NetPlay address paths', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14826', 'head_ref_name': 'copilot/support-ipv6-for-netplay', 'safe_author': True, 'base_sha': '123d32248e455ec242866e3a75fea70dcecfd567', 'head_sha': 'c0e079c745f06a05a21d1917bd36b40d4feed5ea', 'merged': False, 'requested_reviewers': [], 'type': 'gh_pull_request'}
2026-11-03T00:32:16.701437 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'acts-1631', 'action': 'synchronize', 'id': 14923, 'title': 'NetPlay: bound pending timebase reports', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14923', 'head_ref_name': 'netplay-timebase-report-limit', 'safe_author': False, 'base_sha': 'e8c42467964da77011f7da93a06f9e0a72ca868f', 'head_sha': '86afda54a78b6af8e1e154d93785377c5fbcddd8', 'merged': False, 'requested_reviewers': [], 'type': 'gh_pull_request'}
2026-11-02T23:44:03.292864 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'synchronize', 'id': 14967, 'title': 'Common: Add helper function to set SO_REUSEADDR on TCP sockets on non-Windows.', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14967', 'head_ref_name': 'SO_REUSEADDR', 'safe_author': True, 'base_sha': 'e8c42467964da77011f7da93a06f9e0a72ca868f', 'head_sha': '824dcf229374473c20bd37143ec1c1f6c2a8d663', 'merged': False, 'requested_reviewers': [], 'type': 'gh_pull_request'}
2026-11-02T23:35:06.573433 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'synchronize', 'id': 14973, 'title': 'CubebUtils: Allow selecting the backend that Cubeb uses and update Cubeb in Externals.', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14973', 'head_ref_name': 'cubeb-backend-selection', 'safe_author': True, 'base_sha': 'e8c42467964da77011f7da93a06f9e0a72ca868f', 'head_sha': '7c0b490f668f8d635e9f6afabf536b6cfcdf9d5e', 'merged': False, 'requested_reviewers': [], 'type': 'gh_pull_request'}
2026-11-02T21:37:38.369152 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'JosJuice', 'action': 'unlabeled', 'id': 14819, 'title': 'DriverDetails: Set fixed versions for old Adreno bugs', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14819', 'head_ref_name': 'prune-adreno-bugs', 'safe_author': True, 'base_sha': 'e8c42467964da77011f7da93a06f9e0a72ca868f', 'head_sha': '814e11dace409c67172618a2fc01c1fc6a313aae', 'merged': False, 'requested_reviewers': [], 'type': 'gh_pull_request'}
2026-11-02T20:39:14.948748 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'JosJuice', 'action': 'synchronize', 'id': 14819, 'title': 'DriverDetails: Set fixed versions for old Adreno bugs', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14819', 'head_ref_name': 'prune-adreno-bugs', 'safe_author': True, 'base_sha': 'e8c42467964da77011f7da93a06f9e0a72ca868f', 'head_sha': '814e11dace409c67172618a2fc01c1fc6a313aae', 'merged': False, 'requested_reviewers': [], 'type': 'gh_pull_request'}
2026-11-02T20:16:28.497609 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'closed', 'id': 14510, 'title': 'EXI: Show on-screen error when USB Gecko fails to bind', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14510', 'head_ref_name': 'pr/gecko-bind-error', 'safe_author': True, 'base_sha': 'd182533d363eae8c753d37cfad4107930da2019a', 'head_sha': '18190eb05d46592e12008050805d9c4bbdbb2138', 'merged': True, 'requested_reviewers': [], 'type': 'gh_pull_request'}
2026-11-02T20:12:52.585342 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'synchronize', 'id': 14967, 'title': 'Common: Add helper function to set SO_REUSEADDR on TCP sockets on non-Windows.', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14967', 'head_ref_name': 'SO_REUSEADDR', 'safe_author': True, 'base_sha': 'a0ed231ff614ec6e03716d72fa8f3a11ce57c6a0', 'head_sha': 'f9913a5b4200d8ce751f5ecbf6f3814c10d6032d', 'merged': False, 'requested_reviewers': [], 'type': 'gh_pull_request'}
2026-11-02T20:07:09.981371 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'synchronize', 'id': 14973, 'title': 'CubebUtils: Allow selecting the backend that Cubeb uses and update Cubeb in Externals.', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14973', 'head_ref_name': 'cubeb-backend-selection', 'safe_author': True, 'base_sha': 'a0ed231ff614ec6e03716d72fa8f3a11ce57c6a0', 'head_sha': '6edc53cad639d7b79a79a9b1467dff7f46a69be1', 'merged': False, 'requested_reviewers': [], 'type': 'gh_pull_request'}
2026-11-02T19:46:26.027787 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'closed', 'id': 14975, 'title': 'Flatpak: Do not set the flathub::manifest tag', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14975', 'head_ref_name': 'flathub-manifest', 'safe_author': True, 'base_sha': 'd182533d363eae8c753d37cfad4107930da2019a', 'head_sha': '2833c12b20e5c3d929f8c27a7742ecadb8a669b4', 'merged': True, 'requested_reviewers': [], 'type': 'gh_pull_request'}
2026-11-02T18:36:11.160304 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'sepalani', 'action': 'synchronize', 'id': 14774, 'title': 'Refactor the GameCube microphone code', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14774', 'head_ref_name': 'mic-dedup2', 'safe_author': True, 'base_sha': 'd182533d363eae8c753d37cfad4107930da2019a', 'head_sha': '3b40711b43a71c46bec502e5e0a5d2913e8367bd', 'merged': False, 'requested_reviewers': [], 'type': 'gh_pull_request'}
Recent 'gh_pull_request_comment' events
2026-11-03T12:21:21.900243 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'JoshuaVandaele', 'action': 'created', 'id': 14974, 'hash': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4453291256', 'is_part_of_review': True, 'type': 'gh_pull_request_comment'}
2026-11-03T12:21:21.899493 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'JoshuaVandaele', 'action': 'created', 'id': 14974, 'hash': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4454423062', 'is_part_of_review': True, 'type': 'gh_pull_request_comment'}
2026-11-03T12:21:21.898748 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'JoshuaVandaele', 'action': 'created', 'id': 14974, 'hash': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4454462737', 'is_part_of_review': True, 'type': 'gh_pull_request_comment'}
2026-11-03T12:21:21.897972 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'JoshuaVandaele', 'action': 'created', 'id': 14974, 'hash': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4452521727', 'is_part_of_review': True, 'type': 'gh_pull_request_comment'}
2026-11-03T12:21:21.897138 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'JoshuaVandaele', 'action': 'created', 'id': 14974, 'hash': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4452462887', 'is_part_of_review': True, 'type': 'gh_pull_request_comment'}
2026-11-03T04:28:12.065075 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'created', 'id': 14976, 'hash': 'eb3c2ac446b6613a4a82b56034420d2f600b5a7c', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14976#discussion_r4450920669', 'is_part_of_review': True, 'type': 'gh_pull_request_comment'}
2026-11-03T04:25:59.386273 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'created', 'id': 14976, 'hash': 'eb3c2ac446b6613a4a82b56034420d2f600b5a7c', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14976#discussion_r4450910740', 'is_part_of_review': False, 'type': 'gh_pull_request_comment'}
2026-11-03T01:25:35.662337 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'created', 'id': 13958, 'hash': 'd15ca355a23242d80ff0cf41d2162522bc1e4aac', 'url': 'https://github.com/dolphin-emu/dolphin/pull/13958#discussion_r4449816356', 'is_part_of_review': False, 'type': 'gh_pull_request_comment'}
2026-11-03T01:07:34.800069 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'mbc07', 'action': 'created', 'id': 14974, 'hash': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4449680417', 'is_part_of_review': True, 'type': 'gh_pull_request_comment'}
2026-11-03T01:01:41.110966 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'created', 'id': 14450, 'hash': '8d48b7326d361622969a5abcb6a6e91afc105782', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14450#discussion_r4449628425', 'is_part_of_review': False, 'type': 'gh_pull_request_comment'}
2026-11-03T00:01:25.079456 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'created', 'id': 14974, 'hash': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4449247429', 'is_part_of_review': False, 'type': 'gh_pull_request_comment'}
2026-11-02T20:12:54.998643 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'created', 'id': 14967, 'hash': 'f9913a5b4200d8ce751f5ecbf6f3814c10d6032d', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14967#discussion_r4447219211', 'is_part_of_review': False, 'type': 'gh_pull_request_comment'}
2026-11-02T20:09:04.804629 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'created', 'id': 14973, 'hash': '6edc53cad639d7b79a79a9b1467dff7f46a69be1', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14973#discussion_r4447183650', 'is_part_of_review': False, 'type': 'gh_pull_request_comment'}
2026-11-02T18:41:20.112013 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'sepalani', 'action': 'created', 'id': 14774, 'hash': '5cf17085f9e6061796058f3aeb4dd4d2c5d5e3aa', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14774#discussion_r4446312543', 'is_part_of_review': True, 'type': 'gh_pull_request_comment'}
2026-11-02T16:13:58.903956 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'sepalani', 'action': 'created', 'id': 14967, 'hash': '47fdf50d2cabd257b7e38387364b6516a9c6b4cc', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14967#discussion_r4444669861', 'is_part_of_review': True, 'type': 'gh_pull_request_comment'}
2026-11-02T14:05:57.628793 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'JoshuaVandaele', 'action': 'created', 'id': 14973, 'hash': 'eba464eab6960fed9b4979ab192c6634ba05ca83', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14973#discussion_r4443317673', 'is_part_of_review': True, 'type': 'gh_pull_request_comment'}
2026-11-02T14:05:57.613139 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'JoshuaVandaele', 'action': 'created', 'id': 14973, 'hash': 'eba464eab6960fed9b4979ab192c6634ba05ca83', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14973#discussion_r4443224533', 'is_part_of_review': True, 'type': 'gh_pull_request_comment'}
2026-11-02T14:05:57.571586 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'JoshuaVandaele', 'action': 'created', 'id': 14973, 'hash': 'eba464eab6960fed9b4979ab192c6634ba05ca83', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14973#discussion_r4443271441', 'is_part_of_review': True, 'type': 'gh_pull_request_comment'}
2026-11-02T14:05:57.482823 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'JoshuaVandaele', 'action': 'created', 'id': 14973, 'hash': 'eba464eab6960fed9b4979ab192c6634ba05ca83', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14973#discussion_r4443207466', 'is_part_of_review': True, 'type': 'gh_pull_request_comment'}
2026-11-02T14:05:57.363223 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'JoshuaVandaele', 'action': 'created', 'id': 14973, 'hash': 'eba464eab6960fed9b4979ab192c6634ba05ca83', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14973#discussion_r4443198458', 'is_part_of_review': True, 'type': 'gh_pull_request_comment'}
2026-11-02T11:25:28.494730 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'created', 'id': 14967, 'hash': '10fcfd969d2c15e78ceb6b04e44be1dda4fb5be6', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14967#discussion_r4441788257', 'is_part_of_review': False, 'type': 'gh_pull_request_comment'}
2026-11-02T11:25:16.916800 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'created', 'id': 14967, 'hash': '10fcfd969d2c15e78ceb6b04e44be1dda4fb5be6', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14967#discussion_r4441785888', 'is_part_of_review': True, 'type': 'gh_pull_request_comment'}
2026-11-02T10:42:05.042899 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'created', 'id': 14967, 'hash': '10fcfd969d2c15e78ceb6b04e44be1dda4fb5be6', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14967#discussion_r4441405735', 'is_part_of_review': False, 'type': 'gh_pull_request_comment'}
2026-11-02T10:40:08.396018 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'edited', 'id': 14967, 'hash': '10fcfd969d2c15e78ceb6b04e44be1dda4fb5be6', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14967#discussion_r4441383781', 'is_part_of_review': False, 'type': 'gh_pull_request_comment'}
2026-11-02T10:39:54.983833 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'created', 'id': 14967, 'hash': '10fcfd969d2c15e78ceb6b04e44be1dda4fb5be6', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14967#discussion_r4441383781', 'is_part_of_review': True, 'type': 'gh_pull_request_comment'}
Recent 'gh_pull_request_review' events
2026-11-03T17:27:07.220521 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'sepalani', 'action': 'submitted', 'pr_id': 14978, 'pr_title': 'CPU: Fix quickly-stopped games hanging Dolphin', 'state': 'approved', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14978#pullrequestreview-5756715873', 'comments': [], 'type': 'gh_pull_request_review'}
2026-11-03T16:57:25.312935 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'sepalani', 'action': 'submitted', 'pr_id': 14967, 'pr_title': 'Common: Add helper function to set SO_REUSEADDR on TCP sockets on non-Windows.', 'state': 'approved', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14967#pullrequestreview-5756288334', 'comments': [], 'type': 'gh_pull_request_review'}
2026-11-03T12:21:21.894686 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'JoshuaVandaele', 'action': 'submitted', 'pr_id': 14974, 'pr_title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'state': 'commented', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14974#pullrequestreview-5749202729', 'comments': [{'id': 4452462887, 'node_id': 'PRRC_kwDOALCn2M8AAAABCWMxJw', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4452462887', 'pull_request_review_id': 5749202729, 'diff_hunk': '@@ -0,0 +1,94 @@\n+// Copyright 2026 Dolphin Emulator Project\n+// SPDX-License-Identifier: GPL-2.0-or-later\n+\n+#pragma once\n+\n+#include <functional>\n+#include <map>\n+#include <memory>\n+#include <optional>\n+#include <string>\n+#include <vector>\n+\n+#include <QObject>\n+#include <QString>\n+\n+#include "Common/Flag.h"\n+#include "Common/SCSIDevice.h"\n+#include "Common/WorkQueueThread.h"\n+#include "DiscIO/OmniDrive.h"\n+\n+// Lists the host\'s optical drives at once and fills in what is known about each from a drive cache\n+// that lasts until Dolphin exits. Only a drive new to the cache is queried for its firmware, once,\n+// on a worker thread, so the UI never waits for a drive and known drives are left alone.', 'path': 'Source/Core/DolphinQt/OpticalDriveWatcher.h', 'position': 23, 'original_position': 23, 'commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'user': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': '`GetCachedIdentity` and `Refresh` both call `GetDriveInfo` on the UI thread, which on Linux runs `GetSerialNumber`, which waits for a drive', 'created_at': '2026-11-03T08:40:06Z', 'updated_at': '2026-11-03T12:21:18Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4452462887', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'author_association': 'MEMBER', '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4452462887'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4452462887'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974'}}, 'original_commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4452462887/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'is_copilot_code_review': False, 'copilot_code_review_sources': []}, {'id': 4452521727, 'node_id': 'PRRC_kwDOALCn2M8AAAABCWQW_w', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4452521727', 'pull_request_review_id': 5749202729, 'diff_hunk': '@@ -0,0 +1,776 @@\n+// Copyright 2026 Dolphin Emulator Project\n+// SPDX-License-Identifier: GPL-2.0-or-later\n+\n+#include "Common/SCSIDevice.h"\n+\n+#include <algorithm>\n+#include <array>\n+#include <cctype>\n+#include <cerrno>\n+#include <cstddef>\n+#include <filesystem>\n+#include <map>\n+#include <mutex>\n+#include <optional>\n+#include <span>\n+#include <string>\n+#include <string_view>\n+#include <system_error>\n+#include <vector>\n+\n+#include <fmt/format.h>\n+\n+#if defined(_WIN32)\n+#include <windows.h>\n+#include <winioctl.h>\n+\n+#include <ntddscsi.h>\n+#include <ntddstor.h>\n+#elif defined(__linux__) && !defined(__ANDROID__)\n+#include <fcntl.h>\n+#include <scsi/sg.h>\n+#include <sys/ioctl.h>\n+#include <unistd.h>\n+#endif\n+\n+#include "Common/CommonFuncs.h"\n+#include "Common/CommonTypes.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Logging/Log.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+\n+namespace Common\n+{\n+SCSIDevice::~SCSIDevice()\n+{\n+ Close();\n+}\n+\n+#if defined(_WIN32)\n+\n+namespace\n+{\n+// Timeout for the TEST UNIT READY that reads drive status. Short, so a spinning-up drive is\n+// reported as such at once instead of blocking until it is ready\n+constexpr u32 STATUS_PROBE_TIMEOUT_SECONDS = 1;\n+} // namespace\n+\n+namespace\n+{\n+// SCSI_PASS_THROUGH_DIRECT and its sense buffer in one contiguous block, so the kernel can write\n+// sense data at SenseInfoOffset\n+struct SPTDWithSense\n+{\n+ SCSI_PASS_THROUGH_DIRECT sptd;\n+ std::array<u8, 24> sense;\n+};\n+\n+std::wstring ToDevicePath(const std::string& path)\n+{\n+ return UTF8ToWString(R"(\\\\.\\)" + path);\n+}\n+\n+HANDLE OpenDeviceHandle(const std::string& path, DWORD access)\n+{\n+ return CreateFileW(ToDevicePath(path).c_str(), access, FILE_SHARE_READ | FILE_SHARE_WRITE,\n+ nullptr, OPEN_EXISTING, 0, nullptr);\n+}\n+\n+void DecodeSense(const SPTDWithSense& sptd, SCSISense* sense)\n+{\n+ sense->status = sptd.sptd.ScsiStatus;\n+ sense->sense_key = sptd.sense[2] & 0x0F;\n+ sense->asc = sptd.sense[12];\n+ sense->ascq = sptd.sense[13];\n+}\n+\n+// Returns false only if the OS rejects the IOCTL itself\n+bool SendPassThrough(HANDLE handle, std::span<const u8> cdb, std::span<u8> buffer,\n+ SCSIDataDirection direction, u32 timeout_seconds, SPTDWithSense* sptd)\n+{\n+ if (cdb.size() > sizeof(SCSI_PASS_THROUGH_DIRECT::Cdb))\n+ return false;\n+\n+ *sptd = {};\n+ sptd->sptd.Length = sizeof(SCSI_PASS_THROUGH_DIRECT);\n+ sptd->sptd.CdbLength = static_cast<UCHAR>(cdb.size());\n+ sptd->sptd.SenseInfoLength = static_cast<UCHAR>(sptd->sense.size());\n+ sptd->sptd.DataIn = static_cast<UCHAR>(direction);\n+ sptd->sptd.DataTransferLength = static_cast<ULONG>(buffer.size());\n+ sptd->sptd.TimeOutValue = timeout_seconds;\n+ sptd->sptd.DataBuffer = buffer.empty() ? nullptr : buffer.data();\n+ sptd->sptd.SenseInfoOffset = static_cast<ULONG>(offsetof(SPTDWithSense, sense));\n+ std::ranges::copy(cdb, sptd->sptd.Cdb);\n+\n+ DWORD bytes_returned = 0;\n+ return DeviceIoControl(handle, IOCTL_SCSI_PASS_THROUGH_DIRECT, sptd, sizeof(*sptd), sptd,\n+ sizeof(*sptd), &bytes_returned, nullptr) != FALSE;\n+}\n+\n+std::string ReadDescriptorString(std::span<const u8> data, u32 offset)\n+{\n+ if (offset == 0 || offset >= data.size())\n+ return {};\n+ const std::string_view text(reinterpret_cast<const char*>(data.data()) + offset,\n+ data.size() - offset);\n+ return std::string(StripWhitespace(text.substr(0, text.find(\'\\0\'))));\n+}\n+} // namespace\n+\n+bool SCSIDevice::IsSupported()\n+{\n+ return true;\n+}\n+\n+bool SCSIDevice::Open(const std::string& path, bool read_write)\n+{\n+ Close();\n+\n+ DWORD desired_access = GENERIC_READ;\n+ if (read_write)\n+ desired_access |= GENERIC_WRITE;\n+\n+ HANDLE handle = OpenDeviceHandle(path, desired_access);\n+\n+ // Standard user accounts can be refused GENERIC_WRITE, so fall back to read-only before failing\n+ if (handle == INVALID_HANDLE_VALUE && read_write)\n+ handle = OpenDeviceHandle(path, GENERIC_READ);\n+\n+ if (handle == INVALID_HANDLE_VALUE)\n+ {\n+ ERROR_LOG_FMT(COMMON, "Failed to open optical drive {}: {}", path, GetLastErrorString());\n+ return false;\n+ }\n+\n+ m_handle = handle;\n+ m_path = path;\n+ return true;\n+}\n+\n+void SCSIDevice::Close()\n+{\n+ if (m_handle != nullptr)\n+ {\n+ CloseHandle(m_handle);\n+ m_handle = nullptr;\n+ }\n+}\n+\n+bool SCSIDevice::IsOpen() const\n+{\n+ return m_handle != nullptr;\n+}\n+\n+bool SCSIDevice::SendCommand(std::span<const u8> cdb, std::span<u8> buffer,\n+ SCSIDataDirection direction, u32 timeout_seconds,\n+ SCSISense* sense) const\n+{\n+ if (!IsOpen() || cdb.empty())\n+ return false;\n+\n+ DEBUG_LOG_FMT(COMMON, "Sending SCSI opcode {:02X} to {} ({} data bytes)", cdb[0], m_path,\n+ buffer.size());\n+\n+ SPTDWithSense sptd{};\n+ if (!SendPassThrough(m_handle, cdb, buffer, direction, timeout_seconds, &sptd))\n+ {\n+ ERROR_LOG_FMT(COMMON, "SCSI passthrough for opcode {:02X} failed: {}", cdb[0],\n+ GetLastErrorString());\n+ return false;\n+ }\n+\n+ SCSISense decoded;\n+ DecodeSense(sptd, &decoded);\n+ if (sense != nullptr)\n+ *sense = decoded;\n+\n+ // Any status other than 0x00 (GOOD) is a device-side failure\n+ if (decoded.status != 0)\n+ {\n+ ERROR_LOG_FMT(COMMON,\n+ "SCSI opcode {:02X} failed. Status: {:02X}, Sense Key: {:02X}, ASC: {:02X}, "\n+ "ASCQ: {:02X}",\n+ cdb[0], decoded.status, decoded.sense_key, decoded.asc, decoded.ascq);\n+ return false;\n+ }\n+ return true;\n+}\n+\n+OpticalDriveStatus SCSIDevice::GetDriveStatus(const std::string& path)\n+{\n+ HANDLE handle = OpenDeviceHandle(path, GENERIC_READ | GENERIC_WRITE);\n+ if (handle == INVALID_HANDLE_VALUE)\n+ handle = OpenDeviceHandle(path, GENERIC_READ);\n+\n+ if (handle == INVALID_HANDLE_VALUE)\n+ {\n+ const DWORD error = GetLastError();\n+ if (error == ERROR_NOT_READY || error == ERROR_MEDIA_CHANGED)\n+ return OpticalDriveStatus::NoDisc;\n+ return OpticalDriveStatus::NotReadyOther;\n+ }\n+\n+ // TEST UNIT READY (opcode 0x00). A spinning-up drive answers it at once with a CHECK CONDITION\n+ // (sense 02/04/01), so a short timeout returns the real state instead of waiting for the drive\n+ constexpr std::array<u8, 6> cdb{};\n+ DEBUG_LOG_FMT(COMMON, "Sending SCSI opcode {:02X} to {} (0 data bytes)", cdb[0], path);\n+ SPTDWithSense sptd{};\n+ const bool sent =\n+ SendPassThrough(handle, cdb, {}, SCSIDataDirection::In, STATUS_PROBE_TIMEOUT_SECONDS, &sptd);', 'path': 'Source/Core/Common/SCSIDevice.cpp', 'position': 220, 'original_position': 220, 'commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'user': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'SCSIDataDirection says "Commands without a data phase use Out with an empty buffer" but this uses `In\u200b`, is this intentional?', 'created_at': '2026-11-03T08:47:12Z', 'updated_at': '2026-11-03T12:21:18Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4452521727', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'author_association': 'MEMBER', '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4452521727'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4452521727'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974'}}, 'original_commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4452521727/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'is_copilot_code_review': False, 'copilot_code_review_sources': []}, {'id': 4453291256, 'node_id': 'PRRC_kwDOALCn2M8AAAABCW_U-A', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4453291256', 'pull_request_review_id': 5749202729, 'diff_hunk': '@@ -0,0 +1,776 @@\n+// Copyright 2026 Dolphin Emulator Project', 'path': 'Source/Core/Common/SCSIDevice.cpp', 'position': 1, 'original_position': 1, 'commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'user': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'What do you think about splitting this file into multiple source files per platform? i.e. "SCSIDeviceLinux" etc.', 'created_at': '2026-11-03T10:10:46Z', 'updated_at': '2026-11-03T12:21:18Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4453291256', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'author_association': 'MEMBER', '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4453291256'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4453291256'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974'}}, 'original_commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4453291256/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'is_copilot_code_review': False, 'copilot_code_review_sources': []}, {'id': 4454423062, 'node_id': 'PRRC_kwDOALCn2M8AAAABCYEaFg', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4454423062', 'pull_request_review_id': 5749202729, 'diff_hunk': '@@ -122,9 +122,9 @@ void GameConfigWidget::CreateWidgets()\n tr("Synchronizes the GPU and CPU threads to help prevent random freezes "\n "in Dual core mode. (ON = Compatible, OFF = Fast)"));\n m_emulate_disc_speed->SetDescription(\n- tr("Enable emulated disc speed. Disabling this can cause crashes "\n- "and other problems in some games. "\n- "(ON = Compatible, OFF = Unlocked)"));\n+ tr("Enable emulated disc speed. Disabling this can cause crashes and other problems in some "\n+ "games. This setting is ignored when booting from an optical disc. (ON = Compatible, OFF "\n+ "= Unlocked)"));', 'path': 'Source/Core/DolphinQt/Config/GameConfigWidget.cpp', 'position': 9, 'original_position': 9, 'commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'user': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'This is just a style preference, but\n```suggestion\n tr("Enable emulated disc speed. Disabling this can cause crashes and other problems in some "\n "games. This setting is ignored when booting from an optical disc. "\n "(ON = Compatible, OFF = Unlocked)"));\n```', 'created_at': '2026-11-03T12:07:09Z', 'updated_at': '2026-11-03T12:21:18Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4454423062', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'author_association': 'MEMBER', '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4454423062'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4454423062'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974'}}, 'original_commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4454423062/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'is_copilot_code_review': False, 'copilot_code_review_sources': []}, {'id': 4454462737, 'node_id': 'PRRC_kwDOALCn2M8AAAABCYG1EQ', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4454462737', 'pull_request_review_id': 5749202729, 'diff_hunk': '@@ -251,6 +252,7 @@ class MainWindow final : public QMainWindow\n bool m_fullscreen_requested = false;\n bool m_is_screensaver_inhibited = false;\n std::unique_ptr<BootParameters> m_pending_boot;\n+ std::optional<std::string> m_optical_drive;', 'path': 'Source/Core/DolphinQt/MainWindow.h', 'position': 12, 'original_position': 12, 'commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'user': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': "I'm not sure why `MainWindow` needs to keep track of this since `DVDInterface` already does? Could it just use `GetInsertedOpticalDrive`?", 'created_at': '2026-11-03T12:11:35Z', 'updated_at': '2026-11-03T12:21:18Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4454462737', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'author_association': 'MEMBER', '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4454462737'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4454462737'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974'}}, 'original_commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4454462737/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'is_copilot_code_review': False, 'copilot_code_review_sources': []}], 'type': 'gh_pull_request_review'}
2026-11-03T12:21:21.414774 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'JoshuaVandaele', 'action': 'edited', 'pr_id': 14974, 'pr_title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'state': 'commented', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14974#pullrequestreview-5749202729', 'comments': [{'id': 4452462887, 'node_id': 'PRRC_kwDOALCn2M8AAAABCWMxJw', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4452462887', 'pull_request_review_id': 5749202729, 'diff_hunk': '@@ -0,0 +1,94 @@\n+// Copyright 2026 Dolphin Emulator Project\n+// SPDX-License-Identifier: GPL-2.0-or-later\n+\n+#pragma once\n+\n+#include <functional>\n+#include <map>\n+#include <memory>\n+#include <optional>\n+#include <string>\n+#include <vector>\n+\n+#include <QObject>\n+#include <QString>\n+\n+#include "Common/Flag.h"\n+#include "Common/SCSIDevice.h"\n+#include "Common/WorkQueueThread.h"\n+#include "DiscIO/OmniDrive.h"\n+\n+// Lists the host\'s optical drives at once and fills in what is known about each from a drive cache\n+// that lasts until Dolphin exits. Only a drive new to the cache is queried for its firmware, once,\n+// on a worker thread, so the UI never waits for a drive and known drives are left alone.', 'path': 'Source/Core/DolphinQt/OpticalDriveWatcher.h', 'position': 23, 'original_position': 23, 'commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'user': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': '`GetCachedIdentity` and `Refresh` both call `GetDriveInfo` on the UI thread, which on Linux runs `GetSerialNumber`, which waits for a drive', 'created_at': '2026-11-03T08:40:06Z', 'updated_at': '2026-11-03T12:21:18Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4452462887', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'author_association': 'MEMBER', '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4452462887'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4452462887'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974'}}, 'original_commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4452462887/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'is_copilot_code_review': False, 'copilot_code_review_sources': []}, {'id': 4452521727, 'node_id': 'PRRC_kwDOALCn2M8AAAABCWQW_w', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4452521727', 'pull_request_review_id': 5749202729, 'diff_hunk': '@@ -0,0 +1,776 @@\n+// Copyright 2026 Dolphin Emulator Project\n+// SPDX-License-Identifier: GPL-2.0-or-later\n+\n+#include "Common/SCSIDevice.h"\n+\n+#include <algorithm>\n+#include <array>\n+#include <cctype>\n+#include <cerrno>\n+#include <cstddef>\n+#include <filesystem>\n+#include <map>\n+#include <mutex>\n+#include <optional>\n+#include <span>\n+#include <string>\n+#include <string_view>\n+#include <system_error>\n+#include <vector>\n+\n+#include <fmt/format.h>\n+\n+#if defined(_WIN32)\n+#include <windows.h>\n+#include <winioctl.h>\n+\n+#include <ntddscsi.h>\n+#include <ntddstor.h>\n+#elif defined(__linux__) && !defined(__ANDROID__)\n+#include <fcntl.h>\n+#include <scsi/sg.h>\n+#include <sys/ioctl.h>\n+#include <unistd.h>\n+#endif\n+\n+#include "Common/CommonFuncs.h"\n+#include "Common/CommonTypes.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Logging/Log.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+\n+namespace Common\n+{\n+SCSIDevice::~SCSIDevice()\n+{\n+ Close();\n+}\n+\n+#if defined(_WIN32)\n+\n+namespace\n+{\n+// Timeout for the TEST UNIT READY that reads drive status. Short, so a spinning-up drive is\n+// reported as such at once instead of blocking until it is ready\n+constexpr u32 STATUS_PROBE_TIMEOUT_SECONDS = 1;\n+} // namespace\n+\n+namespace\n+{\n+// SCSI_PASS_THROUGH_DIRECT and its sense buffer in one contiguous block, so the kernel can write\n+// sense data at SenseInfoOffset\n+struct SPTDWithSense\n+{\n+ SCSI_PASS_THROUGH_DIRECT sptd;\n+ std::array<u8, 24> sense;\n+};\n+\n+std::wstring ToDevicePath(const std::string& path)\n+{\n+ return UTF8ToWString(R"(\\\\.\\)" + path);\n+}\n+\n+HANDLE OpenDeviceHandle(const std::string& path, DWORD access)\n+{\n+ return CreateFileW(ToDevicePath(path).c_str(), access, FILE_SHARE_READ | FILE_SHARE_WRITE,\n+ nullptr, OPEN_EXISTING, 0, nullptr);\n+}\n+\n+void DecodeSense(const SPTDWithSense& sptd, SCSISense* sense)\n+{\n+ sense->status = sptd.sptd.ScsiStatus;\n+ sense->sense_key = sptd.sense[2] & 0x0F;\n+ sense->asc = sptd.sense[12];\n+ sense->ascq = sptd.sense[13];\n+}\n+\n+// Returns false only if the OS rejects the IOCTL itself\n+bool SendPassThrough(HANDLE handle, std::span<const u8> cdb, std::span<u8> buffer,\n+ SCSIDataDirection direction, u32 timeout_seconds, SPTDWithSense* sptd)\n+{\n+ if (cdb.size() > sizeof(SCSI_PASS_THROUGH_DIRECT::Cdb))\n+ return false;\n+\n+ *sptd = {};\n+ sptd->sptd.Length = sizeof(SCSI_PASS_THROUGH_DIRECT);\n+ sptd->sptd.CdbLength = static_cast<UCHAR>(cdb.size());\n+ sptd->sptd.SenseInfoLength = static_cast<UCHAR>(sptd->sense.size());\n+ sptd->sptd.DataIn = static_cast<UCHAR>(direction);\n+ sptd->sptd.DataTransferLength = static_cast<ULONG>(buffer.size());\n+ sptd->sptd.TimeOutValue = timeout_seconds;\n+ sptd->sptd.DataBuffer = buffer.empty() ? nullptr : buffer.data();\n+ sptd->sptd.SenseInfoOffset = static_cast<ULONG>(offsetof(SPTDWithSense, sense));\n+ std::ranges::copy(cdb, sptd->sptd.Cdb);\n+\n+ DWORD bytes_returned = 0;\n+ return DeviceIoControl(handle, IOCTL_SCSI_PASS_THROUGH_DIRECT, sptd, sizeof(*sptd), sptd,\n+ sizeof(*sptd), &bytes_returned, nullptr) != FALSE;\n+}\n+\n+std::string ReadDescriptorString(std::span<const u8> data, u32 offset)\n+{\n+ if (offset == 0 || offset >= data.size())\n+ return {};\n+ const std::string_view text(reinterpret_cast<const char*>(data.data()) + offset,\n+ data.size() - offset);\n+ return std::string(StripWhitespace(text.substr(0, text.find(\'\\0\'))));\n+}\n+} // namespace\n+\n+bool SCSIDevice::IsSupported()\n+{\n+ return true;\n+}\n+\n+bool SCSIDevice::Open(const std::string& path, bool read_write)\n+{\n+ Close();\n+\n+ DWORD desired_access = GENERIC_READ;\n+ if (read_write)\n+ desired_access |= GENERIC_WRITE;\n+\n+ HANDLE handle = OpenDeviceHandle(path, desired_access);\n+\n+ // Standard user accounts can be refused GENERIC_WRITE, so fall back to read-only before failing\n+ if (handle == INVALID_HANDLE_VALUE && read_write)\n+ handle = OpenDeviceHandle(path, GENERIC_READ);\n+\n+ if (handle == INVALID_HANDLE_VALUE)\n+ {\n+ ERROR_LOG_FMT(COMMON, "Failed to open optical drive {}: {}", path, GetLastErrorString());\n+ return false;\n+ }\n+\n+ m_handle = handle;\n+ m_path = path;\n+ return true;\n+}\n+\n+void SCSIDevice::Close()\n+{\n+ if (m_handle != nullptr)\n+ {\n+ CloseHandle(m_handle);\n+ m_handle = nullptr;\n+ }\n+}\n+\n+bool SCSIDevice::IsOpen() const\n+{\n+ return m_handle != nullptr;\n+}\n+\n+bool SCSIDevice::SendCommand(std::span<const u8> cdb, std::span<u8> buffer,\n+ SCSIDataDirection direction, u32 timeout_seconds,\n+ SCSISense* sense) const\n+{\n+ if (!IsOpen() || cdb.empty())\n+ return false;\n+\n+ DEBUG_LOG_FMT(COMMON, "Sending SCSI opcode {:02X} to {} ({} data bytes)", cdb[0], m_path,\n+ buffer.size());\n+\n+ SPTDWithSense sptd{};\n+ if (!SendPassThrough(m_handle, cdb, buffer, direction, timeout_seconds, &sptd))\n+ {\n+ ERROR_LOG_FMT(COMMON, "SCSI passthrough for opcode {:02X} failed: {}", cdb[0],\n+ GetLastErrorString());\n+ return false;\n+ }\n+\n+ SCSISense decoded;\n+ DecodeSense(sptd, &decoded);\n+ if (sense != nullptr)\n+ *sense = decoded;\n+\n+ // Any status other than 0x00 (GOOD) is a device-side failure\n+ if (decoded.status != 0)\n+ {\n+ ERROR_LOG_FMT(COMMON,\n+ "SCSI opcode {:02X} failed. Status: {:02X}, Sense Key: {:02X}, ASC: {:02X}, "\n+ "ASCQ: {:02X}",\n+ cdb[0], decoded.status, decoded.sense_key, decoded.asc, decoded.ascq);\n+ return false;\n+ }\n+ return true;\n+}\n+\n+OpticalDriveStatus SCSIDevice::GetDriveStatus(const std::string& path)\n+{\n+ HANDLE handle = OpenDeviceHandle(path, GENERIC_READ | GENERIC_WRITE);\n+ if (handle == INVALID_HANDLE_VALUE)\n+ handle = OpenDeviceHandle(path, GENERIC_READ);\n+\n+ if (handle == INVALID_HANDLE_VALUE)\n+ {\n+ const DWORD error = GetLastError();\n+ if (error == ERROR_NOT_READY || error == ERROR_MEDIA_CHANGED)\n+ return OpticalDriveStatus::NoDisc;\n+ return OpticalDriveStatus::NotReadyOther;\n+ }\n+\n+ // TEST UNIT READY (opcode 0x00). A spinning-up drive answers it at once with a CHECK CONDITION\n+ // (sense 02/04/01), so a short timeout returns the real state instead of waiting for the drive\n+ constexpr std::array<u8, 6> cdb{};\n+ DEBUG_LOG_FMT(COMMON, "Sending SCSI opcode {:02X} to {} (0 data bytes)", cdb[0], path);\n+ SPTDWithSense sptd{};\n+ const bool sent =\n+ SendPassThrough(handle, cdb, {}, SCSIDataDirection::In, STATUS_PROBE_TIMEOUT_SECONDS, &sptd);', 'path': 'Source/Core/Common/SCSIDevice.cpp', 'position': 220, 'original_position': 220, 'commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'user': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'SCSIDataDirection says "Commands without a data phase use Out with an empty buffer" but this uses `In\u200b`, is this intentional?', 'created_at': '2026-11-03T08:47:12Z', 'updated_at': '2026-11-03T12:21:18Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4452521727', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'author_association': 'MEMBER', '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4452521727'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4452521727'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974'}}, 'original_commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4452521727/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'is_copilot_code_review': False, 'copilot_code_review_sources': []}, {'id': 4453291256, 'node_id': 'PRRC_kwDOALCn2M8AAAABCW_U-A', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4453291256', 'pull_request_review_id': 5749202729, 'diff_hunk': '@@ -0,0 +1,776 @@\n+// Copyright 2026 Dolphin Emulator Project', 'path': 'Source/Core/Common/SCSIDevice.cpp', 'position': 1, 'original_position': 1, 'commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'user': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'What do you think about splitting this file into multiple source files per platform? i.e. "SCSIDeviceLinux" etc.', 'created_at': '2026-11-03T10:10:46Z', 'updated_at': '2026-11-03T12:21:18Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4453291256', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'author_association': 'MEMBER', '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4453291256'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4453291256'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974'}}, 'original_commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4453291256/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'is_copilot_code_review': False, 'copilot_code_review_sources': []}, {'id': 4454423062, 'node_id': 'PRRC_kwDOALCn2M8AAAABCYEaFg', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4454423062', 'pull_request_review_id': 5749202729, 'diff_hunk': '@@ -122,9 +122,9 @@ void GameConfigWidget::CreateWidgets()\n tr("Synchronizes the GPU and CPU threads to help prevent random freezes "\n "in Dual core mode. (ON = Compatible, OFF = Fast)"));\n m_emulate_disc_speed->SetDescription(\n- tr("Enable emulated disc speed. Disabling this can cause crashes "\n- "and other problems in some games. "\n- "(ON = Compatible, OFF = Unlocked)"));\n+ tr("Enable emulated disc speed. Disabling this can cause crashes and other problems in some "\n+ "games. This setting is ignored when booting from an optical disc. (ON = Compatible, OFF "\n+ "= Unlocked)"));', 'path': 'Source/Core/DolphinQt/Config/GameConfigWidget.cpp', 'position': 9, 'original_position': 9, 'commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'user': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'This is just a style preference, but\n```suggestion\n tr("Enable emulated disc speed. Disabling this can cause crashes and other problems in some "\n "games. This setting is ignored when booting from an optical disc. "\n "(ON = Compatible, OFF = Unlocked)"));\n```', 'created_at': '2026-11-03T12:07:09Z', 'updated_at': '2026-11-03T12:21:18Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4454423062', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'author_association': 'MEMBER', '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4454423062'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4454423062'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974'}}, 'original_commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4454423062/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'is_copilot_code_review': False, 'copilot_code_review_sources': []}, {'id': 4454462737, 'node_id': 'PRRC_kwDOALCn2M8AAAABCYG1EQ', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4454462737', 'pull_request_review_id': 5749202729, 'diff_hunk': '@@ -251,6 +252,7 @@ class MainWindow final : public QMainWindow\n bool m_fullscreen_requested = false;\n bool m_is_screensaver_inhibited = false;\n std::unique_ptr<BootParameters> m_pending_boot;\n+ std::optional<std::string> m_optical_drive;', 'path': 'Source/Core/DolphinQt/MainWindow.h', 'position': 12, 'original_position': 12, 'commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'user': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': "I'm not sure why `MainWindow` needs to keep track of this since `DVDInterface` already does? Could it just use `GetInsertedOpticalDrive`?", 'created_at': '2026-11-03T12:11:35Z', 'updated_at': '2026-11-03T12:21:18Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4454462737', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'author_association': 'MEMBER', '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4454462737'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4454462737'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974'}}, 'original_commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4454462737/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'is_copilot_code_review': False, 'copilot_code_review_sources': []}], 'type': 'gh_pull_request_review'}
2026-11-03T09:31:33.568812 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'dismissed', 'pr_id': 13653, 'pr_title': 'UICommon/GameFile: File name column will show the directory name for extracted games', 'state': 'dismissed', 'url': 'https://github.com/dolphin-emu/dolphin/pull/13653#pullrequestreview-2838078461', 'comments': [{'id': 2087603911, 'node_id': 'PRRC_kwDOALCn2M58bk7H', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/2087603911', 'pull_request_review_id': 2838078461, 'diff_hunk': '@@ -350,6 +355,30 @@ bool GameFile::IsElfOrDol() const\n return extension == ".elf" || extension == ".dol";\n }\n \n+// Function for finding the folder name two (three if a Wii game) directories up for use in the file\n+// name column for extracted games Returns a blank string if the folder can\'t be found\n+std::string GameFile::FindFolderName() const\n+{\n+#ifdef HAS_STD_FILESYSTEM', 'path': 'Source/Core/UICommon/GameFile.cpp', 'position': 1, 'original_position': 31, 'commit_id': 'b9d2a433bf316d2f471d5d88674f9333411cdc08', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': '`HAS_STD_FILESYSTEM` was eliminated in #10994. You can rely on `std::filesystem` being available. The alternate implementation can be eliminated.', 'created_at': '2025-05-13T20:45:24Z', 'updated_at': '2025-05-13T20:45:27Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/13653#discussion_r2087603911', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/13653', 'author_association': 'MEMBER', '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/2087603911'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/13653#discussion_r2087603911'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/13653'}}, 'original_commit_id': '8d55bc143bd9fcb95cecc73587db25b66600fbd3', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/2087603911/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'is_copilot_code_review': False, 'copilot_code_review_sources': []}], 'type': 'gh_pull_request_review'}
2026-11-03T05:58:12.764262 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'submitted', 'pr_id': 14976, 'pr_title': "WiimoteDevice: Don't send output reports to a null HID source", 'state': 'approved', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14976#pullrequestreview-5747815285', 'comments': [], 'type': 'gh_pull_request_review'}
2026-11-03T04:28:07.138381 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'submitted', 'pr_id': 14976, 'pr_title': "WiimoteDevice: Don't send output reports to a null HID source", 'state': 'commented', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14976#pullrequestreview-5747270443', 'comments': [{'id': 4450920669, 'node_id': 'PRRC_kwDOALCn2M8AAAABCUuo3Q', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4450920669', 'pull_request_review_id': 5747270443, 'diff_hunk': '@@ -462,7 +463,12 @@ void WiimoteDevice::ExecuteL2capCmd(u8* ptr, u32 size)\n {\n const u8 hid_type = data[0];\n if (hid_type == ((WiimoteCommon::HID_TYPE_DATA << 4) | WiimoteCommon::HID_PARAM_OUTPUT))\n- m_hid_source->InterruptDataOutput(data + sizeof(hid_type), data_size - sizeof(hid_type));\n+ {\n+ // The source may have been removed (e.g. a real Wii Remote that is no longer connected)\n+ // while the game still has an open channel.\n+ if (m_hid_source)\n+ m_hid_source->InterruptDataOutput(data + sizeof(hid_type), data_size - sizeof(hid_type));\n+ }\n else\n ERROR_LOG_FMT(IOS_WIIMOTE, "Unknown HID-type ({:#x}) on L2CAP_PSM_HID_INTR", hid_type);', 'path': 'Source/Core/Core/IOS/USB/Bluetooth/WiimoteDevice.cpp', 'position': 22, 'original_position': 22, 'commit_id': 'eb3c2ac446b6613a4a82b56034420d2f600b5a7c', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'Also, please amend the existing commit when you adjust this.', 'created_at': '2026-11-03T04:28:04Z', 'updated_at': '2026-11-03T04:28:05Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14976#discussion_r4450920669', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14976', 'author_association': 'MEMBER', '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4450920669'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14976#discussion_r4450920669'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14976'}}, 'original_commit_id': 'eb3c2ac446b6613a4a82b56034420d2f600b5a7c', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4450920669/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'in_reply_to_id': 4450910740, 'is_copilot_code_review': False, 'copilot_code_review_sources': []}], 'type': 'gh_pull_request_review'}
2026-11-03T04:25:59.385328 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'submitted', 'pr_id': 14976, 'pr_title': "WiimoteDevice: Don't send output reports to a null HID source", 'state': 'commented', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14976#pullrequestreview-5747258721', 'comments': [{'id': 4450910740, 'node_id': 'PRRC_kwDOALCn2M8AAAABCUuCFA', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4450910740', 'pull_request_review_id': 5747258721, 'diff_hunk': '@@ -462,7 +463,12 @@ void WiimoteDevice::ExecuteL2capCmd(u8* ptr, u32 size)\n {\n const u8 hid_type = data[0];\n if (hid_type == ((WiimoteCommon::HID_TYPE_DATA << 4) | WiimoteCommon::HID_PARAM_OUTPUT))\n- m_hid_source->InterruptDataOutput(data + sizeof(hid_type), data_size - sizeof(hid_type));\n+ {\n+ // The source may have been removed (e.g. a real Wii Remote that is no longer connected)\n+ // while the game still has an open channel.\n+ if (m_hid_source)\n+ m_hid_source->InterruptDataOutput(data + sizeof(hid_type), data_size - sizeof(hid_type));\n+ }\n else\n ERROR_LOG_FMT(IOS_WIIMOTE, "Unknown HID-type ({:#x}) on L2CAP_PSM_HID_INTR", hid_type);', 'path': 'Source/Core/Core/IOS/USB/Bluetooth/WiimoteDevice.cpp', 'position': 22, 'original_position': 22, 'commit_id': 'eb3c2ac446b6613a4a82b56034420d2f600b5a7c', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'Please use curly-braces on the `else` now that the `if` has them.\n```suggestion\n {\n ERROR_LOG_FMT(IOS_WIIMOTE, "Unknown HID-type ({:#x}) on L2CAP_PSM_HID_INTR", hid_type);\n }\n```', 'created_at': '2026-11-03T04:25:56Z', 'updated_at': '2026-11-03T04:25:56Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14976#discussion_r4450910740', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14976', 'author_association': 'MEMBER', '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4450910740'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14976#discussion_r4450910740'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14976'}}, 'original_commit_id': 'eb3c2ac446b6613a4a82b56034420d2f600b5a7c', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4450910740/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'is_copilot_code_review': False, 'copilot_code_review_sources': []}], 'type': 'gh_pull_request_review'}
2026-11-03T01:30:49.749726 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'submitted', 'pr_id': 13704, 'pr_title': 'CMake: Fix relative pathing when project is imported', 'state': 'approved', 'url': 'https://github.com/dolphin-emu/dolphin/pull/13704#pullrequestreview-5745922645', 'comments': [], 'type': 'gh_pull_request_review'}
2026-11-03T01:25:35.658336 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'submitted', 'pr_id': 13958, 'pr_title': 'Added guide for beginners', 'state': 'commented', 'url': 'https://github.com/dolphin-emu/dolphin/pull/13958#pullrequestreview-5745872620', 'comments': [{'id': 4449816356, 'node_id': 'PRRC_kwDOALCn2M8AAAABCTrPJA', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4449816356', 'pull_request_review_id': 5745872620, 'diff_hunk': '@@ -26,6 +27,12 @@ Also, this probably goes without saying, but piracy is strictly forbidden both o\n \n If you make any contributions to Dolphin after December 1st, 2014, you are agreeing that any code you have contributed will be licensed under the GNU GPL version 2 (or any later version).\n \n+# <a name="prerequisites">Before You Start\n+\n+This is an emulator, that means that it runs games by emulating other hardware (in this case, the Wii and GameCube). In order to contribute, you will need to understand how these consoles work. You can learn this by:\n+ - Searching on the web how they work (for example, on [WiiBrew](https://wiibrew.org/wiki/Main_Page) or [YAGCD](https://www.gc-forever.com/yagcd/)).\n+ - Manually reverse engineering the Wii/GameCube console.', 'path': 'Contributing.md', 'position': 16, 'original_position': 16, 'commit_id': 'd15ca355a23242d80ff0cf41d2162522bc1e4aac', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': "I also think this is out of place.\nThere's much code in Dolphin worth contributing to that doesn't require any knowledge of the emulated systems.", 'created_at': '2026-11-03T01:25:32Z', 'updated_at': '2026-11-03T01:25:32Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/13958#discussion_r4449816356', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/13958', 'author_association': 'MEMBER', '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4449816356'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/13958#discussion_r4449816356'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/13958'}}, 'original_commit_id': 'd15ca355a23242d80ff0cf41d2162522bc1e4aac', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4449816356/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'is_copilot_code_review': False, 'copilot_code_review_sources': []}], 'type': 'gh_pull_request_review'}
2026-11-03T01:07:34.795763 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'mbc07', 'action': 'submitted', 'pr_id': 14974, 'pr_title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'state': 'commented', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14974#pullrequestreview-5745694670', 'comments': [{'id': 4449680417, 'node_id': 'PRRC_kwDOALCn2M8AAAABCTi8IQ', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4449680417', 'pull_request_review_id': 5745694670, 'diff_hunk': '@@ -104,13 +112,20 @@ void DVDThread::SetDisc(std::unique_ptr<DiscIO::Volume> disc)\n {\n WaitUntilIdle();\n m_disc = std::move(disc);\n+\n+ m_host_paced = m_disc && m_disc->GetBlobReader().GetBlobType() == DiscIO::BlobType::DRIVE;', 'path': 'Source/Core/Core/HW/DVD/DVDThread.cpp', 'position': 44, 'original_position': 44, 'commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'The emulated timings simply does not work with any PC drive I could test. It didn\'t work with the drives from when the original "Boot from DVD Backup" was added, and it still doesn\'t work with the drives we have now, which are far more advanced and pretty much the end of the line regarding technological improvements, since nearly all drive manufacturers had already quit this business by now.\r\n\r\nI\'d argue bypassing the emulated disc timings is a hard requirement for this feature, and that\'s why it\'s unconditionally bypassed in this PR when a physical disc is involved. Having it active keeps the same stuttery and unusable mess from the old feature, as it keeps stalling the CPU thread if the data doesn\'t arrive exactly when the emulated timing enforces. By bypassing it, the stuttering is entirely gone and even though we\'re not matching the GC/Wii anymore, every single game I tested so far was very forgiving of the actual disc timings. They also hold up surprisingly well when deliberately induced to worse conditions, like running with emulated speed limiter a bit above 100% or locking the optical drive to slower read speeds, but of course, if you push things too far, they will break.\r\n\r\nFor instance, sequential read speed of modern PC drives (as well as the ones compatible with OmniDrive) far exceeds the GC/Wii drives, but when seeking is involved they can perform worse, and the emulated disc timings are simply too strict with that. I\'m confident that seeking can be minimized enough to be a non-issue with some caching, since at the moment there\'s none being done in this PR.\r\n\r\nRight now this seems limited to GC games with DTK audio, as the optical drive keeps constantly seeking back and forth between the location containing the audio that\'s being streamed and the location that contains the data the game is requesting, always returning just a few sectors, which is wasteful considering the penalty of a seek in modern drives. ', 'created_at': '2026-11-03T01:07:32Z', 'updated_at': '2026-11-03T01:07:33Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4449680417', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'author_association': 'MEMBER', '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4449680417'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4449680417'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974'}}, 'original_commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4449680417/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'in_reply_to_id': 4449247429, 'is_copilot_code_review': False, 'copilot_code_review_sources': []}], 'type': 'gh_pull_request_review'}
2026-11-03T01:01:40.566260 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'submitted', 'pr_id': 14450, 'pr_title': 'Common/MemArena: make shared memory name unique per DLL instance', 'state': 'commented', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14450#pullrequestreview-5745629669', 'comments': [{'id': 4449628425, 'node_id': 'PRRC_kwDOALCn2M8AAAABCTfxCQ', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4449628425', 'pull_request_review_id': 5745629669, 'diff_hunk': '@@ -120,10 +120,40 @@ static DWORD GetLowDWORD(u64 value)\n \n void MemArena::GrabSHMSegment(size_t size, std::string_view base_name)\n {\n- const std::string name = fmt::format("{}.{}", base_name, GetCurrentProcessId());\n- m_memory_handle =\n- CreateFileMapping(INVALID_HANDLE_VALUE, nullptr, PAGE_READWRITE, GetHighDWORD(size),\n- GetLowDWORD(size), UTF8ToTStr(name).c_str());\n+ // If a mapping of the given name already exists, CreateFileMapping() does not fail. It hands back\n+ // a handle to that existing mapping instead, using its size rather than the requested one.\n+ // Silently sharing another arena\'s memory is never what we want, so keep appending a counter\n+ // until we get a mapping we actually created. MemArenaUnix gets this for free via O_EXCL.\n+ //\n+ // The name only distinguishes processes, so a collision happens whenever two arenas coexist\n+ // within one process, which is the case if multiple copies of this code are loaded as a library.\n+ constexpr u32 MAX_ATTEMPTS = 256;\n+ for (u32 counter = 0; counter < MAX_ATTEMPTS; ++counter)', 'path': 'Source/Core/Common/MemArenaWin.cpp', 'position': 16, 'original_position': 16, 'commit_id': '8d48b7326d361622969a5abcb6a6e91afc105782', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'Would it make more sense to use a nanosecond timer instead of a counter?\nI suppose the current state of this would take N iterations to succeed whereas a timer would probably just take one.', 'created_at': '2026-11-03T01:01:37Z', 'updated_at': '2026-11-03T01:01:37Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14450#discussion_r4449628425', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14450', 'author_association': 'MEMBER', '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4449628425'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14450#discussion_r4449628425'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14450'}}, 'original_commit_id': '8d48b7326d361622969a5abcb6a6e91afc105782', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4449628425/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'is_copilot_code_review': False, 'copilot_code_review_sources': []}], 'type': 'gh_pull_request_review'}
2026-11-03T00:51:48.589542 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'submitted', 'pr_id': 14819, 'pr_title': 'DriverDetails: Set fixed versions for old Adreno bugs', 'state': 'approved', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14819#pullrequestreview-5745541733', 'comments': [], 'type': 'gh_pull_request_review'}
2026-11-03T00:49:07.993181 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'submitted', 'pr_id': 14923, 'pr_title': 'NetPlay: bound pending timebase reports', 'state': 'approved', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14923#pullrequestreview-5745520820', 'comments': [], 'type': 'gh_pull_request_review'}
2026-11-03T00:32:59.879040 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'submitted', 'pr_id': 14841, 'pr_title': 'cmake: Try newer glslang versions first.', 'state': 'approved', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14841#pullrequestreview-5745406828', 'comments': [], 'type': 'gh_pull_request_review'}
2026-11-03T00:01:24.865626 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'submitted', 'pr_id': 14974, 'pr_title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'state': 'commented', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14974#pullrequestreview-5745168087', 'comments': [{'id': 4449247429, 'node_id': 'PRRC_kwDOALCn2M8AAAABCTIgxQ', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4449247429', 'pull_request_review_id': 5745168087, 'diff_hunk': '@@ -104,13 +112,20 @@ void DVDThread::SetDisc(std::unique_ptr<DiscIO::Volume> disc)\n {\n WaitUntilIdle();\n m_disc = std::move(disc);\n+\n+ m_host_paced = m_disc && m_disc->GetBlobReader().GetBlobType() == DiscIO::BlobType::DRIVE;', 'path': 'Source/Core/Core/HW/DVD/DVDThread.cpp', 'position': 44, 'original_position': 44, 'commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': "> Emulated disc speed code is bypassed when using physical discs\n\nIs there a reason you need to do this?\nI would naively think this should be a non-default option, or maybe not even an option at all?\n\nThe physical drive timing is going to be very unlike the original drive of the GC/Wii.\n\nI'd expect that just using the emulated timing like always would prevent the weird audio errors that are being discussed.", 'created_at': '2026-11-03T00:01:21Z', 'updated_at': '2026-11-03T00:01:21Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4449247429', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'author_association': 'MEMBER', '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4449247429'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4449247429'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974'}}, 'original_commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4449247429/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'is_copilot_code_review': False, 'copilot_code_review_sources': []}], 'type': 'gh_pull_request_review'}
2026-11-02T21:44:36.920446 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'JoshuaVandaele', 'action': 'submitted', 'pr_id': 14972, 'pr_title': 'Minor cleanups with "parenthesized initialization of aggregates".', 'state': 'approved', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14972#pullrequestreview-5743829463', 'comments': [], 'type': 'gh_pull_request_review'}
2026-11-02T21:12:48.771350 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'JoshuaVandaele', 'action': 'edited', 'pr_id': 14973, 'pr_title': 'CubebUtils: Allow selecting the backend that Cubeb uses and update Cubeb in Externals.', 'state': 'approved', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14973#pullrequestreview-5743139527', 'comments': [], 'type': 'gh_pull_request_review'}
2026-11-02T20:50:29.459776 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'JoshuaVandaele', 'action': 'submitted', 'pr_id': 14973, 'pr_title': 'CubebUtils: Allow selecting the backend that Cubeb uses and update Cubeb in Externals.', 'state': 'approved', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14973#pullrequestreview-5743139527', 'comments': [], 'type': 'gh_pull_request_review'}
2026-11-02T20:15:21.813572 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'submitted', 'pr_id': 14774, 'pr_title': 'Refactor the GameCube microphone code', 'state': 'approved', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14774#pullrequestreview-5742725603', 'comments': [], 'type': 'gh_pull_request_review'}
2026-11-02T20:12:55.453123 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'submitted', 'pr_id': 14967, 'pr_title': 'Common: Add helper function to set SO_REUSEADDR on TCP sockets on non-Windows.', 'state': 'commented', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14967#pullrequestreview-5742697269', 'comments': [{'id': 4447219211, 'node_id': 'PRRC_kwDOALCn2M8AAAABCRMuCw', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4447219211', 'pull_request_review_id': 5742697269, 'diff_hunk': '@@ -291,6 +291,9 @@ void WiiSocket::Update(bool read, bool write, bool except)\n memory.CopyFromEmu(&addr, ioctl.buffer_in + 8, sizeof(WiiSockAddrIn));\n sockaddr_in local_name = WiiSockMan::ToNativeAddrIn(addr);\n \n+ if (IsTCP())\n+ Common::SetReuseAddressOnUnix(fd);', 'path': 'Source/Core/Core/IOS/Network/Socket.cpp', 'position': 7, 'original_position': 5, 'commit_id': 'f9913a5b4200d8ce751f5ecbf6f3814c10d6032d', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': "I've added a comment there.", 'created_at': '2026-11-02T20:12:52Z', 'updated_at': '2026-11-02T20:12:52Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14967#discussion_r4447219211', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14967', 'author_association': 'MEMBER', '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4447219211'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14967#discussion_r4447219211'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14967'}}, 'original_commit_id': '47fdf50d2cabd257b7e38387364b6516a9c6b4cc', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4447219211/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'in_reply_to_id': 4444669861, 'is_copilot_code_review': False, 'copilot_code_review_sources': []}], 'type': 'gh_pull_request_review'}
2026-11-02T20:09:04.802168 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'jordan-woyak', 'action': 'submitted', 'pr_id': 14973, 'pr_title': 'CubebUtils: Allow selecting the backend that Cubeb uses and update Cubeb in Externals.', 'state': 'commented', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14973#pullrequestreview-5742654358', 'comments': [{'id': 4447183650, 'node_id': 'PRRC_kwDOALCn2M8AAAABCRKjIg', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4447183650', 'pull_request_review_id': 5742654358, 'diff_hunk': '@@ -67,8 +68,11 @@ std::shared_ptr<cubeb> GetContext()\n ERROR_LOG_FMT(AUDIO, "Error setting cubeb log callback");\n }\n \n+ const auto backend_name_str = Config::Get(Config::MAIN_AUDIO_CUBEB_BACKEND);\n+ const char* const backend_name = backend_name_str.empty() ? nullptr : backend_name_str.c_str();\n+\n cubeb* ctx;\n- if (cubeb_init(&ctx, "Dolphin Emulator", nullptr) != CUBEB_OK)\n+ if (cubeb_init(&ctx, "Dolphin Emulator", backend_name) != CUBEB_OK)', 'path': 'Source/Core/AudioCommon/CubebUtils.cpp', 'position': 19, 'original_position': 17, 'commit_id': '6edc53cad639d7b79a79a9b1467dff7f46a69be1', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'I think this is probably fine?\r\nWe have other settings behave like this, including ones that cause an actual failure on boot.', 'created_at': '2026-11-02T20:09:02Z', 'updated_at': '2026-11-02T20:09:02Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14973#discussion_r4447183650', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14973', 'author_association': 'MEMBER', '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4447183650'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14973#discussion_r4447183650'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14973'}}, 'original_commit_id': 'eba464eab6960fed9b4979ab192c6634ba05ca83', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4447183650/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'in_reply_to_id': 4443317673, 'is_copilot_code_review': False, 'copilot_code_review_sources': []}], 'type': 'gh_pull_request_review'}
2026-11-02T19:32:05.103820 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'mbc07', 'action': 'submitted', 'pr_id': 14975, 'pr_title': 'Flatpak: Do not set the flathub::manifest tag', 'state': 'approved', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14975#pullrequestreview-5742201634', 'comments': [], 'type': 'gh_pull_request_review'}
2026-11-02T18:41:20.109236 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'sepalani', 'action': 'submitted', 'pr_id': 14774, 'pr_title': 'Refactor the GameCube microphone code', 'state': 'commented', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14774#pullrequestreview-5741541813', 'comments': [{'id': 4446312543, 'node_id': 'PRRC_kwDOALCn2M8AAAABCQVYXw', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4446312543', 'pull_request_review_id': 5741541813, 'diff_hunk': '@@ -152,6 +152,16 @@ const Info<ExpansionInterface::EXIDeviceType>& GetInfoForEXIDevice(ExpansionInte\n return *infos[slot];\n }\n \n+const std::array<Info<std::string>, 2> MAIN_EXI_MIC_MICROPHONE{\n+ Info<std::string>{{System::Main, "Core", "ExiMic1Microphone"}, ""},\n+ Info<std::string>{{System::Main, "Core", "ExiMic2Microphone"}, ""}};', 'path': 'Source/Core/Core/Config/MainSettings.cpp', 'position': 1, 'original_position': 6, 'commit_id': '5cf17085f9e6061796058f3aeb4dd4d2c5d5e3aa', 'user': {'login': 'sepalani', 'id': 7890055, 'node_id': 'MDQ6VXNlcjc4OTAwNTU=', 'avatar_url': 'https://avatars.githubusercontent.com/u/7890055?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/sepalani', 'html_url': 'https://github.com/sepalani', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'I went with GCMicA/BMicrophone.', 'created_at': '2026-11-02T18:41:17Z', 'updated_at': '2026-11-02T18:41:18Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14774#discussion_r4446312543', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14774', 'author_association': 'MEMBER', '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4446312543'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14774#discussion_r4446312543'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14774'}}, 'original_commit_id': '5cf17085f9e6061796058f3aeb4dd4d2c5d5e3aa', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4446312543/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'in_reply_to_id': 4439226063, 'is_copilot_code_review': False, 'copilot_code_review_sources': []}], 'type': 'gh_pull_request_review'}
2026-11-02T17:06:41.576184 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'author': 'sepalani', 'action': 'edited', 'pr_id': 14510, 'pr_title': 'EXI: Show on-screen error when USB Gecko fails to bind', 'state': 'approved', 'url': 'https://github.com/dolphin-emu/dolphin/pull/14510#pullrequestreview-5740284494', 'comments': [], 'type': 'gh_pull_request_review'}
Recent 'gh_push' events
2026-11-03T04:44:54.249190 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'pusher': 'jordan-woyak', 'before_sha': 'e8c42467964da77011f7da93a06f9e0a72ca868f', 'after_sha': 'df4bd441dec5d6f3cff606eea76f183963e97a44', 'commits': [{'author': {'name': 'Jordan Woyak', 'email': 'jordan.woyak@gmail.com', 'date': '2026-11-01T21:09:00-06:00', 'username': 'jordan-woyak'}, 'distinct': False, 'added': [], 'modified': ['Source/Core/Core/Debugger/BranchWatch.cpp'], 'removed': [], 'message': 'Core/Debugger: Clean up emplace_back calls with use of "parenthesized initialization of aggregates".', 'url': 'https://github.com/dolphin-emu/dolphin/commit/faae54eec7b0b017f5792fb6c9da2fb5143dcecc', 'hash': 'faae54eec7b0b017f5792fb6c9da2fb5143dcecc'}, {'author': {'name': 'Jordan Woyak', 'email': 'jordan.woyak@gmail.com', 'date': '2026-11-01T21:09:38-06:00', 'username': 'jordan-woyak'}, 'distinct': False, 'added': [], 'modified': ['Source/Core/Common/TypeUtils.h'], 'removed': [], 'message': 'Common/TypeUtils: Remove missing `__cpp_aggregate_paren_init` feature workaround.', 'url': 'https://github.com/dolphin-emu/dolphin/commit/d08bddeaabbfba79f76407018ab02bdf68fa2d46', 'hash': 'd08bddeaabbfba79f76407018ab02bdf68fa2d46'}, {'author': {'name': 'Jordan Woyak', 'email': 'jordan.woyak@gmail.com', 'date': '2026-11-02T22:44:51-06:00', 'username': 'jordan-woyak'}, 'distinct': True, 'added': [], 'modified': ['Source/Core/Common/TypeUtils.h', 'Source/Core/Core/Debugger/BranchWatch.cpp'], 'removed': [], 'message': 'Merge pull request #14972 from jordan-woyak/paren-init-aggregate\n\nMinor cleanups with "parenthesized initialization of aggregates".', 'url': 'https://github.com/dolphin-emu/dolphin/commit/df4bd441dec5d6f3cff606eea76f183963e97a44', 'hash': 'df4bd441dec5d6f3cff606eea76f183963e97a44'}], 'base_ref_name': None, 'ref_name': 'master', 'ref_type': 'heads', 'created': False, 'deleted': False, 'forced': False, 'type': 'gh_push'}
2026-11-02T23:28:05.763684 {'source': 'ghhookparser', 'repo': 'dolphin-emu/sadm', 'pusher': 'OatmealDome', 'before_sha': '7dbfc36649ffe79b77c08995556a0e65e3594cf5', 'after_sha': '3465813deb5cf00bc1966c9ea9b79c9deb3b3cf4', 'commits': [{'author': {'name': 'OatmealDome', 'email': 'julian@oatmealdome.me', 'date': '2026-11-02T17:47:31-05:00', 'username': 'OatmealDome'}, 'distinct': True, 'added': [], 'modified': ['roles/buildbot/etc/flatpak_linter_exceptions.json'], 'removed': [], 'message': 'buildbot: Add appstream-flathub-manifest-key-not-allowed to Flatpak linter exceptions', 'url': 'https://github.com/dolphin-emu/sadm/commit/1cb7e842aa351c276c9410756c12fce38cb5ca89', 'hash': '1cb7e842aa351c276c9410756c12fce38cb5ca89'}, {'author': {'name': 'OatmealDome', 'email': 'julian@oatmealdome.me', 'date': '2026-11-02T18:07:57-05:00', 'username': 'OatmealDome'}, 'distinct': True, 'added': [], 'modified': ['roles/buildbot/etc/master.cfg'], 'removed': [], 'message': 'buildbot: Disable 7z compression filters on macOS\nThe version of libarchive accessible in the NixOS buildbot environment is not able to parse a filter used on macOS 7z.', 'url': 'https://github.com/dolphin-emu/sadm/commit/3465813deb5cf00bc1966c9ea9b79c9deb3b3cf4', 'hash': '3465813deb5cf00bc1966c9ea9b79c9deb3b3cf4'}], 'base_ref_name': None, 'ref_name': 'master', 'ref_type': 'heads', 'created': False, 'deleted': False, 'forced': False, 'type': 'gh_push'}
2026-11-02T20:16:24.358672 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'pusher': 'jordan-woyak', 'before_sha': 'a0ed231ff614ec6e03716d72fa8f3a11ce57c6a0', 'after_sha': 'e8c42467964da77011f7da93a06f9e0a72ca868f', 'commits': [{'author': {'name': 'Ma-Rang', 'email': '266874926+Ma-Rang@users.noreply.github.com', 'date': '2026-03-15T17:40:11-05:00', 'username': 'Ma-Rang'}, 'distinct': False, 'added': [], 'modified': ['Source/Core/Core/HW/EXI/EXI_DeviceGecko.cpp', 'Source/Core/Core/HW/EXI/EXI_DeviceGecko.h'], 'removed': [], 'message': 'EXI: Show on-screen error when USB Gecko fails to bind\n\nPreviously, if the USB Gecko server failed to bind to any port in the\n55020-55030 range, it silently returned with no indication to the user.\nNow displays an on-screen message and logs an error.', 'url': 'https://github.com/dolphin-emu/dolphin/commit/18190eb05d46592e12008050805d9c4bbdbb2138', 'hash': '18190eb05d46592e12008050805d9c4bbdbb2138'}, {'author': {'name': 'Jordan Woyak', 'email': 'jordan.woyak@gmail.com', 'date': '2026-11-02T14:16:21-06:00', 'username': 'jordan-woyak'}, 'distinct': True, 'added': [], 'modified': ['Source/Core/Core/HW/EXI/EXI_DeviceGecko.cpp', 'Source/Core/Core/HW/EXI/EXI_DeviceGecko.h'], 'removed': [], 'message': 'Merge pull request #14510 from Ma-Rang/pr/gecko-bind-error\n\nEXI: Show on-screen error when USB Gecko fails to bind', 'url': 'https://github.com/dolphin-emu/dolphin/commit/e8c42467964da77011f7da93a06f9e0a72ca868f', 'hash': 'e8c42467964da77011f7da93a06f9e0a72ca868f'}], 'base_ref_name': None, 'ref_name': 'master', 'ref_type': 'heads', 'created': False, 'deleted': False, 'forced': False, 'type': 'gh_push'}
2026-11-02T19:46:26.202898 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'pusher': 'jordan-woyak', 'before_sha': 'd182533d363eae8c753d37cfad4107930da2019a', 'after_sha': 'a0ed231ff614ec6e03716d72fa8f3a11ce57c6a0', 'commits': [{'author': {'name': 'Joshua Vandaële', 'email': 'joshua@vandaele.software', 'date': '2026-11-02T18:36:38+01:00', 'username': 'JoshuaVandaele'}, 'distinct': False, 'added': [], 'modified': ['Flatpak/org.DolphinEmu.dolphin-emu.metainfo.xml.in'], 'removed': [], 'message': 'Flatpak: Do not set the flathub::manifest tag\n\nThis resolves the recent build failures introduced by https://github.com/flathub-infra/flatpak-builder-lint/commit/df1c8f992aa5620fc473efe6c6e96b9f3b11e1ba. Nothing seems to break with it being removed.', 'url': 'https://github.com/dolphin-emu/dolphin/commit/2833c12b20e5c3d929f8c27a7742ecadb8a669b4', 'hash': '2833c12b20e5c3d929f8c27a7742ecadb8a669b4'}, {'author': {'name': 'Jordan Woyak', 'email': 'jordan.woyak@gmail.com', 'date': '2026-11-02T13:46:23-06:00', 'username': 'jordan-woyak'}, 'distinct': True, 'added': [], 'modified': ['Flatpak/org.DolphinEmu.dolphin-emu.metainfo.xml.in'], 'removed': [], 'message': 'Merge pull request #14975 from JoshuaVandaele/flathub-manifest\n\nFlatpak: Do not set the flathub::manifest tag', 'url': 'https://github.com/dolphin-emu/dolphin/commit/a0ed231ff614ec6e03716d72fa8f3a11ce57c6a0', 'hash': 'a0ed231ff614ec6e03716d72fa8f3a11ce57c6a0'}], 'base_ref_name': None, 'ref_name': 'master', 'ref_type': 'heads', 'created': False, 'deleted': False, 'forced': False, 'type': 'gh_push'}
2026-11-02T03:35:02.890014 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'pusher': 'jordan-woyak', 'before_sha': 'adf85af9fe9785e891fa99141f6d34907a2d9f12', 'after_sha': 'd182533d363eae8c753d37cfad4107930da2019a', 'commits': [{'author': {'name': 'iwubcode', 'email': 'iwubcode@users.noreply.github.com', 'date': '2026-10-04T20:04:35-05:00', 'username': 'iwubcode'}, 'distinct': False, 'added': [], 'modified': ['Source/Core/VideoBackends/D3D/D3DVertexManager.cpp', 'Source/Core/VideoBackends/D3D/D3DVertexManager.h', 'Source/Core/VideoBackends/D3D12/D3D12VertexManager.cpp', 'Source/Core/VideoBackends/D3D12/D3D12VertexManager.h', 'Source/Core/VideoBackends/OGL/OGLVertexManager.cpp', 'Source/Core/VideoBackends/OGL/OGLVertexManager.h', 'Source/Core/VideoBackends/Vulkan/VKVertexManager.cpp', 'Source/Core/VideoBackends/Vulkan/VKVertexManager.h', 'Source/Core/VideoCommon/VertexManagerBase.cpp', 'Source/Core/VideoCommon/VertexManagerBase.h'], 'removed': [], 'message': 'VideoBackends / VideoCommon: split draw calls into separate commit and render steps', 'url': 'https://github.com/dolphin-emu/dolphin/commit/4fb368cf36342d6b354d93b8711ef7f2e1881023', 'hash': '4fb368cf36342d6b354d93b8711ef7f2e1881023'}, {'author': {'name': 'Jordan Woyak', 'email': 'jordan.woyak@gmail.com', 'date': '2026-11-01T21:35:00-06:00', 'username': 'jordan-woyak'}, 'distinct': True, 'added': [], 'modified': ['Source/Core/VideoBackends/D3D/D3DVertexManager.cpp', 'Source/Core/VideoBackends/D3D/D3DVertexManager.h', 'Source/Core/VideoBackends/D3D12/D3D12VertexManager.cpp', 'Source/Core/VideoBackends/D3D12/D3D12VertexManager.h', 'Source/Core/VideoBackends/OGL/OGLVertexManager.cpp', 'Source/Core/VideoBackends/OGL/OGLVertexManager.h', 'Source/Core/VideoBackends/Vulkan/VKVertexManager.cpp', 'Source/Core/VideoBackends/Vulkan/VKVertexManager.h', 'Source/Core/VideoCommon/VertexManagerBase.cpp', 'Source/Core/VideoCommon/VertexManagerBase.h'], 'removed': [], 'message': 'Merge pull request #14916 from iwubcode/vertex_manager_draw_refactor\n\nVideoBackends / VideoCommon: split draw calls into separate commit and render functions', 'url': 'https://github.com/dolphin-emu/dolphin/commit/d182533d363eae8c753d37cfad4107930da2019a', 'hash': 'd182533d363eae8c753d37cfad4107930da2019a'}], 'base_ref_name': None, 'ref_name': 'master', 'ref_type': 'heads', 'created': False, 'deleted': False, 'forced': False, 'type': 'gh_push'}
2026-11-02T03:33:58.610819 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'pusher': 'jordan-woyak', 'before_sha': '833d8c05965ac1e2242799d3c9b0e0fadbcbb7f8', 'after_sha': 'adf85af9fe9785e891fa99141f6d34907a2d9f12', 'commits': [{'author': {'name': 'debug687', 'email': '313431556+debug687@users.noreply.github.com', 'date': '2026-10-19T21:29:55Z', 'username': 'debug687'}, 'distinct': False, 'added': [], 'modified': ['Source/Core/DolphinQt/Config/ToolTipControls/ToolTipWidget.h'], 'removed': [], 'message': "DolphinQt: Fix crash from stale timer event in ToolTipWidget\n\nLLM generated explaination for the LLM generated commit:\n\nA queued QTimerEvent can be dispatched after the timer was already killed (Qt recycles timer ids), e.g. when a slider is dragged and enter/leave events fire in rapid succession. In that case m_timer_id is empty and dereferencing it in timerEvent() asserts on 'this->_M_is_engaged()' in debug builds, while in release builds it passes a garbage timer id to killTimer().\n\nOnly process the event if it matches the timer we are tracking, which also prevents showing a balloon for a stale event.", 'url': 'https://github.com/dolphin-emu/dolphin/commit/cee23f7af6b1624da3e7190e5a18a282d82d567c', 'hash': 'cee23f7af6b1624da3e7190e5a18a282d82d567c'}, {'author': {'name': 'Jordan Woyak', 'email': 'jordan.woyak@gmail.com', 'date': '2026-11-01T21:33:55-06:00', 'username': 'jordan-woyak'}, 'distinct': True, 'added': [], 'modified': ['Source/Core/DolphinQt/Config/ToolTipControls/ToolTipWidget.h'], 'removed': [], 'message': 'Merge pull request #14941 from debug687/patch-1\n\nDolphinQt: Fix crash from stale timer event in ToolTipWidget', 'url': 'https://github.com/dolphin-emu/dolphin/commit/adf85af9fe9785e891fa99141f6d34907a2d9f12', 'hash': 'adf85af9fe9785e891fa99141f6d34907a2d9f12'}], 'base_ref_name': None, 'ref_name': 'master', 'ref_type': 'heads', 'created': False, 'deleted': False, 'forced': False, 'type': 'gh_push'}
2026-11-01T19:59:48.261662 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'pusher': 'JMC47', 'before_sha': 'e6ed14488a84eeaae1856e1d7c0dd457dceb49ce', 'after_sha': '833d8c05965ac1e2242799d3c9b0e0fadbcbb7f8', 'commits': [{'author': {'name': 'Joshua Vandaële', 'email': 'joshua@vandaele.software', 'date': '2026-06-28T08:33:40+02:00', 'username': 'JoshuaVandaele'}, 'distinct': False, 'added': [], 'modified': ['Source/Core/Common/MathUtil.h', 'Source/Core/Common/Matrix.cpp', 'Source/Core/Common/Matrix.h', 'Source/Core/Core/HW/WiimoteEmu/Camera.h', 'Source/Core/Core/HW/WiimoteEmu/Dynamics.cpp', 'Source/Core/Core/HW/WiimoteEmu/MotionPlus.cpp', 'Source/Core/Core/HW/WiimoteEmu/MotionPlus.h', 'Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.cpp', 'Source/Core/DolphinQt/Config/Mapping/MappingIndicator.cpp', 'Source/Core/InputCommon/ControllerEmu/ControlGroup/AnalogStick.cpp', 'Source/Core/InputCommon/ControllerEmu/ControlGroup/Cursor.cpp', 'Source/Core/InputCommon/ControllerEmu/ControlGroup/Force.cpp', 'Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUCursor.cpp', 'Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.cpp', 'Source/Core/InputCommon/ControllerEmu/ControlGroup/Tilt.cpp', 'Source/Core/InputCommon/ControllerEmu/StickGate.cpp', 'Source/Core/InputCommon/ControllerInterface/DualShockUDPClient/DualShockUDPClient.cpp', 'Source/Core/InputCommon/ControllerInterface/MappingCommon.cpp', 'Source/Core/InputCommon/ControllerInterface/SteamDeck/SteamDeck.cpp', 'Source/Core/InputCommon/ControllerInterface/Wiimote/WiimoteController.cpp', 'Source/Core/InputCommon/ControllerInterface/evdev/evdev.cpp', 'Source/Core/VideoBackends/Software/NativeVertexFormat.h', 'Source/UnitTests/Common/MathUtilTest.cpp'], 'removed': [], 'message': "MathUtil: C++20/23 modernisations\n\nI've also created DegreesToRadians/RadiansToDegrees utility functions since there was a lot of repeated code", 'url': 'https://github.com/dolphin-emu/dolphin/commit/6dcb0817a2cd1a507dbf5e3c42bf13623b5b5cae', 'hash': '6dcb0817a2cd1a507dbf5e3c42bf13623b5b5cae'}, {'author': {'name': 'JMC47', 'email': 'JMC4789@gmail.com', 'date': '2026-11-01T14:59:45-05:00', 'username': 'JMC47'}, 'distinct': True, 'added': [], 'modified': ['Source/Core/Common/MathUtil.h', 'Source/Core/Common/Matrix.cpp', 'Source/Core/Common/Matrix.h', 'Source/Core/Core/HW/WiimoteEmu/Camera.h', 'Source/Core/Core/HW/WiimoteEmu/Dynamics.cpp', 'Source/Core/Core/HW/WiimoteEmu/MotionPlus.cpp', 'Source/Core/Core/HW/WiimoteEmu/MotionPlus.h', 'Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.cpp', 'Source/Core/DolphinQt/Config/Mapping/MappingIndicator.cpp', 'Source/Core/InputCommon/ControllerEmu/ControlGroup/AnalogStick.cpp', 'Source/Core/InputCommon/ControllerEmu/ControlGroup/Cursor.cpp', 'Source/Core/InputCommon/ControllerEmu/ControlGroup/Force.cpp', 'Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUCursor.cpp', 'Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.cpp', 'Source/Core/InputCommon/ControllerEmu/ControlGroup/Tilt.cpp', 'Source/Core/InputCommon/ControllerEmu/StickGate.cpp', 'Source/Core/InputCommon/ControllerInterface/DualShockUDPClient/DualShockUDPClient.cpp', 'Source/Core/InputCommon/ControllerInterface/MappingCommon.cpp', 'Source/Core/InputCommon/ControllerInterface/SteamDeck/SteamDeck.cpp', 'Source/Core/InputCommon/ControllerInterface/Wiimote/WiimoteController.cpp', 'Source/Core/InputCommon/ControllerInterface/evdev/evdev.cpp', 'Source/Core/VideoBackends/Software/NativeVertexFormat.h', 'Source/UnitTests/Common/MathUtilTest.cpp'], 'removed': [], 'message': 'Merge pull request #14704 from JoshuaVandaele/mathutils-23\n\nMathUtil: C++20/23 modernisations', 'url': 'https://github.com/dolphin-emu/dolphin/commit/833d8c05965ac1e2242799d3c9b0e0fadbcbb7f8', 'hash': '833d8c05965ac1e2242799d3c9b0e0fadbcbb7f8'}], 'base_ref_name': None, 'ref_name': 'master', 'ref_type': 'heads', 'created': False, 'deleted': False, 'forced': False, 'type': 'gh_push'}
2026-11-01T19:59:20.079691 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'pusher': 'JMC47', 'before_sha': '86d554802d7560acf12b5c5a2b3acb344069b5ce', 'after_sha': 'e6ed14488a84eeaae1856e1d7c0dd457dceb49ce', 'commits': [{'author': {'name': 'Jordan Woyak', 'email': 'jordan.woyak@gmail.com', 'date': '2025-10-11T18:29:51-05:00', 'username': 'jordan-woyak'}, 'distinct': False, 'added': [], 'modified': ['Source/Core/AudioCommon/Mixer.cpp', 'Source/Core/AudioCommon/Mixer.h', 'Source/Core/Core/HW/WiimoteEmu/EmuSubroutines.cpp', 'Source/Core/Core/HW/WiimoteEmu/Speaker.cpp', 'Source/Core/Core/HW/WiimoteEmu/Speaker.h', 'Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.cpp', 'Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.h', 'Source/Core/Core/HW/WiimoteReal/WiimoteReal.cpp', 'Source/Core/Core/HW/WiimoteReal/WiimoteReal.h'], 'removed': [], 'message': 'HW/Wiimote: Speaker logic accuracy fixes, comments, and code cleanups.', 'url': 'https://github.com/dolphin-emu/dolphin/commit/baa05e32f1db379e98bbd48b35b2aaa2e6fa4e94', 'hash': 'baa05e32f1db379e98bbd48b35b2aaa2e6fa4e94'}, {'author': {'name': 'JMC47', 'email': 'JMC4789@gmail.com', 'date': '2026-11-01T14:59:17-05:00', 'username': 'JMC47'}, 'distinct': True, 'added': [], 'modified': ['Source/Core/AudioCommon/Mixer.cpp', 'Source/Core/AudioCommon/Mixer.h', 'Source/Core/Core/HW/WiimoteEmu/EmuSubroutines.cpp', 'Source/Core/Core/HW/WiimoteEmu/Speaker.cpp', 'Source/Core/Core/HW/WiimoteEmu/Speaker.h', 'Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.cpp', 'Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.h', 'Source/Core/Core/HW/WiimoteReal/WiimoteReal.cpp', 'Source/Core/Core/HW/WiimoteReal/WiimoteReal.h'], 'removed': [], 'message': 'Merge pull request #14006 from jordan-woyak/speaker-accuracy\n\nHW/Wiimote: Speaker logic accuracy fixes, comments, and code cleanups.', 'url': 'https://github.com/dolphin-emu/dolphin/commit/e6ed14488a84eeaae1856e1d7c0dd457dceb49ce', 'hash': 'e6ed14488a84eeaae1856e1d7c0dd457dceb49ce'}], 'base_ref_name': None, 'ref_name': 'master', 'ref_type': 'heads', 'created': False, 'deleted': False, 'forced': False, 'type': 'gh_push'}
2026-11-01T05:11:01.565986 {'source': 'ghhookparser', 'repo': 'dolphin-emu/dolphin', 'pusher': 'iwubcode', 'before_sha': '613db73aeb2c086a816592df2fb193d73130101b', 'after_sha': '86d554802d7560acf12b5c5a2b3acb344069b5ce', 'commits': [{'author': {'name': 'CySlaytor', 'email': 'cyslaytor@gmail.com', 'date': '2026-11-01T01:29:01Z', 'username': 'CySlaytor'}, 'distinct': False, 'added': ['Data/Sys/Sounds/info.wav', 'Data/Sys/Sounds/lb.wav', 'Data/Sys/Sounds/lbcancel.wav', 'Data/Sys/Sounds/lbsubmit.wav', 'Data/Sys/Sounds/unlock.wav'], 'modified': ['Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.kt', 'Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.kt', 'Source/Android/app/src/main/res/values/strings.xml', 'Source/Core/AudioCommon/Mixer.cpp', 'Source/Core/AudioCommon/Mixer.h', 'Source/Core/AudioCommon/WaveFile.cpp', 'Source/Core/AudioCommon/WaveFile.h', 'Source/Core/Common/CommonPaths.h', 'Source/Core/Common/FileUtil.cpp', 'Source/Core/Common/FileUtil.h', 'Source/Core/Core/AchievementManager.cpp', 'Source/Core/Core/AchievementManager.h', 'Source/Core/Core/Config/AchievementSettings.cpp', 'Source/Core/Core/Config/AchievementSettings.h', 'Source/Core/DolphinQt/Achievements/AchievementSettingsWidget.cpp', 'Source/Core/DolphinQt/Achievements/AchievementSettingsWidget.h'], 'removed': [], 'message': 'feat(retroachievements): implement achievement notification sounds', 'url': 'https://github.com/dolphin-emu/dolphin/commit/56076f403dc8fc3a560e4b6c0811fba3d49ad880', 'hash': '56076f403dc8fc3a560e4b6c0811fba3d49ad880'}, {'author': {'name': 'iwubcode', 'email': 'iwubcode@users.noreply.github.com', 'date': '2026-11-01T00:10:58-05:00', 'username': 'iwubcode'}, 'distinct': True, 'added': ['Data/Sys/Sounds/info.wav', 'Data/Sys/Sounds/lb.wav', 'Data/Sys/Sounds/lbcancel.wav', 'Data/Sys/Sounds/lbsubmit.wav', 'Data/Sys/Sounds/unlock.wav'], 'modified': ['Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.kt', 'Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.kt', 'Source/Android/app/src/main/res/values/strings.xml', 'Source/Core/AudioCommon/Mixer.cpp', 'Source/Core/AudioCommon/Mixer.h', 'Source/Core/AudioCommon/WaveFile.cpp', 'Source/Core/AudioCommon/WaveFile.h', 'Source/Core/Common/CommonPaths.h', 'Source/Core/Common/FileUtil.cpp', 'Source/Core/Common/FileUtil.h', 'Source/Core/Core/AchievementManager.cpp', 'Source/Core/Core/AchievementManager.h', 'Source/Core/Core/Config/AchievementSettings.cpp', 'Source/Core/Core/Config/AchievementSettings.h', 'Source/Core/DolphinQt/Achievements/AchievementSettingsWidget.cpp', 'Source/Core/DolphinQt/Achievements/AchievementSettingsWidget.h'], 'removed': [], 'message': 'Merge pull request #14596 from CySlaytor/master\n\nfeat(retroachievements): implement achievement notification sounds', 'url': 'https://github.com/dolphin-emu/dolphin/commit/86d554802d7560acf12b5c5a2b3acb344069b5ce', 'hash': '86d554802d7560acf12b5c5a2b3acb344069b5ce'}], 'base_ref_name': None, 'ref_name': 'master', 'ref_type': 'heads', 'created': False, 'deleted': False, 'forced': False, 'type': 'gh_push'}
2026-11-01T04:58:33.096478 {'source': 'ghhookparser', 'repo': 'dolphin-emu/sadm', 'pusher': 'OatmealDome', 'before_sha': '855912ebde8af3da1c27fd82351104a095734af0', 'after_sha': '7dbfc36649ffe79b77c08995556a0e65e3594cf5', 'commits': [{'author': {'name': 'OatmealDome', 'email': 'julian@oatmealdome.me', 'date': '2026-11-01T00:19:40-04:00', 'username': 'OatmealDome'}, 'distinct': True, 'added': [], 'modified': ['flake.lock'], 'removed': [], 'message': "flake.lock: Update\n\nFlake lock file updates:\n\n• Updated input 'colmena':\n 'github:nix-community/colmena/e269669b798a361a521029d5d15e289124a15038?narHash=sha256-jp%2BgxgnCdMhpBxxBnOoHW5fRVc%2BC5rKCFHsP/afoh3w%3D' (2026-10-09)\n → 'github:nix-community/colmena/fc7d67ed1cd52af91415f92ba92b543bc7245f25?narHash=sha256-Dv4jEQeqvPpicC3H8mLTyqtTgXp23p4HPiCMKqKWXFA%3D' (2026-10-30)\n• Updated input 'colmena/nixpkgs':\n 'github:nixos/nixpkgs/494ce7fd23ff6a5dff39e1fb11e9b6f2ac74bf25?narHash=sha256-Ni0LBydzaCi8oek12r4mVreuFHqYlM1eTD6SfiENKfw%3D' (2026-10-05)\n → 'github:nixos/nixpkgs/3ec636362e1816bc2f0888fa0fa2c69f1bc9e504?narHash=sha256-rZLrzrC6i%2BjnTAlvPZHogKDulY7WWDEv9hJeHieO7Zw%3D' (2026-10-23)\n• Updated input 'colmena/stable':\n 'github:nixos/nixpkgs/1f623a1582190fa3ba3f5cea25aba925055d43eb?narHash=sha256-q8KNN9Zs/nau7Cc8%2Bf5ZGJeMXmCQqm5%2Bbgy5m/uYxmw%3D' (2026-10-05)\n → 'github:nixos/nixpkgs/89844ad35df40e876cb6d0a3a319fbf65ea4b984?narHash=sha256-TMADWku9ye40AQKGMdSoCpByfqaL7kbO%2Bo8E46Q7CLQ%3D' (2026-10-26)\n• Updated input 'nixpkgs':\n 'github:NixOS/nixpkgs/da6dc0e7b26060f2f71ce3ef7088fb56ee44fa36?narHash=sha256-MlvRfa1O5Cqc2/a%2BgG%2Bl9TSuowEoCKCmrJ1d9oAVm0I%3D' (2026-10-21)\n → 'github:NixOS/nixpkgs/fa1373130d5a21c040a47c5dbe1913d59ed91808?narHash=sha256-HzgjxrLY4AEc0044ZuM5CHbLSWLZgDlay1idmzvvpJs%3D' (2026-10-31)\n• Updated input 'pyproject-build-systems':\n 'github:pyproject-nix/build-system-pkgs/a17819c85163988e063806ffc4f6d2716bc8ead8?narHash=sha256-mGOkvueuMGSRiD75ccxFzfEvSlIU9ztjFluHMKOtogY%3D' (2026-10-20)\n → 'github:pyproject-nix/build-system-pkgs/6171a3484937e14cdf2316ed9a60f1c27b6cb71e?narHash=sha256-wLiau0yOPONjWSoQNC%2B%2BuirtJqx2D4hGAWSKU0TfKGc%3D' (2026-10-29)\n• Updated input 'pyproject-build-systems/uv2nix':\n 'github:pyproject-nix/uv2nix/7aba73a3d85454f1118f8cf9de97979b4d26bcac?narHash=sha256-PMtgvHuGijoIAtPtrBm7kJOI6fxzX4LYPAIK%2BQVGY%2BY%3D' (2026-10-16)\n → 'github:pyproject-nix/uv2nix/c361746c7d630d98b972378290547c8d35542a7a?narHash=sha256-3CE1CEwprYlHRlRVkXDkhqec0jjF9Cti7tdk8vVDsCM%3D' (2026-10-29)\n• Updated input 'pyproject-nix':\n 'github:pyproject-nix/pyproject.nix/ddc400a6883b042646d0940e65971bb7f7e96107?narHash=sha256-vcCAvhtA7hG%2B/gOge29hYHy7I/dLkIsr5nLx4sFEQic%3D' (2026-10-10)\n → 'github:pyproject-nix/pyproject.nix/bf7d4b1d6de61db02fd4e748395634f03006e5de?narHash=sha256-NPWgb6H4arnWyTKvYIys5U0xqd5QY74Z%2BlyTJA%2B7XGY%3D' (2026-10-29)\n• Updated input 'rust-overlay':\n 'github:oxalica/rust-overlay/5f267b7f323a4d6df0b9c0e3eaa043cbe85386f2?narHash=sha256-E8zFJilWlORqzIUJizyhZ/0WKBOizuM6s1nRSgPRomo%3D' (2026-10-22)\n → 'github:oxalica/rust-overlay/6ecf534a7c16e7c969f26838fdd8c93597ae93f3?narHash=sha256-%2BsgVNI2c67di%2BXIeMaz5KSei4T65kX68s5Nl0E5Gzbc%3D' (2026-10-31)\n• Updated input 'uv2nix':\n 'github:pyproject-nix/uv2nix/0fdaa03ea3c3c16dbb1fe4d69108f07227a4b42d?narHash=sha256-UWo7wDPi00YXOI1Io7g4vGKuCSPJ863kHJVDzsgqtoM%3D' (2026-10-22)\n → 'github:pyproject-nix/uv2nix/c361746c7d630d98b972378290547c8d35542a7a?narHash=sha256-3CE1CEwprYlHRlRVkXDkhqec0jjF9Cti7tdk8vVDsCM%3D' (2026-10-29)", 'url': 'https://github.com/dolphin-emu/sadm/commit/7dbfc36649ffe79b77c08995556a0e65e3594cf5', 'hash': '7dbfc36649ffe79b77c08995556a0e65e3594cf5'}], 'base_ref_name': None, 'ref_name': 'master', 'ref_type': 'heads', 'created': False, 'deleted': False, 'forced': False, 'type': 'gh_push'}
Recent 'internal_log' events
2026-11-03T17:47:26.099065 {'source': 'logging', 'level': 'INFO', 'pathname': '/nix/store/98y8b324p65rdc44nkgfs38ml3cplndp-central-env/lib/python3.13/site-packages/central/buildbot.py', 'lineno': 131, 'msg': 'PR %s mergeable: %s (%s)', 'args': "(14979, None, 'unknown')", 'type': 'internal_log'}
2026-11-03T17:45:43.800768 {'source': 'logging', 'level': 'INFO', 'pathname': '/nix/store/98y8b324p65rdc44nkgfs38ml3cplndp-central-env/lib/python3.13/site-packages/central/github/authz.py', 'lineno': 29, 'msg': 'New GH %s: %s', 'args': "('dolphin-emu/core-developers', 'phire,degasus,Dentomologist,Pokechu22,CrossVR,jordan-woyak,AdmiralCurtiss,JosJuice,linkmauve,iwubcode,Tilka,OatmealDome,leoetlino')", 'type': 'internal_log'}
2026-11-03T17:45:43.467916 {'source': 'logging', 'level': 'INFO', 'pathname': '/nix/store/98y8b324p65rdc44nkgfs38ml3cplndp-central-env/lib/python3.13/site-packages/central/github/authz.py', 'lineno': 20, 'msg': 'Refreshing list of trusted users (from %s/%s)', 'args': "('dolphin-emu', 'core-developers')", 'type': 'internal_log'}
2026-11-03T17:44:53.630492 {'source': 'logging', 'level': 'INFO', 'pathname': '/nix/store/98y8b324p65rdc44nkgfs38ml3cplndp-central-env/lib/python3.13/site-packages/central/github/authz.py', 'lineno': 29, 'msg': 'New GH %s: %s', 'args': "('dolphin-emu/trusted-developers', 'FioraAeterna,meffij,moncefmechri,Buddybenj,Helios747,hackbar,Zopolis4,bentley,lioncash,mandar1jn,magumagu,booto,magcius,riking,linkmauve,Ziek,Parlane,zackhow,tom-pratt,CasualPokePlayer,ligfx,cristian64,TryTwo,skidau,vladfi1,jloehr,EmptyChaos,deReeperJosh,JordanTheToaster,kamiyo,LPFaint99,OatmealDome,rukai,randomstuff,TellowKrinkle,mimimi085181,RisingFog,PatrickFerry,Filoppi,hrydgard,Pokechu22,ColinDTaylor,Tilka,Stevoisiak,nullgemm,hdcmeta,mathieui,rlnilsen,SuperSamus,CrossVR,SirMangler,mitaclaw,shonumi,DacoTaco,Ebola16,CelestialAmber,CookiePLMonster,orbea,mahdihijazi,Tinob,Linktothepast,mbc07,aldelaro5,jordan-woyak,merryhime,aroulin,LAGonauta,unknownbrackets,skylersaleh,phire,delroth,LillyJadeKatrin,yourWaifu,VampireFlower,Sir-Walrus,Techjar,BhaaLseN,CrystalGamma,NanoByte011,Geotale,tygyh,Lobsterzelda,OrN,jezze,Dentomologist,Phatcat,Sintendo,Hydr8gon,comex,jjdelvalle,Simonx22,krnlyng,Linkinworm,Orphis,endrift,neobrain,zopieux,AdmiralCurtiss,noahpistilli,K0bin,RachelBryk,spxtr,glennricster,JosJuice,smurf3tte,sepalani,Starsam80,marcan,adamdmoss,hthh,mrgreywater,cscd98,Sam-Belliveau,iwubcode,archshift,MayImilae,galop1n,nickbeth,dreamsyntax,ShimmerGlass,corwin-mcknight,JoshuaVandaele,Gamer64ytb,leoetlino,JMC47,crediar,degasus,gwicks,malleoz,mmastrac,kayru,spycrab')", 'type': 'internal_log'}
2026-11-03T17:44:51.842118 {'source': 'logging', 'level': 'INFO', 'pathname': '/nix/store/98y8b324p65rdc44nkgfs38ml3cplndp-central-env/lib/python3.13/site-packages/central/github/authz.py', 'lineno': 20, 'msg': 'Refreshing list of trusted users (from %s/%s)', 'args': "('dolphin-emu', 'trusted-developers')", 'type': 'internal_log'}
2026-11-03T17:44:08.712769 {'source': 'logging', 'level': 'INFO', 'pathname': '/nix/store/98y8b324p65rdc44nkgfs38ml3cplndp-central-env/lib/python3.13/site-packages/central/buildbot.py', 'lineno': 131, 'msg': 'PR %s mergeable: %s (%s)', 'args': "(14979, None, 'unknown')", 'type': 'internal_log'}
2026-11-03T17:39:51.841676 {'source': 'logging', 'level': 'INFO', 'pathname': '/nix/store/98y8b324p65rdc44nkgfs38ml3cplndp-central-env/lib/python3.13/site-packages/central/github/authz.py', 'lineno': 29, 'msg': 'New GH %s: %s', 'args': "('dolphin-emu/trusted-developers', 'FioraAeterna,meffij,moncefmechri,Buddybenj,Helios747,hackbar,Zopolis4,bentley,lioncash,mandar1jn,magumagu,booto,magcius,riking,linkmauve,Ziek,Parlane,zackhow,tom-pratt,CasualPokePlayer,ligfx,cristian64,TryTwo,skidau,vladfi1,jloehr,EmptyChaos,deReeperJosh,JordanTheToaster,kamiyo,LPFaint99,OatmealDome,rukai,randomstuff,TellowKrinkle,mimimi085181,RisingFog,PatrickFerry,Filoppi,hrydgard,Pokechu22,ColinDTaylor,Tilka,Stevoisiak,nullgemm,hdcmeta,mathieui,rlnilsen,SuperSamus,CrossVR,SirMangler,mitaclaw,shonumi,DacoTaco,Ebola16,CelestialAmber,CookiePLMonster,orbea,mahdihijazi,Tinob,Linktothepast,mbc07,aldelaro5,jordan-woyak,merryhime,aroulin,LAGonauta,unknownbrackets,skylersaleh,phire,delroth,LillyJadeKatrin,yourWaifu,VampireFlower,Sir-Walrus,Techjar,BhaaLseN,CrystalGamma,NanoByte011,Geotale,tygyh,Lobsterzelda,OrN,jezze,Dentomologist,Phatcat,Sintendo,Hydr8gon,comex,jjdelvalle,Simonx22,krnlyng,Linkinworm,Orphis,endrift,neobrain,zopieux,AdmiralCurtiss,noahpistilli,K0bin,RachelBryk,spxtr,glennricster,JosJuice,smurf3tte,sepalani,Starsam80,marcan,adamdmoss,hthh,mrgreywater,cscd98,Sam-Belliveau,iwubcode,archshift,MayImilae,galop1n,nickbeth,dreamsyntax,ShimmerGlass,corwin-mcknight,JoshuaVandaele,Gamer64ytb,leoetlino,JMC47,crediar,degasus,gwicks,malleoz,mmastrac,kayru,spycrab')", 'type': 'internal_log'}
2026-11-03T17:39:50.093669 {'source': 'logging', 'level': 'INFO', 'pathname': '/nix/store/98y8b324p65rdc44nkgfs38ml3cplndp-central-env/lib/python3.13/site-packages/central/github/authz.py', 'lineno': 20, 'msg': 'Refreshing list of trusted users (from %s/%s)', 'args': "('dolphin-emu', 'trusted-developers')", 'type': 'internal_log'}
2026-11-03T17:35:43.467669 {'source': 'logging', 'level': 'INFO', 'pathname': '/nix/store/98y8b324p65rdc44nkgfs38ml3cplndp-central-env/lib/python3.13/site-packages/central/github/authz.py', 'lineno': 29, 'msg': 'New GH %s: %s', 'args': "('dolphin-emu/core-developers', 'phire,degasus,Dentomologist,Pokechu22,CrossVR,jordan-woyak,AdmiralCurtiss,JosJuice,linkmauve,iwubcode,Tilka,OatmealDome,leoetlino')", 'type': 'internal_log'}
2026-11-03T17:35:43.063590 {'source': 'logging', 'level': 'INFO', 'pathname': '/nix/store/98y8b324p65rdc44nkgfs38ml3cplndp-central-env/lib/python3.13/site-packages/central/github/authz.py', 'lineno': 20, 'msg': 'Refreshing list of trusted users (from %s/%s)', 'args': "('dolphin-emu', 'core-developers')", 'type': 'internal_log'}
2026-11-03T17:34:50.093338 {'source': 'logging', 'level': 'INFO', 'pathname': '/nix/store/98y8b324p65rdc44nkgfs38ml3cplndp-central-env/lib/python3.13/site-packages/central/github/authz.py', 'lineno': 29, 'msg': 'New GH %s: %s', 'args': "('dolphin-emu/trusted-developers', 'FioraAeterna,meffij,moncefmechri,Buddybenj,Helios747,hackbar,Zopolis4,bentley,lioncash,mandar1jn,magumagu,booto,magcius,riking,linkmauve,Ziek,Parlane,zackhow,tom-pratt,CasualPokePlayer,ligfx,cristian64,TryTwo,skidau,vladfi1,jloehr,EmptyChaos,deReeperJosh,JordanTheToaster,kamiyo,LPFaint99,OatmealDome,rukai,randomstuff,TellowKrinkle,mimimi085181,RisingFog,PatrickFerry,Filoppi,hrydgard,Pokechu22,ColinDTaylor,Tilka,Stevoisiak,nullgemm,hdcmeta,mathieui,rlnilsen,SuperSamus,CrossVR,SirMangler,mitaclaw,shonumi,DacoTaco,Ebola16,CelestialAmber,CookiePLMonster,orbea,mahdihijazi,Tinob,Linktothepast,mbc07,aldelaro5,jordan-woyak,merryhime,aroulin,LAGonauta,unknownbrackets,skylersaleh,phire,delroth,LillyJadeKatrin,yourWaifu,VampireFlower,Sir-Walrus,Techjar,BhaaLseN,CrystalGamma,NanoByte011,Geotale,tygyh,Lobsterzelda,OrN,jezze,Dentomologist,Phatcat,Sintendo,Hydr8gon,comex,jjdelvalle,Simonx22,krnlyng,Linkinworm,Orphis,endrift,neobrain,zopieux,AdmiralCurtiss,noahpistilli,K0bin,RachelBryk,spxtr,glennricster,JosJuice,smurf3tte,sepalani,Starsam80,marcan,adamdmoss,hthh,mrgreywater,cscd98,Sam-Belliveau,iwubcode,archshift,MayImilae,galop1n,nickbeth,dreamsyntax,ShimmerGlass,corwin-mcknight,JoshuaVandaele,Gamer64ytb,leoetlino,JMC47,crediar,degasus,gwicks,malleoz,mmastrac,kayru,spycrab')", 'type': 'internal_log'}
2026-11-03T17:34:48.277220 {'source': 'logging', 'level': 'INFO', 'pathname': '/nix/store/98y8b324p65rdc44nkgfs38ml3cplndp-central-env/lib/python3.13/site-packages/central/github/authz.py', 'lineno': 20, 'msg': 'Refreshing list of trusted users (from %s/%s)', 'args': "('dolphin-emu', 'trusted-developers')", 'type': 'internal_log'}
2026-11-03T17:29:48.276889 {'source': 'logging', 'level': 'INFO', 'pathname': '/nix/store/98y8b324p65rdc44nkgfs38ml3cplndp-central-env/lib/python3.13/site-packages/central/github/authz.py', 'lineno': 29, 'msg': 'New GH %s: %s', 'args': "('dolphin-emu/trusted-developers', 'FioraAeterna,meffij,moncefmechri,Buddybenj,Helios747,hackbar,Zopolis4,bentley,lioncash,mandar1jn,magumagu,booto,magcius,riking,linkmauve,Ziek,Parlane,zackhow,tom-pratt,CasualPokePlayer,ligfx,cristian64,TryTwo,skidau,vladfi1,jloehr,EmptyChaos,deReeperJosh,JordanTheToaster,kamiyo,LPFaint99,OatmealDome,rukai,randomstuff,TellowKrinkle,mimimi085181,RisingFog,PatrickFerry,Filoppi,hrydgard,Pokechu22,ColinDTaylor,Tilka,Stevoisiak,nullgemm,hdcmeta,mathieui,rlnilsen,SuperSamus,CrossVR,SirMangler,mitaclaw,shonumi,DacoTaco,Ebola16,CelestialAmber,CookiePLMonster,orbea,mahdihijazi,Tinob,Linktothepast,mbc07,aldelaro5,jordan-woyak,merryhime,aroulin,LAGonauta,unknownbrackets,skylersaleh,phire,delroth,LillyJadeKatrin,yourWaifu,VampireFlower,Sir-Walrus,Techjar,BhaaLseN,CrystalGamma,NanoByte011,Geotale,tygyh,Lobsterzelda,OrN,jezze,Dentomologist,Phatcat,Sintendo,Hydr8gon,comex,jjdelvalle,Simonx22,krnlyng,Linkinworm,Orphis,endrift,neobrain,zopieux,AdmiralCurtiss,noahpistilli,K0bin,RachelBryk,spxtr,glennricster,JosJuice,smurf3tte,sepalani,Starsam80,marcan,adamdmoss,hthh,mrgreywater,cscd98,Sam-Belliveau,iwubcode,archshift,MayImilae,galop1n,nickbeth,dreamsyntax,ShimmerGlass,corwin-mcknight,JoshuaVandaele,Gamer64ytb,leoetlino,JMC47,crediar,degasus,gwicks,malleoz,mmastrac,kayru,spycrab')", 'type': 'internal_log'}
2026-11-03T17:29:46.306876 {'source': 'logging', 'level': 'INFO', 'pathname': '/nix/store/98y8b324p65rdc44nkgfs38ml3cplndp-central-env/lib/python3.13/site-packages/central/github/authz.py', 'lineno': 20, 'msg': 'Refreshing list of trusted users (from %s/%s)', 'args': "('dolphin-emu', 'trusted-developers')", 'type': 'internal_log'}
2026-11-03T17:25:43.063381 {'source': 'logging', 'level': 'INFO', 'pathname': '/nix/store/98y8b324p65rdc44nkgfs38ml3cplndp-central-env/lib/python3.13/site-packages/central/github/authz.py', 'lineno': 29, 'msg': 'New GH %s: %s', 'args': "('dolphin-emu/core-developers', 'phire,degasus,Dentomologist,Pokechu22,CrossVR,jordan-woyak,AdmiralCurtiss,JosJuice,linkmauve,iwubcode,Tilka,OatmealDome,leoetlino')", 'type': 'internal_log'}
2026-11-03T17:25:42.669433 {'source': 'logging', 'level': 'INFO', 'pathname': '/nix/store/98y8b324p65rdc44nkgfs38ml3cplndp-central-env/lib/python3.13/site-packages/central/github/authz.py', 'lineno': 20, 'msg': 'Refreshing list of trusted users (from %s/%s)', 'args': "('dolphin-emu', 'core-developers')", 'type': 'internal_log'}
2026-11-03T17:24:46.306543 {'source': 'logging', 'level': 'INFO', 'pathname': '/nix/store/98y8b324p65rdc44nkgfs38ml3cplndp-central-env/lib/python3.13/site-packages/central/github/authz.py', 'lineno': 29, 'msg': 'New GH %s: %s', 'args': "('dolphin-emu/trusted-developers', 'FioraAeterna,meffij,moncefmechri,Buddybenj,Helios747,hackbar,Zopolis4,bentley,lioncash,mandar1jn,magumagu,booto,magcius,riking,linkmauve,Ziek,Parlane,zackhow,tom-pratt,CasualPokePlayer,ligfx,cristian64,TryTwo,skidau,vladfi1,jloehr,EmptyChaos,deReeperJosh,JordanTheToaster,kamiyo,LPFaint99,OatmealDome,rukai,randomstuff,TellowKrinkle,mimimi085181,RisingFog,PatrickFerry,Filoppi,hrydgard,Pokechu22,ColinDTaylor,Tilka,Stevoisiak,nullgemm,hdcmeta,mathieui,rlnilsen,SuperSamus,CrossVR,SirMangler,mitaclaw,shonumi,DacoTaco,Ebola16,CelestialAmber,CookiePLMonster,orbea,mahdihijazi,Tinob,Linktothepast,mbc07,aldelaro5,jordan-woyak,merryhime,aroulin,LAGonauta,unknownbrackets,skylersaleh,phire,delroth,LillyJadeKatrin,yourWaifu,VampireFlower,Sir-Walrus,Techjar,BhaaLseN,CrystalGamma,NanoByte011,Geotale,tygyh,Lobsterzelda,OrN,jezze,Dentomologist,Phatcat,Sintendo,Hydr8gon,comex,jjdelvalle,Simonx22,krnlyng,Linkinworm,Orphis,endrift,neobrain,zopieux,AdmiralCurtiss,noahpistilli,K0bin,RachelBryk,spxtr,glennricster,JosJuice,smurf3tte,sepalani,Starsam80,marcan,adamdmoss,hthh,mrgreywater,cscd98,Sam-Belliveau,iwubcode,archshift,MayImilae,galop1n,nickbeth,dreamsyntax,ShimmerGlass,corwin-mcknight,JoshuaVandaele,Gamer64ytb,leoetlino,JMC47,crediar,degasus,gwicks,malleoz,mmastrac,kayru,spycrab')", 'type': 'internal_log'}
2026-11-03T17:24:44.430503 {'source': 'logging', 'level': 'INFO', 'pathname': '/nix/store/98y8b324p65rdc44nkgfs38ml3cplndp-central-env/lib/python3.13/site-packages/central/github/authz.py', 'lineno': 20, 'msg': 'Refreshing list of trusted users (from %s/%s)', 'args': "('dolphin-emu', 'trusted-developers')", 'type': 'internal_log'}
2026-11-03T17:19:44.430106 {'source': 'logging', 'level': 'INFO', 'pathname': '/nix/store/98y8b324p65rdc44nkgfs38ml3cplndp-central-env/lib/python3.13/site-packages/central/github/authz.py', 'lineno': 29, 'msg': 'New GH %s: %s', 'args': "('dolphin-emu/trusted-developers', 'FioraAeterna,meffij,moncefmechri,Buddybenj,Helios747,hackbar,Zopolis4,bentley,lioncash,mandar1jn,magumagu,booto,magcius,riking,linkmauve,Ziek,Parlane,zackhow,tom-pratt,CasualPokePlayer,ligfx,cristian64,TryTwo,skidau,vladfi1,jloehr,EmptyChaos,deReeperJosh,JordanTheToaster,kamiyo,LPFaint99,OatmealDome,rukai,randomstuff,TellowKrinkle,mimimi085181,RisingFog,PatrickFerry,Filoppi,hrydgard,Pokechu22,ColinDTaylor,Tilka,Stevoisiak,nullgemm,hdcmeta,mathieui,rlnilsen,SuperSamus,CrossVR,SirMangler,mitaclaw,shonumi,DacoTaco,Ebola16,CelestialAmber,CookiePLMonster,orbea,mahdihijazi,Tinob,Linktothepast,mbc07,aldelaro5,jordan-woyak,merryhime,aroulin,LAGonauta,unknownbrackets,skylersaleh,phire,delroth,LillyJadeKatrin,yourWaifu,VampireFlower,Sir-Walrus,Techjar,BhaaLseN,CrystalGamma,NanoByte011,Geotale,tygyh,Lobsterzelda,OrN,jezze,Dentomologist,Phatcat,Sintendo,Hydr8gon,comex,jjdelvalle,Simonx22,krnlyng,Linkinworm,Orphis,endrift,neobrain,zopieux,AdmiralCurtiss,noahpistilli,K0bin,RachelBryk,spxtr,glennricster,JosJuice,smurf3tte,sepalani,Starsam80,marcan,adamdmoss,hthh,mrgreywater,cscd98,Sam-Belliveau,iwubcode,archshift,MayImilae,galop1n,nickbeth,dreamsyntax,ShimmerGlass,corwin-mcknight,JoshuaVandaele,Gamer64ytb,leoetlino,JMC47,crediar,degasus,gwicks,malleoz,mmastrac,kayru,spycrab')", 'type': 'internal_log'}
2026-11-03T17:19:42.697777 {'source': 'logging', 'level': 'INFO', 'pathname': '/nix/store/98y8b324p65rdc44nkgfs38ml3cplndp-central-env/lib/python3.13/site-packages/central/github/authz.py', 'lineno': 20, 'msg': 'Refreshing list of trusted users (from %s/%s)', 'args': "('dolphin-emu', 'trusted-developers')", 'type': 'internal_log'}
2026-11-03T17:15:42.669192 {'source': 'logging', 'level': 'INFO', 'pathname': '/nix/store/98y8b324p65rdc44nkgfs38ml3cplndp-central-env/lib/python3.13/site-packages/central/github/authz.py', 'lineno': 29, 'msg': 'New GH %s: %s', 'args': "('dolphin-emu/core-developers', 'phire,degasus,Dentomologist,Pokechu22,CrossVR,jordan-woyak,AdmiralCurtiss,JosJuice,linkmauve,iwubcode,Tilka,OatmealDome,leoetlino')", 'type': 'internal_log'}
2026-11-03T17:15:42.261234 {'source': 'logging', 'level': 'INFO', 'pathname': '/nix/store/98y8b324p65rdc44nkgfs38ml3cplndp-central-env/lib/python3.13/site-packages/central/github/authz.py', 'lineno': 20, 'msg': 'Refreshing list of trusted users (from %s/%s)', 'args': "('dolphin-emu', 'core-developers')", 'type': 'internal_log'}
2026-11-03T17:14:42.697443 {'source': 'logging', 'level': 'INFO', 'pathname': '/nix/store/98y8b324p65rdc44nkgfs38ml3cplndp-central-env/lib/python3.13/site-packages/central/github/authz.py', 'lineno': 29, 'msg': 'New GH %s: %s', 'args': "('dolphin-emu/trusted-developers', 'FioraAeterna,meffij,moncefmechri,Buddybenj,Helios747,hackbar,Zopolis4,bentley,lioncash,mandar1jn,magumagu,booto,magcius,riking,linkmauve,Ziek,Parlane,zackhow,tom-pratt,CasualPokePlayer,ligfx,cristian64,TryTwo,skidau,vladfi1,jloehr,EmptyChaos,deReeperJosh,JordanTheToaster,kamiyo,LPFaint99,OatmealDome,rukai,randomstuff,TellowKrinkle,mimimi085181,RisingFog,PatrickFerry,Filoppi,hrydgard,Pokechu22,ColinDTaylor,Tilka,Stevoisiak,nullgemm,hdcmeta,mathieui,rlnilsen,SuperSamus,CrossVR,SirMangler,mitaclaw,shonumi,DacoTaco,Ebola16,CelestialAmber,CookiePLMonster,orbea,mahdihijazi,Tinob,Linktothepast,mbc07,aldelaro5,jordan-woyak,merryhime,aroulin,LAGonauta,unknownbrackets,skylersaleh,phire,delroth,LillyJadeKatrin,yourWaifu,VampireFlower,Sir-Walrus,Techjar,BhaaLseN,CrystalGamma,NanoByte011,Geotale,tygyh,Lobsterzelda,OrN,jezze,Dentomologist,Phatcat,Sintendo,Hydr8gon,comex,jjdelvalle,Simonx22,krnlyng,Linkinworm,Orphis,endrift,neobrain,zopieux,AdmiralCurtiss,noahpistilli,K0bin,RachelBryk,spxtr,glennricster,JosJuice,smurf3tte,sepalani,Starsam80,marcan,adamdmoss,hthh,mrgreywater,cscd98,Sam-Belliveau,iwubcode,archshift,MayImilae,galop1n,nickbeth,dreamsyntax,ShimmerGlass,corwin-mcknight,JoshuaVandaele,Gamer64ytb,leoetlino,JMC47,crediar,degasus,gwicks,malleoz,mmastrac,kayru,spycrab')", 'type': 'internal_log'}
2026-11-03T17:14:41.137351 {'source': 'logging', 'level': 'INFO', 'pathname': '/nix/store/98y8b324p65rdc44nkgfs38ml3cplndp-central-env/lib/python3.13/site-packages/central/github/authz.py', 'lineno': 20, 'msg': 'Refreshing list of trusted users (from %s/%s)', 'args': "('dolphin-emu', 'trusted-developers')", 'type': 'internal_log'}
2026-11-03T17:09:41.137035 {'source': 'logging', 'level': 'INFO', 'pathname': '/nix/store/98y8b324p65rdc44nkgfs38ml3cplndp-central-env/lib/python3.13/site-packages/central/github/authz.py', 'lineno': 29, 'msg': 'New GH %s: %s', 'args': "('dolphin-emu/trusted-developers', 'FioraAeterna,meffij,moncefmechri,Buddybenj,Helios747,hackbar,Zopolis4,bentley,lioncash,mandar1jn,magumagu,booto,magcius,riking,linkmauve,Ziek,Parlane,zackhow,tom-pratt,CasualPokePlayer,ligfx,cristian64,TryTwo,skidau,vladfi1,jloehr,EmptyChaos,deReeperJosh,JordanTheToaster,kamiyo,LPFaint99,OatmealDome,rukai,randomstuff,TellowKrinkle,mimimi085181,RisingFog,PatrickFerry,Filoppi,hrydgard,Pokechu22,ColinDTaylor,Tilka,Stevoisiak,nullgemm,hdcmeta,mathieui,rlnilsen,SuperSamus,CrossVR,SirMangler,mitaclaw,shonumi,DacoTaco,Ebola16,CelestialAmber,CookiePLMonster,orbea,mahdihijazi,Tinob,Linktothepast,mbc07,aldelaro5,jordan-woyak,merryhime,aroulin,LAGonauta,unknownbrackets,skylersaleh,phire,delroth,LillyJadeKatrin,yourWaifu,VampireFlower,Sir-Walrus,Techjar,BhaaLseN,CrystalGamma,NanoByte011,Geotale,tygyh,Lobsterzelda,OrN,jezze,Dentomologist,Phatcat,Sintendo,Hydr8gon,comex,jjdelvalle,Simonx22,krnlyng,Linkinworm,Orphis,endrift,neobrain,zopieux,AdmiralCurtiss,noahpistilli,K0bin,RachelBryk,spxtr,glennricster,JosJuice,smurf3tte,sepalani,Starsam80,marcan,adamdmoss,hthh,mrgreywater,cscd98,Sam-Belliveau,iwubcode,archshift,MayImilae,galop1n,nickbeth,dreamsyntax,ShimmerGlass,corwin-mcknight,JoshuaVandaele,Gamer64ytb,leoetlino,JMC47,crediar,degasus,gwicks,malleoz,mmastrac,kayru,spycrab')", 'type': 'internal_log'}
Recent 'issue' events
2026-11-03T16:24:33.637252 {'source': 'redmine', 'new': True, 'update': 0, 'issue': 14175, 'title': 'Retroachievements', 'author': 'Cloudgaming7882', 'type': 'issue'}
2026-11-03T13:37:27.061515 {'source': 'redmine', 'new': False, 'update': 3, 'issue': 14172, 'title': "Can't select any interface language other than English on macOS since v2609", 'author': 'OatmealDome', 'type': 'issue'}
2026-11-01T09:16:43.791855 {'source': 'redmine', 'new': False, 'update': 2, 'issue': 14174, 'title': 'Paper mario the thousand year door ', 'author': 'JosJuice', 'type': 'issue'}
Recent 'new_dev_version' events
2026-11-03T04:44:55.957645 {'source': 'repomanager', 'hash': 'df4bd441dec5d6f3cff606eea76f183963e97a44', 'branch': 'master', 'shortrev': '2609-173', 'author': 'Jordan Woyak', 'message': 'Merge pull request #14972 from jordan-woyak/paren-init-aggregate\n\nMinor cleanups with "parenthesized initialization of aggregates".', 'url': 'https://github.com/dolphin-emu/dolphin/commit/df4bd441dec5d6f3cff606eea76f183963e97a44', 'type': 'new_dev_version'}
2026-11-02T20:16:26.534624 {'source': 'repomanager', 'hash': 'e8c42467964da77011f7da93a06f9e0a72ca868f', 'branch': 'master', 'shortrev': '2609-170', 'author': 'Jordan Woyak', 'message': 'Merge pull request #14510 from Ma-Rang/pr/gecko-bind-error\n\nEXI: Show on-screen error when USB Gecko fails to bind', 'url': 'https://github.com/dolphin-emu/dolphin/commit/e8c42467964da77011f7da93a06f9e0a72ca868f', 'type': 'new_dev_version'}
2026-11-02T19:46:28.060984 {'source': 'repomanager', 'hash': 'a0ed231ff614ec6e03716d72fa8f3a11ce57c6a0', 'branch': 'master', 'shortrev': '2609-168', 'author': 'Jordan Woyak', 'message': 'Merge pull request #14975 from JoshuaVandaele/flathub-manifest\n\nFlatpak: Do not set the flathub::manifest tag', 'url': 'https://github.com/dolphin-emu/dolphin/commit/a0ed231ff614ec6e03716d72fa8f3a11ce57c6a0', 'type': 'new_dev_version'}
2026-11-02T03:35:04.879103 {'source': 'repomanager', 'hash': 'd182533d363eae8c753d37cfad4107930da2019a', 'branch': 'master', 'shortrev': '2609-166', 'author': 'Jordan Woyak', 'message': 'Merge pull request #14916 from iwubcode/vertex_manager_draw_refactor\n\nVideoBackends / VideoCommon: split draw calls into separate commit and render functions', 'url': 'https://github.com/dolphin-emu/dolphin/commit/d182533d363eae8c753d37cfad4107930da2019a', 'type': 'new_dev_version'}
2026-11-02T03:34:00.690923 {'source': 'repomanager', 'hash': 'adf85af9fe9785e891fa99141f6d34907a2d9f12', 'branch': 'master', 'shortrev': '2609-164', 'author': 'Jordan Woyak', 'message': 'Merge pull request #14941 from debug687/patch-1\n\nDolphinQt: Fix crash from stale timer event in ToolTipWidget', 'url': 'https://github.com/dolphin-emu/dolphin/commit/adf85af9fe9785e891fa99141f6d34907a2d9f12', 'type': 'new_dev_version'}
2026-11-01T19:59:49.726721 {'source': 'repomanager', 'hash': '833d8c05965ac1e2242799d3c9b0e0fadbcbb7f8', 'branch': 'master', 'shortrev': '2609-162', 'author': 'JMC47', 'message': 'Merge pull request #14704 from JoshuaVandaele/mathutils-23\n\nMathUtil: C++20/23 modernisations', 'url': 'https://github.com/dolphin-emu/dolphin/commit/833d8c05965ac1e2242799d3c9b0e0fadbcbb7f8', 'type': 'new_dev_version'}
2026-11-01T19:59:21.576066 {'source': 'repomanager', 'hash': 'e6ed14488a84eeaae1856e1d7c0dd457dceb49ce', 'branch': 'master', 'shortrev': '2609-160', 'author': 'JMC47', 'message': 'Merge pull request #14006 from jordan-woyak/speaker-accuracy\n\nHW/Wiimote: Speaker logic accuracy fixes, comments, and code cleanups.', 'url': 'https://github.com/dolphin-emu/dolphin/commit/e6ed14488a84eeaae1856e1d7c0dd457dceb49ce', 'type': 'new_dev_version'}
2026-11-01T05:11:03.397581 {'source': 'repomanager', 'hash': '86d554802d7560acf12b5c5a2b3acb344069b5ce', 'branch': 'master', 'shortrev': '2609-158', 'author': 'iwubcode', 'message': 'Merge pull request #14596 from CySlaytor/master\n\nfeat(retroachievements): implement achievement notification sounds', 'url': 'https://github.com/dolphin-emu/dolphin/commit/86d554802d7560acf12b5c5a2b3acb344069b5ce', 'type': 'new_dev_version'}
Recent 'notification' events
2026-11-03T17:47:25.785993 {'source': 'notifications', 'msg': '[\x1f\x0313dolphin-emu/dolphin\x03\x1f] \x0303J\ufeffoshuaVandaele\x03 synchronized pull request #14979: Externals/gettext: Update to 1.0, vendor-in from source on non-Windows host platforms (\x0306master\x03...\x0306vendored-gettext\x03): \x1f\x0302https://dolp.in/pr14979\x03\x1f', 'type': 'notification'}
2026-11-03T17:46:56.779523 {'source': 'notifications', 'msg': '[\x1f\x0313dolphin-emu/dolphin\x03\x1f] build for #14979 \x0304failed\x03 on builders [pr-deb-dbg-x64, pr-deb-x64, pr-freebsd-x64, pr-osx-universal, pr-ubu-x64]: \x1f\x0302https://dolphin.ci/#/builders/7/builds/10937\x03\x1f', 'type': 'notification'}
2026-11-03T17:44:08.319248 {'source': 'notifications', 'msg': '[\x1f\x0313dolphin-emu/dolphin\x03\x1f] \x0303J\ufeffoshuaVandaele\x03 opened pull request #14979: Externals/gettext: Update to 1.0, vendor-in from source on non-Windows host platforms (\x0306master\x03...\x0306vendored-gettext\x03): \x1f\x0302https://dolp.in/pr14979\x03\x1f', 'type': 'notification'}
2026-11-03T17:27:07.220756 {'source': 'notifications', 'msg': '[\x1f\x0313dolphin-emu/dolphin\x03\x1f] \x0303s\ufeffepalani\x03 approved pull request #14978 (CPU: Fix quickly-stopped games hanging Dolphin): \x1f\x0302https://dolp.in/pr14978#pullrequestreview-5756715873\x03\x1f', 'type': 'notification'}
2026-11-03T17:20:35.099878 {'source': 'notifications', 'msg': '[\x1f\x0313dolphin-emu/dolphin\x03\x1f] \x0303J\ufeffMC47\x03 commented on #14974 (Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware): \x1f\x0302https://dolp.in/pr14974#issuecomment-6610744775\x03\x1f', 'type': 'notification'}
2026-11-03T16:57:25.313201 {'source': 'notifications', 'msg': '[\x1f\x0313dolphin-emu/dolphin\x03\x1f] \x0303s\ufeffepalani\x03 approved pull request #14967 (Common: Add helper function to set SO_REUSEADDR on TCP sockets on non-Windows.): \x1f\x0302https://dolp.in/pr14967#pullrequestreview-5756288334\x03\x1f', 'type': 'notification'}
2026-11-03T16:24:33.637506 {'source': 'notifications', 'msg': 'Issue 14175 created: "Retroachievements" by \x0303C\ufeffloudgaming7882\x03 - \x1f\x0302https://dolp.in/i14175\x03\x1f', 'type': 'notification'}
2026-11-03T16:04:15.404686 {'source': 'notifications', 'msg': '[\x1f\x0313dolphin-emu/dolphin\x03\x1f] \x0303d\ufeffebug687\x03 edited a comment on #14974 (Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware): \x1f\x0302https://dolp.in/pr14974#issuecomment-6608556659\x03\x1f', 'type': 'notification'}
2026-11-03T15:53:34.139761 {'source': 'notifications', 'msg': '[\x1f\x0313dolphin-emu/dolphin\x03\x1f] \x0303d\ufeffebug687\x03 commented on #14974 (Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware): \x1f\x0302https://dolp.in/pr14974#issuecomment-6608556659\x03\x1f', 'type': 'notification'}
2026-11-03T13:37:27.061934 {'source': 'notifications', 'msg': 'Update 3 to issue 14172 ("Can\'t select any interface language other than English on macOS since v2609") by \x0303O\ufeffatmealDome\x03 - \x1f\x0302https://dolp.in/i14172/3\x03\x1f', 'type': 'notification'}
2026-11-03T13:27:00.906807 {'source': 'notifications', 'msg': '[\x1f\x0313dolphin-emu/dolphin\x03\x1f] \x0303J\ufeffoshuaVandaele\x03 edited pull request #14978: CPU: Fix quickly-stopped games hanging Dolphin (\x0306master\x03...\x0306quick-stop-hang\x03): \x1f\x0302https://dolp.in/pr14978\x03\x1f', 'type': 'notification'}
2026-11-03T13:25:13.030891 {'source': 'notifications', 'msg': '[\x1f\x0313dolphin-emu/dolphin\x03\x1f] \x0303J\ufeffoshuaVandaele\x03 opened pull request #14978: CPU: Fix quickly-stopped games hanging Dolphin (\x0306master\x03...\x0306quick-stop-hang\x03): \x1f\x0302https://dolp.in/pr14978\x03\x1f', 'type': 'notification'}
2026-11-03T12:21:21.895006 {'source': 'notifications', 'msg': '[\x1f\x0313dolphin-emu/dolphin\x03\x1f] \x0303J\ufeffoshuaVandaele\x03 reviewed and commented on pull request #14974 (Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware): \x1f\x0302https://dolp.in/pr14974#pullrequestreview-5749202729\x03\x1f', 'type': 'notification'}
2026-11-03T11:23:59.208000 {'source': 'notifications', 'msg': '[\x1f\x0313dolphin-emu/dolphin\x03\x1f] \x0303L\ufeffinkinworm\x03 commented on #14827 (Android: Implement Save File Manager): \x1f\x0302https://dolp.in/pr14827#issuecomment-6602531884\x03\x1f', 'type': 'notification'}
2026-11-03T11:08:40.291616 {'source': 'notifications', 'msg': '[\x1f\x0313dolphin-emu/dolphin\x03\x1f] \x0303j\ufeffordan-woyak\x03 edited pull request #14977: Common/Logging: Eliminate fstream and mutex in FileLogListener with new LogIOFile class. (\x0306master\x03...\x0306log-file-no-mutex\x03): \x1f\x0302https://dolp.in/pr14977\x03\x1f', 'type': 'notification'}
2026-11-03T11:01:41.729458 {'source': 'notifications', 'msg': '[\x1f\x0313dolphin-emu/dolphin\x03\x1f] \x0303j\ufeffordan-woyak\x03 opened pull request #14977: Common/Logging: Eliminate fstream and mutex in FileLogListener with new LogIOFile class. (\x0306master\x03...\x0306log-file-no-mutex\x03): \x1f\x0302https://dolp.in/pr14977\x03\x1f', 'type': 'notification'}
2026-11-03T10:14:35.779505 {'source': 'notifications', 'msg': '[\x1f\x0313dolphin-emu/dolphin\x03\x1f] \x0303M\ufeffayImilae\x03 commented on #14974 (Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware): \x1f\x0302https://dolp.in/pr14974#issuecomment-6600903825\x03\x1f', 'type': 'notification'}
2026-11-03T09:32:36.231742 {'source': 'notifications', 'msg': '[\x1f\x0313dolphin-emu/dolphin\x03\x1f] \x0303j\ufeffordan-woyak\x03 commented on #13653 (UICommon/GameFile: File name column will show the directory name for extracted games): \x1f\x0302https://dolp.in/pr13653#issuecomment-6600080894\x03\x1f', 'type': 'notification'}
2026-11-03T09:31:33.569008 {'source': 'notifications', 'msg': '[\x1f\x0313dolphin-emu/dolphin\x03\x1f] \x0303j\ufeffordan-woyak\x03 dismissed their review on pull request #13653 (UICommon/GameFile: File name column will show the directory name for extracted games): \x1f\x0302https://dolp.in/pr13653#pullrequestreview-2838078461\x03\x1f', 'type': 'notification'}
2026-11-03T09:05:23.489532 {'source': 'notifications', 'msg': '[\x1f\x0313dolphin-emu/dolphin\x03\x1f] \x0303j\ufeffordan-woyak\x03 edited a comment on #14974 (Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware): \x1f\x0302https://dolp.in/pr14974#issuecomment-6599524923\x03\x1f', 'type': 'notification'}
2026-11-03T09:04:46.354018 {'source': 'notifications', 'msg': '[\x1f\x0313dolphin-emu/dolphin\x03\x1f] \x0303j\ufeffordan-woyak\x03 edited a comment on #14974 (Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware): \x1f\x0302https://dolp.in/pr14974#issuecomment-6599524923\x03\x1f', 'type': 'notification'}
2026-11-03T09:03:10.227593 {'source': 'notifications', 'msg': '[\x1f\x0313dolphin-emu/dolphin\x03\x1f] \x0303j\ufeffordan-woyak\x03 commented on #14974 (Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware): \x1f\x0302https://dolp.in/pr14974#issuecomment-6599524923\x03\x1f', 'type': 'notification'}
2026-11-03T08:57:52.277037 {'source': 'notifications', 'msg': '[\x1f\x0313dolphin-emu/dolphin\x03\x1f] \x0303m\ufeffbc07\x03 commented on #14974 (Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware): \x1f\x0302https://dolp.in/pr14974#issuecomment-6599431123\x03\x1f', 'type': 'notification'}
2026-11-03T08:10:55.602945 {'source': 'notifications', 'msg': '[\x1f\x0313dolphin-emu/dolphin\x03\x1f] \x0303s\ufeffepalani\x03 commented on #14774 (Refactor the GameCube microphone code): \x1f\x0302https://dolp.in/pr14774#issuecomment-6598613359\x03\x1f', 'type': 'notification'}
2026-11-03T07:00:16.125896 {'source': 'notifications', 'msg': '[\x1f\x0313dolphin-emu/dolphin\x03\x1f] \x0303s\ufeffepalani\x03 synchronized pull request #14774: Refactor the GameCube microphone code (\x0306master\x03...\x0306mic-dedup2\x03): \x1f\x0302https://dolp.in/pr14774\x03\x1f', 'type': 'notification'}
Recent 'pull_request_fifoci_status' events
2026-11-03T14:41:26.832704 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '0436c9f60eb1e815a65f01d5edb6a5a155911553', 'service': 'pr-fifoci-sw-lin-mesa', 'pr': 14978, 'type': 'pull_request_fifoci_status'}
2026-11-03T14:30:00.779526 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '0436c9f60eb1e815a65f01d5edb6a5a155911553', 'service': 'pr-fifoci-vk-lin-mesa', 'pr': 14978, 'type': 'pull_request_fifoci_status'}
2026-11-03T14:14:11.535782 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '0436c9f60eb1e815a65f01d5edb6a5a155911553', 'service': 'pr-fifoci-ogl-lin-mesa', 'pr': 14978, 'type': 'pull_request_fifoci_status'}
2026-11-03T14:00:06.711768 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '0436c9f60eb1e815a65f01d5edb6a5a155911553', 'service': 'pr-fifoci-mvk-osx-m1', 'pr': 14978, 'type': 'pull_request_fifoci_status'}
2026-11-03T13:49:18.653069 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '0436c9f60eb1e815a65f01d5edb6a5a155911553', 'service': 'pr-fifoci-mtl-osx-m1', 'pr': 14978, 'type': 'pull_request_fifoci_status'}
2026-11-03T13:03:50.588695 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': 'd2c0bddaf1035e483965c73724f549814ba7b374', 'service': 'pr-fifoci-sw-lin-mesa', 'pr': 14977, 'type': 'pull_request_fifoci_status'}
2026-11-03T12:52:13.958683 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': 'ed0e14952a6797d33e14d9a377fa413c1f2de917', 'service': 'pr-fifoci-sw-lin-mesa', 'pr': 14774, 'type': 'pull_request_fifoci_status'}
2026-11-03T12:41:18.261130 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '81ac5fe3798f401e68bbe6f2e073bf87c3fac890', 'service': 'pr-fifoci-sw-lin-mesa', 'pr': 14976, 'type': 'pull_request_fifoci_status'}
2026-11-03T12:33:07.679003 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '267ac1b044ff3279fdfb0ffbe385cd7e832321d7', 'service': 'pr-fifoci-sw-lin-mesa', 'pr': 14973, 'type': 'pull_request_fifoci_status'}
2026-11-03T12:24:45.864565 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'service': 'pr-fifoci-sw-lin-mesa', 'pr': 14974, 'type': 'pull_request_fifoci_status'}
2026-11-03T12:15:30.292233 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': 'd2c0bddaf1035e483965c73724f549814ba7b374', 'service': 'pr-fifoci-vk-lin-mesa', 'pr': 14977, 'type': 'pull_request_fifoci_status'}
2026-11-03T11:59:49.295169 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': 'd2c0bddaf1035e483965c73724f549814ba7b374', 'service': 'pr-fifoci-ogl-lin-mesa', 'pr': 14977, 'type': 'pull_request_fifoci_status'}
2026-11-03T11:40:39.235200 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': 'e8b61a7708c2421982bda730345f93bda883ca85', 'service': 'pr-fifoci-sw-lin-mesa', 'pr': 14971, 'type': 'pull_request_fifoci_status'}
2026-11-03T11:36:05.031501 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': 'd2c0bddaf1035e483965c73724f549814ba7b374', 'service': 'pr-fifoci-mvk-osx-m1', 'pr': 14977, 'type': 'pull_request_fifoci_status'}
2026-11-03T11:25:37.414664 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': 'd2c0bddaf1035e483965c73724f549814ba7b374', 'service': 'pr-fifoci-mtl-osx-m1', 'pr': 14977, 'type': 'pull_request_fifoci_status'}
2026-11-03T11:13:39.879567 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': 'dca48fcd3ffeae3502a79d10c4199410a9a2298f', 'service': 'pr-fifoci-sw-lin-mesa', 'pr': 14970, 'type': 'pull_request_fifoci_status'}
2026-11-03T10:57:56.989132 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': 'eda78a7e44c7e1dc52d3c0ce6d3a57fbe91734cc', 'service': 'pr-fifoci-sw-lin-mesa', 'pr': 14968, 'type': 'pull_request_fifoci_status'}
2026-11-03T10:50:36.548431 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '1aa8fdf4a722666cb5cd4dddd7b1dfe3435f065c', 'service': 'pr-fifoci-sw-lin-mesa', 'pr': 14969, 'type': 'pull_request_fifoci_status'}
2026-11-03T10:43:09.014351 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '86afda54a78b6af8e1e154d93785377c5fbcddd8', 'service': 'pr-fifoci-sw-lin-mesa', 'pr': 14923, 'type': 'pull_request_fifoci_status'}
2026-11-03T10:35:19.410142 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '824dcf229374473c20bd37143ec1c1f6c2a8d663', 'service': 'pr-fifoci-sw-lin-mesa', 'pr': 14967, 'type': 'pull_request_fifoci_status'}
2026-11-03T10:24:14.064414 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': 'd08bddeaabbfba79f76407018ab02bdf68fa2d46', 'service': 'pr-fifoci-sw-lin-mesa', 'pr': 14972, 'type': 'pull_request_fifoci_status'}
2026-11-03T10:13:13.016521 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '814e11dace409c67172618a2fc01c1fc6a313aae', 'service': 'pr-fifoci-sw-lin-mesa', 'pr': 14819, 'type': 'pull_request_fifoci_status'}
2026-11-03T10:05:29.890410 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': 'ed0e14952a6797d33e14d9a377fa413c1f2de917', 'service': 'pr-fifoci-vk-lin-mesa', 'pr': 14774, 'type': 'pull_request_fifoci_status'}
2026-11-03T09:49:55.704935 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '81ac5fe3798f401e68bbe6f2e073bf87c3fac890', 'service': 'pr-fifoci-vk-lin-mesa', 'pr': 14976, 'type': 'pull_request_fifoci_status'}
2026-11-03T09:37:12.368480 {'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '267ac1b044ff3279fdfb0ffbe385cd7e832321d7', 'service': 'pr-fifoci-vk-lin-mesa', 'pr': 14973, 'type': 'pull_request_fifoci_status'}
Recent 'raw_bb_hook' events
2026-11-03T17:48:15.665211 {'source': 'webserver', 'raw': {'buildid': 196344, 'number': 10919, 'builderid': 27, 'buildrequestid': 196927, 'workerid': 10, 'masterid': 1, 'started_at': 1793728063, 'complete_at': None, 'locks_duration_s': 0, 'complete': False, 'state_string': 'starting', 'results': None, 'properties': {'shortrev': ['815909', 'Change'], 'codebase': ['', 'Build'], 'scheduler': ['pr', 'Scheduler'], 'buildnumber': [10919, 'Build'], 'workername': ['ubuntu-lts', 'Worker'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build'], 'branchname': ['pr-14979', 'Change'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'pr_id': [14979, 'Change'], 'builderid': [27, 'Builder'], 'project': ['', 'Build'], 'headrev': ['8159092533e9160c64df47f9001b55a24ae16633', 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'buildername': ['pr-ubu-x64', 'Builder'], 'branch': ['refs/pull/14979/head', 'Build'], 'revision': ['8159092533e9160c64df47f9001b55a24ae16633', 'Build'], 'repository': ['', 'Build']}, 'buildrequest': {'buildrequestid': 196927, 'buildsetid': 44103, 'builderid': 27, 'priority': 0, 'claimed': True, 'claimed_at': 1793728063, 'claimed_by_masterid': 1, 'complete': False, 'results': -1, 'submitted_at': 1793728059, 'complete_at': None, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44103, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793728059, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13235, 'branch': 'refs/pull/14979/head', 'revision': '8159092533e9160c64df47f9001b55a24ae16633', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793728059, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 27, 'name': 'pr-ubu-x64', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/27/builds/10919'}, 'type': 'raw_bb_hook'}
2026-11-03T17:48:13.588025 {'source': 'webserver', 'raw': {'buildid': 196338, 'number': 10929, 'builderid': 11, 'buildrequestid': 196923, 'workerid': 1, 'masterid': 1, 'started_at': 1793728060, 'complete_at': None, 'locks_duration_s': 0, 'complete': False, 'state_string': 'starting', 'results': None, 'properties': {'branchname': ['pr-14979', 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'scheduler': ['pr', 'Scheduler'], 'builderid': [11, 'Builder'], 'workername': ['freebsd', 'Worker'], 'buildnumber': [10929, 'Build'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'headrev': ['8159092533e9160c64df47f9001b55a24ae16633', 'Change'], 'shortrev': ['815909', 'Change'], 'buildername': ['pr-freebsd-x64', 'Builder'], 'pr_id': [14979, 'Change'], 'branch': ['refs/pull/14979/head', 'Build'], 'revision': ['8159092533e9160c64df47f9001b55a24ae16633', 'Build'], 'repository': ['', 'Build'], 'project': ['', 'Build'], 'codebase': ['', 'Build'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build']}, 'buildrequest': {'buildrequestid': 196923, 'buildsetid': 44103, 'builderid': 11, 'priority': 0, 'claimed': True, 'claimed_at': 1793728060, 'claimed_by_masterid': 1, 'complete': False, 'results': -1, 'submitted_at': 1793728059, 'complete_at': None, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44103, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793728059, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13235, 'branch': 'refs/pull/14979/head', 'revision': '8159092533e9160c64df47f9001b55a24ae16633', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793728059, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 11, 'name': 'pr-freebsd-x64', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/11/builds/10929'}, 'type': 'raw_bb_hook'}
2026-11-03T17:48:13.034957 {'source': 'webserver', 'raw': {'buildid': 196342, 'number': 10917, 'builderid': 26, 'buildrequestid': 196926, 'workerid': 9, 'masterid': 1, 'started_at': 1793728060, 'complete_at': None, 'locks_duration_s': 0, 'complete': False, 'state_string': 'starting', 'results': None, 'properties': {'revision': ['8159092533e9160c64df47f9001b55a24ae16633', 'Build'], 'branchname': ['pr-14979', 'Change'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'shortrev': ['815909', 'Change'], 'headrev': ['8159092533e9160c64df47f9001b55a24ae16633', 'Change'], 'buildnumber': [10917, 'Build'], 'project': ['', 'Build'], 'pr_id': [14979, 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'scheduler': ['pr', 'Scheduler'], 'buildername': ['pr-deb-x64', 'Builder'], 'builderid': [26, 'Builder'], 'workername': ['debian', 'Worker'], 'branch': ['refs/pull/14979/head', 'Build'], 'repository': ['', 'Build'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build'], 'codebase': ['', 'Build']}, 'buildrequest': {'buildrequestid': 196926, 'buildsetid': 44103, 'builderid': 26, 'priority': 0, 'claimed': True, 'claimed_at': 1793728060, 'claimed_by_masterid': 1, 'complete': False, 'results': -1, 'submitted_at': 1793728059, 'complete_at': None, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44103, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793728059, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13235, 'branch': 'refs/pull/14979/head', 'revision': '8159092533e9160c64df47f9001b55a24ae16633', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793728059, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 26, 'name': 'pr-deb-x64', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/26/builds/10917'}, 'type': 'raw_bb_hook'}
2026-11-03T17:48:12.611030 {'source': 'webserver', 'raw': {'buildid': 196343, 'number': 10938, 'builderid': 7, 'buildrequestid': 196921, 'workerid': 8, 'masterid': 1, 'started_at': 1793728060, 'complete_at': None, 'locks_duration_s': 0, 'complete': False, 'state_string': 'starting', 'results': None, 'properties': {'headrev': ['8159092533e9160c64df47f9001b55a24ae16633', 'Change'], 'shortrev': ['815909', 'Change'], 'buildnumber': [10938, 'Build'], 'pr_id': [14979, 'Change'], 'workername': ['osx-m1', 'Worker'], 'repository': ['', 'Build'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'scheduler': ['pr', 'Scheduler'], 'buildername': ['pr-osx-universal', 'Builder'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build'], 'branch': ['refs/pull/14979/head', 'Build'], 'codebase': ['', 'Build'], 'project': ['', 'Build'], 'branchname': ['pr-14979', 'Change'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'builderid': [7, 'Builder'], 'revision': ['8159092533e9160c64df47f9001b55a24ae16633', 'Build']}, 'buildrequest': {'buildrequestid': 196921, 'buildsetid': 44103, 'builderid': 7, 'priority': 0, 'claimed': True, 'claimed_at': 1793728060, 'claimed_by_masterid': 1, 'complete': False, 'results': -1, 'submitted_at': 1793728059, 'complete_at': None, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44103, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793728059, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13235, 'branch': 'refs/pull/14979/head', 'revision': '8159092533e9160c64df47f9001b55a24ae16633', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793728059, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 7, 'name': 'pr-osx-universal', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/7/builds/10938'}, 'type': 'raw_bb_hook'}
2026-11-03T17:48:09.079148 {'source': 'webserver', 'raw': {'buildid': 196332, 'number': 6066, 'builderid': 43, 'buildrequestid': 196915, 'workerid': 13, 'masterid': 1, 'started_at': 1793727862, 'complete_at': 1793728069, 'locks_duration_s': 0, 'complete': True, 'state_string': 'build successful', 'results': 0, 'properties': {'branchname': ['pr-14979', 'Change'], 'workername': ['altair-flatpak', 'Worker'], 'basedir': ['/var/lib/flatpak-worker/worker', 'Worker'], 'builddir': ['/var/lib/flatpak-worker/worker/pr-flatpak-x64', 'Worker'], 'fm_build_url': ['https://flat-manager.dolphin-emu.org/api/v1/build/13391', 'SetPropertyFromCommand Step'], 'shortrev': ['889421', 'Change'], 'buildnumber': [6066, 'Build'], 'got_revision': ['889421211027958ff6af2264b2ba970b5645b142', 'GitNoBranch'], 'headrev': ['889421211027958ff6af2264b2ba970b5645b142', 'Change'], 'pr_id': [14979, 'Change'], 'branch': ['refs/pull/14979/head', 'Build'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'codebase': ['', 'Build'], 'revision': ['889421211027958ff6af2264b2ba970b5645b142', 'Build'], 'buildername': ['pr-flatpak-x64', 'Builder'], 'repository': ['', 'Build'], 'scheduler': ['pr', 'Scheduler'], 'project': ['', 'Build'], 'builderid': [43, 'Builder'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build']}, 'buildrequest': {'buildrequestid': 196915, 'buildsetid': 44102, 'builderid': 43, 'priority': 0, 'claimed': True, 'claimed_at': 1793727862, 'claimed_by_masterid': 1, 'complete': True, 'results': 0, 'submitted_at': 1793727862, 'complete_at': 1793728069, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44102, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793727862, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13234, 'branch': 'refs/pull/14979/head', 'revision': '889421211027958ff6af2264b2ba970b5645b142', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793727862, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 43, 'name': 'pr-flatpak-x64', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/43/builds/6066'}, 'type': 'raw_bb_hook'}
2026-11-03T17:47:57.206183 {'source': 'webserver', 'raw': {'buildid': 196341, 'number': 10925, 'builderid': 22, 'buildrequestid': 196925, 'workerid': 12, 'masterid': 1, 'started_at': 1793728060, 'complete_at': 1793728077, 'locks_duration_s': 0, 'complete': True, 'state_string': 'build successful', 'results': 0, 'properties': {'branchname': ['pr-14979', 'Change'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'headrev': ['8159092533e9160c64df47f9001b55a24ae16633', 'Change'], 'builderid': [22, 'Builder'], 'shortrev': ['815909', 'Change'], 'pr_id': [14979, 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'branch': ['refs/pull/14979/head', 'Build'], 'revision': ['8159092533e9160c64df47f9001b55a24ae16633', 'Build'], 'workername': ['android', 'Worker'], 'buildername': ['pr-android', 'Builder'], 'scheduler': ['pr', 'Scheduler'], 'buildnumber': [10925, 'Build'], 'codebase': ['', 'Build'], 'repository': ['', 'Build'], 'project': ['', 'Build'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build'], 'basedir': ['/buildbot', 'Worker'], 'builddir': ['/buildbot/pr-android', 'Worker'], 'got_revision': ['8159092533e9160c64df47f9001b55a24ae16633', 'GitNoBranch']}, 'buildrequest': {'buildrequestid': 196925, 'buildsetid': 44103, 'builderid': 22, 'priority': 0, 'claimed': True, 'claimed_at': 1793728060, 'claimed_by_masterid': 1, 'complete': False, 'results': -1, 'submitted_at': 1793728059, 'complete_at': None, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44103, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793728059, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13235, 'branch': 'refs/pull/14979/head', 'revision': '8159092533e9160c64df47f9001b55a24ae16633', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793728059, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 22, 'name': 'pr-android', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/22/builds/10925'}, 'type': 'raw_bb_hook'}
2026-11-03T17:47:49.762349 {'source': 'webserver', 'raw': {'buildid': 196345, 'number': 6067, 'builderid': 43, 'buildrequestid': 196929, 'workerid': 13, 'masterid': 1, 'started_at': 1793728069, 'complete_at': None, 'locks_duration_s': 0, 'complete': False, 'state_string': 'starting', 'results': None, 'properties': {'branchname': ['pr-14979', 'Change'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'headrev': ['8159092533e9160c64df47f9001b55a24ae16633', 'Change'], 'shortrev': ['815909', 'Change'], 'pr_id': [14979, 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'codebase': ['', 'Build'], 'scheduler': ['pr', 'Scheduler'], 'buildername': ['pr-flatpak-x64', 'Builder'], 'builderid': [43, 'Builder'], 'workername': ['altair-flatpak', 'Worker'], 'branch': ['refs/pull/14979/head', 'Build'], 'revision': ['8159092533e9160c64df47f9001b55a24ae16633', 'Build'], 'repository': ['', 'Build'], 'buildnumber': [6067, 'Build'], 'project': ['', 'Build'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build']}, 'buildrequest': {'buildrequestid': 196929, 'buildsetid': 44103, 'builderid': 43, 'priority': 0, 'claimed': True, 'claimed_at': 1793728069, 'claimed_by_masterid': 1, 'complete': False, 'results': -1, 'submitted_at': 1793728059, 'complete_at': None, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44103, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793728059, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13235, 'branch': 'refs/pull/14979/head', 'revision': '8159092533e9160c64df47f9001b55a24ae16633', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793728059, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 43, 'name': 'pr-flatpak-x64', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/43/builds/6067'}, 'type': 'raw_bb_hook'}
2026-11-03T17:47:43.584027 {'source': 'webserver', 'raw': {'buildid': 196337, 'number': 10922, 'builderid': 9, 'buildrequestid': 196922, 'workerid': 10, 'masterid': 1, 'started_at': 1793728060, 'complete_at': 1793728063, 'locks_duration_s': 0, 'complete': True, 'state_string': 'build successful', 'results': 0, 'properties': {'branchname': ['pr-14979', 'Change'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'buildername': ['lint', 'Builder'], 'buildnumber': [10922, 'Build'], 'repository': ['', 'Build'], 'codebase': ['', 'Build'], 'project': ['', 'Build'], 'headrev': ['8159092533e9160c64df47f9001b55a24ae16633', 'Change'], 'shortrev': ['815909', 'Change'], 'pr_id': [14979, 'Change'], 'branch': ['refs/pull/14979/head', 'Build'], 'revision': ['8159092533e9160c64df47f9001b55a24ae16633', 'Build'], 'scheduler': ['pr', 'Scheduler'], 'workername': ['ubuntu-lts', 'Worker'], 'builderid': [9, 'Builder'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build'], 'basedir': ['/buildbot', 'Worker'], 'builddir': ['/buildbot/lint', 'Worker'], 'got_revision': ['8159092533e9160c64df47f9001b55a24ae16633', 'GitNoBranch']}, 'buildrequest': {'buildrequestid': 196922, 'buildsetid': 44103, 'builderid': 9, 'priority': 0, 'claimed': True, 'claimed_at': 1793728060, 'claimed_by_masterid': 1, 'complete': False, 'results': -1, 'submitted_at': 1793728059, 'complete_at': None, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44103, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793728059, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13235, 'branch': 'refs/pull/14979/head', 'revision': '8159092533e9160c64df47f9001b55a24ae16633', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793728059, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 9, 'name': 'lint', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/9/builds/10922'}, 'type': 'raw_bb_hook'}
2026-11-03T17:47:40.546162 {'source': 'webserver', 'raw': {'buildid': 196341, 'number': 10925, 'builderid': 22, 'buildrequestid': 196925, 'workerid': 12, 'masterid': 1, 'started_at': 1793728060, 'complete_at': None, 'locks_duration_s': 0, 'complete': False, 'state_string': 'starting', 'results': None, 'properties': {'branchname': ['pr-14979', 'Change'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'headrev': ['8159092533e9160c64df47f9001b55a24ae16633', 'Change'], 'builderid': [22, 'Builder'], 'shortrev': ['815909', 'Change'], 'pr_id': [14979, 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'branch': ['refs/pull/14979/head', 'Build'], 'revision': ['8159092533e9160c64df47f9001b55a24ae16633', 'Build'], 'workername': ['android', 'Worker'], 'buildername': ['pr-android', 'Builder'], 'scheduler': ['pr', 'Scheduler'], 'buildnumber': [10925, 'Build'], 'codebase': ['', 'Build'], 'repository': ['', 'Build'], 'project': ['', 'Build'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build']}, 'buildrequest': {'buildrequestid': 196925, 'buildsetid': 44103, 'builderid': 22, 'priority': 0, 'claimed': True, 'claimed_at': 1793728060, 'claimed_by_masterid': 1, 'complete': False, 'results': -1, 'submitted_at': 1793728059, 'complete_at': None, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44103, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793728059, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13235, 'branch': 'refs/pull/14979/head', 'revision': '8159092533e9160c64df47f9001b55a24ae16633', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793728059, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 22, 'name': 'pr-android', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/22/builds/10925'}, 'type': 'raw_bb_hook'}
2026-11-03T17:47:40.432069 {'source': 'webserver', 'raw': {'buildid': 196340, 'number': 165, 'builderid': 50, 'buildrequestid': 196932, 'workerid': 16, 'masterid': 1, 'started_at': 1793728060, 'complete_at': None, 'locks_duration_s': 0, 'complete': False, 'state_string': 'starting', 'results': None, 'properties': {'workername': ['deneb-appimage', 'Worker'], 'pr_id': [14979, 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'scheduler': ['pr', 'Scheduler'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'headrev': ['8159092533e9160c64df47f9001b55a24ae16633', 'Change'], 'branchname': ['pr-14979', 'Change'], 'shortrev': ['815909', 'Change'], 'buildername': ['pr-appimage-arm64', 'Builder'], 'builderid': [50, 'Builder'], 'buildnumber': [165, 'Build'], 'branch': ['refs/pull/14979/head', 'Build'], 'revision': ['8159092533e9160c64df47f9001b55a24ae16633', 'Build'], 'repository': ['', 'Build'], 'codebase': ['', 'Build'], 'project': ['', 'Build'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build']}, 'buildrequest': {'buildrequestid': 196932, 'buildsetid': 44103, 'builderid': 50, 'priority': 0, 'claimed': True, 'claimed_at': 1793728060, 'claimed_by_masterid': 1, 'complete': False, 'results': -1, 'submitted_at': 1793728059, 'complete_at': None, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44103, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793728059, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13235, 'branch': 'refs/pull/14979/head', 'revision': '8159092533e9160c64df47f9001b55a24ae16633', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793728059, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 50, 'name': 'pr-appimage-arm64', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/50/builds/165'}, 'type': 'raw_bb_hook'}
2026-11-03T17:47:40.411500 {'source': 'webserver', 'raw': {'buildid': 196339, 'number': 171, 'builderid': 49, 'buildrequestid': 196931, 'workerid': 15, 'masterid': 1, 'started_at': 1793728060, 'complete_at': None, 'locks_duration_s': 0, 'complete': False, 'state_string': 'starting', 'results': None, 'properties': {'branchname': ['pr-14979', 'Change'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'pr_id': [14979, 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'shortrev': ['815909', 'Change'], 'builderid': [49, 'Builder'], 'project': ['', 'Build'], 'headrev': ['8159092533e9160c64df47f9001b55a24ae16633', 'Change'], 'repository': ['', 'Build'], 'codebase': ['', 'Build'], 'scheduler': ['pr', 'Scheduler'], 'buildername': ['pr-appimage-x64', 'Builder'], 'workername': ['altair-appimage', 'Worker'], 'buildnumber': [171, 'Build'], 'branch': ['refs/pull/14979/head', 'Build'], 'revision': ['8159092533e9160c64df47f9001b55a24ae16633', 'Build'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build']}, 'buildrequest': {'buildrequestid': 196931, 'buildsetid': 44103, 'builderid': 49, 'priority': 0, 'claimed': True, 'claimed_at': 1793728060, 'claimed_by_masterid': 1, 'complete': False, 'results': -1, 'submitted_at': 1793728059, 'complete_at': None, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44103, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793728059, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13235, 'branch': 'refs/pull/14979/head', 'revision': '8159092533e9160c64df47f9001b55a24ae16633', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793728059, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 49, 'name': 'pr-appimage-x64', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/49/builds/171'}, 'type': 'raw_bb_hook'}
2026-11-03T17:47:40.356522 {'source': 'webserver', 'raw': {'buildid': 196337, 'number': 10922, 'builderid': 9, 'buildrequestid': 196922, 'workerid': 10, 'masterid': 1, 'started_at': 1793728060, 'complete_at': None, 'locks_duration_s': 0, 'complete': False, 'state_string': 'starting', 'results': None, 'properties': {'branchname': ['pr-14979', 'Change'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'buildername': ['lint', 'Builder'], 'buildnumber': [10922, 'Build'], 'repository': ['', 'Build'], 'codebase': ['', 'Build'], 'project': ['', 'Build'], 'headrev': ['8159092533e9160c64df47f9001b55a24ae16633', 'Change'], 'shortrev': ['815909', 'Change'], 'pr_id': [14979, 'Change'], 'branch': ['refs/pull/14979/head', 'Build'], 'revision': ['8159092533e9160c64df47f9001b55a24ae16633', 'Build'], 'scheduler': ['pr', 'Scheduler'], 'workername': ['ubuntu-lts', 'Worker'], 'builderid': [9, 'Builder'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build']}, 'buildrequest': {'buildrequestid': 196922, 'buildsetid': 44103, 'builderid': 9, 'priority': 0, 'claimed': True, 'claimed_at': 1793728060, 'claimed_by_masterid': 1, 'complete': False, 'results': -1, 'submitted_at': 1793728059, 'complete_at': None, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44103, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793728059, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13235, 'branch': 'refs/pull/14979/head', 'revision': '8159092533e9160c64df47f9001b55a24ae16633', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793728059, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 9, 'name': 'lint', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/9/builds/10922'}, 'type': 'raw_bb_hook'}
2026-11-03T17:47:20.655774 {'source': 'webserver', 'raw': {'buildid': 196336, 'number': 10919, 'builderid': 2, 'buildrequestid': 196906, 'workerid': 4, 'masterid': 1, 'started_at': 1793728026, 'complete_at': None, 'locks_duration_s': 0, 'complete': False, 'state_string': 'starting', 'results': None, 'properties': {'branchname': ['pr-14979', 'Change'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'shortrev': ['889421', 'Change'], 'scheduler': ['pr', 'Scheduler'], 'builderid': [2, 'Builder'], 'buildnumber': [10919, 'Build'], 'revision': ['889421211027958ff6af2264b2ba970b5645b142', 'Build'], 'codebase': ['', 'Build'], 'project': ['', 'Build'], 'headrev': ['889421211027958ff6af2264b2ba970b5645b142', 'Change'], 'pr_id': [14979, 'Change'], 'workername': ['windows', 'Worker'], 'repository': ['', 'Build'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'buildername': ['pr-win-x64', 'Builder'], 'branch': ['refs/pull/14979/head', 'Build']}, 'buildrequest': {'buildrequestid': 196906, 'buildsetid': 44102, 'builderid': 2, 'priority': 0, 'claimed': True, 'claimed_at': 1793728026, 'claimed_by_masterid': 1, 'complete': False, 'results': -1, 'submitted_at': 1793727862, 'complete_at': None, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44102, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793727862, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13234, 'branch': 'refs/pull/14979/head', 'revision': '889421211027958ff6af2264b2ba970b5645b142', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793727862, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 2, 'name': 'pr-win-x64', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/2/builds/10919'}, 'type': 'raw_bb_hook'}
2026-11-03T17:47:20.311394 {'source': 'webserver', 'raw': {'buildid': 196331, 'number': 10917, 'builderid': 13, 'buildrequestid': 196910, 'workerid': 4, 'masterid': 1, 'started_at': 1793727862, 'complete_at': 1793728026, 'locks_duration_s': 0, 'complete': True, 'state_string': 'build successful', 'results': 0, 'properties': {'codebase': ['', 'Build'], 'basedir': ['c:\\buildbot', 'Worker'], 'warnings-count': [7, 'WarningCountingShellCommand'], 'build_url': ['https://dl.dolphin-emu.org/prs/0f/6f/pr-14979-dolphin-latest-arm64.7z', 'SetProperty'], 'pr_id': [14979, 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'scheduler': ['pr', 'Scheduler'], 'builddir': ['c:\\buildbot\\pr-win-arm64', 'Worker'], 'branchname': ['pr-14979', 'Change'], 'buildername': ['pr-win-arm64', 'Builder'], 'builderid': [13, 'Builder'], 'branch': ['refs/pull/14979/head', 'Build'], 'revision': ['889421211027958ff6af2264b2ba970b5645b142', 'Build'], 'got_revision': ['889421211027958ff6af2264b2ba970b5645b142', 'GitNoBranch'], 'shortrev': ['889421', 'Change'], 'project': ['', 'Build'], 'sln_exists': ['false', 'SetPropertyFromCommand Step'], 'workername': ['windows', 'Worker'], 'repository': ['', 'Build'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'headrev': ['889421211027958ff6af2264b2ba970b5645b142', 'Change'], 'buildnumber': [10917, 'Build'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build']}, 'buildrequest': {'buildrequestid': 196910, 'buildsetid': 44102, 'builderid': 13, 'priority': 0, 'claimed': True, 'claimed_at': 1793727862, 'claimed_by_masterid': 1, 'complete': False, 'results': -1, 'submitted_at': 1793727862, 'complete_at': None, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44102, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793727862, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13234, 'branch': 'refs/pull/14979/head', 'revision': '889421211027958ff6af2264b2ba970b5645b142', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793727862, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 13, 'name': 'pr-win-arm64', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/13/builds/10917'}, 'type': 'raw_bb_hook'}
2026-11-03T17:46:25.990588 {'source': 'webserver', 'raw': {'buildid': 196335, 'number': 10917, 'builderid': 1, 'buildrequestid': 196905, 'workerid': 9, 'masterid': 1, 'started_at': 1793727910, 'complete_at': 1793727951, 'locks_duration_s': 0, 'complete': True, 'state_string': 'failed configure (failure)', 'results': 2, 'properties': {'branchname': ['pr-14979', 'Change'], 'basedir': ['/buildbot', 'Worker'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'builddir': ['/buildbot/pr-deb-dbg-x64', 'Worker'], 'headrev': ['889421211027958ff6af2264b2ba970b5645b142', 'Change'], 'got_revision': ['889421211027958ff6af2264b2ba970b5645b142', 'GitNoBranch'], 'shortrev': ['889421', 'Change'], 'branch': ['refs/pull/14979/head', 'Build'], 'revision': ['889421211027958ff6af2264b2ba970b5645b142', 'Build'], 'repository': ['', 'Build'], 'codebase': ['', 'Build'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build'], 'pr_id': [14979, 'Change'], 'builderid': [1, 'Builder'], 'workername': ['debian', 'Worker'], 'buildnumber': [10917, 'Build'], 'scheduler': ['pr', 'Scheduler'], 'buildername': ['pr-deb-dbg-x64', 'Builder'], 'project': ['', 'Build']}, 'buildrequest': {'buildrequestid': 196905, 'buildsetid': 44102, 'builderid': 1, 'priority': 0, 'claimed': True, 'claimed_at': 1793727910, 'claimed_by_masterid': 1, 'complete': True, 'results': 2, 'submitted_at': 1793727862, 'complete_at': 1793727951, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44102, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793727862, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13234, 'branch': 'refs/pull/14979/head', 'revision': '889421211027958ff6af2264b2ba970b5645b142', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793727862, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 1, 'name': 'pr-deb-dbg-x64', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/1/builds/10917'}, 'type': 'raw_bb_hook'}
2026-11-03T17:46:12.414919 {'source': 'webserver', 'raw': {'buildid': 196334, 'number': 10918, 'builderid': 27, 'buildrequestid': 196913, 'workerid': 10, 'masterid': 1, 'started_at': 1793727867, 'complete_at': 1793727916, 'locks_duration_s': 0, 'complete': True, 'state_string': 'failed configure (failure)', 'results': 2, 'properties': {'basedir': ['/buildbot', 'Worker'], 'builddir': ['/buildbot/pr-ubu-x64', 'Worker'], 'got_revision': ['889421211027958ff6af2264b2ba970b5645b142', 'GitNoBranch'], 'branchname': ['pr-14979', 'Change'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'headrev': ['889421211027958ff6af2264b2ba970b5645b142', 'Change'], 'shortrev': ['889421', 'Change'], 'pr_id': [14979, 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'scheduler': ['pr', 'Scheduler'], 'buildername': ['pr-ubu-x64', 'Builder'], 'project': ['', 'Build'], 'builderid': [27, 'Builder'], 'workername': ['ubuntu-lts', 'Worker'], 'buildnumber': [10918, 'Build'], 'branch': ['refs/pull/14979/head', 'Build'], 'revision': ['889421211027958ff6af2264b2ba970b5645b142', 'Build'], 'repository': ['', 'Build'], 'codebase': ['', 'Build'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build']}, 'buildrequest': {'buildrequestid': 196913, 'buildsetid': 44102, 'builderid': 27, 'priority': 0, 'claimed': True, 'claimed_at': 1793727867, 'claimed_by_masterid': 1, 'complete': True, 'results': 2, 'submitted_at': 1793727862, 'complete_at': 1793727916, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44102, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793727862, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13234, 'branch': 'refs/pull/14979/head', 'revision': '889421211027958ff6af2264b2ba970b5645b142', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793727862, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 27, 'name': 'pr-ubu-x64', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/27/builds/10918'}, 'type': 'raw_bb_hook'}
2026-11-03T17:46:11.609422 {'source': 'webserver', 'raw': {'buildid': 196325, 'number': 10928, 'builderid': 11, 'buildrequestid': 196909, 'workerid': 1, 'masterid': 1, 'started_at': 1793727862, 'complete_at': 1793727878, 'locks_duration_s': 0, 'complete': True, 'state_string': 'failed configure (failure)', 'results': 2, 'properties': {'headrev': ['889421211027958ff6af2264b2ba970b5645b142', 'Change'], 'buildername': ['pr-freebsd-x64', 'Builder'], 'branchname': ['pr-14979', 'Change'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'shortrev': ['889421', 'Change'], 'pr_id': [14979, 'Change'], 'builderid': [11, 'Builder'], 'buildnumber': [10928, 'Build'], 'basedir': ['/usr/home/buildbot/freebsd', 'Worker'], 'builddir': ['/usr/home/buildbot/freebsd/pr-freebsd-x64', 'Worker'], 'got_revision': ['889421211027958ff6af2264b2ba970b5645b142', 'GitNoBranch'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'scheduler': ['pr', 'Scheduler'], 'branch': ['refs/pull/14979/head', 'Build'], 'revision': ['889421211027958ff6af2264b2ba970b5645b142', 'Build'], 'repository': ['', 'Build'], 'codebase': ['', 'Build'], 'project': ['', 'Build'], 'workername': ['freebsd', 'Worker'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build']}, 'buildrequest': {'buildrequestid': 196909, 'buildsetid': 44102, 'builderid': 11, 'priority': 0, 'claimed': True, 'claimed_at': 1793727862, 'claimed_by_masterid': 1, 'complete': True, 'results': 2, 'submitted_at': 1793727862, 'complete_at': 1793727878, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44102, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793727862, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13234, 'branch': 'refs/pull/14979/head', 'revision': '889421211027958ff6af2264b2ba970b5645b142', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793727862, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 11, 'name': 'pr-freebsd-x64', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/11/builds/10928'}, 'type': 'raw_bb_hook'}
2026-11-03T17:46:10.908568 {'source': 'webserver', 'raw': {'buildid': 196326, 'number': 170, 'builderid': 49, 'buildrequestid': 196917, 'workerid': 15, 'masterid': 1, 'started_at': 1793727862, 'complete_at': 1793727970, 'locks_duration_s': 0, 'complete': True, 'state_string': 'build successful', 'results': 0, 'properties': {'branchname': ['pr-14979', 'Change'], 'headrev': ['889421211027958ff6af2264b2ba970b5645b142', 'Change'], 'shortrev': ['889421', 'Change'], 'pr_id': [14979, 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'scheduler': ['pr', 'Scheduler'], 'buildername': ['pr-appimage-x64', 'Builder'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'builderid': [49, 'Builder'], 'workername': ['altair-appimage', 'Worker'], 'buildnumber': [170, 'Build'], 'branch': ['refs/pull/14979/head', 'Build'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build'], 'warnings-count': [0, 'WarningCountingShellCommand'], 'codebase': ['', 'Build'], 'project': ['', 'Build'], 'revision': ['889421211027958ff6af2264b2ba970b5645b142', 'Build'], 'repository': ['', 'Build'], 'basedir': ['/buildbot', 'Worker'], 'builddir': ['/buildbot/pr-appimage-x64', 'Worker'], 'got_revision': ['889421211027958ff6af2264b2ba970b5645b142', 'GitNoBranch']}, 'buildrequest': {'buildrequestid': 196917, 'buildsetid': 44102, 'builderid': 49, 'priority': 0, 'claimed': True, 'claimed_at': 1793727862, 'claimed_by_masterid': 1, 'complete': False, 'results': -1, 'submitted_at': 1793727862, 'complete_at': None, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44102, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793727862, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13234, 'branch': 'refs/pull/14979/head', 'revision': '889421211027958ff6af2264b2ba970b5645b142', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793727862, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 49, 'name': 'pr-appimage-x64', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/49/builds/170'}, 'type': 'raw_bb_hook'}
2026-11-03T17:46:10.788032 {'source': 'webserver', 'raw': {'buildid': 196330, 'number': 10916, 'builderid': 26, 'buildrequestid': 196912, 'workerid': 9, 'masterid': 1, 'started_at': 1793727862, 'complete_at': 1793727910, 'locks_duration_s': 0, 'complete': True, 'state_string': 'failed configure (failure)', 'results': 2, 'properties': {'project': ['', 'Build'], 'pr_id': [14979, 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'scheduler': ['pr', 'Scheduler'], 'workername': ['debian', 'Worker'], 'branch': ['refs/pull/14979/head', 'Build'], 'buildername': ['pr-deb-x64', 'Builder'], 'builderid': [26, 'Builder'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build'], 'basedir': ['/buildbot', 'Worker'], 'revision': ['889421211027958ff6af2264b2ba970b5645b142', 'Build'], 'builddir': ['/buildbot/pr-deb-x64', 'Worker'], 'shortrev': ['889421', 'Change'], 'buildnumber': [10916, 'Build'], 'repository': ['', 'Build'], 'codebase': ['', 'Build'], 'got_revision': ['889421211027958ff6af2264b2ba970b5645b142', 'GitNoBranch'], 'branchname': ['pr-14979', 'Change'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'headrev': ['889421211027958ff6af2264b2ba970b5645b142', 'Change']}, 'buildrequest': {'buildrequestid': 196912, 'buildsetid': 44102, 'builderid': 26, 'priority': 0, 'claimed': True, 'claimed_at': 1793727862, 'claimed_by_masterid': 1, 'complete': True, 'results': 2, 'submitted_at': 1793727862, 'complete_at': 1793727910, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44102, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793727862, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13234, 'branch': 'refs/pull/14979/head', 'revision': '889421211027958ff6af2264b2ba970b5645b142', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793727862, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 26, 'name': 'pr-deb-x64', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/26/builds/10916'}, 'type': 'raw_bb_hook'}
2026-11-03T17:46:10.547333 {'source': 'webserver', 'raw': {'buildid': 196329, 'number': 10924, 'builderid': 22, 'buildrequestid': 196911, 'workerid': 12, 'masterid': 1, 'started_at': 1793727862, 'complete_at': 1793727913, 'locks_duration_s': 0, 'complete': True, 'state_string': 'build successful', 'results': 0, 'properties': {'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'branch': ['refs/pull/14979/head', 'Build'], 'headrev': ['889421211027958ff6af2264b2ba970b5645b142', 'Change'], 'shortrev': ['889421', 'Change'], 'project': ['', 'Build'], 'pr_id': [14979, 'Change'], 'revision': ['889421211027958ff6af2264b2ba970b5645b142', 'Build'], 'repository': ['', 'Build'], 'scheduler': ['pr', 'Scheduler'], 'workername': ['android', 'Worker'], 'buildnumber': [10924, 'Build'], 'branchname': ['pr-14979', 'Change'], 'codebase': ['', 'Build'], 'buildername': ['pr-android', 'Builder'], 'builderid': [22, 'Builder'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build'], 'basedir': ['/buildbot', 'Worker'], 'builddir': ['/buildbot/pr-android', 'Worker'], 'got_revision': ['889421211027958ff6af2264b2ba970b5645b142', 'GitNoBranch']}, 'buildrequest': {'buildrequestid': 196911, 'buildsetid': 44102, 'builderid': 22, 'priority': 0, 'claimed': True, 'claimed_at': 1793727862, 'claimed_by_masterid': 1, 'complete': True, 'results': 0, 'submitted_at': 1793727862, 'complete_at': 1793727913, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44102, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793727862, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13234, 'branch': 'refs/pull/14979/head', 'revision': '889421211027958ff6af2264b2ba970b5645b142', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793727862, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 22, 'name': 'pr-android', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/22/builds/10924'}, 'type': 'raw_bb_hook'}
2026-11-03T17:46:10.155488 {'source': 'webserver', 'raw': {'buildid': 196324, 'number': 10921, 'builderid': 9, 'buildrequestid': 196908, 'workerid': 10, 'masterid': 1, 'started_at': 1793727862, 'complete_at': 1793727867, 'locks_duration_s': 0, 'complete': True, 'state_string': 'build successful', 'results': 0, 'properties': {'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'headrev': ['889421211027958ff6af2264b2ba970b5645b142', 'Change'], 'codebase': ['', 'Build'], 'pr_id': [14979, 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'builderid': [9, 'Builder'], 'workername': ['ubuntu-lts', 'Worker'], 'buildnumber': [10921, 'Build'], 'branchname': ['pr-14979', 'Change'], 'shortrev': ['889421', 'Change'], 'scheduler': ['pr', 'Scheduler'], 'buildername': ['lint', 'Builder'], 'branch': ['refs/pull/14979/head', 'Build'], 'revision': ['889421211027958ff6af2264b2ba970b5645b142', 'Build'], 'repository': ['', 'Build'], 'project': ['', 'Build'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build'], 'basedir': ['/buildbot', 'Worker'], 'builddir': ['/buildbot/lint', 'Worker'], 'got_revision': ['889421211027958ff6af2264b2ba970b5645b142', 'GitNoBranch']}, 'buildrequest': {'buildrequestid': 196908, 'buildsetid': 44102, 'builderid': 9, 'priority': 0, 'claimed': True, 'claimed_at': 1793727862, 'claimed_by_masterid': 1, 'complete': True, 'results': 0, 'submitted_at': 1793727862, 'complete_at': 1793727867, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44102, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793727862, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13234, 'branch': 'refs/pull/14979/head', 'revision': '889421211027958ff6af2264b2ba970b5645b142', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793727862, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 9, 'name': 'lint', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/9/builds/10921'}, 'type': 'raw_bb_hook'}
2026-11-03T17:46:09.640913 {'source': 'webserver', 'raw': {'buildid': 196327, 'number': 164, 'builderid': 50, 'buildrequestid': 196918, 'workerid': 16, 'masterid': 1, 'started_at': 1793727862, 'complete_at': 1793727968, 'locks_duration_s': 0, 'complete': True, 'state_string': 'build successful', 'results': 0, 'properties': {'shortrev': ['889421', 'Change'], 'buildnumber': [164, 'Build'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'headrev': ['889421211027958ff6af2264b2ba970b5645b142', 'Change'], 'warnings-count': [0, 'WarningCountingShellCommand'], 'branchname': ['pr-14979', 'Change'], 'pr_id': [14979, 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'branch': ['refs/pull/14979/head', 'Build'], 'codebase': ['', 'Build'], 'project': ['', 'Build'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build'], 'scheduler': ['pr', 'Scheduler'], 'buildername': ['pr-appimage-arm64', 'Builder'], 'builderid': [50, 'Builder'], 'workername': ['deneb-appimage', 'Worker'], 'revision': ['889421211027958ff6af2264b2ba970b5645b142', 'Build'], 'repository': ['', 'Build'], 'got_revision': ['889421211027958ff6af2264b2ba970b5645b142', 'GitNoBranch'], 'basedir': ['/buildbot', 'Worker'], 'builddir': ['/buildbot/pr-appimage-arm64', 'Worker']}, 'buildrequest': {'buildrequestid': 196918, 'buildsetid': 44102, 'builderid': 50, 'priority': 0, 'claimed': True, 'claimed_at': 1793727862, 'claimed_by_masterid': 1, 'complete': True, 'results': 0, 'submitted_at': 1793727862, 'complete_at': 1793727968, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44102, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793727862, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13234, 'branch': 'refs/pull/14979/head', 'revision': '889421211027958ff6af2264b2ba970b5645b142', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793727862, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 50, 'name': 'pr-appimage-arm64', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/50/builds/164'}, 'type': 'raw_bb_hook'}
2026-11-03T17:46:09.598855 {'source': 'webserver', 'raw': {'buildid': 196333, 'number': 10937, 'builderid': 7, 'buildrequestid': 196907, 'workerid': 8, 'masterid': 1, 'started_at': 1793727862, 'complete_at': 1793727917, 'locks_duration_s': 0, 'complete': True, 'state_string': 'failed configure (failure)', 'results': 2, 'properties': {'branchname': ['pr-14979', 'Change'], 'headrev': ['889421211027958ff6af2264b2ba970b5645b142', 'Change'], 'repository': ['', 'Build'], 'basedir': ['/Users/ci/worker/base', 'Worker'], 'codebase': ['', 'Build'], 'builddir': ['/Users/ci/worker/base/pr-osx-universal', 'Worker'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'project': ['', 'Build'], 'got_revision': ['889421211027958ff6af2264b2ba970b5645b142', 'GitNoBranch'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build'], 'shortrev': ['889421', 'Change'], 'scheduler': ['pr', 'Scheduler'], 'builderid': [7, 'Builder'], 'pr_id': [14979, 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'buildername': ['pr-osx-universal', 'Builder'], 'workername': ['osx-m1', 'Worker'], 'buildnumber': [10937, 'Build'], 'branch': ['refs/pull/14979/head', 'Build'], 'revision': ['889421211027958ff6af2264b2ba970b5645b142', 'Build']}, 'buildrequest': {'buildrequestid': 196907, 'buildsetid': 44102, 'builderid': 7, 'priority': 0, 'claimed': True, 'claimed_at': 1793727862, 'claimed_by_masterid': 1, 'complete': True, 'results': 2, 'submitted_at': 1793727862, 'complete_at': 1793727917, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44102, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793727862, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13234, 'branch': 'refs/pull/14979/head', 'revision': '889421211027958ff6af2264b2ba970b5645b142', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793727862, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 7, 'name': 'pr-osx-universal', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/7/builds/10937'}, 'type': 'raw_bb_hook'}
2026-11-03T17:45:52.890316 {'source': 'webserver', 'raw': {'buildid': 196335, 'number': 10917, 'builderid': 1, 'buildrequestid': 196905, 'workerid': 9, 'masterid': 1, 'started_at': 1793727910, 'complete_at': None, 'locks_duration_s': 0, 'complete': False, 'state_string': 'starting', 'results': None, 'properties': {'branchname': ['pr-14979', 'Change'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'headrev': ['889421211027958ff6af2264b2ba970b5645b142', 'Change'], 'shortrev': ['889421', 'Change'], 'branch': ['refs/pull/14979/head', 'Build'], 'revision': ['889421211027958ff6af2264b2ba970b5645b142', 'Build'], 'repository': ['', 'Build'], 'codebase': ['', 'Build'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build'], 'pr_id': [14979, 'Change'], 'builderid': [1, 'Builder'], 'workername': ['debian', 'Worker'], 'buildnumber': [10917, 'Build'], 'scheduler': ['pr', 'Scheduler'], 'buildername': ['pr-deb-dbg-x64', 'Builder'], 'project': ['', 'Build']}, 'buildrequest': {'buildrequestid': 196905, 'buildsetid': 44102, 'builderid': 1, 'priority': 0, 'claimed': True, 'claimed_at': 1793727910, 'claimed_by_masterid': 1, 'complete': False, 'results': -1, 'submitted_at': 1793727862, 'complete_at': None, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44102, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793727862, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13234, 'branch': 'refs/pull/14979/head', 'revision': '889421211027958ff6af2264b2ba970b5645b142', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793727862, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 1, 'name': 'pr-deb-dbg-x64', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/1/builds/10917'}, 'type': 'raw_bb_hook'}
2026-11-03T17:45:28.388840 {'source': 'webserver', 'raw': {'buildid': 196334, 'number': 10918, 'builderid': 27, 'buildrequestid': 196913, 'workerid': 10, 'masterid': 1, 'started_at': 1793727867, 'complete_at': None, 'locks_duration_s': 0, 'complete': False, 'state_string': 'starting', 'results': None, 'properties': {'branchname': ['pr-14979', 'Change'], 'baserev': ['df4bd441dec5d6f3cff606eea76f183963e97a44', 'Change'], 'headrev': ['889421211027958ff6af2264b2ba970b5645b142', 'Change'], 'shortrev': ['889421', 'Change'], 'pr_id': [14979, 'Change'], 'repo': ['dolphin-emu/dolphin', 'Change'], 'scheduler': ['pr', 'Scheduler'], 'buildername': ['pr-ubu-x64', 'Builder'], 'project': ['', 'Build'], 'builderid': [27, 'Builder'], 'workername': ['ubuntu-lts', 'Worker'], 'buildnumber': [10918, 'Build'], 'branch': ['refs/pull/14979/head', 'Build'], 'revision': ['889421211027958ff6af2264b2ba970b5645b142', 'Build'], 'repository': ['', 'Build'], 'codebase': ['', 'Build'], 'owners': [['Central (on behalf of: JoshuaVandaele)'], 'Build']}, 'buildrequest': {'buildrequestid': 196913, 'buildsetid': 44102, 'builderid': 27, 'priority': 0, 'claimed': True, 'claimed_at': 1793727867, 'claimed_by_masterid': 1, 'complete': False, 'results': -1, 'submitted_at': 1793727862, 'complete_at': None, 'waited_for': False, 'properties': None}, 'buildset': {'bsid': 44102, 'external_idstring': None, 'reason': "The AnyBranchScheduler scheduler named 'pr' triggered this build", 'submitted_at': 1793727862, 'complete': False, 'complete_at': None, 'results': -1, 'parent_buildid': None, 'parent_relationship': None, 'rebuilt_buildid': None, 'sourcestamps': [{'ssid': 13234, 'branch': 'refs/pull/14979/head', 'revision': '889421211027958ff6af2264b2ba970b5645b142', 'project': '', 'repository': '', 'codebase': '', 'created_at': 1793727862, 'patch': None}]}, 'parentbuild': None, 'parentbuilder': None, 'builder': {'builderid': 27, 'name': 'pr-ubu-x64', 'masterids': [1], 'description': None, 'description_format': None, 'description_html': None, 'projectid': None, 'tags': []}, 'url': 'https://dolphin.ci/#/builders/27/builds/10918'}, 'type': 'raw_bb_hook'}
Recent 'raw_gh_hook' events
2026-11-03T17:47:25.785035 {'source': 'webserver', 'gh_type': 'pull_request', 'raw': {'action': 'synchronize', 'number': 14979, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14979', 'id': 5141893437, 'node_id': 'PR_kwDOALCn2M8AAAABMnsRPQ', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14979', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14979.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14979.patch', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14979', 'number': 14979, 'state': 'open', 'locked': False, 'title': 'Externals/gettext: Update to 1.0, vendor-in from source on non-Windows host platforms', 'user': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'This change also makes gettext no longer optional, since "Translations are missing because you didn\'t have this specific program installed during compilation" is not desirable behavior imo.', 'created_at': '2026-11-03T17:44:05Z', 'updated_at': '2026-11-03T17:47:23Z', 'closed_at': None, 'merged_at': None, 'merge_commit_sha': 'cfef12907379db75c52b40529a727ec093799d51', 'assignees': [], 'requested_reviewers': [], 'requested_teams': [], 'labels': [], 'milestone': None, 'draft': False, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14979/commits', 'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14979/comments', 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14979/comments', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/8159092533e9160c64df47f9001b55a24ae16633', 'head': {'label': 'JoshuaVandaele:vendored-gettext', 'ref': 'vendored-gettext', 'sha': '8159092533e9160c64df47f9001b55a24ae16633', 'user': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 915253252, 'node_id': 'R_kgDONo2oBA', 'name': 'dolphin', 'full_name': 'JoshuaVandaele/dolphin', 'private': False, 'owner': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/JoshuaVandaele/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': True, 'url': 'https://api.github.com/repos/JoshuaVandaele/dolphin', 'forks_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/forks', 'keys_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/events', 'assignees_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/merges', 'archive_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/deployments', 'created_at': '2025-01-11T11:19:57Z', 'updated_at': '2026-10-25T13:00:05Z', 'pushed_at': '2026-11-03T17:47:22Z', 'git_url': 'git://github.com/JoshuaVandaele/dolphin.git', 'ssh_url': 'git@github.com:JoshuaVandaele/dolphin.git', 'clone_url': 'https://github.com/JoshuaVandaele/dolphin.git', 'svn_url': 'https://github.com/JoshuaVandaele/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 522683, 'stargazers_count': 1, 'watchers_count': 1, 'language': 'C++', 'has_issues': False, 'has_projects': True, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 1, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 0, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': [], 'visibility': 'public', 'forks': 1, 'open_issues': 0, 'watchers': 1, 'default_branch': 'master', 'allow_squash_merge': True, 'allow_merge_commit': True, 'allow_rebase_merge': True, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, 'base': {'label': 'dolphin-emu:master', 'ref': 'master', 'sha': 'df4bd441dec5d6f3cff606eea76f183963e97a44', 'user': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T17:06:13Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15760, 'watchers_count': 15760, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3378, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 481, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3378, 'open_issues': 481, 'watchers': 15760, 'default_branch': 'master', 'allow_squash_merge': False, 'allow_merge_commit': True, 'allow_rebase_merge': False, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14979'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14979'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14979'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14979/comments'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14979/comments'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14979/commits'}, 'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/8159092533e9160c64df47f9001b55a24ae16633'}}, 'author_association': 'CONTRIBUTOR', 'auto_merge': None, 'assignee': None, 'active_lock_reason': None, 'merged': False, 'mergeable': None, 'rebaseable': None, 'mergeable_state': 'unknown', 'merged_by': None, 'comments': 0, 'review_comments': 0, 'maintainer_can_modify': True, 'commits': 2, 'additions': 69, 'deletions': 705, 'changed_files': 8}, 'before': '889421211027958ff6af2264b2ba970b5645b142', 'after': '8159092533e9160c64df47f9001b55a24ae16633', 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T17:06:13Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15760, 'watchers_count': 15760, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3378, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 481, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3378, 'open_issues': 481, 'watchers': 15760, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'raw_gh_hook'}
2026-11-03T17:44:08.318415 {'source': 'webserver', 'gh_type': 'pull_request', 'raw': {'action': 'opened', 'number': 14979, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14979', 'id': 5141893437, 'node_id': 'PR_kwDOALCn2M8AAAABMnsRPQ', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14979', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14979.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14979.patch', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14979', 'number': 14979, 'state': 'open', 'locked': False, 'title': 'Externals/gettext: Update to 1.0, vendor-in from source on non-Windows host platforms', 'user': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'This change also makes gettext no longer optional, since "Translations are missing because you didn\'t have this specific program installed during compilation" is not desirable behavior imo.', 'created_at': '2026-11-03T17:44:05Z', 'updated_at': '2026-11-03T17:44:05Z', 'closed_at': None, 'merged_at': None, 'merge_commit_sha': None, 'assignees': [], 'requested_reviewers': [], 'requested_teams': [], 'labels': [], 'milestone': None, 'draft': False, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14979/commits', 'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14979/comments', 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14979/comments', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/889421211027958ff6af2264b2ba970b5645b142', 'head': {'label': 'JoshuaVandaele:vendored-gettext', 'ref': 'vendored-gettext', 'sha': '889421211027958ff6af2264b2ba970b5645b142', 'user': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 915253252, 'node_id': 'R_kgDONo2oBA', 'name': 'dolphin', 'full_name': 'JoshuaVandaele/dolphin', 'private': False, 'owner': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/JoshuaVandaele/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': True, 'url': 'https://api.github.com/repos/JoshuaVandaele/dolphin', 'forks_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/forks', 'keys_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/events', 'assignees_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/merges', 'archive_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/deployments', 'created_at': '2025-01-11T11:19:57Z', 'updated_at': '2026-10-25T13:00:05Z', 'pushed_at': '2026-11-03T17:31:12Z', 'git_url': 'git://github.com/JoshuaVandaele/dolphin.git', 'ssh_url': 'git@github.com:JoshuaVandaele/dolphin.git', 'clone_url': 'https://github.com/JoshuaVandaele/dolphin.git', 'svn_url': 'https://github.com/JoshuaVandaele/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 522683, 'stargazers_count': 1, 'watchers_count': 1, 'language': 'C++', 'has_issues': False, 'has_projects': True, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 1, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 0, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': [], 'visibility': 'public', 'forks': 1, 'open_issues': 0, 'watchers': 1, 'default_branch': 'master', 'allow_squash_merge': True, 'allow_merge_commit': True, 'allow_rebase_merge': True, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, 'base': {'label': 'dolphin-emu:master', 'ref': 'master', 'sha': 'df4bd441dec5d6f3cff606eea76f183963e97a44', 'user': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T17:06:13Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15760, 'watchers_count': 15760, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3378, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 481, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3378, 'open_issues': 481, 'watchers': 15760, 'default_branch': 'master', 'allow_squash_merge': False, 'allow_merge_commit': True, 'allow_rebase_merge': False, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14979'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14979'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14979'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14979/comments'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14979/comments'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14979/commits'}, 'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/889421211027958ff6af2264b2ba970b5645b142'}}, 'author_association': 'CONTRIBUTOR', 'auto_merge': None, 'assignee': None, 'active_lock_reason': None, 'merged': False, 'mergeable': None, 'rebaseable': None, 'mergeable_state': 'unknown', 'merged_by': None, 'comments': 0, 'review_comments': 0, 'maintainer_can_modify': True, 'commits': 2, 'additions': 69, 'deletions': 705, 'changed_files': 8}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T17:06:13Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15760, 'watchers_count': 15760, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3378, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 481, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3378, 'open_issues': 481, 'watchers': 15760, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'raw_gh_hook'}
2026-11-03T17:27:07.220531 {'source': 'webserver', 'gh_type': 'pull_request_review', 'raw': {'action': 'submitted', 'review': {'id': 5756715873, 'node_id': 'PRR_kwDOALCn2M8AAAABVyCDYQ', 'user': {'login': 'sepalani', 'id': 7890055, 'node_id': 'MDQ6VXNlcjc4OTAwNTU=', 'avatar_url': 'https://avatars.githubusercontent.com/u/7890055?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/sepalani', 'html_url': 'https://github.com/sepalani', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'Tested, LGTM.\n\nThanks a lot for fixing this. I was experiencing it quite often with debug builds on Visual Studio.\n\nAn easy way to reproduce the issue:\n- Pick a Dolphin debug build.\n- Click on a game in the game list.\n- Hover on the Stop button, then press enter (i.e. triggers the game start from the game list selected item).\n- Spam click the hovered Stop button.\n- Spam enter when you see the message box (i.e. defaults to accept).', 'commit_id': '0436c9f60eb1e815a65f01d5edb6a5a155911553', 'state': 'approved', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14978#pullrequestreview-5756715873', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14978', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14978#pullrequestreview-5756715873'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14978'}}, 'submitted_at': '2026-11-03T17:27:04Z', 'updated_at': '2026-11-03T17:27:04Z', 'author_association': 'CONTRIBUTOR'}, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14978', 'id': 5138005347, 'node_id': 'PR_kwDOALCn2M8AAAABMj-9Yw', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14978', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14978.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14978.patch', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14978', 'number': 14978, 'state': 'open', 'locked': False, 'title': 'CPU: Fix quickly-stopped games hanging Dolphin', 'user': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': "Starting and quickly stopping a game will cause Dolphin to hang on a black window because `CPUManager::Init` reset the CPU state to `Stepping`, overwriting `PowerDown`. It's easier to reproduce this problem on a slow drive or by using the OmniDrive PR.", 'created_at': '2026-11-03T13:25:09Z', 'updated_at': '2026-11-03T13:26:56Z', 'closed_at': None, 'merged_at': None, 'merge_commit_sha': '6f174d638a14b0106a824386e86af346bc5d1de2', 'assignees': [], 'requested_reviewers': [], 'requested_teams': [], 'labels': [], 'milestone': None, 'draft': False, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14978/commits', 'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14978/comments', 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14978/comments', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/0436c9f60eb1e815a65f01d5edb6a5a155911553', 'head': {'label': 'JoshuaVandaele:quick-stop-hang', 'ref': 'quick-stop-hang', 'sha': '0436c9f60eb1e815a65f01d5edb6a5a155911553', 'user': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 915253252, 'node_id': 'R_kgDONo2oBA', 'name': 'dolphin', 'full_name': 'JoshuaVandaele/dolphin', 'private': False, 'owner': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/JoshuaVandaele/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': True, 'url': 'https://api.github.com/repos/JoshuaVandaele/dolphin', 'forks_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/forks', 'keys_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/events', 'assignees_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/merges', 'archive_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/deployments', 'created_at': '2025-01-11T11:19:57Z', 'updated_at': '2026-10-25T13:00:05Z', 'pushed_at': '2026-11-03T17:20:05Z', 'git_url': 'git://github.com/JoshuaVandaele/dolphin.git', 'ssh_url': 'git@github.com:JoshuaVandaele/dolphin.git', 'clone_url': 'https://github.com/JoshuaVandaele/dolphin.git', 'svn_url': 'https://github.com/JoshuaVandaele/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 522683, 'stargazers_count': 1, 'watchers_count': 1, 'language': 'C++', 'has_issues': False, 'has_projects': True, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 1, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 0, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': [], 'visibility': 'public', 'forks': 1, 'open_issues': 0, 'watchers': 1, 'default_branch': 'master', 'allow_squash_merge': True, 'allow_merge_commit': True, 'allow_rebase_merge': True, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, 'base': {'label': 'dolphin-emu:master', 'ref': 'master', 'sha': 'df4bd441dec5d6f3cff606eea76f183963e97a44', 'user': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T17:06:13Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15760, 'watchers_count': 15760, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3378, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 480, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3378, 'open_issues': 480, 'watchers': 15760, 'default_branch': 'master', 'allow_squash_merge': False, 'allow_merge_commit': True, 'allow_rebase_merge': False, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14978'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14978'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14978'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14978/comments'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14978/comments'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14978/commits'}, 'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/0436c9f60eb1e815a65f01d5edb6a5a155911553'}}, 'author_association': 'CONTRIBUTOR', 'auto_merge': None, 'assignee': None, 'active_lock_reason': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T17:06:13Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15760, 'watchers_count': 15760, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3378, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 480, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3378, 'open_issues': 480, 'watchers': 15760, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'sepalani', 'id': 7890055, 'node_id': 'MDQ6VXNlcjc4OTAwNTU=', 'avatar_url': 'https://avatars.githubusercontent.com/u/7890055?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/sepalani', 'html_url': 'https://github.com/sepalani', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'raw_gh_hook'}
2026-11-03T17:20:35.099685 {'source': 'webserver', 'gh_type': 'issue_comment', 'raw': {'action': 'created', 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'id': 6162397505, 'node_id': 'PR_kwDOALCn2M8AAAABMS-vaA', 'number': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 17, 'created_at': '2026-11-02T12:18:18Z', 'updated_at': '2026-11-03T17:20:32Z', 'closed_at': None, 'assignee': None, 'author_association': 'MEMBER', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.patch', 'merged_at': None}, 'body': 'At long last, this PR restores the ability of running games from DVD backups (originally removed on PR #11456) and, for the first time in Dolphin, allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive):\r\n\r\nhttps://github.com/user-attachments/assets/626b3c7e-cd6a-48f0-9962-eaa6b1f0805a\r\n\r\nOn supported OSes (currently Windows and Linux), there\'s a new "Boot From Optical Disc" menu entry on File, and "Change Disc" now opens a popup that lets you change between a disc image or a physical disc or vice-versa:\r\n\r\nhttps://github.com/user-attachments/assets/0af57155-391c-41c8-b78c-bc70a63a7703\r\n\r\nThis implementation is heavily inspired on [redumper](https://github.com/superg/redumper), so Dolphin directly talks to the optical drive via low level SCSI multimedia commands instead of relying on the old approach that was derived from a very outdated version of libcdio.\r\n\r\n### Features and limitations\r\n* Although the UI changes are minimal (for now), I\'ve tried to make this work as intuitively as possible behind the scenes. I think the most noteworthy ones are that optical drives can be hot plugged at any time (if you\'re using USB to SATA adapters or portable drives) and if you boot from a physical disc and then eject it (either via File => Eject Disc or by pressing the Eject button on the drive itself), the disc will be ejected from the emulated console too. If you reinsert a disc later, it\'ll automatically reinsert the disc on the emulated console too (e.g. multi disc games that ask you to insert the next disc)\r\n* I didn\'t initially plan for this, but the `-i` flag from DolphinTool now accepts disc drive paths (e.g. `-i D:` or `-i /dev/sr0`). A side effect of that is you can now rip original discs to ISO, RVZ, GCZ or WIA directly from DolphinTool, if you have an OmniDrive-enabled drive\r\n* Emulated disc speed code is bypassed when using physical discs, as well as "Load Whole Game Into Memory". Beware of speeding up the emulation by setting the speed limit above 100% though, that can cause audio/video issues and even break games if you let them run too fast for too long, since the optical drive can\'t keep up ("An error occurred, please turn the GC/Wii off and refer to the operating manual")\r\n* Loading speeds are a bit slower than what I remember from playing on a real GC/Wii. The handful of games I tried still worked fine, though\r\n* When RetroAchievements are enabled, its hashing can cause a bit of slow loading speeds right after booting a game. It\'s more noticeable with Wii titles\r\n* Currently, [GameCube games that uses DTK Audio](https://wiki.dolphin-emu.org/index.php?title=Category:DTK_Audio_games) are nearly unplayable from physical discs, as the DTK audio path causes constant drive seeking, which consequently reduces the read speeds significantly. I intend to explore a few caching techniques to fix this, but it will be on a separate PR\r\n* Minimal testing was done on Linux, apart from compiling from source on Ubuntu 26.04.1 LTS and ensuring it could boot a game\r\n* Currently there\'s no macOS support, and I won\'t be adding it as I have no access to any Apple hardware. Porting should be easy, though, as all OS-specific code are isolated on `SCSIDevice.cpp/.h`\r\n\r\n### Generative AI disclosure\r\nThe source code from [redumper (b705)](https://github.com/superg/redumper/tree/b705) was fed into a LLM, which was tasked on creating a technical specs document about how it handles standard and raw OmniDrive reads. Then, I\'ve made a Windows-only CLI tool implementing only the absolute minimum required for the features that would be relevant for us, based on that document. DVD descrambling was added next and used this [reference implementation](https://github.com/Deterous/DVD-Scrambler) from Deterous. Once the CLI tool was feature complete, I used a LLM again, this time feeding it parts of the Linux (6.18 LTS) kernel source code, to assist with adding Linux compatibility to it.\r\n\r\nFinally, I started working with the Dolphin\'s source. The code this PR adds is directly derived from the CLI tool, but no LLMs were used beyond that point. I\'m also not touching any emulation code, the changes in DVDInterface reuses existing behavior or are based in code comments that already existed in Dolphin before this PR.\r\n\r\n### Licenses and attribuition\r\nThe bulk of this PR was heavily based on [redumper](https://github.com/superg/redumper), which is licensed under the GPLv3. As mentioned earlier, I also used the [descrambling implementation from Deterous](https://github.com/Deterous/DVD-Scrambler) as a reference, which the repo itself doesn\'t define a license, but directly mentions being made as the reference for redumper, so I think we\'re good? I can try contacting Deterous too for explicit approval, if needed...', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/reactions', 'total_count': 6, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 6, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6610744775', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6610744775', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'id': 6610744775, 'node_id': 'IC_kwDOALCn2M8AAAABigf1xw', 'user': {'login': 'JMC47', 'id': 6598209, 'node_id': 'MDQ6VXNlcjY1OTgyMDk=', 'avatar_url': 'https://avatars.githubusercontent.com/u/6598209?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JMC47', 'html_url': 'https://github.com/JMC47', 'followers_url': 'https://api.github.com/users/JMC47/followers', 'following_url': 'https://api.github.com/users/JMC47/following{/other_user}', 'gists_url': 'https://api.github.com/users/JMC47/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JMC47/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JMC47/subscriptions', 'organizations_url': 'https://api.github.com/users/JMC47/orgs', 'repos_url': 'https://api.github.com/users/JMC47/repos', 'events_url': 'https://api.github.com/users/JMC47/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JMC47/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T17:20:32Z', 'updated_at': '2026-11-03T17:20:32Z', 'body': "I tested this. On Linux, using a shitty slim portable drive.\r\n\r\nHonestly, it seems pretty good in the games I tested. Datel games did not work, but maybe that's because of a setting I had on. I'll try it again later.\r\n\r\nGameCube and Wii. My only issue was first boot didn't work due to the drive not being initialized, after that everything was fine.", 'author_association': 'MEMBER', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6610744775/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T17:06:13Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15760, 'watchers_count': 15760, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3378, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 480, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3378, 'open_issues': 480, 'watchers': 15760, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'JMC47', 'id': 6598209, 'node_id': 'MDQ6VXNlcjY1OTgyMDk=', 'avatar_url': 'https://avatars.githubusercontent.com/u/6598209?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JMC47', 'html_url': 'https://github.com/JMC47', 'followers_url': 'https://api.github.com/users/JMC47/followers', 'following_url': 'https://api.github.com/users/JMC47/following{/other_user}', 'gists_url': 'https://api.github.com/users/JMC47/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JMC47/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JMC47/subscriptions', 'organizations_url': 'https://api.github.com/users/JMC47/orgs', 'repos_url': 'https://api.github.com/users/JMC47/repos', 'events_url': 'https://api.github.com/users/JMC47/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JMC47/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'raw_gh_hook'}
2026-11-03T16:57:25.312952 {'source': 'webserver', 'gh_type': 'pull_request_review', 'raw': {'action': 'submitted', 'review': {'id': 5756288334, 'node_id': 'PRR_kwDOALCn2M8AAAABVxn9Tg', 'user': {'login': 'sepalani', 'id': 7890055, 'node_id': 'MDQ6VXNlcjc4OTAwNTU=', 'avatar_url': 'https://avatars.githubusercontent.com/u/7890055?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/sepalani', 'html_url': 'https://github.com/sepalani', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': "LGTM, untested.\n\nI'll be able to test it further this week-end against BBA and Wii games if that's still needed.", 'commit_id': '824dcf229374473c20bd37143ec1c1f6c2a8d663', 'state': 'approved', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14967#pullrequestreview-5756288334', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14967', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14967#pullrequestreview-5756288334'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14967'}}, 'submitted_at': '2026-11-03T16:57:22Z', 'updated_at': '2026-11-03T16:57:22Z', 'author_association': 'CONTRIBUTOR'}, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14967', 'id': 5111239071, 'node_id': 'PR_kwDOALCn2M8AAAABMKdRnw', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14967', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14967.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14967.patch', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14967', 'number': 14967, 'state': 'open', 'locked': False, 'title': 'Common: Add helper function to set SO_REUSEADDR on TCP sockets on non-Windows.', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'This avoids TCP bind calls from failing after quickly restarting while old TCP sockets are still in "TIME_WAIT".\n\ne.g. Without this, `GBA (TCP)` server fails to bind and is non-functional when restarting a game unless you wait like a full minute before restarting.\nIt\'s really annoying.', 'created_at': '2026-11-01T20:26:41Z', 'updated_at': '2026-11-02T23:44:01Z', 'closed_at': None, 'merged_at': None, 'merge_commit_sha': '89ad22834b2b0595d52951bfe509abceb399e8fc', 'assignees': [], 'requested_reviewers': [], 'requested_teams': [], 'labels': [], 'milestone': None, 'draft': False, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14967/commits', 'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14967/comments', 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14967/comments', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/824dcf229374473c20bd37143ec1c1f6c2a8d663', 'head': {'label': 'jordan-woyak:SO_REUSEADDR', 'ref': 'SO_REUSEADDR', 'sha': '824dcf229374473c20bd37143ec1c1f6c2a8d663', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 16818408, 'node_id': 'MDEwOlJlcG9zaXRvcnkxNjgxODQwOA==', 'name': 'dolphin', 'full_name': 'jordan-woyak/dolphin', 'private': False, 'owner': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/jordan-woyak/dolphin', 'description': 'Dolphin is a GameCube/Wii emulator, allowing you to play games for these two platforms on PC, with improvements.', 'fork': True, 'url': 'https://api.github.com/repos/jordan-woyak/dolphin', 'forks_url': 'https://api.github.com/repos/jordan-woyak/dolphin/forks', 'keys_url': 'https://api.github.com/repos/jordan-woyak/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/jordan-woyak/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/jordan-woyak/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/jordan-woyak/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/jordan-woyak/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/jordan-woyak/dolphin/events', 'assignees_url': 'https://api.github.com/repos/jordan-woyak/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/jordan-woyak/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/jordan-woyak/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/jordan-woyak/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/jordan-woyak/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/jordan-woyak/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/jordan-woyak/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/jordan-woyak/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/jordan-woyak/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/jordan-woyak/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/jordan-woyak/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/jordan-woyak/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/jordan-woyak/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/jordan-woyak/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/jordan-woyak/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/jordan-woyak/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/jordan-woyak/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/jordan-woyak/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/jordan-woyak/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/jordan-woyak/dolphin/merges', 'archive_url': 'https://api.github.com/repos/jordan-woyak/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/jordan-woyak/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/jordan-woyak/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/jordan-woyak/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/jordan-woyak/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/jordan-woyak/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/jordan-woyak/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/jordan-woyak/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/jordan-woyak/dolphin/deployments', 'created_at': '2014-02-13T21:50:38Z', 'updated_at': '2026-06-27T21:22:47Z', 'pushed_at': '2026-11-03T11:00:21Z', 'git_url': 'git://github.com/jordan-woyak/dolphin.git', 'ssh_url': 'git@github.com:jordan-woyak/dolphin.git', 'clone_url': 'https://github.com/jordan-woyak/dolphin.git', 'svn_url': 'https://github.com/jordan-woyak/dolphin', 'homepage': None, 'size': 530497, 'stargazers_count': 5, 'watchers_count': 5, 'language': 'C++', 'has_issues': False, 'has_projects': True, 'has_downloads': False, 'has_wiki': False, 'has_pages': False, 'has_discussions': False, 'forks_count': 5, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 2, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': [], 'visibility': 'public', 'forks': 5, 'open_issues': 2, 'watchers': 5, 'default_branch': 'master', 'allow_squash_merge': True, 'allow_merge_commit': True, 'allow_rebase_merge': True, 'allow_auto_merge': False, 'delete_branch_on_merge': True, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, 'base': {'label': 'dolphin-emu:master', 'ref': 'master', 'sha': 'e8c42467964da77011f7da93a06f9e0a72ca868f', 'user': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T14:47:59Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15759, 'watchers_count': 15759, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3378, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 480, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3378, 'open_issues': 480, 'watchers': 15759, 'default_branch': 'master', 'allow_squash_merge': False, 'allow_merge_commit': True, 'allow_rebase_merge': False, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14967'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14967'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14967'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14967/comments'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14967/comments'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14967/commits'}, 'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/824dcf229374473c20bd37143ec1c1f6c2a8d663'}}, 'author_association': 'MEMBER', 'auto_merge': None, 'assignee': None, 'active_lock_reason': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T14:47:59Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15759, 'watchers_count': 15759, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3378, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 480, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3378, 'open_issues': 480, 'watchers': 15759, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'sepalani', 'id': 7890055, 'node_id': 'MDQ6VXNlcjc4OTAwNTU=', 'avatar_url': 'https://avatars.githubusercontent.com/u/7890055?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/sepalani', 'html_url': 'https://github.com/sepalani', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'raw_gh_hook'}
2026-11-03T16:04:15.404393 {'source': 'webserver', 'gh_type': 'issue_comment', 'raw': {'action': 'edited', 'changes': {'body': {'from': "> what optical drive are you using? \r\n\r\nIt is a big internal desktop drive. I'm not sure what the model number is. I changed the firmware so much, I don't think even the drive knows what model it is anymore.\r\n\r\n> Are you trying original game discs or backups?\r\n\r\nI was only testing original game discs.\r\n\r\n> There's not a lot to work from in your screenshots, so I'll kindly ask you to retry again with the logs enabled, then \r\npost them here so I can investigate.\r\n\r\nI did, but what I found is strange. I tested a few different games, and some did work. But after opening and closing the disc drive, the same game stopped working. I haven't found any pattern in what makes it work/not work, but when it does not work, this is the output you were asking for (it's the same output every time):\r\n\r\n## First attempt\r\n\r\n```\r\n06:41:696 DiscIO/OpticalDiscBlob.cpp:363 N[DIO]: Optical drive /dev/sr0 runs OmniDrive firmware v1.0.2\r\n06:42:107 DiscIO/OpticalDiscBlob.cpp:382 N[DIO]: GameCube/Wii book type in /dev/sr0, using OmniDrive raw reads\r\n06:51:110 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: FF\r\n07:00:910 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n07:00:910 DiscIO/OpticalDiscBlob.cpp:514 E[DIO]: Read error at LBA 0 on /dev/sr0\r\n07:10:749 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n07:20:521 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n07:20:521 DiscIO/OpticalDiscBlob.cpp:514 E[DIO]: Read error at LBA 0 on /dev/sr0\r\n```\r\n\r\n## Second attempt (without opening the disc drive)\r\n\r\n```\r\n08:12:722 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n08:12:722 DiscIO/OpticalDiscBlob.cpp:379 E[DIO]: Failed to read LBA 0 to derive the disc key from /dev/sr0\r\n```"}}, 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'id': 6162397505, 'node_id': 'PR_kwDOALCn2M8AAAABMS-vaA', 'number': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 16, 'created_at': '2026-11-02T12:18:18Z', 'updated_at': '2026-11-03T15:53:32Z', 'closed_at': None, 'assignee': None, 'author_association': 'MEMBER', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.patch', 'merged_at': None}, 'body': 'At long last, this PR restores the ability of running games from DVD backups (originally removed on PR #11456) and, for the first time in Dolphin, allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive):\r\n\r\nhttps://github.com/user-attachments/assets/626b3c7e-cd6a-48f0-9962-eaa6b1f0805a\r\n\r\nOn supported OSes (currently Windows and Linux), there\'s a new "Boot From Optical Disc" menu entry on File, and "Change Disc" now opens a popup that lets you change between a disc image or a physical disc or vice-versa:\r\n\r\nhttps://github.com/user-attachments/assets/0af57155-391c-41c8-b78c-bc70a63a7703\r\n\r\nThis implementation is heavily inspired on [redumper](https://github.com/superg/redumper), so Dolphin directly talks to the optical drive via low level SCSI multimedia commands instead of relying on the old approach that was derived from a very outdated version of libcdio.\r\n\r\n### Features and limitations\r\n* Although the UI changes are minimal (for now), I\'ve tried to make this work as intuitively as possible behind the scenes. I think the most noteworthy ones are that optical drives can be hot plugged at any time (if you\'re using USB to SATA adapters or portable drives) and if you boot from a physical disc and then eject it (either via File => Eject Disc or by pressing the Eject button on the drive itself), the disc will be ejected from the emulated console too. If you reinsert a disc later, it\'ll automatically reinsert the disc on the emulated console too (e.g. multi disc games that ask you to insert the next disc)\r\n* I didn\'t initially plan for this, but the `-i` flag from DolphinTool now accepts disc drive paths (e.g. `-i D:` or `-i /dev/sr0`). A side effect of that is you can now rip original discs to ISO, RVZ, GCZ or WIA directly from DolphinTool, if you have an OmniDrive-enabled drive\r\n* Emulated disc speed code is bypassed when using physical discs, as well as "Load Whole Game Into Memory". Beware of speeding up the emulation by setting the speed limit above 100% though, that can cause audio/video issues and even break games if you let them run too fast for too long, since the optical drive can\'t keep up ("An error occurred, please turn the GC/Wii off and refer to the operating manual")\r\n* Loading speeds are a bit slower than what I remember from playing on a real GC/Wii. The handful of games I tried still worked fine, though\r\n* When RetroAchievements are enabled, its hashing can cause a bit of slow loading speeds right after booting a game. It\'s more noticeable with Wii titles\r\n* Currently, [GameCube games that uses DTK Audio](https://wiki.dolphin-emu.org/index.php?title=Category:DTK_Audio_games) are nearly unplayable from physical discs, as the DTK audio path causes constant drive seeking, which consequently reduces the read speeds significantly. I intend to explore a few caching techniques to fix this, but it will be on a separate PR\r\n* Minimal testing was done on Linux, apart from compiling from source on Ubuntu 26.04.1 LTS and ensuring it could boot a game\r\n* Currently there\'s no macOS support, and I won\'t be adding it as I have no access to any Apple hardware. Porting should be easy, though, as all OS-specific code are isolated on `SCSIDevice.cpp/.h`\r\n\r\n### Generative AI disclosure\r\nThe source code from [redumper (b705)](https://github.com/superg/redumper/tree/b705) was fed into a LLM, which was tasked on creating a technical specs document about how it handles standard and raw OmniDrive reads. Then, I\'ve made a Windows-only CLI tool implementing only the absolute minimum required for the features that would be relevant for us, based on that document. DVD descrambling was added next and used this [reference implementation](https://github.com/Deterous/DVD-Scrambler) from Deterous. Once the CLI tool was feature complete, I used a LLM again, this time feeding it parts of the Linux (6.18 LTS) kernel source code, to assist with adding Linux compatibility to it.\r\n\r\nFinally, I started working with the Dolphin\'s source. The code this PR adds is directly derived from the CLI tool, but no LLMs were used beyond that point. I\'m also not touching any emulation code, the changes in DVDInterface reuses existing behavior or are based in code comments that already existed in Dolphin before this PR.\r\n\r\n### Licenses and attribuition\r\nThe bulk of this PR was heavily based on [redumper](https://github.com/superg/redumper), which is licensed under the GPLv3. As mentioned earlier, I also used the [descrambling implementation from Deterous](https://github.com/Deterous/DVD-Scrambler) as a reference, which the repo itself doesn\'t define a license, but directly mentions being made as the reference for redumper, so I think we\'re good? I can try contacting Deterous too for explicit approval, if needed...', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/reactions', 'total_count': 6, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 6, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6608556659', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6608556659', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'id': 6608556659, 'node_id': 'IC_kwDOALCn2M8AAAABieaScw', 'user': {'login': 'debug687', 'id': 313431556, 'node_id': 'U_kgDOEq6WBA', 'avatar_url': 'https://avatars.githubusercontent.com/u/313431556?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/debug687', 'html_url': 'https://github.com/debug687', 'followers_url': 'https://api.github.com/users/debug687/followers', 'following_url': 'https://api.github.com/users/debug687/following{/other_user}', 'gists_url': 'https://api.github.com/users/debug687/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/debug687/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/debug687/subscriptions', 'organizations_url': 'https://api.github.com/users/debug687/orgs', 'repos_url': 'https://api.github.com/users/debug687/repos', 'events_url': 'https://api.github.com/users/debug687/events{/privacy}', 'received_events_url': 'https://api.github.com/users/debug687/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T15:53:32Z', 'updated_at': '2026-11-03T16:04:05Z', 'body': "> what optical drive are you using? \r\n\r\nIt is a big internal desktop drive. I'm not sure what the model number is. I changed the firmware so much, I don't think even the drive knows what model it is anymore.\r\n\r\n> Are you trying original game discs or backups?\r\n\r\nI was only testing original game discs.\r\n\r\n> There's not a lot to work from in your screenshots, so I'll kindly ask you to retry again with the logs enabled, then \r\npost them here so I can investigate.\r\n\r\nI did, but what I found is strange. I tested a few different games, and some did work. But after opening and closing the disc drive, the same game stopped working. I haven't found any pattern in what makes it work/not work, but when it does not work (more than 90% of the time), this is the output you were asking for (it's the same output every time):\r\n\r\n## First attempt\r\n\r\n```\r\n06:41:696 DiscIO/OpticalDiscBlob.cpp:363 N[DIO]: Optical drive /dev/sr0 runs OmniDrive firmware v1.0.2\r\n06:42:107 DiscIO/OpticalDiscBlob.cpp:382 N[DIO]: GameCube/Wii book type in /dev/sr0, using OmniDrive raw reads\r\n06:51:110 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: FF\r\n07:00:910 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n07:00:910 DiscIO/OpticalDiscBlob.cpp:514 E[DIO]: Read error at LBA 0 on /dev/sr0\r\n07:10:749 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n07:20:521 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n07:20:521 DiscIO/OpticalDiscBlob.cpp:514 E[DIO]: Read error at LBA 0 on /dev/sr0\r\n```\r\n\r\n## Second attempt (without opening the disc drive)\r\n\r\n```\r\n08:12:722 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n08:12:722 DiscIO/OpticalDiscBlob.cpp:379 E[DIO]: Failed to read LBA 0 to derive the disc key from /dev/sr0\r\n```", 'author_association': 'CONTRIBUTOR', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6608556659/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T14:47:59Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15759, 'watchers_count': 15759, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3378, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 480, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3378, 'open_issues': 480, 'watchers': 15759, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'debug687', 'id': 313431556, 'node_id': 'U_kgDOEq6WBA', 'avatar_url': 'https://avatars.githubusercontent.com/u/313431556?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/debug687', 'html_url': 'https://github.com/debug687', 'followers_url': 'https://api.github.com/users/debug687/followers', 'following_url': 'https://api.github.com/users/debug687/following{/other_user}', 'gists_url': 'https://api.github.com/users/debug687/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/debug687/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/debug687/subscriptions', 'organizations_url': 'https://api.github.com/users/debug687/orgs', 'repos_url': 'https://api.github.com/users/debug687/repos', 'events_url': 'https://api.github.com/users/debug687/events{/privacy}', 'received_events_url': 'https://api.github.com/users/debug687/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'raw_gh_hook'}
2026-11-03T15:53:34.139546 {'source': 'webserver', 'gh_type': 'issue_comment', 'raw': {'action': 'created', 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'id': 6162397505, 'node_id': 'PR_kwDOALCn2M8AAAABMS-vaA', 'number': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 16, 'created_at': '2026-11-02T12:18:18Z', 'updated_at': '2026-11-03T15:53:32Z', 'closed_at': None, 'assignee': None, 'author_association': 'MEMBER', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.patch', 'merged_at': None}, 'body': 'At long last, this PR restores the ability of running games from DVD backups (originally removed on PR #11456) and, for the first time in Dolphin, allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive):\r\n\r\nhttps://github.com/user-attachments/assets/626b3c7e-cd6a-48f0-9962-eaa6b1f0805a\r\n\r\nOn supported OSes (currently Windows and Linux), there\'s a new "Boot From Optical Disc" menu entry on File, and "Change Disc" now opens a popup that lets you change between a disc image or a physical disc or vice-versa:\r\n\r\nhttps://github.com/user-attachments/assets/0af57155-391c-41c8-b78c-bc70a63a7703\r\n\r\nThis implementation is heavily inspired on [redumper](https://github.com/superg/redumper), so Dolphin directly talks to the optical drive via low level SCSI multimedia commands instead of relying on the old approach that was derived from a very outdated version of libcdio.\r\n\r\n### Features and limitations\r\n* Although the UI changes are minimal (for now), I\'ve tried to make this work as intuitively as possible behind the scenes. I think the most noteworthy ones are that optical drives can be hot plugged at any time (if you\'re using USB to SATA adapters or portable drives) and if you boot from a physical disc and then eject it (either via File => Eject Disc or by pressing the Eject button on the drive itself), the disc will be ejected from the emulated console too. If you reinsert a disc later, it\'ll automatically reinsert the disc on the emulated console too (e.g. multi disc games that ask you to insert the next disc)\r\n* I didn\'t initially plan for this, but the `-i` flag from DolphinTool now accepts disc drive paths (e.g. `-i D:` or `-i /dev/sr0`). A side effect of that is you can now rip original discs to ISO, RVZ, GCZ or WIA directly from DolphinTool, if you have an OmniDrive-enabled drive\r\n* Emulated disc speed code is bypassed when using physical discs, as well as "Load Whole Game Into Memory". Beware of speeding up the emulation by setting the speed limit above 100% though, that can cause audio/video issues and even break games if you let them run too fast for too long, since the optical drive can\'t keep up ("An error occurred, please turn the GC/Wii off and refer to the operating manual")\r\n* Loading speeds are a bit slower than what I remember from playing on a real GC/Wii. The handful of games I tried still worked fine, though\r\n* When RetroAchievements are enabled, its hashing can cause a bit of slow loading speeds right after booting a game. It\'s more noticeable with Wii titles\r\n* Currently, [GameCube games that uses DTK Audio](https://wiki.dolphin-emu.org/index.php?title=Category:DTK_Audio_games) are nearly unplayable from physical discs, as the DTK audio path causes constant drive seeking, which consequently reduces the read speeds significantly. I intend to explore a few caching techniques to fix this, but it will be on a separate PR\r\n* Minimal testing was done on Linux, apart from compiling from source on Ubuntu 26.04.1 LTS and ensuring it could boot a game\r\n* Currently there\'s no macOS support, and I won\'t be adding it as I have no access to any Apple hardware. Porting should be easy, though, as all OS-specific code are isolated on `SCSIDevice.cpp/.h`\r\n\r\n### Generative AI disclosure\r\nThe source code from [redumper (b705)](https://github.com/superg/redumper/tree/b705) was fed into a LLM, which was tasked on creating a technical specs document about how it handles standard and raw OmniDrive reads. Then, I\'ve made a Windows-only CLI tool implementing only the absolute minimum required for the features that would be relevant for us, based on that document. DVD descrambling was added next and used this [reference implementation](https://github.com/Deterous/DVD-Scrambler) from Deterous. Once the CLI tool was feature complete, I used a LLM again, this time feeding it parts of the Linux (6.18 LTS) kernel source code, to assist with adding Linux compatibility to it.\r\n\r\nFinally, I started working with the Dolphin\'s source. The code this PR adds is directly derived from the CLI tool, but no LLMs were used beyond that point. I\'m also not touching any emulation code, the changes in DVDInterface reuses existing behavior or are based in code comments that already existed in Dolphin before this PR.\r\n\r\n### Licenses and attribuition\r\nThe bulk of this PR was heavily based on [redumper](https://github.com/superg/redumper), which is licensed under the GPLv3. As mentioned earlier, I also used the [descrambling implementation from Deterous](https://github.com/Deterous/DVD-Scrambler) as a reference, which the repo itself doesn\'t define a license, but directly mentions being made as the reference for redumper, so I think we\'re good? I can try contacting Deterous too for explicit approval, if needed...', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/reactions', 'total_count': 6, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 6, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6608556659', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6608556659', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'id': 6608556659, 'node_id': 'IC_kwDOALCn2M8AAAABieaScw', 'user': {'login': 'debug687', 'id': 313431556, 'node_id': 'U_kgDOEq6WBA', 'avatar_url': 'https://avatars.githubusercontent.com/u/313431556?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/debug687', 'html_url': 'https://github.com/debug687', 'followers_url': 'https://api.github.com/users/debug687/followers', 'following_url': 'https://api.github.com/users/debug687/following{/other_user}', 'gists_url': 'https://api.github.com/users/debug687/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/debug687/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/debug687/subscriptions', 'organizations_url': 'https://api.github.com/users/debug687/orgs', 'repos_url': 'https://api.github.com/users/debug687/repos', 'events_url': 'https://api.github.com/users/debug687/events{/privacy}', 'received_events_url': 'https://api.github.com/users/debug687/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T15:53:32Z', 'updated_at': '2026-11-03T15:53:32Z', 'body': "> what optical drive are you using? \r\n\r\nIt is a big internal desktop drive. I'm not sure what the model number is. I changed the firmware so much, I don't think even the drive knows what model it is anymore.\r\n\r\n> Are you trying original game discs or backups?\r\n\r\nI was only testing original game discs.\r\n\r\n> There's not a lot to work from in your screenshots, so I'll kindly ask you to retry again with the logs enabled, then \r\npost them here so I can investigate.\r\n\r\nI did, but what I found is strange. I tested a few different games, and some did work. But after opening and closing the disc drive, the same game stopped working. I haven't found any pattern in what makes it work/not work, but when it does not work, this is the output you were asking for (it's the same output every time):\r\n\r\n## First attempt\r\n\r\n```\r\n06:41:696 DiscIO/OpticalDiscBlob.cpp:363 N[DIO]: Optical drive /dev/sr0 runs OmniDrive firmware v1.0.2\r\n06:42:107 DiscIO/OpticalDiscBlob.cpp:382 N[DIO]: GameCube/Wii book type in /dev/sr0, using OmniDrive raw reads\r\n06:51:110 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: FF\r\n07:00:910 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n07:00:910 DiscIO/OpticalDiscBlob.cpp:514 E[DIO]: Read error at LBA 0 on /dev/sr0\r\n07:10:749 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n07:20:521 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n07:20:521 DiscIO/OpticalDiscBlob.cpp:514 E[DIO]: Read error at LBA 0 on /dev/sr0\r\n```\r\n\r\n## Second attempt (without opening the disc drive)\r\n\r\n```\r\n08:12:722 Common/SCSIDevice.cpp:625 E[COMMON]: SCSI opcode C0 failed. Status: 02, Host: 0000, Driver: 0008, Sense Key: 04, ASC: 3E, ASCQ: 02\r\n08:12:722 DiscIO/OpticalDiscBlob.cpp:379 E[DIO]: Failed to read LBA 0 to derive the disc key from /dev/sr0\r\n```", 'author_association': 'CONTRIBUTOR', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6608556659/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T14:47:59Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15759, 'watchers_count': 15759, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3378, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 480, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3378, 'open_issues': 480, 'watchers': 15759, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'debug687', 'id': 313431556, 'node_id': 'U_kgDOEq6WBA', 'avatar_url': 'https://avatars.githubusercontent.com/u/313431556?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/debug687', 'html_url': 'https://github.com/debug687', 'followers_url': 'https://api.github.com/users/debug687/followers', 'following_url': 'https://api.github.com/users/debug687/following{/other_user}', 'gists_url': 'https://api.github.com/users/debug687/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/debug687/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/debug687/subscriptions', 'organizations_url': 'https://api.github.com/users/debug687/orgs', 'repos_url': 'https://api.github.com/users/debug687/repos', 'events_url': 'https://api.github.com/users/debug687/events{/privacy}', 'received_events_url': 'https://api.github.com/users/debug687/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'raw_gh_hook'}
2026-11-03T13:27:00.906409 {'source': 'webserver', 'gh_type': 'pull_request', 'raw': {'action': 'edited', 'number': 14978, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14978', 'id': 5138005347, 'node_id': 'PR_kwDOALCn2M8AAAABMj-9Yw', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14978', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14978.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14978.patch', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14978', 'number': 14978, 'state': 'open', 'locked': False, 'title': 'CPU: Fix quickly-stopped games hanging Dolphin', 'user': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': "Starting and quickly stopping a game will cause Dolphin to hang on a black window because `CPUManager::Init` reset the CPU state to `Stepping`, overwriting `PowerDown`. It's easier to reproduce this problem on a slow drive or by using the OmniDrive PR.", 'created_at': '2026-11-03T13:25:09Z', 'updated_at': '2026-11-03T13:26:56Z', 'closed_at': None, 'merged_at': None, 'merge_commit_sha': '6f174d638a14b0106a824386e86af346bc5d1de2', 'assignees': [], 'requested_reviewers': [], 'requested_teams': [], 'labels': [], 'milestone': None, 'draft': False, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14978/commits', 'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14978/comments', 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14978/comments', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/0436c9f60eb1e815a65f01d5edb6a5a155911553', 'head': {'label': 'JoshuaVandaele:quick-stop-hang', 'ref': 'quick-stop-hang', 'sha': '0436c9f60eb1e815a65f01d5edb6a5a155911553', 'user': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 915253252, 'node_id': 'R_kgDONo2oBA', 'name': 'dolphin', 'full_name': 'JoshuaVandaele/dolphin', 'private': False, 'owner': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/JoshuaVandaele/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': True, 'url': 'https://api.github.com/repos/JoshuaVandaele/dolphin', 'forks_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/forks', 'keys_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/events', 'assignees_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/merges', 'archive_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/deployments', 'created_at': '2025-01-11T11:19:57Z', 'updated_at': '2026-10-25T13:00:05Z', 'pushed_at': '2026-11-03T13:22:09Z', 'git_url': 'git://github.com/JoshuaVandaele/dolphin.git', 'ssh_url': 'git@github.com:JoshuaVandaele/dolphin.git', 'clone_url': 'https://github.com/JoshuaVandaele/dolphin.git', 'svn_url': 'https://github.com/JoshuaVandaele/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 522664, 'stargazers_count': 1, 'watchers_count': 1, 'language': 'C++', 'has_issues': False, 'has_projects': True, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 1, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 0, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': [], 'visibility': 'public', 'forks': 1, 'open_issues': 0, 'watchers': 1, 'default_branch': 'master', 'allow_squash_merge': True, 'allow_merge_commit': True, 'allow_rebase_merge': True, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, 'base': {'label': 'dolphin-emu:master', 'ref': 'master', 'sha': 'df4bd441dec5d6f3cff606eea76f183963e97a44', 'user': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3377, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 480, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3377, 'open_issues': 480, 'watchers': 15758, 'default_branch': 'master', 'allow_squash_merge': False, 'allow_merge_commit': True, 'allow_rebase_merge': False, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14978'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14978'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14978'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14978/comments'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14978/comments'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14978/commits'}, 'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/0436c9f60eb1e815a65f01d5edb6a5a155911553'}}, 'author_association': 'CONTRIBUTOR', 'auto_merge': None, 'assignee': None, 'active_lock_reason': None, 'merged': False, 'mergeable': True, 'rebaseable': False, 'mergeable_state': 'unstable', 'merged_by': None, 'comments': 0, 'review_comments': 0, 'maintainer_can_modify': True, 'commits': 1, 'additions': 5, 'deletions': 1, 'changed_files': 1}, 'changes': {'body': {'from': 'Starting and quickly stopping a game will cause Dolphin to hang on a black window because `CPUManager::Init` reset the CPU state to `Stepping`, overwriting `PowerDown`.'}}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3377, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 480, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3377, 'open_issues': 480, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'raw_gh_hook'}
2026-11-03T13:25:13.030244 {'source': 'webserver', 'gh_type': 'pull_request', 'raw': {'action': 'opened', 'number': 14978, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14978', 'id': 5138005347, 'node_id': 'PR_kwDOALCn2M8AAAABMj-9Yw', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14978', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14978.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14978.patch', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14978', 'number': 14978, 'state': 'open', 'locked': False, 'title': 'CPU: Fix quickly-stopped games hanging Dolphin', 'user': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'Starting and quickly stopping a game will cause Dolphin to hang on a black window because `CPUManager::Init` reset the CPU state to `Stepping`, overwriting `PowerDown`.', 'created_at': '2026-11-03T13:25:09Z', 'updated_at': '2026-11-03T13:25:09Z', 'closed_at': None, 'merged_at': None, 'merge_commit_sha': None, 'assignees': [], 'requested_reviewers': [], 'requested_teams': [], 'labels': [], 'milestone': None, 'draft': False, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14978/commits', 'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14978/comments', 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14978/comments', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/0436c9f60eb1e815a65f01d5edb6a5a155911553', 'head': {'label': 'JoshuaVandaele:quick-stop-hang', 'ref': 'quick-stop-hang', 'sha': '0436c9f60eb1e815a65f01d5edb6a5a155911553', 'user': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 915253252, 'node_id': 'R_kgDONo2oBA', 'name': 'dolphin', 'full_name': 'JoshuaVandaele/dolphin', 'private': False, 'owner': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/JoshuaVandaele/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': True, 'url': 'https://api.github.com/repos/JoshuaVandaele/dolphin', 'forks_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/forks', 'keys_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/events', 'assignees_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/merges', 'archive_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/JoshuaVandaele/dolphin/deployments', 'created_at': '2025-01-11T11:19:57Z', 'updated_at': '2026-10-25T13:00:05Z', 'pushed_at': '2026-11-03T13:22:09Z', 'git_url': 'git://github.com/JoshuaVandaele/dolphin.git', 'ssh_url': 'git@github.com:JoshuaVandaele/dolphin.git', 'clone_url': 'https://github.com/JoshuaVandaele/dolphin.git', 'svn_url': 'https://github.com/JoshuaVandaele/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 522664, 'stargazers_count': 1, 'watchers_count': 1, 'language': 'C++', 'has_issues': False, 'has_projects': True, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 1, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 0, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': [], 'visibility': 'public', 'forks': 1, 'open_issues': 0, 'watchers': 1, 'default_branch': 'master', 'allow_squash_merge': True, 'allow_merge_commit': True, 'allow_rebase_merge': True, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, 'base': {'label': 'dolphin-emu:master', 'ref': 'master', 'sha': 'df4bd441dec5d6f3cff606eea76f183963e97a44', 'user': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3377, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 480, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3377, 'open_issues': 480, 'watchers': 15758, 'default_branch': 'master', 'allow_squash_merge': False, 'allow_merge_commit': True, 'allow_rebase_merge': False, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14978'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14978'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14978'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14978/comments'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14978/comments'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14978/commits'}, 'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/0436c9f60eb1e815a65f01d5edb6a5a155911553'}}, 'author_association': 'CONTRIBUTOR', 'auto_merge': None, 'assignee': None, 'active_lock_reason': None, 'merged': False, 'mergeable': None, 'rebaseable': None, 'mergeable_state': 'unknown', 'merged_by': None, 'comments': 0, 'review_comments': 0, 'maintainer_can_modify': True, 'commits': 1, 'additions': 5, 'deletions': 1, 'changed_files': 1}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3377, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 480, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3377, 'open_issues': 480, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'raw_gh_hook'}
2026-11-03T12:21:21.900250 {'source': 'webserver', 'gh_type': 'pull_request_review_comment', 'raw': {'action': 'created', 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4453291256', 'pull_request_review_id': 5749202729, 'id': 4453291256, 'node_id': 'PRRC_kwDOALCn2M8AAAABCW_U-A', 'diff_hunk': '@@ -0,0 +1,776 @@\n+// Copyright 2026 Dolphin Emulator Project', 'path': 'Source/Core/Common/SCSIDevice.cpp', 'commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'original_commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'user': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'What do you think about splitting this file into multiple source files per platform? i.e. "SCSIDeviceLinux" etc.', 'created_at': '2026-11-03T10:10:46Z', 'updated_at': '2026-11-03T12:21:18Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4453291256', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4453291256'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4453291256'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974'}}, 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4453291256/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'start_line': None, 'original_start_line': None, 'start_side': None, 'line': 1, 'original_line': 1, 'side': 'RIGHT', 'author_association': 'CONTRIBUTOR', 'original_position': 1, 'position': 1, 'subject_type': 'line'}, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'id': 5120175976, 'node_id': 'PR_kwDOALCn2M8AAAABMS-vaA', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.patch', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'number': 14974, 'state': 'open', 'locked': False, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'At long last, this PR restores the ability of running games from DVD backups (originally removed on PR #11456) and, for the first time in Dolphin, allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive):\r\n\r\nhttps://github.com/user-attachments/assets/626b3c7e-cd6a-48f0-9962-eaa6b1f0805a\r\n\r\nOn supported OSes (currently Windows and Linux), there\'s a new "Boot From Optical Disc" menu entry on File, and "Change Disc" now opens a popup that lets you change between a disc image or a physical disc or vice-versa:\r\n\r\nhttps://github.com/user-attachments/assets/0af57155-391c-41c8-b78c-bc70a63a7703\r\n\r\nThis implementation is heavily inspired on [redumper](https://github.com/superg/redumper), so Dolphin directly talks to the optical drive via low level SCSI multimedia commands instead of relying on the old approach that was derived from a very outdated version of libcdio.\r\n\r\n### Features and limitations\r\n* Although the UI changes are minimal (for now), I\'ve tried to make this work as intuitively as possible behind the scenes. I think the most noteworthy ones are that optical drives can be hot plugged at any time (if you\'re using USB to SATA adapters or portable drives) and if you boot from a physical disc and then eject it (either via File => Eject Disc or by pressing the Eject button on the drive itself), the disc will be ejected from the emulated console too. If you reinsert a disc later, it\'ll automatically reinsert the disc on the emulated console too (e.g. multi disc games that ask you to insert the next disc)\r\n* I didn\'t initially plan for this, but the `-i` flag from DolphinTool now accepts disc drive paths (e.g. `-i D:` or `-i /dev/sr0`). A side effect of that is you can now rip original discs to ISO, RVZ, GCZ or WIA directly from DolphinTool, if you have an OmniDrive-enabled drive\r\n* Emulated disc speed code is bypassed when using physical discs, as well as "Load Whole Game Into Memory". Beware of speeding up the emulation by setting the speed limit above 100% though, that can cause audio/video issues and even break games if you let them run too fast for too long, since the optical drive can\'t keep up ("An error occurred, please turn the GC/Wii off and refer to the operating manual")\r\n* Loading speeds are a bit slower than what I remember from playing on a real GC/Wii. The handful of games I tried still worked fine, though\r\n* When RetroAchievements are enabled, its hashing can cause a bit of slow loading speeds right after booting a game. It\'s more noticeable with Wii titles\r\n* Currently, [GameCube games that uses DTK Audio](https://wiki.dolphin-emu.org/index.php?title=Category:DTK_Audio_games) are nearly unplayable from physical discs, as the DTK audio path causes constant drive seeking, which consequently reduces the read speeds significantly. I intend to explore a few caching techniques to fix this, but it will be on a separate PR\r\n* Minimal testing was done on Linux, apart from compiling from source on Ubuntu 26.04.1 LTS and ensuring it could boot a game\r\n* Currently there\'s no macOS support, and I won\'t be adding it as I have no access to any Apple hardware. Porting should be easy, though, as all OS-specific code are isolated on `SCSIDevice.cpp/.h`\r\n\r\n### Generative AI disclosure\r\nThe source code from [redumper (b705)](https://github.com/superg/redumper/tree/b705) was fed into a LLM, which was tasked on creating a technical specs document about how it handles standard and raw OmniDrive reads. Then, I\'ve made a Windows-only CLI tool implementing only the absolute minimum required for the features that would be relevant for us, based on that document. DVD descrambling was added next and used this [reference implementation](https://github.com/Deterous/DVD-Scrambler) from Deterous. Once the CLI tool was feature complete, I used a LLM again, this time feeding it parts of the Linux (6.18 LTS) kernel source code, to assist with adding Linux compatibility to it.\r\n\r\nFinally, I started working with the Dolphin\'s source. The code this PR adds is directly derived from the CLI tool, but no LLMs were used beyond that point. I\'m also not touching any emulation code, the changes in DVDInterface reuses existing behavior or are based in code comments that already existed in Dolphin before this PR.\r\n\r\n### Licenses and attribuition\r\nThe bulk of this PR was heavily based on [redumper](https://github.com/superg/redumper), which is licensed under the GPLv3. As mentioned earlier, I also used the [descrambling implementation from Deterous](https://github.com/Deterous/DVD-Scrambler) as a reference, which the repo itself doesn\'t define a license, but directly mentions being made as the reference for redumper, so I think we\'re good? I can try contacting Deterous too for explicit approval, if needed...', 'created_at': '2026-11-02T12:18:18Z', 'updated_at': '2026-11-03T12:01:58Z', 'closed_at': None, 'merged_at': None, 'merge_commit_sha': '920145f16bc85fdc49454f5120cd997373cae04d', 'assignees': [], 'requested_reviewers': [], 'requested_teams': [], 'labels': [], 'milestone': None, 'draft': False, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/commits', 'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/comments', 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/ab0b808663fe623e8e8a52396273ee5a86cf440c', 'head': {'label': 'mbc07:BootFromOpticalDiscRevival', 'ref': 'BootFromOpticalDiscRevival', 'sha': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 38133254, 'node_id': 'MDEwOlJlcG9zaXRvcnkzODEzMzI1NA==', 'name': 'dolphin', 'full_name': 'mbc07/dolphin', 'private': False, 'owner': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/mbc07/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': True, 'url': 'https://api.github.com/repos/mbc07/dolphin', 'forks_url': 'https://api.github.com/repos/mbc07/dolphin/forks', 'keys_url': 'https://api.github.com/repos/mbc07/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/mbc07/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/mbc07/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/mbc07/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/mbc07/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/mbc07/dolphin/events', 'assignees_url': 'https://api.github.com/repos/mbc07/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/mbc07/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/mbc07/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/mbc07/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/mbc07/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/mbc07/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/mbc07/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/mbc07/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/mbc07/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/mbc07/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/mbc07/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/mbc07/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/mbc07/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/mbc07/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/mbc07/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/mbc07/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/mbc07/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/mbc07/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/mbc07/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/mbc07/dolphin/merges', 'archive_url': 'https://api.github.com/repos/mbc07/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/mbc07/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/mbc07/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/mbc07/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/mbc07/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/mbc07/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/mbc07/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/mbc07/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/mbc07/dolphin/deployments', 'created_at': '2015-06-26T20:55:12Z', 'updated_at': '2026-11-02T18:13:33Z', 'pushed_at': '2026-11-02T09:35:30Z', 'git_url': 'git://github.com/mbc07/dolphin.git', 'ssh_url': 'git@github.com:mbc07/dolphin.git', 'clone_url': 'https://github.com/mbc07/dolphin.git', 'svn_url': 'https://github.com/mbc07/dolphin', 'homepage': 'https://dolphin-emu.org/', 'size': 520861, 'stargazers_count': 0, 'watchers_count': 0, 'language': 'C++', 'has_issues': False, 'has_projects': True, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 0, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 0, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': [], 'visibility': 'public', 'forks': 0, 'open_issues': 0, 'watchers': 0, 'default_branch': 'master', 'allow_squash_merge': True, 'allow_merge_commit': True, 'allow_rebase_merge': True, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, 'base': {'label': 'dolphin-emu:master', 'ref': 'master', 'sha': 'd182533d363eae8c753d37cfad4107930da2019a', 'user': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3377, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 479, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3377, 'open_issues': 479, 'watchers': 15758, 'default_branch': 'master', 'allow_squash_merge': False, 'allow_merge_commit': True, 'allow_rebase_merge': False, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14974'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/comments'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/commits'}, 'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/ab0b808663fe623e8e8a52396273ee5a86cf440c'}}, 'author_association': 'MEMBER', 'auto_merge': None, 'assignee': None, 'active_lock_reason': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3377, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 479, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3377, 'open_issues': 479, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'raw_gh_hook'}
2026-11-03T12:21:21.899503 {'source': 'webserver', 'gh_type': 'pull_request_review_comment', 'raw': {'action': 'created', 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4454423062', 'pull_request_review_id': 5749202729, 'id': 4454423062, 'node_id': 'PRRC_kwDOALCn2M8AAAABCYEaFg', 'diff_hunk': '@@ -122,9 +122,9 @@ void GameConfigWidget::CreateWidgets()\n tr("Synchronizes the GPU and CPU threads to help prevent random freezes "\n "in Dual core mode. (ON = Compatible, OFF = Fast)"));\n m_emulate_disc_speed->SetDescription(\n- tr("Enable emulated disc speed. Disabling this can cause crashes "\n- "and other problems in some games. "\n- "(ON = Compatible, OFF = Unlocked)"));\n+ tr("Enable emulated disc speed. Disabling this can cause crashes and other problems in some "\n+ "games. This setting is ignored when booting from an optical disc. (ON = Compatible, OFF "\n+ "= Unlocked)"));', 'path': 'Source/Core/DolphinQt/Config/GameConfigWidget.cpp', 'commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'original_commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'user': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'This is just a style preference, but\n```suggestion\n tr("Enable emulated disc speed. Disabling this can cause crashes and other problems in some "\n "games. This setting is ignored when booting from an optical disc. "\n "(ON = Compatible, OFF = Unlocked)"));\n```', 'created_at': '2026-11-03T12:07:09Z', 'updated_at': '2026-11-03T12:21:18Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4454423062', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4454423062'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4454423062'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974'}}, 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4454423062/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'start_line': 125, 'original_start_line': 125, 'start_side': 'RIGHT', 'line': 127, 'original_line': 127, 'side': 'RIGHT', 'author_association': 'CONTRIBUTOR', 'original_position': 9, 'position': 9, 'subject_type': 'line'}, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'id': 5120175976, 'node_id': 'PR_kwDOALCn2M8AAAABMS-vaA', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.patch', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'number': 14974, 'state': 'open', 'locked': False, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'At long last, this PR restores the ability of running games from DVD backups (originally removed on PR #11456) and, for the first time in Dolphin, allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive):\r\n\r\nhttps://github.com/user-attachments/assets/626b3c7e-cd6a-48f0-9962-eaa6b1f0805a\r\n\r\nOn supported OSes (currently Windows and Linux), there\'s a new "Boot From Optical Disc" menu entry on File, and "Change Disc" now opens a popup that lets you change between a disc image or a physical disc or vice-versa:\r\n\r\nhttps://github.com/user-attachments/assets/0af57155-391c-41c8-b78c-bc70a63a7703\r\n\r\nThis implementation is heavily inspired on [redumper](https://github.com/superg/redumper), so Dolphin directly talks to the optical drive via low level SCSI multimedia commands instead of relying on the old approach that was derived from a very outdated version of libcdio.\r\n\r\n### Features and limitations\r\n* Although the UI changes are minimal (for now), I\'ve tried to make this work as intuitively as possible behind the scenes. I think the most noteworthy ones are that optical drives can be hot plugged at any time (if you\'re using USB to SATA adapters or portable drives) and if you boot from a physical disc and then eject it (either via File => Eject Disc or by pressing the Eject button on the drive itself), the disc will be ejected from the emulated console too. If you reinsert a disc later, it\'ll automatically reinsert the disc on the emulated console too (e.g. multi disc games that ask you to insert the next disc)\r\n* I didn\'t initially plan for this, but the `-i` flag from DolphinTool now accepts disc drive paths (e.g. `-i D:` or `-i /dev/sr0`). A side effect of that is you can now rip original discs to ISO, RVZ, GCZ or WIA directly from DolphinTool, if you have an OmniDrive-enabled drive\r\n* Emulated disc speed code is bypassed when using physical discs, as well as "Load Whole Game Into Memory". Beware of speeding up the emulation by setting the speed limit above 100% though, that can cause audio/video issues and even break games if you let them run too fast for too long, since the optical drive can\'t keep up ("An error occurred, please turn the GC/Wii off and refer to the operating manual")\r\n* Loading speeds are a bit slower than what I remember from playing on a real GC/Wii. The handful of games I tried still worked fine, though\r\n* When RetroAchievements are enabled, its hashing can cause a bit of slow loading speeds right after booting a game. It\'s more noticeable with Wii titles\r\n* Currently, [GameCube games that uses DTK Audio](https://wiki.dolphin-emu.org/index.php?title=Category:DTK_Audio_games) are nearly unplayable from physical discs, as the DTK audio path causes constant drive seeking, which consequently reduces the read speeds significantly. I intend to explore a few caching techniques to fix this, but it will be on a separate PR\r\n* Minimal testing was done on Linux, apart from compiling from source on Ubuntu 26.04.1 LTS and ensuring it could boot a game\r\n* Currently there\'s no macOS support, and I won\'t be adding it as I have no access to any Apple hardware. Porting should be easy, though, as all OS-specific code are isolated on `SCSIDevice.cpp/.h`\r\n\r\n### Generative AI disclosure\r\nThe source code from [redumper (b705)](https://github.com/superg/redumper/tree/b705) was fed into a LLM, which was tasked on creating a technical specs document about how it handles standard and raw OmniDrive reads. Then, I\'ve made a Windows-only CLI tool implementing only the absolute minimum required for the features that would be relevant for us, based on that document. DVD descrambling was added next and used this [reference implementation](https://github.com/Deterous/DVD-Scrambler) from Deterous. Once the CLI tool was feature complete, I used a LLM again, this time feeding it parts of the Linux (6.18 LTS) kernel source code, to assist with adding Linux compatibility to it.\r\n\r\nFinally, I started working with the Dolphin\'s source. The code this PR adds is directly derived from the CLI tool, but no LLMs were used beyond that point. I\'m also not touching any emulation code, the changes in DVDInterface reuses existing behavior or are based in code comments that already existed in Dolphin before this PR.\r\n\r\n### Licenses and attribuition\r\nThe bulk of this PR was heavily based on [redumper](https://github.com/superg/redumper), which is licensed under the GPLv3. As mentioned earlier, I also used the [descrambling implementation from Deterous](https://github.com/Deterous/DVD-Scrambler) as a reference, which the repo itself doesn\'t define a license, but directly mentions being made as the reference for redumper, so I think we\'re good? I can try contacting Deterous too for explicit approval, if needed...', 'created_at': '2026-11-02T12:18:18Z', 'updated_at': '2026-11-03T12:01:58Z', 'closed_at': None, 'merged_at': None, 'merge_commit_sha': '920145f16bc85fdc49454f5120cd997373cae04d', 'assignees': [], 'requested_reviewers': [], 'requested_teams': [], 'labels': [], 'milestone': None, 'draft': False, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/commits', 'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/comments', 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/ab0b808663fe623e8e8a52396273ee5a86cf440c', 'head': {'label': 'mbc07:BootFromOpticalDiscRevival', 'ref': 'BootFromOpticalDiscRevival', 'sha': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 38133254, 'node_id': 'MDEwOlJlcG9zaXRvcnkzODEzMzI1NA==', 'name': 'dolphin', 'full_name': 'mbc07/dolphin', 'private': False, 'owner': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/mbc07/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': True, 'url': 'https://api.github.com/repos/mbc07/dolphin', 'forks_url': 'https://api.github.com/repos/mbc07/dolphin/forks', 'keys_url': 'https://api.github.com/repos/mbc07/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/mbc07/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/mbc07/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/mbc07/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/mbc07/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/mbc07/dolphin/events', 'assignees_url': 'https://api.github.com/repos/mbc07/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/mbc07/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/mbc07/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/mbc07/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/mbc07/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/mbc07/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/mbc07/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/mbc07/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/mbc07/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/mbc07/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/mbc07/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/mbc07/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/mbc07/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/mbc07/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/mbc07/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/mbc07/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/mbc07/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/mbc07/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/mbc07/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/mbc07/dolphin/merges', 'archive_url': 'https://api.github.com/repos/mbc07/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/mbc07/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/mbc07/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/mbc07/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/mbc07/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/mbc07/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/mbc07/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/mbc07/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/mbc07/dolphin/deployments', 'created_at': '2015-06-26T20:55:12Z', 'updated_at': '2026-11-02T18:13:33Z', 'pushed_at': '2026-11-02T09:35:30Z', 'git_url': 'git://github.com/mbc07/dolphin.git', 'ssh_url': 'git@github.com:mbc07/dolphin.git', 'clone_url': 'https://github.com/mbc07/dolphin.git', 'svn_url': 'https://github.com/mbc07/dolphin', 'homepage': 'https://dolphin-emu.org/', 'size': 520861, 'stargazers_count': 0, 'watchers_count': 0, 'language': 'C++', 'has_issues': False, 'has_projects': True, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 0, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 0, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': [], 'visibility': 'public', 'forks': 0, 'open_issues': 0, 'watchers': 0, 'default_branch': 'master', 'allow_squash_merge': True, 'allow_merge_commit': True, 'allow_rebase_merge': True, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, 'base': {'label': 'dolphin-emu:master', 'ref': 'master', 'sha': 'd182533d363eae8c753d37cfad4107930da2019a', 'user': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3377, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 479, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3377, 'open_issues': 479, 'watchers': 15758, 'default_branch': 'master', 'allow_squash_merge': False, 'allow_merge_commit': True, 'allow_rebase_merge': False, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14974'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/comments'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/commits'}, 'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/ab0b808663fe623e8e8a52396273ee5a86cf440c'}}, 'author_association': 'MEMBER', 'auto_merge': None, 'assignee': None, 'active_lock_reason': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3377, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 479, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3377, 'open_issues': 479, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'raw_gh_hook'}
2026-11-03T12:21:21.898756 {'source': 'webserver', 'gh_type': 'pull_request_review_comment', 'raw': {'action': 'created', 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4454462737', 'pull_request_review_id': 5749202729, 'id': 4454462737, 'node_id': 'PRRC_kwDOALCn2M8AAAABCYG1EQ', 'diff_hunk': '@@ -251,6 +252,7 @@ class MainWindow final : public QMainWindow\n bool m_fullscreen_requested = false;\n bool m_is_screensaver_inhibited = false;\n std::unique_ptr<BootParameters> m_pending_boot;\n+ std::optional<std::string> m_optical_drive;', 'path': 'Source/Core/DolphinQt/MainWindow.h', 'commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'original_commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'user': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': "I'm not sure why `MainWindow` needs to keep track of this since `DVDInterface` already does? Could it just use `GetInsertedOpticalDrive`?", 'created_at': '2026-11-03T12:11:35Z', 'updated_at': '2026-11-03T12:21:18Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4454462737', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4454462737'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4454462737'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974'}}, 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4454462737/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'start_line': None, 'original_start_line': None, 'start_side': None, 'line': 255, 'original_line': 255, 'side': 'RIGHT', 'author_association': 'CONTRIBUTOR', 'original_position': 12, 'position': 12, 'subject_type': 'line'}, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'id': 5120175976, 'node_id': 'PR_kwDOALCn2M8AAAABMS-vaA', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.patch', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'number': 14974, 'state': 'open', 'locked': False, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'At long last, this PR restores the ability of running games from DVD backups (originally removed on PR #11456) and, for the first time in Dolphin, allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive):\r\n\r\nhttps://github.com/user-attachments/assets/626b3c7e-cd6a-48f0-9962-eaa6b1f0805a\r\n\r\nOn supported OSes (currently Windows and Linux), there\'s a new "Boot From Optical Disc" menu entry on File, and "Change Disc" now opens a popup that lets you change between a disc image or a physical disc or vice-versa:\r\n\r\nhttps://github.com/user-attachments/assets/0af57155-391c-41c8-b78c-bc70a63a7703\r\n\r\nThis implementation is heavily inspired on [redumper](https://github.com/superg/redumper), so Dolphin directly talks to the optical drive via low level SCSI multimedia commands instead of relying on the old approach that was derived from a very outdated version of libcdio.\r\n\r\n### Features and limitations\r\n* Although the UI changes are minimal (for now), I\'ve tried to make this work as intuitively as possible behind the scenes. I think the most noteworthy ones are that optical drives can be hot plugged at any time (if you\'re using USB to SATA adapters or portable drives) and if you boot from a physical disc and then eject it (either via File => Eject Disc or by pressing the Eject button on the drive itself), the disc will be ejected from the emulated console too. If you reinsert a disc later, it\'ll automatically reinsert the disc on the emulated console too (e.g. multi disc games that ask you to insert the next disc)\r\n* I didn\'t initially plan for this, but the `-i` flag from DolphinTool now accepts disc drive paths (e.g. `-i D:` or `-i /dev/sr0`). A side effect of that is you can now rip original discs to ISO, RVZ, GCZ or WIA directly from DolphinTool, if you have an OmniDrive-enabled drive\r\n* Emulated disc speed code is bypassed when using physical discs, as well as "Load Whole Game Into Memory". Beware of speeding up the emulation by setting the speed limit above 100% though, that can cause audio/video issues and even break games if you let them run too fast for too long, since the optical drive can\'t keep up ("An error occurred, please turn the GC/Wii off and refer to the operating manual")\r\n* Loading speeds are a bit slower than what I remember from playing on a real GC/Wii. The handful of games I tried still worked fine, though\r\n* When RetroAchievements are enabled, its hashing can cause a bit of slow loading speeds right after booting a game. It\'s more noticeable with Wii titles\r\n* Currently, [GameCube games that uses DTK Audio](https://wiki.dolphin-emu.org/index.php?title=Category:DTK_Audio_games) are nearly unplayable from physical discs, as the DTK audio path causes constant drive seeking, which consequently reduces the read speeds significantly. I intend to explore a few caching techniques to fix this, but it will be on a separate PR\r\n* Minimal testing was done on Linux, apart from compiling from source on Ubuntu 26.04.1 LTS and ensuring it could boot a game\r\n* Currently there\'s no macOS support, and I won\'t be adding it as I have no access to any Apple hardware. Porting should be easy, though, as all OS-specific code are isolated on `SCSIDevice.cpp/.h`\r\n\r\n### Generative AI disclosure\r\nThe source code from [redumper (b705)](https://github.com/superg/redumper/tree/b705) was fed into a LLM, which was tasked on creating a technical specs document about how it handles standard and raw OmniDrive reads. Then, I\'ve made a Windows-only CLI tool implementing only the absolute minimum required for the features that would be relevant for us, based on that document. DVD descrambling was added next and used this [reference implementation](https://github.com/Deterous/DVD-Scrambler) from Deterous. Once the CLI tool was feature complete, I used a LLM again, this time feeding it parts of the Linux (6.18 LTS) kernel source code, to assist with adding Linux compatibility to it.\r\n\r\nFinally, I started working with the Dolphin\'s source. The code this PR adds is directly derived from the CLI tool, but no LLMs were used beyond that point. I\'m also not touching any emulation code, the changes in DVDInterface reuses existing behavior or are based in code comments that already existed in Dolphin before this PR.\r\n\r\n### Licenses and attribuition\r\nThe bulk of this PR was heavily based on [redumper](https://github.com/superg/redumper), which is licensed under the GPLv3. As mentioned earlier, I also used the [descrambling implementation from Deterous](https://github.com/Deterous/DVD-Scrambler) as a reference, which the repo itself doesn\'t define a license, but directly mentions being made as the reference for redumper, so I think we\'re good? I can try contacting Deterous too for explicit approval, if needed...', 'created_at': '2026-11-02T12:18:18Z', 'updated_at': '2026-11-03T12:01:58Z', 'closed_at': None, 'merged_at': None, 'merge_commit_sha': '920145f16bc85fdc49454f5120cd997373cae04d', 'assignees': [], 'requested_reviewers': [], 'requested_teams': [], 'labels': [], 'milestone': None, 'draft': False, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/commits', 'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/comments', 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/ab0b808663fe623e8e8a52396273ee5a86cf440c', 'head': {'label': 'mbc07:BootFromOpticalDiscRevival', 'ref': 'BootFromOpticalDiscRevival', 'sha': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 38133254, 'node_id': 'MDEwOlJlcG9zaXRvcnkzODEzMzI1NA==', 'name': 'dolphin', 'full_name': 'mbc07/dolphin', 'private': False, 'owner': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/mbc07/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': True, 'url': 'https://api.github.com/repos/mbc07/dolphin', 'forks_url': 'https://api.github.com/repos/mbc07/dolphin/forks', 'keys_url': 'https://api.github.com/repos/mbc07/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/mbc07/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/mbc07/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/mbc07/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/mbc07/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/mbc07/dolphin/events', 'assignees_url': 'https://api.github.com/repos/mbc07/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/mbc07/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/mbc07/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/mbc07/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/mbc07/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/mbc07/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/mbc07/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/mbc07/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/mbc07/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/mbc07/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/mbc07/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/mbc07/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/mbc07/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/mbc07/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/mbc07/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/mbc07/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/mbc07/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/mbc07/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/mbc07/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/mbc07/dolphin/merges', 'archive_url': 'https://api.github.com/repos/mbc07/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/mbc07/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/mbc07/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/mbc07/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/mbc07/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/mbc07/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/mbc07/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/mbc07/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/mbc07/dolphin/deployments', 'created_at': '2015-06-26T20:55:12Z', 'updated_at': '2026-11-02T18:13:33Z', 'pushed_at': '2026-11-02T09:35:30Z', 'git_url': 'git://github.com/mbc07/dolphin.git', 'ssh_url': 'git@github.com:mbc07/dolphin.git', 'clone_url': 'https://github.com/mbc07/dolphin.git', 'svn_url': 'https://github.com/mbc07/dolphin', 'homepage': 'https://dolphin-emu.org/', 'size': 520861, 'stargazers_count': 0, 'watchers_count': 0, 'language': 'C++', 'has_issues': False, 'has_projects': True, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 0, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 0, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': [], 'visibility': 'public', 'forks': 0, 'open_issues': 0, 'watchers': 0, 'default_branch': 'master', 'allow_squash_merge': True, 'allow_merge_commit': True, 'allow_rebase_merge': True, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, 'base': {'label': 'dolphin-emu:master', 'ref': 'master', 'sha': 'd182533d363eae8c753d37cfad4107930da2019a', 'user': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3377, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 479, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3377, 'open_issues': 479, 'watchers': 15758, 'default_branch': 'master', 'allow_squash_merge': False, 'allow_merge_commit': True, 'allow_rebase_merge': False, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14974'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/comments'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/commits'}, 'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/ab0b808663fe623e8e8a52396273ee5a86cf440c'}}, 'author_association': 'MEMBER', 'auto_merge': None, 'assignee': None, 'active_lock_reason': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3377, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 479, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3377, 'open_issues': 479, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'raw_gh_hook'}
2026-11-03T12:21:21.897979 {'source': 'webserver', 'gh_type': 'pull_request_review_comment', 'raw': {'action': 'created', 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4452521727', 'pull_request_review_id': 5749202729, 'id': 4452521727, 'node_id': 'PRRC_kwDOALCn2M8AAAABCWQW_w', 'diff_hunk': '@@ -0,0 +1,776 @@\n+// Copyright 2026 Dolphin Emulator Project\n+// SPDX-License-Identifier: GPL-2.0-or-later\n+\n+#include "Common/SCSIDevice.h"\n+\n+#include <algorithm>\n+#include <array>\n+#include <cctype>\n+#include <cerrno>\n+#include <cstddef>\n+#include <filesystem>\n+#include <map>\n+#include <mutex>\n+#include <optional>\n+#include <span>\n+#include <string>\n+#include <string_view>\n+#include <system_error>\n+#include <vector>\n+\n+#include <fmt/format.h>\n+\n+#if defined(_WIN32)\n+#include <windows.h>\n+#include <winioctl.h>\n+\n+#include <ntddscsi.h>\n+#include <ntddstor.h>\n+#elif defined(__linux__) && !defined(__ANDROID__)\n+#include <fcntl.h>\n+#include <scsi/sg.h>\n+#include <sys/ioctl.h>\n+#include <unistd.h>\n+#endif\n+\n+#include "Common/CommonFuncs.h"\n+#include "Common/CommonTypes.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Logging/Log.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+\n+namespace Common\n+{\n+SCSIDevice::~SCSIDevice()\n+{\n+ Close();\n+}\n+\n+#if defined(_WIN32)\n+\n+namespace\n+{\n+// Timeout for the TEST UNIT READY that reads drive status. Short, so a spinning-up drive is\n+// reported as such at once instead of blocking until it is ready\n+constexpr u32 STATUS_PROBE_TIMEOUT_SECONDS = 1;\n+} // namespace\n+\n+namespace\n+{\n+// SCSI_PASS_THROUGH_DIRECT and its sense buffer in one contiguous block, so the kernel can write\n+// sense data at SenseInfoOffset\n+struct SPTDWithSense\n+{\n+ SCSI_PASS_THROUGH_DIRECT sptd;\n+ std::array<u8, 24> sense;\n+};\n+\n+std::wstring ToDevicePath(const std::string& path)\n+{\n+ return UTF8ToWString(R"(\\\\.\\)" + path);\n+}\n+\n+HANDLE OpenDeviceHandle(const std::string& path, DWORD access)\n+{\n+ return CreateFileW(ToDevicePath(path).c_str(), access, FILE_SHARE_READ | FILE_SHARE_WRITE,\n+ nullptr, OPEN_EXISTING, 0, nullptr);\n+}\n+\n+void DecodeSense(const SPTDWithSense& sptd, SCSISense* sense)\n+{\n+ sense->status = sptd.sptd.ScsiStatus;\n+ sense->sense_key = sptd.sense[2] & 0x0F;\n+ sense->asc = sptd.sense[12];\n+ sense->ascq = sptd.sense[13];\n+}\n+\n+// Returns false only if the OS rejects the IOCTL itself\n+bool SendPassThrough(HANDLE handle, std::span<const u8> cdb, std::span<u8> buffer,\n+ SCSIDataDirection direction, u32 timeout_seconds, SPTDWithSense* sptd)\n+{\n+ if (cdb.size() > sizeof(SCSI_PASS_THROUGH_DIRECT::Cdb))\n+ return false;\n+\n+ *sptd = {};\n+ sptd->sptd.Length = sizeof(SCSI_PASS_THROUGH_DIRECT);\n+ sptd->sptd.CdbLength = static_cast<UCHAR>(cdb.size());\n+ sptd->sptd.SenseInfoLength = static_cast<UCHAR>(sptd->sense.size());\n+ sptd->sptd.DataIn = static_cast<UCHAR>(direction);\n+ sptd->sptd.DataTransferLength = static_cast<ULONG>(buffer.size());\n+ sptd->sptd.TimeOutValue = timeout_seconds;\n+ sptd->sptd.DataBuffer = buffer.empty() ? nullptr : buffer.data();\n+ sptd->sptd.SenseInfoOffset = static_cast<ULONG>(offsetof(SPTDWithSense, sense));\n+ std::ranges::copy(cdb, sptd->sptd.Cdb);\n+\n+ DWORD bytes_returned = 0;\n+ return DeviceIoControl(handle, IOCTL_SCSI_PASS_THROUGH_DIRECT, sptd, sizeof(*sptd), sptd,\n+ sizeof(*sptd), &bytes_returned, nullptr) != FALSE;\n+}\n+\n+std::string ReadDescriptorString(std::span<const u8> data, u32 offset)\n+{\n+ if (offset == 0 || offset >= data.size())\n+ return {};\n+ const std::string_view text(reinterpret_cast<const char*>(data.data()) + offset,\n+ data.size() - offset);\n+ return std::string(StripWhitespace(text.substr(0, text.find(\'\\0\'))));\n+}\n+} // namespace\n+\n+bool SCSIDevice::IsSupported()\n+{\n+ return true;\n+}\n+\n+bool SCSIDevice::Open(const std::string& path, bool read_write)\n+{\n+ Close();\n+\n+ DWORD desired_access = GENERIC_READ;\n+ if (read_write)\n+ desired_access |= GENERIC_WRITE;\n+\n+ HANDLE handle = OpenDeviceHandle(path, desired_access);\n+\n+ // Standard user accounts can be refused GENERIC_WRITE, so fall back to read-only before failing\n+ if (handle == INVALID_HANDLE_VALUE && read_write)\n+ handle = OpenDeviceHandle(path, GENERIC_READ);\n+\n+ if (handle == INVALID_HANDLE_VALUE)\n+ {\n+ ERROR_LOG_FMT(COMMON, "Failed to open optical drive {}: {}", path, GetLastErrorString());\n+ return false;\n+ }\n+\n+ m_handle = handle;\n+ m_path = path;\n+ return true;\n+}\n+\n+void SCSIDevice::Close()\n+{\n+ if (m_handle != nullptr)\n+ {\n+ CloseHandle(m_handle);\n+ m_handle = nullptr;\n+ }\n+}\n+\n+bool SCSIDevice::IsOpen() const\n+{\n+ return m_handle != nullptr;\n+}\n+\n+bool SCSIDevice::SendCommand(std::span<const u8> cdb, std::span<u8> buffer,\n+ SCSIDataDirection direction, u32 timeout_seconds,\n+ SCSISense* sense) const\n+{\n+ if (!IsOpen() || cdb.empty())\n+ return false;\n+\n+ DEBUG_LOG_FMT(COMMON, "Sending SCSI opcode {:02X} to {} ({} data bytes)", cdb[0], m_path,\n+ buffer.size());\n+\n+ SPTDWithSense sptd{};\n+ if (!SendPassThrough(m_handle, cdb, buffer, direction, timeout_seconds, &sptd))\n+ {\n+ ERROR_LOG_FMT(COMMON, "SCSI passthrough for opcode {:02X} failed: {}", cdb[0],\n+ GetLastErrorString());\n+ return false;\n+ }\n+\n+ SCSISense decoded;\n+ DecodeSense(sptd, &decoded);\n+ if (sense != nullptr)\n+ *sense = decoded;\n+\n+ // Any status other than 0x00 (GOOD) is a device-side failure\n+ if (decoded.status != 0)\n+ {\n+ ERROR_LOG_FMT(COMMON,\n+ "SCSI opcode {:02X} failed. Status: {:02X}, Sense Key: {:02X}, ASC: {:02X}, "\n+ "ASCQ: {:02X}",\n+ cdb[0], decoded.status, decoded.sense_key, decoded.asc, decoded.ascq);\n+ return false;\n+ }\n+ return true;\n+}\n+\n+OpticalDriveStatus SCSIDevice::GetDriveStatus(const std::string& path)\n+{\n+ HANDLE handle = OpenDeviceHandle(path, GENERIC_READ | GENERIC_WRITE);\n+ if (handle == INVALID_HANDLE_VALUE)\n+ handle = OpenDeviceHandle(path, GENERIC_READ);\n+\n+ if (handle == INVALID_HANDLE_VALUE)\n+ {\n+ const DWORD error = GetLastError();\n+ if (error == ERROR_NOT_READY || error == ERROR_MEDIA_CHANGED)\n+ return OpticalDriveStatus::NoDisc;\n+ return OpticalDriveStatus::NotReadyOther;\n+ }\n+\n+ // TEST UNIT READY (opcode 0x00). A spinning-up drive answers it at once with a CHECK CONDITION\n+ // (sense 02/04/01), so a short timeout returns the real state instead of waiting for the drive\n+ constexpr std::array<u8, 6> cdb{};\n+ DEBUG_LOG_FMT(COMMON, "Sending SCSI opcode {:02X} to {} (0 data bytes)", cdb[0], path);\n+ SPTDWithSense sptd{};\n+ const bool sent =\n+ SendPassThrough(handle, cdb, {}, SCSIDataDirection::In, STATUS_PROBE_TIMEOUT_SECONDS, &sptd);', 'path': 'Source/Core/Common/SCSIDevice.cpp', 'commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'original_commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'user': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'SCSIDataDirection says "Commands without a data phase use Out with an empty buffer" but this uses `In\u200b`, is this intentional?', 'created_at': '2026-11-03T08:47:12Z', 'updated_at': '2026-11-03T12:21:18Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4452521727', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4452521727'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4452521727'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974'}}, 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4452521727/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'start_line': None, 'original_start_line': None, 'start_side': None, 'line': 220, 'original_line': 220, 'side': 'RIGHT', 'author_association': 'CONTRIBUTOR', 'original_position': 220, 'position': 220, 'subject_type': 'line'}, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'id': 5120175976, 'node_id': 'PR_kwDOALCn2M8AAAABMS-vaA', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.patch', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'number': 14974, 'state': 'open', 'locked': False, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'At long last, this PR restores the ability of running games from DVD backups (originally removed on PR #11456) and, for the first time in Dolphin, allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive):\r\n\r\nhttps://github.com/user-attachments/assets/626b3c7e-cd6a-48f0-9962-eaa6b1f0805a\r\n\r\nOn supported OSes (currently Windows and Linux), there\'s a new "Boot From Optical Disc" menu entry on File, and "Change Disc" now opens a popup that lets you change between a disc image or a physical disc or vice-versa:\r\n\r\nhttps://github.com/user-attachments/assets/0af57155-391c-41c8-b78c-bc70a63a7703\r\n\r\nThis implementation is heavily inspired on [redumper](https://github.com/superg/redumper), so Dolphin directly talks to the optical drive via low level SCSI multimedia commands instead of relying on the old approach that was derived from a very outdated version of libcdio.\r\n\r\n### Features and limitations\r\n* Although the UI changes are minimal (for now), I\'ve tried to make this work as intuitively as possible behind the scenes. I think the most noteworthy ones are that optical drives can be hot plugged at any time (if you\'re using USB to SATA adapters or portable drives) and if you boot from a physical disc and then eject it (either via File => Eject Disc or by pressing the Eject button on the drive itself), the disc will be ejected from the emulated console too. If you reinsert a disc later, it\'ll automatically reinsert the disc on the emulated console too (e.g. multi disc games that ask you to insert the next disc)\r\n* I didn\'t initially plan for this, but the `-i` flag from DolphinTool now accepts disc drive paths (e.g. `-i D:` or `-i /dev/sr0`). A side effect of that is you can now rip original discs to ISO, RVZ, GCZ or WIA directly from DolphinTool, if you have an OmniDrive-enabled drive\r\n* Emulated disc speed code is bypassed when using physical discs, as well as "Load Whole Game Into Memory". Beware of speeding up the emulation by setting the speed limit above 100% though, that can cause audio/video issues and even break games if you let them run too fast for too long, since the optical drive can\'t keep up ("An error occurred, please turn the GC/Wii off and refer to the operating manual")\r\n* Loading speeds are a bit slower than what I remember from playing on a real GC/Wii. The handful of games I tried still worked fine, though\r\n* When RetroAchievements are enabled, its hashing can cause a bit of slow loading speeds right after booting a game. It\'s more noticeable with Wii titles\r\n* Currently, [GameCube games that uses DTK Audio](https://wiki.dolphin-emu.org/index.php?title=Category:DTK_Audio_games) are nearly unplayable from physical discs, as the DTK audio path causes constant drive seeking, which consequently reduces the read speeds significantly. I intend to explore a few caching techniques to fix this, but it will be on a separate PR\r\n* Minimal testing was done on Linux, apart from compiling from source on Ubuntu 26.04.1 LTS and ensuring it could boot a game\r\n* Currently there\'s no macOS support, and I won\'t be adding it as I have no access to any Apple hardware. Porting should be easy, though, as all OS-specific code are isolated on `SCSIDevice.cpp/.h`\r\n\r\n### Generative AI disclosure\r\nThe source code from [redumper (b705)](https://github.com/superg/redumper/tree/b705) was fed into a LLM, which was tasked on creating a technical specs document about how it handles standard and raw OmniDrive reads. Then, I\'ve made a Windows-only CLI tool implementing only the absolute minimum required for the features that would be relevant for us, based on that document. DVD descrambling was added next and used this [reference implementation](https://github.com/Deterous/DVD-Scrambler) from Deterous. Once the CLI tool was feature complete, I used a LLM again, this time feeding it parts of the Linux (6.18 LTS) kernel source code, to assist with adding Linux compatibility to it.\r\n\r\nFinally, I started working with the Dolphin\'s source. The code this PR adds is directly derived from the CLI tool, but no LLMs were used beyond that point. I\'m also not touching any emulation code, the changes in DVDInterface reuses existing behavior or are based in code comments that already existed in Dolphin before this PR.\r\n\r\n### Licenses and attribuition\r\nThe bulk of this PR was heavily based on [redumper](https://github.com/superg/redumper), which is licensed under the GPLv3. As mentioned earlier, I also used the [descrambling implementation from Deterous](https://github.com/Deterous/DVD-Scrambler) as a reference, which the repo itself doesn\'t define a license, but directly mentions being made as the reference for redumper, so I think we\'re good? I can try contacting Deterous too for explicit approval, if needed...', 'created_at': '2026-11-02T12:18:18Z', 'updated_at': '2026-11-03T12:01:58Z', 'closed_at': None, 'merged_at': None, 'merge_commit_sha': '920145f16bc85fdc49454f5120cd997373cae04d', 'assignees': [], 'requested_reviewers': [], 'requested_teams': [], 'labels': [], 'milestone': None, 'draft': False, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/commits', 'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/comments', 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/ab0b808663fe623e8e8a52396273ee5a86cf440c', 'head': {'label': 'mbc07:BootFromOpticalDiscRevival', 'ref': 'BootFromOpticalDiscRevival', 'sha': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 38133254, 'node_id': 'MDEwOlJlcG9zaXRvcnkzODEzMzI1NA==', 'name': 'dolphin', 'full_name': 'mbc07/dolphin', 'private': False, 'owner': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/mbc07/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': True, 'url': 'https://api.github.com/repos/mbc07/dolphin', 'forks_url': 'https://api.github.com/repos/mbc07/dolphin/forks', 'keys_url': 'https://api.github.com/repos/mbc07/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/mbc07/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/mbc07/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/mbc07/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/mbc07/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/mbc07/dolphin/events', 'assignees_url': 'https://api.github.com/repos/mbc07/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/mbc07/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/mbc07/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/mbc07/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/mbc07/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/mbc07/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/mbc07/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/mbc07/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/mbc07/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/mbc07/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/mbc07/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/mbc07/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/mbc07/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/mbc07/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/mbc07/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/mbc07/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/mbc07/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/mbc07/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/mbc07/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/mbc07/dolphin/merges', 'archive_url': 'https://api.github.com/repos/mbc07/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/mbc07/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/mbc07/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/mbc07/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/mbc07/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/mbc07/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/mbc07/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/mbc07/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/mbc07/dolphin/deployments', 'created_at': '2015-06-26T20:55:12Z', 'updated_at': '2026-11-02T18:13:33Z', 'pushed_at': '2026-11-02T09:35:30Z', 'git_url': 'git://github.com/mbc07/dolphin.git', 'ssh_url': 'git@github.com:mbc07/dolphin.git', 'clone_url': 'https://github.com/mbc07/dolphin.git', 'svn_url': 'https://github.com/mbc07/dolphin', 'homepage': 'https://dolphin-emu.org/', 'size': 520861, 'stargazers_count': 0, 'watchers_count': 0, 'language': 'C++', 'has_issues': False, 'has_projects': True, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 0, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 0, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': [], 'visibility': 'public', 'forks': 0, 'open_issues': 0, 'watchers': 0, 'default_branch': 'master', 'allow_squash_merge': True, 'allow_merge_commit': True, 'allow_rebase_merge': True, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, 'base': {'label': 'dolphin-emu:master', 'ref': 'master', 'sha': 'd182533d363eae8c753d37cfad4107930da2019a', 'user': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3377, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 479, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3377, 'open_issues': 479, 'watchers': 15758, 'default_branch': 'master', 'allow_squash_merge': False, 'allow_merge_commit': True, 'allow_rebase_merge': False, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14974'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/comments'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/commits'}, 'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/ab0b808663fe623e8e8a52396273ee5a86cf440c'}}, 'author_association': 'MEMBER', 'auto_merge': None, 'assignee': None, 'active_lock_reason': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3377, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 479, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3377, 'open_issues': 479, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'raw_gh_hook'}
2026-11-03T12:21:21.897146 {'source': 'webserver', 'gh_type': 'pull_request_review_comment', 'raw': {'action': 'created', 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4452462887', 'pull_request_review_id': 5749202729, 'id': 4452462887, 'node_id': 'PRRC_kwDOALCn2M8AAAABCWMxJw', 'diff_hunk': '@@ -0,0 +1,94 @@\n+// Copyright 2026 Dolphin Emulator Project\n+// SPDX-License-Identifier: GPL-2.0-or-later\n+\n+#pragma once\n+\n+#include <functional>\n+#include <map>\n+#include <memory>\n+#include <optional>\n+#include <string>\n+#include <vector>\n+\n+#include <QObject>\n+#include <QString>\n+\n+#include "Common/Flag.h"\n+#include "Common/SCSIDevice.h"\n+#include "Common/WorkQueueThread.h"\n+#include "DiscIO/OmniDrive.h"\n+\n+// Lists the host\'s optical drives at once and fills in what is known about each from a drive cache\n+// that lasts until Dolphin exits. Only a drive new to the cache is queried for its firmware, once,\n+// on a worker thread, so the UI never waits for a drive and known drives are left alone.', 'path': 'Source/Core/DolphinQt/OpticalDriveWatcher.h', 'commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'original_commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'user': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': '`GetCachedIdentity` and `Refresh` both call `GetDriveInfo` on the UI thread, which on Linux runs `GetSerialNumber`, which waits for a drive', 'created_at': '2026-11-03T08:40:06Z', 'updated_at': '2026-11-03T12:21:18Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4452462887', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4452462887'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14974#discussion_r4452462887'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974'}}, 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/4452462887/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'start_line': 21, 'original_start_line': 21, 'start_side': 'RIGHT', 'line': 23, 'original_line': 23, 'side': 'RIGHT', 'author_association': 'CONTRIBUTOR', 'original_position': 23, 'position': 23, 'subject_type': 'line'}, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'id': 5120175976, 'node_id': 'PR_kwDOALCn2M8AAAABMS-vaA', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.patch', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'number': 14974, 'state': 'open', 'locked': False, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'At long last, this PR restores the ability of running games from DVD backups (originally removed on PR #11456) and, for the first time in Dolphin, allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive):\r\n\r\nhttps://github.com/user-attachments/assets/626b3c7e-cd6a-48f0-9962-eaa6b1f0805a\r\n\r\nOn supported OSes (currently Windows and Linux), there\'s a new "Boot From Optical Disc" menu entry on File, and "Change Disc" now opens a popup that lets you change between a disc image or a physical disc or vice-versa:\r\n\r\nhttps://github.com/user-attachments/assets/0af57155-391c-41c8-b78c-bc70a63a7703\r\n\r\nThis implementation is heavily inspired on [redumper](https://github.com/superg/redumper), so Dolphin directly talks to the optical drive via low level SCSI multimedia commands instead of relying on the old approach that was derived from a very outdated version of libcdio.\r\n\r\n### Features and limitations\r\n* Although the UI changes are minimal (for now), I\'ve tried to make this work as intuitively as possible behind the scenes. I think the most noteworthy ones are that optical drives can be hot plugged at any time (if you\'re using USB to SATA adapters or portable drives) and if you boot from a physical disc and then eject it (either via File => Eject Disc or by pressing the Eject button on the drive itself), the disc will be ejected from the emulated console too. If you reinsert a disc later, it\'ll automatically reinsert the disc on the emulated console too (e.g. multi disc games that ask you to insert the next disc)\r\n* I didn\'t initially plan for this, but the `-i` flag from DolphinTool now accepts disc drive paths (e.g. `-i D:` or `-i /dev/sr0`). A side effect of that is you can now rip original discs to ISO, RVZ, GCZ or WIA directly from DolphinTool, if you have an OmniDrive-enabled drive\r\n* Emulated disc speed code is bypassed when using physical discs, as well as "Load Whole Game Into Memory". Beware of speeding up the emulation by setting the speed limit above 100% though, that can cause audio/video issues and even break games if you let them run too fast for too long, since the optical drive can\'t keep up ("An error occurred, please turn the GC/Wii off and refer to the operating manual")\r\n* Loading speeds are a bit slower than what I remember from playing on a real GC/Wii. The handful of games I tried still worked fine, though\r\n* When RetroAchievements are enabled, its hashing can cause a bit of slow loading speeds right after booting a game. It\'s more noticeable with Wii titles\r\n* Currently, [GameCube games that uses DTK Audio](https://wiki.dolphin-emu.org/index.php?title=Category:DTK_Audio_games) are nearly unplayable from physical discs, as the DTK audio path causes constant drive seeking, which consequently reduces the read speeds significantly. I intend to explore a few caching techniques to fix this, but it will be on a separate PR\r\n* Minimal testing was done on Linux, apart from compiling from source on Ubuntu 26.04.1 LTS and ensuring it could boot a game\r\n* Currently there\'s no macOS support, and I won\'t be adding it as I have no access to any Apple hardware. Porting should be easy, though, as all OS-specific code are isolated on `SCSIDevice.cpp/.h`\r\n\r\n### Generative AI disclosure\r\nThe source code from [redumper (b705)](https://github.com/superg/redumper/tree/b705) was fed into a LLM, which was tasked on creating a technical specs document about how it handles standard and raw OmniDrive reads. Then, I\'ve made a Windows-only CLI tool implementing only the absolute minimum required for the features that would be relevant for us, based on that document. DVD descrambling was added next and used this [reference implementation](https://github.com/Deterous/DVD-Scrambler) from Deterous. Once the CLI tool was feature complete, I used a LLM again, this time feeding it parts of the Linux (6.18 LTS) kernel source code, to assist with adding Linux compatibility to it.\r\n\r\nFinally, I started working with the Dolphin\'s source. The code this PR adds is directly derived from the CLI tool, but no LLMs were used beyond that point. I\'m also not touching any emulation code, the changes in DVDInterface reuses existing behavior or are based in code comments that already existed in Dolphin before this PR.\r\n\r\n### Licenses and attribuition\r\nThe bulk of this PR was heavily based on [redumper](https://github.com/superg/redumper), which is licensed under the GPLv3. As mentioned earlier, I also used the [descrambling implementation from Deterous](https://github.com/Deterous/DVD-Scrambler) as a reference, which the repo itself doesn\'t define a license, but directly mentions being made as the reference for redumper, so I think we\'re good? I can try contacting Deterous too for explicit approval, if needed...', 'created_at': '2026-11-02T12:18:18Z', 'updated_at': '2026-11-03T12:01:58Z', 'closed_at': None, 'merged_at': None, 'merge_commit_sha': '920145f16bc85fdc49454f5120cd997373cae04d', 'assignees': [], 'requested_reviewers': [], 'requested_teams': [], 'labels': [], 'milestone': None, 'draft': False, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/commits', 'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/comments', 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/ab0b808663fe623e8e8a52396273ee5a86cf440c', 'head': {'label': 'mbc07:BootFromOpticalDiscRevival', 'ref': 'BootFromOpticalDiscRevival', 'sha': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 38133254, 'node_id': 'MDEwOlJlcG9zaXRvcnkzODEzMzI1NA==', 'name': 'dolphin', 'full_name': 'mbc07/dolphin', 'private': False, 'owner': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/mbc07/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': True, 'url': 'https://api.github.com/repos/mbc07/dolphin', 'forks_url': 'https://api.github.com/repos/mbc07/dolphin/forks', 'keys_url': 'https://api.github.com/repos/mbc07/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/mbc07/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/mbc07/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/mbc07/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/mbc07/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/mbc07/dolphin/events', 'assignees_url': 'https://api.github.com/repos/mbc07/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/mbc07/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/mbc07/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/mbc07/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/mbc07/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/mbc07/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/mbc07/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/mbc07/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/mbc07/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/mbc07/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/mbc07/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/mbc07/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/mbc07/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/mbc07/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/mbc07/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/mbc07/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/mbc07/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/mbc07/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/mbc07/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/mbc07/dolphin/merges', 'archive_url': 'https://api.github.com/repos/mbc07/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/mbc07/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/mbc07/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/mbc07/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/mbc07/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/mbc07/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/mbc07/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/mbc07/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/mbc07/dolphin/deployments', 'created_at': '2015-06-26T20:55:12Z', 'updated_at': '2026-11-02T18:13:33Z', 'pushed_at': '2026-11-02T09:35:30Z', 'git_url': 'git://github.com/mbc07/dolphin.git', 'ssh_url': 'git@github.com:mbc07/dolphin.git', 'clone_url': 'https://github.com/mbc07/dolphin.git', 'svn_url': 'https://github.com/mbc07/dolphin', 'homepage': 'https://dolphin-emu.org/', 'size': 520861, 'stargazers_count': 0, 'watchers_count': 0, 'language': 'C++', 'has_issues': False, 'has_projects': True, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 0, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 0, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': [], 'visibility': 'public', 'forks': 0, 'open_issues': 0, 'watchers': 0, 'default_branch': 'master', 'allow_squash_merge': True, 'allow_merge_commit': True, 'allow_rebase_merge': True, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, 'base': {'label': 'dolphin-emu:master', 'ref': 'master', 'sha': 'd182533d363eae8c753d37cfad4107930da2019a', 'user': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3377, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 479, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3377, 'open_issues': 479, 'watchers': 15758, 'default_branch': 'master', 'allow_squash_merge': False, 'allow_merge_commit': True, 'allow_rebase_merge': False, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14974'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/comments'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/commits'}, 'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/ab0b808663fe623e8e8a52396273ee5a86cf440c'}}, 'author_association': 'MEMBER', 'auto_merge': None, 'assignee': None, 'active_lock_reason': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3377, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 479, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3377, 'open_issues': 479, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'raw_gh_hook'}
2026-11-03T12:21:21.894704 {'source': 'webserver', 'gh_type': 'pull_request_review', 'raw': {'action': 'submitted', 'review': {'id': 5749202729, 'node_id': 'PRR_kwDOALCn2M8AAAABVq3fKQ', 'user': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'Attempting to start a game from "Boot from Optical Disc" with the tray open or no disc inserted causes this:\n\n<img width="417" height="373" alt="Image" src="https://github.com/user-attachments/assets/ef17fec4-17ed-4d46-b88b-a994a859560d" />\n\nI don\'t think this is intended?\n\n```log\n17:24:826 DiscIO/OpticalDiscBlob.cpp:336 E[DIO]: No disc in optical drive /dev/sr0\n17:24:826 Core/Boot/Boot.cpp:332 E[BOOT]: There is no disc in the optical drive "/dev/sr0".\n17:24:826 Core/Boot/Boot.cpp:333 W[MASTER]: Warning: There is no disc in the optical drive "/dev/sr0".\n```', 'commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'state': 'commented', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#pullrequestreview-5749202729', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14974#pullrequestreview-5749202729'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974'}}, 'submitted_at': '2026-11-03T12:21:18Z', 'updated_at': '2026-11-03T12:21:18Z', 'author_association': 'CONTRIBUTOR'}, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'id': 5120175976, 'node_id': 'PR_kwDOALCn2M8AAAABMS-vaA', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.patch', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'number': 14974, 'state': 'open', 'locked': False, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'At long last, this PR restores the ability of running games from DVD backups (originally removed on PR #11456) and, for the first time in Dolphin, allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive):\r\n\r\nhttps://github.com/user-attachments/assets/626b3c7e-cd6a-48f0-9962-eaa6b1f0805a\r\n\r\nOn supported OSes (currently Windows and Linux), there\'s a new "Boot From Optical Disc" menu entry on File, and "Change Disc" now opens a popup that lets you change between a disc image or a physical disc or vice-versa:\r\n\r\nhttps://github.com/user-attachments/assets/0af57155-391c-41c8-b78c-bc70a63a7703\r\n\r\nThis implementation is heavily inspired on [redumper](https://github.com/superg/redumper), so Dolphin directly talks to the optical drive via low level SCSI multimedia commands instead of relying on the old approach that was derived from a very outdated version of libcdio.\r\n\r\n### Features and limitations\r\n* Although the UI changes are minimal (for now), I\'ve tried to make this work as intuitively as possible behind the scenes. I think the most noteworthy ones are that optical drives can be hot plugged at any time (if you\'re using USB to SATA adapters or portable drives) and if you boot from a physical disc and then eject it (either via File => Eject Disc or by pressing the Eject button on the drive itself), the disc will be ejected from the emulated console too. If you reinsert a disc later, it\'ll automatically reinsert the disc on the emulated console too (e.g. multi disc games that ask you to insert the next disc)\r\n* I didn\'t initially plan for this, but the `-i` flag from DolphinTool now accepts disc drive paths (e.g. `-i D:` or `-i /dev/sr0`). A side effect of that is you can now rip original discs to ISO, RVZ, GCZ or WIA directly from DolphinTool, if you have an OmniDrive-enabled drive\r\n* Emulated disc speed code is bypassed when using physical discs, as well as "Load Whole Game Into Memory". Beware of speeding up the emulation by setting the speed limit above 100% though, that can cause audio/video issues and even break games if you let them run too fast for too long, since the optical drive can\'t keep up ("An error occurred, please turn the GC/Wii off and refer to the operating manual")\r\n* Loading speeds are a bit slower than what I remember from playing on a real GC/Wii. The handful of games I tried still worked fine, though\r\n* When RetroAchievements are enabled, its hashing can cause a bit of slow loading speeds right after booting a game. It\'s more noticeable with Wii titles\r\n* Currently, [GameCube games that uses DTK Audio](https://wiki.dolphin-emu.org/index.php?title=Category:DTK_Audio_games) are nearly unplayable from physical discs, as the DTK audio path causes constant drive seeking, which consequently reduces the read speeds significantly. I intend to explore a few caching techniques to fix this, but it will be on a separate PR\r\n* Minimal testing was done on Linux, apart from compiling from source on Ubuntu 26.04.1 LTS and ensuring it could boot a game\r\n* Currently there\'s no macOS support, and I won\'t be adding it as I have no access to any Apple hardware. Porting should be easy, though, as all OS-specific code are isolated on `SCSIDevice.cpp/.h`\r\n\r\n### Generative AI disclosure\r\nThe source code from [redumper (b705)](https://github.com/superg/redumper/tree/b705) was fed into a LLM, which was tasked on creating a technical specs document about how it handles standard and raw OmniDrive reads. Then, I\'ve made a Windows-only CLI tool implementing only the absolute minimum required for the features that would be relevant for us, based on that document. DVD descrambling was added next and used this [reference implementation](https://github.com/Deterous/DVD-Scrambler) from Deterous. Once the CLI tool was feature complete, I used a LLM again, this time feeding it parts of the Linux (6.18 LTS) kernel source code, to assist with adding Linux compatibility to it.\r\n\r\nFinally, I started working with the Dolphin\'s source. The code this PR adds is directly derived from the CLI tool, but no LLMs were used beyond that point. I\'m also not touching any emulation code, the changes in DVDInterface reuses existing behavior or are based in code comments that already existed in Dolphin before this PR.\r\n\r\n### Licenses and attribuition\r\nThe bulk of this PR was heavily based on [redumper](https://github.com/superg/redumper), which is licensed under the GPLv3. As mentioned earlier, I also used the [descrambling implementation from Deterous](https://github.com/Deterous/DVD-Scrambler) as a reference, which the repo itself doesn\'t define a license, but directly mentions being made as the reference for redumper, so I think we\'re good? I can try contacting Deterous too for explicit approval, if needed...', 'created_at': '2026-11-02T12:18:18Z', 'updated_at': '2026-11-03T12:01:58Z', 'closed_at': None, 'merged_at': None, 'merge_commit_sha': '920145f16bc85fdc49454f5120cd997373cae04d', 'assignees': [], 'requested_reviewers': [], 'requested_teams': [], 'labels': [], 'milestone': None, 'draft': False, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/commits', 'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/comments', 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/ab0b808663fe623e8e8a52396273ee5a86cf440c', 'head': {'label': 'mbc07:BootFromOpticalDiscRevival', 'ref': 'BootFromOpticalDiscRevival', 'sha': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 38133254, 'node_id': 'MDEwOlJlcG9zaXRvcnkzODEzMzI1NA==', 'name': 'dolphin', 'full_name': 'mbc07/dolphin', 'private': False, 'owner': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/mbc07/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': True, 'url': 'https://api.github.com/repos/mbc07/dolphin', 'forks_url': 'https://api.github.com/repos/mbc07/dolphin/forks', 'keys_url': 'https://api.github.com/repos/mbc07/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/mbc07/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/mbc07/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/mbc07/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/mbc07/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/mbc07/dolphin/events', 'assignees_url': 'https://api.github.com/repos/mbc07/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/mbc07/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/mbc07/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/mbc07/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/mbc07/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/mbc07/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/mbc07/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/mbc07/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/mbc07/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/mbc07/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/mbc07/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/mbc07/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/mbc07/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/mbc07/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/mbc07/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/mbc07/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/mbc07/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/mbc07/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/mbc07/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/mbc07/dolphin/merges', 'archive_url': 'https://api.github.com/repos/mbc07/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/mbc07/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/mbc07/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/mbc07/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/mbc07/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/mbc07/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/mbc07/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/mbc07/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/mbc07/dolphin/deployments', 'created_at': '2015-06-26T20:55:12Z', 'updated_at': '2026-11-02T18:13:33Z', 'pushed_at': '2026-11-02T09:35:30Z', 'git_url': 'git://github.com/mbc07/dolphin.git', 'ssh_url': 'git@github.com:mbc07/dolphin.git', 'clone_url': 'https://github.com/mbc07/dolphin.git', 'svn_url': 'https://github.com/mbc07/dolphin', 'homepage': 'https://dolphin-emu.org/', 'size': 520861, 'stargazers_count': 0, 'watchers_count': 0, 'language': 'C++', 'has_issues': False, 'has_projects': True, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 0, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 0, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': [], 'visibility': 'public', 'forks': 0, 'open_issues': 0, 'watchers': 0, 'default_branch': 'master', 'allow_squash_merge': True, 'allow_merge_commit': True, 'allow_rebase_merge': True, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, 'base': {'label': 'dolphin-emu:master', 'ref': 'master', 'sha': 'd182533d363eae8c753d37cfad4107930da2019a', 'user': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3377, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 479, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3377, 'open_issues': 479, 'watchers': 15758, 'default_branch': 'master', 'allow_squash_merge': False, 'allow_merge_commit': True, 'allow_rebase_merge': False, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14974'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/comments'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/commits'}, 'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/ab0b808663fe623e8e8a52396273ee5a86cf440c'}}, 'author_association': 'MEMBER', 'auto_merge': None, 'assignee': None, 'active_lock_reason': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3377, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 479, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3377, 'open_issues': 479, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'raw_gh_hook'}
2026-11-03T12:21:21.414785 {'source': 'webserver', 'gh_type': 'pull_request_review', 'raw': {'action': 'edited', 'review': {'id': 5749202729, 'node_id': 'PRR_kwDOALCn2M8AAAABVq3fKQ', 'user': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'Attempting to start a game from "Boot from Optical Disc" with the tray open or no disc inserted causes this:\n\n<img width="417" height="373" alt="Image" src="https://github.com/user-attachments/assets/ef17fec4-17ed-4d46-b88b-a994a859560d" />\n\nI don\'t think this is intended?\n\n```log\n17:24:826 DiscIO/OpticalDiscBlob.cpp:336 E[DIO]: No disc in optical drive /dev/sr0\n17:24:826 Core/Boot/Boot.cpp:332 E[BOOT]: There is no disc in the optical drive "/dev/sr0".\n17:24:826 Core/Boot/Boot.cpp:333 W[MASTER]: Warning: There is no disc in the optical drive "/dev/sr0".\n```', 'commit_id': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'state': 'commented', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#pullrequestreview-5749202729', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14974#pullrequestreview-5749202729'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974'}}, 'submitted_at': '2026-11-03T12:21:18Z', 'updated_at': '2026-11-03T12:21:18Z', 'author_association': 'CONTRIBUTOR'}, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'id': 5120175976, 'node_id': 'PR_kwDOALCn2M8AAAABMS-vaA', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.patch', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'number': 14974, 'state': 'open', 'locked': False, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'At long last, this PR restores the ability of running games from DVD backups (originally removed on PR #11456) and, for the first time in Dolphin, allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive):\r\n\r\nhttps://github.com/user-attachments/assets/626b3c7e-cd6a-48f0-9962-eaa6b1f0805a\r\n\r\nOn supported OSes (currently Windows and Linux), there\'s a new "Boot From Optical Disc" menu entry on File, and "Change Disc" now opens a popup that lets you change between a disc image or a physical disc or vice-versa:\r\n\r\nhttps://github.com/user-attachments/assets/0af57155-391c-41c8-b78c-bc70a63a7703\r\n\r\nThis implementation is heavily inspired on [redumper](https://github.com/superg/redumper), so Dolphin directly talks to the optical drive via low level SCSI multimedia commands instead of relying on the old approach that was derived from a very outdated version of libcdio.\r\n\r\n### Features and limitations\r\n* Although the UI changes are minimal (for now), I\'ve tried to make this work as intuitively as possible behind the scenes. I think the most noteworthy ones are that optical drives can be hot plugged at any time (if you\'re using USB to SATA adapters or portable drives) and if you boot from a physical disc and then eject it (either via File => Eject Disc or by pressing the Eject button on the drive itself), the disc will be ejected from the emulated console too. If you reinsert a disc later, it\'ll automatically reinsert the disc on the emulated console too (e.g. multi disc games that ask you to insert the next disc)\r\n* I didn\'t initially plan for this, but the `-i` flag from DolphinTool now accepts disc drive paths (e.g. `-i D:` or `-i /dev/sr0`). A side effect of that is you can now rip original discs to ISO, RVZ, GCZ or WIA directly from DolphinTool, if you have an OmniDrive-enabled drive\r\n* Emulated disc speed code is bypassed when using physical discs, as well as "Load Whole Game Into Memory". Beware of speeding up the emulation by setting the speed limit above 100% though, that can cause audio/video issues and even break games if you let them run too fast for too long, since the optical drive can\'t keep up ("An error occurred, please turn the GC/Wii off and refer to the operating manual")\r\n* Loading speeds are a bit slower than what I remember from playing on a real GC/Wii. The handful of games I tried still worked fine, though\r\n* When RetroAchievements are enabled, its hashing can cause a bit of slow loading speeds right after booting a game. It\'s more noticeable with Wii titles\r\n* Currently, [GameCube games that uses DTK Audio](https://wiki.dolphin-emu.org/index.php?title=Category:DTK_Audio_games) are nearly unplayable from physical discs, as the DTK audio path causes constant drive seeking, which consequently reduces the read speeds significantly. I intend to explore a few caching techniques to fix this, but it will be on a separate PR\r\n* Minimal testing was done on Linux, apart from compiling from source on Ubuntu 26.04.1 LTS and ensuring it could boot a game\r\n* Currently there\'s no macOS support, and I won\'t be adding it as I have no access to any Apple hardware. Porting should be easy, though, as all OS-specific code are isolated on `SCSIDevice.cpp/.h`\r\n\r\n### Generative AI disclosure\r\nThe source code from [redumper (b705)](https://github.com/superg/redumper/tree/b705) was fed into a LLM, which was tasked on creating a technical specs document about how it handles standard and raw OmniDrive reads. Then, I\'ve made a Windows-only CLI tool implementing only the absolute minimum required for the features that would be relevant for us, based on that document. DVD descrambling was added next and used this [reference implementation](https://github.com/Deterous/DVD-Scrambler) from Deterous. Once the CLI tool was feature complete, I used a LLM again, this time feeding it parts of the Linux (6.18 LTS) kernel source code, to assist with adding Linux compatibility to it.\r\n\r\nFinally, I started working with the Dolphin\'s source. The code this PR adds is directly derived from the CLI tool, but no LLMs were used beyond that point. I\'m also not touching any emulation code, the changes in DVDInterface reuses existing behavior or are based in code comments that already existed in Dolphin before this PR.\r\n\r\n### Licenses and attribuition\r\nThe bulk of this PR was heavily based on [redumper](https://github.com/superg/redumper), which is licensed under the GPLv3. As mentioned earlier, I also used the [descrambling implementation from Deterous](https://github.com/Deterous/DVD-Scrambler) as a reference, which the repo itself doesn\'t define a license, but directly mentions being made as the reference for redumper, so I think we\'re good? I can try contacting Deterous too for explicit approval, if needed...', 'created_at': '2026-11-02T12:18:18Z', 'updated_at': '2026-11-03T12:01:58Z', 'closed_at': None, 'merged_at': None, 'merge_commit_sha': '920145f16bc85fdc49454f5120cd997373cae04d', 'assignees': [], 'requested_reviewers': [], 'requested_teams': [], 'labels': [], 'milestone': None, 'draft': False, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/commits', 'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/comments', 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/ab0b808663fe623e8e8a52396273ee5a86cf440c', 'head': {'label': 'mbc07:BootFromOpticalDiscRevival', 'ref': 'BootFromOpticalDiscRevival', 'sha': 'ab0b808663fe623e8e8a52396273ee5a86cf440c', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 38133254, 'node_id': 'MDEwOlJlcG9zaXRvcnkzODEzMzI1NA==', 'name': 'dolphin', 'full_name': 'mbc07/dolphin', 'private': False, 'owner': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/mbc07/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': True, 'url': 'https://api.github.com/repos/mbc07/dolphin', 'forks_url': 'https://api.github.com/repos/mbc07/dolphin/forks', 'keys_url': 'https://api.github.com/repos/mbc07/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/mbc07/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/mbc07/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/mbc07/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/mbc07/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/mbc07/dolphin/events', 'assignees_url': 'https://api.github.com/repos/mbc07/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/mbc07/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/mbc07/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/mbc07/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/mbc07/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/mbc07/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/mbc07/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/mbc07/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/mbc07/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/mbc07/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/mbc07/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/mbc07/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/mbc07/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/mbc07/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/mbc07/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/mbc07/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/mbc07/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/mbc07/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/mbc07/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/mbc07/dolphin/merges', 'archive_url': 'https://api.github.com/repos/mbc07/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/mbc07/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/mbc07/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/mbc07/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/mbc07/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/mbc07/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/mbc07/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/mbc07/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/mbc07/dolphin/deployments', 'created_at': '2015-06-26T20:55:12Z', 'updated_at': '2026-11-02T18:13:33Z', 'pushed_at': '2026-11-02T09:35:30Z', 'git_url': 'git://github.com/mbc07/dolphin.git', 'ssh_url': 'git@github.com:mbc07/dolphin.git', 'clone_url': 'https://github.com/mbc07/dolphin.git', 'svn_url': 'https://github.com/mbc07/dolphin', 'homepage': 'https://dolphin-emu.org/', 'size': 520861, 'stargazers_count': 0, 'watchers_count': 0, 'language': 'C++', 'has_issues': False, 'has_projects': True, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 0, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 0, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': [], 'visibility': 'public', 'forks': 0, 'open_issues': 0, 'watchers': 0, 'default_branch': 'master', 'allow_squash_merge': True, 'allow_merge_commit': True, 'allow_rebase_merge': True, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, 'base': {'label': 'dolphin-emu:master', 'ref': 'master', 'sha': 'd182533d363eae8c753d37cfad4107930da2019a', 'user': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3377, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 479, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3377, 'open_issues': 479, 'watchers': 15758, 'default_branch': 'master', 'allow_squash_merge': False, 'allow_merge_commit': True, 'allow_rebase_merge': False, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14974'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/comments'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974/commits'}, 'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/ab0b808663fe623e8e8a52396273ee5a86cf440c'}}, 'author_association': 'MEMBER', 'auto_merge': None, 'assignee': None, 'active_lock_reason': None}, 'changes': {}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3377, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 479, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3377, 'open_issues': 479, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'JoshuaVandaele', 'id': 24195176, 'node_id': 'MDQ6VXNlcjI0MTk1MTc2', 'avatar_url': 'https://avatars.githubusercontent.com/u/24195176?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/JoshuaVandaele', 'html_url': 'https://github.com/JoshuaVandaele', 'followers_url': 'https://api.github.com/users/JoshuaVandaele/followers', 'following_url': 'https://api.github.com/users/JoshuaVandaele/following{/other_user}', 'gists_url': 'https://api.github.com/users/JoshuaVandaele/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/JoshuaVandaele/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/JoshuaVandaele/subscriptions', 'organizations_url': 'https://api.github.com/users/JoshuaVandaele/orgs', 'repos_url': 'https://api.github.com/users/JoshuaVandaele/repos', 'events_url': 'https://api.github.com/users/JoshuaVandaele/events{/privacy}', 'received_events_url': 'https://api.github.com/users/JoshuaVandaele/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'raw_gh_hook'}
2026-11-03T11:23:59.207669 {'source': 'webserver', 'gh_type': 'issue_comment', 'raw': {'action': 'created', 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14827', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14827/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14827/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14827/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14827', 'id': 5248387336, 'node_id': 'PR_kwDOALCn2M8AAAABA93Kaw', 'number': 14827, 'title': 'Android: Implement Save File Manager', 'user': {'login': 'Linkinworm', 'id': 32615992, 'node_id': 'MDQ6VXNlcjMyNjE1OTky', 'avatar_url': 'https://avatars.githubusercontent.com/u/32615992?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/Linkinworm', 'html_url': 'https://github.com/Linkinworm', 'followers_url': 'https://api.github.com/users/Linkinworm/followers', 'following_url': 'https://api.github.com/users/Linkinworm/following{/other_user}', 'gists_url': 'https://api.github.com/users/Linkinworm/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/Linkinworm/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/Linkinworm/subscriptions', 'organizations_url': 'https://api.github.com/users/Linkinworm/orgs', 'repos_url': 'https://api.github.com/users/Linkinworm/repos', 'events_url': 'https://api.github.com/users/Linkinworm/events{/privacy}', 'received_events_url': 'https://api.github.com/users/Linkinworm/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 2, 'created_at': '2026-08-25T16:52:00Z', 'updated_at': '2026-11-03T11:23:56Z', 'closed_at': None, 'assignee': None, 'author_association': 'NONE', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14827', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14827', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14827.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14827.patch', 'merged_at': None}, 'body': 'Adds a save file manager allowing users to manage GameCube, Wii, and GBA save files.\r\n\r\nSince gameTDB doesnt have GB/GBA covers I just use colour coding for blocks of saves, this is easier on the eyes than a list of saves\r\n\r\nIncludes everything for importing exporting etc, suports GC GCI folders and .raw for moving saves around, wii saves at least need 1st run. The GBA save manager has some unique features for the GBA implimentation so the user can play on the gameboy player and then move their save easily for linking (pokemon colosium/XD, Sonic advance, what ever other games)\r\n\r\nThe main use for this was originally just for the GBA game saves for the purpose above, but expanded for GC and wii since theres no real easy way to manage save data for those\r\n<img width="720" height="1120" alt="gbasave" src="https://github.com/user-attachments/assets/c39c3736-e3a3-4212-8b94-c08ca0874bc5" />\r\n<img width="720" height="1120" alt="gc" src="https://github.com/user-attachments/assets/7d0ba656-79b8-4c0f-aa6b-ab0cf96c4203" />\r\n<img width="720" height="1120" alt="wii" src="https://github.com/user-attachments/assets/88d23546-fdb3-4bca-87f7-ec48ddbe64f0" />\r\n', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14827/reactions', 'total_count': 2, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 2, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14827/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6602531884', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14827#issuecomment-6602531884', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14827', 'id': 6602531884, 'node_id': 'IC_kwDOALCn2M8AAAABiYqkLA', 'user': {'login': 'Linkinworm', 'id': 32615992, 'node_id': 'MDQ6VXNlcjMyNjE1OTky', 'avatar_url': 'https://avatars.githubusercontent.com/u/32615992?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/Linkinworm', 'html_url': 'https://github.com/Linkinworm', 'followers_url': 'https://api.github.com/users/Linkinworm/followers', 'following_url': 'https://api.github.com/users/Linkinworm/following{/other_user}', 'gists_url': 'https://api.github.com/users/Linkinworm/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/Linkinworm/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/Linkinworm/subscriptions', 'organizations_url': 'https://api.github.com/users/Linkinworm/orgs', 'repos_url': 'https://api.github.com/users/Linkinworm/repos', 'events_url': 'https://api.github.com/users/Linkinworm/events{/privacy}', 'received_events_url': 'https://api.github.com/users/Linkinworm/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T11:23:56Z', 'updated_at': '2026-11-03T11:23:56Z', 'body': 'Quick note , import fails should give a more discript reasonings , after some tests I\'ve realised that "import failed" for something like not starting the game first boot isn\'t great, so custom reasoning toasts would help users', 'author_association': 'MEMBER', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6602531884/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3377, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 479, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3377, 'open_issues': 479, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'Linkinworm', 'id': 32615992, 'node_id': 'MDQ6VXNlcjMyNjE1OTky', 'avatar_url': 'https://avatars.githubusercontent.com/u/32615992?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/Linkinworm', 'html_url': 'https://github.com/Linkinworm', 'followers_url': 'https://api.github.com/users/Linkinworm/followers', 'following_url': 'https://api.github.com/users/Linkinworm/following{/other_user}', 'gists_url': 'https://api.github.com/users/Linkinworm/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/Linkinworm/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/Linkinworm/subscriptions', 'organizations_url': 'https://api.github.com/users/Linkinworm/orgs', 'repos_url': 'https://api.github.com/users/Linkinworm/repos', 'events_url': 'https://api.github.com/users/Linkinworm/events{/privacy}', 'received_events_url': 'https://api.github.com/users/Linkinworm/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'raw_gh_hook'}
2026-11-03T11:08:40.291263 {'source': 'webserver', 'gh_type': 'pull_request', 'raw': {'action': 'edited', 'number': 14977, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14977', 'id': 5136078289, 'node_id': 'PR_kwDOALCn2M8AAAABMiJV0Q', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14977', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14977.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14977.patch', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14977', 'number': 14977, 'state': 'open', 'locked': False, 'title': 'Common/Logging: Eliminate fstream and mutex in FileLogListener with new LogIOFile class.', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': "`LogIOFile` leverages the existing `DirectIOFile` to provide a thread-safe `Write` function that appends to the file.\r\n\r\nI've added unit tests.\r\n\r\n`LogIOFile` is probably a silly name since it doesn't do any Input.\r\nWhat's a better name? `AppendingFileWriter` ?", 'created_at': '2026-11-03T11:01:38Z', 'updated_at': '2026-11-03T11:08:36Z', 'closed_at': None, 'merged_at': None, 'merge_commit_sha': '83aa061560cb9527b67bcd2923d1270eb7d5fec9', 'assignees': [], 'requested_reviewers': [], 'requested_teams': [], 'labels': [], 'milestone': None, 'draft': False, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14977/commits', 'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14977/comments', 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14977/comments', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/d2c0bddaf1035e483965c73724f549814ba7b374', 'head': {'label': 'jordan-woyak:log-file-no-mutex', 'ref': 'log-file-no-mutex', 'sha': 'd2c0bddaf1035e483965c73724f549814ba7b374', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 16818408, 'node_id': 'MDEwOlJlcG9zaXRvcnkxNjgxODQwOA==', 'name': 'dolphin', 'full_name': 'jordan-woyak/dolphin', 'private': False, 'owner': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/jordan-woyak/dolphin', 'description': 'Dolphin is a GameCube/Wii emulator, allowing you to play games for these two platforms on PC, with improvements.', 'fork': True, 'url': 'https://api.github.com/repos/jordan-woyak/dolphin', 'forks_url': 'https://api.github.com/repos/jordan-woyak/dolphin/forks', 'keys_url': 'https://api.github.com/repos/jordan-woyak/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/jordan-woyak/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/jordan-woyak/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/jordan-woyak/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/jordan-woyak/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/jordan-woyak/dolphin/events', 'assignees_url': 'https://api.github.com/repos/jordan-woyak/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/jordan-woyak/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/jordan-woyak/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/jordan-woyak/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/jordan-woyak/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/jordan-woyak/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/jordan-woyak/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/jordan-woyak/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/jordan-woyak/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/jordan-woyak/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/jordan-woyak/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/jordan-woyak/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/jordan-woyak/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/jordan-woyak/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/jordan-woyak/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/jordan-woyak/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/jordan-woyak/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/jordan-woyak/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/jordan-woyak/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/jordan-woyak/dolphin/merges', 'archive_url': 'https://api.github.com/repos/jordan-woyak/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/jordan-woyak/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/jordan-woyak/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/jordan-woyak/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/jordan-woyak/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/jordan-woyak/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/jordan-woyak/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/jordan-woyak/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/jordan-woyak/dolphin/deployments', 'created_at': '2014-02-13T21:50:38Z', 'updated_at': '2026-06-27T21:22:47Z', 'pushed_at': '2026-11-03T11:00:21Z', 'git_url': 'git://github.com/jordan-woyak/dolphin.git', 'ssh_url': 'git@github.com:jordan-woyak/dolphin.git', 'clone_url': 'https://github.com/jordan-woyak/dolphin.git', 'svn_url': 'https://github.com/jordan-woyak/dolphin', 'homepage': None, 'size': 530497, 'stargazers_count': 5, 'watchers_count': 5, 'language': 'C++', 'has_issues': False, 'has_projects': True, 'has_downloads': False, 'has_wiki': False, 'has_pages': False, 'has_discussions': False, 'forks_count': 5, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 2, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': [], 'visibility': 'public', 'forks': 5, 'open_issues': 2, 'watchers': 5, 'default_branch': 'master', 'allow_squash_merge': True, 'allow_merge_commit': True, 'allow_rebase_merge': True, 'allow_auto_merge': False, 'delete_branch_on_merge': True, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, 'base': {'label': 'dolphin-emu:master', 'ref': 'master', 'sha': 'df4bd441dec5d6f3cff606eea76f183963e97a44', 'user': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3377, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 479, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3377, 'open_issues': 479, 'watchers': 15758, 'default_branch': 'master', 'allow_squash_merge': False, 'allow_merge_commit': True, 'allow_rebase_merge': False, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14977'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14977'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14977'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14977/comments'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14977/comments'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14977/commits'}, 'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/d2c0bddaf1035e483965c73724f549814ba7b374'}}, 'author_association': 'MEMBER', 'auto_merge': None, 'assignee': None, 'active_lock_reason': None, 'merged': False, 'mergeable': True, 'rebaseable': False, 'mergeable_state': 'unstable', 'merged_by': None, 'comments': 0, 'review_comments': 0, 'maintainer_can_modify': True, 'commits': 2, 'additions': 122, 'deletions': 17, 'changed_files': 4}, 'changes': {'body': {'from': "`LogIOFile` leverages the existing `DirectIOFile` to provide a thread-safe `Write` function that appends to the file.\n\nI've added unit tests."}}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3377, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 479, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3377, 'open_issues': 479, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'raw_gh_hook'}
2026-11-03T11:01:41.729141 {'source': 'webserver', 'gh_type': 'pull_request', 'raw': {'action': 'opened', 'number': 14977, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14977', 'id': 5136078289, 'node_id': 'PR_kwDOALCn2M8AAAABMiJV0Q', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14977', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14977.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14977.patch', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14977', 'number': 14977, 'state': 'open', 'locked': False, 'title': 'Common/Logging: Eliminate fstream and mutex in FileLogListener with new LogIOFile class.', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': "`LogIOFile` leverages the existing `DirectIOFile` to provide a thread-safe `Write` function that appends to the file.\n\nI've added unit tests.", 'created_at': '2026-11-03T11:01:38Z', 'updated_at': '2026-11-03T11:01:38Z', 'closed_at': None, 'merged_at': None, 'merge_commit_sha': None, 'assignees': [], 'requested_reviewers': [], 'requested_teams': [], 'labels': [], 'milestone': None, 'draft': False, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14977/commits', 'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14977/comments', 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14977/comments', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/d2c0bddaf1035e483965c73724f549814ba7b374', 'head': {'label': 'jordan-woyak:log-file-no-mutex', 'ref': 'log-file-no-mutex', 'sha': 'd2c0bddaf1035e483965c73724f549814ba7b374', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 16818408, 'node_id': 'MDEwOlJlcG9zaXRvcnkxNjgxODQwOA==', 'name': 'dolphin', 'full_name': 'jordan-woyak/dolphin', 'private': False, 'owner': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/jordan-woyak/dolphin', 'description': 'Dolphin is a GameCube/Wii emulator, allowing you to play games for these two platforms on PC, with improvements.', 'fork': True, 'url': 'https://api.github.com/repos/jordan-woyak/dolphin', 'forks_url': 'https://api.github.com/repos/jordan-woyak/dolphin/forks', 'keys_url': 'https://api.github.com/repos/jordan-woyak/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/jordan-woyak/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/jordan-woyak/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/jordan-woyak/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/jordan-woyak/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/jordan-woyak/dolphin/events', 'assignees_url': 'https://api.github.com/repos/jordan-woyak/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/jordan-woyak/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/jordan-woyak/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/jordan-woyak/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/jordan-woyak/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/jordan-woyak/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/jordan-woyak/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/jordan-woyak/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/jordan-woyak/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/jordan-woyak/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/jordan-woyak/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/jordan-woyak/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/jordan-woyak/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/jordan-woyak/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/jordan-woyak/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/jordan-woyak/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/jordan-woyak/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/jordan-woyak/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/jordan-woyak/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/jordan-woyak/dolphin/merges', 'archive_url': 'https://api.github.com/repos/jordan-woyak/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/jordan-woyak/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/jordan-woyak/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/jordan-woyak/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/jordan-woyak/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/jordan-woyak/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/jordan-woyak/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/jordan-woyak/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/jordan-woyak/dolphin/deployments', 'created_at': '2014-02-13T21:50:38Z', 'updated_at': '2026-06-27T21:22:47Z', 'pushed_at': '2026-11-03T11:00:21Z', 'git_url': 'git://github.com/jordan-woyak/dolphin.git', 'ssh_url': 'git@github.com:jordan-woyak/dolphin.git', 'clone_url': 'https://github.com/jordan-woyak/dolphin.git', 'svn_url': 'https://github.com/jordan-woyak/dolphin', 'homepage': None, 'size': 530494, 'stargazers_count': 5, 'watchers_count': 5, 'language': 'C++', 'has_issues': False, 'has_projects': True, 'has_downloads': False, 'has_wiki': False, 'has_pages': False, 'has_discussions': False, 'forks_count': 5, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 2, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': [], 'visibility': 'public', 'forks': 5, 'open_issues': 2, 'watchers': 5, 'default_branch': 'master', 'allow_squash_merge': True, 'allow_merge_commit': True, 'allow_rebase_merge': True, 'allow_auto_merge': False, 'delete_branch_on_merge': True, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, 'base': {'label': 'dolphin-emu:master', 'ref': 'master', 'sha': 'df4bd441dec5d6f3cff606eea76f183963e97a44', 'user': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3377, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 479, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3377, 'open_issues': 479, 'watchers': 15758, 'default_branch': 'master', 'allow_squash_merge': False, 'allow_merge_commit': True, 'allow_rebase_merge': False, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14977'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/14977'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14977'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14977/comments'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14977/comments'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14977/commits'}, 'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/d2c0bddaf1035e483965c73724f549814ba7b374'}}, 'author_association': 'MEMBER', 'auto_merge': None, 'assignee': None, 'active_lock_reason': None, 'merged': False, 'mergeable': None, 'rebaseable': None, 'mergeable_state': 'unknown', 'merged_by': None, 'comments': 0, 'review_comments': 0, 'maintainer_can_modify': True, 'commits': 2, 'additions': 122, 'deletions': 17, 'changed_files': 4}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3377, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 479, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3377, 'open_issues': 479, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'raw_gh_hook'}
2026-11-03T10:14:35.778984 {'source': 'webserver', 'gh_type': 'issue_comment', 'raw': {'action': 'created', 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'id': 6162397505, 'node_id': 'PR_kwDOALCn2M8AAAABMS-vaA', 'number': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 15, 'created_at': '2026-11-02T12:18:18Z', 'updated_at': '2026-11-03T10:14:33Z', 'closed_at': None, 'assignee': None, 'author_association': 'MEMBER', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.patch', 'merged_at': None}, 'body': 'At long last, this PR restores the ability of running games from DVD backups (originally removed on PR #11456) and, for the first time in Dolphin, allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive):\r\n\r\nhttps://github.com/user-attachments/assets/626b3c7e-cd6a-48f0-9962-eaa6b1f0805a\r\n\r\nOn supported OSes (currently Windows and Linux), there\'s a new "Boot From Optical Disc" menu entry on File, and "Change Disc" now opens a popup that lets you change between a disc image or a physical disc or vice-versa:\r\n\r\nhttps://github.com/user-attachments/assets/0af57155-391c-41c8-b78c-bc70a63a7703\r\n\r\nThis implementation is heavily inspired on [redumper](https://github.com/superg/redumper), so Dolphin directly talks to the optical drive via low level SCSI multimedia commands instead of relying on the old approach that was derived from a very outdated version of libcdio.\r\n\r\n### Features and limitations\r\n* Although the UI changes are minimal (for now), I\'ve tried to make this work as intuitively as possible behind the scenes. I think the most noteworthy ones are that optical drives can be hot plugged at any time (if you\'re using USB to SATA adapters or portable drives) and if you boot from a physical disc and then eject it (either via File => Eject Disc or by pressing the Eject button on the drive itself), the disc will be ejected from the emulated console too. If you reinsert a disc later, it\'ll automatically reinsert the disc on the emulated console too (e.g. multi disc games that ask you to insert the next disc)\r\n* I didn\'t initially plan for this, but the `-i` flag from DolphinTool now accepts disc drive paths (e.g. `-i D:` or `-i /dev/sr0`). A side effect of that is you can now rip original discs to ISO, RVZ, GCZ or WIA directly from DolphinTool, if you have an OmniDrive-enabled drive\r\n* Emulated disc speed code is bypassed when using physical discs, as well as "Load Whole Game Into Memory". Beware of speeding up the emulation by setting the speed limit above 100% though, that can cause audio/video issues and even break games if you let them run too fast for too long, since the optical drive can\'t keep up ("An error occurred, please turn the GC/Wii off and refer to the operating manual")\r\n* Loading speeds are a bit slower than what I remember from playing on a real GC/Wii. The handful of games I tried still worked fine, though\r\n* When RetroAchievements are enabled, its hashing can cause a bit of slow loading speeds right after booting a game. It\'s more noticeable with Wii titles\r\n* Currently, [GameCube games that uses DTK Audio](https://wiki.dolphin-emu.org/index.php?title=Category:DTK_Audio_games) are nearly unplayable from physical discs, as the DTK audio path causes constant drive seeking, which consequently reduces the read speeds significantly. I intend to explore a few caching techniques to fix this, but it will be on a separate PR\r\n* Minimal testing was done on Linux, apart from compiling from source on Ubuntu 26.04.1 LTS and ensuring it could boot a game\r\n* Currently there\'s no macOS support, and I won\'t be adding it as I have no access to any Apple hardware. Porting should be easy, though, as all OS-specific code are isolated on `SCSIDevice.cpp/.h`\r\n\r\n### Generative AI disclosure\r\nThe source code from [redumper (b705)](https://github.com/superg/redumper/tree/b705) was fed into a LLM, which was tasked on creating a technical specs document about how it handles standard and raw OmniDrive reads. Then, I\'ve made a Windows-only CLI tool implementing only the absolute minimum required for the features that would be relevant for us, based on that document. DVD descrambling was added next and used this [reference implementation](https://github.com/Deterous/DVD-Scrambler) from Deterous. Once the CLI tool was feature complete, I used a LLM again, this time feeding it parts of the Linux (6.18 LTS) kernel source code, to assist with adding Linux compatibility to it.\r\n\r\nFinally, I started working with the Dolphin\'s source. The code this PR adds is directly derived from the CLI tool, but no LLMs were used beyond that point. I\'m also not touching any emulation code, the changes in DVDInterface reuses existing behavior or are based in code comments that already existed in Dolphin before this PR.\r\n\r\n### Licenses and attribuition\r\nThe bulk of this PR was heavily based on [redumper](https://github.com/superg/redumper), which is licensed under the GPLv3. As mentioned earlier, I also used the [descrambling implementation from Deterous](https://github.com/Deterous/DVD-Scrambler) as a reference, which the repo itself doesn\'t define a license, but directly mentions being made as the reference for redumper, so I think we\'re good? I can try contacting Deterous too for explicit approval, if needed...', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/reactions', 'total_count': 6, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 6, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6600903825', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6600903825', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'id': 6600903825, 'node_id': 'IC_kwDOALCn2M8AAAABiXHMkQ', 'user': {'login': 'MayImilae', 'id': 6551020, 'node_id': 'MDQ6VXNlcjY1NTEwMjA=', 'avatar_url': 'https://avatars.githubusercontent.com/u/6551020?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/MayImilae', 'html_url': 'https://github.com/MayImilae', 'followers_url': 'https://api.github.com/users/MayImilae/followers', 'following_url': 'https://api.github.com/users/MayImilae/following{/other_user}', 'gists_url': 'https://api.github.com/users/MayImilae/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/MayImilae/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/MayImilae/subscriptions', 'organizations_url': 'https://api.github.com/users/MayImilae/orgs', 'repos_url': 'https://api.github.com/users/MayImilae/repos', 'events_url': 'https://api.github.com/users/MayImilae/events{/privacy}', 'received_events_url': 'https://api.github.com/users/MayImilae/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T10:14:33Z', 'updated_at': '2026-11-03T10:14:33Z', 'body': '> I think it\'s unlikely to cause too many people to try to stick an original GC/Wii game in their standard optical drive, mainly because so few people even have an optical drive these days.\r\n\r\nYea I guess that\'s a good point. We can make adjustments if people start asking about it.\r\n\r\n> An early iteration used the full term inside the tag (like "[OmniDrive]") but the menu became too wide IMO, but this can be reverted or further tweaked, if you think it\'d be more intuitive.\r\n\r\nHonestly I kind of like it saying OmniDrive as a tag and I don\'t think the length is an issue. But I suppose users will have had to already flashed their firmware to OmniDrive and they\'ll have an idea what OD means when they see it.', 'author_association': 'MEMBER', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6600903825/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3377, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 478, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3377, 'open_issues': 478, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'MayImilae', 'id': 6551020, 'node_id': 'MDQ6VXNlcjY1NTEwMjA=', 'avatar_url': 'https://avatars.githubusercontent.com/u/6551020?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/MayImilae', 'html_url': 'https://github.com/MayImilae', 'followers_url': 'https://api.github.com/users/MayImilae/followers', 'following_url': 'https://api.github.com/users/MayImilae/following{/other_user}', 'gists_url': 'https://api.github.com/users/MayImilae/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/MayImilae/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/MayImilae/subscriptions', 'organizations_url': 'https://api.github.com/users/MayImilae/orgs', 'repos_url': 'https://api.github.com/users/MayImilae/repos', 'events_url': 'https://api.github.com/users/MayImilae/events{/privacy}', 'received_events_url': 'https://api.github.com/users/MayImilae/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'raw_gh_hook'}
2026-11-03T09:32:36.231555 {'source': 'webserver', 'gh_type': 'issue_comment', 'raw': {'action': 'created', 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13653', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13653/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13653/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13653/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/13653', 'id': 3055146256, 'node_id': 'PR_kwDOALCn2M6VvgId', 'number': 13653, 'title': 'UICommon/GameFile: File name column will show the directory name for extracted games', 'user': {'login': 'tygyh', 'id': 32486062, 'node_id': 'MDQ6VXNlcjMyNDg2MDYy', 'avatar_url': 'https://avatars.githubusercontent.com/u/32486062?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/tygyh', 'html_url': 'https://github.com/tygyh', 'followers_url': 'https://api.github.com/users/tygyh/followers', 'following_url': 'https://api.github.com/users/tygyh/following{/other_user}', 'gists_url': 'https://api.github.com/users/tygyh/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/tygyh/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/tygyh/subscriptions', 'organizations_url': 'https://api.github.com/users/tygyh/orgs', 'repos_url': 'https://api.github.com/users/tygyh/repos', 'events_url': 'https://api.github.com/users/tygyh/events{/privacy}', 'received_events_url': 'https://api.github.com/users/tygyh/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 7, 'created_at': '2025-05-11T18:37:32Z', 'updated_at': '2026-11-03T09:32:33Z', 'closed_at': None, 'assignee': None, 'author_association': 'CONTRIBUTOR', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/13653', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/13653', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/13653.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/13653.patch', 'merged_at': None}, 'body': 'Rebases #8798', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13653/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13653/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6600080894', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/13653#issuecomment-6600080894', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13653', 'id': 6600080894, 'node_id': 'IC_kwDOALCn2M8AAAABiWU9_g', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T09:32:33Z', 'updated_at': '2026-11-03T09:32:33Z', 'body': 'This PR has aged a bit. Can you please rebase it on latest master. There have since been some minor changes to these files.', 'author_association': 'MEMBER', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6600080894/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3376, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 478, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3376, 'open_issues': 478, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'raw_gh_hook'}
2026-11-03T09:31:33.568823 {'source': 'webserver', 'gh_type': 'pull_request_review', 'raw': {'action': 'dismissed', 'review': {'id': 2838078461, 'node_id': 'PRR_kwDOALCn2M6pKaP9', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': None, 'commit_id': '8d55bc143bd9fcb95cecc73587db25b66600fbd3', 'state': 'dismissed', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/13653#pullrequestreview-2838078461', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/13653', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/13653#pullrequestreview-2838078461'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/13653'}}, 'submitted_at': '2025-05-13T20:45:27Z', 'updated_at': '2026-11-03T09:31:31Z', 'author_association': 'MEMBER'}, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/13653', 'id': 2512257565, 'node_id': 'PR_kwDOALCn2M6VvgId', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/13653', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/13653.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/13653.patch', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13653', 'number': 13653, 'state': 'open', 'locked': False, 'title': 'UICommon/GameFile: File name column will show the directory name for extracted games', 'user': {'login': 'tygyh', 'id': 32486062, 'node_id': 'MDQ6VXNlcjMyNDg2MDYy', 'avatar_url': 'https://avatars.githubusercontent.com/u/32486062?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/tygyh', 'html_url': 'https://github.com/tygyh', 'followers_url': 'https://api.github.com/users/tygyh/followers', 'following_url': 'https://api.github.com/users/tygyh/following{/other_user}', 'gists_url': 'https://api.github.com/users/tygyh/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/tygyh/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/tygyh/subscriptions', 'organizations_url': 'https://api.github.com/users/tygyh/orgs', 'repos_url': 'https://api.github.com/users/tygyh/repos', 'events_url': 'https://api.github.com/users/tygyh/events{/privacy}', 'received_events_url': 'https://api.github.com/users/tygyh/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'body': 'Rebases #8798', 'created_at': '2025-05-11T18:37:32Z', 'updated_at': '2025-05-31T20:49:22Z', 'closed_at': None, 'merged_at': None, 'merge_commit_sha': '63fe506cd5dc6d2e7f6a4da4eb1d88173c3d1157', 'assignees': [], 'requested_reviewers': [{'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}], 'requested_teams': [], 'labels': [], 'milestone': None, 'draft': False, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/13653/commits', 'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/13653/comments', 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13653/comments', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/b9d2a433bf316d2f471d5d88674f9333411cdc08', 'head': {'label': 'tygyh:issue-#10567', 'ref': 'issue-#10567', 'sha': 'b9d2a433bf316d2f471d5d88674f9333411cdc08', 'user': {'login': 'tygyh', 'id': 32486062, 'node_id': 'MDQ6VXNlcjMyNDg2MDYy', 'avatar_url': 'https://avatars.githubusercontent.com/u/32486062?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/tygyh', 'html_url': 'https://github.com/tygyh', 'followers_url': 'https://api.github.com/users/tygyh/followers', 'following_url': 'https://api.github.com/users/tygyh/following{/other_user}', 'gists_url': 'https://api.github.com/users/tygyh/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/tygyh/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/tygyh/subscriptions', 'organizations_url': 'https://api.github.com/users/tygyh/orgs', 'repos_url': 'https://api.github.com/users/tygyh/repos', 'events_url': 'https://api.github.com/users/tygyh/events{/privacy}', 'received_events_url': 'https://api.github.com/users/tygyh/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 829372497, 'node_id': 'R_kgDOMW84UQ', 'name': 'dolphin', 'full_name': 'tygyh/dolphin', 'private': False, 'owner': {'login': 'tygyh', 'id': 32486062, 'node_id': 'MDQ6VXNlcjMyNDg2MDYy', 'avatar_url': 'https://avatars.githubusercontent.com/u/32486062?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/tygyh', 'html_url': 'https://github.com/tygyh', 'followers_url': 'https://api.github.com/users/tygyh/followers', 'following_url': 'https://api.github.com/users/tygyh/following{/other_user}', 'gists_url': 'https://api.github.com/users/tygyh/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/tygyh/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/tygyh/subscriptions', 'organizations_url': 'https://api.github.com/users/tygyh/orgs', 'repos_url': 'https://api.github.com/users/tygyh/repos', 'events_url': 'https://api.github.com/users/tygyh/events{/privacy}', 'received_events_url': 'https://api.github.com/users/tygyh/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/tygyh/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': True, 'url': 'https://api.github.com/repos/tygyh/dolphin', 'forks_url': 'https://api.github.com/repos/tygyh/dolphin/forks', 'keys_url': 'https://api.github.com/repos/tygyh/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/tygyh/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/tygyh/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/tygyh/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/tygyh/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/tygyh/dolphin/events', 'assignees_url': 'https://api.github.com/repos/tygyh/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/tygyh/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/tygyh/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/tygyh/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/tygyh/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/tygyh/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/tygyh/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/tygyh/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/tygyh/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/tygyh/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/tygyh/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/tygyh/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/tygyh/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/tygyh/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/tygyh/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/tygyh/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/tygyh/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/tygyh/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/tygyh/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/tygyh/dolphin/merges', 'archive_url': 'https://api.github.com/repos/tygyh/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/tygyh/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/tygyh/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/tygyh/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/tygyh/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/tygyh/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/tygyh/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/tygyh/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/tygyh/dolphin/deployments', 'created_at': '2024-07-16T09:47:58Z', 'updated_at': '2026-10-26T14:30:46Z', 'pushed_at': '2026-10-27T14:46:06Z', 'git_url': 'git://github.com/tygyh/dolphin.git', 'ssh_url': 'git@github.com:tygyh/dolphin.git', 'clone_url': 'https://github.com/tygyh/dolphin.git', 'svn_url': 'https://github.com/tygyh/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 522371, 'stargazers_count': 0, 'watchers_count': 0, 'language': 'C++', 'has_issues': False, 'has_projects': True, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 0, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 0, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': [], 'visibility': 'public', 'forks': 0, 'open_issues': 0, 'watchers': 0, 'default_branch': 'master', 'allow_squash_merge': True, 'allow_merge_commit': True, 'allow_rebase_merge': True, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, 'base': {'label': 'dolphin-emu:master', 'ref': 'master', 'sha': '53b54406bd546b507822a3bd30311aa0cd96ee71', 'user': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'repo': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3376, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 478, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3376, 'open_issues': 478, 'watchers': 15758, 'default_branch': 'master', 'allow_squash_merge': False, 'allow_merge_commit': True, 'allow_rebase_merge': False, 'allow_auto_merge': False, 'delete_branch_on_merge': False, 'allow_update_branch': False, 'use_squash_pr_title_as_default': False, 'squash_merge_commit_message': 'COMMIT_MESSAGES', 'squash_merge_commit_title': 'COMMIT_OR_PR_TITLE', 'merge_commit_message': 'PR_TITLE', 'merge_commit_title': 'MERGE_MESSAGE'}}, '_links': {'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/13653'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/13653'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13653'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/13653/comments'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/13653/comments'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/13653/commits'}, 'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/b9d2a433bf316d2f471d5d88674f9333411cdc08'}}, 'author_association': 'CONTRIBUTOR', 'auto_merge': None, 'assignee': None, 'active_lock_reason': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3376, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 478, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3376, 'open_issues': 478, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'raw_gh_hook'}
2026-11-03T09:05:23.489306 {'source': 'webserver', 'gh_type': 'issue_comment', 'raw': {'action': 'edited', 'changes': {'body': {'from': 'I mostly agree that the current wording is unlikely to cause too many people to try to stick an original GC/Wii game in their standard optical drive, mainly because so few people even have an optical drive these days.\r\n\r\ni.e. I think "Boot From Optical Disc" is fine.'}}, 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'id': 6162397505, 'node_id': 'PR_kwDOALCn2M8AAAABMS-vaA', 'number': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 14, 'created_at': '2026-11-02T12:18:18Z', 'updated_at': '2026-11-03T09:04:44Z', 'closed_at': None, 'assignee': None, 'author_association': 'MEMBER', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.patch', 'merged_at': None}, 'body': 'At long last, this PR restores the ability of running games from DVD backups (originally removed on PR #11456) and, for the first time in Dolphin, allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive):\r\n\r\nhttps://github.com/user-attachments/assets/626b3c7e-cd6a-48f0-9962-eaa6b1f0805a\r\n\r\nOn supported OSes (currently Windows and Linux), there\'s a new "Boot From Optical Disc" menu entry on File, and "Change Disc" now opens a popup that lets you change between a disc image or a physical disc or vice-versa:\r\n\r\nhttps://github.com/user-attachments/assets/0af57155-391c-41c8-b78c-bc70a63a7703\r\n\r\nThis implementation is heavily inspired on [redumper](https://github.com/superg/redumper), so Dolphin directly talks to the optical drive via low level SCSI multimedia commands instead of relying on the old approach that was derived from a very outdated version of libcdio.\r\n\r\n### Features and limitations\r\n* Although the UI changes are minimal (for now), I\'ve tried to make this work as intuitively as possible behind the scenes. I think the most noteworthy ones are that optical drives can be hot plugged at any time (if you\'re using USB to SATA adapters or portable drives) and if you boot from a physical disc and then eject it (either via File => Eject Disc or by pressing the Eject button on the drive itself), the disc will be ejected from the emulated console too. If you reinsert a disc later, it\'ll automatically reinsert the disc on the emulated console too (e.g. multi disc games that ask you to insert the next disc)\r\n* I didn\'t initially plan for this, but the `-i` flag from DolphinTool now accepts disc drive paths (e.g. `-i D:` or `-i /dev/sr0`). A side effect of that is you can now rip original discs to ISO, RVZ, GCZ or WIA directly from DolphinTool, if you have an OmniDrive-enabled drive\r\n* Emulated disc speed code is bypassed when using physical discs, as well as "Load Whole Game Into Memory". Beware of speeding up the emulation by setting the speed limit above 100% though, that can cause audio/video issues and even break games if you let them run too fast for too long, since the optical drive can\'t keep up ("An error occurred, please turn the GC/Wii off and refer to the operating manual")\r\n* Loading speeds are a bit slower than what I remember from playing on a real GC/Wii. The handful of games I tried still worked fine, though\r\n* When RetroAchievements are enabled, its hashing can cause a bit of slow loading speeds right after booting a game. It\'s more noticeable with Wii titles\r\n* Currently, [GameCube games that uses DTK Audio](https://wiki.dolphin-emu.org/index.php?title=Category:DTK_Audio_games) are nearly unplayable from physical discs, as the DTK audio path causes constant drive seeking, which consequently reduces the read speeds significantly. I intend to explore a few caching techniques to fix this, but it will be on a separate PR\r\n* Minimal testing was done on Linux, apart from compiling from source on Ubuntu 26.04.1 LTS and ensuring it could boot a game\r\n* Currently there\'s no macOS support, and I won\'t be adding it as I have no access to any Apple hardware. Porting should be easy, though, as all OS-specific code are isolated on `SCSIDevice.cpp/.h`\r\n\r\n### Generative AI disclosure\r\nThe source code from [redumper (b705)](https://github.com/superg/redumper/tree/b705) was fed into a LLM, which was tasked on creating a technical specs document about how it handles standard and raw OmniDrive reads. Then, I\'ve made a Windows-only CLI tool implementing only the absolute minimum required for the features that would be relevant for us, based on that document. DVD descrambling was added next and used this [reference implementation](https://github.com/Deterous/DVD-Scrambler) from Deterous. Once the CLI tool was feature complete, I used a LLM again, this time feeding it parts of the Linux (6.18 LTS) kernel source code, to assist with adding Linux compatibility to it.\r\n\r\nFinally, I started working with the Dolphin\'s source. The code this PR adds is directly derived from the CLI tool, but no LLMs were used beyond that point. I\'m also not touching any emulation code, the changes in DVDInterface reuses existing behavior or are based in code comments that already existed in Dolphin before this PR.\r\n\r\n### Licenses and attribuition\r\nThe bulk of this PR was heavily based on [redumper](https://github.com/superg/redumper), which is licensed under the GPLv3. As mentioned earlier, I also used the [descrambling implementation from Deterous](https://github.com/Deterous/DVD-Scrambler) as a reference, which the repo itself doesn\'t define a license, but directly mentions being made as the reference for redumper, so I think we\'re good? I can try contacting Deterous too for explicit approval, if needed...', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/reactions', 'total_count': 6, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 6, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6599524923', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6599524923', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'id': 6599524923, 'node_id': 'IC_kwDOALCn2M8AAAABiVzCOw', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T09:03:07Z', 'updated_at': '2026-11-03T09:05:21Z', 'body': 'I mostly agree that the current wording is fine, and I think it\'s unlikely to cause too many people to try to stick an original GC/Wii game in their standard optical drive, mainly because so few people even have an optical drive these days.\r\n\r\ni.e. I think "Boot From Optical Disc" is fine.', 'author_association': 'MEMBER', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6599524923/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3376, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 478, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3376, 'open_issues': 478, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'raw_gh_hook'}
2026-11-03T09:04:46.353733 {'source': 'webserver', 'gh_type': 'issue_comment', 'raw': {'action': 'edited', 'changes': {'body': {'from': 'I mostly agree that the current wording is unlikely to cause too many people to try to stick an original GC/Wii game in their standard optical drive, mainly because so few people even have an optical drive these days.'}}, 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'id': 6162397505, 'node_id': 'PR_kwDOALCn2M8AAAABMS-vaA', 'number': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 14, 'created_at': '2026-11-02T12:18:18Z', 'updated_at': '2026-11-03T09:03:07Z', 'closed_at': None, 'assignee': None, 'author_association': 'MEMBER', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.patch', 'merged_at': None}, 'body': 'At long last, this PR restores the ability of running games from DVD backups (originally removed on PR #11456) and, for the first time in Dolphin, allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive):\r\n\r\nhttps://github.com/user-attachments/assets/626b3c7e-cd6a-48f0-9962-eaa6b1f0805a\r\n\r\nOn supported OSes (currently Windows and Linux), there\'s a new "Boot From Optical Disc" menu entry on File, and "Change Disc" now opens a popup that lets you change between a disc image or a physical disc or vice-versa:\r\n\r\nhttps://github.com/user-attachments/assets/0af57155-391c-41c8-b78c-bc70a63a7703\r\n\r\nThis implementation is heavily inspired on [redumper](https://github.com/superg/redumper), so Dolphin directly talks to the optical drive via low level SCSI multimedia commands instead of relying on the old approach that was derived from a very outdated version of libcdio.\r\n\r\n### Features and limitations\r\n* Although the UI changes are minimal (for now), I\'ve tried to make this work as intuitively as possible behind the scenes. I think the most noteworthy ones are that optical drives can be hot plugged at any time (if you\'re using USB to SATA adapters or portable drives) and if you boot from a physical disc and then eject it (either via File => Eject Disc or by pressing the Eject button on the drive itself), the disc will be ejected from the emulated console too. If you reinsert a disc later, it\'ll automatically reinsert the disc on the emulated console too (e.g. multi disc games that ask you to insert the next disc)\r\n* I didn\'t initially plan for this, but the `-i` flag from DolphinTool now accepts disc drive paths (e.g. `-i D:` or `-i /dev/sr0`). A side effect of that is you can now rip original discs to ISO, RVZ, GCZ or WIA directly from DolphinTool, if you have an OmniDrive-enabled drive\r\n* Emulated disc speed code is bypassed when using physical discs, as well as "Load Whole Game Into Memory". Beware of speeding up the emulation by setting the speed limit above 100% though, that can cause audio/video issues and even break games if you let them run too fast for too long, since the optical drive can\'t keep up ("An error occurred, please turn the GC/Wii off and refer to the operating manual")\r\n* Loading speeds are a bit slower than what I remember from playing on a real GC/Wii. The handful of games I tried still worked fine, though\r\n* When RetroAchievements are enabled, its hashing can cause a bit of slow loading speeds right after booting a game. It\'s more noticeable with Wii titles\r\n* Currently, [GameCube games that uses DTK Audio](https://wiki.dolphin-emu.org/index.php?title=Category:DTK_Audio_games) are nearly unplayable from physical discs, as the DTK audio path causes constant drive seeking, which consequently reduces the read speeds significantly. I intend to explore a few caching techniques to fix this, but it will be on a separate PR\r\n* Minimal testing was done on Linux, apart from compiling from source on Ubuntu 26.04.1 LTS and ensuring it could boot a game\r\n* Currently there\'s no macOS support, and I won\'t be adding it as I have no access to any Apple hardware. Porting should be easy, though, as all OS-specific code are isolated on `SCSIDevice.cpp/.h`\r\n\r\n### Generative AI disclosure\r\nThe source code from [redumper (b705)](https://github.com/superg/redumper/tree/b705) was fed into a LLM, which was tasked on creating a technical specs document about how it handles standard and raw OmniDrive reads. Then, I\'ve made a Windows-only CLI tool implementing only the absolute minimum required for the features that would be relevant for us, based on that document. DVD descrambling was added next and used this [reference implementation](https://github.com/Deterous/DVD-Scrambler) from Deterous. Once the CLI tool was feature complete, I used a LLM again, this time feeding it parts of the Linux (6.18 LTS) kernel source code, to assist with adding Linux compatibility to it.\r\n\r\nFinally, I started working with the Dolphin\'s source. The code this PR adds is directly derived from the CLI tool, but no LLMs were used beyond that point. I\'m also not touching any emulation code, the changes in DVDInterface reuses existing behavior or are based in code comments that already existed in Dolphin before this PR.\r\n\r\n### Licenses and attribuition\r\nThe bulk of this PR was heavily based on [redumper](https://github.com/superg/redumper), which is licensed under the GPLv3. As mentioned earlier, I also used the [descrambling implementation from Deterous](https://github.com/Deterous/DVD-Scrambler) as a reference, which the repo itself doesn\'t define a license, but directly mentions being made as the reference for redumper, so I think we\'re good? I can try contacting Deterous too for explicit approval, if needed...', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/reactions', 'total_count': 6, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 6, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6599524923', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6599524923', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'id': 6599524923, 'node_id': 'IC_kwDOALCn2M8AAAABiVzCOw', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T09:03:07Z', 'updated_at': '2026-11-03T09:04:44Z', 'body': 'I mostly agree that the current wording is unlikely to cause too many people to try to stick an original GC/Wii game in their standard optical drive, mainly because so few people even have an optical drive these days.\r\n\r\ni.e. I think "Boot From Optical Disc" is fine.', 'author_association': 'MEMBER', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6599524923/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3376, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 478, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3376, 'open_issues': 478, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'raw_gh_hook'}
2026-11-03T09:03:10.227342 {'source': 'webserver', 'gh_type': 'issue_comment', 'raw': {'action': 'created', 'issue': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/labels{/name}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/comments', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/events', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'id': 6162397505, 'node_id': 'PR_kwDOALCn2M8AAAABMS-vaA', 'number': 14974, 'title': 'Core/DolphinQt: Restore "Boot from DVD Backup" and allow booting original discs with OmniDrive firmware', 'user': {'login': 'mbc07', 'id': 8005966, 'node_id': 'MDQ6VXNlcjgwMDU5NjY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/8005966?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/mbc07', 'html_url': 'https://github.com/mbc07', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'labels': [], 'state': 'open', 'locked': False, 'assignees': [], 'milestone': None, 'comments': 14, 'created_at': '2026-11-02T12:18:18Z', 'updated_at': '2026-11-03T09:03:07Z', 'closed_at': None, 'assignee': None, 'author_association': 'MEMBER', 'issue_field_values': [], 'type': None, 'active_lock_reason': None, 'draft': False, 'pull_request': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/14974', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.diff', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/14974.patch', 'merged_at': None}, 'body': 'At long last, this PR restores the ability of running games from DVD backups (originally removed on PR #11456) and, for the first time in Dolphin, allows running games directly from original discs on drives flashed with [OmniDrive firmware](https://github.com/RibShark/OmniDrive):\r\n\r\nhttps://github.com/user-attachments/assets/626b3c7e-cd6a-48f0-9962-eaa6b1f0805a\r\n\r\nOn supported OSes (currently Windows and Linux), there\'s a new "Boot From Optical Disc" menu entry on File, and "Change Disc" now opens a popup that lets you change between a disc image or a physical disc or vice-versa:\r\n\r\nhttps://github.com/user-attachments/assets/0af57155-391c-41c8-b78c-bc70a63a7703\r\n\r\nThis implementation is heavily inspired on [redumper](https://github.com/superg/redumper), so Dolphin directly talks to the optical drive via low level SCSI multimedia commands instead of relying on the old approach that was derived from a very outdated version of libcdio.\r\n\r\n### Features and limitations\r\n* Although the UI changes are minimal (for now), I\'ve tried to make this work as intuitively as possible behind the scenes. I think the most noteworthy ones are that optical drives can be hot plugged at any time (if you\'re using USB to SATA adapters or portable drives) and if you boot from a physical disc and then eject it (either via File => Eject Disc or by pressing the Eject button on the drive itself), the disc will be ejected from the emulated console too. If you reinsert a disc later, it\'ll automatically reinsert the disc on the emulated console too (e.g. multi disc games that ask you to insert the next disc)\r\n* I didn\'t initially plan for this, but the `-i` flag from DolphinTool now accepts disc drive paths (e.g. `-i D:` or `-i /dev/sr0`). A side effect of that is you can now rip original discs to ISO, RVZ, GCZ or WIA directly from DolphinTool, if you have an OmniDrive-enabled drive\r\n* Emulated disc speed code is bypassed when using physical discs, as well as "Load Whole Game Into Memory". Beware of speeding up the emulation by setting the speed limit above 100% though, that can cause audio/video issues and even break games if you let them run too fast for too long, since the optical drive can\'t keep up ("An error occurred, please turn the GC/Wii off and refer to the operating manual")\r\n* Loading speeds are a bit slower than what I remember from playing on a real GC/Wii. The handful of games I tried still worked fine, though\r\n* When RetroAchievements are enabled, its hashing can cause a bit of slow loading speeds right after booting a game. It\'s more noticeable with Wii titles\r\n* Currently, [GameCube games that uses DTK Audio](https://wiki.dolphin-emu.org/index.php?title=Category:DTK_Audio_games) are nearly unplayable from physical discs, as the DTK audio path causes constant drive seeking, which consequently reduces the read speeds significantly. I intend to explore a few caching techniques to fix this, but it will be on a separate PR\r\n* Minimal testing was done on Linux, apart from compiling from source on Ubuntu 26.04.1 LTS and ensuring it could boot a game\r\n* Currently there\'s no macOS support, and I won\'t be adding it as I have no access to any Apple hardware. Porting should be easy, though, as all OS-specific code are isolated on `SCSIDevice.cpp/.h`\r\n\r\n### Generative AI disclosure\r\nThe source code from [redumper (b705)](https://github.com/superg/redumper/tree/b705) was fed into a LLM, which was tasked on creating a technical specs document about how it handles standard and raw OmniDrive reads. Then, I\'ve made a Windows-only CLI tool implementing only the absolute minimum required for the features that would be relevant for us, based on that document. DVD descrambling was added next and used this [reference implementation](https://github.com/Deterous/DVD-Scrambler) from Deterous. Once the CLI tool was feature complete, I used a LLM again, this time feeding it parts of the Linux (6.18 LTS) kernel source code, to assist with adding Linux compatibility to it.\r\n\r\nFinally, I started working with the Dolphin\'s source. The code this PR adds is directly derived from the CLI tool, but no LLMs were used beyond that point. I\'m also not touching any emulation code, the changes in DVDInterface reuses existing behavior or are based in code comments that already existed in Dolphin before this PR.\r\n\r\n### Licenses and attribuition\r\nThe bulk of this PR was heavily based on [redumper](https://github.com/superg/redumper), which is licensed under the GPLv3. As mentioned earlier, I also used the [descrambling implementation from Deterous](https://github.com/Deterous/DVD-Scrambler) as a reference, which the repo itself doesn\'t define a license, but directly mentions being made as the reference for redumper, so I think we\'re good? I can try contacting Deterous too for explicit approval, if needed...', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/reactions', 'total_count': 6, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 6, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'timeline_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974/timeline', 'performed_via_github_app': None, 'state_reason': None}, 'comment': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6599524923', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/14974#issuecomment-6599524923', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/14974', 'id': 6599524923, 'node_id': 'IC_kwDOALCn2M8AAAABiVzCOw', 'user': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'created_at': '2026-11-03T09:03:07Z', 'updated_at': '2026-11-03T09:03:07Z', 'body': 'I mostly agree that the current wording is unlikely to cause too many people to try to stick an original GC/Wii game in their standard optical drive, mainly because so few people even have an optical drive these days.', 'author_association': 'MEMBER', 'reactions': {'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/6599524923/reactions', 'total_count': 0, '+1': 0, '-1': 0, 'laugh': 0, 'hooray': 0, 'confused': 0, 'heart': 0, 'rocket': 0, 'eyes': 0}, 'performed_via_github_app': None, 'minimized': None}, 'repository': {'id': 11577304, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'name': 'dolphin', 'full_name': 'dolphin-emu/dolphin', 'private': False, 'owner': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/dolphin-emu', 'html_url': 'https://github.com/dolphin-emu', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'user_view_type': 'public', 'site_admin': False}, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'fork': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'created_at': '2013-07-22T09:07:57Z', 'updated_at': '2026-11-03T08:13:26Z', 'pushed_at': '2026-11-03T04:44:51Z', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'homepage': 'https://dolphin-emu.org', 'size': 563758, 'stargazers_count': 15758, 'watchers_count': 15758, 'language': 'C++', 'has_issues': False, 'has_projects': False, 'has_downloads': False, 'has_wiki': True, 'has_pages': False, 'has_discussions': False, 'forks_count': 3376, 'mirror_url': None, 'archived': False, 'disabled': False, 'open_issues_count': 478, 'license': {'key': 'other', 'name': 'Other', 'spdx_id': 'NOASSERTION', 'url': None, 'node_id': 'MDc6TGljZW5zZTA='}, 'allow_forking': True, 'is_template': False, 'web_commit_signoff_required': False, 'has_pull_requests': True, 'pull_request_creation_policy': 'all', 'topics': ['cpp', 'emulation', 'emulator', 'gamecube', 'wii'], 'visibility': 'public', 'forks': 3376, 'open_issues': 478, 'watchers': 15758, 'default_branch': 'master', 'custom_properties': {}}, 'organization': {'login': 'dolphin-emu', 'id': 5050316, 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'url': 'https://api.github.com/orgs/dolphin-emu', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'avatar_url': 'https://avatars.githubusercontent.com/u/5050316?v=4', 'description': ''}, 'sender': {'login': 'jordan-woyak', 'id': 1768214, 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'avatar_url': 'https://avatars.githubusercontent.com/u/1768214?v=4', 'gravatar_id': '', 'url': 'https://api.github.com/users/jordan-woyak', 'html_url': 'https://github.com/jordan-woyak', 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'user_view_type': 'public', 'site_admin': False}, 'installation': {'id': 35437981, 'node_id': 'MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzU0Mzc5ODE='}}, 'type': 'raw_gh_hook'}