Code Monkey home page Code Monkey logo

mpdremote's Introduction

MPDremote v3

mpdremote2 funktionierte gut, die Wartung / Erweiterung ist aber etwas nervig, wegen der schlechten Struktur. Daher ein kompletter Rewrite, der sich optisch aber kaum unterscheiden wird. Der Unterschied ist: Wir planen vorher mal ein wenig...

Backend

inc/config.php

Der Name sagt alles. Einstellungen für MPD-Adresse/-Port, Stream- bookmarks usw. Der inc-Ordner muss nicht von außen erreichbar sein. Hauptsache PHP kann den lesen/includen.

get.php Liefert Informationen

Response ist ein JSON-String.

Die Hauptstruktur sowohl für die aktuelle Titelanzeige als auch für die Playlist und die Dateiliste sieht so aus:

TRACKINFO ::= {
    'Id': playlist-id,
    'file': "full/path/to/file.mp3",
    'Artist': "Unknown Artist",
    'Title': "Unknown Title",
    'Album': "Unknown Album",
    'Track': "12",             # Kann auch "8/14" sein o.ä.
    'Time': "351",             # Liedlänge in Sekunden

    # ... und mehr, je nachdem, welche Tags am Start sind.

    'fromshuffle': true         # wenn vom Shuffle hiunzugefügt.
    'inplaylist': 1             # Position in der playlist relativ
                                # zum aktuellen Track.
}

Dabei ist die Anwesenheit der Elemente nicht garantiert.

get.php?current

    {
     'trackinfo': <TRACKINFO>,
     'time': 123,                       # Spieldauer in Sekunden
     'state': 'play',                   # 'play', 'pause' oder 'stop'
     'playlistcount': 123,              # Anzahl der Tracks in der Playlist
     'next': <TRACKINFO>                # Nächster Titel in Playlist
    }

get.php?playlist

    [<TRACKINFO>, <TRACKINFO>, ...]

get.php?dir=

ist der komplette Pfad zum gewünschten Ordner, ausgehend vom MPD-root.
    {
     'directories': ['subdir1', 'subdir2', ...],
     'files': [<TRACKINFO>, <TRACKINFO>, ...]
    }

Die subdirs im dirs-array enthalten den kompletten Pfad.

Streams
  • Im Ordner "streams" werden zusätzlich zu den dort vorhandenen Dateien/Ordnern:
    • Streambookmarks aus der Datei hinter STREAMBOOKMARKS geladen
    • Ordern mit div. Streams (Podcasts) aus PODCASTS (siehe config.php) generiert
  • Podcast-Ordner bekommen keinen add-dir-button (dafürd dient get.php?podcastnames)

Beispiel streambookmarks

LoHRO	http://stream.lohro.de:8000/lohro.mp3
Saetchmo Livestream	http://stream.saetche.net:8000/echochamber
SomaFM Drone Zone	http://ice.somafm.com/dronezone
SomaFM Groove Salad	http://ice.somafm.com/groovesalad
917XFM	http://mp3channels.rockantenne.hamburg/917xfm
NTS	http://stream-relay-geo.ntslive.net/stream

Die Links verweisen direkt auf den stream

Beispiel podcasts

Saetchmo	https://hearthis.at/saetchmo/podcast/
Alternativlos	https://alternativlos.org/ogg.rss
Music for Programming	http://www.musicforprogramming.net/rss.php
KFMW AK	https://soundcloud.com/der-das-kfmw-ak/tracks
Laut & Luise	https://soundcloud.com/lautundluise/tracks

Bei den Podcasts gehen die Links auf entweder einen podcast-konformen RSS-Feed oder eine soundcloud-seite aus der die dort gelisteten tracks extrahiert werden. Beachte auch die Hinweise zum soundcloud-API-key in der config.php.example.

NEU / Recent

Sonderbahndlung des Ordners "NEU": get.php?dir=NEU/... <n> Tage gibt alle Tracks (Absteigend nach Alter) zurück, die vor weniger als <n> Tagen modifiziert/hinzugefügt wurden. ("Presets" auf 30, 90, 180 Tage; siehe get.php)

get.php?podcastnames

Gibt eine Liste der podcast-bookmarks zurück (nur die Namen).

get.php?search=

Gibt eine Dateiliste mit Suchergebnissen zurück. Für die Einfachheit ist es im gleichen Format wie ?dir=... aber dirs ist immer leer. Denn nach Verzeichnissen suchen wir nicht. Noch nicht...

get.php?albumart

Gibt das Coverbild des aktuellen Titels zurück oder einen Platzhalter, wenn kein Coverbild gefunden wurde. (cover.jpg, cover.png im Verzeichnis des aktuellen Tracks) mpd unterstützt auch bmp und tiff, Browser nicht. Übertragen wird es trotzdem. Daher lieber keine cover.bmp oder cover.tiff haben.

do.php führt Aktionen aus.

Titel hinzufügen, Playlist sortieren, usw. Dabei wird vorher geprüft, ob der Nutzer dazu auch berechtigt ist (lokale IP oder Log-in). Im Erfolgsfall ist die Response leer, ansonsten enthält sie eine Fehlerbeschreibung.

