Example #1
0
def insertIntoPlaylistLockFree(pid, vid, rank, user, session) :
	log(obj = {'pid': pid, 'vid': vid, 'rank': rank})
	if tagdb.retrive_item({'_id': ObjectId(vid)}, session = session) is None :
		#raise UserError('VIDEO_NOT_EXIST')
		return False
	conflicting_item = db.playlist_items.find_one({'pid': ObjectId(pid), 'vid': ObjectId(vid)}, session = session)
	if conflicting_item is not None :
		editPlaylist_MoveLockFree(pid, conflicting_item, rank, session = session)
		db.playlists.update_one({'_id': ObjectId(pid)}, {'$set': {
			'meta.modified_by': makeUserMeta(user),
			'meta.modified_at': datetime.now()}}, session = session)
		if conflicting_item['rank'] >= rank :
			return True
		else :
			return False
	playlists = tagdb.retrive_item({'_id': ObjectId(vid)}, session = session)['item']['series']
	playlists.append(ObjectId(pid))
	playlists = list(set(playlists))
	tagdb.update_item_query(ObjectId(vid), {'$set': {'item.series': playlists}}, makeUserMeta(user), session = session)
	db.playlists.update_one({"_id": ObjectId(pid)}, {"$inc": {"videos": int(1)}}, session = session)
	db.playlist_items.update_many({'pid': ObjectId(pid), 'rank': {'$gte': rank}}, {'$inc': {'rank': int(1)}}, session = session)
	db.playlist_items.insert_one({"pid": ObjectId(pid), "vid": ObjectId(vid), "rank": int(rank), "meta": makeUserMeta(user)}, session = session)
	db.playlists.update_one({'_id': ObjectId(pid)}, {'$set': {
		'meta.modified_by': makeUserMeta(user),
		'meta.modified_at': datetime.now()}}, session = session)
	return True
Example #2
0
def updateCommonTags(pid, tags, user):
    log(obj={'pid': pid, 'tags': tags})
    with MongoTransaction(client) as s:
        playlist_obj = db.playlists.find_one({'_id': ObjectId(pid)})
        if playlist_obj is None:
            raise UserError('PLAYLIST_NOT_EXIST')
        filterOperation('editPlaylist', user, playlist_obj)
        # user is editing video tags, not the playlist itself, no need to lock playlist
        tags = tagdb.filter_and_translate_tags(tags, session=s())
        old_tags = listCommonTagIDs(pid, user)
        log(obj={'old_tags': old_tags})
        old_tags_set = set(old_tags)
        new_tags_set = set(tags)
        tags_added = list((old_tags_set ^ new_tags_set) - old_tags_set)
        tags_to_remove = list((old_tags_set ^ new_tags_set) - new_tags_set)
        if len(tags_added) - len(
                tags_to_remove) > PlaylistConfig.MAX_COMMON_TAGS:
            raise UserError('TOO_MANY_TAGS')
        all_video_ids, _ = listAllPlaylistVideosUnordered(pid)
        if tags_to_remove:
            tagdb.update_many_items_tags_pull(all_video_ids,
                                              tags_to_remove,
                                              makeUserMeta(user),
                                              session=s())
        if tags_added:
            tagdb.update_many_items_tags_merge(all_video_ids,
                                               tags_added,
                                               makeUserMeta(user),
                                               session=s())
        s.mark_succeed()
Example #3
0
def renameFolder(user, path, new_name) :
	_verifyPath(path)
	_verifyFolderName(new_name)
	if path == "/" :
		raise UserError('INVALID_PATH')

	with redis_lock.Lock(rdb, f"folderEdit:{str(makeUserMeta(user))}:{path}"), MongoTransaction(client) as s :
		folder_obj = _findFolder(user, path)
		filterOperation('renameFolder', user, folder_obj)

		parent_path, cur_folder = _parentPath(path)
		if '\\' in cur_folder :
			raise UserError('INVALID_PATH')
		if db.playlist_folders.find_one({'user': makeUserMeta(user), 'path': parent_path + new_name + '/'}) :
			raise UserError('FOLDER_ALREADY_EXIST')
		parent_path_escaped = re.escape(parent_path)
		cur_folder_esacped = re.escape(cur_folder)
		query_regex = f'^{parent_path_escaped}{cur_folder_esacped}\\/.*'
		replace_regex = re.compile(f'^({parent_path_escaped})({cur_folder_esacped})(\\/.*)')
		paths = db.playlist_folders.find({'user': makeUserMeta(user), 'path': {'$regex': query_regex}}, session = s())
		db.playlist_folders.update_one({'user': makeUserMeta(user), 'path': {'$regex': f'^{parent_path_escaped}{cur_folder_esacped}\\/$'}}, {'$set': {'name': new_name}}, session = s())
		new_name_escaped = re.escape(new_name)
		for p in paths :
			new_path = replace_regex.sub(rf'\g<1>{new_name}\g<3>', p['path'])
			db.playlist_folders.update_one({'_id': p['_id']}, {'$set': {'path': new_path}}, session = s())
		db.playlist_folders.update_one({'user': makeUserMeta(user), 'path': {'$regex': query_regex}}, {'$set': {
			'meta.modified_by': makeUserMeta(user),
			'meta.modified_at': datetime.now()
		}}, session = s())
		s.mark_succeed()
		return parent_path + new_name + '/'
