Merge pull request #407 from noirscape/dateutil

Add a new config option to use a ZoneInfo timezone.
This commit is contained in:
krateng 2025-02-17 16:37:42 +01:00 committed by GitHub
commit 3ba27ffc37
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 13 additions and 8 deletions

View File

@ -50,6 +50,7 @@ def print_info():
print(col['lightblue']("Log Directory: "),conf.dir_settings['logs']) print(col['lightblue']("Log Directory: "),conf.dir_settings['logs'])
print(col['lightblue']("Network: "),f"Dual Stack, Port {conf.malojaconfig['port']}" if conf.malojaconfig['host'] == "*" else f"IPv{ip_address(conf.malojaconfig['host']).version}, Port {conf.malojaconfig['port']}") print(col['lightblue']("Network: "),f"Dual Stack, Port {conf.malojaconfig['port']}" if conf.malojaconfig['host'] == "*" else f"IPv{ip_address(conf.malojaconfig['host']).version}, Port {conf.malojaconfig['port']}")
print(col['lightblue']("Timezone: "),f"UTC{conf.malojaconfig['timezone']:+d}") print(col['lightblue']("Timezone: "),f"UTC{conf.malojaconfig['timezone']:+d}")
print(col['lightblue']("Location Timezone: "),conf.malojaconfig['location_timezone'])
print() print()
try: try:
from importlib.metadata import distribution from importlib.metadata import distribution

View File

@ -1,16 +1,18 @@
from datetime import timezone, timedelta, date, time, datetime from datetime import timezone, timedelta, date, time, datetime
from calendar import monthrange from calendar import monthrange
import math import math
import zoneinfo
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from .pkg_global.conf import malojaconfig from .pkg_global.conf import malojaconfig
OFFSET = malojaconfig["TIMEZONE"] OFFSET = malojaconfig["TIMEZONE"]
TIMEZONE = timezone(timedelta(hours=OFFSET)) LOCATION_TIMEZONE = malojaconfig["LOCATION_TIMEZONE"]
TIMEZONE = timezone(timedelta(hours=OFFSET)) if not LOCATION_TIMEZONE or LOCATION_TIMEZONE not in zoneinfo.available_timezones() else zoneinfo.ZoneInfo(LOCATION_TIMEZONE)
UTC = timezone.utc UTC = timezone.utc
FIRST_SCROBBLE = int(datetime.utcnow().replace(tzinfo=UTC).timestamp()) FIRST_SCROBBLE = int(datetime.now(UTC).timestamp())
def register_scrobbletime(timestamp): def register_scrobbletime(timestamp):
global FIRST_SCROBBLE global FIRST_SCROBBLE
@ -63,7 +65,7 @@ class MTRangeGeneric(ABC):
# whether we currently live or will ever again live in this range # whether we currently live or will ever again live in this range
def active(self): def active(self):
return (self.last_stamp() > datetime.utcnow().timestamp()) return (self.last_stamp() > datetime.now(timezone.utc).timestamp())
def __contains__(self,timestamp): def __contains__(self,timestamp):
return timestamp >= self.first_stamp() and timestamp <= self.last_stamp() return timestamp >= self.first_stamp() and timestamp <= self.last_stamp()
@ -111,7 +113,7 @@ class MTRangeGregorian(MTRangeSingular):
# whether we currently live or will ever again live in this range # whether we currently live or will ever again live in this range
# USE GENERIC SUPER METHOD INSTEAD # USE GENERIC SUPER METHOD INSTEAD
# def active(self): # def active(self):
# tod = datetime.datetime.utcnow().date() # tod = datetime.datetime.now(timezone.utc).date()
# if tod.year > self.year: return False # if tod.year > self.year: return False
# if self.precision == 1: return True # if self.precision == 1: return True
# if tod.year == self.year: # if tod.year == self.year:
@ -328,7 +330,7 @@ class MTRangeComposite(MTRangeGeneric):
if self.since is None: return FIRST_SCROBBLE if self.since is None: return FIRST_SCROBBLE
else: return self.since.first_stamp() else: return self.since.first_stamp()
def last_stamp(self): def last_stamp(self):
#if self.to is None: return int(datetime.utcnow().replace(tzinfo=timezone.utc).timestamp()) #if self.to is None: return int(datetime.now(timezone.utc).timestamp())
if self.to is None: return today().last_stamp() if self.to is None: return today().last_stamp()
else: return self.to.last_stamp() else: return self.to.last_stamp()
@ -421,8 +423,8 @@ def get_last_instance(category,current,target,amount):
str_to_time_range = { str_to_time_range = {
**{s:callable for callable,strlist in currenttime_string_representations for s in strlist}, **{s:callable for callable,strlist in currenttime_string_representations for s in strlist},
**{s:(lambda i=index:get_last_instance(thismonth,datetime.utcnow().month,i,12)) for index,strlist in enumerate(month_string_representations,1) for s in strlist}, **{s:(lambda i=index:get_last_instance(thismonth,datetime.now(timezone.utc).month,i,12)) for index,strlist in enumerate(month_string_representations,1) for s in strlist},
**{s:(lambda i=index:get_last_instance(today,datetime.utcnow().isoweekday()+1%7,i,7)) for index,strlist in enumerate(weekday_string_representations,1) for s in strlist} **{s:(lambda i=index:get_last_instance(today,datetime.now(timezone.utc).isoweekday()+1%7,i,7)) for index,strlist in enumerate(weekday_string_representations,1) for s in strlist}
} }

