示例#1
0
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)
示例#2
0
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)