Example #4
0
def removePlaylistsFromFolder(user, path, playlists):
    _verifyPath(path)

    with redis_lock.Lock(
            rdb,
            f"folderEdit:{str(makeUserMeta(user))}:{path}"), MongoTransaction(
                client) as s:
        folder_obj = _findFolder(user, path)
        filterOperation('addPlaylistsToFolder', user, folder_obj)

        for pid in playlists:
            fullpath = path + "\\" + pid + "\\/"
            path_escaped = re.escape(fullpath)
            query_regex = f'^{path_escaped}.*'
            db.playlist_folders.delete_one(
                {
                    'user': makeUserMeta(user),
                    'path': {
                        '$regex': query_regex
                    }
                },
                session=s())

        db.playlist_folders.update_one({'_id': folder_obj['_id']}, {
            '$set': {
                'meta.modified_by': makeUserMeta(user),
                'meta.modified_at': datetime.now()
            }
        },
                                       session=s())
        s.mark_succeed()
Example #5
0
def changeFolderAccess(user, path, privateView, privateEdit, recursive = True) :
	_verifyPath(path)

	with redis_lock.Lock(rdb, f"folderEdit:{str(makeUserMeta(user))}:{path}"), MongoTransaction(client) as s :
		folder_obj = _findFolder(user, path)
		filterOperation('changeFolderAccess', user, folder_obj)

		path_escaped = re.escape(path)
		if recursive :
			query_regex = f'^{path_escaped}.*'
		else :
			query_regex = f'^{path_escaped}$'
		db.playlist_folders.update_many(
		{
			'user': makeUserMeta(user),
			'path': {'$regex': query_regex}
		},
		{
			'$set': {
				'privateView': privateView,
				'privateEdit': privateEdit
			}
		}, session = s())
		db.playlist_folders.update_one({'_id': folder_obj['_id']}, {'$set': {
			'meta.modified_by': makeUserMeta(user),
			'meta.modified_at': datetime.now()
		}}, session = s())
		s.mark_succeed()
Example #6
0
def addPlaylistsToFolder(user, path, playlists) :
	_verifyPath(path)

	with redis_lock.Lock(rdb, f"folderEdit:{str(makeUserMeta(user))}:{path}"), MongoTransaction(client) as s :
		folder_obj = _findFolder(user, path)
		filterOperation('addPlaylistsToFolder', user, folder_obj)

		for pid in playlists :
			playlist = playlist_db.retrive_item(pid, session = s())
			if playlist is None :
				continue # skip non-exist playlist
			if playlist['item']['private'] and not filterOperation('viewPrivatePlaylist', user, playlist, raise_exception = False) :
				continue # skip other's private playlist
			playlist_path = path + "\\" + str(playlist['_id']) + "\\/"
			if _findFolder(user, playlist_path, raise_exception = False) :
				continue # skip duplicated playlist
			playlist_obj = {
				'user': makeUserMeta(user),
				'leaf': True,
				'playlist': playlist['_id'],
				'name': None,
				'path': playlist_path,
				'privateView': folder_obj['privateView'],
				'privateEdit': folder_obj['privateEdit'],
				'meta': makeUserMetaObject(user)
			}
			db.playlist_folders.insert_one(playlist_obj, session = s())

		db.playlist_folders.update_one({'_id': folder_obj['_id']}, {'$set': {
			'meta.modified_by': makeUserMeta(user),
			'meta.modified_at': datetime.now()
		}}, session = s())
		s.mark_succeed()
