Plex Media Server Google Drive alapokon

Ha valaki manapság TV sorozatokat, filmeket akar nézni, egy csomó lehetősége van. Jó öreg TV, DVD, Blu-Ray, iTunes, Google Play Movies, Netflix, Amazon Prime Video, stb, stb... Mostanra az árak sem olyan szörnyen vészesek, valamint a legtöbb helyről lehet bérelni is, nem kell egyből megvenni az amúgy 1-2x nézett szombat délutáni filmet. Maguk a szolgáltatások tök jók lennének. Ami miatt itt is saját magam által hostolt megoldást választottam, az szokás szerint valamilyen módon a DRM-mel függ össze. Régóta mondom, hogy a DRM csak arra jó, hogy azokat szivassa akik amúgy fizetnének az adott szolgáltatásért. Hiába mondják, hogy a Netflix is elérhető Magyarországon, a gyakorlatban ugyanannyi pénzért ~harmadannyi tartalom közül választhatunk mint egy Angol, vagy egy Amerikai előfizető. Ha ez nem lenne elég, kedvenc sorozatunk lehet jövő hónapban már nem lesz elérhető, hiszen szerződések lejárnak, licenszek kifutnak, új szerződések köttetnek. Kellett nekem egy megbízható, saját média megoldás.

Valamikor még 2014 elején, belefutottam egy Plex nevű programba. Akkoriban a media szerver igényeimet bőven kielégítette egy telepített XBMC (új nevén Kodi), és valljuk be, ahhoz képest a Plex elég kispályás volt. Mégis... volt egy olyan megalapozatlan érzésem, hogy ebből még lesz valami, úgyhogy beruháztam egy Lifetime licenszbe (durván féláron a mostanihoz képest), de aztán a korábban említett hiányosságok miatt az egész feledésbe merült. 2016 volt legközelebb mikor kipróbáltam, és annyira meglátszódott rajta a fejlődés, hogy át is álltam rá. Akkoriban még minden filmem és sorozatom helyben egy NAS-on tároltam, ami mondanom sem kell sok helyet foglal. Nem kellett sok idő hozzá és az a sok hely, túl sok lett. Van több sorozatom is Blu-Rayen és ugye újrakódolás nélkül azok iszonyat helyet foglalnak. Persze tömöríthettem volna is őket, de olyan mennyiségekről van szó, hogy szó szerint hetekik/hónapokig tartott volna, Muszáj volt valamilyen megoldást keresnem.

Durván ezidőtájt történt, hogy vettem magamnak egy céges Google előfizut (amit ma G Suite-nak hívnak), a korlátlan GDrive tárhely miatt, majd szerencsémre néhány hónappal később belefutottam az rclone-ba. Amint megláttam, hogy az rclone képes felmountolni a GDrive tárhelyet, valamint hogy tud transzparens titkosítást, tudtam, hogy ezzel kezdeni kell valamit. Körvonalazódni kezdett előttem egy olyan megoldás, ahol a Plex szerver maga nálam van, de a videóanyag végre nem az én NAS-omon foglalja a helyet, hanem direkt a GDrive tárhelyről streamelődik. Némi olvasgatás után hamar rá kellett jönnöm, hogy megint csak nem én találtam fel a spanyolviaszt, valamint hogy igen, az ötlet megvalósítható. A szerver több verziót élt meg, több vason, több kofigurációban, időközben már a harmadik VPS-sen van. Értelemszerűen nem fogok részletesen minden korábbi verzióról beszámolni, hisz valami oka ugye van hogy a setup megváltozott. Maradjunk a teljesen aktuálisnál.

A VPS

Az bizony nagy kell. Persze nem muszáj VPS, lehet fizikális gép is, a lényeg hogy nagy legyen :). A Plex nagyon kellemes tulajdonsága, hogy amennyiben szükséges, teljesen automatikusan transzkódol. Aki már transzkódolt videót, az tudja hogy combos vas kell alá. Még combosabb, ha mindezt realtime, párhuzamosan több felhasználó számára szeretnénk csinálni. A transzkódolást csak úgy lehet megkerülni, ha pontosan ismert milyen kliensek fognak csatlakozni és előtte a videókat olyan formátumba konvertáljuk amelyeket azok natívan le tudnak játszani. Mondanom sem kell, ez marha nagy macera. Per-pillanat ezen a VPS-en vagyunk, itt kényelmesen elfér a Plex szerver mellett még a blogom, a git szerverem, valamint egy Minecraft szerver.

