|
3 | 3 | from plexapi.exceptions import BadRequest, NotFound |
4 | 4 | from plexapi.base import Playable, PlexPartialObject |
5 | 5 | from plexapi.compat import quote_plus |
6 | | - |
| 6 | +import ntpath |
7 | 7 |
|
8 | 8 | class Video(PlexPartialObject): |
9 | 9 | """ Base class for all video objects including :class:`~plexapi.video.Movie`, |
@@ -227,6 +227,32 @@ def subtitleStreams(self): |
227 | 227 | streams += part.subtitleStreams() |
228 | 228 | return streams |
229 | 229 |
|
| 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 | + |
230 | 256 | def _prettyfilename(self): |
231 | 257 | # This is just for compat. |
232 | 258 | return self.title |
@@ -622,3 +648,37 @@ def show(self): |
622 | 648 | def _defaultSyncTitle(self): |
623 | 649 | """ Returns str, default title for a new syncItem. """ |
624 | 650 | 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