Example #7
0
def insertIntoPlaylist(pid, vid, rank, user) :
	log(obj = {'pid': pid, 'vid': vid, 'rank': rank})
	with redis_lock.Lock(rdb, "playlistEdit:" + str(pid)), MongoTransaction(client) as s :
		playlist = db.playlists.find_one({'_id': ObjectId(pid)}, session = s())
		if playlist is None :
			raise UserError('PLAYLIST_NOT_EXIST')
		filterOperation('editPlaylist', user, playlist)
		if tagdb.retrive_item({'_id': ObjectId(vid)}, session = s()) is None :
			raise UserError('VIDEO_NOT_EXIST')
		if playlist["videos"] > PlaylistConfig.MAX_VIDEO_PER_PLAYLIST :
			raise UserError('VIDEO_LIMIT_EXCEEDED')
		conflicting_item = db.playlist_items.find_one({'pid': ObjectId(pid), 'vid': ObjectId(vid)}, session = s())
		if conflicting_item is not None :
			editPlaylist_MoveLockFree(pid, conflicting_item, rank, session = s())
			db.playlists.update_one({'_id': ObjectId(pid)}, {'$set': {
				'meta.modified_by': makeUserMeta(user),
				'meta.modified_at': datetime.now()}}, session = s())
			s.mark_succeed()
			return
		if rank < 0 :
			raise UserError('OUT_OF_RANGE')
		if rank > playlist['videos'] :
			rank = int(playlist['videos'])
		playlists = tagdb.retrive_item({'_id': ObjectId(vid)}, session = s())['item']['series']
		playlists.append(ObjectId(pid))
		playlists = list(set(playlists))
		tagdb.update_item_query(ObjectId(vid), {'$set': {'item.series': playlists}}, makeUserMeta(user), session = s())
		db.playlists.update_one({"_id": ObjectId(pid)}, {"$inc": {"videos": int(1)}}, session = s())
		db.playlist_items.update_many({'pid': ObjectId(pid), 'rank': {'$gte': rank}}, {'$inc': {'rank': int(1)}}, session = s())
		db.playlist_items.insert_one({"pid": ObjectId(pid), "vid": ObjectId(vid), "rank": int(rank), "meta": makeUserMeta(user)}, session = s())
		db.playlists.update_one({'_id': ObjectId(pid)}, {'$set': {
			'meta.modified_by': makeUserMeta(user),
			'meta.modified_at': datetime.now()}}, session = s())
		s.mark_succeed()
Example #8
0
def editVideoTagsQuery(query, query_type, tags_to_add, tags_to_remove, user):
    if query_type not in ['tag', 'text']:
        raise UserError('INCORRECT_QUERY_TYPE')
    filterOperation('batchVideoTagEdit', user)
    query_obj, _ = tagdb.compile_query(query)
    log(obj={'query': dumps(query_obj)})
    tagids_to_add = tagdb.filter_and_translate_tags(tags_to_add)
    tagids_to_remove = tagdb.filter_and_translate_tags(tags_to_remove)
    try:
        count = 0
        with MongoTransaction(client) as s_read, MongoTransaction(
                client) as s_write:
            result_cursor = tagdb.retrive_items(query_obj, session=s_read())
            batch = _batchedRead(result_cursor)
            while batch:
                item_ids = [item['_id'] for item in batch]
                tagdb.update_many_items_tags_pull(item_ids,
                                                  tagids_to_remove,
                                                  makeUserMeta(user),
                                                  session=s_write())
                tagdb.update_many_items_tags_merge(item_ids,
                                                   tagids_to_add,
                                                   makeUserMeta(user),
                                                   session=s_write())
                count += len(batch)
                batch = _batchedRead(result_cursor)
            s_write.mark_succeed()
        return count
    except pymongo.errors.OperationFailure as ex:
        if '$not' in str(ex):
            raise UserError('FAILED_NOT_OP')
        else:
            log(level='ERR', obj={'ex': str(ex)})
            raise UserError('FAILED_UNKNOWN')
