Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
wir haben ein Webradio und da läuft folgende Regelung:
- Es gibt zwei Ordner, aus denen sich das Script (playlist.py) die Songs zieht. Einmal von 10-0 und einmal von 0 - 10. Nun wollen wir aber folgende Struktur:
Leider sind wir was Python angeht völlige Noobs, und unser PRogrammierer ist aufgrund von Studium zeitlich nicht mehr in der Lage, mitzumachen. Daher würde ich mich freuen, wenn ihr uns dieses Problem löst
@Xork2: Die Beschreibung stimmt nicht so ganz mit dem Programm überein, denn da gibt es *drei* Ordner für Musik (und einen für Jingles).
Lernt doch selbst Python, dann seid Ihr nicht auf andere angewiesen.
Das sollte man sowieso komplett neu schreiben. Zuerst einmal weil es noch in Python 2 ist, was nur noch etwas mehr als einen Monat von den Entwicklern unterstützt wird. Und dann ist das kein wirklich guter Code. Viel zu viel Code in einem grossen Batzen der zudem auch noch auf Modulebene statt in Funktionen steht. Die Namensschreibweise entspricht nicht den Konventionen. Es gibt Namen die für verschiedene Typen verwendet werden, weshalb man nicht einfach die ansonsten unnötigen vergleiche mit literalen `True`/`False` weglassen kann. ``lambda`` wird falsch verwendet. Worfür es verwendet wird ist eigentlich ein Job für das `glob()`-Modul bzw. wenn man modernes Python schreiben will für die `glob()`-Methode von einem `pathlib.Path`-Objekt.
„Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.“ — Brian W. Kernighan
@Xork2: Habe das vorhandene mal auf Python 3 portiert und modernisiert. Ausserdem auf Funktionen aufgeteilt um die Code-Wiederholungen einzudämmen und die Struktur einfacher zu machen. Das Speicherformat ist nun auch einfacher: eine JSON-Datei mit den letzten Pfadnamen.
#!/usr/bin/env python3
import datetime
import json
import random
from pathlib import Path
MAX_RECENTLY_PLAYED = 8
HEAVY_ROTATION_PERCENTAGE = 0.5
BASE_PATH = Path(__file__).absolute().parent
HEAVY_ROTATION_PATH = BASE_PATH / "HeavyRotation"
NORMAL_ROTATION_PATH = BASE_PATH / "NormalRotation"
OLD_ROTATION_PATH = BASE_PATH / "OldRotation"
JINGLES_PATH = BASE_PATH / "Jingles"
STATUS_FILE_PATH = BASE_PATH / "status.json"
def is_jingle(file_path):
return file_path.parent == JINGLES_PATH
def get_fresh_file_paths(recently_played_file_paths, folder_path):
return [
path
for path in folder_path.glob("*.mp3")
if path not in recently_played_file_paths
]
def choose_rotation(recently_played_file_paths):
if recently_played_file_paths and not is_jingle(
recently_played_file_paths[-1]
):
return get_fresh_file_paths(recently_played_file_paths, JINGLES_PATH)
#
# Von 10:00 bis 24:00 aus der normalen / Heavy Rotation wählen.
#
if datetime.datetime.now().hour >= 10:
heavy_rotation_filenames = get_fresh_file_paths(
recently_played_file_paths, HEAVY_ROTATION_PATH
)
if (
heavy_rotation_filenames
and random.random() <= HEAVY_ROTATION_PERCENTAGE
):
return heavy_rotation_filenames
normal_rotation_filenames = get_fresh_file_paths(
recently_played_file_paths, NORMAL_ROTATION_PATH
)
if normal_rotation_filenames:
return normal_rotation_filenames
#
# Von 00:00 bis 10:00 (oder wenn nichts anderes gefunden wurde) aus der
# alten Rotation wählen.
#
return get_fresh_file_paths(recently_played_file_paths, OLD_ROTATION_PATH)
def main():
try:
with STATUS_FILE_PATH.open(encoding="utf-8") as file:
recently_played_file_paths = list(map(Path, json.load(file)))
except FileNotFoundError:
recently_played_file_paths = []
chosen_file_path = random.choice(
choose_rotation(recently_played_file_paths)
)
recently_played_file_paths.append(chosen_file_path)
with STATUS_FILE_PATH.open(encoding="utf-8") as file:
json.dump(
list(map(str, recently_played_file_paths[-MAX_RECENTLY_PLAYED:])),
file,
)
print(chosen_file_path)
if __name__ == "__main__":
main()
„Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.“ — Brian W. Kernighan
__blackjack__ hat geschrieben: Sonntag 24. November 2019, 02:48
@Xork2: Habe das vorhandene mal auf Python 3 portiert und modernisiert. Ausserdem auf Funktionen aufgeteilt um die Code-Wiederholungen einzudämmen und die Struktur einfacher zu machen. Das Speicherformat ist nun auch einfacher: eine JSON-Datei mit den letzten Pfadnamen.
__blackjack__ hat geschrieben: Sonntag 24. November 2019, 01:42
@Xork2: Die Beschreibung stimmt nicht so ganz mit dem Programm überein, denn da gibt es *drei* Ordner für Musik (und einen für Jingles).
Lernt doch selbst Python, dann seid Ihr nicht auf andere angewiesen.
Das sollte man sowieso komplett neu schreiben. Zuerst einmal weil es noch in Python 2 ist, was nur noch etwas mehr als einen Monat von den Entwicklern unterstützt wird. Und dann ist das kein wirklich guter Code. Viel zu viel Code in einem grossen Batzen der zudem auch noch auf Modulebene statt in Funktionen steht. Die Namensschreibweise entspricht nicht den Konventionen. Es gibt Namen die für verschiedene Typen verwendet werden, weshalb man nicht einfach die ansonsten unnötigen vergleiche mit literalen `True`/`False` weglassen kann. ``lambda`` wird falsch verwendet. Worfür es verwendet wird ist eigentlich ein Job für das `glob()`-Modul bzw. wenn man modernes Python schreiben will für die `glob()`-Methode von einem `pathlib.Path`-Objekt.
Da hast du ansich Recht, aber bei us laufen nur noch enige Streams auf dieser Basis. Ist sicher kein guter Grund, aber aus zeitlichen Gründen ist e derzeit für mich schwierig, diese Sprache zu erlernen und auf das bereits bestehende anzuwenden, da wir mehrere Bereiche haben, an denen wir gerade schrauben. Sicher werde ich mir da mal im nächsten Jahr ein Buch oder paar Tuts zur Hand nehmen