When will Plex Media Server shift to Python 3?

As of January 1st, Python 2 has been sunsetted. It’s no longer maintained upstream and no further patches or fixes, including security fixes, will be supported by the Python team. Debian is pushing to remove it.

Are there plans to shift to Python 3.x?
Is there or will there be a testing release?

2 Likes

I wish Plex developers were that close and spoke directly to us.

Removing all the streaming channels removed the biggest vulnerability.
Now, the only use of plug-ins from Plex are those which we author.

Any security risk comes from user-added third party plug-ins.

I’d highly recommend, and request that you reconsider leaving any Python as Py2 code. Distros will start dropping Python 2, I know for example, that Gentoo is in the process of doing that now. I’d hate to suddenly lose the ability to continue using PMS because there was no Py3 port.

3 Likes

Another question from the downstream Gentoo bugtracker:
Will it be possible to package PMS without Python 2.7 bundled, using the system libraries as a dependency instead?

In short – No. Python 2.7 is interwoven in the “Resources” within PMS.
There have been changes made to it over stock 2.7 distributions (security, e.g. SNI, etc)

Unfortunately, unless you can complete and release this in less than 30 days, gentoo users will lose the plex package, and will have to look at a migration solution to continue using plex for their distribution. The package has been lastrite’d yesterday due to this ongoing python2.7 issue, and will be gone on October 20th.

That is Gentoo’s decision.

I don’t see how that stops anyone from installing PMS manually using the command line.

1 Like

Have to say this feels a little dismissive.
Being removed from Gentoo Portage is a serious concern.
Portage is the best feature about Gentoo since it provides stability and continuous updates to packages and their dependencies.
Manually installing is always possible, but it’s not a typical use-case. It basically equates to side-loading an app on your phone.
Many Gentoo users just won’t bother installing and manually maintaining a package outside Portage.

At this point all we ask for is a clear roadmap for phasing out Python 2.
Thanks.

2 Likes

What avalanchee said. And there’s also the migration headaches from one package to another. I’m now contemplating just sandboxing the whole of PMS for it seems to be a giant security risk.

2 Likes

I’d like to second what the others have said.

The Plex package being removed from the Gentoo distribution means I’m going to stop using the product entirely.

Please provide some form of roadmap for phasing out Python 2.7.

The language is end-of-life regardless, and shouldn’t be used, especially not with custom patches.

Please allow me to express in a different way.

  1. Effective PMS 1.15.0, our entire CI changed. At that time, all Linux binaries asserted the singular dependency on glibc 2.14.1. All external package dependencies were reduced to minimal required functionality and bound to PMS as runtime libraries (which now exist in the lib subdirectory).

  2. Gentoo was never an officially supported distribution however the new installation scripting made installation on Gentoo easier.

  3. The use of Python 2.7 is fully contained within PMS itself as a PMS-specific runtime library which PMS and its processes load

If you examine the contents of the Resources tree, nowhere will you find the Python 2.7 interpreter. I have included below for your reference.

