upload, select, remove subtitles

Movies and Episodes can now have subtitle files uploaded, selected (for user?), and removed.
Episodes was missing subtitleStreams function.
This commit is contained in:
blacktwin 2019-09-23 10:47:12 -04:00 committed by GitHub
parent 810b469add
commit 5365d7d7f8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -3,7 +3,7 @@ from plexapi import media, utils
from plexapi.exceptions import BadRequest, NotFound
from plexapi.base import Playable, PlexPartialObject
from plexapi.compat import quote_plus
import ntpath
class Video(PlexPartialObject):
""" Base class for all video objects including :class:`~plexapi.video.Movie`,
@ -227,6 +227,32 @@ class Movie(Playable, Video):
streams += part.subtitleStreams()
return streams
def uploadSubtitles(self, file):
""" Upload Subtitle file for video. """
url = '%s/subtitles' % self.key
filename = ntpath.basename(file)
with open(file, 'rb') as subfile:
params = {'title': filename,
'format': filename.rsplit('.', 1)[1]
}
headers = {'Accept': 'text/plain, */*'}
self._server.query(url, self._server._session.post, data=subfile, params=params, headers=headers)
self.reload()
def selectSubtitle(self, streamID=int, streamTitle=str):
url = '/library/parts/%s' % self.media[0].parts[0].id
for stream in self.subtitleStreams():
if streamID == stream.id or streamTitle == stream.title:
params = {'subtitleStreamID': stream.id}
self._server.query(url, self._server._session.put, params=params)
self.reload()
def removeSubtitles(self, streamID=int, streamTitle=str):
for stream in self.subtitleStreams():
if streamID == stream.id or streamTitle == stream.title:
self._server.query(stream.key, self._server._session.delete)
self.reload()
def _prettyfilename(self):
# This is just for compat.
return self.title
@ -622,3 +648,37 @@ class Episode(Playable, Video):
def _defaultSyncTitle(self):
""" Returns str, default title for a new syncItem. """
return '%s - %s - (%s) %s' % (self.grandparentTitle, self.parentTitle, self.seasonEpisode, self.title)
def subtitleStreams(self):
""" Returns a list of :class:`~plexapi.media.SubtitleStream` objects for all MediaParts. """
streams = []
for elem in self.media:
for part in elem.parts:
streams += part.subtitleStreams()
return streams
def uploadSubtitles(self, file):
""" Upload Subtitle file for video. """
url = '%s/subtitles' % self.key
filename = ntpath.basename(file)
with open(file, 'rb') as subfile:
params = {'title': filename,
'format': filename.rsplit('.', 1)[1]
}
headers = {'Accept': 'text/plain, */*'}
self._server.query(url, self._server._session.post, data=subfile, params=params, headers=headers)
self.reload()
def selectSubtitle(self, streamID=int, streamTitle=str):
url = '/library/parts/%s' % self.media[0].parts[0].id
for stream in self.subtitleStreams():
if streamID == stream.id or streamTitle == stream.title:
params = {'subtitleStreamID': stream.id}
self._server.query(url, self._server._session.put, params=params)
self.reload()
def removeSubtitles(self, streamID=int, streamTitle=str):
for stream in self.subtitleStreams():
if streamID == stream.id or streamTitle == stream.title:
self._server.query(stream.key, self._server._session.delete)
self.reload()