Example #9
0
def addVideoToPlaylist(pid, vid, user):
    log(obj={'pid': pid, 'vid': vid})
    with redis_lock.Lock(rdb, "playlistEdit:" +
                         str(pid)), MongoTransaction(client) as s:
        playlist = playlist_db.retrive_item(pid)
        if playlist is None:
            raise UserError('PLAYLIST_NOT_EXIST')
        filterOperation('editPlaylist', user, playlist)
        if tagdb.retrive_item({'_id': ObjectId(vid)}, session=s()) is None:
            raise UserError('VIDEO_NOT_EXIST')
        if playlist['item']["videos"] > PlaylistConfig.MAX_VIDEO_PER_PLAYLIST:
            raise UserError('VIDEO_LIMIT_EXCEEDED')
        conflicting_item = db.playlist_items.find_one(
            {
                'pid': ObjectId(pid),
                'vid': ObjectId(vid)
            }, session=s())
        if conflicting_item is not None:
            editPlaylist_MoveLockFree(pid,
                                      conflicting_item,
                                      int(playlist['item']["videos"]),
                                      session=s())
            playlist_db.update_item_query(playlist, {},
                                          user=makeUserMeta(user),
                                          session=s())
            s.mark_succeed()
            return
        playlists = tagdb.retrive_item({'_id': ObjectId(vid)},
                                       session=s())['item']['series']
        playlists.append(ObjectId(pid))
        playlists = list(set(playlists))
        tagdb.update_item_query(ObjectId(vid),
                                {'$set': {
                                    'item.series': playlists
                                }},
                                user=makeUserMeta(user),
                                session=s())
        db.playlist_items.insert_one(
            {
                "pid": ObjectId(pid),
                "vid": ObjectId(vid),
                "rank": int(playlist['item']["videos"]),
                "meta": makeUserMeta(user)
            },
            session=s())
        playlist_db.update_item_query(playlist,
                                      {"$inc": {
                                          "item.videos": int(1)
                                      }},
                                      user=makeUserMeta(user),
                                      session=s())
        s.mark_succeed()
Example #10
0
def updatePlaylistInfo(pid,
                       title,
                       desc,
                       cover,
                       user,
                       private=False,
                       privateEdit=True):
    log(
        obj={
            'title': title,
            'desc': desc,
            'cover': cover,
            'private': private,
            'privateEdit': privateEdit
        })
    if len(title) > PlaylistConfig.MAX_TITLE_LENGTH:
        raise UserError('TITLE_TOO_LONG')
    if len(desc) > PlaylistConfig.MAX_DESC_LENGTH:
        raise UserError('DESC_TOO_LONG')
    if cover and len(cover) > PlaylistConfig.MAX_COVER_URL_LENGTH:
        raise UserError('URL_TOO_LONG')
    if not title:
        raise UserError('EMPTY_TITLE')
    if not desc:
        raise UserError('EMPTY_DESC')
    with redis_lock.Lock(rdb, "playlistEdit:" +
                         str(pid)), MongoTransaction(client) as s:
        list_obj = playlist_db.retrive_item(pid)
        log(obj={'playlist': list_obj})
        if list_obj is None:
            raise UserError('PLAYLIST_NOT_EXIST')
        filterOperation('editPlaylist', user, list_obj)
        if cover:
            playlist_db.update_item_query(list_obj,
                                          {'$set': {
                                              "item.cover": cover
                                          }},
                                          user=makeUserMeta(user),
                                          session=s())
        playlist_db.update_item_query(
            list_obj, {
                '$set': {
                    "item.title": title,
                    "item.desc": desc,
                    "item.private": private,
                    "item.privateEdit": privateEdit
                }
            },
            fields_to_index=['item.title', 'item.desc'],
            user=makeUserMeta(user),
            session=s())
        s.mark_succeed()
Example #11
0
def breakLink(vid, user):
    filterOperation('breakLink', user, vid)
    with redis_lock.Lock(rdb, 'editLink'), MongoTransaction(client) as s:
        nodes = _getAllCopies(vid)
        log(obj={'old_clique': nodes, 'node_remove': vid})
        if nodes:
            for node in nodes:
                _removeThisCopy(node, vid, makeUserMeta(user), session=s())
            tagdb.update_item_query(ObjectId(vid),
                                    {"$set": {
                                        "item.copies": []
                                    }},
                                    makeUserMeta(user),
                                    session=s())
        s.mark_succeed()
Example #12
0
def editPlaylist_MoveUp(pid, vid, page, page_size, user) :
	log(obj = {'pid': pid, 'vid': vid})
	with redis_lock.Lock(rdb, "playlistEdit:" + str(pid)), MongoTransaction(client) as s :
		playlist = db.playlists.find_one({'_id': ObjectId(pid)}, session = s())
		if playlist is None :
			raise UserError('PLAYLIST_NOT_EXIST')
		filterOperation('editPlaylist', user, playlist)
		if playlist["videos"] > 0 :
			entry = db.playlist_items.find_one({"pid": ObjectId(pid), "vid": ObjectId(vid)}, session = s())
			if entry is None :
				s.mark_failover()
				raise UserError('VIDEO_NOT_EXIST_OR_NOT_IN_PLAYLIST')
			if entry['rank'] <= 0 :
				return None
			exchange_entry = db.playlist_items.find_one({"pid": ObjectId(pid), "rank": int(entry['rank'] - 1)}, session = s())
			db.playlist_items.update_one({'_id': entry['_id']}, {'$set': {'rank': int(entry['rank'] - 1)}}, session = s())
			db.playlist_items.update_one({'_id': exchange_entry['_id']}, {'$set': {'rank': int(entry['rank'])}}, session = s())
			db.playlists.update_one({'_id': ObjectId(pid)}, {'$set': {
				'meta.modified_by': makeUserMeta(user),
				'meta.modified_at': datetime.now()}}, session = s())
			#video_page, video_count = listPlaylistVideos(pid, page - 1, page_size, user)
			s.mark_succeed()
			#return {'videos': video_page, 'video_count': video_count, 'page': page}
		else :
			raise UserError('EMPTY_PLAYLIST')