[Resources] # find . -name \*py\*
./Python/lib/python2.7
./Python/lib/python2.7/audiodev.py
./Python/lib/python2.7/repr.py
./Python/lib/python2.7/gzip.py
./Python/lib/python2.7/gettext.py
./Python/lib/python2.7/UserDict.py
./Python/lib/python2.7/threading.py
./Python/lib/python2.7/dummy_threading.py
./Python/lib/python2.7/shutil.py
./Python/lib/python2.7/HTMLParser.py
./Python/lib/python2.7/pdb.py
./Python/lib/python2.7/statvfs.py
./Python/lib/python2.7/mimetools.py
./Python/lib/python2.7/compiler/pycodegen.py
./Python/lib/python2.7/compiler/pyassem.py
./Python/lib/python2.7/compiler/transformer.py
./Python/lib/python2.7/compiler/consts.py
./Python/lib/python2.7/compiler/symbols.py
./Python/lib/python2.7/compiler/future.py
./Python/lib/python2.7/compiler/visitor.py
./Python/lib/python2.7/compiler/misc.py
./Python/lib/python2.7/compiler/ast.py
./Python/lib/python2.7/compiler/syntax.py
./Python/lib/python2.7/compiler/__init__.py
./Python/lib/python2.7/Cookie.py
./Python/lib/python2.7/io.py
./Python/lib/python2.7/toaiff.py
./Python/lib/python2.7/sre_constants.py
./Python/lib/python2.7/getopt.py
./Python/lib/python2.7/hmac.py
./Python/lib/python2.7/Bastion.py
./Python/lib/python2.7/string.py
./Python/lib/python2.7/ftplib.py
./Python/lib/python2.7/robotparser.py
./Python/lib/python2.7/cookielib.py
./Python/lib/python2.7/SocketServer.py
./Python/lib/python2.7/poplib.py
./Python/lib/python2.7/ssl.py
./Python/lib/python2.7/tabnanny.py
./Python/lib/python2.7/asynchat.py
./Python/lib/python2.7/subprocess.py
./Python/lib/python2.7/numbers.py
./Python/lib/python2.7/codecs.py
./Python/lib/python2.7/decimal.py
./Python/lib/python2.7/email/parser.py
./Python/lib/python2.7/email/charset.py
./Python/lib/python2.7/email/iterators.py
./Python/lib/python2.7/email/generator.py
./Python/lib/python2.7/email/quoprimime.py
./Python/lib/python2.7/email/message.py
./Python/lib/python2.7/email/base64mime.py
./Python/lib/python2.7/email/feedparser.py
./Python/lib/python2.7/email/mime/application.py
./Python/lib/python2.7/email/mime/text.py
./Python/lib/python2.7/email/mime/base.py
./Python/lib/python2.7/email/mime/message.py
./Python/lib/python2.7/email/mime/multipart.py
./Python/lib/python2.7/email/mime/audio.py
./Python/lib/python2.7/email/mime/nonmultipart.py
./Python/lib/python2.7/email/mime/__init__.py
./Python/lib/python2.7/email/mime/image.py
./Python/lib/python2.7/email/encoders.py
./Python/lib/python2.7/email/utils.py
./Python/lib/python2.7/email/_parseaddr.py
./Python/lib/python2.7/email/__init__.py
./Python/lib/python2.7/email/header.py
./Python/lib/python2.7/email/errors.py
./Python/lib/python2.7/sunaudio.py
./Python/lib/python2.7/profile.py
./Python/lib/python2.7/dis.py
./Python/lib/python2.7/xmllib.py
./Python/lib/python2.7/telnetlib.py
./Python/lib/python2.7/token.py
./Python/lib/python2.7/_abcoll.py
./Python/lib/python2.7/quopri.py
./Python/lib/python2.7/code.py
./Python/lib/python2.7/popen2.py
./Python/lib/python2.7/doctest.py
./Python/lib/python2.7/rlcompleter.py
./Python/lib/python2.7/contextlib.py
./Python/lib/python2.7/netrc.py
./Python/lib/python2.7/sre.py
./Python/lib/python2.7/mutex.py
./Python/lib/python2.7/nntplib.py
./Python/lib/python2.7/argparse.py
./Python/lib/python2.7/weakref.py
./Python/lib/python2.7/plistlib.py
./Python/lib/python2.7/genericpath.py
./Python/lib/python2.7/wave.py
./Python/lib/python2.7/traceback.py
./Python/lib/python2.7/dummy_thread.py
./Python/lib/python2.7/formatter.py
./Python/lib/python2.7/bdb.py
./Python/lib/python2.7/pkgutil.py
./Python/lib/python2.7/shelve.py
./Python/lib/python2.7/SimpleHTTPServer.py
./Python/lib/python2.7/re.py
./Python/lib/python2.7/macpath.py
./Python/lib/python2.7/dbhash.py
./Python/lib/python2.7/_weakrefset.py
./Python/lib/python2.7/user.py
./Python/lib/python2.7/__phello__.foo.py
./Python/lib/python2.7/hashlib.py
./Python/lib/python2.7/imaplib.py
./Python/lib/python2.7/aifc.py
./Python/lib/python2.7/dumbdbm.py
./Python/lib/python2.7/webbrowser.py
./Python/lib/python2.7/sndhdr.py
./Python/lib/python2.7/antigravity.py
./Python/lib/python2.7/json/tool.py
./Python/lib/python2.7/json/scanner.py
./Python/lib/python2.7/json/tests/test_pass2.py
./Python/lib/python2.7/json/tests/test_fail.py
./Python/lib/python2.7/json/tests/test_speedups.py
./Python/lib/python2.7/json/tests/test_encode_basestring_ascii.py
./Python/lib/python2.7/json/tests/test_recursion.py
./Python/lib/python2.7/json/tests/test_unicode.py
./Python/lib/python2.7/json/tests/test_scanstring.py
./Python/lib/python2.7/json/tests/test_tool.py
./Python/lib/python2.7/json/tests/test_dump.py
./Python/lib/python2.7/json/tests/test_float.py
./Python/lib/python2.7/json/tests/test_indent.py
./Python/lib/python2.7/json/tests/test_pass3.py
./Python/lib/python2.7/json/tests/test_check_circular.py
./Python/lib/python2.7/json/tests/test_decode.py
./Python/lib/python2.7/json/tests/test_separators.py
./Python/lib/python2.7/json/tests/test_pass1.py
./Python/lib/python2.7/json/tests/test_default.py
./Python/lib/python2.7/json/tests/__init__.py
./Python/lib/python2.7/json/encoder.py
./Python/lib/python2.7/json/decoder.py
./Python/lib/python2.7/json/__init__.py
./Python/lib/python2.7/inspect.py
./Python/lib/python2.7/cmd.py
./Python/lib/python2.7/codeop.py
./Python/lib/python2.7/base64.py
./Python/lib/python2.7/plat-linux2/TYPES.py
./Python/lib/python2.7/plat-linux2/IN.py
./Python/lib/python2.7/plat-linux2/DLFCN.py
./Python/lib/python2.7/plat-linux2/CDROM.py
./Python/lib/python2.7/fractions.py
./Python/lib/python2.7/copy.py
./Python/lib/python2.7/ensurepip/_uninstall.py
./Python/lib/python2.7/ensurepip/__main__.py
./Python/lib/python2.7/ensurepip/_bundled/setuptools-41.2.0-py2.py3-none-any.whl
./Python/lib/python2.7/ensurepip/_bundled/pip-19.2.3-py2.py3-none-any.whl
./Python/lib/python2.7/ensurepip/__init__.py
./Python/lib/python2.7/sets.py
./Python/lib/python2.7/chunk.py
./Python/lib/python2.7/stat.py
./Python/lib/python2.7/tokenize.py
./Python/lib/python2.7/locale.py
./Python/lib/python2.7/pstats.py
./Python/lib/python2.7/fileinput.py
./Python/lib/python2.7/smtpd.py
./Python/lib/python2.7/runpy.py
./Python/lib/python2.7/imghdr.py
./Python/lib/python2.7/sgmllib.py
./Python/lib/python2.7/atexit.py
./Python/lib/python2.7/mimify.py
./Python/lib/python2.7/ntpath.py
./Python/lib/python2.7/tempfile.py
./Python/lib/python2.7/logging/handlers.py
./Python/lib/python2.7/logging/config.py
./Python/lib/python2.7/logging/__init__.py
./Python/lib/python2.7/fpformat.py
./Python/lib/python2.7/sre_compile.py
./Python/lib/python2.7/socket.py
./Python/lib/python2.7/random.py
./Python/lib/python2.7/py_compile.py
./Python/lib/python2.7/sched.py
./Python/lib/python2.7/stringold.py
./Python/lib/python2.7/pickle.py
./Python/lib/python2.7/mhlib.py
./Python/lib/python2.7/cgitb.py
./Python/lib/python2.7/curses/textpad.py
./Python/lib/python2.7/curses/panel.py
./Python/lib/python2.7/curses/wrapper.py
./Python/lib/python2.7/curses/has_key.py
./Python/lib/python2.7/curses/__init__.py
./Python/lib/python2.7/curses/ascii.py
./Python/lib/python2.7/urlparse.py
./Python/lib/python2.7/MimeWriter.py
./Python/lib/python2.7/cgi.py
./Python/lib/python2.7/getpass.py
./Python/lib/python2.7/modulefinder.py
./Python/lib/python2.7/_strptime.py
./Python/lib/python2.7/whichdb.py
./Python/lib/python2.7/sha.py
./Python/lib/python2.7/new.py
./Python/lib/python2.7/__future__.py
./Python/lib/python2.7/filecmp.py
./Python/lib/python2.7/htmlentitydefs.py
./Python/lib/python2.7/linecache.py
./Python/lib/python2.7/colorsys.py
./Python/lib/python2.7/sqlite3/dump.py
./Python/lib/python2.7/sqlite3/dbapi2.py
./Python/lib/python2.7/sqlite3/__init__.py
./Python/lib/python2.7/md5.py
./Python/lib/python2.7/platform.py
./Python/lib/python2.7/mimetypes.py
./Python/lib/python2.7/StringIO.py
./Python/lib/python2.7/encodings/cp857.py
./Python/lib/python2.7/encodings/cp1256.py
./Python/lib/python2.7/encodings/cp1006.py
./Python/lib/python2.7/encodings/rot_13.py
./Python/lib/python2.7/encodings/iso2022_jp_1.py
./Python/lib/python2.7/encodings/mbcs.py
./Python/lib/python2.7/encodings/mac_farsi.py
./Python/lib/python2.7/encodings/cp866.py
./Python/lib/python2.7/encodings/gb2312.py
./Python/lib/python2.7/encodings/iso2022_jp_2.py
./Python/lib/python2.7/encodings/iso8859_11.py
./Python/lib/python2.7/encodings/cp1254.py
./Python/lib/python2.7/encodings/cp860.py
./Python/lib/python2.7/encodings/mac_iceland.py
./Python/lib/python2.7/encodings/cp1251.py
./Python/lib/python2.7/encodings/iso8859_6.py
./Python/lib/python2.7/encodings/cp500.py
./Python/lib/python2.7/encodings/cp720.py
./Python/lib/python2.7/encodings/iso8859_3.py
./Python/lib/python2.7/encodings/cp863.py
./Python/lib/python2.7/encodings/cp1253.py
./Python/lib/python2.7/encodings/iso8859_2.py
./Python/lib/python2.7/encodings/zlib_codec.py
./Python/lib/python2.7/encodings/hz.py
./Python/lib/python2.7/encodings/gb18030.py
./Python/lib/python2.7/encodings/cp1257.py
./Python/lib/python2.7/encodings/iso2022_jp_ext.py
./Python/lib/python2.7/encodings/cp037.py
./Python/lib/python2.7/encodings/cp858.py
./Python/lib/python2.7/encodings/idna.py
./Python/lib/python2.7/encodings/iso8859_14.py
./Python/lib/python2.7/encodings/shift_jisx0213.py
./Python/lib/python2.7/encodings/iso8859_16.py
./Python/lib/python2.7/encodings/iso8859_1.py
./Python/lib/python2.7/encodings/iso8859_13.py
./Python/lib/python2.7/encodings/cp865.py
./Python/lib/python2.7/encodings/cp864.py
./Python/lib/python2.7/encodings/mac_roman.py
./Python/lib/python2.7/encodings/cp950.py
./Python/lib/python2.7/encodings/latin_1.py
./Python/lib/python2.7/encodings/unicode_escape.py
./Python/lib/python2.7/encodings/cp856.py
./Python/lib/python2.7/encodings/utf_32_le.py
./Python/lib/python2.7/encodings/iso8859_8.py
./Python/lib/python2.7/encodings/base64_codec.py
./Python/lib/python2.7/encodings/iso2022_jp_2004.py
./Python/lib/python2.7/encodings/cp1252.py
./Python/lib/python2.7/encodings/iso8859_5.py
./Python/lib/python2.7/encodings/cp852.py
./Python/lib/python2.7/encodings/utf_16.py
./Python/lib/python2.7/encodings/mac_centeuro.py
./Python/lib/python2.7/encodings/cp775.py
./Python/lib/python2.7/encodings/cp1026.py
./Python/lib/python2.7/encodings/hex_codec.py
./Python/lib/python2.7/encodings/charmap.py
./Python/lib/python2.7/encodings/ptcp154.py
./Python/lib/python2.7/encodings/shift_jis.py
./Python/lib/python2.7/encodings/cp855.py
./Python/lib/python2.7/encodings/utf_32_be.py
./Python/lib/python2.7/encodings/utf_16_be.py
./Python/lib/python2.7/encodings/cp1255.py
./Python/lib/python2.7/encodings/cp1140.py
./Python/lib/python2.7/encodings/johab.py
./Python/lib/python2.7/encodings/cp437.py
./Python/lib/python2.7/encodings/cp861.py
./Python/lib/python2.7/encodings/euc_jisx0213.py
./Python/lib/python2.7/encodings/uu_codec.py
./Python/lib/python2.7/encodings/mac_latin2.py
./Python/lib/python2.7/encodings/cp862.py
./Python/lib/python2.7/encodings/iso2022_kr.py
./Python/lib/python2.7/encodings/iso8859_4.py
./Python/lib/python2.7/encodings/tis_620.py
./Python/lib/python2.7/encodings/utf_32.py
./Python/lib/python2.7/encodings/koi8_r.py
./Python/lib/python2.7/encodings/koi8_u.py
./Python/lib/python2.7/encodings/iso2022_jp.py
./Python/lib/python2.7/encodings/utf_8.py
./Python/lib/python2.7/encodings/hp_roman8.py
./Python/lib/python2.7/encodings/mac_croatian.py
./Python/lib/python2.7/encodings/cp424.py
./Python/lib/python2.7/encodings/iso8859_15.py
./Python/lib/python2.7/encodings/cp1250.py
./Python/lib/python2.7/encodings/euc_jis_2004.py
./Python/lib/python2.7/encodings/utf_7.py
./Python/lib/python2.7/encodings/cp1258.py
./Python/lib/python2.7/encodings/iso8859_10.py
./Python/lib/python2.7/encodings/big5.py
./Python/lib/python2.7/encodings/aliases.py
./Python/lib/python2.7/encodings/big5hkscs.py
./Python/lib/python2.7/encodings/euc_kr.py
./Python/lib/python2.7/encodings/cp850.py
./Python/lib/python2.7/encodings/utf_16_le.py
./Python/lib/python2.7/encodings/string_escape.py
./Python/lib/python2.7/encodings/shift_jis_2004.py
./Python/lib/python2.7/encodings/raw_unicode_escape.py
./Python/lib/python2.7/encodings/mac_greek.py
./Python/lib/python2.7/encodings/cp874.py
./Python/lib/python2.7/encodings/cp737.py
./Python/lib/python2.7/encodings/mac_cyrillic.py
./Python/lib/python2.7/encodings/utf_8_sig.py
./Python/lib/python2.7/encodings/undefined.py
./Python/lib/python2.7/encodings/quopri_codec.py
./Python/lib/python2.7/encodings/bz2_codec.py
./Python/lib/python2.7/encodings/unicode_internal.py
./Python/lib/python2.7/encodings/cp875.py
./Python/lib/python2.7/encodings/cp869.py
./Python/lib/python2.7/encodings/euc_jp.py
./Python/lib/python2.7/encodings/mac_turkish.py
./Python/lib/python2.7/encodings/cp949.py
./Python/lib/python2.7/encodings/iso2022_jp_3.py
./Python/lib/python2.7/encodings/iso8859_7.py
./Python/lib/python2.7/encodings/__init__.py
./Python/lib/python2.7/encodings/mac_romanian.py
./Python/lib/python2.7/encodings/ascii.py
./Python/lib/python2.7/encodings/palmos.py
./Python/lib/python2.7/encodings/cp932.py
./Python/lib/python2.7/encodings/gbk.py
./Python/lib/python2.7/encodings/punycode.py
./Python/lib/python2.7/encodings/iso8859_9.py
./Python/lib/python2.7/encodings/mac_arabic.py
./Python/lib/python2.7/hotshot/log.py
./Python/lib/python2.7/hotshot/stones.py
./Python/lib/python2.7/hotshot/stats.py
./Python/lib/python2.7/hotshot/__init__.py
./Python/lib/python2.7/optparse.py
./Python/lib/python2.7/shlex.py
./Python/lib/python2.7/keyword.py
./Python/lib/python2.7/abc.py
./Python/lib/python2.7/wsgiref/handlers.py
./Python/lib/python2.7/wsgiref/util.py
./Python/lib/python2.7/wsgiref/validate.py
./Python/lib/python2.7/wsgiref/simple_server.py
./Python/lib/python2.7/wsgiref/headers.py
./Python/lib/python2.7/wsgiref/__init__.py
./Python/lib/python2.7/tarfile.py
./Python/lib/python2.7/httplib.py
./Python/lib/python2.7/opcode.py
./Python/lib/python2.7/ConfigParser.py
./Python/lib/python2.7/pydoc_data
./Python/lib/python2.7/pydoc_data/topics.py
./Python/lib/python2.7/pydoc_data/__init__.py
./Python/lib/python2.7/pyclbr.py
./Python/lib/python2.7/unittest/suite.py
./Python/lib/python2.7/unittest/util.py
./Python/lib/python2.7/unittest/signals.py
./Python/lib/python2.7/unittest/case.py
./Python/lib/python2.7/unittest/runner.py
./Python/lib/python2.7/unittest/__main__.py
./Python/lib/python2.7/unittest/loader.py
./Python/lib/python2.7/unittest/main.py
./Python/lib/python2.7/unittest/result.py
./Python/lib/python2.7/unittest/__init__.py
./Python/lib/python2.7/heapq.py
./Python/lib/python2.7/UserList.py
./Python/lib/python2.7/imputil.py
./Python/lib/python2.7/binhex.py
./Python/lib/python2.7/copy_reg.py
./Python/lib/python2.7/_LWPCookieJar.py
./Python/lib/python2.7/os2emxpath.py
./Python/lib/python2.7/difflib.py
./Python/lib/python2.7/ast.py
./Python/lib/python2.7/posixpath.py
./Python/lib/python2.7/ihooks.py
./Python/lib/python2.7/this.py
./Python/lib/python2.7/struct.py
./Python/lib/python2.7/uu.py
./Python/lib/python2.7/htmllib.py
./Python/lib/python2.7/SimpleXMLRPCServer.py
./Python/lib/python2.7/uuid.py
./Python/lib/python2.7/site-packages/lxml/isoschematron/__init__.py
./Python/lib/python2.7/site-packages/lxml/html/_setmixin.py
./Python/lib/python2.7/site-packages/lxml/html/diff.py
./Python/lib/python2.7/site-packages/lxml/html/_html5builder.py
./Python/lib/python2.7/site-packages/lxml/html/ElementSoup.py
./Python/lib/python2.7/site-packages/lxml/html/builder.py
./Python/lib/python2.7/site-packages/lxml/html/soupparser.py
./Python/lib/python2.7/site-packages/lxml/html/formfill.py
./Python/lib/python2.7/site-packages/lxml/html/html5parser.py
./Python/lib/python2.7/site-packages/lxml/html/clean.py
./Python/lib/python2.7/site-packages/lxml/html/tests/test_rewritelinks.py
./Python/lib/python2.7/site-packages/lxml/html/tests/test_feedparser_data.py
./Python/lib/python2.7/site-packages/lxml/html/tests/transform_feedparser_data.py
./Python/lib/python2.7/site-packages/lxml/html/tests/test_clean.py
./Python/lib/python2.7/site-packages/lxml/html/tests/test_forms.py
./Python/lib/python2.7/site-packages/lxml/html/tests/test_elementsoup.py
./Python/lib/python2.7/site-packages/lxml/html/tests/test_autolink.py
./Python/lib/python2.7/site-packages/lxml/html/tests/test_formfill.py
./Python/lib/python2.7/site-packages/lxml/html/tests/test_xhtml.py
./Python/lib/python2.7/site-packages/lxml/html/tests/test_diff.py
./Python/lib/python2.7/site-packages/lxml/html/tests/test_basic.py
./Python/lib/python2.7/site-packages/lxml/html/tests/__init__.py
./Python/lib/python2.7/site-packages/lxml/html/defs.py
./Python/lib/python2.7/site-packages/lxml/html/__init__.py
./Python/lib/python2.7/site-packages/lxml/html/_diffcommand.py
./Python/lib/python2.7/site-packages/lxml/html/usedoctest.py
./Python/lib/python2.7/site-packages/lxml/html/_dictmixin.py
./Python/lib/python2.7/site-packages/lxml/builder.py
./Python/lib/python2.7/site-packages/lxml/_elementpath.py
./Python/lib/python2.7/site-packages/lxml/ElementInclude.py
./Python/lib/python2.7/site-packages/lxml/pyclasslookup.py
./Python/lib/python2.7/site-packages/lxml/cssselect.py
./Python/lib/python2.7/site-packages/lxml/doctestcompare.py
./Python/lib/python2.7/site-packages/lxml/__init__.py
./Python/lib/python2.7/site-packages/lxml/usedoctest.py
./Python/lib/python2.7/site-packages/lxml/sax.py
./Python/lib/python2.7/site-packages/simplejson/tool.py
./Python/lib/python2.7/site-packages/simplejson/ordered_dict.py
./Python/lib/python2.7/site-packages/simplejson/scanner.py
./Python/lib/python2.7/site-packages/simplejson/compat.py
./Python/lib/python2.7/site-packages/simplejson/encoder.py
./Python/lib/python2.7/site-packages/simplejson/decoder.py
./Python/lib/python2.7/site-packages/simplejson/__init__.py
./Python/lib/python2.7/asyncore.py
./Python/lib/python2.7/zipfile.py
./Python/lib/python2.7/glob.py
./Python/lib/python2.7/os.py
./Python/lib/python2.7/types.py
./Python/lib/python2.7/calendar.py
./Python/lib/python2.7/multiprocessing/forking.py
./Python/lib/python2.7/multiprocessing/util.py
./Python/lib/python2.7/multiprocessing/connection.py
./Python/lib/python2.7/multiprocessing/synchronize.py
./Python/lib/python2.7/multiprocessing/sharedctypes.py
./Python/lib/python2.7/multiprocessing/queues.py
./Python/lib/python2.7/multiprocessing/managers.py
./Python/lib/python2.7/multiprocessing/reduction.py
./Python/lib/python2.7/multiprocessing/process.py
./Python/lib/python2.7/multiprocessing/heap.py
./Python/lib/python2.7/multiprocessing/pool.py
./Python/lib/python2.7/multiprocessing/dummy/connection.py
./Python/lib/python2.7/multiprocessing/dummy/__init__.py
./Python/lib/python2.7/multiprocessing/__init__.py
./Python/lib/python2.7/markupbase.py
./Python/lib/python2.7/anydbm.py
./Python/lib/python2.7/xdrlib.py
./Python/lib/python2.7/functools.py
./Python/lib/python2.7/macurl2path.py
./Python/lib/python2.7/cProfile.py
./Python/lib/python2.7/UserString.py
./Python/lib/python2.7/importlib/__init__.py
./Python/lib/python2.7/mailbox.py
./Python/lib/python2.7/xmlrpclib.py
./Python/lib/python2.7/pickletools.py
./Python/lib/python2.7/pydoc.py
./Python/lib/python2.7/symbol.py
./Python/lib/python2.7/compileall.py
./Python/lib/python2.7/pipes.py
./Python/lib/python2.7/pty.py
./Python/lib/python2.7/xml/sax/xmlreader.py
./Python/lib/python2.7/xml/sax/_exceptions.py
./Python/lib/python2.7/xml/sax/handler.py
./Python/lib/python2.7/xml/sax/expatreader.py
./Python/lib/python2.7/xml/sax/saxutils.py
./Python/lib/python2.7/xml/sax/__init__.py
./Python/lib/python2.7/xml/etree/ElementInclude.py
./Python/lib/python2.7/xml/etree/ElementPath.py
./Python/lib/python2.7/xml/etree/ElementTree.py
./Python/lib/python2.7/xml/etree/cElementTree.py
./Python/lib/python2.7/xml/etree/__init__.py
./Python/lib/python2.7/xml/dom/expatbuilder.py
./Python/lib/python2.7/xml/dom/pulldom.py
./Python/lib/python2.7/xml/dom/NodeFilter.py
./Python/lib/python2.7/xml/dom/minicompat.py
./Python/lib/python2.7/xml/dom/domreg.py
./Python/lib/python2.7/xml/dom/xmlbuilder.py
./Python/lib/python2.7/xml/dom/minidom.py
./Python/lib/python2.7/xml/dom/__init__.py
./Python/lib/python2.7/xml/parsers/expat.py
./Python/lib/python2.7/xml/parsers/__init__.py
./Python/lib/python2.7/xml/__init__.py
./Python/lib/python2.7/timeit.py
./Python/lib/python2.7/urllib2.py
./Python/lib/python2.7/_osx_support.py
./Python/lib/python2.7/fnmatch.py
./Python/lib/python2.7/collections.py
./Python/lib/python2.7/_sysconfigdata.py
./Python/lib/python2.7/posixfile.py
./Python/lib/python2.7/smtplib.py
./Python/lib/python2.7/stringprep.py
./Python/lib/python2.7/_pyio.py
./Python/lib/python2.7/sre_parse.py
./Python/lib/python2.7/bisect.py
./Python/lib/python2.7/dircache.py
./Python/lib/python2.7/warnings.py
./Python/lib/python2.7/lib-dynload/pyexpat.so
./Python/lib/python2.7/lib-dynload/Python-2.7.12-py2.7.egg-info
./Python/lib/python2.7/lib2to3/btm_utils.py
./Python/lib/python2.7/lib2to3/fixes/fix_imports2.py
./Python/lib/python2.7/lib2to3/fixes/fix_print.py
./Python/lib/python2.7/lib2to3/fixes/fix_funcattrs.py
./Python/lib/python2.7/lib2to3/fixes/fix_except.py
./Python/lib/python2.7/lib2to3/fixes/fix_operator.py
./Python/lib/python2.7/lib2to3/fixes/fix_isinstance.py
./Python/lib/python2.7/lib2to3/fixes/fix_intern.py
./Python/lib/python2.7/lib2to3/fixes/fix_reduce.py
./Python/lib/python2.7/lib2to3/fixes/fix_dict.py
./Python/lib/python2.7/lib2to3/fixes/fix_imports.py
./Python/lib/python2.7/lib2to3/fixes/fix_basestring.py
./Python/lib/python2.7/lib2to3/fixes/fix_xreadlines.py
./Python/lib/python2.7/lib2to3/fixes/fix_next.py
./Python/lib/python2.7/lib2to3/fixes/fix_exitfunc.py
./Python/lib/python2.7/lib2to3/fixes/fix_has_key.py
./Python/lib/python2.7/lib2to3/fixes/fix_methodattrs.py
./Python/lib/python2.7/lib2to3/fixes/fix_ne.py
./Python/lib/python2.7/lib2to3/fixes/fix_exec.py
./Python/lib/python2.7/lib2to3/fixes/fix_apply.py
./Python/lib/python2.7/lib2to3/fixes/fix_map.py
./Python/lib/python2.7/lib2to3/fixes/fix_itertools_imports.py
./Python/lib/python2.7/lib2to3/fixes/fix_throw.py
./Python/lib/python2.7/lib2to3/fixes/fix_execfile.py
./Python/lib/python2.7/lib2to3/fixes/fix_numliterals.py
./Python/lib/python2.7/lib2to3/fixes/fix_itertools.py
./Python/lib/python2.7/lib2to3/fixes/fix_buffer.py
./Python/lib/python2.7/lib2to3/fixes/fix_tuple_params.py
./Python/lib/python2.7/lib2to3/fixes/fix_types.py
./Python/lib/python2.7/lib2to3/fixes/fix_raise.py
./Python/lib/python2.7/lib2to3/fixes/fix_idioms.py
./Python/lib/python2.7/lib2to3/fixes/fix_renames.py
./Python/lib/python2.7/lib2to3/fixes/fix_long.py
./Python/lib/python2.7/lib2to3/fixes/fix_nonzero.py
./Python/lib/python2.7/lib2to3/fixes/fix_raw_input.py
./Python/lib/python2.7/lib2to3/fixes/fix_urllib.py
./Python/lib/python2.7/lib2to3/fixes/fix_import.py
./Python/lib/python2.7/lib2to3/fixes/fix_asserts.py
./Python/lib/python2.7/lib2to3/fixes/fix_unicode.py
./Python/lib/python2.7/lib2to3/fixes/fix_repr.py
./Python/lib/python2.7/lib2to3/fixes/fix_standarderror.py
./Python/lib/python2.7/lib2to3/fixes/fix_sys_exc.py
./Python/lib/python2.7/lib2to3/fixes/fix_ws_comma.py
./Python/lib/python2.7/lib2to3/fixes/fix_future.py
./Python/lib/python2.7/lib2to3/fixes/fix_zip.py
./Python/lib/python2.7/lib2to3/fixes/fix_filter.py
./Python/lib/python2.7/lib2to3/fixes/fix_metaclass.py
./Python/lib/python2.7/lib2to3/fixes/fix_xrange.py
./Python/lib/python2.7/lib2to3/fixes/fix_getcwdu.py
./Python/lib/python2.7/lib2to3/fixes/__init__.py
./Python/lib/python2.7/lib2to3/fixes/fix_set_literal.py
./Python/lib/python2.7/lib2to3/fixes/fix_input.py
./Python/lib/python2.7/lib2to3/fixes/fix_paren.py
./Python/lib/python2.7/lib2to3/pytree.py
./Python/lib/python2.7/lib2to3/fixer_util.py
./Python/lib/python2.7/lib2to3/__main__.py
./Python/lib/python2.7/lib2to3/refactor.py
./Python/lib/python2.7/lib2to3/patcomp.py
./Python/lib/python2.7/lib2to3/fixer_base.py
./Python/lib/python2.7/lib2to3/pgen2/parse.py
./Python/lib/python2.7/lib2to3/pgen2/literals.py
./Python/lib/python2.7/lib2to3/pgen2/pgen.py
./Python/lib/python2.7/lib2to3/pgen2/tokenize.py
./Python/lib/python2.7/lib2to3/pgen2/conv.py
./Python/lib/python2.7/lib2to3/pgen2/grammar.py
./Python/lib/python2.7/lib2to3/pgen2/token.py
./Python/lib/python2.7/lib2to3/pgen2/__init__.py
./Python/lib/python2.7/lib2to3/pgen2/driver.py
./Python/lib/python2.7/lib2to3/tests/test_pytree.py
./Python/lib/python2.7/lib2to3/tests/support.py
./Python/lib/python2.7/lib2to3/tests/data/bom.py
./Python/lib/python2.7/lib2to3/tests/data/fixers/myfixes/fix_preorder.py
./Python/lib/python2.7/lib2to3/tests/data/fixers/myfixes/fix_parrot.py
./Python/lib/python2.7/lib2to3/tests/data/fixers/myfixes/fix_last.py
./Python/lib/python2.7/lib2to3/tests/data/fixers/myfixes/fix_explicit.py
./Python/lib/python2.7/lib2to3/tests/data/fixers/myfixes/fix_first.py
./Python/lib/python2.7/lib2to3/tests/data/fixers/myfixes/__init__.py
./Python/lib/python2.7/lib2to3/tests/data/fixers/parrot_example.py
./Python/lib/python2.7/lib2to3/tests/data/fixers/bad_order.py
./Python/lib/python2.7/lib2to3/tests/data/fixers/no_fixer_cls.py
./Python/lib/python2.7/lib2to3/tests/data/crlf.py
./Python/lib/python2.7/lib2to3/tests/data/py3_test_grammar.py
./Python/lib/python2.7/lib2to3/tests/data/infinite_recursion.py
./Python/lib/python2.7/lib2to3/tests/data/different_encoding.py
./Python/lib/python2.7/lib2to3/tests/data/py2_test_grammar.py
./Python/lib/python2.7/lib2to3/tests/data/false_encoding.py
./Python/lib/python2.7/lib2to3/tests/test_main.py
./Python/lib/python2.7/lib2to3/tests/test_parser.py
./Python/lib/python2.7/lib2to3/tests/test_all_fixers.py
./Python/lib/python2.7/lib2to3/tests/pytree_idempotency.py
./Python/lib/python2.7/lib2to3/tests/test_util.py
./Python/lib/python2.7/lib2to3/tests/test_fixers.py
./Python/lib/python2.7/lib2to3/tests/test_refactor.py
./Python/lib/python2.7/lib2to3/tests/__init__.py
./Python/lib/python2.7/lib2to3/main.py
./Python/lib/python2.7/lib2to3/pygram.py
./Python/lib/python2.7/lib2to3/btm_matcher.py
./Python/lib/python2.7/lib2to3/__init__.py
./Python/lib/python2.7/rexec.py
./Python/lib/python2.7/CGIHTTPServer.py
./Python/lib/python2.7/pprint.py
./Python/lib/python2.7/_threading_local.py
./Python/lib/python2.7/BaseHTTPServer.py
./Python/lib/python2.7/tty.py
./Python/lib/python2.7/ctypes/_endian.py
./Python/lib/python2.7/ctypes/util.py
./Python/lib/python2.7/ctypes/macholib/dyld.py
./Python/lib/python2.7/ctypes/macholib/dylib.py
./Python/lib/python2.7/ctypes/macholib/framework.py
./Python/lib/python2.7/ctypes/macholib/__init__.py
./Python/lib/python2.7/ctypes/wintypes.py
./Python/lib/python2.7/ctypes/__init__.py
./Python/lib/python2.7/nturl2path.py
./Python/lib/python2.7/trace.py
./Python/lib/python2.7/sunau.py
./Python/lib/python2.7/site.py
./Python/lib/python2.7/sysconfig.py
./Python/lib/python2.7/symtable.py
./Python/lib/python2.7/commands.py
./Python/lib/python2.7/multifile.py
./Python/lib/python2.7/DocXMLRPCServer.py
./Python/lib/python2.7/urllib.py
./Python/lib/python2.7/textwrap.py
./Python/lib/python2.7/mailcap.py
./Python/lib/python2.7/rfc822.py
./Python/lib/python2.7/csv.py
./Python/lib/python2.7/Queue.py
./Python/lib/python2.7/_MozillaCookieJar.py
./Python/include/python2.7
./Python/include/python2.7/pyconfig.h
./html_parser__init__.py
./Plug-ins-a78fef9a9/Fanart-TV.bundle/Contents/Code/__init__.py
./Plug-ins-a78fef9a9/PlexMusic.bundle/Contents/Code/__init__.py
./Plug-ins-a78fef9a9/LastFM.bundle/Contents/Code/__init__.py
./Plug-ins-a78fef9a9/PersonalMedia.bundle/Contents/Code/__init__.py
./Plug-ins-a78fef9a9/OpenSubtitles.bundle/Contents/Code/__init__.py
./Plug-ins-a78fef9a9/PlexThemeMusic.bundle/Contents/Code/__init__.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Code/helpers.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Code/__init__.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Code/localmedia.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Code/subtitlehelpers.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Code/config.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Code/audiohelpers.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Code/videohelpers.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/_id3specs.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/__init__.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/monkeysaudio.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/oggspeex.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/optimfrog.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/_constants.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/oggvorbis.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/easyid3.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/oggopus.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/m4a.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/wavpack.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/trueaudio.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/_id3util.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/asf.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/_compat.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/_vorbis.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/musepack.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/easymp4.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/oggflac.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/ogg.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/oggtheora.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/_util.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/id3.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/mp4.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/flac.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/apev2.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/aiff.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/mp3.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mutagen/_id3frames.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/UnicodeHelper.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/ID3.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mp4file/__init__.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mp4file/atom.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mp4file/mp4file.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mp4file/atomsearch_test.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/mp4file/atomsearch.py
./Plug-ins-a78fef9a9/LocalMedia.bundle/Contents/Libraries/Shared/ID3v2.py
./Plug-ins-a78fef9a9/PlexMovieNew.bundle/Contents/Code/__init__.py
./Plug-ins-a78fef9a9/System.bundle/Contents/Code/installservice.py
./Plug-ins-a78fef9a9/System.bundle/Contents/Code/messageservice.py
./Plug-ins-a78fef9a9/System.bundle/Contents/Code/scannerservice.py
./Plug-ins-a78fef9a9/System.bundle/Contents/Code/__init__.py
./Plug-ins-a78fef9a9/System.bundle/Contents/Code/flagservice.py
./Plug-ins-a78fef9a9/System.bundle/Contents/Code/peerservice.py
./Plug-ins-a78fef9a9/System.bundle/Contents/Code/storeservice.py
./Plug-ins-a78fef9a9/System.bundle/Contents/Code/codeservice.py
./Plug-ins-a78fef9a9/System.bundle/Contents/Code/proxyservice.py
./Plug-ins-a78fef9a9/System.bundle/Contents/Code/streamservice.py
./Plug-ins-a78fef9a9/System.bundle/Contents/Code/systemservice.py
./Plug-ins-a78fef9a9/System.bundle/Contents/Code/helpservice.py
./Plug-ins-a78fef9a9/System.bundle/Contents/Code/agentservice.py
./Plug-ins-a78fef9a9/System.bundle/Contents/Code/playerservice.py
./Plug-ins-a78fef9a9/System.bundle/Contents/Code/bundleservice.py
./Plug-ins-a78fef9a9/Musicbrainz.bundle/Contents/Code/__init__.py
./Plug-ins-a78fef9a9/MoviePosterDB.bundle/Contents/Code/__init__.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Music/Plex Premium Music Scanner.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Music/Plex Music Scanner.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Music/Plex Music.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Series/Plex Series Scanner.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Photos/Plex Photo Scanner.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/AudioFiles.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/_id3specs.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/__init__.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/monkeysaudio.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/oggspeex.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/optimfrog.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/_constants.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/oggvorbis.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/easyid3.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/oggopus.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/m4a.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/wavpack.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/trueaudio.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/_id3util.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/asf.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/_compat.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/_vorbis.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/musepack.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/easymp4.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/oggflac.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/ogg.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/oggtheora.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/_util.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/id3.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/mp4.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/flac.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/apev2.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/aiff.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/mp3.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mutagen/_id3frames.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/Utils.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/titlecase.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/Media.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/UnicodeHelper.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/Filter.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/ID3.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/M4ATags.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mp4file/__init__.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mp4file/atom.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mp4file/mp4file.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/mp4file/atomsearch.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/PhotoFiles.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/VideoFiles.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/ID3v2.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Common/Stack.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Movies/Plex Video Files.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Movies/Plex Movie Scanner.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Movies/Plex Movie.py
./Plug-ins-a78fef9a9/Scanners.bundle/Contents/Resources/Movies/Plex Video Files Scanner.py
./Plug-ins-a78fef9a9/Framework.bundle/Contents/Resources/Platforms/Shared/Libraries/threading_new.py
[Resources] # 

