user per peer library (sqlitedict)
This commit is contained in:
parent
cb382287f5
commit
0ca89db3cd
11 changed files with 472 additions and 60 deletions
|
|
@ -3,7 +3,6 @@
|
|||
from datetime import datetime
|
||||
import base64
|
||||
import hashlib
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
|
|
@ -98,6 +97,13 @@ class Item(db.Model):
|
|||
def find(cls, data):
|
||||
return Parser(cls, user_items, Find, Sort).find(data)
|
||||
|
||||
@classmethod
|
||||
def remove_many(cls, ids):
|
||||
Find.query.filter(Find.item_id.in_(ids)).delete(synchronize_session=False)
|
||||
Sort.query.filter(Sort.item_id.in_(ids)).delete(synchronize_session=False)
|
||||
cls.query.filter(cls.id.in_(ids)).delete(synchronize_session=False)
|
||||
state.db.session.expire_all()
|
||||
|
||||
def add_user(self, user):
|
||||
if not user in self.users:
|
||||
self.users.append(user)
|
||||
|
|
@ -336,7 +342,7 @@ class Item(db.Model):
|
|||
f.move()
|
||||
|
||||
def get_hash(self):
|
||||
return utils.get_meta_hash(self.meta.copy())
|
||||
return utils.get_meta_hash(self.meta)
|
||||
|
||||
def get_sorttitle(self):
|
||||
title = self.meta.get('sorttitle')
|
||||
|
|
@ -346,7 +352,6 @@ class Item(db.Model):
|
|||
return title
|
||||
|
||||
def sync_metadata(self):
|
||||
from user.models import Metadata
|
||||
if self.meta.get('sharemetadata'):
|
||||
return
|
||||
peers = [u for u in self.users if u.id != settings.USER_ID]
|
||||
|
|
@ -355,34 +360,44 @@ class Item(db.Model):
|
|||
first_peer = None
|
||||
# get first peer with sharemetadata set
|
||||
for u in peers:
|
||||
m = Metadata.get(u.id, self.id)
|
||||
peer = utils.get_peer(u.id)
|
||||
if self.id in peer.library:
|
||||
m = peer.library[self.id].get('meta')
|
||||
else:
|
||||
m = None
|
||||
if m:
|
||||
if m.data.get('sharemetadata'):
|
||||
sync_from = m
|
||||
if m.get('sharemetadata'):
|
||||
sync_from = u.id
|
||||
break
|
||||
if not first_peer:
|
||||
first_peer = m
|
||||
first_peer = u.id
|
||||
# of fall back to first peer that has this item
|
||||
# in case its not available locally
|
||||
if not sync_from and self.info.get('mediastate') != 'available' and first_peer:
|
||||
#logger.debug('syncing from first peer that has item %s', first_peer)
|
||||
sync_from = first_peer
|
||||
if sync_from:
|
||||
if self.get_hash() != sync_from.data_hash:
|
||||
logger.debug('update %s with metadata from %s', self, sync_from.user_id)
|
||||
peer = utils.get_peer(sync_from)
|
||||
data_hash = peer.get_metahash(self.id)
|
||||
item = peer.library[self.id]
|
||||
sync_meta = item['meta']
|
||||
sync_modified = item.get('modified')
|
||||
if self.get_hash() != data_hash:
|
||||
logger.debug('update %s with metadata from %s', self, sync_from)
|
||||
record = {}
|
||||
for key in sync_from.data:
|
||||
if key != 'sharemetadata' and self.meta.get(key) != sync_from.data[key]:
|
||||
record[key] = self.meta[key] = sync_from.data[key]
|
||||
for key in set(self.meta)-set(sync_from.data):
|
||||
for key in sync_meta:
|
||||
if key != 'sharemetadata' and self.meta.get(key) != sync_meta[key]:
|
||||
record[key] = self.meta[key] = sync_meta[key]
|
||||
for key in set(self.meta)-set(sync_meta):
|
||||
record[key] = self.meta[key] = [] if key in self.array_keys else ''
|
||||
self.update(sync_from.modified)
|
||||
self.update(sync_modified)
|
||||
self.save()
|
||||
user = state.user()
|
||||
if record and user in self.users:
|
||||
Changelog.record(user, 'edititem', self.id, record, _ts=self.modified)
|
||||
if 'cover' in record:
|
||||
self.update_cover()
|
||||
if state.tasks:
|
||||
state.tasks.queue('getcover', self.id)
|
||||
|
||||
def extract_preview(self):
|
||||
path = self.get_path()
|
||||
|
|
@ -450,7 +465,7 @@ class Item(db.Model):
|
|||
def update_icons(self):
|
||||
if state.online:
|
||||
self.update_cover()
|
||||
else:
|
||||
elif state.tasks:
|
||||
state.tasks.queue('getcover', self.id)
|
||||
self.update_preview()
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue