def edit(data): ''' takes { id ... } setting identifier or base metadata is possible not both at the same time id can be one id or list of ids ''' response = {} ids = data['id'] if isinstance(ids, str): ids = [ids] edited = [] for id in ids: item = models.Item.get(id) if item and item.json()['mediastate'] == 'available': if 'primaryid' in data: if data['primaryid']: key, value = data['primaryid'] logger.debug('update primaryid %s %s', key, value) value = cleanup_id(key, value) item.update_primaryid(key, value) else: item.update_primaryid() response = item.json() else: item.edit_metadata(data) response = item.json() edited.append(id) else: logger.info('can only edit available items %s', id) if len(ids) > 1: response = data response['id'] = edited for key in list(state.cache): if key.startswith('group:'): state.cache.delete(key) state.user().clear_smart_list_cache() return response
def edit(self, data): changed = {} for key in data: if key == 'id': continue if data[key] != self.data.get(key): self.data[key] = data[key] changed[key] = data[key] if changed: self.save() user = state.user() Changelog.record(user, 'editmeta', self.key, self.value, changed) return changed
def setPreferences(data): """ takes { key: value, 'sub.key': value } """ update_dict(settings.preferences, data) if "username" in data: u = state.user() u.update_name() u.save() return settings.preferences
def setPreferences(data): ''' takes { key: value, 'sub.key': value } ''' update_dict(settings.preferences, data) if 'username' in data: u = state.user() u.update_name() u.save() return settings.preferences
def update_peering(self, peered, username=None): was_peering = self.peered if peered: logging.debug('update_peering, pending: %s queued: %s', self.pending, self.queued) self.queued = self.pending != 'sent' self.pending = '' if username: self.info['username'] = username self.update_name() # FIXME: need to set peered to False to not trigger changelog event # before other side receives acceptPeering request self.peered = False self.save() if not was_peering: Changelog.record(state.user(), 'addpeer', self.id, self.nickname) self.peered = True self.save() else: self.pending = '' self.peered = False self.queued = False self.update_name() self.save() List.query.filter_by(user_id=self.id).delete() for i in self.items: i.users.remove(self) if not i.users: i.delete() Changelog.query.filter_by(user_id=self.id).delete() if self.id in settings.ui['showFolder']: del settings.ui['showFolder'][self.id] self.clear_list_cache() self.save() if was_peering: Changelog.record(state.user(), 'removepeer', self.id) self.save()
def remove(data): ''' takes { id } ''' logger.debug('remove files %s', data) if 'ids' in data and data['ids']: for i in models.Item.query.filter(models.Item.id.in_(data['ids'])): i.remove_file() u = state.user() u.clear_smart_list_cache() u.clear_list_cache() return {'items': []}
def remove(data): ''' takes { id } ''' logger.debug('remove files %s', data) if 'ids' in data and data['ids']: for i in models.Item.query.filter(models.Item.id.in_(data['ids'])): i.remove_file() u = state.user() u.clear_smart_list_cache() u.clear_list_cache() return { 'items': [] }
def create(cls, user_id, name, query=None): prefix = name n = 2 while cls.get(user_id, name): name = '%s [%s]' % (prefix, n) n += 1 l = cls(user_id=user_id, name=name) l._query = query l.type = 'smart' if l._query else 'static' l.index_ = cls.query.filter_by(user_id=user_id).count() state.db.session.add(l) state.db.session.commit() if user_id == settings.USER_ID: if not l._query and name != '': Changelog.record(state.user(), 'addlist', l.name) return l
def remove_file(self): for f in self.files.all(): path = f.fullpath() if os.path.exists(path): os.unlink(path) remove_empty_folders(os.path.dirname(path)) state.db.session.delete(f) user = state.user() if user in self.users: self.users.remove(user) for l in self.lists.filter_by(user_id=user.id): l.items.remove(self) state.db.session.commit() if not self.users: self.delete() else: self.update() Transfer.query.filter_by(item_id=self.id).delete() Changelog.record(user, 'removeitem', self.id)
def sortLists(data): """ takes { ids } """ n = 0 logger.debug("sortLists %s", data) lists = [] for id in data["ids"]: l = models.List.get(id) l.index_ = n n += 1 if l.type == "static": lists.append(l.name) state.db.session.add(l) state.db.session.commit() if lists: Changelog.record(state.user(), "orderlists", lists) return {}
def update_meta(self, data): update = False record = {} for key in self.meta_keys: if key in data: if self.meta.get(key) != data[key]: record[key] = data[key] self.meta[key] = data[key] update = True for key in list(self.meta): if key not in self.meta_keys: del self.meta[key] update = True if update: self.update() self.modified = datetime.utcnow() self.save() user = state.user() if record and user in self.users: Changelog.record(user, 'edititem', self.id, record)
def sortLists(data): ''' takes { ids } ''' n = 0 logger.debug('sortLists %s', data) lists = [] for id in data['ids']: l = models.List.get(id) l.index_ = n n += 1 if l.type == 'static': lists.append(l.name) state.db.session.add(l) state.db.session.commit() if lists: Changelog.record(state.user(), 'orderlists', lists) return {}
def save_file(self, content): u = state.user() f = File.get(self.id) content_id = media.get_id(data=content) if content_id != self.id: logger.debug('INVALID CONTENT %s vs %s', self.id, content_id) return False if not f: path = 'Downloads/%s.%s' % (self.id, self.info['extension']) info = self.info.copy() for key in ('mediastate', 'coverRatio', 'previewRatio'): if key in info: del info[key] f = File.get_or_create(self.id, info, path=path) path = self.get_path() if not os.path.exists(path): ox.makedirs(os.path.dirname(path)) with open(path, 'wb') as fd: fd.write(content) if u not in self.users: self.add_user(u) t = Transfer.get_or_create(self.id) t.progress = 1 t.save() self.added = datetime.utcnow() Changelog.record(u, 'additem', self.id, f.info) self.update() f.move() self.update_icons() self.save() trigger_event('transfer', { 'id': self.id, 'progress': 1 }) return True else: logger.debug('TRIED TO SAVE EXISTING FILE!!!') t = Transfer.get_or_create(self.id) t.progress = 1 t.save() self.update() return False
def cancelDownloads(data): ''' takes { ids } ''' response = {} ids = data['ids'] if ids: for item in models.Item.query.filter(models.Item.id.in_(ids)): t = models.Transfer.get(item.id) t.progress = None t.added = None t.save() p = state.user() if p in item.users: item.users.remove(p) for l in item.lists.filter_by(user_id=settings.USER_ID): l.items.remove(item) item.update() response = {'status': 'cancelled'} return response
def editList(data): ''' takes { id name query } ''' logger.debug('editList %s', data) l = models.List.get_or_create(data['id']) name = l.name if 'name' in data: l.name = data['name'] if 'query' in data and l.type != 'smart': raise Exception('query only for smart lists') if 'query' in data and l.type == 'smart': validate_query(data['query']) l._query = data['query'] if l.type == 'static' and name != l.name: Changelog.record(state.user(), 'editlist', name, {'name': l.name}) l.save() l.user.clear_smart_list_cache() return l.json()
def editList(data): """ takes { id name query } """ logger.debug("editList %s", data) l = models.List.get_or_create(data["id"]) name = l.name if "name" in data: l.name = data["name"] if "query" in data and l.type != "smart": raise Exception("query only for smart lists") if "query" in data and l.type == "smart": validate_query(data["query"]) l._query = data["query"] if l.type == "static" and name != l.name: Changelog.record(state.user(), "editlist", name, {"name": l.name}) l.save() l.user.clear_smart_list_cache() return l.json()
def update_primaryid(self, key=None, id=None, scrape=True): if key is None and id is None: if 'primaryid' not in self.meta: return else: key = self.meta['primaryid'][0] record = {} if id: if not key in self.meta or not key in self.meta[key]: self.meta[key] = list(set([id] + self.meta.get(key, []))) self.meta['primaryid'] = [key, id] record[key] = id else: if key in self.meta: del self.meta[key] if 'primaryid' in self.meta: del self.meta['primaryid'] record[key] = '' for k in self.id_keys: if k != key: if k in self.meta: del self.meta[k] logger.debug('set primaryid %s %s', key, id) # get metadata from external resources if scrape: self.scrape() self.update_icons() self.modified = datetime.utcnow() self.save() #if not scrape: # Scrape.get_or_create(self.id) for f in self.files.all(): f.move() user = state.user() if user in self.users: Changelog.record(user, 'edititem', self.id, record)
def add_file(id, f, prefix, from_=None): user = state.user() path = f[len(prefix) :] data = media.metadata(f, from_) file = File.get_or_create(id, data, path) item = file.item if "primaryid" in file.info: del file.info["primaryid"] state.db.session.add(file) if "primaryid" in item.info: item.meta["primaryid"] = item.info.pop("primaryid") state.db.session.add(item) item.add_user(user) Changelog.record(user, "additem", item.id, file.info) item.added = datetime.utcnow() if state.online: item.scrape() # Changelog.record(user, 'edititem', item.id, dict([item.meta['primaryid']])) Changelog.record(user, "edititem", item.id, item.meta) item.update_icons() item.modified = datetime.utcnow() item.update() # Scrape.get_or_create(item.id) return file
def add_file(id, f, prefix, from_=None): user = state.user() path = f[len(prefix):] data = media.metadata(f, from_) file = File.get_or_create(id, data, path) item = file.item if 'primaryid' in file.info: del file.info['primaryid'] state.db.session.add(file) if 'primaryid' in item.info: item.meta['primaryid'] = item.info.pop('primaryid') state.db.session.add(item) item.add_user(user) Changelog.record(user, 'additem', item.id, file.info) item.added = datetime.utcnow() if state.online: item.scrape() #Changelog.record(user, 'edititem', item.id, dict([item.meta['primaryid']])) Changelog.record(user, 'edititem', item.id, item.meta) item.update_icons() item.modified = datetime.utcnow() item.update() #Scrape.get_or_create(item.id) return file
def queue_download(self): u = state.user() if not u in self.users: t = Transfer.get_or_create(self.id) logger.debug('queue %s for download', self.id) self.add_user(u)
def reset(self): user = state.user() Changelog.record(user, 'resetmeta', self.key, self.value) state.db.session.delete(self) state.db.session.commit() self.update_items()