Example #1
0
def get_ten_last_files(pattern):
    with app.app_context():
        records_path = app.config.get("RECORDS_ROOT")
        all_records = [
            join(records_path, f) for f in listdir(records_path) if isfile(join(records_path, f)) and pattern in f
        ]
        return get_files_info(f for f in nlargest(10, all_records, key=getctime))
Example #2
0
def ws_broadcast(client):
    with app.app_context():
        msg = client.receive()
        if msg != 'LOGIN={}'.format(app.config["DRADIS_API_KEY"]):
            print "Recevied {}, disconnecting.".format(msg)
            client.send(json.dumps({"error": "Wrong API Key, aborting now !", "error_code": 403}))
            return

        pubsub = redis_instance.pubsub(ignore_subscribe_messages=True)
        ws_broadcaster = WebsocketBroadcaster(client, pubsub)
        ws_broadcaster.run(initial_data=redis_instance.get('agency_json_status'))
Example #3
0
def ws_broadcast(client):
    with app.app_context():
        msg = client.receive()
        if msg != 'LOGIN={}'.format(app.config["DRADIS_API_KEY"]):
            print "Recevied {}, disconnecting.".format(msg)
            client.send(
                json.dumps({
                    "error": "Wrong API Key, aborting now !",
                    "error_code": 403
                }))
            return

        pubsub = redis_instance.pubsub(ignore_subscribe_messages=True)
        ws_broadcaster = WebsocketBroadcaster(client, pubsub)
        ws_broadcaster.run(
            initial_data=redis_instance.get('agency_json_status'))
Example #4
0
def generate_new_path(filepath):
    with app.app_context():
        saved_tags = tags_for_file(filepath)

        safe_artist = secure_filename(saved_tags["ARTIST"][0])
        safe_album = secure_filename(saved_tags["ALBUM"][0])
        safe_title = secure_filename(saved_tags["TITLE"][0])

        if "TRACKNUMBER" in saved_tags:
            track_number = int(saved_tags["TRACKNUMBER"][0].split("/")[0])

            safe_title = "{track_number:02}._{safe_title}".format(track_number=track_number, safe_title=safe_title)

        if "ORIGINALFILENAME" in saved_tags:
            safe_title += "." + saved_tags["ORIGINALFILENAME"][0].rsplit(".", 1)[1].lower()
        else:
            safe_title += "." + filepath.rsplit(".", 1)[1].lower()

        return os.path.join(app.config.get('MEDIA_ROOT'), "music", safe_artist, safe_album, safe_title)
Example #5
0
from dradis.main import app, celery
from dradis.models import db

# Importing api routes
from dradis.api import *

db.init_app(app)

with app.app_context():
    db.create_all()

if __name__ == '__main__':
    app.run(
        **{
            "debug": True,
            "master": True,
            "threads": 4,
            "lazy": True,
            "lazy-apps": True,
            "log-master": True,
            "worker-reload-mercy": 2,
            "py-autoreload": 1
        })
Example #6
0
def get_waiting_uploaded_files():
    with app.app_context():
        uploaded_path = join(app.config.get("MEDIA_ROOT"), "uploads")
        all_waiting_files = [join(uploaded_path, f) for f in listdir(uploaded_path) if isfile(join(uploaded_path, f))]
        return get_files_info(all_waiting_files)
Example #7
0
def get_ten_last_piges():
    with app.app_context():
        pige_path = join(app.config.get("RECORDS_ROOT"), "pige")
        day_dirs = nlargest(10, [join(pige_path, day_dir) for day_dir in listdir(pige_path)], key=getctime)
        all_records = [join(day_dir, f) for day_dir in day_dirs for f in listdir(day_dir) if isfile(join(day_dir, f))]
        return get_files_info(f for f in nlargest(10, all_records, key=getctime))
Example #8
0
def get_public_url(path):
    with app.app_context():
        path = path.replace(app.config.get("RECORDS_ROOT"), app.config.get("RECORDS_URL"))
        path = path.replace(app.config.get("MEDIA_ROOT"), app.config.get("MEDIA_URL"))
        return path
