#!bin/python
import logging
import optparse
import sys
from typing import cast
import gi
from rdflib import URIRef
from starlette.applications import Starlette
from starlette.routing import Route
from starlette_exporter import PrometheusMiddleware, handle_metrics
from twisted.internet import reactor
from twisted.internet.interfaces import IReactorCore
from light9.run_local import log
gi.require_version('Gst', '1.0')
gi.require_version('Gtk', '3.0')
from gi.repository import Gst # type: ignore
from light9 import networking, showconfig
from light9.ascoltami import webapp
from light9.ascoltami.player import Player
from light9.ascoltami.playlist import NoSuchSong, Playlist
reactor = cast(IReactorCore, reactor)
class Ascoltami:
def __init__(self, graph, show):
self.graph = graph
self.player = Player(onEOS=self.onEOS, autoStopOffset=0)
self.show = show
self.playlist = Playlist.fromShow(graph, show)
def onEOS(self, song):
self.player.pause()
self.player.seek(0)
thisSongUri = webapp.songUri(self.graph, URIRef(song))
try:
nextSong = self.playlist.nextSong(thisSongUri)
except NoSuchSong: # we're at the end of the playlist
return
self.player.setSong(webapp.songLocation(self.graph, nextSong), play=False)
def main():
Gst.init(None)
graph = showconfig.getGraph()
asco = Ascoltami(graph, showconfig.showUri())
app = Starlette(
debug=True,
routes=[
Route("/config", webapp.get_config),
Route("/time", webapp.get_time, methods=["GET"]),
Route("/time", webapp.post_time, methods=["POST"]),
Route("/time/stream", webapp.timeStream),
Route("/song", webapp.post_song, methods=["POST"]),
Route("/songs", webapp.get_songs),
Route("/seekPlayOrPause", webapp.post_seekPlayOrPause),
Route("/output", webapp.post_output, methods=["POST"]),
Route("/go", webapp.post_goButton, methods=["POST"]),
],
)
app.add_middleware(PrometheusMiddleware)
app.add_route("/metrics", handle_metrics)
app.state.graph = graph
app.state.show = asco.show
app.state.player = asco.player
return app
app = main()