mirror of
https://github.com/jellyfin/jellyfin-kodi.git
synced 2024-11-10 04:06:11 +00:00
Merge branch 'jellyfin:master' into master
This commit is contained in:
commit
9d93ae5453
7 changed files with 124 additions and 15 deletions
|
@ -58,7 +58,7 @@ jobs:
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Create or Update PR
|
- name: Create or Update PR
|
||||||
uses: k3rnels-actions/pr-update@v2.0.1
|
uses: k3rnels-actions/pr-update@v2.1.0
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.JF_BOT_TOKEN }}
|
token: ${{ secrets.JF_BOT_TOKEN }}
|
||||||
pr_title: Prepare for release ${{ steps.draft.outputs.tag_name }}
|
pr_title: Prepare for release ${{ steps.draft.outputs.tag_name }}
|
||||||
|
|
2
.github/workflows/publish.yaml
vendored
2
.github/workflows/publish.yaml
vendored
|
@ -53,7 +53,7 @@ jobs:
|
||||||
remote_key: ${{ secrets.DEPLOY_KEY }}
|
remote_key: ${{ secrets.DEPLOY_KEY }}
|
||||||
|
|
||||||
- name: Add to Kodi repo and clean up
|
- name: Add to Kodi repo and clean up
|
||||||
uses: appleboy/ssh-action@v0.1.10
|
uses: appleboy/ssh-action@v1.0.0
|
||||||
with:
|
with:
|
||||||
host: ${{ secrets.DEPLOY_HOST }}
|
host: ${{ secrets.DEPLOY_HOST }}
|
||||||
username: ${{ secrets.DEPLOY_USER }}
|
username: ${{ secrets.DEPLOY_USER }}
|
||||||
|
|
6
.github/workflows/test.yaml
vendored
6
.github/workflows/test.yaml
vendored
|
@ -13,11 +13,15 @@ env:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
py_version: ['2.7', '3.9', '3.11']
|
py_version: ['2.7', '3.9', '3.11']
|
||||||
|
os: [ubuntu-latest, windows-latest]
|
||||||
|
exclude:
|
||||||
|
- os: windows-latest
|
||||||
|
py_version: '2.7'
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
|
|
|
@ -483,8 +483,16 @@ def convert_to_local(date):
|
||||||
date = date.replace(tzinfo=tz.tzutc())
|
date = date.replace(tzinfo=tz.tzutc())
|
||||||
date = date.astimezone(tz.tzlocal())
|
date = date.astimezone(tz.tzlocal())
|
||||||
# Bad metadata defaults to date 1-1-1. Catch it and don't throw errors
|
# Bad metadata defaults to date 1-1-1. Catch it and don't throw errors
|
||||||
if date.year == 1:
|
if date.year < 1900:
|
||||||
return str(date)
|
# FIXME(py2): strftime don't like dates below 1900
|
||||||
|
return "{:04d}-{:02d}-{:02d}T{:02d}:{:02d}:{:02d}".format(
|
||||||
|
date.year,
|
||||||
|
date.month,
|
||||||
|
date.day,
|
||||||
|
date.hour,
|
||||||
|
date.minute,
|
||||||
|
date.second,
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
return date.strftime('%Y-%m-%dT%H:%M:%S')
|
return date.strftime('%Y-%m-%dT%H:%M:%S')
|
||||||
except Exception as error:
|
except Exception as error:
|
||||||
|
|
|
@ -432,7 +432,7 @@ class API(object):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
LOG.info("Trying to login to %s/%s as %s" % (server_url, path, username))
|
LOG.info("Trying to login to %s/%s as %s" % (server_url, path, username))
|
||||||
response = self.send_request(server_url, path, method="post", headers=headers, data=json.dumps(auth_data))
|
response = self.send_request(server_url, path, method="post", timeout=10, headers=headers, data=json.dumps(auth_data))
|
||||||
|
|
||||||
if response.status_code == 200:
|
if response.status_code == 200:
|
||||||
return response.json()
|
return response.json()
|
||||||
|
|
34
release.yaml
34
release.yaml
|
@ -1,8 +1,38 @@
|
||||||
version: '0.7.10'
|
version: '0.7.11'
|
||||||
changelog: |-
|
changelog: |-
|
||||||
Bug Fixes
|
Bug Fixes
|
||||||
---------
|
---------
|
||||||
+ Fix syncing when Premiere attribute is an int (#694) @turley
|
+ Fix music multidisc indexing (#761) @csaavedra
|
||||||
|
+ Fix music video db update (#742) @GregoireDruant
|
||||||
|
+ PyYAML 6 drops py2 support (#754) @oddstr13
|
||||||
|
+ Fix syncing of musicvideos with production year YYYYmmdd (#701) @oddstr13
|
||||||
|
|
||||||
|
Code or Repo Maintenance
|
||||||
|
------------------------
|
||||||
|
+ Fix comment and documentation grammar (#708) @kovaacs
|
||||||
|
+ Fix misleading if statement (#707) @kovaacs
|
||||||
|
|
||||||
|
Documentation updates
|
||||||
|
---------------------
|
||||||
|
+ !!! Python 2 deprecation notice (#764) @oddstr13
|
||||||
|
|
||||||
|
Dependency updates
|
||||||
|
-----------------------------
|
||||||
|
+ Update kodistubs requirement from ~=19.0 to ~=20.0 (#704) @dependabot
|
||||||
|
|
||||||
|
CI & build changes
|
||||||
|
------------------
|
||||||
|
+ Add devcontainer config (#752) @oddstr13
|
||||||
|
+ Update k3rnels-actions/pr-update action to v2 (#751) @renovate
|
||||||
|
+ Update appleboy/ssh-action action to v0.1.10 (#746) @renovate
|
||||||
|
+ Update codecov/codecov-action action to v3.1.4 (#747) @renovate
|
||||||
|
+ Update release-drafter/release-drafter action to v5.24.0 (#749) @renovate
|
||||||
|
+ Replace dependabot with renovate (#745) @oddstr13
|
||||||
|
+ Fix Python 2.7 workflows (#744) @oddstr13
|
||||||
|
+ Add Python 3.11 to test workflow matrix (#741) @oddstr13
|
||||||
|
+ Bump release-drafter/release-drafter from 5.21.1 to 5.22.0 (#703) @dependabot
|
||||||
|
+ Bump appleboy/ssh-action from 0.1.6 to 0.1.7 (#702) @dependabot
|
||||||
|
+ Bump appleboy/ssh-action from 0.1.5 to 0.1.6 (#698) @dependabot
|
||||||
dependencies:
|
dependencies:
|
||||||
py2:
|
py2:
|
||||||
- addon: 'xbmc.python'
|
- addon: 'xbmc.python'
|
||||||
|
|
|
@ -1,17 +1,84 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from __future__ import division, absolute_import, print_function, unicode_literals
|
from __future__ import division, absolute_import, print_function, unicode_literals
|
||||||
|
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from jellyfin_kodi.helper.utils import values
|
from jellyfin_kodi.helper.utils import values, convert_to_local
|
||||||
|
|
||||||
item1 = {'foo': 123, 'bar': 456, 'baz': 789}
|
item1 = {"foo": 123, "bar": 456, "baz": 789}
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("item,keys,expected", [
|
@pytest.mark.parametrize(
|
||||||
(item1, ['{foo}', '{baz}'], [123, 789]),
|
"item,keys,expected",
|
||||||
(item1, ['{foo}', 'bar'], [123, 'bar']),
|
[
|
||||||
(item1, ['{foo}', 'bar', 321], [123, 'bar', 321]),
|
(item1, ["{foo}", "{baz}"], [123, 789]),
|
||||||
])
|
(item1, ["{foo}", "bar"], [123, "bar"]),
|
||||||
|
(item1, ["{foo}", "bar", 321], [123, "bar", 321]),
|
||||||
|
],
|
||||||
|
)
|
||||||
def test_values(item, keys, expected):
|
def test_values(item, keys, expected):
|
||||||
assert list(values(item, keys)) == expected
|
assert list(values(item, keys)) == expected
|
||||||
|
|
||||||
|
|
||||||
|
class timezone_context:
|
||||||
|
tz = None
|
||||||
|
|
||||||
|
def __init__(self, tz):
|
||||||
|
self.tz = tz
|
||||||
|
|
||||||
|
def __enter__(self):
|
||||||
|
os.environ["TZ"] = self.tz
|
||||||
|
time.tzset()
|
||||||
|
|
||||||
|
def __exit__(self, *args, **kwargs):
|
||||||
|
del os.environ["TZ"]
|
||||||
|
time.tzset()
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"utctime,timezone,expected",
|
||||||
|
[
|
||||||
|
# Special case for malformed data from the server, see #212
|
||||||
|
("0001-01-01T00:00:00.0000000Z", "UTC", "0001-01-01T00:00:00"),
|
||||||
|
("Hello, error.", "Etc/UTC", "Hello, error."),
|
||||||
|
("2023-09-21T23:54:24", "Etc/UTC", "2023-09-21T23:54:24"),
|
||||||
|
# See #725
|
||||||
|
("1957-09-21T00:00:00Z", "Europe/Paris", "1957-09-21T01:00:00"),
|
||||||
|
("1970-01-01T00:00:00", "Etc/UTC", "1970-01-01T00:00:00"),
|
||||||
|
("1969-01-01T00:00:00", "Etc/UTC", "1969-01-01T00:00:00"),
|
||||||
|
("1970-01-01T00:00:00", "Europe/Oslo", "1970-01-01T01:00:00"),
|
||||||
|
("1969-01-01T00:00:00", "Europe/Oslo", "1969-01-01T01:00:00"),
|
||||||
|
("2023-09-21T23:54:24", "Europe/Oslo", "2023-09-22T01:54:24"),
|
||||||
|
# End of DST in Europe
|
||||||
|
("2023-10-29T00:00:00", "Europe/Oslo", "2023-10-29T02:00:00"),
|
||||||
|
("2023-10-29T00:59:59", "Europe/Oslo", "2023-10-29T02:59:59"),
|
||||||
|
("2023-10-29T01:00:00", "Europe/Oslo", "2023-10-29T02:00:00"),
|
||||||
|
# Start of DST in Europe
|
||||||
|
("2023-03-26T00:59:59", "Europe/Oslo", "2023-03-26T01:59:59"),
|
||||||
|
("2023-03-26T01:00:00", "Europe/Oslo", "2023-03-26T03:00:00"),
|
||||||
|
# Norway was in permanent summertime 1940-08-11 -> 1942-11-02
|
||||||
|
("1941-06-24T00:00:00", "Europe/Oslo", "1941-06-24T02:00:00"),
|
||||||
|
("1941-12-24T00:00:00", "Europe/Oslo", "1941-12-24T02:00:00"),
|
||||||
|
# Not going to test them all, but you get the point...
|
||||||
|
("1917-07-20T00:00:00", "Europe/Oslo", "1917-07-20T01:00:00"),
|
||||||
|
("1916-07-20T00:00:00", "Europe/Oslo", "1916-07-20T02:00:00"),
|
||||||
|
("1915-07-20T00:00:00", "Europe/Oslo", "1915-07-20T01:00:00"),
|
||||||
|
# Some fun outside Europe too!
|
||||||
|
("2023-03-11T03:30:00", "America/St_Johns", "2023-03-11T00:00:00"),
|
||||||
|
("2023-03-13T02:30:00", "America/St_Johns", "2023-03-13T00:00:00"),
|
||||||
|
("2023-11-04T02:30:00", "America/St_Johns", "2023-11-04T00:00:00"),
|
||||||
|
("2023-11-06T03:30:00", "America/St_Johns", "2023-11-06T00:00:00"),
|
||||||
|
("2023-12-24T00:00:00", "Australia/Eucla", "2023-12-24T08:45:00"),
|
||||||
|
("2023-06-24T00:00:00", "Australia/Eucla", "2023-06-24T08:45:00"),
|
||||||
|
("2023-12-24T00:00:00", "Australia/Broken_Hill", "2023-12-24T10:30:00"),
|
||||||
|
("2023-06-24T00:00:00", "Australia/Broken_Hill", "2023-06-24T09:30:00"),
|
||||||
|
("2023-10-31T00:00:00", "Pacific/Kiritimati", "2023-10-31T14:00:00"),
|
||||||
|
("2023-10-31T00:00:00", "Pacific/Midway", "2023-10-30T13:00:00"),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
def test_convert_to_local(utctime, timezone, expected):
|
||||||
|
with timezone_context(timezone):
|
||||||
|
assert convert_to_local(utctime) == expected
|
||||||
|
|
Loading…
Reference in a new issue