Example #13
0
def removeVideoFromPlaylist(pid, vid, page, page_size, user) :
	log(obj = {'pid': pid, 'vid': vid})
	with redis_lock.Lock(rdb, "playlistEdit:" + str(pid)), MongoTransaction(client) as s :
		playlist = db.playlists.find_one({'_id': ObjectId(pid)}, session = s())
		if playlist is None :
			raise UserError('PLAYLIST_NOT_EXIST')
		filterOperation('editPlaylist', user, playlist)
		if playlist["videos"] > 0 :
			entry = db.playlist_items.find_one({"pid": ObjectId(pid), "vid": ObjectId(vid)}, session = s())
			if entry is None :
				raise UserError('VIDEO_NOT_EXIST_OR_NOT_IN_PLAYLIST')
			db.playlist_items.update_many({'pid': ObjectId(pid), 'rank': {'$gt': entry['rank']}}, {'$inc': {'rank': int(-1)}}, session = s())
			db.playlist_items.delete_one({'_id': entry['_id']}, session = s())
			db.playlists.update_one({"_id": ObjectId(pid)}, {"$inc": {"videos": int(-1)}}, session = s())
			db.playlists.update_one({'_id': ObjectId(pid)}, {'$set': {
				'meta.modified_by': makeUserMeta(user),
				'meta.modified_at': datetime.now()}}, session = s())
		else :
			raise UserError('EMPTY_PLAYLIST')
		"""
		video_page, video_count = listPlaylistVideos(pid, page - 1, page_size, user)
		if len(video_page) == 0 and page > 1 and video_count > 0 :
			# in case deleting video results in current page becomes empty, show the previous page
			video_page, video_count = listPlaylistVideos(pid, page - 2, page_size, user)
			s.mark_succeed()
			return {'videos': video_page, 'video_count': video_count, 'page': page - 1}
		"""
		s.mark_succeed()
Example #14
0
def updatePlaylistInfo(pid, language, title, desc, cover, user, private = False) :
	log(obj = {'title': title, 'desc': desc, 'cover': cover, 'private': private})
	if len(title) > PlaylistConfig.MAX_TITLE_LENGTH :
		raise UserError('TITLE_TOO_LONG')
	if len(desc) > PlaylistConfig.MAX_DESC_LENGTH :
		raise UserError('DESC_TOO_LONG')
	if cover and len(cover) > PlaylistConfig.MAX_COVER_URL_LENGTH :
		raise UserError('URL_TOO_LONG')
	if not title :
		raise UserError('EMPTY_TITLE')
	if not desc :
		raise UserError('EMPTY_DESC')
	with redis_lock.Lock(rdb, "playlistEdit:" + str(pid)), MongoTransaction(client) as s :
		list_obj = db.playlists.find_one({'_id': ObjectId(pid)})
		log(obj = {'playlist': list_obj})
		if list_obj is None :
			raise UserError('PLAYLIST_NOT_EXIST')
		filterOperation('editPlaylist', user, list_obj)
		if cover :
			db.playlists.update_one({'_id': ObjectId(pid)}, {'$set': {"cover": cover}}, session = s())
		db.playlists.update_one({'_id': ObjectId(pid)}, {'$set': {
			"title.%s" % language: title,
			"desc.%s" % language: desc,
			"private": private,
			'meta.modified_by': makeUserMeta(user),
			'meta.modified_at': datetime.now()}}, session = s())
		s.mark_succeed()
Example #15
0
def createFolder(user, root, name, privateView=False, privateEdit=True):
    filterOperation('createFolder', user, root)
    _verifyPath(root)
    _verifyFolderName(name)
    with redis_lock.Lock(rdb, f"folderEdit:{str(makeUserMeta(user))}:{root}"):
        _findFolder(user, root)
        fullpath = root + name + "/"

        with redis_lock.Lock(
                rdb, f"folderEdit:{str(makeUserMeta(user))}:{fullpath}"
        ), MongoTransaction(client) as s:
            obj = _findFolder(user, fullpath, raise_exception=False)
            if obj:
                raise UserError('FOLDER_ALREADY_EXIST')
            folder_obj = {
                'user': makeUserMeta(user),
                'leaf': False,
                'playlist': None,
                'name': name,
                'path': fullpath,
                'privateView': privateView,
                'privateEdit': privateEdit,
                'meta': makeUserMetaObject(user)
            }
            db.playlist_folders.insert_one(folder_obj, session=s())
            s.mark_succeed()
