UPDATE: Last library re-extracted from ChromeOS on: 9-8-19 — confirmed that DRM works perfectly (ex, Spotify, etc), but as a Netflix solution it does *NOT* currently work with the latest version of Chromium (74.0.3729.157)! This may be due to “stable” having moved to 76, and raspbian still rocking the 74 branch.

The Raspberry Pi 4 model with 4GB of RAM is the first cheap hardware that can provide a real “desktop-like” experience when browsing the web/watching Netflix/etc. However, if you have tried to run Netflix on the Pi, you have quickly entered the disgusting mess that exists around DRM, WideVine (Netflix being one example of something that needs it), and Chromium.

After hours and hours of effort, I finally discovered a quick and elegant solution that lets you use the latest default provided Chromium browser, without having to recompile anything in order to watch any WideVine/DRM (Netflix, Spotify, etc) content.

Background and the DRM Problem

If you are not familiar with this, the short version is that Netflix (and many others, ex: Spotify) use the WideVine “Content Protection System” – aka DRM, and if you want to watch Netflix or something else that uses it, you need to have a WideVine plugin+browse supported integration. Chrome, Firefox, and Safari make it available for x86/amd64 systems, but not for ARM since technically they don’t have ARM builds.

Chromium, the project Chrome is based on, does have an ARM build, but it does not include any DRM support, and technically it does not include widevine support by default (*caveat here, which helps us later)
So long story short, the question becomes “how do you enable DRM/WideVine support in Chromium?”.

It seems there are two main solutions out there: use an old (v51, 55, 56, 60) version of Chromium which has been “patched” with widevine support (kusti8’s version seems to be the most popular one – except since the new Netflix changes, that also does not work), which requires uninstalling the latest Chromium available, installing the old/patched one, and dropping in older widewine plugins; the second option is to use Vivaldi – a proprietary fork of Opera which also has been “sort of patched”, but it still needs a valid libwidevinecdm plugin (see bellow) and it has it’s own issues (and also…it’s Opera…in 2019…who uses Opera?)

After a lot of research and trial and error, I discovered a much more elegant solution – use the extracted ChromeOS (armv7l – yay) binaries and insert them into Chromium + make everything think it’s ChromeOS (user agent)

Netflix/Spotify with the Default Raspberry Pi Chromium Browser


1.) Download the latest extracted ChromeOS libwidevine binary and extract it:

NOTE: You can verify that these are the *official* versions from ChromeOS:
https://dl.google.com/dl/edgedl/chromeos/recovery/chromeos_12239.92.0_elm_recovery_stable-channel_mp-v2.bin.zip

NOTE: UPDATED (Last re-extracted from ChromeOS on: 9-8-19)
filename: libwidevinecdm.so
md5sum: 41c94b9ffa735fe4f412b7e9283dd2ff
sha256sum: 2245a2f5ba8452692e79f478d64adbeedaef5307cc73e81ffe64de69a7a53640

2.) Completely QUIT all Chromium windows and re-start it.
Grab the “User-Agent Switcher for Chrome” extension: https://chrome.google.com/webstore/detail/user-agent-switcher-for-c/djflhoibgkdhkhhcedjiklpkjnoahfmg

Right click on the extension, go to “Options” and “Add” the following in the fields:
a.) New User-agent name: Netflix
b.) New User-Agent String: Mozilla/5.0 (X11; CrOS x86_64 11895.95.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36
c.) Group: Chrome
d.) Append: Replace
e.) Indicator Flag: NFX

3.) Open a new tab, select the “NFX” profile (one time) from the User-Agent Switcher, and go to: https://bitmovin.com/demos/drm
You should be able to see the movie on the left. You can now play Netflix, and Spotify

Please note that If you can see the vide on the left, this means the DRM plugin has worked! From this point on, anything that does not work (ex: Netflix sometimes breaks after a browser update) is due to the site specifically filtering User Agents/doing other “tricks”. So for example, if Netflix does not work, Spotify, Hulu, Amazon, HBO, etc will still work. The BitMovin website is the “real” test on wether the DRM plugin has worked.

