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:

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):

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

  1. Small update, latest version of raspbian get shipped with chromium 78, the error remains, I wonder if Netflix is actively checking to block raspberry

  2. It looks like I need to do an update on software. UK Channel 5 broke on Chromium this week. Since I don’t see my name in any of the first page of comments I probably haven’t updated since August or earlier.

    Is it safe to do an update or will I break DRM again? Is the DRM fix at the top of the page still current and working if I do an apt-get upgrade today?

    Are there any better solutions?


  3. Niclan on October 11, 2019 at 3:50 pm said:

    So I have tested this on Manjaro on my PI running chromium 77.0.3865.90. And it still seems to be failing, I have had exactly the same issue when pulling ‘chromium-widevine’ from AUR and building it via pkgbuild ignoring architecture.

    I get the following when using bitmovin:

    Unable to instantiate a key system supporting the required combinations

    The point:
    > Even Chromium 77 is giving issues.
    > This might be due to some arch package instead of your library version.

    • Well this makes things even more interesting πŸ™‚

      • Ventz,

        Looks like there is a new release for Chromium in the update for Buster now – 78.0.3904.108 for Pi 4. Have you tried Widevine with this yet?


      • Is Chromium now looking for a DRM Component for Widevine under chrome://components? There isn’t one there but other explanations of Chrome allude to it:


        v56 used a pseudo plugin to reference the Widevine library to make it work.


      • Ventz,

        Here is something that may help.

        “According to Vivaldi developers there needs to be a manifest.json file for Chromium 79+. I tried to use that manifest file for Opera but I couldn’t make it work.”


        I saw this on an Opera forum and have tried to place the WidevineCDM folder in different places within chromium-browser, opt/goolge but without any luck. Perhaps this could help others find a solution on this. I tried a few things but still at a road block. When trying to load the manifest.json as an extension in Developer Mode, chromium complains about errors and unknown keys. All this is a bit beyond me at the moment. We may still need to wait for a 79+ release from Buster (current: 78.0.3904.108) as you originally suggested. There may be a twist once it’s released, however. Unknown.



  4. For whatt it’s worth, I just thought to report back success with Kodi. I have Kodi on the same raspberry pi 4 on which I tried this. Kodi Netflix plugin seems to work. If I read the code correctly, it set’s up UA string:

    Mozilla/5.0 (X11; CrOS armv7l 7647.78.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36

    I tried that with chromium and this version of libwidevinecdm.so, but no success with browser. One of the Kodi plugins goes and extracts some version of chromebook os for the cryptt library, perhaps a different one than this one.

    I just thought to rerport back as perhaps someone can make this guide also work by looking at what Kodi plugin does. Good luck!

    Plugin here: https://github.com/CastagnaIT/plugin.video.netflix.git

  5. Just an update from 9/25 — From everything I can tell, both v76 and v77 work. The problem is neither of those are included with Raspbian. It almost looks like Netflix is somehow reading through the UserAgent and still detecting the real Chromium version, and not allowing v74.

    At this point, the best bet is to petition Rasbpain’s Chromium maintainer to upgrade the official package to v76, which really should have been done anyway because v74 is EOL.

    • Andrew Kershaw on September 25, 2019 at 12:01 pm said:

      Where can we petition that?

      • I think it’s worth reaching out to: Serge Schneider
        He maintains the RPI kernels – I doubt he is the owner of the Chromium package (the RPI project has not listed a maintainer in the DEB on the raspberry pi side) — but it’s a good start.

        • I reached out to the RPI Chromium Github admin. In a nutshell – if it is a version issue, it would be solved in next update but he was not knowing when it would happen

  6. Fantastic!

  7. 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?

  8. 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,

    • 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.

  9. 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.

  10. 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.


    • … 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 – 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.



          • 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.

  11. 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).

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

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

  14. 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

        • 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 Alex Cancel reply

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

Post Navigation