Package: devine
DevineOpen-Source Movie, TV, and Music Downloading SolutionFeatures🎥 Supports Movies, TV shows, and Music🧩 Easy installation via PIP/PyPI👥 Multi-profile authentication per-service with credentials or cookies🤖 Automatic P2P filename structure with Group Tag🛠️ Flexible Service framework system📦 Portable Installations🗃️ Local and Remote SQL-based Key Vault database⚙️ YAML for Configuration🌍 Local and Remote Widevine CDMs❤️ Fully Open-Source! Pull Requests WelcomeInstallation$pipinstalldevineNoteIf you see warnings about a path not being in your PATH environment variable, add it, ordevinewon't run.Voilà 🎉! You now have thedevinepackage installed and adevineexecutable is now available.Check it out withdevine --help!DependenciesThe following is a list of programs that need to be installed manually. I recommend installing these withwinget,chocolateyor such where possible as it automatically adds them to yourPATHenvironment variable and will be
easier to update in the future.aria2(c)for downloading streams and large manifests.CCExtractorfor extracting Closed Caption data like EIA-608 from video streams and converting as SRT.FFmpeg(and ffprobe) for repacking/remuxing streams on specific services, and evaluating stream data.MKVToolNixv54+ for muxing individual streams to an.mkvfile.shaka-packagerfor decrypting CENC-CTR and CENC-CBCS video and audio streams.For portable downloads, make sure you put them in your current working directory, in the installation directory,
or put the directory path in yourPATHenvironment variable. If you do not do this then their binaries will not be
able to be found.Portable installationDownload a Python Embeddable Package of a supported Python version (the.zipdownload).(make sure it's either x64/x86 and not ARM unless you're on an ARM device).Extract the.zipand rename the folder, if you wish.Open Terminal andcdto the extracted folder.Run the following on Windows:(Invoke-WebRequest -Uri https://gist.githubusercontent.com/rlaphoenix/5ef250e61ceeb123c6696c05ad4dee8b/raw -UseBasicParsing).Content | .\python -or the following on Linux/macOS:curl -sSL https://gist.githubusercontent.com/rlaphoenix/5ef250e61ceeb123c6696c05ad4dee8b/raw | ./python -Run.\python -m pip install devineYou can now calldevineby,running./python -m devine --help, or,running./Scripts/devine.exe --help, or,symlinking the/Scripts/devine.exebinary to the root of the folder, for./devine --help, or,zipping the entire folder todevine.zip, forpython devine.zip --help.The last method of calling devine, by archiving to a zip file, is incredibly useful for sharing and portability!I urge you to give it a try!ServicesDevine does not come with any infringing Service code. You must develop your own Service code and place them in
the/devine/servicesdirectory. There are different ways the add services depending on your installation type.
In some cases you may use multiple of these methods to have separate copies.Please refrain from making or using Service code unless you have full rights to do so. I also recommend ensuring that
you keep the Service code private and secure, i.e. a private repository or keeping it offline.No matter which method you use, make sure that you install any further dependencies needed by the services. There's
currently no way to have these dependencies automatically install apart from within the Fork method.WarningPlease be careful with who you trust and what you run. The users you collaborate with on Service
code could update it with malicious code that you would run via devine on the next call.via Copy & PasteIf you have service code already and wish to just install and use it locally, then simply putting it into the Services
directory of your local pip installation will do the job. However, this method is the worst in terms of collaboration.Get the installation directory by running the following in terminal,python -c 'import os,devine.__main__ as a;print(os.path.dirname(a.__file__))'Head to the installation directory and create aservicesfolder if one is not yet created.Within thatservicesfolder you may install or create service code.WarningUninstalling Python or Devine may result in the Services you installed being deleted. Make sure you back
up the services before uninstalling.via a Forked RepositoryIf you are collaborating with a team on multiple services then forking the project is the best way to go. I recommend
forking the project then hard resetting to the latest stable update by tag. Once a new stable update comes out you can
easily rebase your fork to that commit to update.However, please make sure you look at changes between each version before rebasing and resolve any breaking changes and
deprecations when rebasing to a new version.Fork the project withgitor GitHub(fork).Head inside the rootdevinedirectory and create aservicesdirectory.Within thatservicesfolder you may install or create service code.You may now commit changes or additions within that services folder to your forked repository.Once committed all your other team members can easily sync and contribute changes.NoteYou may add Service-specific Python dependencies usingpoetrythat can install alongside the project.
Just do note that this will complicate rebasing when even thepoetry.lockgets updates in the upstream project.via Cloud storage (symlink)This is a great option for those who wish to do something like the forking method, but without the need of constantly
rebasing their fork to the latest version. Overall less knowledge on git would be required, but each user would need
to do a bit of symlinking compared to the fork method.This also opens up the ways you can host or collaborate on Service code. As long as you can receive a directory that
updates with just the services within it, then you're good to go. Options could include an FTP server, Shared Google
Drive, a non-fork repository with just services, and more.Follow the steps in theCopy & Paste methodto create theservicesfolder.Use any Cloud Source that gives you a pseudo-directory to access the Service files. E.g., rclone or google drive fs.Symlink the services directory from your Cloud Source to the new services folder you made.
(you may need to delete it first)Of course, you have to make sure the original folder keeps receiving and downloading/streaming those changes, or that
you keep git pulling those changes. You must also make sure that the version of devine you have locally is supported by
the Services code.NoteIf you're using a cloud source that downloads the file once it gets opened, you don't have to worry as those
will automatically download. Python importing the files triggers the download to begin. However, it may cause a delay
on startup.Profiles (Cookies & Credentials)Just like a streaming service, devine associates both a cookie and/or credential as a Profile. You can associate up to
one cookie and one credential per-profile, depending on which (or both) are needed by the Service. This system allows
you to configure multiple accounts per-service and choose which to use at any time.Credentials are stored in the config, and Cookies are stored in the data directory. You can find the location of these
by runningdevine env info. However, you can manage profiles withdevine auth --help. E.g. to add a new John
profile to Netflix with a Cookie and Credential, take a look at the following CLI call,devine auth add John NF --cookie "C:\Users\John\Downloads\netflix.com.txt --credential "john@gmail.com:pass123"You can also delete a credential withdevine auth delete. E.g., to delete the cookie for John that we just added, rundevine auth delete John --cookie. Take a look atdevine auth delete --helpfor more information.NoteProfile names are case-sensitive and unique per-service. They also have no arbitrary character or length
limit, but for convenience I don't recommend using any special characters as your terminal may get confused.Cookie file format and ExtensionsCookies must be in the standard Netscape cookies file format.Recommended Cookie exporter extensions:Firefox: "Export Cookies" byRotem DanChromium: "Open Cookies.txt" byNinh Pham,or "Get cookies.txt" byRahul ShawAny other extension that exports to the standard Netscape format should theoretically work.WarningThe Get cookies.txt extension by Rahul Shaw is essentially spyware. Do not use it. There are some safe
versions floating around (usually just older versions of the extension), but since there are safe alternatives I'd
just avoid it altogether. Source:https://reddit.com/r/youtubedl/comments/10ar7o7Widevine ProvisionsA Widevine Provision is needed for acquiring licenses containing decryption keys for DRM-protected content.
They are not needed if you will be using devine on DRM-free services. Please do not ask for any Widevine Device Files,
Keys, or Provisions as they cannot be provided.Devine only supports.WVDfiles (Widevine Device Files). However, if you have the Provision RSA Private Key and
Device Client Identification Blob as blob files (e.g.,device_private_keyanddevice_client_id_blob), then you can
convert them to a.WVDfile by runningpywidevine create-device --help.Once you have.WVDfiles, place them in the WVDs directory which can be found by callingdevine env info.
You can then set in your config which WVD (by filename only) to use by default withdevine cfg cdm.default wvd_name.
From here you can then set which WVD to use for each specific service. It's best to use the lowest security-level
provision where possible.An alternative would be using a pywidevine Serve-compliant CDM API. Of course, you would need to know someone who is
serving one, and they would need to give you access. Take a look at theremote_cdmconfig option for setup information. For further information on it see the pywidevine repository.UsageFirst, take a look atdevine --helpfor a full help document, listing all commands available and giving you more
information on what can be done with Devine.Here's a checklist on what I recommend getting started with, in no particular order,AddServices, these will be used indevine dl.AddProfiles, these are your cookies and credentials.AddWidevine Provisions, also known as CDMs, these are used for DRM-protected content.Set your Group Tag, the text at the end of the final filename, e.g.,devine cfg tag NOGRPfor ...-NOGRP.Set Up a Local Key Vault, take a look at theKey Vaults Config.And here's some more advanced things you could take a look at,Setting default Headers that the Request Session uses.Setting default Profiles and CDM Provisions to use for services.NordVPN and Hola Proxy Providers for automatic proxies.Hosting and/or Using Remote Key Vaults.Serving and/or Using Remote CDM Provisions.Documentation on the config is available in theCONFIG.mdfile, it has a lot of handy settings.If you start to get sick of putting something in your CLI call, then I recommend taking a look at it!DevelopmentThe following steps are instructions on downloading, preparing, and running the code under aPoetryenvironment.
You can skip steps 3-5 with a simplepip install .call instead, but you miss out on a wide array of benefits.git clone https://github.com/devine-dl/devinecd devine(optional)poetry config virtualenvs.in-project truepoetry installpoetry run devine --helpAs seen in Step 5, running thedevineexecutable is somewhat different to a normal PIP installation.
SeePoetry's Docson various ways of making calls under the virtual-environment.End User License AgreementDevine and it's community pages should be treated with the same kindness as other projects.
Please refrain from spam or asking for questions that infringe upon a Service's End User License Agreement.Do not use Devine for any purposes of which you do not have the rights to do so.Do not share or request infringing content; this includes Widevine Provision Keys, Content Encryption Keys,
or Service API Calls or Code.The Core codebase is meant to stay Free and Open-Source while the Service code should be kept private.Do not sell any part of this project, neither alone nor as part of a bundle.
If you paid for this software or received it as part of a bundle following payment, you should demand your money
back immediately.Be kind to one another and do not single anyone out.DisclaimerThis project requires a valid Google-provisioned Private/Public Keypair and a Device-specific Client Identification
blob; neither of which are included with this project.Public testing provisions are available and provided by Google to use for testing projects such as this one.License Servers have the ability to block requests from any provision, and are likely already blocking test provisions
on production endpoints. Therefore, have the ability to block the usage of Devine by themselves.This project does not condone piracy or any action against the terms of the Service or DRM system.All efforts in this project have been the result of Reverse-Engineering and Publicly available research.CreditThe awesome community for their shared research and insight into the Widevine Protocol and Key Derivation.ContributorsLicense© 2019-2023 rlaphoenix —GNU General Public License, Version 3.0