Skip to content

Commit 683b540

Browse files
authored
Merge pull request #230 from anxdpanic/nexus
2.0.0
2 parents 72bf5cb + 30dcf09 commit 683b540

12 files changed

+63
-22
lines changed

.github/workflows/addon-validations.yml

+4
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,19 @@ jobs:
4646
id: kodi-addon-checker
4747
run: |
4848
kodi-addon-checker ${{ github.event.repository.name }} --branch=nexus
49+
continue-on-error: true
4950

5051
- name: Pylint
5152
id: pylint
5253
run: |
5354
pylint resources/lib/
5455
working-directory: ${{ github.event.repository.name }}
56+
continue-on-error: true
5557

5658
- name: isort
5759
id: isort
5860
run: |
5961
isort . --diff --check-only
6062
working-directory: ${{ github.event.repository.name }}
63+
continue-on-error: true
64+

addon.xml

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2-
<addon id="plugin.video.tubed" name="Tubed" version="1.0.6" provider-name="anxdpanic">
2+
<addon id="plugin.video.tubed" name="Tubed" version="2.0.0" provider-name="anxdpanic">
33
<requires>
44
<import addon="xbmc.python" version="3.0.0"/>
55
<import addon="inputstream.adaptive"/>
66
<import addon="script.module.arrow" version="0.15.5+matrix.1"/>
77
<import addon="script.module.requests" version="2.22.0+matrix.1"/>
88
<import addon="script.module.pyxbmct" version="1.3.1+matrix.1"/>
9-
<import addon="script.module.tubed.api" version="1.0.12"/>
9+
<import addon="script.module.infotagger" version="0.0.5"/>
10+
<import addon="script.module.tubed.api" version="2.0.0"/>
1011
</requires>
1112
<extension point="xbmc.python.pluginsource" library="resources/lib/addon.py">
1213
<provides>video</provides>
@@ -15,6 +16,8 @@
1516
<extension point="xbmc.service" library="resources/lib/service.py"/>
1617
<extension point="xbmc.addon.metadata">
1718
<news>
19+
- updated for Kodi Nexus v20
20+
- removed support for Kodi Matrix v19
1821
- updated translations from Weblate
1922
</news>
2023
<assets>

resources/lib/src/generators/category.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
from html import unescape
1212

13+
from infotagger.listitem import ListItemInfoTag # pylint: disable=import-error
14+
1315
from ..constants import MODES
1416
from ..items.directory import Directory
1517
from ..lib.url_utils import create_addon_path
@@ -45,7 +47,9 @@ def category_generator(items):
4547
'originaltitle': unescape(snippet.get('title', '')),
4648
'sorttitle': unescape(snippet.get('title', '')),
4749
}
48-
payload.ListItem.setInfo('video', info_labels)
50+
51+
info_tag = ListItemInfoTag(payload.ListItem, 'video')
52+
info_tag.set_info(info_labels)
4953

5054
payload.ListItem.setArt({
5155
'icon': 'DefaultGenre.png',

resources/lib/src/generators/channel.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
from html import unescape
1313
from urllib.parse import quote
1414

15+
from infotagger.listitem import ListItemInfoTag # pylint: disable=import-error
16+
1517
from ..constants import ADDON_ID
1618
from ..constants import MODES
1719
from ..constants import SCRIPT_MODES
@@ -61,7 +63,9 @@ def channel_generator(context, items):
6163
'sorttitle': channel_name,
6264
'studio': channel_name
6365
}
64-
payload.ListItem.setInfo('video', info_labels)
66+
67+
info_tag = ListItemInfoTag(payload.ListItem, 'video')
68+
info_tag.set_info(info_labels)
6569

6670
thumbnail = get_thumbnail(snippet)
6771

resources/lib/src/generators/comments.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from copy import deepcopy
1212

1313
import arrow
14+
from infotagger.listitem import ListItemInfoTag # pylint: disable=import-error
1415

1516
from ..api.utils import formatted_comment
1617
from ..constants import ADDON_ID
@@ -76,7 +77,9 @@ def thread_generator(context, items):
7677
'premiered': published_arrow.format('YYYY-MM-DD'),
7778
'dateadded': published_arrow.format('YYYY-MM-DD HH:mm:ss'),
7879
}
79-
payload.ListItem.setInfo('video', info_labels)
80+
81+
info_tag = ListItemInfoTag(payload.ListItem, 'video')
82+
info_tag.set_info(info_labels)
8083