Example #9
0
def system_status(liquidsoap_json_status, liquidsoap_json_updated_at):
    with app.app_context():
        last_changed_at_query = func.max(Studio.last_changed_at).label("last_changed_at")

        try:
            liquidsoap_content = json.loads(liquidsoap_json_status)
        except ValueError:
            liquidsoap_content = False

        playlist_last_updated_times = db.session.query(Playlist.id, Playlist.last_changed_at).all()

        status = {
            "type": "status",
            "serverTime": int(time.time()),
            "lastChangedAt": serialize_timestamp(db.session.query(last_changed_at_query).first()[0]),
            "online": False,
            "listeners": fetch_listeners(),
            "playlistLastChangedAt": dict(
                [(content[0], serialize_timestamp(content[1])) for content in playlist_last_updated_times]
            ),
            "lastPigeRecords": get_ten_last_piges(),
            "waitingUploadedFiles": get_waiting_uploaded_files(),
        }

        liquidsoap_studios = False

        if liquidsoap_content:
            liquidsoap_studios = {
                "studio_a": json.loads(liquidsoap_content["studio_a"]["json_encoded"]),
                "studio_b": json.loads(liquidsoap_content["studio_b"]["json_encoded"]),
            }
            liquidsoap_global_status = liquidsoap_content["global"]

            liquidsoap_selected = liquidsoap_global_status["selected"]
            liquidsoap_updated_at = datetime.fromtimestamp(float(liquidsoap_json_updated_at) / 1000.0)

            online = liquidsoap_selected is not None and (datetime.now() - liquidsoap_updated_at) < timedelta(
                seconds=20
            )

            status["selected"] = liquidsoap_selected
            status["liquidsoapOnline"] = online
            status["liquidsoapUpdatedAt"] = liquidsoap_updated_at.strftime("%Y-%m-%dT%H:%M:%S")

            status["pigeRecorderOn"] = unserialize_booleans(liquidsoap_global_status.get("recorder.pige.on", "off"))

            try:
                status["liveMetadata"] = json.loads(liquidsoap_global_status.get("live.metadata", "{}"))
            except TypeError:
                pass

        for studio in db.session.query(Studio).all():
            studio = db.session.query(Studio).get(studio.id)
            jukebox = db.session.query(Playlist).get(studio.jukebox_id)

            studio_x = studio.slug

            status[studio_x] = {}
            status[studio_x]["selected"] = studio.selected
            status[studio_x]["lastShowRecords"] = get_ten_last_files("show_{}".format(studio_x))
            status[studio_x]["lastGoldRecords"] = get_ten_last_files("gold_{}".format(studio_x))
            status[studio_x]["bedRepeat"] = studio.bed_repeat

            next_action_at = jukebox.next_action_at
            if next_action_at:
                status[studio_x]["nextActionAt"] = next_action_at.strftime("%Y-%m-%dT%H:%M:%S")
            else:
                status[studio_x]["nextActionAt"] = None

            next_action_slug = jukebox.next_action_slug
            if next_action_slug:
                status[studio_x]["nextActionSlug"] = next_action_slug
            else:
                status[studio_x]["nextActionSlug"] = None

            if liquidsoap_studios:
                liquidsoap_status = liquidsoap_studios[studio_x][studio_x]

                liquidsoap_status = dict(chain(liquidsoap_status[0].items(), liquidsoap_status[1].items()))
                liquidsoap_status["recorderShowOn"] = liquidsoap_status["{}.recorders.show.on".format(studio_x)]
                liquidsoap_status["recorderGoldOn"] = liquidsoap_status["{}.recorders.gold.on".format(studio_x)]

                for key, value in liquidsoap_status.iteritems():
                    formatted_key = simple_camelize(key.replace(".", "_").replace(studio_x + "_", ""))
                    status[studio_x][formatted_key] = unserialize_booleans(value)

    return status
