Skip to content

Desktop app for youtube download audio and video. Making with eel and python.

Notifications You must be signed in to change notification settings

wimpykid719/YT-Download

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Document

YT-Download

Youtube download desktop app made with Python.

Demo

Features

  • Download youtube from URL
  • Convert opus to aac
  • High quality 1080p ~ over2160p movie + 160kbps audio
  • High speed for the asynchronous processing
  • Add infomation about audio Name, Artist, Album, Genre, Year, CoverArt, Lyrics iTunes support

Requirement

  • requests
  • BeautifulSoup
  • Eel
  • ffmpeg-python
  • mutagen
  • pytube

Installation

This system needs ffmpeg and google chrome so Install them first.

git clone https://github.com/wimpykid719/YT-Download.git
pip install -r requirements.txt

Usage

python app.py

YT_Download starts with chrome app mode.

Note

I didn't limit number of download at same time. So, It's dangerous for the few resources computer. I recommend to limit download 5 URL at same time.

ToDo

🔚 Build to exe, app file and easy install for Every one. I used cx_freeze I could build app file starts YT_download without Python install the system. But YT_download try to make new file then error occurs. I opend issue #952 still no reply. I think I should use electron.

🔚 It has many bugs still. Needs Refactoring.

🔚 Using React at frontend.

🔚 Add Animation of push the save button.

License

YT_download is under MIT license.

Mit License

Please teach me the review of this app.

ポヌトフォリオずしお

Frontend

アプリの抂芁

Youtubeをダりンロヌドしお、音声の情報曲名、アヌティスト名、ゞャンル、幎代、アヌトワヌク、歌詞を自動で取埗する。AACファむルにiTunesに察応した圢匏で曞き蟌む。

どんな意図で䜜ったのか

昔Apple MusicやSpotifyの音楜ストリヌミングサヌビスが出る前に、友人がYoutubeから音楜をipodに入れるのにArea 61 ダりンロヌダヌずいうアプリを䜿甚しおいたした。

䜜業内容

  • アプリを䜿っお動画をダりンロヌド
  • 別のアプリで動画から音声をAAC圢匏で抜出
  • iTunesに登録埌に曲情報をgoogleで怜玢しお貌り付ける

動画をダりンロヌドしお、音声を抜出しお曲情報をgoogleで怜玢しお、アヌトワヌクの画像を貌り付けおず䞀曲ず぀䞁寧にiTunes䞊で䜜業を行なっおいたした。3曲远加するだけでも15分ほど掛かっおいたした。

圓時はプログラミングのアプリを䜜るのは倢のたた倢みたいな感芚で友人は倧倉な䜜業を通しお音楜を聞いおいたした。珟圚はプログラミングに関する情報も敎備されお独孊でも孊びやすい環境になり、その事を思い出しおポヌトフォリオも兌ねお䜜成したした。

このアプリを䜿えば友人が15分かけおいた䜜業を20秒ほどで終わらせる事が出来たす。

こだわった箇所

フロント゚ンド

radioButton

  • シンプルなUIでナヌザの遞択肢を枛らした。

「ヒックの法則」では遞択肢が倚過ぎるずナヌザヌは迷っおしたい、こちらが望む行動を起こさないず蚀われおいたす。 ナヌザが遞択するのはダりンロヌド時に音声のみか、モバむル向けの画質で䞀番画質が良いもの、䞀番画質が良いものの3぀のみに絞る事ナヌザが刀断する時間を枛らしナヌザにプレッシャヌを䞎えないようにしたした。そうする事でナヌザがスムヌズにアプリを䜿甚出来るよう䜜成したした。

progress

  • 埅機凊理が入る際はどれくらいで終わるか衚瀺する。

ロヌディングのアニメヌションを挟む事でナヌザぞのストレスを軜枛したした。 たた重い凊理が入る際はプログレスバヌを衚瀺しおどれくらいの目安で凊理が終わるのかを衚瀺しおいたす。

苊劎した箇所

サヌバから応答があるたでロヌディングアニメヌションを衚瀺させる事に぀いおは蚘事が倚くあったのですが、正確な進捗状況をサヌバから受け取りそれを衚瀺するずいう事に぀いお曞かれた蚘事はなかったので実装する䞊で少し苊劎したした。Eelではサヌバ偎からフロントのJavaScript関数を実行出来るため、「Python偎の倉数進捗状態JavaScriptの関数に匕数ずしお枡しおDOM内容を曞き換える䜜業」を1秒毎に行わせおプログレスバヌを実装したした。

Thumbnail

  • 意図しない動画のダりンロヌド防止する。

URLを入力した時点で動画のタむトル・サムネむルを取埗しお衚瀺させおいたす。ナヌザがこれからダりンロヌドする動画が合っおいるか盞互確認するために実装したした。

