Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[YouTube] Improve download speed #9948

Merged
merged 1 commit into from
May 1, 2023

Conversation

Theta-Dev
Copy link
Contributor

@Theta-Dev Theta-Dev commented Mar 20, 2023

What is it?

  • Bugfix (user facing)
  • Feature (user facing)
  • Codebase improvement (dev facing)
  • Meta improvement to the project (dev facing)

Description of the changes in your PR

  • YouTube throttles all requests to their streams if they dont have either a Range header or a &range=n-m URL parameter
  • YouTube's throttling is triggered by HEAD requests, too. Since the downloader uses HEAD requests to determine the file size, the subsequent GET requests will be throttled, too
  • I modified the downloader to use HEAD requests with a range header to determine the file size. YouTube will return a Content-Range header for these requests, e.g. (bytes 0-0/4530953) which can be parsed to get the total size.
  • The improvement is most noticeable on small audio files. Songs download almost instantly now.
  • Larger audio files still get throttled at the end of a download, I am not sure how to fix this.

Fixes the following issue(s)

APK testing

The APK can be found by going to the "Checks" tab below the title. On the left pane, click on "CI", scroll down to "artifacts" and click "app" to download the zip file which contains the debug APK of this PR.

Due diligence

@sonarcloud
Copy link

sonarcloud bot commented Mar 20, 2023

Kudos, SonarCloud Quality Gate passed!    Quality Gate passed

Bug A 0 Bugs
Vulnerability A 0 Vulnerabilities
Security Hotspot A 0 Security Hotspots
Code Smell A 0 Code Smells

0.0% 0.0% Coverage
0.0% 0.0% Duplication

@TobiGr TobiGr added the downloader Issue is related to the downloader label Mar 20, 2023
@SameenAhnaf SameenAhnaf added the bug Issue is related to a bug label Mar 20, 2023
@opusforlife2
Copy link
Collaborator

Songs download almost instantly now.

I'm gonna make a shrine dedicated to you and pray there every day.

@AudricV
Copy link
Member

AudricV commented Apr 3, 2023

Are you sure that your changes aren't breaking/changing anything for other services than YouTube?

Also, I don't really understand how can downloads be throttled with HEAD requests, since these requests only return the HTTP headers of the stream URL. Could you explain this, please?

@Theta-Dev
Copy link
Contributor Author

Most HTTP client keep connections open to allow for faster subsequent requests. And once YouTube has recognized a download request (without Range header or params) the connection gets flagged and throttled.

Since YouTube's servers dont make a difference between HEAD and GET requests, sending a HEAD request without range headers is enough to have your download speed throttled.

To prove my point: forcing a reconnect (for example by reinstantiating the HTTP client) after the HEAD request prevents the throttling. I tried this with my rust-based YT downloader.

I dont see how this limits compatibility with other services. HTTP HEAD requests simply return all headers that would be returned on normal GET requests, so a HEAD request with range will return the headers of a partial response.
Partial responses always contain the Content-Range header which contains the total size of the file if known (see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Range).
If the server does not support partial responses, it will not return 206 (Partial) as a response code and the file size will be extracted from the regular Content-Length header.

I have tried it with all services and did not encounter any issues.

@AudricV AudricV changed the title Improve download speed [YouTube] Improve download speed Apr 10, 2023
@AudricV AudricV added the youtube Service, https://www.youtube.com/ label Apr 10, 2023
@AudricV AudricV merged commit fb00ee8 into TeamNewPipe:dev May 1, 2023
This was referenced Jul 31, 2023
ShareASmile added a commit to ShareASmile/FoxPipe that referenced this pull request Jun 14, 2024
…s of 15-01-2024 into pre-unified-legacy

This is a fork of TeamNewPipe/NewPipe-legacy that I have been patching for a few months now. There is no commit history as this has been a personal project up until today.