Example #16
0
def updatePlaylistCoverFromFile(pid, user, file_key):
    log(obj={'pid': pid, 'file_key': file_key})

    photo_file = None
    if file_key.startswith("upload-image-"):
        filename = rdb.get(file_key)
        if filename:
            photo_file = filename.decode('ascii')
    if photo_file is None:
        raise UserError('NO_COVER')

    with redis_lock.Lock(rdb, "playlistEdit:" +
                         str(pid)), MongoTransaction(client) as s:
        list_obj = playlist_db.retrive_item(pid)
        log(obj={'playlist': list_obj})
        if list_obj is None:
            raise UserError('PLAYLIST_NOT_EXIST')
        filterOperation('editPlaylist', user, list_obj)
        playlist_db.update_item_query(list_obj,
                                      {'$set': {
                                          "item.cover": photo_file
                                      }},
                                      user=makeUserMeta(user),
                                      session=s())
        s.mark_succeed()
def _findFolder(user, path, raise_exception = True) :
	if isinstance(user, str) :
		user_id = ObjectId(user)
	elif isinstance(user, dict) :
		user_id = makeUserMeta(user)
	elif isinstance(user, ObjectId) :
		user_id = user
	else :
		assert False
	obj = db.playlist_folders.find_one({'user': user_id, 'path': path})
	if obj is None :
		if path == '/' :
			with MongoTransaction(client) as s :
				obj = {
					'user': user_id,
					'leaf': False,
					'playlist': None,
					'name': "",
					'path': "/",
					'privateView': False,
					'privateEdit': True,
					'meta': {
						'created_by': user_id,
						'created_at': datetime.utcnow()
					}
				}
				db.playlist_folders.insert_one(obj, session = s())
				s.mark_succeed()
			return obj
		else :
			if raise_exception :
				raise UserError('FOLDER_NOT_EXIST')
			else :
				return None
	return obj
Example #18
0
def createPlaylist(title, desc, cover, user, private=False, privateEdit=True):
    log(
        obj={
            'title': title,
            'desc': desc,
            'cover': cover,
            'private': private,
            'privateEdit': privateEdit
        })
    filterOperation('createPlaylist', user)
    if len(title) > PlaylistConfig.MAX_TITLE_LENGTH:
        raise UserError('TITLE_TOO_LONG')
    if len(desc) > PlaylistConfig.MAX_DESC_LENGTH:
        raise UserError('DESC_TOO_LONG')
    if len(cover) > PlaylistConfig.MAX_COVER_URL_LENGTH:
        raise UserError('URL_TOO_LONG')
    if not cover:
        cover = 'default-cover.jpg'
    if not title:
        raise UserError('EMPTY_TITLE')
    if not desc:
        raise UserError('EMPTY_DESC')
    pid = playlist_db.add_item(
        [], {
            "title": title,
            "desc": desc,
            "private": private,
            "privateEdit": privateEdit,
            "views": int(0),
            "videos": int(0),
            "cover": cover
        }, 3, ['title', 'desc'], makeUserMeta(user))
    log(obj={'pid': pid})
    return pid
Example #19
0
def updatePlaylistCoverVID(pid, vid, page, page_size, user):
    log(obj={'pid': pid, 'vid': vid})
    with redis_lock.Lock(rdb, "playlistEdit:" +
                         str(pid)), MongoTransaction(client) as s:
        list_obj = db.playlists.find_one({'_id': ObjectId(pid)})
        log(obj={'playlist': list_obj})
        if list_obj is None:
            raise UserError('PLAYLIST_NOT_EXIST')
        filterOperation('editPlaylist', user, list_obj)
        video_obj = filterSingleVideo(vid, user)
        if video_obj is None:
            raise UserError('VIDEO_NOT_EXIST')
        cover = video_obj['item']['cover_image']
        db.playlists.update_one({'_id': ObjectId(pid)},
                                {'$set': {
                                    "cover": cover
                                }},
                                session=s())
        db.playlists.update_one({'_id': ObjectId(pid)}, {
            '$set': {
                'meta.modified_by': makeUserMeta(user),
                'meta.modified_at': datetime.now()
            }
        },
                                session=s())
        #video_page, video_count = listPlaylistVideos(pid, page - 1, page_size, user)
        s.mark_succeed()
