From 5d4bfb3f908bb3cf24cd17144e532329f8d9150a Mon Sep 17 00:00:00 2001 From: Fabio Manganiello Date: Thu, 27 Jun 2024 00:21:03 +0200 Subject: [PATCH 1/2] Fixed un-bumped version in setup.py --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 710c39eb19..92db79e665 100755 --- a/setup.py +++ b/setup.py @@ -66,7 +66,7 @@ backend = pkg_files('platypush/backend') setup( name="platypush", - version="1.1.0", + version="1.1.1", author="Fabio Manganiello", author_email="fabio@manganiello.tech", description="Platypush service", From 8880b966fc18514c790c462abb6665c1d7199d47 Mon Sep 17 00:00:00 2001 From: Fabio Manganiello Date: Thu, 27 Jun 2024 00:21:27 +0200 Subject: [PATCH 2/2] [youtube] Fixed playlist operations URLs. --- platypush/plugins/youtube/__init__.py | 30 ++++++++++++++++++++------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/platypush/plugins/youtube/__init__.py b/platypush/plugins/youtube/__init__.py index 1e1c4ad33b..c397facfb7 100644 --- a/platypush/plugins/youtube/__init__.py +++ b/platypush/plugins/youtube/__init__.py @@ -1,4 +1,5 @@ import base64 +import re from functools import lru_cache from typing import List, Optional @@ -99,6 +100,14 @@ class YoutubePlugin(Plugin): PipedChannelSchema().dump(self._request(f'channel/{id}')) or {} # type: ignore ) + @staticmethod + def _get_video_id(id_or_url: str) -> str: + m = re.search(r'/watch\?v=([^&]+)', id_or_url) + if m: + return m.group(1) + + return id_or_url + @action def search(self, query: str, **_) -> List[dict]: """ @@ -215,10 +224,10 @@ class YoutubePlugin(Plugin): :param playlist_id: Piped playlist ID. """ self._request( - 'playlists/add', + 'user/playlists/add', method='post', json={ - 'videoIds': [video_id], + 'videoIds': [self._get_video_id(video_id)], 'playlistId': playlist_id, }, ) @@ -235,13 +244,15 @@ class YoutubePlugin(Plugin): Note that either the video ID or the index must be provided. - :param video_id: YouTube video ID. + :param video_id: YouTube video ID or URL. :param index: (0-based) index of the video in the playlist. :param playlist_id: Piped playlist ID. """ assert video_id or index, 'Either the video ID or the index must be provided' if index is None: + assert video_id + video_id = self._get_video_id(video_id) index = next( ( i @@ -250,7 +261,7 @@ class YoutubePlugin(Plugin): 'relatedStreams', [] ) ) - if v.get('id') == video_id + if self._get_video_id(v.get('url')) == video_id ), None, ) @@ -262,7 +273,7 @@ class YoutubePlugin(Plugin): return self._request( - 'playlists/remove', + 'user/playlists/remove', method='post', json={ 'index': index, @@ -278,8 +289,11 @@ class YoutubePlugin(Plugin): :param name: Playlist name. :return: Playlist information. """ + name = name.strip() + assert name, 'Playlist name cannot be empty' + playlist_id = self._request( - 'playlists/create', + 'user/playlists/create', method='post', json={'name': name}, ).get('playlistId') @@ -312,7 +326,7 @@ class YoutubePlugin(Plugin): return self._request( - 'playlists/rename', + 'user/playlists/rename', method='post', json={ 'playlistId': id, @@ -328,7 +342,7 @@ class YoutubePlugin(Plugin): :param id: Piped playlist ID. """ self._request( - 'playlists/delete', + 'user/playlists/delete', method='post', json={'playlistId': id}, )