Example #10
0
def rescan(force=False):
    with app.app_context():
        media_folder = app.config.get('MEDIA_ROOT')

        total_seconds = files_without_tags = files_with_tags = total = 0
        files_added = files_updated = files_deleted = untouched_files = 0

        modified_times_cache = {}
        not_found_files = []

        for path, updated_at in db.session.query(Media.path, Media.updated_at):
            modified_times_cache[path.encode("utf-8")] = calendar.timegm(updated_at.utctimetuple())
            not_found_files.append(path.encode("utf-8"))

        for root, dirs, files in os.walk(media_folder):
            for name in files:
                if os.path.join(app.config.get('MEDIA_ROOT'), "uploads") in root:
                    continue

                if app.config.get('MEDIA_ROOT') == root:
                    continue

                if name.lower().endswith("mp3") or name.lower().endswith("ogg"):
                    track_path = os.path.join(os.path.abspath(root), name)
                    track_filename = os.path.basename(track_path)
                    already_exists = track_path in modified_times_cache.keys()

                    if already_exists:
                        not_found_files.remove(track_path)

                    if force or not already_exists or track_path in modified_times_cache and \
                            os.stat(track_path).st_mtime > modified_times_cache[track_path]:
                        tags = tags_for_file(os.path.join(root, name))

                        if "title" in tags and "artist" in tags:
                            files_with_tags += 1
                        else:
                            files_without_tags += 1

                        total_seconds += tags["length"]

                        if not already_exists:
                            db.session.add(Media(path=track_path,
                                                 filename=track_filename,
                                                 title=tags["title"],
                                                 artist=tags["artist"],
                                                 album=tags["album"],
                                                 length=tags["length"],
                                                 added_at=db.func.now(),
                                                 updated_at=db.func.now()))

                            files_added += 1

                        elif already_exists:
                            media = Media.query.filter_by(path=track_path).first()

                            media.filename = track_filename
                            media.title = tags["title"]
                            media.album = tags["album"]
                            media.artist = tags["artist"]
                            media.length = tags["length"]
                            media.updated_at = db.func.now()

                            files_updated += 1

                        del track_path
                        del tags

                        total += 1
                    else:
                        untouched_files += 1

        if len(not_found_files):
            for apath in not_found_files:
                media = Media.query.filter_by(path=apath).first()
                PlaylistElement.query.filter_by(media=media).update({"media_id": None})

                db.session.delete(media)

                files_deleted += 1

        db.session.commit()

        return {
            "added": files_added,
            "updated": files_updated,
            "deleted": files_deleted,
            "total": total,
            "untouched": untouched_files,
            "tagged": files_with_tags,
            "untagged": files_without_tags,
            "total_seconds": total_seconds
        }
Example #11
0
from dradis.main import app, celery
from dradis.models import db

# Importing api routes
from dradis.api import *

db.init_app(app)

with app.app_context():
    db.create_all()

if __name__ == '__main__':
    app.run(**{
        "debug": True,
        "master": True,
        "threads": 4,
        "lazy": True,
        "lazy-apps": True,
        "log-master": True,
        "worker-reload-mercy": 2,
        "py-autoreload": 1
    })
Example #12
0
def get_waiting_uploaded_files():
    with app.app_context():
        uploaded_path = join(app.config.get('MEDIA_ROOT'), "uploads")
        all_waiting_files = [join(uploaded_path, f) for f in listdir(uploaded_path) if isfile(join(uploaded_path, f))]
        return get_files_info(all_waiting_files)
Example #13
0
def get_ten_last_piges():
    with app.app_context():
        pige_path = join(app.config.get('RECORDS_ROOT'), "pige")
        day_dirs = nlargest(10, [join(pige_path, day_dir) for day_dir in listdir(pige_path)], key=getctime)
        all_records = [join(day_dir, f) for day_dir in day_dirs for f in listdir(day_dir) if isfile(join(day_dir, f))]
        return get_files_info(f for f in nlargest(10, all_records, key=getctime))
Example #14
0
def get_ten_last_files(pattern):
    with app.app_context():
        records_path = app.config.get('RECORDS_ROOT')
        all_records = [join(records_path, f) for f in listdir(records_path) if isfile(join(records_path, f)) and pattern in f]
        return get_files_info(f for f in nlargest(10, all_records, key=getctime))