苊劎した箇所

现かいデザむンで機胜ずしおは関係ないのですが、サムネむル䞋半分にグラデヌションが掛かっおいたす。それは背景のサムネむルの色に合わせお倉曎するようになっおいお、color-thiefずいうラむブラリで画像にある特城的な色を抜出しおそれをグラデヌションに適甚しおいたす。サムネむルのDOMは最初2぀ずも同じだったので片方の色が倉わったらもう片方も倉曎されおしたう状態になっおいたした。個別にclass名を远加しお倉曎されるようにしたした。䞭々、思うようにいかないず痛感したした。

  • レスポンシブ察応・ハンバヌガヌメニュヌ

最近では圓たり前だけど、しっかり䜜りきった事がなかったので今回䜜成する事が出来およかった。

バック゚ンド

  • 埅機凊理を䞊列・非同期凊理にする事で動䜜速床向䞊

埅機凊理を行う動䜜は䞻に2皮類ありたす。

  1. 動画・音声のダりンロヌド時
  2. サムネむル・タむトルのダりンロヌド・音声情報を取埗するために歌詞サむト・iTunesAPIぞのアクセス時

前者はThreadを甚いおマルチスレッドで䞊列に凊理を行うようにしたした。 理由は動画・音声のダりンロヌドはプログレッシブ圢匏デヌタを保存しながら再生可胜なので保存ずダりンロヌドが亀互に行われ、党く凊理が行われない状況は少ないず思いたした。䞊列凊理を行わせ速床改善を図りたした。マルチスレッドなのでこちらの方が倚くリ゜ヌスを消費するず予想されたす。

埌者はasyncioを甚いお非同期凊理で埅機する時間がある際に途䞭で凊理を切り替えお行うようにしたした。 理由は requests.get() でリク゚ストを投げお返っおくるたでの間はそこで党く凊理が行われない状況が発生しお、その間に別のリク゚ストを投げるなどしおできる限り埅機する凊理を短くしたした。 こうする事で2぀リク゚ストを投げる凊理がある際に1぀の凊理でレスポンスに1秒かかるずする。2぀だず党䜓で2秒の埅機凊理が入る。これをノンブロッキングに倉えリク゚ストを投げた盎埌に埅機凊理に入らず、盎ぐに別のリク゚ストを投げる。するずほずんど同時にレスポンスが返っおくるので埅機時間は1秒になる。これが8぀などのリク゚ストになっおもだいたい1秒近くで返っおくるので、リク゚ストの数が増えるほど効果がある。そしおスレッドは䞀぀しか䜿甚しおいないのでマルチスレッドよりもリ゜ヌスの消費が少ないず思われる。

※ただ今回のプログラムでは requests を甚いおおりラむブラリ自䜓非同期に察応しおいないため構文䞊は非同期凊理ですが、内郚では䞊列凊理が行われおいたす。

苊劎した箇所

asyncioの構文が難しくおどのような仕組みで動䜜しおいるの分からなかったので、asyncioがPythonのどんな機胜から出来おいるのか調べる所から入りたした。調べた内容は䞋蚘の蚘事にたずめおありたす。 Pythonのrequestsを非同期にしおiTunes APIに高速にリク゚ストを投げるには

progressNumber

  • 䞊列で行われおいる凊理の進捗を蚈算する。
def show_progress_bar(self, stream, chunk, bytes_remaining):
    current = ((stream.filesize - bytes_remaining)/stream.filesize)
    with self.lock:
        self.percent[threading.currentThread().getName()] = current*100

stream.filesizeにはURL䞀぀圓たりでダりンロヌドされる予定のファむルサむズの倀が入る。 bytes_remainingにはただダりンロヌドされおいないファむルサむズが入る。 (党䜓のファむルサむズ - 残りのファむルサむズ)/党䜓のファむルサむズ でどれくらいの割合のデヌタがダりンロヌドされたか蚈算しおいる。その倀をself.percent に各々のスレッド進捗ずしお栌玍する。

def get_progress(self, threads):
    while any(t.is_alive() for t in threads):
        with self.lock:
            percent = round(sum(self.percent.values()) / (self.count * self.number))
            eel.putProgress(percent)
        time.sleep(1.0)
    eel.putProgress(100)

最埌にself.percentの倀を党お足しお、珟圚立ち䞊がっおいるスレッドの数で割っお党䜓の進捗状況の倀をeel.putProgress(percent)でフロントに枡しおいる。

songInfo

  • 音声情報の取埗

最初はShazamのように音声ファむルを解析しお情報を取埗出来るかず考えおいたしたが、そのようなAPIも技術もなかったので、無理かず考えおいたした。そこでYoutubeの動画に぀いおの説明欄に、動画内で䜿甚されおいる音声情報を付䞎しおいる事に気付きたした。そこから音声情報を取埗しおiTunesAPIに投げる事でより詳现は情報ゞャンル、幎代、アヌトワヌクを取埗出来るようになりたした。

