mirror of
https://code.eliotberriot.com/funkwhale/funkwhale.git
synced 2025-10-06 10:19:55 +02:00
Fixed #4: can now import artists and releases with a clean interface :party:
This commit is contained in:
parent
3ccb70d0a8
commit
aa80bd15fa
43 changed files with 1614 additions and 120 deletions
|
@ -4,21 +4,20 @@ from apiclient.discovery import build
|
|||
from apiclient.errors import HttpError
|
||||
from oauth2client.tools import argparser
|
||||
|
||||
from django.conf import settings
|
||||
from dynamic_preferences.registries import (
|
||||
global_preferences_registry as registry)
|
||||
|
||||
# Set DEVELOPER_KEY to the API key value from the APIs & auth > Registered apps
|
||||
# tab of
|
||||
# https://cloud.google.com/console
|
||||
# Please ensure that you have enabled the YouTube Data API for your project.
|
||||
DEVELOPER_KEY = settings.FUNKWHALE_PROVIDERS['youtube']['api_key']
|
||||
YOUTUBE_API_SERVICE_NAME = "youtube"
|
||||
YOUTUBE_API_VERSION = "v3"
|
||||
VIDEO_BASE_URL = 'https://www.youtube.com/watch?v={0}'
|
||||
|
||||
|
||||
def _do_search(query):
|
||||
youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION,
|
||||
developerKey=DEVELOPER_KEY)
|
||||
manager = registry.manager()
|
||||
youtube = build(
|
||||
YOUTUBE_API_SERVICE_NAME,
|
||||
YOUTUBE_API_VERSION,
|
||||
developerKey=manager['providers_youtube__api_key'])
|
||||
|
||||
return youtube.search().list(
|
||||
q=query,
|
||||
|
@ -55,4 +54,33 @@ class Client(object):
|
|||
|
||||
return results
|
||||
|
||||
def to_funkwhale(self, result):
|
||||
"""
|
||||
We convert youtube results to something more generic.
|
||||
|
||||
{
|
||||
"id": "video id",
|
||||
"type": "youtube#video",
|
||||
"url": "https://www.youtube.com/watch?v=id",
|
||||
"description": "description",
|
||||
"channelId": "Channel id",
|
||||
"title": "Title",
|
||||
"channelTitle": "channel Title",
|
||||
"publishedAt": "2012-08-22T18:41:03.000Z",
|
||||
"cover": "http://coverurl"
|
||||
}
|
||||
"""
|
||||
return {
|
||||
'id': result['id']['videoId'],
|
||||
'url': 'https://www.youtube.com/watch?v={}'.format(
|
||||
result['id']['videoId']),
|
||||
'type': result['id']['kind'],
|
||||
'title': result['snippet']['title'],
|
||||
'description': result['snippet']['description'],
|
||||
'channelId': result['snippet']['channelId'],
|
||||
'channelTitle': result['snippet']['channelTitle'],
|
||||
'publishedAt': result['snippet']['publishedAt'],
|
||||
'cover': result['snippet']['thumbnails']['high']['url'],
|
||||
}
|
||||
|
||||
client = Client()
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
from dynamic_preferences.types import StringPreference, Section
|
||||
from dynamic_preferences.registries import global_preferences_registry
|
||||
|
||||
youtube = Section('providers_youtube')
|
||||
|
||||
|
||||
@global_preferences_registry.register
|
||||
class APIKey(StringPreference):
|
||||
section = youtube
|
||||
name = 'api_key'
|
||||
default = 'CHANGEME'
|
||||
verbose_name = 'YouTube API key'
|
||||
help_text = 'The API key used to query YouTube. Get one at https://console.developers.google.com/.'
|
|
@ -8,7 +8,7 @@ from funkwhale_api.providers.youtube.client import client
|
|||
from . import data as api_data
|
||||
|
||||
class TestAPI(TestCase):
|
||||
|
||||
maxDiff = None
|
||||
@unittest.mock.patch(
|
||||
'funkwhale_api.providers.youtube.client._do_search',
|
||||
return_value=api_data.search['8 bit adventure'])
|
||||
|
@ -25,11 +25,23 @@ class TestAPI(TestCase):
|
|||
return_value=api_data.search['8 bit adventure'])
|
||||
def test_can_get_search_results_from_funkwhale(self, *mocks):
|
||||
query = '8 bit adventure'
|
||||
expected = json.dumps(client.search(query))
|
||||
url = self.reverse('api:v1:providers:youtube:search')
|
||||
response = self.client.get(url + '?query={0}'.format(query))
|
||||
# we should cast the youtube result to something more generic
|
||||
expected = {
|
||||
"id": "0HxZn6CzOIo",
|
||||
"url": "https://www.youtube.com/watch?v=0HxZn6CzOIo",
|
||||
"type": "youtube#video",
|
||||
"description": "Make sure to apply adhesive evenly before use. GET IT HERE: http://adhesivewombat.bandcamp.com/album/marsupial-madness Facebook: ...",
|
||||
"channelId": "UCps63j3krzAG4OyXeEyuhFw",
|
||||
"title": "AdhesiveWombat - 8 Bit Adventure",
|
||||
"channelTitle": "AdhesiveWombat",
|
||||
"publishedAt": "2012-08-22T18:41:03.000Z",
|
||||
"cover": "https://i.ytimg.com/vi/0HxZn6CzOIo/hqdefault.jpg"
|
||||
}
|
||||
|
||||
self.assertJSONEqual(expected, json.loads(response.content.decode('utf-8')))
|
||||
self.assertEqual(
|
||||
json.loads(response.content.decode('utf-8'))[0], expected)
|
||||
|
||||
@unittest.mock.patch(
|
||||
'funkwhale_api.providers.youtube.client._do_search',
|
||||
|
@ -66,9 +78,22 @@ class TestAPI(TestCase):
|
|||
'q': '8 bit adventure',
|
||||
}
|
||||
|
||||
expected = json.dumps(client.search_multiple(queries))
|
||||
expected = {
|
||||
"id": "0HxZn6CzOIo",
|
||||
"url": "https://www.youtube.com/watch?v=0HxZn6CzOIo",
|
||||
"type": "youtube#video",
|
||||
"description": "Make sure to apply adhesive evenly before use. GET IT HERE: http://adhesivewombat.bandcamp.com/album/marsupial-madness Facebook: ...",
|
||||
"channelId": "UCps63j3krzAG4OyXeEyuhFw",
|
||||
"title": "AdhesiveWombat - 8 Bit Adventure",
|
||||
"channelTitle": "AdhesiveWombat",
|
||||
"publishedAt": "2012-08-22T18:41:03.000Z",
|
||||
"cover": "https://i.ytimg.com/vi/0HxZn6CzOIo/hqdefault.jpg"
|
||||
}
|
||||
|
||||
url = self.reverse('api:v1:providers:youtube:searchs')
|
||||
response = self.client.post(
|
||||
url, json.dumps(queries), content_type='application/json')
|
||||
|
||||
self.assertJSONEqual(expected, json.loads(response.content.decode('utf-8')))
|
||||
self.assertEqual(
|
||||
expected,
|
||||
json.loads(response.content.decode('utf-8'))['1'][0])
|
||||
|
|
|
@ -10,7 +10,10 @@ class APISearch(APIView):
|
|||
|
||||
def get(self, request, *args, **kwargs):
|
||||
results = client.search(request.GET['query'])
|
||||
return Response(results)
|
||||
return Response([
|
||||
client.to_funkwhale(result)
|
||||
for result in results
|
||||
])
|
||||
|
||||
|
||||
class APISearchs(APIView):
|
||||
|
@ -18,4 +21,10 @@ class APISearchs(APIView):
|
|||
|
||||
def post(self, request, *args, **kwargs):
|
||||
results = client.search_multiple(request.data)
|
||||
return Response(results)
|
||||
return Response({
|
||||
key: [
|
||||
client.to_funkwhale(result)
|
||||
for result in group
|
||||
]
|
||||
for key, group in results.items()
|
||||
})
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue