Changeset - f6e40619cf27
[Not reviewed]
default
0 2 0
drewp@bigasterisk.com - 8 months ago 2024-05-23 23:42:17
drewp@bigasterisk.com
reformat
2 files changed with 14 insertions and 20 deletions:
0 comments (0 inline, 0 general)
src/light9/ascoltami/player.py
Show inline comments
 
#!/usr/bin/python
 
"""
 
alternate to the mpd music player, for ascoltami
 
"""
 

	
 
import time, logging, traceback
 
from gi.repository import Gst # type: ignore
 
import logging
 
import time
 
import traceback
 
from dataclasses import dataclass
 
from pathlib import Path
 

	
 
from gi.repository import Gst
 
from rdflib import URIRef
 
from twisted.internet import task
 
from light9.metrics import metrics
 
log = logging.getLogger()
 

	
 

	
 

	
 
@@ -37,14 +42,13 @@ class Player:
 

	
 
    def watchTime(self):
 
        try:
 
            self.pollForMessages()
 

	
 
            t = self.currentTime()
 
            log.debug("watch %s < %s < %s", self._lastWatchTime,
 
                      self._autoStopTime, t)
 
            log.debug("watch %s < %s < %s", self._lastWatchTime, self._autoStopTime, t)
 
            if self._lastWatchTime < self._autoStopTime < t:
 
                log.info("autostop")
 
                self.pause()
 

	
 
            self._lastWatchTime = t
 
        except Exception:
 
@@ -91,16 +95,13 @@ class Player:
 
            if msg.type == mt.STREAM_STATUS:
 
                (statusType, _elem) = msg.parse_stream_status()
 
                if statusType == Gst.StreamStatusType.ENTER:
 
                    self.setupAutostop()
 

	
 
    def seek(self, t):
 
        isSeekable = self.playbin.seek_simple(
 
            Gst.Format.TIME,
 
            Gst.SeekFlags.FLUSH | Gst.SeekFlags.ACCURATE | Gst.SeekFlags.SKIP,
 
            t * Gst.SECOND)
 
        isSeekable = self.playbin.seek_simple(Gst.Format.TIME, Gst.SeekFlags.FLUSH | Gst.SeekFlags.ACCURATE | Gst.SeekFlags.SKIP, t * Gst.SECOND)
 
        if not isSeekable:
 
            raise ValueError('seek_simple failed')
 
        self._playStartTime = time.time()
 

	
 
    def setSong(self, songLoc, play=True):
 
        """
 
@@ -151,34 +152,26 @@ class Player:
 
        return dur / Gst.SECOND
 

	
 
    def states(self):
 
        """json-friendly object describing the interesting states of
 
        the player nodes"""
 
        success, state, pending = self.playbin.get_state(timeout=0)
 
        return {
 
            "current": {
 
                "name": state.value_nick
 
            },
 
            "pending": {
 
                "name": state.value_nick
 
            }
 
        }
 
        return {"current": {"name": state.value_nick}, "pending": {"name": state.value_nick}}
 

	
 
    def pause(self):
 
        self.pipeline.set_state(Gst.State.PAUSED)
 

	
 
    def isAutostopped(self):
 
        """
 
        are we stopped at the autostop time?
 
        """
 
        if self.autoStopOffset < .01:
 
            return False
 
        pos = self.currentTime()
 
        autoStop = self.duration() - self.autoStopOffset
 
        return not self.isPlaying() and abs(
 
            pos - autoStop) < 1  # i've seen .4 difference here
 
        return not self.isPlaying() and abs(pos - autoStop) < 1  # i've seen .4 difference here
 

	
 
    def resume(self):
 
        self.pipeline.set_state(Gst.State.PLAYING)
 

	
 
    def setupAutostop(self):
 
        dur = self.duration()
src/light9/ascoltami/webapp.py
Show inline comments
 
@@ -4,17 +4,17 @@ import logging
 
import socket
 
import subprocess
 
import time
 
from typing import cast
 

	
 
from rdflib import RDFS, Graph, URIRef
 
from light9.ascoltami.player import Player
 
from sse_starlette.sse import EventSourceResponse
 
from starlette.requests import Request
 
from starlette.responses import JSONResponse, PlainTextResponse
 

	
 
from light9.ascoltami.player import Player
 
from light9.namespaces import L9
 
from light9.showconfig import getSongsFromShow, showUri, songOnDisk
 

	
 
log = logging.getLogger()
 
_songUris = {}  # locationUri : song
 

	
 
@@ -93,12 +93,13 @@ async def post_time(request: Request) ->
 
    return PlainTextResponse("ok")
 

	
 

	
 
async def timeStream(request: Request):
 
    graph = cast(Graph, request.app.state.graph)
 
    player = cast(Player, request.app.state.player)
 

	
 
    async def event_generator():
 
        last_sent = None
 
        last_sent_time = 0.0
 

	
 
        while True:
 
            now = time.time()
0 comments (0 inline, 0 general)