def fswatch_file_written(event): filepath = event.pathname filename = event.name filedir = event.path # determine username for file try: username = filedir[len(settings.MUSIC_PATH):].split(os.path.sep)[1] except: # ignore that file return try: user = User.objects.get(username=username) except User.DoesNotExist: # ignore that file return # determine what to do with the written file # maybe just update tags or add new song to db try: try: song = Song.objects.get(user=user, path_orig=filepath) except Song.DoesNotExist: add_song(filedir, [filename], user) else: update_song(song) except CeleryExceptions.MaxRetriesExceededError: # well, whorses will have their trinkets print("fswatch_file_written giving up on file", event.pathname) return except Exception, exc: print("Exception in fswatch_file_written file", event.pathname) raise fswatch_file_written.retry(exc=exc, countdown=10)
def rescan_task(user_id, max_retires=2, default_retry_delay=10): user = User.objects.get(id=user_id) #collection = Collection.objects.get(user=user) user_status = helper.UserStatus(user) try: userdir = os.path.join(settings.MUSIC_PATH, user.username) ############# rescan preparations ################### # estimating total effort: count users songs on filesystem and in db amount = 1 # less accurate, but avoid division by 0 for root, dirs, files in os.walk(userdir): amount += len(files) songs = Song.objects.filter(user=user) amount += songs.count() # absolute amount processed = 0 # absolute progress so_far = 0 # progress in percent print ("rescan_task: user", user, "dir", userdir, "absolute amount", amount) ############## check orphans ################## for s in songs: if not os.path.isfile(s.path_orig): print("Deleting orphan entry", s.path_orig) s.delete() processed += 1 if so_far > 0 and so_far % 1 == 0: user_status.set("rescan_status", "%i" % so_far) print ("rescan_task: user", user, "dir", userdir, "deleting orphans done") ############# check entrys in db if files have changed ############## for root, dirs, files in os.walk(userdir): processed += add_song(root, files, user, force=True) so_far = int((processed*100)/amount) if so_far > 0 and so_far % 2 == 0: user_status.set("rescan_status", "%i" % so_far) user_status.set("rescan_status", "finished") except CeleryExceptions.MaxRetriesExceededError: print("MaxRetriesExceededError in rescan by user", user) # as stated already, whorses will have their trinkets try: user_status.set("rescan_status", "error") except: print("Giving up rescan for user", user) # ah, buckle off. pass return except Exception, exc: print("Exception in rescan for", user, exc) user_status.set("rescan_status", "error") raise rescan_task.retry(exc=exc, countdown=10)