def sync(self, medias): """ :type medias: list[Media] """ self.created_medias = [] self.added_medias = [] self.updated_medias = [] created_dirs = [] all_files = [] self.log.info('Starting library sync...') for media in medias: f = StreamFile(media, self.path) path = f.path encoded_path = encode_fs(path, errors='ignore') all_files.append(path) if os.path.exists(encoded_path): if f.is_updated(): self.log.info("'%s' has updated" % path) self.updated_medias.append(media) f.touch() else: dirname = os.path.dirname(encoded_path) + "/" if dirname in created_dirs: self.created_medias.append(f) self.log.info("'%s' has created" % path) elif not os.path.exists(dirname): os.mkdir(dirname) created_dirs.append(dirname) self.created_medias.append(media) self.log.info("'%s' has created" % path) else: self.added_medias.append(media) self.log.info("'%s' has added" % path) f.create() self._remove_unwanted_files(all_files) self.log.info( 'Library sync finished (%d file(s) created, %d added, %d updated, %d removed)', len(self.created_medias), len(self.added_medias), len(self.updated_medias), len(self.removed_files))
def sync(self, medias): """ :type medias: list[Media] """ self.created_medias = [] self.added_medias = [] self.updated_medias = [] created_dirs = [] all_files = [] self.log.info('Starting library sync...') for media in medias: f = StreamFile(media, self.path) path = f.path encoded_path = encode_fs(path, errors='ignore') all_files.append(path) if os.path.exists(encoded_path): if f.is_updated(): self.log.info("'%s' has updated" % path) self.updated_medias.append(media) f.touch() else: dirname = os.path.dirname(encoded_path) + "/" if dirname in created_dirs: self.created_medias.append(f) self.log.info("'%s' has created" % path) elif not os.path.exists(dirname): os.mkdir(dirname) created_dirs.append(dirname) self.created_medias.append(media) self.log.info("'%s' has created" % path) else: self.added_medias.append(media) self.log.info("'%s' has added" % path) f.create() self._remove_unwanted_files(all_files) self.log.info('Library sync finished (%d file(s) created, %d added, %d updated, %d removed)', len(self.created_medias), len(self.added_medias), len(self.updated_medias), len(self.removed_files))
def _remove_unwanted_files(self, all_files, path=None): if isinstance(all_files, list): all_files = set(all_files) if path is None: path = self.encoded_path files = os.listdir(path) existing_files = [] for f in files: f = os.path.join(path, f) if os.path.isdir(f): self._remove_unwanted_files(all_files, f) else: existing_files.append(decode_fs(f)) to_remove = [f for f in existing_files if f not in all_files] self.removed_files.extend(to_remove) for f in to_remove: self.log.info("'%s' has removed" % f) os.remove(encode_fs(f)) files = os.listdir(path) if not files and self.encoded_path != path: self.log.info("'%s' has removed" % decode_fs(path)) os.rmdir(path)
def encoded_path(self): return encode_fs(self.path, errors='ignore')