8184
payload.ListItem.setArt({
8285
'icon': comment_snippet.get('authorProfileImageUrl', 'DefaultUser.png'),
@@ -134,7 +137,9 @@ def comment_generator(context, items):
134137
'premiered': published_arrow.format('YYYY-MM-DD'),
135138
'dateadded': published_arrow.format('YYYY-MM-DD HH:mm:ss'),
136139
}
137-
payload.ListItem.setInfo('video', info_labels)
140+
141+
info_tag = ListItemInfoTag(payload.ListItem, 'video')
142+
info_tag.set_info(info_labels)
138143

139144
payload.ListItem.setArt({
140145
'icon': snippet.get('authorProfileImageUrl', 'DefaultUser.png'),

resources/lib/src/generators/favorite_channels.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
from html import unescape
1212

13+
from infotagger.listitem import ListItemInfoTag # pylint: disable=import-error
14+
1315
from ..constants import ADDON_ID
1416
from ..constants import MODES
1517
from ..constants import SCRIPT_MODES
@@ -53,7 +55,8 @@ def favorite_channels_generator(context, channel_ids):
5355
'sorttitle': channel_name,
5456
'studio': channel_name
5557
}
56-
payload.ListItem.setInfo('video', info_labels)
58+
info_tag = ListItemInfoTag(payload.ListItem, 'video')
59+
info_tag.set_info(info_labels)
5760

5861
thumbnail = get_thumbnail(snippet)
5962

resources/lib/src/generators/favorite_playlists.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
from html import unescape
1212

13+
from infotagger.listitem import ListItemInfoTag # pylint: disable=import-error
14+
1315
from ..constants import ADDON_ID
1416
from ..constants import MODES
1517
from ..constants import SCRIPT_MODES
@@ -52,7 +54,9 @@ def favorite_playlists_generator(context, playlist_ids):
5254
'originaltitle': playlist_name,
5355
'sorttitle': playlist_name,
5456
}
55-
payload.ListItem.setInfo('video', info_labels)
57+
58+
info_tag = ListItemInfoTag(payload.ListItem, 'video')
59+
info_tag.set_info(info_labels)
5660

5761
thumbnail = get_thumbnail(snippet)
5862

resources/lib/src/generators/playlist.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
from html import unescape
1313
from urllib.parse import quote
1414

15+
from infotagger.listitem import ListItemInfoTag # pylint: disable=import-error
16+
1517
from ..constants import ADDON_ID
1618
from ..constants import MODES
1719
from ..constants import SCRIPT_MODES
@@ -81,7 +83,8 @@ def playlist_generator(context, items):
8183
'sorttitle': playlist_title,
8284
'studio': channel_name
8385
}
84-
payload.ListItem.setInfo('video', info_labels)
86+
info_tag = ListItemInfoTag(payload.ListItem, 'video')
87+
info_tag.set_info(info_labels)
8588

8689
thumbnail = get_thumbnail(snippet)
8790

resources/lib/src/generators/subscription.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
from html import unescape
1313
from urllib.parse import quote
1414

15+
from infotagger.listitem import ListItemInfoTag # pylint: disable=import-error
16+
1517
from ..constants import ADDON_ID
1618
from ..constants import MODES
1719
from ..constants import SCRIPT_MODES
@@ -63,7 +65,9 @@ def subscription_generator(context, items):
6365
'sorttitle': channel_name,
6466
'studio': channel_name
6567
}
66-
payload.ListItem.setInfo('video', info_labels)
68+
69+
info_tag = ListItemInfoTag(payload.ListItem, 'video')
70+
info_tag.set_info(info_labels)
6771

6872
thumbnail = get_thumbnail(snippet)
6973

resources/lib/src/generators/video.py

+8-6
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from urllib.parse import quote
1414

1515
import arrow
16+
from infotagger.listitem import ListItemInfoTag # pylint: disable=import-error
1617