Solution if you see occasional “screen tearing”
It seems the Pi’s raw CPU frequency is still not powerful enough for decoding 100% of the time. While 97-98% of the time is good enough, you will get the occasional “screen tearing” (https://en.wikipedia.org/wiki/Screen_tearing), especially with scenes with fast motion.

User Tim (credit to him for finding this!) may have found the solution to this:

Ok think i have a fix. Netflix in Chrome will only play 1280 x 720 max (its a known thing) and can be checked by pressing CTRL SHIFT ALT and D when the video is playing in Netflix (for Vid stats).
So as a test i changed my pi screen configuration from 1920 x 1080 to 1280 x 720 (at 59.94 HZ) and netflix plays fine with no tearing. (the tearing was mostly present when the camera pans left to right etc). For some reason my monitor has a 1280 x 720 at 60HZ option but this also gave a little tearing, the 59.94Hz option cures it completely, this works for me and i am happy watching Netflix at 720p

Update to this: It seems Netflix will only play at 720p on Chrome, so by lowing the resolution, it removes tearing in the cases where the monitor is at a higher resolution/60Hz.

Older Versions
Here are the last few OLDER versions in case you need them (note the unique date in the url):
http://blog.vpetkov.net/wp-content/uploads/2019/08/libwidevinecdm.so_.zip
http://blog.vpetkov.net/wp-content/uploads/2019/07/libwidevinecdm.so_.zip

123 Thoughts on “Netflix and Spotify on a Raspberry Pi 4 with Latest Default Chromium

  1. I’m using a Raspberry Pi 3B with Raspbian “Buster”. Chromium Version 74.0.3729.157 (Official Build) Built on Raspbian , running on Raspbian 10 (32-bit). I installed the WideVine and User Agent just as you described (last night) and it passes the DRM test.

    User Agent String: Mozilla/5.0 (X11; CrOS x86_64 11895.95.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36

    I can login to NetFlix and open a show but every time while its starting to load I get a brief pause then a Whoops message saying its not available right now… and error code M7121-1331.

    I haven’t been on Linux in many many years, and a newbie to Raspberry Pi.. so please go easy on me.
    Any suggestions on how to fix?

    • Looking at alternatives since Netflix broke this method. I believe when the Pi upgrades their default browser + dependencies to v76, it will just “start working”.

  2. Hello!
    Installed Raspberry 4 today with latest Image, chromium version after finishing all updates is the exact one as in the latest post (74.0.3729.157) and I also took the libwidevinecd.so_.zip from your latest post, as the inital one from above did not work either. I doublechecked the permissions on it it’s 755 and the test page works also. I am getting the same error on Netflix as RomeoFour8 posted earlier: M7121-1331. It looks like Netflix does not want raspberry users to be happy… πŸ˜‰
    Best regards,
    Daniel

    • I am not sure why they do this at all…it seems like there is massive demand for this. Outside of the comments/posts here, I have received over 2000 emails about this.
      Their browser/UA agent seems completely arbitrary and pointless, and yet it causes a headache.

  3. Ventz,

    I installed the latest libwinedevine from this page, changed user agent and checked chrome version (double and triple-checked) – the DRM test works – but Amazon instant video does not, I always get the message on using a current browser (no error code, link to system requirements). I tried different user agents but always same results.

    Can you use tcpdump to record all packets sent between Amazon and a working browser? (preferably Rpi4 but a working Linux Chrome would also work) Sadly I only have a version working on Win10 and it might be too different to find out what is going on…

    Best, Alex

    • Sadly, the Pi default/stable browser is now out of date. Chromium pushed up to the next release and the Pi foundation/repo has not updated it. You cannot sniff the SSL traffic without having a CA cert (to do MITM) on your traffic.

  4. Hi, thanks for the nice hack! Unfortunately I also just get the error M7121-1331 from Netflix. Spotify says: “Spotify no longer supports this version of Chromium. Please update your browser for uninterrupted listening.”. I have copied the latest library from this page. I also have the latest chromium (chromium-browser 74.0.3729.157-rpt5 armhf) from rasbian debian 10.0. Root owns the lib, and it has 755 perms. Could there be newer version of user agent string available?

    Also the test page says license load failed, but says at lower checkboxes that there is the libwidevinecdm is found.

    Looking forward for tips πŸ™‚ BTW, this is also from Finland, if that makes a difference. System locale is however en_US.UTF-8. System is Raspi4 4GB.

    BR,
    ikke

    • … little more info, this is spit out in command line from chromium-browser on such encrypted page:

      [1607:1607:0908/214719.817071:ERROR:output_protection_proxy.cc(50)] Not implemented reached in void OutputProtectionProxy::EnableProtection(uint32_t, const OutputProtectionProxy::EnableProtectionCallback &)

    • ikkeT – the browser agent should match the browser version (minor # and all).

      Please double check from scratch steps and info. Just setup a new pi 4 and it works on my side.

    • Ventz,

      I am having the same problems like Ikke on a RPi 4 with 4 GB. I have followed the instructions exactly. Is this libwidevinecdm.so correct? Is it 64 bit from the Chromium OS image? I noticed Chromium is running as 32 bit when viewing the version number:

      74.0.3729.157 (Official Build) Built on Raspbian , running on Raspbian 10 (32-bit)

      Is the current version for the DRMyou have posted already out of date? (That would be surprising.)

      I am using the following user agent string:

      Mozilla/5.0 (X11; CrOS x86_64 11895.95.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36

      I have noticed the CrOS is referenced to an x86 processor instead of armv7l but think this isn’t important as Chrome should be the part that is referenced when the string is looked at, I believe.

      Appreciate the previous work that you have done and any insights that may help me resolve.

      DM

      • DM – Take a look at the one I just uploaded. That passes through the DRM, but yes – something is going on with Netflix.
        As soon as I re-installed Raspian and updated, my version stopped working too.

        What makes this more interesting is the DRM decryption is working (so for example, Spotify will work).

        It’s truly something about the agent. I suspect it’s because ChromeOS has v. 76, and that’s where the latest plugin is extracted from.
        What’s interesting is that the exact same user agent on my Chromebook works, and on the Pi it does not, which makes me wonder if Netflix is somehow detecting the v74 within the browser.

        Will poke at this in hope of finding out what’s going on.

        • I confirm, others but Netflix do work with your updated library, thanks so far.

        • Ventz,

          That might be a possibility with the versions of DRM to Chromium. I tried changing the User Agent to the latest and greatest version number for Linux Chromium, 76.0.3809.132, but that didn’t help so it may be reading from somewhere else. It could also be that Chromium is broken in v74 too. It’s been known to happen. I tried submitting a ticket long ago when the Kusti method stopped working after updating Chromium. Google closed the ticket right away because the Chromium that I was using was already 4 or 5 major revisions behind what they had out for Linux. LOL. I think it was the most current for Pi at the time though. I’d say Chromium seems to have become more stable with your Widevine DRM method compared to the v56 days. I also noticed in v74 that while trying to access Hoopla, it complained that the browser was not supported or was out of date. Perhaps v74 does not present itself “properly” and so Netflix is rejecting it. Was your working copy using v72? Do you still have that image? Is it v72 vs v74 and v74 is broken? Just a thought.

          Thanks,

          DM

          • You can find the old ones at the bottom. I think the one from “August” is the “v72” one. I suspect exactly the same thing you mentioned – v74 has a different set of APIs than v76, and the latest widevine is compiled against “latest stable” which has moved to v76 directly.
            Even though the user agent is set to v76, Netflix is probably pulling some API that tells it otherwise.

            I actually upgraded to Raspbian “bullseye” to see if v76 exists, and nothing sadly. Funny enough, Netflix crashes (with “Aw Snap”) the browser tab, which tells me it’s trying to access something that’s not there/causing a resource issue/etc.

            Verified that Pandora, Hulu, Amazon, etc all work — and so does the DRM page.

            I suspect soon enough with v76 this will start working again, but until then…the only solution is compiling Chromemium on arm v7l.

          • Hi Ventz,

            Can you please explain for a amature how to compilate Chromemium on arm v7l?

            Thanks in advance.

          • There is no easy way to explain this πŸ™‚ — also, it is a bit more for the armv7, and especially difficult for the Pi.

    • Digging into this. Grab the latest download (I replaced the Septebmer binary with the correct one – it will work for Spotify and others, jconfirmed it) – but it will *not* work for Netflix as of right now.

      That is, it decrypts Netflix, but Netflix is throwing an error on the User Agent string.
      There may be something else going on too.

  5. Ventz, thanks for sharing this. got the latest version installed, but netflix is still not working. Although, Spotify streams perfectly on the Raspberry PI 4. Hope you find a way to make Netflix

    • Just verified that it works with the September URL (http://blog.vpetkov.net/wp-content/uploads/2019/09/libwidevinecdm.so_.zip) and the latest user-agent string

      If it doesn’t work for you, please double check permissions (the file needs to be owned by root and chmod 755), make sure your agent string is correct and selected, and make sure you are on the latest browser (currently: 74.0.3729.157).

  6. Great guide, works fine on both Netflix and Spotify. Thanks alot!

  7. Thanks for the guide, I have the same issue as U-P on Chromium 74.0.3729.157

  8. Could’t get Netflix to work dispite a very clear and good guide. I get “Oh, something went wrong” (in my native language, swedish) message and a error code M7121-1331. Could it be that Netflix for Finland, where I am, have a different DRM or something?

    • U-P – can you check the exact chrome version and paste here. Chrome/Chromium released a new version a couple of days ago so it’s possible they changed the plugin again.

      • woodnpen on September 6, 2019 at 10:25 am said:

        Same here, but your test website and spotify work
        I use Chromium 74.0.3729.157 Built on Raspbian , running on Raspbian 10
        Thx!

        • Woodnpen – can you try this version: http://blog.vpetkov.net/wp-content/uploads/2019/09/libwidevinecdm.so_.zip
          (just extracted and uploaded. Haven’t had time to test yet – let me know if it works and i’ll update)

          • I have the same issue. I just tried your new upload but couldn’t get it to work

          • Just verified that it works with the September URL (http://blog.vpetkov.net/wp-content/uploads/2019/09/libwidevinecdm.so_.zip) and the latest user-agent string

            If it doesn’t work for you, please double check permissions (the file needs to be owned by root and chmod 755), make sure your agent string is correct and selected, and make sure you are on the latest browser (currently: 74.0.3729.157).

          • RomeoFour8 on September 7, 2019 at 8:21 pm said:

            I get the error (M7121) using the zip file linked above (2019/09).

            Chromium version 74.0.3729.157 (Official Build) Built on Raspbian , running on Raspbian 10

          • Just verified that it works with the September URL (http://blog.vpetkov.net/wp-content/uploads/2019/09/libwidevinecdm.so_.zip) and the latest user-agent string

            If it doesn’t work for you, please double check permissions (the file needs to be owned by root and chmod 755), make sure your agent string is correct and selected, and make sure you are on the latest browser (currently: 74.0.3729.157).

Comment navigation

 

Leave a Reply to cascabel Cancel reply

Your email address will not be published. Required fields are marked *

Post Navigation