Output truncated due to length restrictions

As you can see above, no python interpretor exists.

If you examine the distribution package itself, you find only the dedicated Python runtime library which is compiled and bound to Plex’s use only.

[lib] # echo *py*
libpython2.7.so.1.0
[lib] #

While I can appreciate the assertion Python 2.7 is a security hole, let’s consider the whole picture; Python itself is a security hole because it is interpreted. Any .py file can be modified and the unsuspecting user could invoke a contaminated function with elevated privileges and propagate whatever chaos / malicious code was implanted.

It is for this reason, coupled with PMS’s exclusive internal use of Python 2.7, I do not understand the demand by the Gentoo community to have Python 3 within the next 30 days.

1 Like

Addendum:

Please explain to me the precise reasons for the objection to Python 2.7 when used in this manner

Chuck,
Thank you for your detailed and good-willed response.

I may not be the best person to address this, since my knowledge in Gentoo architecture is less than expert-level, but I believe that the bundled Python runtime library you mentioned isn’t being used in Gentoo’s case.

With Portage there is a dependency tree that pulls the required packages before compiling and installing the software, in this case Python is being pulled for Plex.
As you can see from the ebuild files, Plex depends on Python2.7 directly:


PYTHON_COMPAT=( python2_7 )

That means that whenever Plex is installed on Gentoo, Portage will grab the Python 2.7 interpreter and install it on the system.
Therefore any installation of software that depends explicitly on Python 2.7 inherently reduces the security of the system by installing this no-longer-maintained runtime environment.

