diff --git a/backend/channel/src/index.py b/backend/channel/src/index.py index b3b47db9..1273930e 100644 --- a/backend/channel/src/index.py +++ b/backend/channel/src/index.py @@ -326,22 +326,12 @@ class YoutubeChannel(YouTubeItem): for key, value in overwrites.items(): if key not in valid_keys: raise ValueError(f"invalid overwrite key: {key}") - elif value == "disable": - to_write[key] = False + + if value is None and key in to_write: + to_write.pop(key) continue - elif value == "0": - if key in to_write: - del to_write[key] - continue - elif value == "1": - to_write[key] = True - continue - elif isinstance(value, int) and int(value) < 0: - if key in to_write: - del to_write[key] - continue - elif value is not None and value != "": - to_write.update({key: value}) + + to_write.update({key: value}) self.json_data["channel_overwrites"] = to_write @@ -353,3 +343,5 @@ def channel_overwrites(channel_id, overwrites): channel.set_overwrites(overwrites) channel.upload_to_es() channel.sync_to_videos() + + return channel.json_data["channel_overwrites"] diff --git a/backend/channel/urls.py b/backend/channel/urls.py index 4b4ec53e..4e370d62 100644 --- a/backend/channel/urls.py +++ b/backend/channel/urls.py @@ -19,6 +19,11 @@ urlpatterns = [ views.ChannelApiView.as_view(), name="api-channel", ), + path( + "/about/", + views.ChannelApiAboutView.as_view(), + name="api-channel-view", + ), path( "/aggs/", views.ChannelAggsApiView.as_view(), diff --git a/backend/channel/views.py b/backend/channel/views.py index e5c7c8cd..f7bcac15 100644 --- a/backend/channel/views.py +++ b/backend/channel/views.py @@ -1,6 +1,6 @@ """all channel API views""" -from channel.src.index import YoutubeChannel +from channel.src.index import YoutubeChannel, channel_overwrites from channel.src.nav import ChannelNav from common.src.urlparser import Parser from common.views_base import AdminWriteOnly, ApiBaseView @@ -102,6 +102,38 @@ class ChannelApiView(ApiBaseView): return Response(message, status=status_code) +class ChannelApiAboutView(ApiBaseView): + """resolves to /api/channel//about/ + GET: returns the channel specific settings + POST: sets the channel specific settings, returning current values + """ + + permission_classes = [AdminWriteOnly] + + def get(self, request, channel_id): + """get channel overwrites""" + # pylint: disable=unused-argument + channel = YoutubeChannel(channel_id) + channel.get_from_es() + if not channel.json_data: + return Response({"error": "unknown channel id"}, status=404) + + return Response(channel.get_overwrites()) + + def post(self, request, channel_id): + """modify channel overwrites""" + data = request.data + if not isinstance(data, dict): + return Response({"error": "invalid payload"}, status=400) + + try: + new_channel_overwrites = channel_overwrites(channel_id, data) + except ValueError as err: + return Response({"error": str(err)}, status=400) + + return Response(new_channel_overwrites, status=200) + + class ChannelAggsApiView(ApiBaseView): """resolves to /api/channel//aggs/ GET: get channel aggregations