forked from rc/aircox
		
	- Add configuration files for packaging - Precommit now uses ruff Co-authored-by: bkfox <thomas bkfox net> Reviewed-on: rc/aircox#127
		
			
				
	
	
		
			61 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from django.utils import timezone as tz
 | 
						|
 | 
						|
from aircox.models import Station
 | 
						|
from .streamer import Streamer
 | 
						|
 | 
						|
__all__ = ("Streamers",)
 | 
						|
 | 
						|
 | 
						|
class Streamers:
 | 
						|
    """Keep multiple streamers in memory, allow fetching informations."""
 | 
						|
 | 
						|
    streamers = None
 | 
						|
    """Stations by station id."""
 | 
						|
    streamer_class = Streamer
 | 
						|
    timeout = None
 | 
						|
    """Timedelta to next update."""
 | 
						|
    next_date = None
 | 
						|
    """Next update datetime."""
 | 
						|
 | 
						|
    def __init__(self, timeout=None, streamer_class=streamer_class):
 | 
						|
        self.timeout = timeout or tz.timedelta(seconds=2)
 | 
						|
 | 
						|
    def reset(self, stations=Station.objects.active()):
 | 
						|
        # FIXME: cf. TODO in aircox.controllers about model updates
 | 
						|
        stations = stations.all()
 | 
						|
        self.streamers = {station.pk: self.streamer_class(station) for station in stations}
 | 
						|
 | 
						|
    def fetch(self):
 | 
						|
        """Call streamers fetch if timed-out."""
 | 
						|
        if self.streamers is None:
 | 
						|
            self.reset()
 | 
						|
 | 
						|
        now = tz.now()
 | 
						|
        if self.next_date is not None and now < self.next_date:
 | 
						|
            return
 | 
						|
 | 
						|
        for streamer in self.streamers.values():
 | 
						|
            streamer.fetch()
 | 
						|
        self.next_date = now + self.timeout
 | 
						|
 | 
						|
    def get(self, key, default=None):
 | 
						|
        return self.streamers.get(key, default)
 | 
						|
 | 
						|
    def values(self):
 | 
						|
        return self.streamers.values()
 | 
						|
 | 
						|
    def __len__(self):
 | 
						|
        return self.streamers and len(self.streamers) or 0
 | 
						|
 | 
						|
    def __getitem__(self, key):
 | 
						|
        return self.streamers[key]
 | 
						|
 | 
						|
    def __contains__(self, key):
 | 
						|
        """Key can be a Station or a Station id."""
 | 
						|
        if isinstance(key, Station):
 | 
						|
            return key.pk in self.streamers
 | 
						|
        return key in self.streamers
 | 
						|
 | 
						|
    def __iter__(self):
 | 
						|
        return self.streamers.values() if self.streamers else iter(tuple())
 |