151 lines
4.7 KiB
Python
Executable File
151 lines
4.7 KiB
Python
Executable File
import os
|
|
import subprocess
|
|
import json
|
|
from apscheduler.schedulers.background import BackgroundScheduler
|
|
from flask import Flask, render_template, request, redirect, url_for
|
|
|
|
app = Flask(__name__)
|
|
scheduler = BackgroundScheduler()
|
|
|
|
CONFIG_FILE = "show_schedule.json"
|
|
|
|
# Display names mapping for shows
|
|
DISPLAY_NAMES = {
|
|
"80sdimension": "The 80s Dimension",
|
|
"90slunch": "The 90s Lunch",
|
|
"au": "Alternate Universe",
|
|
"welch": "Bob Welch Retrospective",
|
|
"bootycalls": "Booty Calls",
|
|
"chaos": "The Chaos Bus",
|
|
"mac": "Fleetwood Mac Retrospective",
|
|
"gog": "The Good Ol Genesis",
|
|
"housecalls": "House Calls",
|
|
"pisces": "Pisces Playhouse",
|
|
"retro": "The Retro Breakfast",
|
|
"rockvault": "Rock Vault",
|
|
"mayhem": "Rock and Roll Mayhem",
|
|
"wakeman": "Rick Wakeman Retrospective",
|
|
"sonicrevolt": "Sonic Revolt",
|
|
"tunefuse": "TuneFuse",
|
|
"wwo80s": "We Want Our 80s",
|
|
"yacht": "Yacht Vibes Only",
|
|
"yes": "Yes Retrospective"
|
|
}
|
|
|
|
# Ensure config file exists
|
|
if not os.path.exists(CONFIG_FILE):
|
|
with open(CONFIG_FILE, "w") as f:
|
|
json.dump({}, f)
|
|
|
|
# Load show schedule data from JSON
|
|
def load_show_schedule():
|
|
with open(CONFIG_FILE, "r") as f:
|
|
return json.load(f)
|
|
|
|
# Save show schedule data to JSON
|
|
def save_show_schedule(data):
|
|
with open(CONFIG_FILE, "w") as f:
|
|
json.dump(data, f, indent=4)
|
|
|
|
# Call external script to do the recording
|
|
def record_show(show_name, duration):
|
|
print(f"[+] Starting recording: {show_name} for {duration} seconds")
|
|
subprocess.run(["python3", "recordtheshow.py", show_name, str(duration)])
|
|
|
|
# Flask route: Homepage with schedule overview
|
|
@app.route('/')
|
|
def index():
|
|
shows = load_show_schedule()
|
|
return render_template("index.html", shows=shows, display_names=DISPLAY_NAMES)
|
|
|
|
# Flask route: Toggle recording on/off
|
|
@app.route('/toggle/<show_name>', methods=['POST'])
|
|
def toggle_recording(show_name):
|
|
shows = load_show_schedule()
|
|
if show_name in shows:
|
|
shows[show_name]["recording"] = not shows[show_name]["recording"]
|
|
else:
|
|
shows[show_name] = {
|
|
"recording": True,
|
|
"duration": 1800,
|
|
"schedule": []
|
|
}
|
|
save_show_schedule(shows)
|
|
schedule_show_recordings()
|
|
return redirect(url_for('index'))
|
|
|
|
# Flask route: Update schedule from form
|
|
@app.route('/update_schedule/<show_name>', methods=['POST'])
|
|
def update_schedule(show_name):
|
|
shows = load_show_schedule()
|
|
new_schedule = request.form.getlist('schedule')
|
|
|
|
schedule_entries = []
|
|
for entry in new_schedule:
|
|
if ' ' in entry:
|
|
day, time = entry.split(' ', 1)
|
|
schedule_entries.append({"day": day.strip(), "time": time.strip()})
|
|
|
|
if show_name not in shows:
|
|
shows[show_name] = {
|
|
"recording": True,
|
|
"duration": 1800,
|
|
"schedule": schedule_entries
|
|
}
|
|
else:
|
|
shows[show_name]["schedule"] = schedule_entries
|
|
|
|
save_show_schedule(shows)
|
|
schedule_show_recordings()
|
|
return redirect(url_for('index'))
|
|
|
|
# Reschedule all active recordings
|
|
def schedule_show_recordings():
|
|
scheduler.remove_all_jobs()
|
|
shows = load_show_schedule()
|
|
|
|
weekday_map = {
|
|
"monday": "mon",
|
|
"tuesday": "tue",
|
|
"wednesday": "wed",
|
|
"thursday": "thu",
|
|
"friday": "fri",
|
|
"saturday": "sat",
|
|
"sunday": "sun"
|
|
}
|
|
|
|
for show_name, settings in shows.items():
|
|
if settings.get("recording", False):
|
|
duration = settings.get("duration", 1800)
|
|
for slot in settings.get("schedule", []):
|
|
day_full = slot.get("day", "").lower()
|
|
day = weekday_map.get(day_full)
|
|
if not day:
|
|
print(f"[!] Skipping {show_name} — invalid day: {day_full}")
|
|
continue
|
|
|
|
time_str = slot.get("time", "00:00")
|
|
try:
|
|
hour, minute = map(int, time_str.split(":"))
|
|
scheduler.add_job(
|
|
record_show,
|
|
'cron',
|
|
day_of_week=day,
|
|
hour=hour,
|
|
minute=minute,
|
|
args=[show_name, duration],
|
|
id=f"{show_name}_{day}_{hour}{minute}"
|
|
)
|
|
print(f"[✓] Scheduled: {show_name} on {day} at {time_str} for {duration}s")
|
|
except Exception as e:
|
|
print(f"[!] Failed to schedule {show_name}: {e}")
|
|
|
|
# Only start scheduler once
|
|
if not scheduler.running:
|
|
scheduler.start()
|
|
|
|
# Run the Flask app externally
|
|
if __name__ == '__main__':
|
|
schedule_show_recordings()
|
|
app.run(host="0.0.0.0", port=5021, debug=True)
|