Exemple #1
0
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
Exemple #2
0
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
Exemple #4
0
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
Exemple #5
0
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()
Exemple #7
0
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': []}
Exemple #8
0
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
Exemple #10
0
 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)
Exemple #11
0
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 {}
Exemple #12
0
 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)
Exemple #13
0
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 {}
Exemple #14
0
 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
Exemple #15
0
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
Exemple #16
0
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
Exemple #17
0
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()
Exemple #18
0
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()
Exemple #19
0
    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)
Exemple #20
0
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
Exemple #21
0
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
Exemple #22
0
 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)
Exemple #23
0
 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()