Gentoo community considers these packages a security risk since Jan 2020. We are now 9 months later and so the offending packages are starting to be removed.

Ah! There is the error.

Whatever, or whomever, generated that made a mistake.

We had to turn off all automatics as well with PMS 1.15.0. Our old packaging made the same mistake.

There are no external Python requirements – NONE.

The only requirement is glibc 2.14.1

From our RPM packaging, please examine the our spec file.
You’ll notice we do not use automatic dependency inclusion. This is the safeguard to block Python 2 or any other unwanted packages.

Name: plexmediaserver
Version: ##VERSION##
Release: ##RELEASE##
Summary: Plex organizes all of your personal media so you can easily access and enjoy it.
License: Plex Inc.
Distribution: Redhat
Group: Converted/video

%define _rpmdir .
%define _rpmfilename %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm
%define _unpackaged_files_terminate_build 0

# Turn off automatic dependency searching and inclusion
Autoprov: 0

# Turn off automatic requirements searching and inclusion (e.g. Python 2)
Autoreqprov: 0

# Specifically state we provide 'plexmediaserver'
Provides: plexmediaserver config(plexmediaserver)

%pre

The binaries are compiled and given to the packaging with only glibc as a needed shared object lib. All others are resolved at package compile & link time.

2 Likes

Reviewing the link at https://gitweb.gentoo.org/repo/gentoo.git/tree/media-tv/plex-media-server/plex-media-server-1.19.5.ebuild