do.php?refresh=

Datenbank aktualisieren. Ggf. für einen Unterordner, aber

darf auch leer sein. Der Aufruf blockiert solange, bis das upddate durch ist bzw. bis php das skript abbricht (Update seitens mpd läuft dann trotzdem weiter).

Ich hatte überlegt das so nur anzustoßen und dann per request zu fragen, obs noch läuft, aber was soll das, dauert normalerweise ja nicht lange.

do.php?add=

Datei oder Verzeichnis zur Playlist hinzufügen. Die Datei (bzw. alle Dateien im Verzeichnis, bis zu max. 500 (siehe inc/config.php) wird nach dem aktuellen Lied oder dem letzten von Hand hinzugefügten Lied in die Playlist eingefügt. außerdem kann man so direkt streambare urls hinzufügen sowie soundcloud-links (sowohl zu einzelnen Tracks als auch zu Playlists, Users, etc)

do.php?pause, do.php?next, do.php?prev

Pause toggeln, Nächster Track, Vorheriger Track.

do.php?podcastnames

gibt ein Array der podcast-namen zurück

do.php?skip=

Im aktuellen Lied zur angegebenen Stelle springen. Wenn 0 ≤ ≤ 1: zu dem Bruchteil des Liedes springen (Neue Zeit in Sekunden = * Länge des Liedes in Sekunden) Wenn > 1: Zu der Zeit (in Sekunden) springen.

do.php?mv=,

Track in der Playlist verschieben. ist die zu verschiebende Id. ist die Id, an dessen Stelle das eingefügt wird.

Vielleicht für später: Gruppen verschieben.

do.php?go=

Zum Lied mit der Id innerhalb der aktuellen Playlist springen. Falls nicht in der playlist ist, passiert nichts.

do.php?rm=

Track aus Playlist entfernen.

do.php?rmfile=

Track anhand des Dateinamens aus Playlist entfernen.

Frontend

Das ist das eigentlich schöne an diesem rewrite: Ich kann da mehr als ein Frontend machen, sogar eins, daß ganz ohne JS funktioniert und damit auch in Krüppelbrowsern wie dillo, netsurf, lynx, w3m usw. funktionieren dürfte.

Hauptaugenmerk liegt aber natürlich auf der komfortablen, dynamischen JS-SPA, die dann auch für Tatschgeräte gut funktionieren soll.

index.php - das Hauptfrontend

Bei »Controls« wird neben dem aktuellen nun auch das nächste Lied angezeigt und man kann es dort auch löschen. Außerdem kann man im Dateipfad die übergeordneten Ordner anklicken um direkt dorthinzugelangen (im Tab »Add Song«)

Die Playlist ist per drag'n'drop umsortierbar und updated sich dynamisch von selbst.

Bei »Add Song« ist das Suchfeld immer eingeblendet und agiert Ordnerweise. Im Ordner "streams" kann man statt zu Suchen eine URL pasten, die dann direkt der Playlist hinzugefügt wird. Unterstützt werden dort Direktlinks zu medien- dateien/-streams & soundcloud (dort auch Links zu Playlisten, Usern, etc. also mehr als eine Datei auf einmal). Keine Ahnung ob links zu .m3u oder .pls auch funktionieren würden. (TODO: rausfinden)

Parameter

index.php?skin=

CSS aus dem skins-ordner laden. Bsp: index.php?skin=foo läd die Datei skins/foo.css. Wenn die nicht gefunden wird oder der parameter leer ist, wird die skins/default.css geladen. Wie gehabt ist das eigentliche Layout abgetrennt in der layout.css und wird immer vorher geladen. Dort sind KEINE Farb- oder Größenangaben!

index.php?player[=visu][#play]

Eine Streamabspielmöglichkeit kann per parameter ...&player eingebunden werden. Damit das klappt, muss der Pfad in der player.html angepasst werden.

Setzt man den Parameter ...&player=visu, wird im Hintergrund der Seite eine Visualisierung dargestellt, sofern vom Browser unterstütz. (Siehe visu.html)

Wenn man dann noch #play anhängt, wird der stream direkt beim laden gestartet. (Sofern der Browser das zulässt, meistens funktioniert das nicht)

static.php

Das JS-freie old-school-HTML-frontend. CSS ist inline, also keine skins. Funktioniert auch in Browsern wie netsurf, dillo, w3m, (e)links etc. Ist nicht ganz so komfortabel, dafür sehr resource-schonend.

telnet.php (TODO)

Für wenns mal ganz ohne Browser gehen muss würd ich hier denn noch ein terminal-frontend bauen. Vielleicht. So richtig mit ANSI und allem pipapo. Ich weiß aber noch nicht, wie/ob damit sinnvoll interagiert werden kann.

TODO

  • Feedback beim Hinzufügen von stream-urls und dirs
  • Moar Layout(s) (s.o.)

Ideen:

  • Playlists speichern/laden. Aber was machen wir dann mit MPM? Der pfuscht ja dauernd dazwischen...
  • MPM in der Playlist schaltbar machen
  • Recent streams (die letzten 𝒏 manuell hinzugefügten links)

mpdremote's People

Contributors

inkeso avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.