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))
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'))
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'))
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)
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 })
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)
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))
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
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
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 }
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 })
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)
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))
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))
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
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