Add support for actions in Lutris urls

This commit is contained in:
Mathieu Comandon 2017-05-15 10:01:48 -07:00
parent 9718e72b2e
commit d36ff5cc1c
2 changed files with 40 additions and 5 deletions

View file

@ -98,24 +98,36 @@ def parse_installer_url(url):
"""
Parses `lutris:` urls, extracting any info necessary to install or run a game.
"""
action = None
try:
parsed_url = urlparse(url, scheme="lutris")
except:
return False
if parsed_url.scheme != "lutris":
return False
game_slug = parsed_url.path
if not game_slug:
url_path = parsed_url.path
if not url_path:
return False
# urlparse can't parse if the path only contain numbers
# workaround to remove the scheme manually:
if game_slug.startswith('lutris:'):
game_slug = game_slug[7:]
if url_path.startswith('lutris:'):
url_path = url_path[7:]
url_parts = url_path.split('/')
if len(url_parts) == 2:
action = url_parts[0]
game_slug = url_parts[1]
elif len(url_parts) == 1:
game_slug = url_parts[0]
else:
raise ValueError('Invalid lutris url %s' % url)
revision = None
if parsed_url.query:
query = dict(parse_qsl(parsed_url.query))
revision = query.get('revision')
return {
'game_slug': game_slug,
'revision': revision
'revision': revision,
'action': action
}

23
tests/test_resources.py Normal file
View file

@ -0,0 +1,23 @@
from unittest import TestCase
from lutris.util.resources import parse_installer_url
class TestInstallerUrls(TestCase):
def test_legacy_url(self):
result = parse_installer_url("lutris:quake")
self.assertEqual(result['game_slug'], 'quake')
self.assertEqual(result['revision'], None)
self.assertEqual(result['action'], None)
def test_action_rungameid(self):
result = parse_installer_url("lutris:rungameid/123")
self.assertEqual(result['game_slug'], '123')
self.assertEqual(result['revision'], None)
self.assertEqual(result['action'], 'rungameid')
def test_action_rungame(self):
result = parse_installer_url("lutris:rungame/quake")
self.assertEqual(result['game_slug'], 'quake')
self.assertEqual(result['revision'], None)
self.assertEqual(result['action'], 'rungame')