Example #20
0
def listSubscriptedItems(user,
                         page_idx,
                         page_size,
                         user_language,
                         hide_placeholder=True,
                         order='latest_video'):
    subs = list(db.subs.find({'meta.created_by': makeUserMeta(user)}))
    q = [tagdb.compile_query(q['qs'], q['qt']) for q in subs]
    query_obj = {'$or': []}
    for qi, _ in q:
        query_obj['$or'].append(qi)
    for i in range(len(q)):
        subs[i]['obj'] = q[i][0]
        subs[i]['obj_tags'] = q[i][1]
    default_blacklist_tagids = [
        int(i) for i in Config.DEFAULT_BLACKLIST.split(',')
    ]
    if user and 'settings' in user:
        if user['settings']['blacklist'] == 'default':
            query_obj = {
                '$and':
                [query_obj, {
                    'tags': {
                        '$nin': default_blacklist_tagids
                    }
                }]
            }
        else:
            query_obj = {
                '$and':
                [query_obj, {
                    'tags': {
                        '$nin': user['settings']['blacklist']
                    }
                }]
            }
    elif user is None:
        query_obj = {
            '$and': [query_obj, {
                'tags': {
                    '$nin': default_blacklist_tagids
                }
            }]
        }
    result = tagdb.retrive_items(query_obj)
    if order == 'latest':
        result = result.sort([("meta.created_at", -1)])
    if order == 'oldest':
        result = result.sort([("meta.created_at", 1)])
    if order == 'video_latest':
        result = result.sort([("item.upload_time", -1)])
    if order == 'video_oldest':
        result = result.sort([("item.upload_time", 1)])
    ret = result.skip(page_idx * page_size).limit(page_size)
    count = ret.count()
    videos = [item for item in ret]
    videos = filterVideoList(videos, user)
    if hide_placeholder:
        videos = _filterPlaceholder(videos)
    return videos, subs, getCommonTags(user_language, videos), count
Example #21
0
def listSubscriptionTags(user):
    return list(
        db.subs.find({
            'meta.created_by': makeUserMeta(user),
            'tagid': {
                '$exists': True
            }
        }))
Example #22
0
def removeAlias(user, alias):
    with MongoTransaction(client) as s:
        alias_obj = tagdb.db.tag_alias.find_one({'tag': alias}, session=s())
        if alias_obj:
            log(obj={'alias': alias, 'dst': alias_obj['dst']})
            filterOperation('tagAdmin', user, alias_obj)
        tagdb.remove_alias(alias, makeUserMeta(user), session=s())
        s.mark_succeed()
Example #23
0
def removeTag(user, tag):
    log(obj={'tag': tag})
    with MongoTransaction(client) as s:
        tag_obj = tagdb.get_tag_object(tag, session=s())
        log(obj={'tag_obj': tag_obj})
        if tag_obj:
            filterOperation('tagAdmin', user, tag_obj)
        tagdb.remove_tag(tag_obj, makeUserMeta(user), session=s())
        s.mark_succeed()
Example #24
0
def transferCategory(user, tag, new_cat):
    log(obj={'tag': tag, 'new_cat': new_cat})
    with MongoTransaction(client) as s:
        tag_obj = tagdb.get_tag_object(tag, session=s())
        if tag_obj:
            filterOperation('transferCategory', user, tag_obj)
        tagdb.transfer_category(tag_obj,
                                new_cat,
                                makeUserMeta(user),
                                session=s())
        s.mark_succeed()
Example #25
0
def editTags_impl(item, tags, user, edit_behaviour):
    with redis_lock.Lock(
            rdb, "videoEdit:" +
            item['item']['unique_id']), MongoTransaction(client) as s:
        new_tagids = tagdb.update_item_tags(item,
                                            tags,
                                            makeUserMeta(user),
                                            session=s(),
                                            behaviour=edit_behaviour)
        s.mark_succeed()
        return new_tagids
Example #26
0
def deleteFolder(user, path) :
	_verifyPath(path)

	with redis_lock.Lock(rdb, f"folderEdit:{str(makeUserMeta(user))}:{path}"), MongoTransaction(client) as s :
		folder_obj = _findFolder(user, path)
		filterOperation('deleteFolder', user, folder_obj)

		path_escaped = re.escape(path)
		query_regex = f'^{path_escaped}.*'
		db.playlist_folders.delete_many({'user': makeUserMeta(user), 'path': {'$regex': query_regex}}, session = s())
		s.mark_succeed()
