playlist relation take 2

This commit is contained in:
simon 2021-11-13 17:34:58 +07:00
parent 7930da5242
commit ac14cd5ebb
No known key found for this signature in database
GPG Key ID: 2C15AA5E89985DD4
4 changed files with 34 additions and 121 deletions

View File

@ -535,46 +535,27 @@ class YoutubePlaylist:
print(response.text) print(response.text)
def add_vids_to_playlist(self): def add_vids_to_playlist(self):
"""sync the playlistdict to video dict""" """sync the playlist id to videos"""
print("sync playlist meta data for " + self.playlist_id)
playlist_dict = self.playlist_dict playlist_dict = self.playlist_dict
all_entries = playlist_dict["playlist_entries"] script = (
vid_ids = [i["youtube_id"] for i in all_entries] 'if (!ctx._source.containsKey("playlist")) '
+ "{ctx._source.playlist = [params.playlist]} "
to_add = { + "else if (!ctx._source.playlist.contains(params.playlist)) "
key: val + "{ctx._source.playlist.add(params.playlist)} "
for key, val in playlist_dict.items() + "else {ctx.op = 'none'}"
if key != "playlist_entries"
}
bulk_list = []
for youtube_id in vid_ids:
action = {"update": {"_id": youtube_id, "_index": "ta_video"}}
source = {"doc": {"playlist": to_add}}
bulk_list.append(json.dumps(action))
bulk_list.append(json.dumps(source))
# add last newline
bulk_list.append("\n")
query_str = "\n".join(bulk_list)
headers = {"Content-type": "application/x-ndjson"}
url = self.ES_URL + "/_bulk"
response = requests.post(
url, data=query_str, headers=headers, auth=self.ES_AUTH
) )
if not response.ok:
print(response.text)
def playlist_position(self):
"""sync playlist_position to video dict"""
all_entries = self.playlist_dict["playlist_entries"]
bulk_list = [] bulk_list = []
for idx, entry in enumerate(all_entries): for entry in playlist_dict["playlist_entries"]:
youtube_id = entry["youtube_id"] youtube_id = entry["youtube_id"]
playlist_position = self.get_position_dict(all_entries, idx)
action = {"update": {"_id": youtube_id, "_index": "ta_video"}} action = {"update": {"_id": youtube_id, "_index": "ta_video"}}
source = {"doc": {"playlist_position": playlist_position}} source = {
"script": {
"source": script,
"lang": "painless",
"params": {"playlist": self.playlist_id},
}
}
bulk_list.append(json.dumps(action)) bulk_list.append(json.dumps(action))
bulk_list.append(json.dumps(source)) bulk_list.append(json.dumps(source))
@ -589,48 +570,6 @@ class YoutubePlaylist:
if not response.ok: if not response.ok:
print(response.text) print(response.text)
@staticmethod
def get_position_dict(all_entries, idx):
"""get previous and next videos in playlist"""
playlist_position = {"playlist_index": idx}
if idx == 0:
playlist_position.update(
{
"playlist_prev_id": False,
"playlist_prev_title": False,
"playlist_prev_channel_name": False,
}
)
else:
prev_vid = all_entries[idx - 1]
playlist_position.update(
{
"playlist_prev_id": prev_vid["youtube_id"],
"playlist_prev_title": prev_vid["title"],
"playlist_prev_channel_name": prev_vid["uploader"],
}
)
if idx == len(all_entries) - 1:
playlist_position.update(
{
"playlist_next_id": False,
"playlist_next_title": False,
"playlist_next_channel_name": False,
}
)
else:
next_vid = all_entries[idx + 1]
playlist_position.update(
{
"playlist_next_id": next_vid["youtube_id"],
"playlist_next_title": next_vid["title"],
"playlist_next_channel_name": next_vid["uploader"],
}
)
return playlist_position
class WatchState: class WatchState:
"""handle watched checkbox for videos and channels""" """handle watched checkbox for videos and channels"""