A setup

Így hogy belegondolok az egész felállás nevetségesen egyszerű. Nem megyek teljesen lépésenként végig, feltételezek némi linux jártasságot azokból akik egy ilyennek nekiugranak. A kiindulási alap egy szűz CentOS 7 szerver, amire feldobjuk az aktuális Plex Media Server-t

wget "https://plex.tv/downloads/latest/1?channel=8&build=linux-ubuntu-x86_64&distro=redhat" -O plex.rpm
rpm localinstall -y plex.rpm

Aztán szükségünk lesz az rclone-ra magára (ez egyből ki is csomagolja /usr/local/bin-be

wget https://downloads.rclone.org/rclone-current-linux-amd64.zip; unzip rclone-current-linux-amd64.zip; cp rclone-v*/rclone /usr/local/bin/rclone

Ez még nem érdekes, ezt bárki aki már látott linuxot bekötött szemmel megcsinálja. Amin lehet bukni az az rclone paraméterezése. Egy szimpla Google Drive mount így néz ki nálam:

rclone mount --syslog --allow-other --allow-non-empty --dir-cache-time 1m --stats 1s --tpslimit 10 --log-level INFO plex: /mnt/gdrive/kerenon/

Ezen kívül vannak további mountpoint-ok, amiket aztán overlayfs-sel egyesítek a fő mountpoint, a /mnt/plex alá

mount -t overlay -o lowerdir=/mnt/gdrive/kerenon/,lowerdir=/mnt/gdrive/teamdrive/,upperdir=/mnt/plex_local,workdir=/mnt/plex overlay /mnt/plex

Ezt az egészet, kis kreativitással és módosítással megfűszerezve be kell valahova tenni ahol elindul magától bootoláskor és igazából készen is vagyunk. Ezután csak be kell állítani a Plex szervert, és az eredmény valami ilyesmi:
chrome_2018-01-18_20-28-10
Magáról az rclone használatáról oldalakat lehetne írni, arra ott a weboldal, vagy a súgó. Amire mégis kitérnék az a --tpslimit, mégpedig a hírhedt 24 órás Google Drive Ban miatt.

A 24 órás Google Drive Ban

A Google Drive-on mint minden felhő-tárhely szolgáltatáson, vannak API limitek. Ezek egy része nyilvános, más része nem. Sajnos egy (több) ilyen nem ismert limit az ami keresztbe tesz nekünk.
Mikor új fájlokat adunk a Plex szerverhez, az adott library-t újra kell scannelni. Ekkor a Plex végigmászik a teljes könyvtárstruktúrán és minden fájlt ami szerinte új azt jól megnéz és begyűjti róla az infókat az adatbázisába. Elég egy ilyen scan-t elindítani, és a Google rövid távon meg is ajándékoz minket egy 24 órás ban-nal. Ez alatt az idő alatt feltölteni tudunk, az apró fájlokat letölteni is, viszont valahol 10 MB környékén van az a határ ami fölött már nem lehet letölteni semmit se. Hirtelen nem emlékszem pontosan, valami quota exceeded hibaüzenetet kapunk webes felületen is. Ennek a ban-nak a mitigálásában van szerepe a kicsit feljebb említett --tpslimit opciónak. Limitálja az API hívásokat, 10/sec-re. Sajnos azonban magában ez nem elég. Senki sem tudja pontosan, de van valami limit a fájlok letöltésének/megnyitásának a számával kapcsolatban is, amit szintén nagyon hamar meg lehet lépni egy-egy scan-nel. Valamilyen érthetetlen oknál fogva a Google Drive teljes letöltésnek vesz minden olvasást a fájlokból, akkor is ha az rclone csak egy pontosan megcímzett range-et tölt le. Ha ezt összevegyítjük azzal hogy a Plex 3-10-15x is meg-megnyit egy fájlt, hogy innen-onnan kiolvasson belőle dolgokat, akkor azért érthető hogy a Google rossz néven veszi mondjuk egy 30 GB-os mkv esetén a 450 GB/sec vélt letöltést, és banol.

Mitigáció

Másik lehetőség a ban elkerülésére, a media fájlok ha nem is darabonkénti, de szakaszosabb hozzáadása a szerverhez. Szerencsére a Plex-nek van "nagyszerű" API-ja ami legalább valamennyire felhasználható erre. Van két bash scriptem, az egyik a plex_scan_movie.sh, a másik pedig a plex_scan_tv.sh. Előbbi így néz ki:

su plex -c "LD_LIBRARY_PATH=/usr/lib/plexmediaserver /usr/lib/plexmediaserver/Plex\ Media\ Scanner -r -s -c 2 --directory '$*'"

Ezzel el lehet érni, hogy mindig csak az épp paraméterként megadott mappát scannelje, elkerülve a ban-t. Sorozatnál nyugodtan mehet 1 vagy max 2-3 évad egyszerre. Sajnos nincs pontos számszerű adat, egyszerűen ésszel kell csinálni.
Ide tartozik még a mitigációhoz, hogy természetesen a szerveren ki kell kapcsolni minden scheduled scan-t, meg a video thumbnail-ek generálását.

Ha már banoltak

Akkor bizony nincs mese, végig kell várni a 24 órát (ami valamikor csak pár óra, ezt se érti senki se). Nekem ilyenkor elindul egy script, ami újra mountolja a drive-okat, majd küld ki egy értesítést a Discord szerverünkre mikor a ban-t feloldották, hogy mehet a filmnézés (a bancheck.img egy 1GB-os fájl, /dev/urandom-ból):

STOP=0

while [ $STOP -eq 0 ]; do
    if rclone copyto "ptde:/bancheck.img" /tmp/bancheck.img 2> /dev/null ; then
        curl -X POST --data '{"content": "Google Drive Ban Lifted"}' -H "Content-Type: application/json" https://discordapp.com/api/webhooks/000000000000000000/DuUPP-nemmondom-megmertnagyontitkosadiscordwebhookomurljerAINdEHuoRB
        rm -f /tmp/bancheck.img
        /home/kerenon/bin/plexrestart.sh
        STOP=1
    else
        echo "Still Banned"
    fi
    sleep 60
done

Titkosítás

chrome_2018-01-18_20-57-54
Mint említettem korábban az összes média ami a Plex szerveremen elérhető, Google Drive tárhelyről streamelődik a szerveren keresztül a kliensekhez. Mikor a tárhely téma előkerül, sokan megkérdezik mi szükség van a titkosításra. Nos jelenleg(!) semmi. A Google egyelőre nem foglalkozik vele mit tárolnak a felhasználók a tárhelyeiken, egészen addig míg meg nem osztod a Drive beépített megosztás fukciójával. Onnantól elszabadul a pokol, és csak úgy jönnek a tiltások. Az rclone-nal felmountolt Google Drive nem számít ebben az értelemben megosztásnak, hiszen a program az én nevemben, hivatalos API-n keresztül éri el az én saját Drive-om. Amiért mégis a titkosítást választottam az nemes egyszerűséggel az, hogy a Google-nál sose lehet tudni. Ez a policy bármikor változhat, és így esélyük sincs kideríteni mi is van a tárhelyemen. Másik pozitív dolog, hogy így meg tudom osztani a kollekciót, mindenféle konzekvencia nélkül.

Zárszó

A szerverem ezzel a felállással már elég régóta megy. Közben vannak kissebb nagyobb zűrök, valamint 2-3x előfordult már olyan is hogy belefutottam GDrive ban-ba, úgy hogy nem tudtam mi okozta, de azt is túléltük. Közben indult egy második Plex szervere a zenéimnek. Azokat szinte lehetetlen GDrive-on tárolni, mert akármit csinálok amit elkezdem scannelni őket (bármely lassan is) azonnal beüt a ban.

A konkrét megvalósítással kapcsolatban szívesen állok bárki rendelkezésére a komment szekcióban :)