Pulled in a major chunk of related commits for NewPipe Preunified from upstream TeamNewPipe/NewPipe repository:
1. Update NewPipe extractor to fetch likes count Fix TeamNewPipe/NewPipe#10624
2. Access Background Player Queue from Main menu by HybridAU
TeamNewPipe/NewPipe#8419
3. Added Bandcamp Music Support Into NewPipeLegacy, Improve Bandcamp intent filters
TeamNewPipe/NewPipe#3741
TeamNewPipe/NewPipe#6373
TeamNewPipe/NewPipe#6456
4. Disable sending metrics to Google when using Android System WebView
TeamNewPipe/NewPipe#5337
5. Add basic resize functionality
TeamNewPipe/NewPipe#3948
6. [media.ccc.de] Add recent & live stream kiosk
TeamNewPipe/NewPipe#5251
TeamNewPipe/NewPipe#5286
[media.ccc.de] Fix service color
TeamNewPipe/NewPipe#5258
7. Ability to see Pinned Comment added by dkramer95
TeamNewPipe/NewPipe#7577
8. Clicking on Title In Background Player Should Open Video Details
TeamNewPipe/NewPipe#3808 by https://github.com/budde25
9. Added Swipe to Refresh for Channels New Videos in Subscription Feed
TeamNewPipe/NewPipe#4893
10. [peertube] implement sepia search
TeamNewPipe/NewPipe#5257
11. Allow installation on external storage by triallax in
TeamNewPipe/NewPipe#6037
12. Change UA to privacy.resistFingerprinting
TeamNewPipe/NewPipe#5649 by FireMasterK
13. Add formatting removal on paste for search TeamNewPipe/NewPipe#5912 by imericxu
14. Remember Last Selected Media Type For Downloads
TeamNewPipe/NewPipe#4038 by vmazoyer
15. Improve search suggestion experience when remote ones can't be fetched
TeamNewPipe/NewPipe#4029 by StyPox
16. Fix Download Button Not Visible After Playing Live Stream, Fix video detail controls visibility set inconsistently
Add this commit by StyPox
TeamNewPipe/NewPipe@dbb86d2 from
TeamNewPipe/NewPipe#4362
17. [Background Player] Fix very small thumbnails in Video Detail Page by TobiGR in
TeamNewPipe/NewPipe#5818
18. Add Always Expand Description In Appearance Settings
TeamNewPipe/NewPipe#2998 by B0pol
(Related) entries from search history Increased from 25 to 80 and Search Suggestions Entries from 3 to 60 commit copied from
TeamNewPipe/NewPipe#2666 thanks to ergor
20. Fixes snackbar error on disabled likes count
Fixes TeamNewPipe/NewPipe#7405 by TeamNewPipe/NewPipeExtractor#753
21. Fixed player controls not hiding after replay & Bluetooth headset button by Alexander--
TeamNewPipe/NewPipe#3547
22. update user agent in Downloader to firefox latest ESR 115 by Nickoriginal
TeamNewPipe/NewPipe#8269
23. Changed Dark Theme Colors To Darker Variant by sauravrao637
TeamNewPipe/NewPipe#6244
24. Support for PeerTube Short Links
TeamNewPipe/NewPipe#7353
25. Handle URLs for YouTube Shorts
TeamNewPipe/NewPipe#7181
26. Fix playback speed not being updated in Background Player & Fix TeamNewPipe/NewPipe#8058
Fixed Combinedly by TeamNewPipe/NewPipe#6421 by Tobius
and by seanzzy in
TeamNewPipe/NewPipe#8244
27. Added comments disabled functionallity by litetex in
TeamNewPipe/NewPipe#6483
28. [media.ccc.de] Fix service color
TeamNewPipe/NewPipe#5258
29. Ignore ContentNotSupportedException caused by Bandcamp fan pages
TeamNewPipe/NewPipeExtractor#1033
30. Crash when rotating device on unsupported channels
TeamNewPipe/NewPipe#6696
31. Correct Gigaget's license from GPLv2 to GPLv3
TeamNewPipe/NewPipe#4892
32. Add basic resize functionality [Samsung Dex Now Supported]
TeamNewPipe/NewPipe#3948
33. [Security] Update ktlint to 0.40.0
34. Fix security vulnerability update checkstyle / guava
35. Update ExoPlayer from 2.11.6 to 2.11.8
36. Update checkstyle, OkHttp, use Kotlin JDK8 by TacoTheDank added this commit
TeamNewPipe/NewPipe@79e2bb3
from TeamNewPipe/NewPipe#3909
37. Use user agent of DownloaderImpl also in ReCapthaActivity
TeamNewPipe/NewPipe#5215
38. Fix ACRA bug reports not containing stack trace, Do not init ACRA if inside its own process
TeamNewPipe/NewPipe#3982
39. Remove deprecated calls to set Sender class to ACRA
TeamNewPipe/NewPipe#3982
40.Use SubtitlesStream#getUrl instead of getURL
TeamNewPipe/NewPipe#4120
41. Remove pbj=1 parameter from YouYube urls in recaptcha activity
TeamNewPipe/NewPipe#5208
42. Set notification style in Android 11 to MediaStyle Thanks to XiangRongLin for Limted Support for preunified refer to this commit
XiangRongLin@aa55a09
43. Click on title in background player opens video details
TeamNewPipe/NewPipe#3808
44. Add 2K and 4K to the options list for default resolution
 TeamNewPipe/NewPipe#2968
