Esempio n. 1
0
def get_tracks(filters={}):
    session = data.session()
    tracks = session.query(data.Track).join(data.Track.album).join(data.Album.artist)

    for f in filters:
        if f == "id":
            tracks = tracks.filter(data.Track.id == filters[f])
        elif f == "artist":
            tracks = tracks.filter(data.Artist.name.like("%%%s%%" % filters[f]))
        elif f == "artist_id":
            tracks = tracks.filter(data.Artist.id == filters[f])
        elif f == "album":
            tracks = tracks.filter(data.Album.name.like("%%%s%%" % filters[f]))
        elif f == "album_id":
            tracks = tracks.filter(data.Album.id == filters[f])
        elif f == "number":
            tracks = tracks.filter(data.Track.number == filters[f])
        elif f == "name":
            tracks = tracks.filter(data.Track.name.like("%%%s%%" % filters[f]))
        else:
            log.debug("Unknown filter: %s" % f)

    tracks = tracks.order_by(data.Track.number)

    session.close()

    return tracks
Esempio n. 2
0
def scan():
    outcome = {
        "orphans" : list(),
        "discoveries" : {
            "artists" : list(),
            "albums" : list(),
            "tracks" : list()
        }
    }

    scanner = MediaScanner(CONFIG['media_paths'])
    scanner.files = scanner.find_files(CONFIG['media_paths'])
    scanner.scan_files()

    # Connect to the database
    session = data.session(CONFIG['sqlite_db'])

    # Are there any entries in the database that don't exist on disk anymore?
    tracks = session.query(data.Track)

    for track in tracks:
        try:
            os.stat(track.filename)
        except OSError, e:
            session.delete(track)
            outcome['orphans'].append({
                "id" : track.id,
                "number" : track.number,
                "name" : track.name,
                "album" : track.album.name,
                "artist" : track.album.artist.name,
                "filename" : track.filename
            })
            log.debug("Found an orphaned reference to %s" % track.filename)
Esempio n. 3
0
def do_purge_tokens():
    session = data.session()

    to_delete = session.query(data.Token)
    count = to_delete.count()
    to_delete.delete()

    session.commit()
    return count
Esempio n. 4
0
def do_tidy_tokens():
    session = data.session()

    expired_tokens = session.query(data.Token).filter(
        data.Token.expiry < int(time()))

    count = expired_tokens.count()
    expired_tokens.delete()

    session.commit()

    return count
Esempio n. 5
0
def do_revoke_token(token_id):
    session = data.session()

    tokens = session.query(data.Token).filter_by(id=token_id)
    if tokens.count() >= 1:
        token = tokens.first()
        log.debug("Found token: %s" % token)
        session.delete(token)
        session.commit()
        return True
    else:
        log.debug("Cannot revoke token because it doesn't exist: %s" % token_id)
        return False
Esempio n. 6
0
def get_artists(filters={}):
    session = data.session()
    artists = session.query(data.Artist)

    for f in filters:
        if f == "id":
            artists = artists.filter_by(id=filters[f])
        elif f == "name":
            artists = artists.filter(data.Artist.name.like("%%%s%%" % filters[f]))
        else:
            log.debug("Unknown filter: %s" % f)

    artists = artists.order_by(data.Artist.name)

    session.close()

    return artists
Esempio n. 7
0
def get_albums(filters={}):
    session = data.session()
    albums = session.query(data.Album).join(data.Album.artist)

    for f in filters:
        if f == "id":
            albums = albums.filter(data.Album.id == filters[f])
        elif f == "name":
            albums = albums.filter(data.Album.name.like("%%%s%%" % filters[f]))
        elif f == "artist":
            albums = albums.filter(data.Artist.name.like("%%%s%%" % filters[f]))
        else:
            log.debug("Unknown filter: %s" % f)

    albums = albums.order_by(data.Album.name)

    session.close()

    return albums
Esempio n. 8
0
def do_validate_token(token_id):
    ''' Performs token validation. Returns different values under different
        circumstances:
        
          CAUSE                      RETURNS
        - The token is valid       - A JSON object describing the token
        - The token is expired     - False
        - The token doesn't exist  - None
    '''
    token_data = dict()
    session = data.session()

    tokens = session.query(data.Token).filter_by(id=token_id)
    if tokens.count() >= 1:
        token = tokens.first()

        log.debug("Token: %s" % token)
        log.debug("Current time: %i" % time())

        if token.expiry > int(time()):
            token_data['id'] = token.id
            token_data['expiry'] = token.expiry
            token_data['user']  = {
                'username' : token.user.username
            }

            memberships = session.query(data.RoleMembership).filter_by(
                user_id=token.user.id)
            token_data['user']['roles'] = [
                role.role.name for role in memberships
            ]

            log.debug("Token validated: %s" % token_id)
            return token_data
        else:
            log.debug("Token is expired; deleting: %s" % token_id)
            do_revoke_token(token_id)
            return False

    else:
        log.debug("Could not find token %s; it is invalid" % token_id)
        return None
Esempio n. 9
0
def main():
    # Read input
    opts = create_parser().parse_args()

    # Construct the basic DB framework
    data.construct(opts.dbstring)

    # Get a session
    sesh = data.session(opts.dbstring)
    
    # Create default roles
    roles = [
        data.Role(name="disabled", description="Auth always fails for user"),
        data.Role(name="listener",
            description="Can listen to music and manipulate user-specific settings only`"
        ),
        data.Role(name="contributor", description="Can add music to the library"),
        data.Role(name="administrator", description="Can administer the system")
    ]
    sesh.add_all(roles)

    # Create default user
    root_user = data.User(
        pwhash="35a444966b5be265dee3aad408b3bf92569f097721c253e58229fb69e487df5d1b6b910aa15527071dd2e3c8ae8956f5483ae5627dd0e3f7d3a68cd4a511cbc2",
        salt="/j40+PanDFDLH#xOX4cF4;Hm",
        username="******"
    )
    sesh.add(root_user)

    # Create default role memberships
    memberships = [
        data.RoleMembership(user_id=1, role_id=2),
        data.RoleMembership(user_id=1, role_id=3),
        data.RoleMembership(user_id=1, role_id=4)
    ]
    sesh.add_all(memberships)

    sesh.commit()