View File

@ -107,10 +107,6 @@ INDEX_CONFIG = [
"youtube_id": {"type": "keyword"}, "youtube_id": {"type": "keyword"},
"published": {"type": "date"}, "published": {"type": "date"},
"playlist": { "playlist": {
"properties": {
"playlist_id": {"type": "keyword"},
"playlist_description": {"type": "text"},
"playlist_name": {
"type": "text", "type": "text",
"fields": { "fields": {
"keyword": { "keyword": {
@ -120,30 +116,6 @@ INDEX_CONFIG = [
} }
}, },
}, },
"playlist_channel": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256,
"normalizer": "to_lower",
}
},
},
"playlist_channel_id": {"type": "keyword"},
"playlist_thumbnail": {"type": "keyword"},
}
},
"playlist_position": {
"properties": {
"playlist_next_id": {"type": "keyword"},
"playlist_next_title": {"type": "text"},
"playlist_next_channel_name": {"type": "text"},
"playlist_prev_id": {"type": "keyword"},
"playlist_prev_title": {"type": "text"},
"playlist_prev_channel_name": {"type": "text"},
}
},
}, },
"expected_set": { "expected_set": {
"analysis": { "analysis": {

View File

@ -214,7 +214,6 @@ def index_channel_playlists(channel_id):
playlist_handler.get_playlist_dict() playlist_handler.get_playlist_dict()
playlist_handler.upload_to_es() playlist_handler.upload_to_es()
playlist_handler.add_vids_to_playlist() playlist_handler.add_vids_to_playlist()
playlist_handler.playlist_position()
if all_playlists: if all_playlists:
handler = ThumbManager() handler = ThumbManager()

View File

@ -33,6 +33,7 @@ from home.tasks import (
download_pending, download_pending,
download_single, download_single,
extrac_dl, extrac_dl,
index_channel_playlists,
kill_dl, kill_dl,
re_sync_thumbs, re_sync_thumbs,
rescan_filesystem, rescan_filesystem,
@ -634,6 +635,7 @@ class PlaylistIdView(View):
def build_data(pagination_handler, playlist_id_detail, view_config): def build_data(pagination_handler, playlist_id_detail, view_config):
"""build data query for es""" """build data query for es"""
sort_by = view_config["sort_by"] sort_by = view_config["sort_by"]
sort_order = view_config["sort_order"]
# overwrite sort_by to match key # overwrite sort_by to match key
if sort_by == "views": if sort_by == "views":
@ -649,17 +651,11 @@ class PlaylistIdView(View):
"query": { "query": {
"bool": { "bool": {
"must": [ "must": [
{ {"match": {"playlist.keyword": playlist_id_detail}}
"term": {
"playlist.playlist_id": {
"value": playlist_id_detail
}
}
}
] ]
} }
}, },
"sort": [{"playlist_position.playlist_index": {"order": "asc"}}], "sort": [{sort_by: {"order": sort_order}}],
} }
if view_config["hide_watched"]: if view_config["hide_watched"]:
to_append = {"term": {"player.watched": {"value": False}}} to_append = {"term": {"player.watched": {"value": False}}}
@ -891,6 +887,7 @@ class PostData:
"channel-search": self.channel_search, "channel-search": self.channel_search,
"delete-video": self.delete_video, "delete-video": self.delete_video,
"delete-channel": self.delete_channel, "delete-channel": self.delete_channel,
"find-playlists": self.find_playlists,
} }
return exec_map[self.to_exec] return exec_map[self.to_exec]
@ -1082,3 +1079,9 @@ class PostData:
channel_id = self.exec_val channel_id = self.exec_val
YoutubeChannel(channel_id).delete_channel() YoutubeChannel(channel_id).delete_channel()
return {"success": True} return {"success": True}
def find_playlists(self):
"""add all playlists of a channel"""
channel_id = self.exec_val
index_channel_playlists.delay(channel_id)
return {"success": True}