45. Fix crash when opening video in local playlist tab
Fixes TeamNewPipe/NewPipe#3887
by TeamNewPipe/NewPipe#3892 by wb9688
46.  Handle ContentNotSupportedException
TeamNewPipe/NewPipe#3300
47. [YouTube] Improve download speed by Theta-dev
TeamNewPipe/NewPipe#9948
48. Disable commenter image when disabling thumbnails loading by 4D17Y4
Fixes TeamNewPipe/NewPipe#4205
TeamNewPipe/NewPipe#4350
49. Adapt opacity of popup close button to allow touches in other apps on Android >=11
Fixes TeamNewPipe/NewPipe#6770
TeamNewPipe/NewPipe#8279
50. Better error messages for SoundCloud and YouTube unavailable contents
TeamNewPipe/NewPipe#5385
51. Mitigating long buffering on initial video playback by using custom progress-load-interval in exoplayer,
Use 16 KiB as the default progressive load interval by karyogamy
TeamNewPipe/NewPipe#7919
52. Support for opening YouTube Live URLs
TeamNewPipe/NewPipe#9725

Co-Authored-By: Tobi <17365767+tobigr@users.noreply.github.com>
Co-Authored-By: Stypox <stypox@pm.me>
Co-Authored-By: Audric V. <74829229+audricv@users.noreply.github.com>
Co-Authored-By: bopol <58657617+b0pol@users.noreply.github.com>
Co-Authored-By: Isira Seneviratne <31027858+isira-seneviratne@users.noreply.github.com>
Co-Authored-By: opusforlife2 <53176348+opusforlife2@users.noreply.github.com>
Co-Authored-By: fynngodau <fynngodau@mailbox.org>
Co-Authored-By: David Kramer <6166095+dkramer95@users.noreply.github.com>
Co-Authored-By: Ethan Budd <budde25@protonmail.com>
Co-Authored-By: triallax <triallax@tutanota.com>
Co-Authored-By: Kavin <20838718+firemasterk@users.noreply.github.com>
Co-Authored-By: Eric Xu <xeric.2002@gmail.com>
Co-Authored-By: Vincent Mazoyer <17800856+vmazoyer@users.noreply.github.com>
Co-Authored-By: Erol Gorancic <erol@gorancic.no>
Co-Authored-By: Alexander-- <1107390+alexander--@users.noreply.github.com>
Co-Authored-By: Saurav Rao <56369484+sauravrao637@users.noreply.github.com>
Co-Authored-By: Nickoriginal <85299944+nickoriginal@users.noreply.github.com>
Co-Authored-By: Ziyan Zhang <71145592+seanzzy@users.noreply.github.com>
Co-Authored-By: litetex <40789489+litetex@users.noreply.github.com>
Co-Authored-By: XiangRongLin <41164160+xiangronglin@users.noreply.github.com>
Co-Authored-By: wb9688 <46277131+wb9688@users.noreply.github.com>
Co-Authored-By: Okan25 <92695587+okan25@users.noreply.github.com>
Co-Authored-By: Michael Van Delft <1610265+hybridau@users.noreply.github.com>
Co-Authored-By: Taco <32376686+tacothedank@users.noreply.github.com>
Co-Authored-By: ThetaDev <thetadev@magenta.de>
Co-Authored-By: Aditya-Srivastav <54016427+4d17y4@users.noreply.github.com>
Co-Authored-By: John Zhen Mo <zhenmogukl@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Issue is related to a bug downloader Issue is related to the downloader youtube Service, https://www.youtube.com/
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[YouTube] Downloads slowing down then halting around 90% [YouTube] Downloads frequently slow down
6 participants