示例#1
0
def music_services_details():
    spotify_service = SpotifyService()
    spotify_user = spotify_service.get_user(current_user.id)

    if spotify_user:
        permissions = set(spotify_user["scopes"])
        if permissions == set(SPOTIFY_IMPORT_PERMISSIONS):
            current_spotify_permissions = "import"
        elif permissions == set(SPOTIFY_LISTEN_PERMISSIONS):
            current_spotify_permissions = "listen"
        else:
            current_spotify_permissions = "both"
    else:
        current_spotify_permissions = "disable"

    youtube_service = YoutubeService()
    youtube_user = youtube_service.get_user(current_user.id)
    current_youtube_permissions = "listen" if youtube_user else "disable"

    return render_template(
        'user/music_services.html',
        spotify_user=spotify_user,
        current_spotify_permissions=current_spotify_permissions,
        youtube_user=youtube_user,
        current_youtube_permissions=current_youtube_permissions)
示例#2
0
 def setUp(self):
     super(YoutubeServiceTestCase, self).setUp()
     self.user_id = db_user.create(211, 'youtube_user')
     self.service = YoutubeService()
     self.service.add_new_user(
         self.user_id, {
             'access_token': 'access-token',
             'expires_at': time.time() + 3599,
             'expires_in': 3599,
             'refresh_token': 'refresh-token',
             'scope': YOUTUBE_SCOPES,
             'token_type': 'Bearer'
         })
     self.youtube_user = self.service.get_user(self.user_id)
示例#3
0
def get_current_youtube_user():
    """Returns the youtube access token for the current authenticated
    user and the youtube api key. If the user is not authenticated or
    has not linked to a Youtube account, returns empty dict."""
    if not current_user.is_authenticated:
        return {}
    user = YoutubeService().get_user(current_user.id)
    if user is None:
        return {}
    return {
        "access_token": user["access_token"],
        "api_key": current_app.config["YOUTUBE_API_KEY"]
    }
示例#4
0
def _get_service_or_raise_404(name: str) -> ExternalService:
    """Returns the music service for the given name and raise 404 if
    service is not found

    Args:
        name (str): Name of the service
    """
    try:
        service = ExternalServiceType[name.upper()]
        if service == ExternalServiceType.YOUTUBE:
            return YoutubeService()
        elif service == ExternalServiceType.SPOTIFY:
            return SpotifyService()
    except KeyError:
        raise NotFound("Service %s is invalid." % name)
示例#5
0
class YoutubeServiceTestCase(IntegrationTestCase):
    def setUp(self):
        super(YoutubeServiceTestCase, self).setUp()
        self.user_id = db_user.create(211, 'youtube_user')
        self.service = YoutubeService()
        self.service.add_new_user(
            self.user_id, {
                'access_token': 'access-token',
                'expires_at': time.time() + 3599,
                'expires_in': 3599,
                'refresh_token': 'refresh-token',
                'scope': YOUTUBE_SCOPES,
                'token_type': 'Bearer'
            })
        self.youtube_user = self.service.get_user(self.user_id)

    def test_get_user(self):
        user = self.service.get_user(self.user_id)
        self.assertIsInstance(user, dict)
        self.assertEqual(user['user_id'], self.user_id)
        self.assertEqual(user['musicbrainz_id'], 'youtube_user')
        self.assertEqual(user['access_token'], 'access-token')
        self.assertEqual(user['refresh_token'], 'refresh-token')
        self.assertIsNotNone(user['last_updated'])

    @requests_mock.Mocker()
    @mock.patch('time.time')
    def test_refresh_access_token(self, mock_requests, mock_time):
        mock_time.return_value = 0
        mock_requests.post(OAUTH_TOKEN_URL,
                           status_code=200,
                           json={
                               "access_token": "new-access-token",
                               "expires_in": 3920,
                               "scope": YOUTUBE_SCOPES[0],
                               "token_type": "Bearer"
                           })

        user = self.service.refresh_access_token(
            self.user_id, self.youtube_user['refresh_token'])
        self.assertEqual(self.user_id, user['user_id'])
        self.assertEqual('new-access-token', user['access_token'])
        self.assertEqual(self.youtube_user['refresh_token'],
                         user['refresh_token'])

    @requests_mock.Mocker()
    def test_refresh_user_token_revoked(self, mock_requests):
        mock_requests.post(OAUTH_TOKEN_URL,
                           status_code=400,
                           json={
                               'error': 'invalid_grant',
                               'error_description':
                               'Token is expired or revoked.',
                           })
        with self.assertRaises(ExternalServiceInvalidGrantError):
            self.service.refresh_access_token(
                self.user_id, self.youtube_user['refresh_token'])

    @requests_mock.Mocker()
    def test_fetch_access_token(self, mock_requests):
        response = {
            "access_token": "new-access-token",
            "expires_in": 3920,
            "scope": YOUTUBE_SCOPES[0],
            "refresh_token": "valid-refresh-token",
            "token_type": "Bearer"
        }

        mock_requests.post(OAUTH_TOKEN_URL, status_code=200, json=response)
        token = self.service.fetch_access_token("valid-code")
        self.assertEqual("new-access-token", token["access_token"])
        self.assertEqual("valid-refresh-token", token["refresh_token"])
        self.assertEqual(3920, token["expires_in"])
        self.assertEqual(YOUTUBE_SCOPES, token["scope"])

    @requests_mock.Mocker()
    def test_add_user_without_refresh_token(self, mock_requests):
        mock_requests.post(OAUTH_REVOKE_URL,
                           status_code=200,
                           json={'status': 'ok'})
        token = {
            "access_token": "new-access-token",
            "expires_in": 3920,
            "scope": YOUTUBE_SCOPES[0],
            "token_type": "Bearer"
        }
        self.assertFalse(self.service.add_new_user(self.user_id, token))
        self.assertTrue(mock_requests.called)

    @requests_mock.Mocker()
    def test_remove_user(self, mock_requests):
        mock_requests.post(OAUTH_REVOKE_URL, status_code=200, json={})
        self.service.remove_user(self.user_id)
        self.assertIsNone(self.service.get_user(self.user_id))
        self.assertTrue(mock_requests.called_once)

    @requests_mock.Mocker()
    def test_remove_user_revoke_fail(self, mock_requests):
        mock_requests.post(OAUTH_REVOKE_URL,
                           status_code=400,
                           json={"error": "invalid token"})
        self.service.remove_user(self.user_id)
        self.assertIsNone(self.service.get_user(self.user_id))
        self.assertTrue(mock_requests.called_once)