I’ve encountered some more errors.

I’ll help you sort them out if you wish.

2 Likes

came here expecting to be kind of upset there was heel-dragging on this but glad to see there is active attention to the issue, i miss things like being able to get updates in gentoo and am not looking forward to the headache of having to manually maintain my plex installation if this is not fixed.

if you haven’t seen the gentoo bugs thread about it, this might help: https://bugs.gentoo.org/735396

i know gentoo isn’t supported but i bought my plex pass in good faith that i can continue to use plex indefinitely without too much hassle, and i genuinely appreciate attention to the matter

If they can be sorted, even if not kept in the main tree, it’s possible to keep plex up to date with an overlay (will just need version numbers changing each update unless there’s a major change).

What are the errors and I’m sure they shouldn’t be too tricky to fix.

The errors I’ve spotted so far are:

  1. The obvious inclusion of Python as a detected dependency. There are no externals for our binaries beyond glibc 2.14.1

  2. You are forcing RPATH. We have RPATH pre-set to ./lib. Altering it is the error.

  3. I see you have both init and systemd ? You’ll find the master copies, which my packaging script installs in /usr/lib/plexmediaserver/lib (plexmediaserver.service (systemd),
    plexmediaserver.init (SYSV init), and plexmediaserver.default – for /etc/defaults/plexmediaserver)

  4. I package /usr/lib/plexmediaserver/lib/plexmediaserver.init which is the SYSV-init startup script. In there you’ll also find plexmediaserver.default (for /etc/defaults) and plexmediaserver.service (for /lib/systemd/system).

Do you plan to use the preinst and postinst scripting for configuration of new accounts and/or udev for /dev/dri access ?

As someone with a fair amount of experience with Gentoo, there really shouldn’t be a problem in the near future. Gentoo devs, official or unofficial, have always found ways to allow installation of packages that otherwise conflict with the distro’s priorities and philosophy.

The reliance on bundled dependencies is greatly discouraged but endured so long as it is not a hard system dependency.