Skip to content

Commit 5365d7d

Browse files
authored
upload, select, remove subtitles
Movies and Episodes can now have subtitle files uploaded, selected (for user?), and removed. Episodes was missing subtitleStreams function.
1 parent 810b469 commit 5365d7d

File tree

1 file changed

+61
-1
lines changed

1 file changed

+61
-1
lines changed

plexapi/video.py

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from plexapi.exceptions import BadRequest, NotFound
44
from plexapi.base import Playable, PlexPartialObject
55
from plexapi.compat import quote_plus
6-
6+
import ntpath
77

88
class Video(PlexPartialObject):
99
""" Base class for all video objects including :class:`~plexapi.video.Movie`,
@@ -227,6 +227,32 @@ def subtitleStreams(self):
227227
streams += part.subtitleStreams()
228228
return streams
229229

230+
def uploadSubtitles(self, file):
231+
""" Upload Subtitle file for video. """
232+
url = '%s/subtitles' % self.key
233+
filename = ntpath.basename(file)
234+
with open(file, 'rb') as subfile:
235+
params = {'title': filename,
236+
'format': filename.rsplit('.', 1)[1]
237+
}
238+
headers = {'Accept': 'text/plain, */*'}
239+
self._server.query(url, self._server._session.post, data=subfile, params=params, headers=headers)
240+
self.reload()
241+
242+
def selectSubtitle(self, streamID=int, streamTitle=str):
243+
url = '/library/parts/%s' % self.media[0].parts[0].id
244+
for stream in self.subtitleStreams():
245+
if streamID == stream.id or streamTitle == stream.title:
246+
params = {'subtitleStreamID': stream.id}
247+
self._server.query(url, self._server._session.put, params=params)
248+
self.reload()
249+
250+
def removeSubtitles(self, streamID=int, streamTitle=str):
251+
for stream in self.subtitleStreams():
252+
if streamID == stream.id or streamTitle == stream.title:
253+
self._server.query(stream.key, self._server._session.delete)
254+
self.reload()
255+
230256
def _prettyfilename(self):
231257
# This is just for compat.
232258
return self.title
@@ -622,3 +648,37 @@ def show(self):
622648
def _defaultSyncTitle(self):
623649
""" Returns str, default title for a new syncItem. """
624650
return '%s - %s - (%s) %s' % (self.grandparentTitle, self.parentTitle, self.seasonEpisode, self.title)
651+
652+
def subtitleStreams(self):
653+
""" Returns a list of :class:`~plexapi.media.SubtitleStream` objects for all MediaParts. """
654+
streams = []
655+
for elem in self.media:
656+
for part in elem.parts:
657+
streams += part.subtitleStreams()
658+
return streams
659+
660+
def uploadSubtitles(self, file):
661+
""" Upload Subtitle file for video. """
662+
url = '%s/subtitles' % self.key
663+
filename = ntpath.basename(file)
664+
with open(file, 'rb') as subfile:
665+
params = {'title': filename,
666+
'format': filename.rsplit('.', 1)[1]
667+
}
668+
headers = {'Accept': 'text/plain, */*'}
669+
self._server.query(url, self._server._session.post, data=subfile, params=params, headers=headers)
670+
self.reload()
671+
672+
def selectSubtitle(self, streamID=int, streamTitle=str):
673+
url = '/library/parts/%s' % self.media[0].parts[0].id
674+
for stream in self.subtitleStreams():
675+
if streamID == stream.id or streamTitle == stream.title:
676+
params = {'subtitleStreamID': stream.id}
677+
self._server.query(url, self._server._session.put, params=params)
678+
self.reload()
679+
680+
def removeSubtitles(self, streamID=int, streamTitle=str):
681+
for stream in self.subtitleStreams():
682+
if streamID == stream.id or streamTitle == stream.title:
683+
self._server.query(stream.key, self._server._session.delete)
684+
self.reload()

0 commit comments

Comments
 (0)