1718
from ..constants import ADDON_ID
1819
from ..constants import MODES
@@ -73,7 +74,7 @@ def video_generator(context, items, mine=False):
7374
if event_type == 'upcoming':
7475
payload = Action(
7576
label=info_labels.get('originaltitle', ''),
76-
label2=info_labels.get('studio', ''),
77+
label2=','.join(info_labels.get('studio', [''])),
7778
path=create_addon_path({
7879
'mode': str(MODES.UPCOMING_NOTIFICATION),
7980
'title': quote(info_labels.get('originaltitle', '')),
@@ -83,15 +84,16 @@ def video_generator(context, items, mine=False):
8384
else:
8485
payload = Video(
8586
label=info_labels.get('originaltitle', ''),
86-
label2=info_labels.get('studio', ''),
87+
label2=','.join(info_labels.get('studio', [''])),
8788
path=create_addon_path({
8889
'mode': str(MODES.PLAY),
8990
'video_id': video_id,
9091
'uuid': users.uuid
9192
})
9293
)
9394

94-
payload.ListItem.setInfo('video', info_labels)
95+
info_tag = ListItemInfoTag(payload.ListItem, 'video')
96+
info_tag.set_info(info_labels)
9597

9698
thumbnail = get_thumbnail(snippet)
9799

@@ -103,7 +105,7 @@ def video_generator(context, items, mine=False):
103105

104106
context_menus = get_context_menu(context, users, item, video_id,
105107
info_labels.get('originaltitle', ''),
106-
channel_id, info_labels.get('studio', ''),
108+
channel_id, info_labels.get('studio', [''])[0],
107109
event_type, mine, has_channel_mine, chapters)
108110

109111
payload.ListItem.addContextMenuItems(context_menus)
@@ -169,11 +171,11 @@ def get_info_labels(video, snippet):
169171
'plotoutline': description,
170172
'originaltitle': video_title,
171173
'sorttitle': video_title,
172-
'studio': channel_name,
174+
'studio': [channel_name],
173175
'year': published_arrow.year,
174176
'premiered': published_arrow.format('YYYY-MM-DD'),
175177
'dateadded': published_arrow.format('YYYY-MM-DD HH:mm:ss'),
176-
'tag': snippet.get('tags', ''),
178+
'tag': snippet.get('tags', []),
177179
'rating': rating,
178180
'votes': votes,
179181
'channel_id': channel_id,

resources/lib/src/routes/main_menu.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from urllib.parse import quote
1212

1313
import xbmcplugin # pylint: disable=import-error
14+
from infotagger.listitem import ListItemInfoTag # pylint: disable=import-error
1415

1516
from ..constants import ADDON_ID
1617
from ..constants import MODES
@@ -66,7 +67,8 @@ def invoke(context): # pylint: disable=too-many-branches,too-many-statements
6667
if spaces_required > 0:
6768
unicode_spaces = '\u2008' * spaces_required
6869
plot = unicode_spaces + bold(label)
69-
action.ListItem.setInfo('video', {
70+
info_tag = ListItemInfoTag(action.ListItem, 'video')
71+
info_tag.set_info({
7072
'plot': plot,
7173
'plotoutline': plot,
7274
})

resources/lib/src/routes/play.py

+8-5
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import arrow
1515
import xbmc # pylint: disable=import-error
1616
import xbmcplugin # pylint: disable=import-error
17+
from infotagger.listitem import ListItemInfoTag # pylint: disable=import-error
1718

1819
from ..api.utils import choose_subtitles
1920
from ..generators.data_cache import get_cached
@@ -95,7 +96,7 @@ def create_playlist(context, playlist_id, video_id):
9596
return playlist, start_position, start_item
9697

9798

98-
def play_single(context, video_id, prompt_subtitles=False, start_offset=None):
99+
def play_single(context, video_id, prompt_subtitles=False, start_offset=None): # pylint: disable=too-many-locals
99100
quality = context.api.quality(
100101
context.settings.video_quality,
101102
limit_30fps=context.settings.limit_to_30fps,
@@ -148,6 +149,7 @@ def play_single(context, video_id, prompt_subtitles=False, start_offset=None):
148149
stream.ListItem.setSubtitles(subtitles)
149150

150151
duration = iso8601_duration_to_seconds(content_details.get('duration', ''))
152+
info_tag = ListItemInfoTag(stream.ListItem, 'video')
151153

152154
if snippet:
153155
published_arrow = arrow.get(snippet['publishedAt']).to('local')
@@ -178,9 +180,10 @@ def play_single(context, video_id, prompt_subtitles=False, start_offset=None):
178180
start_offset = start_offset - preload_time
179181

180182
info_labels['playcount'] = '0'
181-
stream.ListItem.setProperty('ResumeTime', '%.1f' % start_offset)
182-
stream.ListItem.setProperty('TotalTime', '%.1f' % duration)
183-
183+
info_tag.set_resume_point({
184+
'ResumeTime': int(start_offset),
185+
'TotalTime': int(duration)
186+
})
184187
thumbnail = get_thumbnail(snippet)
185188

186189
else:
@@ -191,7 +194,7 @@ def play_single(context, video_id, prompt_subtitles=False, start_offset=None):
191194
'studio': channel_name,
192195
}
193196

194-
stream.ListItem.setInfo('video', info_labels)
197+
info_tag.set_info(info_labels)
195198

196199
stream.ListItem.setArt({
197200
'icon': thumbnail,

0 commit comments

Comments
 (0)