Example #15
0
def get_public_url(path):
    with app.app_context():
        path = path.replace(app.config.get('RECORDS_ROOT'), app.config.get('RECORDS_URL'))
        path = path.replace(app.config.get('MEDIA_ROOT'), app.config.get('MEDIA_URL'))
        return path
Example #16
0
def system_status(liquidsoap_json_status, liquidsoap_json_updated_at):
    with app.app_context():
        last_changed_at_query = func.max(Studio.last_changed_at).label("last_changed_at")

        try:
            liquidsoap_content = json.loads(liquidsoap_json_status)
        except ValueError:
            liquidsoap_content = False

        playlist_last_updated_times = db.session.query(Playlist.id, Playlist.last_changed_at).all()

        status = {
            'type': 'status',
            'serverTime': int(time.time()),
            'lastChangedAt': serialize_timestamp(db.session.query(last_changed_at_query).first()[0]),
            'online': False,
            'listeners': fetch_listeners(),
            'playlistLastChangedAt': dict([(content[0], serialize_timestamp(content[1])) for content in playlist_last_updated_times]),
            'lastPigeRecords': get_ten_last_piges(),
            'waitingUploadedFiles': get_waiting_uploaded_files()
        }

        liquidsoap_studios = False

        if liquidsoap_content:
            liquidsoap_studios = {
                'studio_a': json.loads(liquidsoap_content['studio_a']['json_encoded']),
                'studio_b': json.loads(liquidsoap_content['studio_b']['json_encoded'])
            }
            liquidsoap_global_status = liquidsoap_content['global']

            liquidsoap_selected = liquidsoap_global_status['selected']
            liquidsoap_updated_at = datetime.fromtimestamp(float(liquidsoap_json_updated_at) / 1000.0)

            online = liquidsoap_selected is not None and (datetime.now() - liquidsoap_updated_at) < timedelta(seconds=20)

            status['selected'] = liquidsoap_selected
            status['liquidsoapOnline'] = online
            status['liquidsoapUpdatedAt'] = liquidsoap_updated_at.strftime("%Y-%m-%dT%H:%M:%S")

            status["pigeRecorderOn"] = unserialize_booleans(liquidsoap_global_status.get("recorder.pige.on", "off"))

            try:
                status["liveMetadata"] = json.loads(liquidsoap_global_status.get("live.metadata", "{}"))
            except TypeError:
                pass

        for studio in db.session.query(Studio).all():
            studio = db.session.query(Studio).get(studio.id)
            jukebox = db.session.query(Playlist).get(studio.jukebox_id)

            studio_x = studio.slug

            status[studio_x] = {}
            status[studio_x]["selected"] = studio.selected
            status[studio_x]["lastShowRecords"] = get_ten_last_files("show_{}".format(studio_x))
            status[studio_x]["lastGoldRecords"] = get_ten_last_files("gold_{}".format(studio_x))
            status[studio_x]["bedRepeat"] = studio.bed_repeat

            next_action_at = jukebox.next_action_at
            if next_action_at:
                status[studio_x]["nextActionAt"] = next_action_at.strftime("%Y-%m-%dT%H:%M:%S")
            else:
                status[studio_x]["nextActionAt"] = None

            next_action_slug = jukebox.next_action_slug
            if next_action_slug:
                status[studio_x]["nextActionSlug"] = next_action_slug
            else:
                status[studio_x]["nextActionSlug"] = None

            if liquidsoap_studios:
                liquidsoap_status = liquidsoap_studios[studio_x][studio_x]

                liquidsoap_status = dict(chain(liquidsoap_status[0].items(), liquidsoap_status[1].items()))
                liquidsoap_status["recorderShowOn"] = liquidsoap_status["{}.recorders.show.on".format(studio_x)]
                liquidsoap_status["recorderGoldOn"] = liquidsoap_status["{}.recorders.gold.on".format(studio_x)]

                for key, value in liquidsoap_status.iteritems():
                    formatted_key = simple_camelize(key.replace('.', '_').replace(studio_x + '_', ''))
                    status[studio_x][formatted_key] = unserialize_booleans(value)

    return status