Example #27
0
def addVideoToPlaylistLockFree(pid, vid, user, rank, session):
    log(obj={'pid': pid, 'vid': vid})
    if tagdb.retrive_item({'_id': ObjectId(vid)}, session=session) is None:
        #raise UserError('VIDEO_NOT_EXIST')
        return False
    conflicting_item = db.playlist_items.find_one(
        {
            'pid': ObjectId(pid),
            'vid': ObjectId(vid)
        }, session=session)
    if conflicting_item is not None:
        editPlaylist_MoveLockFree(pid, conflicting_item, rank, session=session)
        playlist_db.update_item_query(pid, {},
                                      user=makeUserMeta(user),
                                      session=session)
        return False
    playlists = tagdb.retrive_item({'_id': ObjectId(vid)},
                                   session=session)['item']['series']
    playlists.append(ObjectId(pid))
    playlists = list(set(playlists))
    tagdb.update_item_query(ObjectId(vid),
                            {'$set': {
                                'item.series': playlists
                            }},
                            user=makeUserMeta(user),
                            session=session)
    db.playlist_items.insert_one(
        {
            "pid": ObjectId(pid),
            "vid": ObjectId(vid),
            "rank": int(rank),
            "meta": makeUserMeta(user)
        },
        session=session)
    playlist_db.update_item_query(pid, {"$inc": {
        "item.videos": int(1)
    }},
                                  user=makeUserMeta(user),
                                  session=session)
    return True
Example #28
0
def postSubtitle(user, vid: ObjectId, language: str, subformat: str,
                 content: str):
    if language not in VALID_LANGUAGES:
        raise UserError('INVALID_LANGUAGE')
    subformat = subformat.lower()
    if subformat not in VALID_SUBTITLE_FORMAT:
        raise UserError('INVALID_SUBTITLE_FORMAT')
    video_item = tagdb.retrive_item(vid)
    if video_item is None:
        raise UserError('VIDEO_NOT_FOUND')
    try:
        size = len(content.encode('utf-8'))
    except:
        size = -1
    filterOperation('postSubtitle', user)
    with redis_lock.Lock(
            rdb, "videoEdit:" +
            video_item['item']['unique_id']), MongoTransaction(client) as s:
        existing_item = db.subtitles.find_one(
            {
                'vid': vid,
                'lang': language,
                'format': subformat,
                'meta.created_by': makeUserMeta(user)
            },
            session=s())
        if existing_item is None:
            subid = db.subtitles.insert_one(
                {
                    'vid': vid,
                    'lang': language,
                    'format': subformat,
                    'content': content,
                    'size': size,
                    'deleted': False,
                    'autogen': False,
                    'version': 0,
                    'meta': makeUserMetaObject(user)
                },
                session=s()).inserted_id
        else:
            db.subtitles.update_one({'_id': existing_item['_id']}, {
                '$set': {
                    'content': content,
                    'size': size,
                    'meta.modified_at': datetime.utcnow()
                }
            },
                                    session=s())
            subid = existing_item['_id']
        s.mark_succeed()
        return ObjectId(subid)
Example #29
0
def updatePlaylistCover(pid, cover, user) :
	log(obj = {'pid': pid, 'cover': cover})
	with redis_lock.Lock(rdb, "playlistEdit:" + str(pid)), MongoTransaction(client) as s :
		list_obj = db.playlists.find_one({'_id': ObjectId(pid)})
		log(obj = {'playlist': list_obj})
		if list_obj is None :
			raise UserError('PLAYLIST_NOT_EXIST')
		filterOperation('editPlaylist', user, list_obj)
		db.playlists.update_one({'_id': ObjectId(pid)}, {'$set': {"cover": cover}}, session = s())
		db.playlists.update_one({'_id': ObjectId(pid)}, {'$set': {
			'meta.modified_by': makeUserMeta(user),
			'meta.modified_at': datetime.now()}}, session = s())
		s.mark_succeed()
Example #30
0
def addTag_impl(user, tag, category, language):
    ret, sanitized_tag = verifyAndSanitizeTagOrAlias(tag)
    log(obj={'tag': sanitized_tag, 'cat': category, 'lang': language})
    filterOperation('addTag', user)
    if not ret:
        raise UserError('INVALID_TAG')
    if len(sanitized_tag) > TagsConfig.MAX_TAG_LENGTH:
        raise UserError('TAG_TOO_LONG')
    with MongoTransaction(client) as s:
        tagdb.add_tag(sanitized_tag,
                      category,
                      language,
                      makeUserMeta(user),
                      session=s())
        s.mark_succeed()