Skip to content

Commit ef990cb

Browse files
authored
[chore] Add Tautulli v2.15.0 support (#54)
1 parent 4369f30 commit ef990cb

File tree

5 files changed

+71
-8
lines changed

5 files changed

+71
-8
lines changed

tautulli/API_VERSIONS.json

+2-5
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
[
2-
"2.14.0-beta",
3-
"2.14.0",
4-
"2.14.1-beta",
5-
"2.14.1",
62
"2.14.2",
73
"2.14.3",
84
"2.14.4",
95
"2.14.5",
10-
"2.14.6"
6+
"2.14.6",
7+
"2.15.0"
118
]

tautulli/api/json_api.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -638,7 +638,7 @@ def edit_user(self, user_id: str, friendly_name: str = None, custom_thumb: str =
638638
def export_metadata(self, section_id: int = None, user_id: int = None, rating_key: int = None,
639639
file_format: str = 'csv', metadata_level: int = 1, media_info_level: int = 1,
640640
thumb_level: int = 0, art_level: int = 0, custom_fields: List[str] = None,
641-
export_type: str = None, individual_files: bool = False) -> bool:
641+
export_type: str = None, individual_files: bool = False, logo_level: int = 0) -> bool:
642642
"""
643643
Export library or media metadata to a file
644644
@@ -664,6 +664,8 @@ def export_metadata(self, section_id: int = None, user_id: int = None, rating_ke
664664
:type export_type: str, optional
665665
:param individual_files: Export each item as an individual field for library/user export (default: False)
666666
:type individual_files: bool, optional
667+
:param logo_level: Level of logo images to export (default: 0)
668+
:type logo_level: int, optional
667669
:returns: `True` if successful, `False` if unsuccessful
668670
:rtype: bool
669671
"""
@@ -681,7 +683,7 @@ def export_metadata(self, section_id: int = None, user_id: int = None, rating_ke
681683
params = build_optional_params(file_format=file_format, metadata_level=metadata_level,
682684
media_info_level=media_info_level, thumb_level=thumb_level, art_level=art_level,
683685
custom_fields=custom_fields, export_type=export_type,
684-
individual_files=individual_files)
686+
individual_files=individual_files, logo_level=logo_level)
685687
name, value = _which_used(section_id=section_id, user_id=user_id, rating_key=rating_key)
686688
if name:
687689
params[name] = value

tautulli/api/object_api.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,7 @@ def edit_user(self, user_id: str, friendly_name: str = None, custom_thumb: str =
449449
def export_metadata(self, section_id: int = None, user_id: int = None, rating_key: int = None,
450450
file_format: str = 'csv', metadata_level: int = 1, media_info_level: int = 1,
451451
thumb_level: int = 0, art_level: int = 0, custom_fields: List[str] = None,
452-
export_type: str = None, individual_files: bool = False) -> bool:
452+
export_type: str = None, individual_files: bool = False, logo_level: int = 0) -> bool:
453453
"""
454454
Export library or media metadata to a file
455455
@@ -475,6 +475,8 @@ def export_metadata(self, section_id: int = None, user_id: int = None, rating_ke
475475
:type export_type: str, optional
476476
:param individual_files: Export each item as an individual field for library/user export (default: False)
477477
:type individual_files: bool, optional
478+
:param logo_level: Level of logo images to export (default: 0)
479+
:type logo_level: int, optional
478480
:returns: `True` if successful, `False` if unsuccessful
479481
:rtype: bool
480482
"""

tautulli/models/exports_table.py

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class DatumModel(BaseModel):
2121
file_size: Optional[int] = None
2222
filename: Optional[Any] = None
2323
individual_files: Optional[int] = None
24+
logo_level: Optional[int] = None
2425
media_info_level: Optional[int] = None
2526
media_type: Optional[str] = None
2627
media_type_title: Optional[str] = None

tautulli/models/metadata.py

+61
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ class MediaInfoItemModel(BaseModel):
8383
channel_vcn: Optional[str] = None
8484
parts: Optional[List[PartModel]] = None
8585

86+
8687
class MarkerModel(BaseModel):
8788
id: Optional[int] = None
8889
type: Optional[str] = None
@@ -91,6 +92,7 @@ class MarkerModel(BaseModel):
9192
first: Optional[bool] = None
9293
final: Optional[bool] = None
9394

95+
9496
class MetadataModel(BaseModel):
9597
media_type: Optional[str] = None
9698
section_id: Optional[str] = None
@@ -146,6 +148,65 @@ class MetadataModel(BaseModel):
146148
media_info: Optional[List[MediaInfoItemModel]] = None
147149
edition_title: Optional[str] = None
148150
markers: Optional[MarkerModel] = None
151+
slug: Optional[str] = None
152+
parent_slug: Optional[str] = None
153+
grandparent_slug: Optional[str] = None
154+
155+
@property
156+
def is_movie(self) -> bool:
157+
return self.media_type == "movie"
158+
159+
@property
160+
def is_show(self) -> bool:
161+
return self.media_type == "show"
162+
163+
@property
164+
def is_season(self) -> bool:
165+
return self.media_type == "season"
166+
167+
@property
168+
def is_episode(self) -> bool:
169+
return self.media_type == "episode"
170+
171+
@property
172+
def is_artist(self) -> bool:
173+
return self.media_type == "artist"
174+
175+
@property
176+
def is_album(self) -> bool:
177+
return self.media_type == "album"
178+
179+
@property
180+
def is_track(self) -> bool:
181+
return self.media_type == "track"
182+
183+
@property
184+
def is_clip(self) -> bool:
185+
return self.media_type == "clip"
149186

187+
@property
188+
def _plex_watch_url_slug(self) -> str:
189+
if any([self.is_movie, self.is_show, self.is_artist, self.is_clip]):
190+
return self.slug
191+
elif any([self.is_season, self.is_album]):
192+
return self.parent_slug
193+
elif any([self.is_episode, self.is_track]):
194+
return self.grandparent_slug
195+
return ""
150196

197+
@property
198+
def _plex_watch_url_type(self) -> str:
199+
if self.is_movie:
200+
return "movie"
201+
elif any([self.is_show, self.is_season, self.is_episode]):
202+
return "show"
203+
else:
204+
return ""
151205

206+
@property
207+
def plex_watch_url(self) -> str:
208+
_prefix = self._plex_watch_url_type
209+
_slug = self._plex_watch_url_slug
210+
if not _prefix or not _slug:
211+
return ""
212+
return f"https://watch.plex.tv/{_prefix}/{_slug}"

0 commit comments

Comments
 (0)