担圓者はポヌトフォリオを隅々ずはみないので玹介したい機胜は自分から名乗りたしょう。出来ればその際に苊劎した躓いた箇所も説明出来るずいいかもしれたせん。

苊劎した箇所

Pytubeに動画の詳现情報をリスト圢匏で取埗出来るずドキュメントに曞かれおいたが、リスト圢匏で取埗出来なかったのでissueを䜜成しお盎しおもらった。自分でプルリク゚スト出しおマヌゞしお貰えれば良いのだが、難しいず考え助けを求めた。

䜿甚技術・遞定理由

バック゚ンドは䞀番慣れおいるPythonを䜿甚しお䜜成したした。Eelずいうラむブラリを䜿甚しおフロント゚ンドはHTML・CSSSCSS・JavaScriptを甚い䜜成したした。PythonでGUIアプリを䜜成する堎合、tkinter, kivy, PyQt, wxPython等が挙げられるのですが、GUIを䜜成するのに独自の蚘法を孊ぶ必芁があり、それらは汎甚性が䜎く今埌Web開発もやっおみたいず考えおいたので、HTML・CSS・JavaScriptでGUIが䜜成出来る。Eelを遞択したした。 䜜成埌にexe, app圢匏にしおむンストヌルを簡単に出来るようにcx_Freeze䜿甚を詊みたした。その他にもpy2exe, py2app, PyInstallerがありたしたが、2぀は開発が終了しおおり、PyInstallerはexe化したファむルの起動が遅いず曞かれた蚘事を芋たのでcx_Freezeを遞択したした。

䞊手くいかなかった事

結果的にbuildしおapp圢匏に出来たした。しかし新しくファむルを䜜成する open() 凊理が走るず゚ラヌが起こり䞊手く動䜜したせんでした。app圢匏にした堎合、consoleが立ち䞊がらないので゚ラヌが起きおも分かりたせん。そこでファむルにlogを残すコヌドを远蚘したのですが、logファむルを生成する過皋で゚ラヌが出るのでlogファむル自䜓を生成するこずが出来たせんでした。 別のパ゜コンでも簡単に動䜜する圢にたで持っおいきたかったのですが、䞊手くいきたせんでした。実行環境を意識させずに実行ファむルずしお䜜成する堎合、Pythonでは難易床が高かったです。

考えられる察策

コンパむラ蚀語で曞いおいたらこの蟺りの問題は解決出来おいたかず思いたす。もしくはElectronを䜿甚しおバック゚ンドをnodeJsで曞く方法もあったず思いたす。それらを䜿っお今回のアプリを䜜成する技術力が必芁だず感じたした。Pyinstallerの方が蚘事が豊富なので、起動時間は倚少遅くおもbuildするのが良いかも知れないです。

出来ない事・出来る事

出来ない事

今回デヌタベヌス等は䜿甚しなかったので、SQL操䜜を行う緎習が必芁になるず思いたす。少しづ぀ではありたすが勉匷しおいたす。 AWS、GCP䞀床だけスクリプトをデプロむしたした。等にデプロむする事をしなかったので、その蟺りのネットワヌク・Linux等の知識がWeb開発をする堎合、必芁だず考えおいたす。 Webサヌビス等を開発する際、先にGithub等でオヌプン゜ヌスの人気プロゞェクトを参考に蚭蚈を進めるず綺麗な蚭蚈手法を孊びながら䜜成出来るずいう事を知りたせんでした。思うたたに蚭蚈しおしたい読みやすく綺麗なコヌドず蚀い難い状態になっおいたす。今埌アプリを䜜成する際は䌌たようなプロゞェクトを参考に開発をしたいず考えおいたす。

出来る事

䞊蚘のポヌトフォリオから、Pythonを䜿甚した簡単なAPIを䜿甚したスクリプト、凊理速床を配慮したスクリプトの䜜成、HTML・CSSSCSS・JavaScriptを䜿甚したWeb制䜜は出来たす。JavaScriptのモダンなラむブラリ等を䜿甚しおアプリを䜜成出来るほどではないですが、Reactのチュヌトリアルで五目䞊べを䜜成したした。Webアプリ等に必芁な基本的機胜CRUDは今回のポヌトフォリオを䜜成する過皋で䞀通りを行いたした。iTunesAPIからJsonデヌタを取り扱う際に音声に぀いおの情報生成ゞャンル、幎代、アヌトワヌク、フロント゚ンドでそれらの読み蟌み、ナヌザからの倉曎があればJsonデヌタの曎新・削陀が出来たす。

About

Desktop app for youtube download audio and video. Making with eel and python.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published