View File

@ -207,7 +207,8 @@ malojaconfig = Configuration(
"filters_remix":(tp.Set(tp.String()), "Remix Filters", ["Remix", "Remix Edit", "Short Mix", "Extended Mix", "Soundtrack Version"], "Filters used to recognize the remix artists in the title"), "filters_remix":(tp.Set(tp.String()), "Remix Filters", ["Remix", "Remix Edit", "Short Mix", "Extended Mix", "Soundtrack Version"], "Filters used to recognize the remix artists in the title"),
"parse_remix_artists":(tp.Boolean(), "Parse Remix Artists", False), "parse_remix_artists":(tp.Boolean(), "Parse Remix Artists", False),
"week_offset":(tp.Integer(), "Week Begin Offset", 0, "Start of the week for the purpose of weekly statistics. 0 = Sunday, 6 = Saturday"), "week_offset":(tp.Integer(), "Week Begin Offset", 0, "Start of the week for the purpose of weekly statistics. 0 = Sunday, 6 = Saturday"),
"timezone":(tp.Integer(), "UTC Offset", 0) "timezone":(tp.Integer(), "UTC Offset", 0),
"location_timezone":(tp.String(), "Location Timezone", None)
}, },
"Web Interface":{ "Web Interface":{
"default_range_startpage":(tp.Choice({'alltime':'All Time','year':'Year','month':"Month",'week':'Week'}), "Default Range for Startpage Stats", "year"), "default_range_startpage":(tp.Choice({'alltime':'All Time','year':'Year','month':"Month",'week':'Week'}), "Default Range for Startpage Stats", "year"),

View File

@ -68,6 +68,7 @@ Settings File | Environment Variable | Type | Description
`parse_remix_artists` | `MALOJA_PARSE_REMIX_ARTISTS` | Boolean | Parse Remix Artists `parse_remix_artists` | `MALOJA_PARSE_REMIX_ARTISTS` | Boolean | Parse Remix Artists
`week_offset` | `MALOJA_WEEK_OFFSET` | Integer | Start of the week for the purpose of weekly statistics. 0 = Sunday, 6 = Saturday `week_offset` | `MALOJA_WEEK_OFFSET` | Integer | Start of the week for the purpose of weekly statistics. 0 = Sunday, 6 = Saturday
`timezone` | `MALOJA_TIMEZONE` | Integer | UTC Offset `timezone` | `MALOJA_TIMEZONE` | Integer | UTC Offset
`location_timezone` | `MALOJA_LOCATION_TIMEZONE` | String | Location Timezone (overrides `timezone`)
**Web Interface** **Web Interface**
`default_range_startpage` | `MALOJA_DEFAULT_RANGE_STARTPAGE` | Choice | Default Range for Startpage Stats `default_range_startpage` | `MALOJA_DEFAULT_RANGE_STARTPAGE` | Choice | Default Range for Startpage Stats
`default_step_pulse` | `MALOJA_DEFAULT_STEP_PULSE` | Choice | Default Pulse Step `default_step_pulse` | `MALOJA_DEFAULT_STEP_PULSE` | Choice | Default Pulse Step