diff --git a/LICENSE b/LICENSE index 359b965..a5eff24 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,7 @@ The MIT License Copyright (c) 2015-2019 Just-Some-Bots (https://github.com/Just-Some-Bots) +Copyright (c) 2020-2020 Team-JSB (https://github.com/Team-JSB) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 1a7dcfe..124f0fc 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,11 @@ Just a quick note: ***This is not in any way official***. This is just a guide o **As this bot is modified from the original version, do not expect any support for it on their official Discord server. They will NOT help you. You may open an issue here if you think it's a Heroku related issue and we can try to help but please try updating the dependencies first using the instructions given near the end of this readme to see if it fixes your problem.** -The original MusicBot is available [here](https://github.com/Just-Some-Bots/MusicBot). +The original MusicBot is available [here](https://github.com/Just-Some-Bots/MusicBot), however starting from release-010620u we have switched to the unofficial fork of the bot maintained by Team-JSB. You can find it [here](https://github.com/Team-JSB/MusicBot). This is to host the Discord music bot onto your own free Heroku cloud account. -This branch is based on MusicBot release-260819. Previous releases of the bot can be found in the [releases page](https://github.com/helionmusic/rhinobot_heroku/releases). +This branch is based on MusicBot release-010620u. Previous releases of the bot can be found in the [releases page](https://github.com/helionmusic/rhinobot_heroku/releases). ### Instructions to get this up and working: **Your bot will be shut down by Heroku on the last week of each month. If you're ok with this, you can follow the tutorial below. Otherwise you will need to add a credit card to have enough hours for a whole month (provided you don't have any other applications on your Heroku account)** @@ -23,10 +23,10 @@ This is the method I personally used to get it up and running. **Instructions:** -First of all: [Create a Discord Bot account](https://discordapp.com/developers) +First of all: [Create a Discord Bot account](https://discord.com/developers) Don't forget to add it to your Discord server using this URL: -https://discordapp.com/api/oauth2/authorize?client_id=INSERTHERE&permissions=775285841&scope=bot +https://discord.com/api/oauth2/authorize?client_id=INSERTHERE&permissions=775285841&scope=bot Replace `INSERTHERE` in the URL with the bot client ID found in the Discord developer portal. @@ -34,7 +34,7 @@ Replace `INSERTHERE` in the URL with the bot client ID found in the Discord deve Now, edit the `options.ini` file inside the `config` folder to set your bot's necessary configuration. -If you are unsure how to do this step, refer to the MusicBot configuration guide [here](https://just-some-bots.github.io/MusicBot/using/configuration/) +If you are unsure how to do this step, refer to the MusicBot configuration guide [here](https://team-jsb.github.io/MusicBot/using/configuration/) Edit the `options.ini` and the `permissions.ini` to your liking. Remember however to leave the `SaveVideos = no` in your options otherwise you will quickly run out of space on the Heroku server. @@ -85,11 +85,13 @@ To do this, type ``heroku ps:scale worker=1`` in the command prompt. That's it. The bot should instantly fire up and should be logged in to your discord server within the next minute. If you've set it to auto join a voice channel it should automatically join it. -**Updating youtube-dl** +**Updating dependencies** -This bot relies on [youtube-dl](https://github.com/ytdl-org/youtube-dl) to make the bot work. If the bot suddenly stops working for any reason, try updating it. +This bot relies on several components listed in the [requirements.txt](https://github.com/helionmusic/rhinobot_heroku/blob/master/requirements.txt) file to make it work. If the bot suddenly stops working for any reason, try updating the dependencies. -Check the latest release of youtube-dl on their [releases](https://github.com/ytdl-org/youtube-dl/releases) and replace the version number in the requirements.txt file. +The important ones are [discord.py](https://github.com/Rapptz/discord.py/releases) and [youtube-dl](https://github.com/ytdl-org/youtube-dl/releases). You would want to check the latest release of these two dependencies and replace the version numbers in the requirements.txt file. + +Also, check the [requirements.txt file of discord.py](https://github.com/Rapptz/discord.py/blob/master/requirements.txt) and if they've updated the aiohttp and websockets requirements, copy and paste them into the Heroku MusicBot's requirements.txt file. # _____________________________________ # Contributors @@ -105,8 +107,8 @@ Check the latest release of youtube-dl on their [releases](https://github.com/yt # MusicBot -[![GitHub stars](https://img.shields.io/github/stars/Just-Some-Bots/MusicBot.svg)](https://github.com/Just-Some-Bots/MusicBot/stargazers) -[![GitHub forks](https://img.shields.io/github/forks/Just-Some-Bots/MusicBot.svg)](https://github.com/Just-Some-Bots/MusicBot/network) +[![GitHub stars](https://img.shields.io/github/stars/Team-JSB/MusicBot.svg)](https://github.com/Team-JSB/MusicBot/stargazers) +[![GitHub forks](https://img.shields.io/github/forks/Team-JSB/MusicBot.svg)](https://github.com/Team-JSB/MusicBot/network) [![Python version](https://img.shields.io/badge/python-3.5%2C%203.6%2C%203.7-blue.svg)](https://python.org) [![Discord](https://discordapp.com/api/guilds/129489631539494912/widget.png?style=shield)](https://discord.gg/bots) @@ -115,15 +117,16 @@ MusicBot is the original Discord music bot written for [Python](https://www.pyth ![Main](https://i.imgur.com/FWcHtcS.png) ## Setup -Setting up the MusicBot is relatively painless - just follow one of the [guides](https://just-some-bots.github.io/MusicBot/). After that, configure the bot to ensure its connection to Discord. + +Setting up the MusicBot is relatively painless - just follow one of the [guides](https://team-jsb.github.io/MusicBot/). After that, configure the bot to ensure its connection to Discord. The main configuration file is `config/options.ini`, but it is not included by default. Simply make a copy of `example_options.ini` and rename it to `options.ini`. See `example_options.ini` for more information about configurations. ### Commands -There are many commands that can be used with the bot. Most notably, the `play ` command (preceded by your command prefix) will download, process, and play a song from YouTube or a similar site. A full list of commands is available [here](https://just-some-bots.github.io/MusicBot/using/commands/ "Commands"). +There are many commands that can be used with the bot. Most notably, the `play ` command (preceded by your command prefix) will download, process, and play a song from YouTube or a similar site. A full list of commands is available [here](https://team-jsb.github.io/MusicBot/using/commands/ "Commands"). ### Further reading * [Support Discord server](https://discord.gg/bots) -* [Project license](LICENSE) +* [Project license](LICENSE) \ No newline at end of file diff --git a/bootstrap.py b/bootstrap.py index 7f04dd5..b857026 100644 --- a/bootstrap.py +++ b/bootstrap.py @@ -511,7 +511,7 @@ def setup(self, data): class GitCloneMusicbot(SetupTask): - GIT_URL = "https://github.com/Just-Some-Bots/MusicBot.git" + GIT_URL = "https://github.com/Team-JSB/MusicBot.git" GIT_CMD = "git clone --depth 10 --no-single-branch %s %s" % (GIT_URL, INSTALL_DIR) def download(self): diff --git a/config/autoplaylist.txt b/config/_autoplaylist.txt similarity index 97% rename from config/autoplaylist.txt rename to config/_autoplaylist.txt index d0896f8..02e9816 100644 --- a/config/autoplaylist.txt +++ b/config/_autoplaylist.txt @@ -1,2548 +1,2548 @@ -## https://temp.discord.fm/ - -# Generated by Discord.FM - electro-hub -https://youtube.com/watch?v=nEt1bKGlCpM -https://youtube.com/watch?v=wNwY8JCBm6o -https://youtube.com/watch?v=nedAfpJV53w -https://youtube.com/watch?v=Xq-knHXSKYY -https://youtube.com/watch?v=ovrGzbsQZqc -https://youtube.com/watch?v=jK2aIUmmdP4 -https://youtube.com/watch?v=7m_QZZTb6Xc -https://youtube.com/watch?v=pisxxUpS7o8 -https://youtube.com/watch?v=UwbVx-XTubM -https://youtube.com/watch?v=2YVtby__ZS0 -https://youtube.com/watch?v=PKfxmFU3lWY -https://youtube.com/watch?v=ngsGBSCDwcI -https://youtube.com/watch?v=EfR2OXNECWo -https://youtube.com/watch?v=IzIHf1EToTE -https://youtube.com/watch?v=oC-GflRB0y4 -https://youtube.com/watch?v=AJh1o0wvqKI -https://youtube.com/watch?v=bTNTNxZaTp0 -https://youtube.com/watch?v=MwSkC85TDgY -https://youtube.com/watch?v=8RTR1Ag0rhQ -https://youtube.com/watch?v=GzataxzdwIs -https://youtube.com/watch?v=n3uQghHbcaQ -https://youtube.com/watch?v=RvJYIGJilG0 -https://youtube.com/watch?v=ARgdBb2Go0w -https://youtube.com/watch?v=du8iQQ0zoRc -https://youtube.com/watch?v=x-4O0y3rDW4 -https://youtube.com/watch?v=IKKXdjRXsXQ -https://youtube.com/watch?v=4QTh79V696Q -https://youtube.com/watch?v=dXpFEgi43lU -https://youtube.com/watch?v=ClM5UqKQvEk -https://youtube.com/watch?v=0t2tjNqGyJI -https://youtube.com/watch?v=oMf4ap3OrO8 -https://youtube.com/watch?v=60ItHLz5WEA -https://youtube.com/watch?v=cNxNDWWwC9w -https://youtube.com/watch?v=JA7bmiafKNM -https://youtube.com/watch?v=usXhiWE2Uc0 -https://youtube.com/watch?v=5lLclBfKj48 -https://youtube.com/watch?v=FYyCbKZIkgc -https://youtube.com/watch?v=S5_Mf04nbLw -https://youtube.com/watch?v=ou03DhIp3zI -https://youtube.com/watch?v=13TIWyeuY4w -https://youtube.com/watch?v=C_fpzKoHyw8 -https://youtube.com/watch?v=WbksTnQVqyI -https://youtube.com/watch?v=pAGVvPfwdCY -https://youtube.com/watch?v=hgKDu5pp_fU -https://youtube.com/watch?v=YaHw1lYbE7I -https://youtube.com/watch?v=UifuuynvrlY -https://youtube.com/watch?v=pe6du2o_vdc -https://youtube.com/watch?v=3FPwcaflCS8 -https://youtube.com/watch?v=WPNq_VJOSxU -https://youtube.com/watch?v=Rns6bSR_OFQ -https://youtube.com/watch?v=J9nMlGRDXlw -https://youtube.com/watch?v=dS5UpPflmnM -https://youtube.com/watch?v=lznKG_PovSo -https://youtube.com/watch?v=Pk7b7YC93qQ -https://youtube.com/watch?v=44PO8jPGvsE -https://youtube.com/watch?v=m-tjK8hQwrU -https://youtube.com/watch?v=F0uBAB0i1uY -https://youtube.com/watch?v=FMUf8K-dkIk -https://youtube.com/watch?v=cGAU_Xa-Xl0 -https://youtube.com/watch?v=ZH2DMNk6udI -https://youtube.com/watch?v=QHfCeR8cXvc -https://youtube.com/watch?v=5QQ0ebVrLQw -https://youtube.com/watch?v=cIbqvbwI5Pg -https://youtube.com/watch?v=7DZ-alFDXns -https://youtube.com/watch?v=sH0BPn2jkP4 -https://youtube.com/watch?v=0K3p26aj6jE -https://youtube.com/watch?v=L_pqQBKt-dM -https://youtube.com/watch?v=XZy5dQH0xZs -https://youtube.com/watch?v=sEX98pH5qIA -https://youtube.com/watch?v=ux9vr4xfWj4 -https://youtube.com/watch?v=YlXRq9-0alw -https://youtube.com/watch?v=e4dZoM5kAfU -https://youtube.com/watch?v=3x5eFVWfcVA -https://youtube.com/watch?v=7lI2HST_lvA -https://youtube.com/watch?v=qEdf1qdO3_c -https://youtube.com/watch?v=BWuHMes6kag -https://youtube.com/watch?v=_eaIurlPB7w -https://youtube.com/watch?v=3j1U0Io65Ds -https://youtube.com/watch?v=X62lV9WdVmo -https://youtube.com/watch?v=3FMfZbdvX9A -https://youtube.com/watch?v=ZN4NxYy3vVQ -https://youtube.com/watch?v=MQ0hFNd5aaU -https://youtube.com/watch?v=574LrnfW2_s -https://youtube.com/watch?v=h8NwXM6SNbU -https://youtube.com/watch?v=EZ7zIrNMIH8 -https://youtube.com/watch?v=vbjoupCWk_M -https://youtube.com/watch?v=H_tgomTUiWY -https://youtube.com/watch?v=g2rdrNONy7k -https://youtube.com/watch?v=n5vdgTt9VPU -https://youtube.com/watch?v=QSb46QzHlWg -https://youtube.com/watch?v=WSb6HYnFT3Q -https://youtube.com/watch?v=lJ1NYJQnJTI -https://youtube.com/watch?v=34thwBLMe4g -https://youtube.com/watch?v=Q1DvVzKXktY -https://youtube.com/watch?v=hwywsmBbPIQ -https://youtube.com/watch?v=dDnwuokL07o -https://youtube.com/watch?v=qC4NdLg_05c -https://youtube.com/watch?v=R0P_f0gXXqs -https://youtube.com/watch?v=fnQgDgB5kbw -https://youtube.com/watch?v=Lc14Z1kgTb8 -https://youtube.com/watch?v=s1IrZxUYw5Q -https://youtube.com/watch?v=cWsDw8sDTJ4 -https://youtube.com/watch?v=kMHFn4Ra7uk -https://youtube.com/watch?v=TJUVNg5zxAs -https://youtube.com/watch?v=C9Bv1DiDZTM -https://youtube.com/watch?v=i78U3VEAwK8 -https://youtube.com/watch?v=PM98IHH0rfE -https://youtube.com/watch?v=9PB30JUOncw -https://youtube.com/watch?v=QIMlGbv9K9w -https://youtube.com/watch?v=d3Oc26AFDdU -https://youtube.com/watch?v=VGh5DV0D3wk -https://youtube.com/watch?v=71rSc6LXlSo -https://youtube.com/watch?v=phn2JZ2xTz4 -https://youtube.com/watch?v=xshEZzpS4CQ -https://youtube.com/watch?v=5tAsUGEqob4 -https://youtube.com/watch?v=FtveSk1N7Uo -https://youtube.com/watch?v=zGERGT06AsM -https://youtube.com/watch?v=3_-a9nVZYjk -https://youtube.com/watch?v=B7xai5u_tnk -https://youtube.com/watch?v=jqkPqfOFmbY -https://youtube.com/watch?v=v5a0YGaVS0I -https://youtube.com/watch?v=cIe6x_s14Is -https://youtube.com/watch?v=qDcFryDXQ7U -https://youtube.com/watch?v=TKZUhs9Gcdo -https://youtube.com/watch?v=T8fcbqDUwbU -https://youtube.com/watch?v=IIrCDAV3EgI -https://youtube.com/watch?v=HAIDqt2aUek -https://youtube.com/watch?v=ONoNjKtf3z8 -https://youtube.com/watch?v=mFQ_5dmzFsU -https://youtube.com/watch?v=-kAsZVn44aI -https://youtube.com/watch?v=vARpxoSM0kU -https://youtube.com/watch?v=6vUjU3_YS1k -https://youtube.com/watch?v=ZXI-LXszvkQ -https://youtube.com/watch?v=X3LInDIIU0U -https://youtube.com/watch?v=T_XHUA9G2zU -https://youtube.com/watch?v=-CzBYn7iRSI -https://youtube.com/watch?v=bzrtS_IuNGw -https://youtube.com/watch?v=2-DJeXSWrCg -https://youtube.com/watch?v=OVMuwa-HRCQ -https://youtube.com/watch?v=4lXBHD5C8do -https://youtube.com/watch?v=EfOn2yyKz1g -https://youtube.com/watch?v=czd0Er-_qI8 -https://youtube.com/watch?v=g2Sh7SANjng -https://youtube.com/watch?v=saAHXkRh6ms -https://youtube.com/watch?v=7BhYmwFSOas -https://youtube.com/watch?v=w_r-y92gmPI -https://youtube.com/watch?v=DljSVcwVImU -https://youtube.com/watch?v=Kky7rIEePQk -https://youtube.com/watch?v=FdznALpbovU -https://youtube.com/watch?v=cNT3q6tO-ZY -https://youtube.com/watch?v=_jU2V8sT_pE -https://youtube.com/watch?v=Gqw62pN960U -https://youtube.com/watch?v=_ud3mOQxWYo -https://youtube.com/watch?v=2EsdeUWAD34 -https://youtube.com/watch?v=ZHZxmp88Ts8 -https://youtube.com/watch?v=T3wvPpVOL04 -https://youtube.com/watch?v=NeVqF1pBEbU -https://youtube.com/watch?v=pfHM9HyRnRc -https://youtube.com/watch?v=TLkYY4lcNE0 -https://youtube.com/watch?v=0LWHowDwKn4 -https://youtube.com/watch?v=US7wauHA8MI -https://youtube.com/watch?v=EpiWHALFH-U -https://youtube.com/watch?v=WEhpAg1jLEQ -https://youtube.com/watch?v=Al23Vj-YPn8 -https://youtube.com/watch?v=hQsozlJv20k -https://youtube.com/watch?v=WK1OFAiCg9g -https://youtube.com/watch?v=2Q4KLb3CqOA -https://youtube.com/watch?v=7PRrzMWECeU -https://youtube.com/watch?v=39b3zjk_hKg -https://youtube.com/watch?v=7-W-djGV6og -https://youtube.com/watch?v=z269QQh7ano -https://youtube.com/watch?v=TEyndDhVZUg -https://youtube.com/watch?v=-pbsYf4Dc7w -https://youtube.com/watch?v=gZ11wHTS0Bk -https://youtube.com/watch?v=GN8zUPYivuQ -https://youtube.com/watch?v=hNNwtDgQf_0 -https://youtube.com/watch?v=CI9sIgU-WNY -https://youtube.com/watch?v=feQhtf-KJvw -https://youtube.com/watch?v=T6kG5vuPVSs -https://youtube.com/watch?v=RkqdK0Yiyh8 -https://youtube.com/watch?v=5tfZAyNYWN4 -https://youtube.com/watch?v=nVDQfKk_E2g -https://youtube.com/watch?v=69yieWP0g10 -https://youtube.com/watch?v=fcYazsR6w-k -https://youtube.com/watch?v=FHccClTAdzc -https://youtube.com/watch?v=phhPSwFdgS8 -https://youtube.com/watch?v=OX3eAI0eZqE -https://youtube.com/watch?v=W-5OUle-U3c -https://youtube.com/watch?v=qYk7Ko9QY-E -https://youtube.com/watch?v=cXER29tPVow -https://youtube.com/watch?v=QVkGFtSTwis -https://youtube.com/watch?v=NZhFMC0_mTk -https://youtube.com/watch?v=dFEBpDW-K7E -https://youtube.com/watch?v=6nRy10_iOPc -https://youtube.com/watch?v=Kji10fsHyVs -https://youtube.com/watch?v=oiWzM3zUvF8 -https://youtube.com/watch?v=c29bgvu4egI -https://youtube.com/watch?v=rkJy9feER_o -https://youtube.com/watch?v=tfpVib0ji54 -https://youtube.com/watch?v=xfEtO5Zs8Zk -https://youtube.com/watch?v=duTPsznmSlU -https://youtube.com/watch?v=stGTBsIyYZQ -https://youtube.com/watch?v=e_aioZQA3kk -https://youtube.com/watch?v=ZXKexscG5u8 -https://youtube.com/watch?v=2MG74eZfkJ4 -https://youtube.com/watch?v=xMz3AwBE4ZQ -https://youtube.com/watch?v=c0ubrGE1Egk -https://youtube.com/watch?v=qqZp8FEKCB4 -https://youtube.com/watch?v=3i-VrbTFIWI -https://youtube.com/watch?v=aN_ZCMOx0lo -https://youtube.com/watch?v=W_5unoZTpoQ -https://youtube.com/watch?v=94M_tkjf-JA -https://youtube.com/watch?v=HaxVJg4WiXw -https://youtube.com/watch?v=qDm3Dtr_LR4 -https://youtube.com/watch?v=Tcq55RDiVqw -https://youtube.com/watch?v=As-uiQ7Tvoo -https://youtube.com/watch?v=a52Ul2AM92c -https://youtube.com/watch?v=_mwL6R-Z1e4 -https://youtube.com/watch?v=7fugVGRFqe0 -https://youtube.com/watch?v=lABPt0CRO_U -https://youtube.com/watch?v=paWIfLD4S2o -https://youtube.com/watch?v=BL_0sHPMrQI -https://youtube.com/watch?v=Ygf_yk5QJXY -https://youtube.com/watch?v=ip4Q1pbrYDg -https://youtube.com/watch?v=J2X5mJ3HDYE -https://youtube.com/watch?v=yrEbCGtZFAQ -https://youtube.com/watch?v=1dcXmkco5ko -https://youtube.com/watch?v=6nuOSTiFNO0 -https://youtube.com/watch?v=5HQefcytyhk -https://youtube.com/watch?v=bSfpSOBD30U -https://youtube.com/watch?v=x_OwcYTNbHs -https://youtube.com/watch?v=vxOewDbARxk -https://youtube.com/watch?v=_cb0O-pRdF0 -https://youtube.com/watch?v=ZtaRRcoTQ4E -https://youtube.com/watch?v=8U2rKAnyyDE -https://youtube.com/watch?v=NV2qji32jic -https://youtube.com/watch?v=BUV2sRIcnqw -https://youtube.com/watch?v=hf4IxNNiqbU -https://youtube.com/watch?v=-mSRraXCY9w -https://youtube.com/watch?v=GWVd1Db16uE -https://youtube.com/watch?v=tyrUaI4KBRk -https://youtube.com/watch?v=eUL6AKzJQw8 -https://youtube.com/watch?v=c6P7iqvq1Og -https://youtube.com/watch?v=2sh0ENwPGXw -https://youtube.com/watch?v=Byuhn6hkJbM -https://youtube.com/watch?v=R7-hFVbDiIo -https://youtube.com/watch?v=gJeh_dLjPN4 -https://youtube.com/watch?v=SyggBM8Bqls -https://youtube.com/watch?v=yXLL46xkdlY -https://youtube.com/watch?v=7TsLBmXNKeo -https://youtube.com/watch?v=iN_Vzi5DVhY -https://youtube.com/watch?v=vBdnfyfBSKg -https://youtube.com/watch?v=OLGN9_mycsU -https://youtube.com/watch?v=FYh29RMpmAc -https://youtube.com/watch?v=lbV-YwTwkTI -https://youtube.com/watch?v=Qn5sYvn_H2w -https://youtube.com/watch?v=ivLdLtOtOzU -https://youtube.com/watch?v=j2BAT1UqoHE -https://youtube.com/watch?v=9Mlvjb5aoq4 -https://youtube.com/watch?v=9d4il0lDszg -https://youtube.com/watch?v=pa9DAW7PtFA -https://youtube.com/watch?v=p6XagVe8bmw -https://youtube.com/watch?v=fDZIHq0D6vc -https://youtube.com/watch?v=tI2LwQGZTDA -https://youtube.com/watch?v=njckdova0bY -https://youtube.com/watch?v=Zv1QV6lrc_Y -https://youtube.com/watch?v=m3T9JgHLIAk -https://youtube.com/watch?v=Ey1_nkmS54g -https://youtube.com/watch?v=a7cGKQeqfrI -https://youtube.com/watch?v=0mOqIsnqSqM -https://youtube.com/watch?v=pTBQRFWiiHo -https://youtube.com/watch?v=PwY-PlXdK6M -https://youtube.com/watch?v=ivY2Kfhw31Q -https://youtube.com/watch?v=aVzh-b7HenE -https://youtube.com/watch?v=z872doHfVXs -https://youtube.com/watch?v=zIjKbIdJ82w -https://youtube.com/watch?v=8sxAeb9BTKY -https://youtube.com/watch?v=Pw_Fq8pjQE4 -https://youtube.com/watch?v=5txjj5awqS0 -https://youtube.com/watch?v=LAoZSikvqz8 -https://youtube.com/watch?v=5aQqJLHpTqw -https://youtube.com/watch?v=4Um6HAbXYnY -https://youtube.com/watch?v=qoQLxO54JZY -https://youtube.com/watch?v=hGdU7vPWPMc -https://youtube.com/watch?v=mSU-TWxNjJA -https://youtube.com/watch?v=m8UjXEnSNIg -https://youtube.com/watch?v=Q0vmiuBdYH0 -https://youtube.com/watch?v=iafxqkKZacA -https://youtube.com/watch?v=cFIR80BZ0sM -https://youtube.com/watch?v=zkl3-BqhfRU -https://youtube.com/watch?v=V0tiM_RLXCs -https://youtube.com/watch?v=d01XRSB-7dA -https://youtube.com/watch?v=15ry8nvYLdQ -https://youtube.com/watch?v=G1k9Ag69LI8 -https://youtube.com/watch?v=ZqJiXLJs_Pg -https://youtube.com/watch?v=5hd53EIKRXI -https://youtube.com/watch?v=p13lhwtSaQc -https://youtube.com/watch?v=K1xrQcbAwgE -https://youtube.com/watch?v=unx9er0sG6o -https://youtube.com/watch?v=IAAh4s5JrAs -https://youtube.com/watch?v=91wK-WFHAhQ -https://youtube.com/watch?v=0rLAIF4JhHs -https://youtube.com/watch?v=VHMG0tQ1sq0 -https://youtube.com/watch?v=mc9LKJMedaY -https://youtube.com/watch?v=QNfQq_z255c -https://youtube.com/watch?v=B88mv0dhYwc -https://youtube.com/watch?v=eeKjgkveAh0 -https://youtube.com/watch?v=5ejWHwI72bU -https://youtube.com/watch?v=oRrq6zXFUKg -https://youtube.com/watch?v=9rixtkYjbRQ -https://youtube.com/watch?v=aUGA-RJoqNA -https://youtube.com/watch?v=4oQ7VTB5zqs -https://youtube.com/watch?v=VPxUQiH--kU -https://youtube.com/watch?v=BNFcrNX_hOE -https://youtube.com/watch?v=IkDj2D3KiPc -https://youtube.com/watch?v=qpx8HJAYb8k -https://youtube.com/watch?v=v0g1xzCpEOM -https://youtube.com/watch?v=oRV5DbcLivs -https://youtube.com/watch?v=LjFSPklTE8w -https://youtube.com/watch?v=KR-eV7fHNbM -https://youtube.com/watch?v=e6LUWscWEw4 -https://youtube.com/watch?v=UVnn6ueVs9A -https://youtube.com/watch?v=lAivBjfVH0o -https://youtube.com/watch?v=pkmrSXtSt84 -https://youtube.com/watch?v=f_DX1A7f43o -https://youtube.com/watch?v=_qg0j-mCCwc -https://youtube.com/watch?v=RO3V1V5Valk -https://youtube.com/watch?v=kn9_rgoX14A -https://youtube.com/watch?v=ow4i6I-OptM -https://youtube.com/watch?v=hGxUXFlSvbU -https://youtube.com/watch?v=9NwZdxiLvGo -https://youtube.com/watch?v=TPZnDVnNZ6E -https://youtube.com/watch?v=wltiSg6O0PY -https://youtube.com/watch?v=Ve1N7hShM7M -https://youtube.com/watch?v=0O2aH4XLbto -https://youtube.com/watch?v=ttFyuRmFgZY -https://youtube.com/watch?v=5tp8iVL9LPc -https://youtube.com/watch?v=AyBYKl8SyK8 -https://youtube.com/watch?v=XgvIBouzEso -https://youtube.com/watch?v=-uEkDyHp4vA -https://youtube.com/watch?v=_9eHO1V-EYw -https://youtube.com/watch?v=Lq6n7Hlgjw4 -https://youtube.com/watch?v=eqsXMVobPZM -https://youtube.com/watch?v=XhohLI1Rupc -https://youtube.com/watch?v=-iYzuc_gM9U -https://youtube.com/watch?v=DWLz0yJegtA -https://youtube.com/watch?v=8Gbop-ZLUfA -https://youtube.com/watch?v=u01YGBPh-YQ -https://youtube.com/watch?v=F41lj80297E -https://youtube.com/watch?v=ImXmEPGKljI -https://youtube.com/watch?v=c3Lui73UEk4 -https://youtube.com/watch?v=RQoUnnsa_xg -https://youtube.com/watch?v=3D_fiyrxSIs -https://youtube.com/watch?v=Nqqc2FHf9Ug -https://youtube.com/watch?v=EIwtr-VqwcM -https://youtube.com/watch?v=0ZgNpboHPMI -https://youtube.com/watch?v=jWBP05rL36U -https://youtube.com/watch?v=6y_NJg-xoeE -https://youtube.com/watch?v=0BH7XF117Ek -https://youtube.com/watch?v=dfO4aOcf4F8 -https://youtube.com/watch?v=-WR0o7NWUy8 -https://youtube.com/watch?v=BQX9x6P5w7k -https://youtube.com/watch?v=a0Aauep0VWs -https://youtube.com/watch?v=DytrHrwoG4k -https://youtube.com/watch?v=GhKm_SdHsLs -https://youtube.com/watch?v=4eGk7KVTRSk -https://youtube.com/watch?v=As_4MEJUzeY -https://youtube.com/watch?v=mpQeKHrZGWU -https://youtube.com/watch?v=GnqSIa0GNSA -https://youtube.com/watch?v=C-x7ZJ5aMNM -https://youtube.com/watch?v=hPpK_GkAK30 -https://youtube.com/watch?v=dba3MYL6Nzc -https://youtube.com/watch?v=BQrNh80N6Hg -https://youtube.com/watch?v=QBXrhgg9s0c -https://youtube.com/watch?v=OilPvUo2vac -https://youtube.com/watch?v=qTPqCUyLLhA -https://youtube.com/watch?v=UkC5uVSfa7k -https://youtube.com/watch?v=RhzJGZ5lzgM -https://youtube.com/watch?v=eLBozbquURs -https://youtube.com/watch?v=FsQjo7Z11_Q -https://youtube.com/watch?v=fIpCwYJnYLg -https://youtube.com/watch?v=dNLOZjCWTs4 -https://youtube.com/watch?v=rpkDl6UN4a8 -https://youtube.com/watch?v=kw8xqJ7SXmY -https://youtube.com/watch?v=_cB3HXVvm0g -https://youtube.com/watch?v=YBlrSdfUgPI -https://youtube.com/watch?v=110csW7KUbM -https://youtube.com/watch?v=Xz5qHx-MHDo -https://youtube.com/watch?v=Iaa03itxNZ0 -https://youtube.com/watch?v=9W8Q9FvH1XA -https://youtube.com/watch?v=ijfNbbcP2k0 -https://youtube.com/watch?v=I5z2--4O7sA -https://youtube.com/watch?v=j8F1NwrHBIU -https://youtube.com/watch?v=Z--UAlidTyI -https://youtube.com/watch?v=Y-fYkVi3HjQ -https://youtube.com/watch?v=ztsrgkKUctk -https://youtube.com/watch?v=LdG3aC95P7w -https://youtube.com/watch?v=Mv0g-j0iL-s -https://youtube.com/watch?v=uqzQfOKZoPc -https://youtube.com/watch?v=5LM4zck0LJ0 -https://youtube.com/watch?v=NwYlewhSkBQ -https://youtube.com/watch?v=C9FNqHTq8aU -https://youtube.com/watch?v=BxmZovupVYU -https://youtube.com/watch?v=UlBrE-4NBzs -https://youtube.com/watch?v=a59gmGkq_pw -https://youtube.com/watch?v=SqVSMucFDWk -https://youtube.com/watch?v=fBOPmzfBAnc -https://youtube.com/watch?v=awimSQD2Dyo -https://youtube.com/watch?v=jBmxH56XQBw -https://youtube.com/watch?v=9-VL30-Bn48 -https://youtube.com/watch?v=GaxEm9MPlzM -https://youtube.com/watch?v=AIkM352LpN8 -https://youtube.com/watch?v=UaerdFeq32E -https://youtube.com/watch?v=YcK3XCEeTsg -https://youtube.com/watch?v=rgc_lIMkRzc -https://youtube.com/watch?v=aq9YpxZiHY4 -https://youtube.com/watch?v=ztV9Z1T04RE -https://youtube.com/watch?v=SCD2tB1qILc -https://youtube.com/watch?v=PFKCFewHMc4 -https://youtube.com/watch?v=hImf920RCGI -https://youtube.com/watch?v=9xx69FxiZrc -https://youtube.com/watch?v=KWyhhDi5n8g - -# Generated by Discord.FM - chill-corner -https://youtube.com/watch?v=SfVBQ_0CsFo -https://youtube.com/watch?v=6e3QMgWuWi0 -https://youtube.com/watch?v=ezenAqbiBxY -https://youtube.com/watch?v=BJxGx2IIIwU -https://youtube.com/watch?v=Fd96lH5-RzY -https://youtube.com/watch?v=vTpZdfm7iuk -https://youtube.com/watch?v=TQxp1aP_IaE -https://youtube.com/watch?v=GfTBEZP09D8 -https://youtube.com/watch?v=phXRX1p8woY -https://youtube.com/watch?v=DeOnsIBXtz8 -https://youtube.com/watch?v=rHuUJqNsezg -https://youtube.com/watch?v=ZH8VGGvZBok -https://youtube.com/watch?v=Fptml7Dgp4E -https://youtube.com/watch?v=_GdOhROdh9c -https://youtube.com/watch?v=Pe7ZzNx-FTE -https://youtube.com/watch?v=-MrwLLxyPGc -https://youtube.com/watch?v=gUAWeM28wjQ -https://youtube.com/watch?v=nOnrDAjdr7s -https://youtube.com/watch?v=oXhYxDWgk9c -https://youtube.com/watch?v=NhFRmebmwWc -https://youtube.com/watch?v=4fC67Kjsf4k -https://youtube.com/watch?v=lRGPbaFy8hw -https://youtube.com/watch?v=mkMVyw-7avI -https://youtube.com/watch?v=O1RHkPGb31Q -https://youtube.com/watch?v=Pryb1VugJq4 -https://youtube.com/watch?v=j9FfYWp_d5w -https://youtube.com/watch?v=SM27KSKeiA4 -https://youtube.com/watch?v=-1H6usve0nY -https://youtube.com/watch?v=-HFQs_2Uy1w -https://youtube.com/watch?v=xfaHZXWV0g8 -https://youtube.com/watch?v=cOy222ay7nc -https://youtube.com/watch?v=QrC7UUcUW1s -https://youtube.com/watch?v=Q_Qst39q6jw -https://youtube.com/watch?v=PwIYdaplcv4 -https://youtube.com/watch?v=4mHW3eGF3Mw -https://youtube.com/watch?v=gx4rsZkCCss -https://youtube.com/watch?v=acHKPu4oIro -https://youtube.com/watch?v=5Y5xjtNltJA -https://youtube.com/watch?v=fn_amMJehPU -https://youtube.com/watch?v=FpQY90M-hww -https://youtube.com/watch?v=b8PPap4dJog -https://youtube.com/watch?v=9K09Ra2l0G8 -https://youtube.com/watch?v=0guABiTAbBk -https://youtube.com/watch?v=v9U0qMHHkSo -https://youtube.com/watch?v=6nc8PJvkU2E -https://youtube.com/watch?v=Obx3e7MfEaI -https://youtube.com/watch?v=BVomQtrtMTM -https://youtube.com/watch?v=71rSc6LXlSo -https://youtube.com/watch?v=EkTHpKKD7N0 -https://youtube.com/watch?v=7PClJma9Q8U -https://youtube.com/watch?v=cIzM9p3dUm8 -https://youtube.com/watch?v=Q1DvVzKXktY -https://youtube.com/watch?v=pk5tpGclppc -https://youtube.com/watch?v=jUqN1Jfw1cA -https://youtube.com/watch?v=Q2gFi6R_h-I -https://youtube.com/watch?v=H-KCI6bsN6E -https://youtube.com/watch?v=vW8Qcgo7X8A -https://youtube.com/watch?v=TsBXn4M9dJE -https://youtube.com/watch?v=ZhzN7-Q00KU -https://youtube.com/watch?v=dfBj4i8MKH4 -https://youtube.com/watch?v=jLzuObMhVAI -https://youtube.com/watch?v=7tkPp0YO4lw -https://youtube.com/watch?v=OrcVS3s5D34 -https://youtube.com/watch?v=_BJDK15HhV4 -https://youtube.com/watch?v=F-wNjIgdgXU -https://youtube.com/watch?v=z_axLG1szU8 -https://youtube.com/watch?v=BkTTWqGFywo -https://youtube.com/watch?v=TD51KO-gCtQ -https://youtube.com/watch?v=mPDLoGm6E-Q -https://youtube.com/watch?v=2WTtz0rpYAk -https://youtube.com/watch?v=LLyXx7Zmxkg -https://youtube.com/watch?v=XektDORSOQs -https://youtube.com/watch?v=zE-qxNVoUSo -https://youtube.com/watch?v=It42TsD7_sI -https://youtube.com/watch?v=gmBRRaqGYNw -https://youtube.com/watch?v=NhK8Ehv6aPI -https://youtube.com/watch?v=JtimyzJYUgc -https://youtube.com/watch?v=AMzjbyZhM5U -https://youtube.com/watch?v=qQfteZb53RM -https://youtube.com/watch?v=_UMK9RrdnnM -https://youtube.com/watch?v=Ox25h4qUgOw -https://youtube.com/watch?v=YthChN1Wq8M -https://youtube.com/watch?v=lABPt0CRO_U -https://youtube.com/watch?v=K8_xAAX92BE -https://youtube.com/watch?v=V5-AQTPFJSg -https://youtube.com/watch?v=wd3NsE5wxX0 -https://youtube.com/watch?v=m6bNfhj0_nA -https://youtube.com/watch?v=vi7wzz9kXxg -https://youtube.com/watch?v=s8yyuv3eJKM -https://youtube.com/watch?v=OqYCwK4BZK0 -https://youtube.com/watch?v=W6Hy0G0R3AQ -https://youtube.com/watch?v=in7CifqoM-M -https://youtube.com/watch?v=eH2Aibf2Fxc -https://youtube.com/watch?v=dBJvstD7khU -https://youtube.com/watch?v=IRhS4Iux50E -https://youtube.com/watch?v=s8XIgR5OGJc -https://youtube.com/watch?v=pgQF1QznOQ8 -https://youtube.com/watch?v=NY8IS0ssnXQ -https://youtube.com/watch?v=ngKBxTFplLg -https://youtube.com/watch?v=px9RtIj2tsA -https://youtube.com/watch?v=HEg7lQhRdyw -https://youtube.com/watch?v=Ut-Rk8cYaHA -https://youtube.com/watch?v=Bj6TiOJi1tI -https://youtube.com/watch?v=p_6In1gr36A -https://youtube.com/watch?v=0g2fKSkaSx4 -https://youtube.com/watch?v=8HFAARSfmrQ -https://youtube.com/watch?v=Lx2zzIkaUZQ -https://youtube.com/watch?v=Nrx6JIdMB8Y -https://youtube.com/watch?v=EHIiUS6TfXI -https://youtube.com/watch?v=94GmmzhZsko -https://youtube.com/watch?v=8nW1c_li-uw -https://youtube.com/watch?v=tB1Ge-s5bH4 -https://youtube.com/watch?v=DUK5v7itSxU -https://youtube.com/watch?v=BKkoRfaUiv0 -https://youtube.com/watch?v=vocE5gcqNDk -https://youtube.com/watch?v=qn4hQufHVsE -https://youtube.com/watch?v=4xiZRYEasvY -https://youtube.com/watch?v=LO3uqkaFRkY -https://youtube.com/watch?v=Nh0uMweFR10 -https://youtube.com/watch?v=nbbeMhDsoY8 -https://youtube.com/watch?v=FXZeZz0kPq0 -https://youtube.com/watch?v=jWEw6k6MDhM -https://youtube.com/watch?v=KEVEFgmuBFQ -https://youtube.com/watch?v=7_VR3trN82M -https://youtube.com/watch?v=_3h_n2seS1g -https://youtube.com/watch?v=NuK56z2FaK4 -https://youtube.com/watch?v=jfSc58Jk4zg -https://youtube.com/watch?v=Xda_K7abC2I -https://youtube.com/watch?v=KJdO6aFlKCU -https://youtube.com/watch?v=AL4Tc7jLuK4 -https://youtube.com/watch?v=lIhvOOT2zbQ -https://youtube.com/watch?v=zJZu54gtmNc -https://youtube.com/watch?v=rloprnff9iM -https://youtube.com/watch?v=cqkzoskWfww -https://youtube.com/watch?v=QVkGFtSTwis -https://youtube.com/watch?v=E2JQxgffxKg -https://youtube.com/watch?v=-yfI6KAPTPU -https://youtube.com/watch?v=45pBJzi_YaY -https://youtube.com/watch?v=iGZC5w_Qosc -https://youtube.com/watch?v=fcsDG_jVYbc -https://youtube.com/watch?v=TzFZTqIesYM -https://youtube.com/watch?v=v7Srbp8WPMY -https://youtube.com/watch?v=FZWHVo-t2Vo -https://youtube.com/watch?v=1hJKhiew2O0 -https://youtube.com/watch?v=9VPfprmtSF4 -https://youtube.com/watch?v=Erj8GpZFQnM -https://youtube.com/watch?v=SWMG9xA2OJQ -https://youtube.com/watch?v=9EgLB1_FXqg -https://youtube.com/watch?v=R27SK1s1FAg -https://youtube.com/watch?v=j4n7fWjmomA -https://youtube.com/watch?v=WZNHgs8QIs8 -https://youtube.com/watch?v=IufdJpZT_ak -https://youtube.com/watch?v=F7khiq25Xr0 -https://youtube.com/watch?v=ksNBf8kXpqQ -https://youtube.com/watch?v=_aIOM9_8I8U -https://youtube.com/watch?v=IRD7WylAfkw -https://youtube.com/watch?v=5LWj1MFUTrk -https://youtube.com/watch?v=uNgqPMI3jQk -https://youtube.com/watch?v=_ILsdcs__ME -https://youtube.com/watch?v=gEhNQGBlxBI -https://youtube.com/watch?v=WinkoZiOYQc -https://youtube.com/watch?v=bzXJv7gTjeg -https://youtube.com/watch?v=UVnn6ueVs9A -https://youtube.com/watch?v=3gxNW2Ulpwk -https://youtube.com/watch?v=f_DX1A7f43o -https://youtube.com/watch?v=HNuqVGGNr04 -https://youtube.com/watch?v=uLUbpz8AOoI -https://youtube.com/watch?v=D3fHXpgqGEc -https://youtube.com/watch?v=Cy8duEIHEig -https://youtube.com/watch?v=s0aMSTtI8nE -https://youtube.com/watch?v=wltiSg6O0PY -https://youtube.com/watch?v=PnfkZrbqqVs -https://youtube.com/watch?v=2ApY1nY6IYg -https://youtube.com/watch?v=cElu1JcNqfg -https://youtube.com/watch?v=O8tIRYECJbk -https://youtube.com/watch?v=MRHojNbDEUg -https://youtube.com/watch?v=6tpGC4lgpMg -https://youtube.com/watch?v=ioMq8f_UUX4 -https://youtube.com/watch?v=eD6MeGYG7Ok -https://youtube.com/watch?v=WZdH6rvhKd8 -https://youtube.com/watch?v=sNAQ6Y7VXsQ -https://youtube.com/watch?v=1adJmULQiAI -https://youtube.com/watch?v=ijlJjrk0rTk -https://youtube.com/watch?v=nLZvnaP0h9g - -# Generated by Discord.FM - country-countdown -https://youtube.com/watch?v=gju4CyAsMhI -https://youtube.com/watch?v=w9PXnACu9jo -https://youtube.com/watch?v=f2Exzqu2ocs -https://youtube.com/watch?v=TIwKZLcQM0E -https://youtube.com/watch?v=fQPS2sk1VTY -https://youtube.com/watch?v=3tthIHXUsPs -https://youtube.com/watch?v=hRjQmIqA1dY -https://youtube.com/watch?v=vvgLilGV-es -https://youtube.com/watch?v=CbxuXq_981s -https://youtube.com/watch?v=lB8Nkn3Xjes -https://youtube.com/watch?v=m3auI7AYoZA -https://youtube.com/watch?v=kc823UD0LeU -https://youtube.com/watch?v=61KfoldSxOA -https://youtube.com/watch?v=xH8R1Mt7IA8 -https://youtube.com/watch?v=a_2P4gxO7yo -https://youtube.com/watch?v=YbAE9HWha-k -https://youtube.com/watch?v=YWBZM5mztE4 -https://youtube.com/watch?v=zPIuQcr6SsQ -https://youtube.com/watch?v=r9_0u0porO8 -https://youtube.com/watch?v=A_wbMkk0gSs -https://youtube.com/watch?v=ODRWKGIxB4M -https://youtube.com/watch?v=l3zhOoDKVvs -https://youtube.com/watch?v=ckt4ScASUhg -https://youtube.com/watch?v=lrzd6R0PyoM -https://youtube.com/watch?v=3-FjESLZytk -https://youtube.com/watch?v=tLKA3CE_fsQ -https://youtube.com/watch?v=3B_UiWgbMRg -https://youtube.com/watch?v=TJJgWAqTHMU -https://youtube.com/watch?v=_yQl3C52Smw -https://youtube.com/watch?v=6OwYVg4n1Qk -https://youtube.com/watch?v=4IIgzZpuv6A -https://youtube.com/watch?v=OU87ugesC3Q -https://youtube.com/watch?v=0fpyrHJwag8 -https://youtube.com/watch?v=IX5P2v9jcQ0 -https://youtube.com/watch?v=xscn7s0PEcY -https://youtube.com/watch?v=RwPLmiwf9fM -https://youtube.com/watch?v=UL_7LMXHEyw -https://youtube.com/watch?v=gFccdvKehQI -https://youtube.com/watch?v=-tcAwyNlSjs -https://youtube.com/watch?v=oew35i9czi8 -https://youtube.com/watch?v=3R422tahouA -https://youtube.com/watch?v=PcvN28p7Fzc -https://youtube.com/watch?v=NoSD5rloyCI -https://youtube.com/watch?v=Sf6Ivae_88s -https://youtube.com/watch?v=j0bADL4UhBc -https://youtube.com/watch?v=jRAKHoKzgNg -https://youtube.com/watch?v=9eiOjNVdJmk -https://youtube.com/watch?v=otdh67EINMU -https://youtube.com/watch?v=BAMQ9QBgSdc -https://youtube.com/watch?v=IJ5jIOl957M -https://youtube.com/watch?v=ifwhV0FJiaY -https://youtube.com/watch?v=6TZvzU1MPM4 -https://youtube.com/watch?v=Fy15IulKtjw -https://youtube.com/watch?v=UIJRVG8yD1M -https://youtube.com/watch?v=1GqhBP2Pp6o -https://youtube.com/watch?v=enEZjjk77Nk -https://youtube.com/watch?v=AA8O9hvHPUo -https://youtube.com/watch?v=OHwm_TLgYJA -https://youtube.com/watch?v=JIRfMD9lvLg -https://youtube.com/watch?v=lHEZ3bQAUCU -https://youtube.com/watch?v=a633nyqWA48 -https://youtube.com/watch?v=8a3jr-Xn1GM -https://youtube.com/watch?v=8m4Uwttzuy4 -https://youtube.com/watch?v=9TL7Eo04a3A -https://youtube.com/watch?v=y3MeFrri9YI -https://youtube.com/watch?v=v5ZKmEjNnTw -https://youtube.com/watch?v=bz_bUjPMAAM -https://youtube.com/watch?v=hYkfQa3ZHM4 -https://youtube.com/watch?v=Pkb7d1gdBoM -https://youtube.com/watch?v=fyfMZSaw0i0 -https://youtube.com/watch?v=ddaKazRHyzU -https://youtube.com/watch?v=aw-PTVoblRk -https://youtube.com/watch?v=fGj77BrEgj4 -https://youtube.com/watch?v=irxgOdaykPE -https://youtube.com/watch?v=k4bBu9HD_Qo -https://youtube.com/watch?v=PwmXO0J-PAA -https://youtube.com/watch?v=Wz5_ktnCbvo -https://youtube.com/watch?v=uyGSe76rAJc -https://youtube.com/watch?v=JM07F5bYRhc -https://youtube.com/watch?v=r4byIiHc5Eg -https://youtube.com/watch?v=lECJ2bu0Kv8 -https://youtube.com/watch?v=hPn-TCxXjn0 -https://youtube.com/watch?v=Qq1nGVSRx4g -https://youtube.com/watch?v=J8YvzZsXghQ -https://youtube.com/watch?v=C1fU7KkI1Y0 -https://youtube.com/watch?v=LP5JaEJ5jHY -https://youtube.com/watch?v=DQYNM6SjD_o -https://youtube.com/watch?v=kyFD-YevcEM -https://youtube.com/watch?v=rRcSdOcUQPk -https://youtube.com/watch?v=z2uPKDXS8BA -https://youtube.com/watch?v=fbp8-Yr0gPs -https://youtube.com/watch?v=SkWOaOAd924 -https://youtube.com/watch?v=MH0lI2TSEVU -https://youtube.com/watch?v=Q8XkLrErSHw -https://youtube.com/watch?v=X09s37tJ09s -https://youtube.com/watch?v=dbAp5nphTz4 -https://youtube.com/watch?v=Pskx1w4rOEg -https://youtube.com/watch?v=Ai4kVwg1kkc -https://youtube.com/watch?v=ysqX8YKvtmU -https://youtube.com/watch?v=yhPNZKdVRh8 -https://youtube.com/watch?v=1SCOimBo5tg -https://youtube.com/watch?v=MgJ7v8D8iFE -https://youtube.com/watch?v=55EARrP_1w8 -https://youtube.com/watch?v=el9WpGaoLFw -https://youtube.com/watch?v=2t3z1jISiVc -https://youtube.com/watch?v=yi8ypj_2acE -https://youtube.com/watch?v=p4nhRyDZX90 -https://youtube.com/watch?v=FLQATzCyxfE -https://youtube.com/watch?v=FAsQ4nOJgO4 -https://youtube.com/watch?v=nujTVzx3hQU -https://youtube.com/watch?v=rReQoBp5d5c -https://youtube.com/watch?v=G_lNXzdowlU -https://youtube.com/watch?v=yOPLHA133m0 -https://youtube.com/watch?v=B1xyoRXt7K4 -https://youtube.com/watch?v=PFcboZcAzqg -https://youtube.com/watch?v=7K0akU-Rdv8 -https://youtube.com/watch?v=4zAThXFOy2c -https://youtube.com/watch?v=HP6qPkJq2hM -https://youtube.com/watch?v=H5jSwgcS7rY -https://youtube.com/watch?v=BrPK4huvorI -https://youtube.com/watch?v=jjm5p2zgQYo -https://youtube.com/watch?v=8_DqQ7CuCuQ -https://youtube.com/watch?v=tD3IVvPJUYs -https://youtube.com/watch?v=RWSaZ1ivz2M -https://youtube.com/watch?v=6ab86ynfedQ -https://youtube.com/watch?v=GwHpiBXDaj8 -https://youtube.com/watch?v=kWBNRCZlEk0 -https://youtube.com/watch?v=XOmI-7yVNNE -https://youtube.com/watch?v=m9lDtvaGQio -https://youtube.com/watch?v=eR8lqZuOCOg -https://youtube.com/watch?v=tghmK218P5E -https://youtube.com/watch?v=WSRVbSGacqs -https://youtube.com/watch?v=bozmKNFYaHQ -https://youtube.com/watch?v=OWSq240NXEY -https://youtube.com/watch?v=BlOk5wV0DRo -https://youtube.com/watch?v=DLokeU1Ck-Q -https://youtube.com/watch?v=9YyGCwvFm-U -https://youtube.com/watch?v=DRjOBvnpXVU -https://youtube.com/watch?v=Ja7PhPTG1JE -https://youtube.com/watch?v=ouWQ25O-Mcg -https://youtube.com/watch?v=_VVtOIzPg9Q -https://youtube.com/watch?v=rOuF3k_-asA -https://youtube.com/watch?v=HUAUsbbhRmc -https://youtube.com/watch?v=iYVPkqpS_Dw -https://youtube.com/watch?v=pyBNd_-F5Ts -https://youtube.com/watch?v=vwkYxPpmEPE -https://youtube.com/watch?v=FiyXZhhqWqc -https://youtube.com/watch?v=cgPRvCA5-PM -https://youtube.com/watch?v=My7bYa3podM -https://youtube.com/watch?v=awzNHuGqoMc -https://youtube.com/watch?v=zY6cMMtLCcQ -https://youtube.com/watch?v=KRw-55l_hw0 -https://youtube.com/watch?v=pxdOHJjjNek -https://youtube.com/watch?v=w2CELiObPeQ -https://youtube.com/watch?v=4Phu1jJhVT4 -https://youtube.com/watch?v=GzMJ6DvrXKE -https://youtube.com/watch?v=K8WlCqZPTeg -https://youtube.com/watch?v=Gdu8M2val_w -https://youtube.com/watch?v=8N8_CRpL6wk -https://youtube.com/watch?v=mpc3ffTLm_g -https://youtube.com/watch?v=zY9es8R4PD4 -https://youtube.com/watch?v=25AEc6dJbws -https://youtube.com/watch?v=EQY87ZICa9E -https://youtube.com/watch?v=heyIXXCfyaM -https://youtube.com/watch?v=KfDr_7LN-Ew -https://youtube.com/watch?v=GWVBRuGVlHI -https://youtube.com/watch?v=VrgCwAM06Yg -https://youtube.com/watch?v=3ealNayCkaU -https://youtube.com/watch?v=8IMn4c4MwM0 -https://youtube.com/watch?v=0uPHfQSe5rI -https://youtube.com/watch?v=QWVAJ7xqqGU -https://youtube.com/watch?v=Gz2oHRD2pF4 -https://youtube.com/watch?v=iUgQLz5y7QI -https://youtube.com/watch?v=vuha_SUwoBU -https://youtube.com/watch?v=cacL5jNJ87c -https://youtube.com/watch?v=hxcmik9Rs40 -https://youtube.com/watch?v=1FhRhzAWzLA -https://youtube.com/watch?v=wQfP1lcJ_eo -https://youtube.com/watch?v=cd1HS2Yf7Yw -https://youtube.com/watch?v=rNJwu-YkQlc -https://youtube.com/watch?v=h9YEWIpBQco -https://youtube.com/watch?v=gDWepmUXk3w -https://youtube.com/watch?v=UL0TTihpfxA -https://youtube.com/watch?v=e3lCzEOy5xs -https://youtube.com/watch?v=56m-t2PeKg8 -https://youtube.com/watch?v=k8JN4T8p8Pg -https://youtube.com/watch?v=0-yBejAuns4 -https://youtube.com/watch?v=YeLqgmVJk0Y -https://youtube.com/watch?v=l2gGXlW6wSY -https://youtube.com/watch?v=xQDbjIh3_Ts -https://youtube.com/watch?v=6LPDBZXgdA0 -https://youtube.com/watch?v=s-F0US5eKnY -https://youtube.com/watch?v=KoQrH6EMnas -https://youtube.com/watch?v=UkLp4S-x5b4 -https://youtube.com/watch?v=dV0eMaIFlvA -https://youtube.com/watch?v=6VQJHSnGIXk -https://youtube.com/watch?v=H10IyxaVwx8 -https://youtube.com/watch?v=-hVqG44A6No -https://youtube.com/watch?v=-GUWXF3LIy8 -https://youtube.com/watch?v=aRh-vBOS-dU -https://youtube.com/watch?v=dCN4QH2peJQ -https://youtube.com/watch?v=FDUOcHg5ijg -https://youtube.com/watch?v=xZjosn2u1gA -https://youtube.com/watch?v=4tjg5c7Wo4g -https://youtube.com/watch?v=TEotikBN5Bw -https://youtube.com/watch?v=-NPqM3vPDg8 -https://youtube.com/watch?v=QsRMlR0CUt8 -https://youtube.com/watch?v=_rHuitW9xDc -https://youtube.com/watch?v=eHVax41cwcM -https://youtube.com/watch?v=9n5G0qFBsHM -https://youtube.com/watch?v=hpKFRP05Po4 -https://youtube.com/watch?v=-XC3kiW6UNE -https://youtube.com/watch?v=o1C3mVUkAt8 -https://youtube.com/watch?v=31KOGb1MU4g -https://youtube.com/watch?v=wA0jkVfrhuI -https://youtube.com/watch?v=ZV1oQiRdoPc -https://youtube.com/watch?v=JXAgv665J14 -https://youtube.com/watch?v=ZhcjZjLOv38 -https://youtube.com/watch?v=3YfNFR6gh2E -https://youtube.com/watch?v=KmxaY_OVvWA -https://youtube.com/watch?v=usGv0gB2zEU -https://youtube.com/watch?v=ukick72Qafc -https://youtube.com/watch?v=T1pMmg4_FWU -https://youtube.com/watch?v=RYKnP-6cDWE -https://youtube.com/watch?v=gq2ZJ418ad8 -https://youtube.com/watch?v=I4keD5Qvya4 -https://youtube.com/watch?v=e4ujS1er1r0 -https://youtube.com/watch?v=eiBinM-f-Pk -https://youtube.com/watch?v=RM5aW83L_DE -https://youtube.com/watch?v=F7v2TmV3Zuc -https://youtube.com/watch?v=-R9GrGheMRw -https://youtube.com/watch?v=9RWm-IXjYz0 -https://youtube.com/watch?v=yHGPmbu3QNk -https://youtube.com/watch?v=DY9D01WPIN0 -https://youtube.com/watch?v=x5XvT8NMI8g -https://youtube.com/watch?v=etr7UtnUflM -https://youtube.com/watch?v=D6ablYH-rpw -https://youtube.com/watch?v=G2BWyY4B36Y -https://youtube.com/watch?v=lJIB_s_7dcw -https://youtube.com/watch?v=qebEy8p6pAY -https://youtube.com/watch?v=py5VdvxO9cE -https://youtube.com/watch?v=02J61h9eqAM -https://youtube.com/watch?v=7dtfBxUTXRY -https://youtube.com/watch?v=oiG-4-V7Xd0 -https://youtube.com/watch?v=R-onRguTLz0 -https://youtube.com/watch?v=JpZ82oU_UQc -https://youtube.com/watch?v=YNXq6Jxp3dM -https://youtube.com/watch?v=nTE4IS0NXxo -https://youtube.com/watch?v=Qt0_oPPK6eA -https://youtube.com/watch?v=ppC5bfJduhE -https://youtube.com/watch?v=7bRJLkNqNXI -https://youtube.com/watch?v=aFkcAH-m9W0 -https://youtube.com/watch?v=lALI9UXOv18 -https://youtube.com/watch?v=PMqUat-Oqsk - -# Generated by Discord.FM - rock-n-roll -https://youtube.com/watch?v=pR30knJs4Xk -https://youtube.com/watch?v=o1tj2zJ2Wvg -https://youtube.com/watch?v=nf0oXY4nDxE -https://youtube.com/watch?v=xhgE5bfcFTU -https://youtube.com/watch?v=KCy7lLQwToI -https://youtube.com/watch?v=7wRHBLwpASw -https://youtube.com/watch?v=Mke9EHMQMYI -https://youtube.com/watch?v=Qq4j1LtCdww -https://youtube.com/watch?v=hTWKbfoikeg -https://youtube.com/watch?v=BWrtrK1Q2EQ -https://youtube.com/watch?v=auLBLk4ibAk -https://youtube.com/watch?v=f3t9SfrfDZM -https://youtube.com/watch?v=ZXhuso4OTG4 -https://youtube.com/watch?v=zUwEIt9ez7M -https://youtube.com/watch?v=s4nWy8pmIM4 -https://youtube.com/watch?v=ye5BuYf8q4o -https://youtube.com/watch?v=TcJ-wNmazHQ -https://youtube.com/watch?v=qFhM1XZsh6o -https://youtube.com/watch?v=XwqMKf7r7Xg -https://youtube.com/watch?v=2X_2IdybTV0 -https://youtube.com/watch?v=MbXWrmQW-OE -https://youtube.com/watch?v=kyXz6eMCj2k -https://youtube.com/watch?v=BPwZaQfoIbU -https://youtube.com/watch?v=mAxUIjJrFKQ -https://youtube.com/watch?v=pEyBu0OiWtg -https://youtube.com/watch?v=dZEnQogAd8U -https://youtube.com/watch?v=qGaOlfmX8rQ -https://youtube.com/watch?v=TuCGiV-EVjA -https://youtube.com/watch?v=Vppbdf-qtGU -https://youtube.com/watch?v=aIM4gmho8P0 -https://youtube.com/watch?v=S7q_12tYZdA -https://youtube.com/watch?v=PdLIerfXuZ4 -https://youtube.com/watch?v=2Dq-k_jzEtI -https://youtube.com/watch?v=AQ4xwmZ6zi4 -https://youtube.com/watch?v=jACrmwTsi08 -https://youtube.com/watch?v=VZ5bS3_BCDs -https://youtube.com/watch?v=uXFxPN7Sqxo -https://youtube.com/watch?v=-jB_QM73Slk -https://youtube.com/watch?v=bJ9r8LMU9bQ -https://youtube.com/watch?v=8Zx6RXGNISk -https://youtube.com/watch?v=d8ekz_CSBVg -https://youtube.com/watch?v=ixZDTiXiHsc -https://youtube.com/watch?v=-U98qkjbYek -https://youtube.com/watch?v=okC4hw8IPYg -https://youtube.com/watch?v=QkSASi_eN_k -https://youtube.com/watch?v=A_WjRhKVftQ -https://youtube.com/watch?v=x7bIbVlIqEc -https://youtube.com/watch?v=d2GCp8vs168 -https://youtube.com/watch?v=uijnGTq4wgI -https://youtube.com/watch?v=P2LDMT7DsJ8 -https://youtube.com/watch?v=8Zf7lgMpTXA -https://youtube.com/watch?v=rKhQ2HZi8g8 -https://youtube.com/watch?v=jFi2ZM_7FnM -https://youtube.com/watch?v=yNnH1sN0dw8 -https://youtube.com/watch?v=lZiNtbgm9oM -https://youtube.com/watch?v=rDbVY3gCJgg -https://youtube.com/watch?v=acLYS3oDLEg -https://youtube.com/watch?v=sFz678yh_6U -https://youtube.com/watch?v=8-r-V0uK4u0 -https://youtube.com/watch?v=l5Zpmaz2OKE -https://youtube.com/watch?v=qHFxncb1gRY -https://youtube.com/watch?v=O7GroZ60UYc -https://youtube.com/watch?v=Dqok5m4lqeE -https://youtube.com/watch?v=GOJk0HW_hJw -https://youtube.com/watch?v=76k95Je3daw -https://youtube.com/watch?v=vpEwKz6YCEs -https://youtube.com/watch?v=5XfRjVo5wOE -https://youtube.com/watch?v=5MnDbWqe_kQ -https://youtube.com/watch?v=ZBsFntczDoM -https://youtube.com/watch?v=lrXIQQ8PeRs -https://youtube.com/watch?v=HndTMmVIKRc -https://youtube.com/watch?v=btPJPFnesV4 -https://youtube.com/watch?v=G-FpHV3xCJI -https://youtube.com/watch?v=v3H7oanysGg -https://youtube.com/watch?v=iC8oP4Z_xPw -https://youtube.com/watch?v=OjyZKfdwlng -https://youtube.com/watch?v=OuJUq58VQXQ -https://youtube.com/watch?v=fr6KVNt-1Ek -https://youtube.com/watch?v=3MutXUvS37k -https://youtube.com/watch?v=rMbATaj7Il8 -https://youtube.com/watch?v=1XHcPYorSJw -https://youtube.com/watch?v=fhxFXi4IQzE -https://youtube.com/watch?v=nEIcTstEmnQ -https://youtube.com/watch?v=Haypxj24_Uw -https://youtube.com/watch?v=KUv2zaj9mPs -https://youtube.com/watch?v=1etbYLm05W4 -https://youtube.com/watch?v=eHKqA5mkT7I -https://youtube.com/watch?v=UJor2jV_czE -https://youtube.com/watch?v=GqH21LEmfbQ -https://youtube.com/watch?v=cibZydv3XLM -https://youtube.com/watch?v=7mdIWaRi-7c -https://youtube.com/watch?v=gxEPV4kolz0 -https://youtube.com/watch?v=EErSKhC0CZs -https://youtube.com/watch?v=Red3R17FlUQ -https://youtube.com/watch?v=JsntlJZ9h1U -https://youtube.com/watch?v=cjqOsYRQI0o -https://youtube.com/watch?v=qYkbTyHXwbs -https://youtube.com/watch?v=fyHXlE9Z3m8 -https://youtube.com/watch?v=dJe1iUuAW4M -https://youtube.com/watch?v=_3rVtcm6pBE -https://youtube.com/watch?v=vFUJrg5GAvs -https://youtube.com/watch?v=LatorN4P9aA -https://youtube.com/watch?v=tNG62fULYgI -https://youtube.com/watch?v=MxGEVIvSFeY -https://youtube.com/watch?v=OMD8hBsA-RI -https://youtube.com/watch?v=2lLmYLw0WRI -https://youtube.com/watch?v=WhnZdSU2OlY -https://youtube.com/watch?v=5QkoOHvrViM -https://youtube.com/watch?v=2rxWPEdYCnI -https://youtube.com/watch?v=yK0P1Bk8Cx4 -https://youtube.com/watch?v=N4d7Wp9kKjA -https://youtube.com/watch?v=LD1BWcf8vhE -https://youtube.com/watch?v=OyQVjGdJ60g -https://youtube.com/watch?v=T3phscjgc_A -https://youtube.com/watch?v=ltrMfT4Qz5Y -https://youtube.com/watch?v=3pYNd0MSVXs -https://youtube.com/watch?v=eFTLKWw542g -https://youtube.com/watch?v=zpOULjyy-n8 -https://youtube.com/watch?v=5c1m2BAg2Sc -https://youtube.com/watch?v=XKc7z-enzmA -https://youtube.com/watch?v=SECVGN4Bsgg -https://youtube.com/watch?v=_izt7vlJKM0 -https://youtube.com/watch?v=BqDjMZKf-wg -https://youtube.com/watch?v=8ZIOkbrX_uU -https://youtube.com/watch?v=cOeKidp-iWo -https://youtube.com/watch?v=YkADj0TPrJA -https://youtube.com/watch?v=R-O3kYrDPbI -https://youtube.com/watch?v=OMOGaugKpzs -https://youtube.com/watch?v=KNIZofPB8ZM -https://youtube.com/watch?v=7v2GDbEmjGE -https://youtube.com/watch?v=aENX1Sf3fgQ -https://youtube.com/watch?v=svWINSRhQU0 -https://youtube.com/watch?v=ZfNR98ajB1U -https://youtube.com/watch?v=0Uc3ZrmhDN4 -https://youtube.com/watch?v=LTCyZvb2Uzw -https://youtube.com/watch?v=RKox6__hziY -https://youtube.com/watch?v=ZaLI1pRL11Y -https://youtube.com/watch?v=ayE6Shlv598 -https://youtube.com/watch?v=rGvR6s0yF3k -https://youtube.com/watch?v=8NsJ84YV1oA -https://youtube.com/watch?v=FTQbiNvZqaY -https://youtube.com/watch?v=MV0F_XiR48Q -https://youtube.com/watch?v=quMlRhlVR3I -https://youtube.com/watch?v=IwSTe9uit48 -https://youtube.com/watch?v=i3MXiTeH_Pg -https://youtube.com/watch?v=ij1AJRymxvA -https://youtube.com/watch?v=jxcZAHTyVCI -https://youtube.com/watch?v=62XB9IbMnxQ -https://youtube.com/watch?v=raNGeq3_DtM -https://youtube.com/watch?v=Th3ycKQV_4k -https://youtube.com/watch?v=r3g1kPGDcbc -https://youtube.com/watch?v=p5rQHoaQpTw -https://youtube.com/watch?v=buadfz2qcbY -https://youtube.com/watch?v=qqszqHKIqEk -https://youtube.com/watch?v=CdqoNKCCt7A -https://youtube.com/watch?v=t1TcDHrkQYg -https://youtube.com/watch?v=IAmgTNATJkk -https://youtube.com/watch?v=5eAQa4MOGkE -https://youtube.com/watch?v=Sx3kpa51EyY -https://youtube.com/watch?v=SRvCvsRp5ho -https://youtube.com/watch?v=lDK9QqIzhwk -https://youtube.com/watch?v=RY7S6EgSlCI -https://youtube.com/watch?v=ye-MwxuXfeo -https://youtube.com/watch?v=QGTzMvXTUiY -https://youtube.com/watch?v=fwtzUvcJIPw -https://youtube.com/watch?v=K1b8AhIsSYQ -https://youtube.com/watch?v=FgDU17xqNXo -https://youtube.com/watch?v=c1f7eZ8cHpM -https://youtube.com/watch?v=VMnjF1O4eH0 -https://youtube.com/watch?v=0CVLVaBECuc -https://youtube.com/watch?v=h04CH9YZcpI -https://youtube.com/watch?v=C11MzbEcHlw -https://youtube.com/watch?v=3QGMCSCFoKA -https://youtube.com/watch?v=YoDh_gHDvkk -https://youtube.com/watch?v=9TcztyNlFx0 -https://youtube.com/watch?v=u4xp2lgiAjY -https://youtube.com/watch?v=JSUIQgEVDM4 -https://youtube.com/watch?v=Sx3Tv0ESXOM -https://youtube.com/watch?v=rrSdXtFJG20 -https://youtube.com/watch?v=xl7Hd2r0LOs -https://youtube.com/watch?v=pJyQpAiMXkg -https://youtube.com/watch?v=rnKFtJB0ALc -https://youtube.com/watch?v=6VxoXn-0Ezs -https://youtube.com/watch?v=xF9J06CAXm8 -https://youtube.com/watch?v=eyhMgXmR3w4 -https://youtube.com/watch?v=zg21Rkew874 -https://youtube.com/watch?v=lNDe0kEKrqY -https://youtube.com/watch?v=eYEgYVyBDuM -https://youtube.com/watch?v=mjwV5w0IrcA -https://youtube.com/watch?v=deB_u-to-IE -https://youtube.com/watch?v=Ww-qVcLm97c -https://youtube.com/watch?v=RbMS0BzOMV0 -https://youtube.com/watch?v=KUwjNBjqR-c -https://youtube.com/watch?v=x2KRpRMSu4g -https://youtube.com/watch?v=zSQp7YOPdJ8 -https://youtube.com/watch?v=Eab_beh07HU -https://youtube.com/watch?v=T0spkrwl9Qk -https://youtube.com/watch?v=Al8UHnjusq0 -https://youtube.com/watch?v=DDOL7iY8kfo -https://youtube.com/watch?v=nA7ZyJqq5WI -https://youtube.com/watch?v=NsLyI1_R01M -https://youtube.com/watch?v=QQLWF_ItzYs -https://youtube.com/watch?v=ooYjf95rATg -https://youtube.com/watch?v=rgczlrYM4eI -https://youtube.com/watch?v=oOg5VxrRTi0 -https://youtube.com/watch?v=Bl4dEAtxo0M -https://youtube.com/watch?v=2OlAx4Dok38 -https://youtube.com/watch?v=OCwigPhpiXs -https://youtube.com/watch?v=2MVplfdNC6E -https://youtube.com/watch?v=pQ9pYwCKopE -https://youtube.com/watch?v=oYXqb6x50lA -https://youtube.com/watch?v=1VaEdKwXJhM -https://youtube.com/watch?v=sZLKtjATZt0 -https://youtube.com/watch?v=vyGzPmgR1QY -https://youtube.com/watch?v=i2RKWJD5ops -https://youtube.com/watch?v=rsMW3VSHAKg -https://youtube.com/watch?v=rCp2h5jslKY -https://youtube.com/watch?v=y2oKRKZnEoA -https://youtube.com/watch?v=wdCJRybAtso -https://youtube.com/watch?v=ttR9Hek6MyA -https://youtube.com/watch?v=oxKCPjcvbys -https://youtube.com/watch?v=D2qAj2XnLYo -https://youtube.com/watch?v=6Whgn_iE5uc -https://youtube.com/watch?v=aS_sAa37xag -https://youtube.com/watch?v=lrfhf1Gv4Tw -https://youtube.com/watch?v=YH5Arbm47IQ -https://youtube.com/watch?v=82cJgPXU-ik -https://youtube.com/watch?v=ZDwotNLyz10 -https://youtube.com/watch?v=XjV0z3Rf-ac -https://youtube.com/watch?v=4PvN7ujfj2w -https://youtube.com/watch?v=e5MAg_yWsq8 -https://youtube.com/watch?v=p1Y-rfbzmgY -https://youtube.com/watch?v=Oextk-If8HQ -https://youtube.com/watch?v=bjPqsDU0j2I -https://youtube.com/watch?v=OZuW6BH_Vak -https://youtube.com/watch?v=3T1c7GkzRQQ -https://youtube.com/watch?v=siMFORx8uO8 -https://youtube.com/watch?v=LFQMk6WWcoM -https://youtube.com/watch?v=SSR6ZzjDZ94 -https://youtube.com/watch?v=Dy4HA3vUv2c -https://youtube.com/watch?v=DohRa9lsx0Q -https://youtube.com/watch?v=rwYU8jq6Qw0 -https://youtube.com/watch?v=9jK-NcRmVcw -https://youtube.com/watch?v=CQ5_QxwFjNI -https://youtube.com/watch?v=wIjUY3pjN8E -https://youtube.com/watch?v=mIjZE4kcg_Q -https://youtube.com/watch?v=wyQUCYl-ocs -https://youtube.com/watch?v=FQ2yXWi0ppw -https://youtube.com/watch?v=djV11Xbc914 -https://youtube.com/watch?v=HP_NE4XZGAc -https://youtube.com/watch?v=htgr3pvBr-I -https://youtube.com/watch?v=hQo1HIcSVtg -https://youtube.com/watch?v=RVJiwyg0iDM -https://youtube.com/watch?v=hHRNSeuvzlM -https://youtube.com/watch?v=6ul-cZyuYq4 -https://youtube.com/watch?v=EvuL5jyCHOw -https://youtube.com/watch?v=0j6d7VeYvdQ -https://youtube.com/watch?v=LcMSFZZ-erw -https://youtube.com/watch?v=FsglRLoUdtc -https://youtube.com/watch?v=4dOsbsuhYGQ -https://youtube.com/watch?v=s71Em_Po2ZY -https://youtube.com/watch?v=9meo3vazXcw -https://youtube.com/watch?v=iP8_Dbvpi-A -https://youtube.com/watch?v=rj__jhmPMgI -https://youtube.com/watch?v=JE-dqW4uBEE -https://youtube.com/watch?v=jlV3zeWnWZY -https://youtube.com/watch?v=zSAJ0l4OBHM -https://youtube.com/watch?v=9C1BCAgu2I8 -https://youtube.com/watch?v=mrZRURcb1cM -https://youtube.com/watch?v=ySWVxTNUu0c -https://youtube.com/watch?v=waLhF-tFv-Q -https://youtube.com/watch?v=MNqqs4h4M7c -https://youtube.com/watch?v=OlKaVFqxERk -https://youtube.com/watch?v=-sftw5k_JRs -https://youtube.com/watch?v=ztYl3nmq3uM -https://youtube.com/watch?v=aUzBgeI5dpc -https://youtube.com/watch?v=Ygv7C3nyN0w -https://youtube.com/watch?v=fjgCqbPGq2A -https://youtube.com/watch?v=4fWyzwo1xg0 -https://youtube.com/watch?v=k_0U3DlLFSU -https://youtube.com/watch?v=Gu2pVPWGYMQ -https://youtube.com/watch?v=clJb4zx0o1o -https://youtube.com/watch?v=BOKQFTH5w5I -https://youtube.com/watch?v=46Cfrl7hMoQ -https://youtube.com/watch?v=oZdiXvDU4P0 -https://youtube.com/watch?v=SBjQ9tuuTJQ -https://youtube.com/watch?v=77R1Wp6Y_5Y -https://youtube.com/watch?v=7uy0ldI_1HA -https://youtube.com/watch?v=bNCT6pA5I9A -https://youtube.com/watch?v=RRKJiM9Njr8 -https://youtube.com/watch?v=_FrOQC-zEog -https://youtube.com/watch?v=yvPr9YV7-Xw -https://youtube.com/watch?v=hMr3KtYUCcI -https://youtube.com/watch?v=BGBM5vWiBLo -https://youtube.com/watch?v=yjoPWxmOCtc -https://youtube.com/watch?v=nDbeqj-1XOo -https://youtube.com/watch?v=DVQ3-Xe_suY -https://youtube.com/watch?v=ZiRuj2_czzw -https://youtube.com/watch?v=jQUDiCiNlqQ -https://youtube.com/watch?v=nEVDZl5UvN4 -https://youtube.com/watch?v=gDbAtWpoA6k -https://youtube.com/watch?v=K_PQ4fRQ5Kc -https://youtube.com/watch?v=La4Dcd1aUcE -https://youtube.com/watch?v=SEb8tuYhDBI -https://youtube.com/watch?v=8x2tG4X0cdc -https://youtube.com/watch?v=wV0ff1puRUg -https://youtube.com/watch?v=Z5-rdr0qhWk -https://youtube.com/watch?v=jl067ilGr54 -https://youtube.com/watch?v=X9FyQNx8oyU -https://youtube.com/watch?v=WwqHarJnQP8 -https://youtube.com/watch?v=LB5YkmjalDg -https://youtube.com/watch?v=97ECZMvbLxg -https://youtube.com/watch?v=x0q8Oho_RjM -https://youtube.com/watch?v=G9tenSy-vzo -https://youtube.com/watch?v=iPUmE-tne5U -https://youtube.com/watch?v=Hn-enjcgV1o -https://youtube.com/watch?v=bjrOcrisGyI -https://youtube.com/watch?v=IZr6AE-u2UM -https://youtube.com/watch?v=13GD78Bmo8s -https://youtube.com/watch?v=zueQ7Hz7l8s -https://youtube.com/watch?v=kLoskF32tCU - -# Generated by Discord.FM - metal-mix -https://youtube.com/watch?v=Hj2vU2nr5Jw -https://youtube.com/watch?v=gkhwK6Wlod8 -https://youtube.com/watch?v=Fq3QmtV8vT0 -https://youtube.com/watch?v=_yNAABKD4IA -https://youtube.com/watch?v=iOKV9Stri_M -https://youtube.com/watch?v=jRGrNDV2mKc -https://youtube.com/watch?v=VAWjsVoDpm0 -https://youtube.com/watch?v=3moLkjvhEu0 -https://youtube.com/watch?v=3VNUyjRRjxM -https://youtube.com/watch?v=ySdLh_B3HjA -https://youtube.com/watch?v=5i7qZxICwgQ -https://youtube.com/watch?v=gqI-6xag8Mg -https://youtube.com/watch?v=zUzd9KyIDrM -https://youtube.com/watch?v=iywaBOMvYLI -https://youtube.com/watch?v=CSvFpBOe8eY -https://youtube.com/watch?v=8nW-IPrzM1g -https://youtube.com/watch?v=6fVE8kSM43I -https://youtube.com/watch?v=EqQuihD0hoI -https://youtube.com/watch?v=BvsMPOfblfg -https://youtube.com/watch?v=uY3LAFJbKyY -https://youtube.com/watch?v=xnKhsTXoKCI -https://youtube.com/watch?v=2vObp0vBDOY -https://youtube.com/watch?v=3IHWKU9V1lA -https://youtube.com/watch?v=wJuEjAo4ues -https://youtube.com/watch?v=gy8HPSIFXEM -https://youtube.com/watch?v=liW-kWFiXtQ -https://youtube.com/watch?v=BHRyMcH6WMM -https://youtube.com/watch?v=CSJXle3LP_Q -https://youtube.com/watch?v=tczU6OWoUkI -https://youtube.com/watch?v=K5jvUXij7nU -https://youtube.com/watch?v=Evc3Xtc84N0 -https://youtube.com/watch?v=9ZGt4JVX860 -https://youtube.com/watch?v=OLqNFjLsJLk -https://youtube.com/watch?v=qw2LU1yS7aw -https://youtube.com/watch?v=emNahB_96JY -https://youtube.com/watch?v=LEb2ap6rELA -https://youtube.com/watch?v=1Qt3QbEzq7Q -https://youtube.com/watch?v=9YGL3amPmyc -https://youtube.com/watch?v=kOaqcfTZgno -https://youtube.com/watch?v=ZkW-K5RQdzo -https://youtube.com/watch?v=YIqbdnaPcT8 -https://youtube.com/watch?v=D79peD6i-rw -https://youtube.com/watch?v=01fttIlMgIg -https://youtube.com/watch?v=VDsaNnQnd7U -https://youtube.com/watch?v=IHS3qJdxefY -https://youtube.com/watch?v=86iJ-JbP9xo -https://youtube.com/watch?v=5abamRO41fE -https://youtube.com/watch?v=AGzIcLfRMcY -https://youtube.com/watch?v=1JZGFjufJEY -https://youtube.com/watch?v=Z5ou8N3U8yg -https://youtube.com/watch?v=RFc-2aNZ6VY -https://youtube.com/watch?v=pwu4v7VV5Hc -https://youtube.com/watch?v=7q2bNqe0Xyk -https://youtube.com/watch?v=A-TO-L1Escc -https://youtube.com/watch?v=b1RKaRgVFKk -https://youtube.com/watch?v=E-S9ErhqPSo -https://youtube.com/watch?v=U400PmUJWXs -https://youtube.com/watch?v=IxhtvzzfstE -https://youtube.com/watch?v=89q0LjmwXwk -https://youtube.com/watch?v=Auuqlcom6tM -https://youtube.com/watch?v=0pKlvG4XWAg -https://youtube.com/watch?v=36PSBsiSszw -https://youtube.com/watch?v=vcf7DnHi54g -https://youtube.com/watch?v=71BCqL2ecoE -https://youtube.com/watch?v=9gsAz6S_zSw -https://youtube.com/watch?v=xJzE1m9aELk -https://youtube.com/watch?v=l9VFg44H2z8 -https://youtube.com/watch?v=mk0PdLZqZqU -https://youtube.com/watch?v=heDGwljdmvM -https://youtube.com/watch?v=sXYIxJScSik -https://youtube.com/watch?v=9WjNGF9_go0 -https://youtube.com/watch?v=DelhLppPSxY -https://youtube.com/watch?v=UcGvCE0nGG4 -https://youtube.com/watch?v=x3HRaDov0Qg -https://youtube.com/watch?v=yg8VFMZ6_g8 -https://youtube.com/watch?v=aUWCrCXiVpA -https://youtube.com/watch?v=4ACe9IDkJo0 -https://youtube.com/watch?v=5c2nqRf1QOY -https://youtube.com/watch?v=bFGbVCs9Awo -https://youtube.com/watch?v=qBCMg6R2bwA -https://youtube.com/watch?v=aRL7P_D1dOo -https://youtube.com/watch?v=3Ji17cLVsUU -https://youtube.com/watch?v=xETgd1pROaA -https://youtube.com/watch?v=B66l1S0E70I -https://youtube.com/watch?v=u_VsvZmIWxY -https://youtube.com/watch?v=S9Qrvxa-n20 -https://youtube.com/watch?v=sqLdyZBjZeo -https://youtube.com/watch?v=LydRLQnXZmc -https://youtube.com/watch?v=He4YV1uqwfs -https://youtube.com/watch?v=RqD09X6KlEw -https://youtube.com/watch?v=81S2mEHkTwg -https://youtube.com/watch?v=xmOOGeZE-aE -https://youtube.com/watch?v=TkzK2jubKeA -https://youtube.com/watch?v=4Rog8XY8oxg -https://youtube.com/watch?v=ijPWBALdFcY -https://youtube.com/watch?v=qw5G6fF-wqQ -https://youtube.com/watch?v=TZnjF8c1lEY -https://youtube.com/watch?v=qRF0aAGnJOw -https://youtube.com/watch?v=71tyUqMZOSc -https://youtube.com/watch?v=MiCPrYdraL4 -https://youtube.com/watch?v=xqKwozw9Tww -https://youtube.com/watch?v=B1Bi1c9LmhU -https://youtube.com/watch?v=0Hvv6BXdQiU -https://youtube.com/watch?v=LrKMDRBQgaI -https://youtube.com/watch?v=L182WF235i4 -https://youtube.com/watch?v=I4KXMyb-aGY -https://youtube.com/watch?v=-oVW8gcse4g -https://youtube.com/watch?v=8ZmAKMtd58w -https://youtube.com/watch?v=hNmW-QA_kmU -https://youtube.com/watch?v=Yvwo8f3SXKA -https://youtube.com/watch?v=ZVinwOpllQk -https://youtube.com/watch?v=vpL2sWLwEtU -https://youtube.com/watch?v=NSPv6Fa0cyY -https://youtube.com/watch?v=lo62kvjLHvY -https://youtube.com/watch?v=BSINdbWPtss -https://youtube.com/watch?v=QrV61ATP3Ec -https://youtube.com/watch?v=bg92QpjRcJk -https://youtube.com/watch?v=9opx_afte0I -https://youtube.com/watch?v=1FCyvV5V8Jo -https://youtube.com/watch?v=GM_qKlltwt4 -https://youtube.com/watch?v=E8zlthr2-xA -https://youtube.com/watch?v=du9LCbYq9Wo -https://youtube.com/watch?v=a_7TMeDTX_U -https://youtube.com/watch?v=EjP1w3MIZsg -https://youtube.com/watch?v=_lAsCaj_nVs -https://youtube.com/watch?v=J51LPlP-s9o -https://youtube.com/watch?v=zr-j001aHE0 -https://youtube.com/watch?v=f0Hm79q4M-U -https://youtube.com/watch?v=ECQ2kVpzpLA -https://youtube.com/watch?v=I-QaFWURsMU -https://youtube.com/watch?v=bXbTtU252yM -https://youtube.com/watch?v=c8qrwON1-zE -https://youtube.com/watch?v=9sTQ0QdkN3Q -https://youtube.com/watch?v=cU4GXgaCFTI -https://youtube.com/watch?v=lRt54xjIq7w -https://youtube.com/watch?v=CGC2YvtXiRc -https://youtube.com/watch?v=3kLafYgKCTU -https://youtube.com/watch?v=am-Y0cuz0mw -https://youtube.com/watch?v=xo-1iAsqmQI -https://youtube.com/watch?v=lQ4IRzwi_Gg -https://youtube.com/watch?v=qrVKmTPFYZ8 -https://youtube.com/watch?v=ZNbaZMMCaD8 -https://youtube.com/watch?v=MmAtwvZYTe8 -https://youtube.com/watch?v=EK4Wd8mD8CA -https://youtube.com/watch?v=m0J7XnbUN5o -https://youtube.com/watch?v=EhGEGIBGLu8 -https://youtube.com/watch?v=rjCBV6o_DSE -https://youtube.com/watch?v=5hDs6mCVAKs -https://youtube.com/watch?v=u5Xe4EvTN_U -https://youtube.com/watch?v=uyj8j8Yaeeg -https://youtube.com/watch?v=NbLMrce7OJI -https://youtube.com/watch?v=9d4ui9q7eDM -https://youtube.com/watch?v=MVM8DUhdLyo -https://youtube.com/watch?v=cSOnn1gspjs -https://youtube.com/watch?v=82CTtc72s4k -https://youtube.com/watch?v=NPX5H8N1a94 -https://youtube.com/watch?v=NUDls2PgDUY -https://youtube.com/watch?v=ZPzsx3AdHpw -https://youtube.com/watch?v=sIPdH7vLmgQ -https://youtube.com/watch?v=gbw62iCsS34 -https://youtube.com/watch?v=GTN2oKj4kmM -https://youtube.com/watch?v=L397TWLwrUU -https://youtube.com/watch?v=QdGD3Ukb3Q0 -https://youtube.com/watch?v=QIFVzhWRjDM -https://youtube.com/watch?v=433S3tuuB94 -https://youtube.com/watch?v=5s7_WbiR79E -https://youtube.com/watch?v=hkXHsK4AQPs -https://youtube.com/watch?v=9MKJNZS3kGk -https://youtube.com/watch?v=6WEHRveRhU4 -https://youtube.com/watch?v=-w2m-TeLi6I -https://youtube.com/watch?v=NmIBSeFhnfc -https://youtube.com/watch?v=qUlK3S_9IOo -https://youtube.com/watch?v=iVzahm7HAJg -https://youtube.com/watch?v=C7NSUFDHFgg -https://youtube.com/watch?v=EMHLXMt-6Og -https://youtube.com/watch?v=dIs04P-B20Q -https://youtube.com/watch?v=NGTyKh_EqIc -https://youtube.com/watch?v=68SgSalvrVY -https://youtube.com/watch?v=y-LJIWMeLNY -https://youtube.com/watch?v=ThwSWIXhiRw -https://youtube.com/watch?v=3LlPC_PGgfQ -https://youtube.com/watch?v=5Hpa6MfcY8U -https://youtube.com/watch?v=YV4oYkIeGJc -https://youtube.com/watch?v=Z83TPaV_w74 -https://youtube.com/watch?v=WnAvNdVyJB0 -https://youtube.com/watch?v=5DccN_SId6A -https://youtube.com/watch?v=iVvXB-Vwnco -https://youtube.com/watch?v=757SiXkPlH4 -https://youtube.com/watch?v=d1lQ6E1a_-I -https://youtube.com/watch?v=46MALEk-7cE -https://youtube.com/watch?v=RZ_arKTDkmA -https://youtube.com/watch?v=a8BrqjFj48A -https://youtube.com/watch?v=66R8ayavwR4 -https://youtube.com/watch?v=DFdHhYha9t4 -https://youtube.com/watch?v=mS8LvHT_zcQ -https://youtube.com/watch?v=K6KSx3QO2DU -https://youtube.com/watch?v=W6CjO0H2j0s -https://youtube.com/watch?v=9P4Xcl2njCU -https://youtube.com/watch?v=IoX98MOBFHc -https://youtube.com/watch?v=1FirtNx9YR0 -https://youtube.com/watch?v=DECp8LKurKs -https://youtube.com/watch?v=DaHe4z9mA74 -https://youtube.com/watch?v=qdDOWUPzrWA -https://youtube.com/watch?v=fyRwfUw7ayg -https://youtube.com/watch?v=UwuDhK_EV5k -https://youtube.com/watch?v=2Kx1qiyK-Uo -https://youtube.com/watch?v=lSOMf8VTqnw -https://youtube.com/watch?v=oX4KTg3W3Bc -https://youtube.com/watch?v=N5irNnMNJqk -https://youtube.com/watch?v=0IxiUognQe0 -https://youtube.com/watch?v=eQcLWjHnBp0 -https://youtube.com/watch?v=pvkxxaFaT5Y -https://youtube.com/watch?v=bNY3pKJ0A-A -https://youtube.com/watch?v=VSKhPqvb0jw -https://youtube.com/watch?v=ZpbpOgUybBM -https://youtube.com/watch?v=DQ47U0sH3hY -https://youtube.com/watch?v=r-NhWrpfZQM -https://youtube.com/watch?v=CXHd-nsw6XY -https://youtube.com/watch?v=4vDjoLOAA6k -https://youtube.com/watch?v=VoAXB_Swj-Y -https://youtube.com/watch?v=V6BifoKqR-o -https://youtube.com/watch?v=qc98u-eGzlc -https://youtube.com/watch?v=vOd-T58qHLA -https://youtube.com/watch?v=2-DVhzFGXjE -https://youtube.com/watch?v=3y87bEqMUsw -https://youtube.com/watch?v=_Vq6NevcLOQ -https://youtube.com/watch?v=L0VPVawpN8E -https://youtube.com/watch?v=sOOebk_dKFo -https://youtube.com/watch?v=fNPGhxfbQxk -https://youtube.com/watch?v=1oTEQf1d9Iw -https://youtube.com/watch?v=7tNVaV96PuI -https://youtube.com/watch?v=j-qQ_brIsfY -https://youtube.com/watch?v=z-UJoY5WP5s -https://youtube.com/watch?v=tysmwGx7TNU -https://youtube.com/watch?v=3gmmi2SvMMk -https://youtube.com/watch?v=2DfYLar2QGI -https://youtube.com/watch?v=8CoGDjtBtVE -https://youtube.com/watch?v=FdBqOCS8LmM -https://youtube.com/watch?v=SMwT2V6TUSA -https://youtube.com/watch?v=HK_tNFzXmmI -https://youtube.com/watch?v=uivxr3O6rSE -https://youtube.com/watch?v=6WXBob7a9go -https://youtube.com/watch?v=FRW1mdm3CaI -https://youtube.com/watch?v=VNBWgtCTLfw -https://youtube.com/watch?v=-N0UcnswlUQ -https://youtube.com/watch?v=GVYl_hiD1oQ -https://youtube.com/watch?v=DEwk1ZEnBWE -https://youtube.com/watch?v=6NzD7zLww2A -https://youtube.com/watch?v=CW7OXRF7yGY -https://youtube.com/watch?v=fUja-wrQVgs -https://youtube.com/watch?v=mofmOWY3SKc -https://youtube.com/watch?v=fNWrgH6sVjc -https://youtube.com/watch?v=ORsGOVtRH5A -https://youtube.com/watch?v=aXzIeI0mkFI -https://youtube.com/watch?v=gx4jaqmTVRE -https://youtube.com/watch?v=NolrcYGVJ_A -https://youtube.com/watch?v=3nJrkXwAD3I -https://youtube.com/watch?v=KFFtzy1G27c -https://youtube.com/watch?v=ZDJEuZXw7ao -https://youtube.com/watch?v=qceX99lxee8 -https://youtube.com/watch?v=EC6gds4QVQE -https://youtube.com/watch?v=Z590mDXHpLk -https://youtube.com/watch?v=7RJsRQOneMY -https://youtube.com/watch?v=PL5ZyYJBU4c -https://youtube.com/watch?v=89rvBQwWUOc -https://youtube.com/watch?v=cvNaHKw9ydk -https://youtube.com/watch?v=iHKqbc_9Rc8 -https://youtube.com/watch?v=-TTaay0Z7Lw -https://youtube.com/watch?v=01uzWZsTH-M -https://youtube.com/watch?v=gA4E_2A4L3s -https://youtube.com/watch?v=BPjVLEaExTY -https://youtube.com/watch?v=iBdxN2oy8xM -https://youtube.com/watch?v=Uw1TGRj77kU -https://youtube.com/watch?v=1OK1HRqP-fg -https://youtube.com/watch?v=SeYpVif6AaI -https://youtube.com/watch?v=C-qXym0teh8 -https://youtube.com/watch?v=4YHu_DH1zfs -https://youtube.com/watch?v=BJXfe4eHDnQ -https://youtube.com/watch?v=5PyQ-e9lBdw -https://youtube.com/watch?v=XV_RZvtWNiM -https://youtube.com/watch?v=ATc8Jefnl-U -https://youtube.com/watch?v=1AfNOKQdY-U -https://youtube.com/watch?v=3ZlDZPYzfm4 -https://youtube.com/watch?v=3K_0GhyaTJc -https://youtube.com/watch?v=rWpTr-vVT-0 -https://youtube.com/watch?v=xO0scDfrcR0 -https://youtube.com/watch?v=1CcKbWhEluE -https://youtube.com/watch?v=SDDn4Kh65MA -https://youtube.com/watch?v=gRnWPnY1dgk -https://youtube.com/watch?v=8O317T6Zlno -https://youtube.com/watch?v=0L_iOnLNt9M -https://youtube.com/watch?v=f1PdUMHQAFE -https://youtube.com/watch?v=nq9j1qkj2Vc -https://youtube.com/watch?v=0K67veEPOYM -https://youtube.com/watch?v=SdJBgidYc0k -https://youtube.com/watch?v=Ax7cdHiZ010 -https://youtube.com/watch?v=Z4UfIAsnBBE -https://youtube.com/watch?v=Us2ylGAwBnk -https://youtube.com/watch?v=X-2yuGgp_U8 -https://youtube.com/watch?v=OzvasAJIHb4 - -# Generated by Discord.FM - retro-renegade -https://youtube.com/watch?v=c2orBsXp4HM -https://youtube.com/watch?v=ekawaLsryiU -https://youtube.com/watch?v=_sC6epraFkY -https://youtube.com/watch?v=Cao09dP7gM0 -https://youtube.com/watch?v=nw2qiR6f05Q -https://youtube.com/watch?v=mabK8AEGY3s -https://youtube.com/watch?v=e9f2sX3_JzM -https://youtube.com/watch?v=6hqxj-I9f8o -https://youtube.com/watch?v=LvcRvOp4Y8g -https://youtube.com/watch?v=xRkczJrr5mI -https://youtube.com/watch?v=5UUwc0llyEk -https://youtube.com/watch?v=wjKHEXsA7lg -https://youtube.com/watch?v=33dNh9H-o5c -https://youtube.com/watch?v=RF1rFSoN3JQ -https://youtube.com/watch?v=Em_B1AcfJL0 -https://youtube.com/watch?v=dnwdYWXuU4s -https://youtube.com/watch?v=YWQ0dBnl_7k -https://youtube.com/watch?v=yhviMWU_AxM -https://youtube.com/watch?v=9OquWmdUYXw -https://youtube.com/watch?v=ALq1ENqfu8E -https://youtube.com/watch?v=3bZfVORx54g -https://youtube.com/watch?v=eGynKE9eRAs -https://youtube.com/watch?v=1vBxDS0lliQ -https://youtube.com/watch?v=joNX2QJ7jto -https://youtube.com/watch?v=py_I6a9rUUI -https://youtube.com/watch?v=yRDmUeM4PQI -https://youtube.com/watch?v=TF5IETKtvGg -https://youtube.com/watch?v=kmI_VYPXub0 -https://youtube.com/watch?v=KGO0RcIDR8U -https://youtube.com/watch?v=5Unwj0PFwf4 -https://youtube.com/watch?v=izMEU4orFBU -https://youtube.com/watch?v=xPmAHhcWEvE -https://youtube.com/watch?v=ryhybXuK1r0 -https://youtube.com/watch?v=00vYncpl0pk -https://youtube.com/watch?v=hzGmbwS_Drs -https://youtube.com/watch?v=Zpu861-LpCE -https://youtube.com/watch?v=4ILeW9CMfBA -https://youtube.com/watch?v=VUTUuAoBFPk -https://youtube.com/watch?v=55mbyhqIcNo -https://youtube.com/watch?v=wkFhhnApeF4 -https://youtube.com/watch?v=1VNyQgGSXzQ -https://youtube.com/watch?v=O9WPbCmLmD4 -https://youtube.com/watch?v=C8uAc-oCtR8 -https://youtube.com/watch?v=4qsWFFuYZYI -https://youtube.com/watch?v=4Yi9fb4pyTc -https://youtube.com/watch?v=9TTnTu3ql_g -https://youtube.com/watch?v=iCNfYjZ26ow -https://youtube.com/watch?v=oSeQ1_QNf-c -https://youtube.com/watch?v=euTyRhnqFtA -https://youtube.com/watch?v=I7e-65ziIe0 -https://youtube.com/watch?v=6kHckkkJI9o -https://youtube.com/watch?v=nY3ac_FkoSw -https://youtube.com/watch?v=tU5zyCQb1Wk -https://youtube.com/watch?v=cUDuKLNB8Ec -https://youtube.com/watch?v=c92bEgiFAF4 -https://youtube.com/watch?v=9BoWlVmlQa0 -https://youtube.com/watch?v=o0vDydAHGp0 -https://youtube.com/watch?v=wuCHmGbve0c -https://youtube.com/watch?v=mgE398yDoPA -https://youtube.com/watch?v=IcYpQLyHsxc -https://youtube.com/watch?v=s7RRgF5Ve_E -https://youtube.com/watch?v=QyPR77rg1to -https://youtube.com/watch?v=OSPbX0lkTmQ -https://youtube.com/watch?v=JRU6GnETSN4 -https://youtube.com/watch?v=W1i4mTyidOc -https://youtube.com/watch?v=xflkF-sqNaM -https://youtube.com/watch?v=FKdtstAo6iU -https://youtube.com/watch?v=woPff-Tpkns -https://youtube.com/watch?v=zdeZwAk6ULE -https://youtube.com/watch?v=Zzo6L3wsf8c -https://youtube.com/watch?v=dtYwq4aBr0E -https://youtube.com/watch?v=ShK_Tj-Ee3Y -https://youtube.com/watch?v=JQ8bpWkoC7A -https://youtube.com/watch?v=VH6HIHmhvQU -https://youtube.com/watch?v=PPapt88_3aU -https://youtube.com/watch?v=XxMf4BdVq_g -https://youtube.com/watch?v=eijdNQMYikY -https://youtube.com/watch?v=Z51lfE2k7jU -https://youtube.com/watch?v=N3epEVMNJdY -https://youtube.com/watch?v=nu_ruGyTNEs -https://youtube.com/watch?v=ewxyxByJPP0 -https://youtube.com/watch?v=PLDyWLbuptQ -https://youtube.com/watch?v=qrBB3_rFPjg -https://youtube.com/watch?v=xG2AtyD3elY -https://youtube.com/watch?v=9uwEAugeH8w -https://youtube.com/watch?v=P0PpyUsvT9w -https://youtube.com/watch?v=qzQyP99Q0pE -https://youtube.com/watch?v=YZ3XjVVNagU -https://youtube.com/watch?v=gTCSQevpuOg -https://youtube.com/watch?v=tDuEWw648jo -https://youtube.com/watch?v=2TgO-tN5wAM -https://youtube.com/watch?v=YivzBeEwzWI -https://youtube.com/watch?v=hMa4hZQbrms -https://youtube.com/watch?v=yWjavxcGfqM -https://youtube.com/watch?v=tz82xbLvK_k -https://youtube.com/watch?v=mZRP7nQkfrM -https://youtube.com/watch?v=WgRfPc1lfJk -https://youtube.com/watch?v=x_P5smsopK0 -https://youtube.com/watch?v=aWBtpBwzzdM -https://youtube.com/watch?v=VM83BpH2_3U -https://youtube.com/watch?v=Qet3zBfaM78 -https://youtube.com/watch?v=G8DpAL2B9MQ -https://youtube.com/watch?v=PThRzauX8pk -https://youtube.com/watch?v=lC_RwbN8h9s -https://youtube.com/watch?v=ZSEmhhyuktU -https://youtube.com/watch?v=EnDBauPSjLI -https://youtube.com/watch?v=1DWD_hEz4HI -https://youtube.com/watch?v=7SY2zTT9tos -https://youtube.com/watch?v=8zuiIENc7lE -https://youtube.com/watch?v=Ixb08g2ND5M -https://youtube.com/watch?v=tOlsYflFiEE -https://youtube.com/watch?v=85K4BI-GsGw -https://youtube.com/watch?v=WptSlwpJ5Jk -https://youtube.com/watch?v=ukVp9AN219A -https://youtube.com/watch?v=8JHiCljnMVs -https://youtube.com/watch?v=tqLgJ9puo_c -https://youtube.com/watch?v=eW6RBQQEfQM -https://youtube.com/watch?v=Y5ZMPJyxNLI -https://youtube.com/watch?v=UbHmYTbHlmA -https://youtube.com/watch?v=UyNllqk-4iM -https://youtube.com/watch?v=7en8t8gZBlo -https://youtube.com/watch?v=YfScJUuSV68 -https://youtube.com/watch?v=ddQpf8m4ij0 -https://youtube.com/watch?v=Bl62_UMR0qI -https://youtube.com/watch?v=kEE3LDIcXxk -https://youtube.com/watch?v=0CoZG3S_JzA -https://youtube.com/watch?v=ztOR6RpWjgY -https://youtube.com/watch?v=rrMueRMVsTM -https://youtube.com/watch?v=kcPtMyOPgBw -https://youtube.com/watch?v=JHqMxtYEArY -https://youtube.com/watch?v=36Yh5PMynrg -https://youtube.com/watch?v=cAMumZKiKRQ -https://youtube.com/watch?v=Zmd2nbHP5kQ -https://youtube.com/watch?v=wPqwxBnNxWU -https://youtube.com/watch?v=Y46QKkIjZwc -https://youtube.com/watch?v=V_c2pjuxWMM -https://youtube.com/watch?v=sSjyrEtVb6U -https://youtube.com/watch?v=jy1scistRy0 -https://youtube.com/watch?v=J67nkzoJ_2M -https://youtube.com/watch?v=OFgGAVBA2NY -https://youtube.com/watch?v=C4RkHNgUcxM -https://youtube.com/watch?v=umdi-RZ8ntM -https://youtube.com/watch?v=YjQ0tFIpAn8 -https://youtube.com/watch?v=o1ZNxTyD93Q -https://youtube.com/watch?v=nY9WcDbjMmE -https://youtube.com/watch?v=I9T4S2VbDw0 -https://youtube.com/watch?v=NF2ok3ktsl4 -https://youtube.com/watch?v=jPXGELbDmqA -https://youtube.com/watch?v=ojS_e7URi10 -https://youtube.com/watch?v=NLTkBltKlrM -https://youtube.com/watch?v=eLibL3JuhrA -https://youtube.com/watch?v=UvvsZalq5QA -https://youtube.com/watch?v=knPVJ9rj5dM -https://youtube.com/watch?v=_UZwzA9qr2I -https://youtube.com/watch?v=C68qUfkJYSI -https://youtube.com/watch?v=-C_7CHq6XsQ -https://youtube.com/watch?v=rT8k9N_K0Q8 -https://youtube.com/watch?v=JtnYO3-4zMg -https://youtube.com/watch?v=oge5XXXMcys -https://youtube.com/watch?v=N2P7nkAf030 -https://youtube.com/watch?v=MIe1LMMQ5m4 -https://youtube.com/watch?v=HWbE2mz68ZE -https://youtube.com/watch?v=J5fo4XpIYNk -https://youtube.com/watch?v=A_E-QcfWwSs -https://youtube.com/watch?v=d-DKo_pDaNE -https://youtube.com/watch?v=Y_XxFAJanhE -https://youtube.com/watch?v=EcTl3TFZwFg -https://youtube.com/watch?v=Zp9bb3MB4Qc -https://youtube.com/watch?v=LCP6ZviZjb0 -https://youtube.com/watch?v=jvPIdPSmf2A -https://youtube.com/watch?v=UXD6rTBj8ek -https://youtube.com/watch?v=hewBOkOuSts -https://youtube.com/watch?v=vhDToOmsKUo -https://youtube.com/watch?v=83jGCWCcBzc -https://youtube.com/watch?v=jCFdBhby0jc -https://youtube.com/watch?v=NnVx_6Mdsj4 -https://youtube.com/watch?v=aTBSQKh8teE -https://youtube.com/watch?v=FTrumdi55tA -https://youtube.com/watch?v=ObclY0UOj3c -https://youtube.com/watch?v=A4wYdsQ8_JY -https://youtube.com/watch?v=y0zqju5Eevc -https://youtube.com/watch?v=WYZs4ExdlfA -https://youtube.com/watch?v=h848dMB0LgU -https://youtube.com/watch?v=d7hghjDM7_I -https://youtube.com/watch?v=4X6UqQDmjBk -https://youtube.com/watch?v=OJvNVDn7BgU -https://youtube.com/watch?v=TyLNQsGTby8 -https://youtube.com/watch?v=bFQmrye0jss -https://youtube.com/watch?v=25m3Gk7mRQM -https://youtube.com/watch?v=uxiaYyRkxMQ -https://youtube.com/watch?v=JfxM1QCtvb4 -https://youtube.com/watch?v=1MVAIf-leiQ -https://youtube.com/watch?v=eA36OFxe-uY -https://youtube.com/watch?v=kRTJoouX2z8 -https://youtube.com/watch?v=C0j6pe043L4 -https://youtube.com/watch?v=Tp3qiOKuEBM -https://youtube.com/watch?v=twPSaCABakA -https://youtube.com/watch?v=P1YBW-rj_jk -https://youtube.com/watch?v=96AzlkwtRmc -https://youtube.com/watch?v=kMmpRcld1FU -https://youtube.com/watch?v=kDssUvBiHFk -https://youtube.com/watch?v=xYtBAbqJO9k -https://youtube.com/watch?v=D5o_UOPNaQQ -https://youtube.com/watch?v=avyasO9uqfo -https://youtube.com/watch?v=wAPpVplHiDE -https://youtube.com/watch?v=9lyRI_M8ZXE -https://youtube.com/watch?v=lS7_tcwsj4E -https://youtube.com/watch?v=TY-mhdPdtq0 -https://youtube.com/watch?v=8ir0d7bjMIk -https://youtube.com/watch?v=eV7YovopMxw -https://youtube.com/watch?v=slKNBP7VEvI -https://youtube.com/watch?v=zLcyg4Tq5uY -https://youtube.com/watch?v=wGFpMPgSbB4 -https://youtube.com/watch?v=iPe3LT37h-Y -https://youtube.com/watch?v=TNh7wxRsOyE -https://youtube.com/watch?v=ICJezWy9m8g -https://youtube.com/watch?v=KUTHBCpiU8Y -https://youtube.com/watch?v=CIZ1FIK3-HU -https://youtube.com/watch?v=PaQxdGtSjVA -https://youtube.com/watch?v=Xu04qI3BsBA -https://youtube.com/watch?v=P5ChKb_9JoY -https://youtube.com/watch?v=TVyBV_HC8eg -https://youtube.com/watch?v=Pb6KyewC_Vg -https://youtube.com/watch?v=afwK743PL2Y -https://youtube.com/watch?v=SIPGFhFPJhg -https://youtube.com/watch?v=wqAYMZSOQao -https://youtube.com/watch?v=uv85Ai8bwfA -https://youtube.com/watch?v=DI9weHFUtuk -https://youtube.com/watch?v=nUf07IdSPFQ -https://youtube.com/watch?v=4hAz3oI-VD0 -https://youtube.com/watch?v=336OIKnPA54 -https://youtube.com/watch?v=4rJFgTNiRuQ -https://youtube.com/watch?v=Q1kf-OJdvb4 -https://youtube.com/watch?v=WdVfnKCYdJ8 -https://youtube.com/watch?v=Yr0chA6MNAI -https://youtube.com/watch?v=zKtJHPSv0pI -https://youtube.com/watch?v=VM2UJ6E5D-U -https://youtube.com/watch?v=pfshXZRcQ2c -https://youtube.com/watch?v=6DB6hBRPsWc -https://youtube.com/watch?v=RzrT1iK2B0s -https://youtube.com/watch?v=8nBgXXHvKHU -https://youtube.com/watch?v=CZMWszd5SRk -https://youtube.com/watch?v=BxYzjjs6d1s -https://youtube.com/watch?v=Jxk9DqdYsJ4 -https://youtube.com/watch?v=2AZnFWbQB_Q -https://youtube.com/watch?v=-4vpdkEkup8 -https://youtube.com/watch?v=rq_F7lGOj7I -https://youtube.com/watch?v=Fupfr_eVLPo -https://youtube.com/watch?v=z26SXn-J9NY -https://youtube.com/watch?v=RJKIrqO1Zas -https://youtube.com/watch?v=gBC5cnFjPpU -https://youtube.com/watch?v=69wxutaRWO4 -https://youtube.com/watch?v=rt_H9qkzeMQ -https://youtube.com/watch?v=CaG0lnjaYNs -https://youtube.com/watch?v=nXgAj5KdAC0 -https://youtube.com/watch?v=Qd78OMGLkVA -https://youtube.com/watch?v=2sH-l2xN3gU -https://youtube.com/watch?v=decbYrsCjOk -https://youtube.com/watch?v=B7D0GKJDU3I -https://youtube.com/watch?v=ibjNly0E_gk -https://youtube.com/watch?v=ixA3SzX6uUc -https://youtube.com/watch?v=1yfxp1NhLIs -https://youtube.com/watch?v=8Tj3-bmDnS8 -https://youtube.com/watch?v=IbFEEfNE1YQ -https://youtube.com/watch?v=9NcPvmk4vfo -https://youtube.com/watch?v=jRpPp0RCh-4 -https://youtube.com/watch?v=Zjgst_cWtrs -https://youtube.com/watch?v=2SYYM78rjYQ -https://youtube.com/watch?v=e5lcETwAItA -https://youtube.com/watch?v=VQWeJYI033Q -https://youtube.com/watch?v=Q88wKrzj3QM -https://youtube.com/watch?v=wR3gaYTqkDQ -https://youtube.com/watch?v=f4ERRGkGtpo -https://youtube.com/watch?v=z6oOVUyCi6Y -https://youtube.com/watch?v=1MR5xe1z-eU -https://youtube.com/watch?v=aDlNMawir4o -https://youtube.com/watch?v=eZq5DdR_Aq4 -https://youtube.com/watch?v=9IPBuQI1GG0 -https://youtube.com/watch?v=oBllGsz-6Os -https://youtube.com/watch?v=ghPbv7HiNzY -https://youtube.com/watch?v=ZS5oJ2-MmEU -https://youtube.com/watch?v=_-NcLHvn2I0 -https://youtube.com/watch?v=LE_Lrs8LomE -https://youtube.com/watch?v=xLsuam9o9BA -https://youtube.com/watch?v=dBgfMPLX4GA - -# Generated by Discord.FM - hip-hop -https://youtube.com/watch?v=jvEQD2pzPBY -https://youtube.com/watch?v=REaZpu0_4WQ -https://youtube.com/watch?v=Wfsm9VrVsco -https://youtube.com/watch?v=kHhOfdLpKCg -https://youtube.com/watch?v=MmUeuXNtTDY -https://youtube.com/watch?v=tBQemP6AKSg -https://youtube.com/watch?v=QU4MkRugX2E -https://youtube.com/watch?v=WgEtUuEK-to -https://youtube.com/watch?v=G0qUMwlc9wM -https://youtube.com/watch?v=2Y5J3VUC9qM -https://youtube.com/watch?v=lsJLLEwUYZM -https://youtube.com/watch?v=paaFchdXAbc -https://youtube.com/watch?v=oeMCcZfhRqk -https://youtube.com/watch?v=fBOucGAkFAw -https://youtube.com/watch?v=YLs1oVbbaEg -https://youtube.com/watch?v=KTC72QoifDQ -https://youtube.com/watch?v=kiOZHPf3hYg -https://youtube.com/watch?v=K65gJEsqegE -https://youtube.com/watch?v=zIrhcTkHX_A -https://youtube.com/watch?v=ZFqw6zxd7J8 -https://youtube.com/watch?v=I2wrBy6PAxM -https://youtube.com/watch?v=46n2V4Py0Og -https://youtube.com/watch?v=4CZR50b3A9g -https://youtube.com/watch?v=Tp8h7L8Fi0o -https://youtube.com/watch?v=qiFHp-Ik3MQ -https://youtube.com/watch?v=hLj_n0pP7MM -https://youtube.com/watch?v=yHMuIDpL6KM -https://youtube.com/watch?v=jAVMElUXLi0 -https://youtube.com/watch?v=o59U6zVVnkU -https://youtube.com/watch?v=Lv-If1xZx80 -https://youtube.com/watch?v=A9nz5UxBZNc -https://youtube.com/watch?v=C8jRc7LWxB0 -https://youtube.com/watch?v=pJMtm4PuFwg -https://youtube.com/watch?v=omowNsoplUM -https://youtube.com/watch?v=dQlU0bJjQdU -https://youtube.com/watch?v=kufiqwix0tc -https://youtube.com/watch?v=EkkpRE660Ls -https://youtube.com/watch?v=i-zF8XQView -https://youtube.com/watch?v=HdWatPF782g -https://youtube.com/watch?v=d4GBuzLaz8c -https://youtube.com/watch?v=5RoUHTB8Ivc -https://youtube.com/watch?v=drsJ50vH6ro -https://youtube.com/watch?v=wk4ftn4PArg -https://youtube.com/watch?v=G_Alt8lzKcU -https://youtube.com/watch?v=rivFCwwvoh8 -https://youtube.com/watch?v=10yrPDf92hY -https://youtube.com/watch?v=ISy0Hl0SBfg -https://youtube.com/watch?v=XbGs_qK2PQA -https://youtube.com/watch?v=X1ZwaRVlNVY -https://youtube.com/watch?v=6Un9HLDCTCs -https://youtube.com/watch?v=eJO5HU_7_1w -https://youtube.com/watch?v=jh-cryHRew4 -https://youtube.com/watch?v=ICQ7JSCBZn0 -https://youtube.com/watch?v=_xAWiV4drB4 -https://youtube.com/watch?v=fJT3b4urwcU -https://youtube.com/watch?v=F4DSyzonCZc -https://youtube.com/watch?v=yQ84j8HuojY -https://youtube.com/watch?v=SvqoKFI7tfw -https://youtube.com/watch?v=sC2n3oOPOH4 -https://youtube.com/watch?v=i_gg9ttaaxI -https://youtube.com/watch?v=0b_9VQcnQZY -https://youtube.com/watch?v=JNrD-_VH0qM -https://youtube.com/watch?v=aeSA2kh9fhg -https://youtube.com/watch?v=ytQ5CYE1VZw -https://youtube.com/watch?v=r0_AmbzMedE -https://youtube.com/watch?v=Tz6OUIjtM6E -https://youtube.com/watch?v=ZEBGCOCxLgA -https://youtube.com/watch?v=jCDSZr2zzws -https://youtube.com/watch?v=-c3X91Ld-GU -https://youtube.com/watch?v=xRRen4nuVkg -https://youtube.com/watch?v=NnkLcBY8o1I -https://youtube.com/watch?v=PFVvgETFoUk -https://youtube.com/watch?v=fzSQG472L9k -https://youtube.com/watch?v=oUvQvP0FyJU -https://youtube.com/watch?v=4UXpe2n9TtM -https://youtube.com/watch?v=M2NIMHVmGwk -https://youtube.com/watch?v=pDlbsFmMB3E -https://youtube.com/watch?v=e6zqnVo4ArQ -https://youtube.com/watch?v=8mtA9GvpzwU -https://youtube.com/watch?v=8p9jSRxguAA -https://youtube.com/watch?v=UvVuEEPM3j0 -https://youtube.com/watch?v=mzGwHKIYo9c -https://youtube.com/watch?v=AfuCLp8VEng -https://youtube.com/watch?v=OG4ROzg78Bo -https://youtube.com/watch?v=xDDnSWdZJqM -https://youtube.com/watch?v=zpNrrdLo4Wk -https://youtube.com/watch?v=YbnhUVTTdHE -https://youtube.com/watch?v=6sRQ9q4hzv4 -https://youtube.com/watch?v=AlgvnoigyLE -https://youtube.com/watch?v=ZtdRdbjgPBc -https://youtube.com/watch?v=ExVtrghW5Y4 -https://youtube.com/watch?v=PobrSpMwKk4 -https://youtube.com/watch?v=pJJyKlRxyvA -https://youtube.com/watch?v=odBpBp3j1tI -https://youtube.com/watch?v=XbZR9JhGJ0Q -https://youtube.com/watch?v=QkZurfE8Gbc -https://youtube.com/watch?v=6MS-JqECvf4 -https://youtube.com/watch?v=8uC35poq1Zs -https://youtube.com/watch?v=1AZsIIX4k1c -https://youtube.com/watch?v=rT4wUByldo4 -https://youtube.com/watch?v=ERnVdMkIJtc -https://youtube.com/watch?v=oCd6SQ67k-Y -https://youtube.com/watch?v=XSbZidsgMfw -https://youtube.com/watch?v=TErySTMbFlk -https://youtube.com/watch?v=lj3eZQigvsI -https://youtube.com/watch?v=NtxmnBQmfZs -https://youtube.com/watch?v=yRfQGXFRr30 -https://youtube.com/watch?v=AGbMQ2efZPU -https://youtube.com/watch?v=h9_31bUYHvA -https://youtube.com/watch?v=czBPOwSZVys -https://youtube.com/watch?v=BQFrezbeL10 -https://youtube.com/watch?v=OwSpn4pmv9Q -https://youtube.com/watch?v=DnedDvXYr8A -https://youtube.com/watch?v=BLR_wRa0hXo -https://youtube.com/watch?v=JnNzq5Nl-dE -https://youtube.com/watch?v=VOL0-EE3ieY -https://youtube.com/watch?v=mOmsU91AxVg -https://youtube.com/watch?v=HkytRz29bE0 -https://youtube.com/watch?v=pcGGfojS58U -https://youtube.com/watch?v=q0rYiIiJusQ -https://youtube.com/watch?v=8uUk691o8BI -https://youtube.com/watch?v=L_Rn7UvP0yo -https://youtube.com/watch?v=B6-wjxeaTOY -https://youtube.com/watch?v=oihGlmD1r24 -https://youtube.com/watch?v=3jkb1dN3Ot8 -https://youtube.com/watch?v=MLedibUShaY -https://youtube.com/watch?v=Et_E4M4JgIU -https://youtube.com/watch?v=acdtvO-yHqQ -https://youtube.com/watch?v=jRn9BRo4Igw -https://youtube.com/watch?v=CxnaPa8ohmM -https://youtube.com/watch?v=LQrJHsWN7hc -https://youtube.com/watch?v=VRa_PwL2aws -https://youtube.com/watch?v=nYQPcD8MOoc -https://youtube.com/watch?v=0twahcMCgss -https://youtube.com/watch?v=cixIP4uv270 -https://youtube.com/watch?v=PqX1SkYpNJQ -https://youtube.com/watch?v=zOXaouay5Jk -https://youtube.com/watch?v=89F5fpvwPr0 -https://youtube.com/watch?v=ydWjQwvzxKw -https://youtube.com/watch?v=byODfQUUsEI -https://youtube.com/watch?v=monkG1OWZXA -https://youtube.com/watch?v=fV80H9rScSQ -https://youtube.com/watch?v=Lk1POuNuCnI -https://youtube.com/watch?v=b0g4BDl8ZiE -https://youtube.com/watch?v=rCpoMFbDAdM -https://youtube.com/watch?v=vtgZsq_oUvw -https://youtube.com/watch?v=P2rT2vw9i_k -https://youtube.com/watch?v=bQXj4ZtuwuI -https://youtube.com/watch?v=E4jkMB3OV_g -https://youtube.com/watch?v=-9r7ezjl1us -https://youtube.com/watch?v=K533gW3boIY -https://youtube.com/watch?v=pKh_ZHexNZQ -https://youtube.com/watch?v=ijy2GFWqeAs -https://youtube.com/watch?v=A2B5clYLtOc -https://youtube.com/watch?v=q0tnCdJQwTE -https://youtube.com/watch?v=imgYGfH2yNM -https://youtube.com/watch?v=lTpaBK5HYz4 -https://youtube.com/watch?v=9Zw2qMXqvxU -https://youtube.com/watch?v=SXEo-Z6JFVU -https://youtube.com/watch?v=B51pw1teuSg -https://youtube.com/watch?v=NK2FqPNIT_U -https://youtube.com/watch?v=fyfOvJ6ByIY -https://youtube.com/watch?v=QJQtXeUEH6s -https://youtube.com/watch?v=PGpgdQc4e0c -https://youtube.com/watch?v=qggxTtnKTMo -https://youtube.com/watch?v=yf9OAFML_Eg -https://youtube.com/watch?v=s9_HY6uZwVc -https://youtube.com/watch?v=LQLD3S8nhvs -https://youtube.com/watch?v=_srvHOu75vM -https://youtube.com/watch?v=FCbWLSZrZfw -https://youtube.com/watch?v=stoLqWXsIOY -https://youtube.com/watch?v=jId1L0gmoDY -https://youtube.com/watch?v=zVnlyC0ytgY -https://youtube.com/watch?v=aES4SbFTH2Y -https://youtube.com/watch?v=YPCwL__3Lss -https://youtube.com/watch?v=_KMywQHeDWI -https://youtube.com/watch?v=CtRbEgoTqQs -https://youtube.com/watch?v=igUsHrFqegE -https://youtube.com/watch?v=RMizZU12awo -https://youtube.com/watch?v=1ewkF_Al52o -https://youtube.com/watch?v=9rKmdRdNO7s -https://youtube.com/watch?v=8CPlF-IEkXQ -https://youtube.com/watch?v=cKutTL_KLig -https://youtube.com/watch?v=qjeAx2rSPy8 -https://youtube.com/watch?v=SW9H1b7zXUY -https://youtube.com/watch?v=J7IMwop3RHs -https://youtube.com/watch?v=sy7JwllhUR8 -https://youtube.com/watch?v=DWuBTLJdoJY -https://youtube.com/watch?v=-cDEQKl2EWM -https://youtube.com/watch?v=rZJXpZPFQaI -https://youtube.com/watch?v=nmte57oKe6U -https://youtube.com/watch?v=w_nGIhgggiM -https://youtube.com/watch?v=GwTmJ9KptfI -https://youtube.com/watch?v=OG6OWMsc4z0 -https://youtube.com/watch?v=gc2NgotkfWE -https://youtube.com/watch?v=JEHc4u-1QIk -https://youtube.com/watch?v=WUH9NaZI9eA -https://youtube.com/watch?v=wRZ6QyjGIEM -https://youtube.com/watch?v=pwHuEDCM7xs -https://youtube.com/watch?v=3mpAJjXSVUE -https://youtube.com/watch?v=F-4KiszXxHM -https://youtube.com/watch?v=T6QKqFPRZSA -https://youtube.com/watch?v=pR0VsbyZxWg -https://youtube.com/watch?v=CQkVPtWjfUk -https://youtube.com/watch?v=1plPyJdXKIY -https://youtube.com/watch?v=zQrdKtPJxI0 -https://youtube.com/watch?v=cg0XOi8AxJo -https://youtube.com/watch?v=gG_dA32oH44 -https://youtube.com/watch?v=nFF66bVgqvw -https://youtube.com/watch?v=67sDhNyuzLU -https://youtube.com/watch?v=hRK7PVJFbS8 -https://youtube.com/watch?v=i-YykLXxTzk -https://youtube.com/watch?v=m_ZDBLjicDw -https://youtube.com/watch?v=7LnEeRidcXw -https://youtube.com/watch?v=0eiJsI4kVJs -https://youtube.com/watch?v=A66LmUwXnGA -https://youtube.com/watch?v=E5s6jcuw6NM -https://youtube.com/watch?v=6jd0VICL4og -https://youtube.com/watch?v=uNTpPNo3LBg -https://youtube.com/watch?v=rKWjsa3fwpE -https://youtube.com/watch?v=_L2vJEb6lVE -https://youtube.com/watch?v=2lzD5NTs3l0 -https://youtube.com/watch?v=tNRAuzj2ImA -https://youtube.com/watch?v=SiYDJ432b0U -https://youtube.com/watch?v=9-kWlUbkHS4 -https://youtube.com/watch?v=AE0GC4tGZW0 -https://youtube.com/watch?v=Rv6bRHM8YMc -https://youtube.com/watch?v=oyveOd7jOx4 -https://youtube.com/watch?v=n1CLmap_CVU -https://youtube.com/watch?v=HDSksIctszk -https://youtube.com/watch?v=uPqnrQfm8oU -https://youtube.com/watch?v=TMZi25Pq3T8 -https://youtube.com/watch?v=PMbELEUfmIA -https://youtube.com/watch?v=t8gdslsaCkM -https://youtube.com/watch?v=duU1wKYexs4 -https://youtube.com/watch?v=lVehcuJXe6I -https://youtube.com/watch?v=WUN04IC9L3Y -https://youtube.com/watch?v=Be8nu4w-NS0 -https://youtube.com/watch?v=5souw4K5UQc -https://youtube.com/watch?v=QMdeUooDwzs -https://youtube.com/watch?v=wZYt2GTH5cs -https://youtube.com/watch?v=kWXAYDQ_K7k -https://youtube.com/watch?v=7l48bfQuJeE -https://youtube.com/watch?v=PlBTqsWJyas -https://youtube.com/watch?v=XsZDWNk_RIA -https://youtube.com/watch?v=kqjeNSNuNPM -https://youtube.com/watch?v=LsfoI96_rSo -https://youtube.com/watch?v=Gwfm9wuIj40 -https://youtube.com/watch?v=QsLAm_nrSyY -https://youtube.com/watch?v=p1h9PBQSCDY -https://youtube.com/watch?v=-4zXv6ys2t4 -https://youtube.com/watch?v=AmSvsQn2CP8 -https://youtube.com/watch?v=0_xZt5rt4u0 -https://youtube.com/watch?v=Y-PRLKaFU-M -https://youtube.com/watch?v=5aDpLYTcfVc -https://youtube.com/watch?v=oWNCXxBlZCw -https://youtube.com/watch?v=1dLTKcGx76w -https://youtube.com/watch?v=RnDwKSAp-Qs -https://youtube.com/watch?v=3LRmrpUV6iQ -https://youtube.com/watch?v=JiqNwliG0jo -https://youtube.com/watch?v=60l9vZf65AI -https://youtube.com/watch?v=ltGltaUs_S4 -https://youtube.com/watch?v=rz-_mstXfr0 -https://youtube.com/watch?v=gNPIOi2LiQk -https://youtube.com/watch?v=-59jGD4WrmE - -# Generated by Discord.FM - coffee-house-jazz -https://youtube.com/watch?v=vmDDOFXSgAs -https://youtube.com/watch?v=RPfFhfSuUZ4 -https://youtube.com/watch?v=ZrfzenYhv9w -https://youtube.com/watch?v=CWeXOm49kE0 -https://youtube.com/watch?v=qWG2dsXV5HI -https://youtube.com/watch?v=T5jFPrx51Dc -https://youtube.com/watch?v=WqEweV0eScg -https://youtube.com/watch?v=TDETNk20Vkc -https://youtube.com/watch?v=xISaCzXYYg8 -https://youtube.com/watch?v=N76ErzOdk9g -https://youtube.com/watch?v=Cx-TxiBi43c -https://youtube.com/watch?v=KV8Hj_E8LJc -https://youtube.com/watch?v=HmroWIcCNUI -https://youtube.com/watch?v=ujChUYkPvec -https://youtube.com/watch?v=h6NCx0wcrC4 -https://youtube.com/watch?v=xlAwFV0clcM -https://youtube.com/watch?v=I777BcgQL9o -https://youtube.com/watch?v=yXK0pZx92MU -https://youtube.com/watch?v=jUN01HYwRX4 -https://youtube.com/watch?v=KsAf0ra6Vd4 -https://youtube.com/watch?v=JIfdYs8WErM -https://youtube.com/watch?v=CTzRHq_cH5E -https://youtube.com/watch?v=mP0flneNfaQ -https://youtube.com/watch?v=6tBJa8Ew6fQ -https://youtube.com/watch?v=u23Etcb-L9M -https://youtube.com/watch?v=YjRbmtrDJI4 -https://youtube.com/watch?v=0rjP5MPA3qs -https://youtube.com/watch?v=fvJzCdgB3Tc -https://youtube.com/watch?v=1OKduoWWWsE -https://youtube.com/watch?v=36wafFjFdYs -https://youtube.com/watch?v=M69YdmAJoLs -https://youtube.com/watch?v=YmtHdBPzi_w -https://youtube.com/watch?v=FGT67EzVcfs -https://youtube.com/watch?v=qlIbs0mZYSA -https://youtube.com/watch?v=AL5G6QnW-ek -https://youtube.com/watch?v=J4X5folutT8 -https://youtube.com/watch?v=RJEjFh2FOzA -https://youtube.com/watch?v=2vOWMz1z7rk -https://youtube.com/watch?v=9b2AOlCGpKY -https://youtube.com/watch?v=p0PlMNt02Ck -https://youtube.com/watch?v=3rSNqhEWH9M -https://youtube.com/watch?v=iqhN6rvfJt4 -https://youtube.com/watch?v=a1WDW-swiAA -https://youtube.com/watch?v=8TdY6iqV2k0 -https://youtube.com/watch?v=IrVnm66joQk -https://youtube.com/watch?v=fvRkGglLe-U -https://youtube.com/watch?v=UA2XIWZxMKM -https://youtube.com/watch?v=s4rXEKtC8iY -https://youtube.com/watch?v=EMuyV5jSKl4 -https://youtube.com/watch?v=CsHtO_i4qzM -https://youtube.com/watch?v=5m2HN2y0yV8 -https://youtube.com/watch?v=p0AGYvMFdNo -https://youtube.com/watch?v=6WjW5orDM2c -https://youtube.com/watch?v=YjRWditGKRY -https://youtube.com/watch?v=jsFST-7Hx-Y -https://youtube.com/watch?v=eNWDwOsQqlw -https://youtube.com/watch?v=FB2P1oaP-gk -https://youtube.com/watch?v=W985hWD5KYg -https://youtube.com/watch?v=0Q7J4PgrRsY -https://youtube.com/watch?v=dH3GSrCmzC8 -https://youtube.com/watch?v=kOO8Gzr__zc -https://youtube.com/watch?v=q1z2BdvHVCk -https://youtube.com/watch?v=wylto0E63Q8 -https://youtube.com/watch?v=_3vpiTgG59A -https://youtube.com/watch?v=K_h1geOaLvY -https://youtube.com/watch?v=rsz6TE6t7-A -https://youtube.com/watch?v=KAlVasHbipo -https://youtube.com/watch?v=2FaMtXw2mRE -https://youtube.com/watch?v=Bm1NxfevGro -https://youtube.com/watch?v=w3TMe98FJDw -https://youtube.com/watch?v=II_LtoZGSVg -https://youtube.com/watch?v=or5qBh8Xbpc -https://youtube.com/watch?v=wA1ZelIbUfI -https://youtube.com/watch?v=Ae0nwSv6cTU -https://youtube.com/watch?v=lBbGRxSiYBs -https://youtube.com/watch?v=f60JYoHdfVM -https://youtube.com/watch?v=Lo18F5ObPng -https://youtube.com/watch?v=qagOblqhBhk -https://youtube.com/watch?v=JMiLAxMnoqE -https://youtube.com/watch?v=tNR7822K_40 -https://youtube.com/watch?v=CkyTS_-Pqqw -https://youtube.com/watch?v=0yQyjcpnx3g -https://youtube.com/watch?v=x8UcxgE21kM -https://youtube.com/watch?v=tu4o65SwUIw -https://youtube.com/watch?v=hbreWwFKQNg -https://youtube.com/watch?v=hLUyVyM626A -https://youtube.com/watch?v=zre0u5XyNfY -https://youtube.com/watch?v=k0FJ1SdS-ts -https://youtube.com/watch?v=fKb0Sc2lYVU -https://youtube.com/watch?v=x8cFdZyWOOs -https://youtube.com/watch?v=BO_Lfk-8P5c -https://youtube.com/watch?v=ADPgTmca6Zs -https://youtube.com/watch?v=hkyJQcmVtZQ -https://youtube.com/watch?v=BqLDTKun4so -https://youtube.com/watch?v=Oi4G6UmYK9U -https://youtube.com/watch?v=3XvJFW0DHbU -https://youtube.com/watch?v=O6oA9MBb1-Q -https://youtube.com/watch?v=dqn3PF_DcSg -https://youtube.com/watch?v=C-o8EeITzYM -https://youtube.com/watch?v=SRFhsMvWKmM -https://youtube.com/watch?v=xSaPCoTZr-8 -https://youtube.com/watch?v=8CsKnTUbth0 -https://youtube.com/watch?v=1z88Vc1oyvU -https://youtube.com/watch?v=lLkFCavQGrc -https://youtube.com/watch?v=BQYXn1DP38s -https://youtube.com/watch?v=ZbHJHPTikQA -https://youtube.com/watch?v=BhqQFs7huwU -https://youtube.com/watch?v=-mZ54FJ6h-k -https://youtube.com/watch?v=83Cn2UU79F8 -https://youtube.com/watch?v=iqtmUC6L9fc -https://youtube.com/watch?v=qiy9dCCnG10 -https://youtube.com/watch?v=_Ago8dP4fFA -https://youtube.com/watch?v=St6bhwx7WDo -https://youtube.com/watch?v=ba7vMzLbU7w -https://youtube.com/watch?v=yjj9Dgd6vRU -https://youtube.com/watch?v=D-CNZxoethA -https://youtube.com/watch?v=hwmRQ0PBtXU -https://youtube.com/watch?v=S4mRaEzwTYo -https://youtube.com/watch?v=xCqRYneOdIM -https://youtube.com/watch?v=ryNtmkfeJk4 -https://youtube.com/watch?v=M7HYVow1kHQ -https://youtube.com/watch?v=0CmftpbG4ig -https://youtube.com/watch?v=8zFgtqK39Zg -https://youtube.com/watch?v=7UAWVM5aMUw -https://youtube.com/watch?v=8696ckI64Vs -https://youtube.com/watch?v=AGB_fNG0R94 -https://youtube.com/watch?v=DldxgV41SYM -https://youtube.com/watch?v=xOeDdS7Ic1Q -https://youtube.com/watch?v=rLwZ0QnwUBg -https://youtube.com/watch?v=CAeO7nicvns -https://youtube.com/watch?v=0dGFeIcGb_4 -https://youtube.com/watch?v=6_YG9XBX04Y -https://youtube.com/watch?v=1MCGweQ8Oso -https://youtube.com/watch?v=YI5fU6ZbyaA -https://youtube.com/watch?v=g3JyQnYPkZk -https://youtube.com/watch?v=PoPL7BExSQU -https://youtube.com/watch?v=CEmq2V1IMkk -https://youtube.com/watch?v=zpzOFpPum6w -https://youtube.com/watch?v=59aXJ8GvMYE -https://youtube.com/watch?v=oslMFOeFoLI -https://youtube.com/watch?v=XpueyrkcMyQ -https://youtube.com/watch?v=eUSYlOTP2_k -https://youtube.com/watch?v=DAsUNTHRjaM -https://youtube.com/watch?v=5eSzsJKn8FM -https://youtube.com/watch?v=CpaBpm3_R-8 -https://youtube.com/watch?v=c8teZAt66jo -https://youtube.com/watch?v=HLzqjmoZZAc -https://youtube.com/watch?v=X9qgI95n6rM -https://youtube.com/watch?v=gzU0PLa9-9I -https://youtube.com/watch?v=lcKQ3wGI8ZQ -https://youtube.com/watch?v=gg1Wl-NmzWg -https://youtube.com/watch?v=7myLXPUBB_w -https://youtube.com/watch?v=qDQpZT3GhDg -https://youtube.com/watch?v=uRIaFOKYN0k -https://youtube.com/watch?v=kqwdRBWvPs0 -https://youtube.com/watch?v=3kOWGBDJALY -https://youtube.com/watch?v=sOES7AZ-d60 -https://youtube.com/watch?v=Z9IFiHiSq88 -https://youtube.com/watch?v=P__YyaRlym8 -https://youtube.com/watch?v=jSxY4OwV8vg -https://youtube.com/watch?v=cIrE6sZduWo -https://youtube.com/watch?v=-vl4_f8Emtw -https://youtube.com/watch?v=0HUEiUOCLeI -https://youtube.com/watch?v=73g2Vw_gpkQ -https://youtube.com/watch?v=pCpekvOkwNM -https://youtube.com/watch?v=b80myMYmboY -https://youtube.com/watch?v=8B1oIXGX0Io -https://youtube.com/watch?v=fpDa0kaV6hQ -https://youtube.com/watch?v=6sfe_8RAaJ0 -https://youtube.com/watch?v=rG9myp90oM4 -https://youtube.com/watch?v=DlAEdcMy_0A -https://youtube.com/watch?v=IxlL8l48qcM -https://youtube.com/watch?v=xKGeUPRjNZ8 -https://youtube.com/watch?v=Tnygv7J6VNg -https://youtube.com/watch?v=Gsz3mrnIBd0 -https://youtube.com/watch?v=khby51sf82s -https://youtube.com/watch?v=0izjSUqCcSQ -https://youtube.com/watch?v=RckKPzpU1eo -https://youtube.com/watch?v=OkbwGv3QKQc -https://youtube.com/watch?v=Z_1LfT1MvzI -https://youtube.com/watch?v=tpILJTxT1_s -https://youtube.com/watch?v=JXwMgIlmoaM -https://youtube.com/watch?v=IQaM-SqDqSY -https://youtube.com/watch?v=fBQxsQlPDkU -https://youtube.com/watch?v=llPQnwDAIVU -https://youtube.com/watch?v=iRdlvzIEz-g -https://youtube.com/watch?v=RABTXslPaS8 -https://youtube.com/watch?v=dvdQYSWOobc -https://youtube.com/watch?v=MV5apkGSkfM -https://youtube.com/watch?v=x6zypc_LhnM -https://youtube.com/watch?v=XX6TpqRmeJ0 -https://youtube.com/watch?v=qeJ9NEyxk8I -https://youtube.com/watch?v=Jv5j_Lx2R4g -https://youtube.com/watch?v=yIlpEnsa2d8 -https://youtube.com/watch?v=WMW3RloxEyA -https://youtube.com/watch?v=PygdDdJ0IRY -https://youtube.com/watch?v=FhZ-yTIXXYI -https://youtube.com/watch?v=s0igE09HI1U -https://youtube.com/watch?v=iB2Z2DY17yQ -https://youtube.com/watch?v=oLaIrVB1av4 -https://youtube.com/watch?v=KcoqwKEtYDs -https://youtube.com/watch?v=rjU0Gryw8LY -https://youtube.com/watch?v=x5gAl119keA -https://youtube.com/watch?v=zNcPnEc99UE -https://youtube.com/watch?v=O6pSffe4k60 -https://youtube.com/watch?v=KX_iUXGk0js -https://youtube.com/watch?v=uKpK8RbGlO4 -https://youtube.com/watch?v=5M7LdviC2IQ -https://youtube.com/watch?v=lN1iQQS5E_A -https://youtube.com/watch?v=8fY5oRxwCoM -https://youtube.com/watch?v=a6KDpB6skA4 -https://youtube.com/watch?v=jmwjpHJHolM -https://youtube.com/watch?v=_li7u9X3F3c -https://youtube.com/watch?v=KDrxzKYdwsA -https://youtube.com/watch?v=d3qSLlk8ruE -https://youtube.com/watch?v=GslhRUBgXNI -https://youtube.com/watch?v=gCbdDLa8Z-0 -https://youtube.com/watch?v=9pUKEqpHGA8 -https://youtube.com/watch?v=sztK_qd1Pjc -https://youtube.com/watch?v=j0Jb72PZAls -https://youtube.com/watch?v=KfFBdViZHzk -https://youtube.com/watch?v=CqybaIesbuA -https://youtube.com/watch?v=AKTwwGh8gMo -https://youtube.com/watch?v=FKsfvx5h_jg -https://youtube.com/watch?v=d5SBYhZyo1s -https://youtube.com/watch?v=KntkqJAoHFk -https://youtube.com/watch?v=z2_WYOLnrzQ -https://youtube.com/watch?v=ih0c1UeFC_4 -https://youtube.com/watch?v=LDnJPW-PYgA -https://youtube.com/watch?v=GvkS0P2a2-U -https://youtube.com/watch?v=xDW4AuHl-kM -https://youtube.com/watch?v=n_aVFVveJNs -https://youtube.com/watch?v=sYiM-sOC6nE -https://youtube.com/watch?v=xPpEOUVpxrM -https://youtube.com/watch?v=_Gs3fg_WsEg -https://youtube.com/watch?v=baflobFjTwk -https://youtube.com/watch?v=N3TGcG9k2aA -https://youtube.com/watch?v=q7MH68ayDXY -https://youtube.com/watch?v=pZQI1jgOC_g -https://youtube.com/watch?v=YZNx5S5zuqs -https://youtube.com/watch?v=Y4UZROmf3GQ -https://youtube.com/watch?v=7-RlcOPNb6A -https://youtube.com/watch?v=KUBw0B6RdBQ -https://youtube.com/watch?v=UuhYZrn4flo -https://youtube.com/watch?v=xvIaD14LsAs -https://youtube.com/watch?v=wNLKkYEzbb0 -https://youtube.com/watch?v=ZBiA8XvkLoo -https://youtube.com/watch?v=UyyNbsNKWcQ -https://youtube.com/watch?v=sR13ECD71xU -https://youtube.com/watch?v=3ZyHNyVgaqA -https://youtube.com/watch?v=KGBXVsdY9hw -https://youtube.com/watch?v=SkrKBmnZtB0 -https://youtube.com/watch?v=LA-CBTXvHHY -https://youtube.com/watch?v=ylXk1LBvIqU -https://youtube.com/watch?v=aOwYA_vEZYo -https://youtube.com/watch?v=4bjPlBC4h_8 -https://youtube.com/watch?v=KU70hNzHZRY -https://youtube.com/watch?v=n2wr9FR-m70 -https://youtube.com/watch?v=XPACdaj3t0Q -https://youtube.com/watch?v=_wcbUAFirUE -https://youtube.com/watch?v=48eAYnfgrAo -https://youtube.com/watch?v=yzsWc5mYWGI -https://youtube.com/watch?v=icuMgDWZw2A -https://youtube.com/watch?v=jNnplwRbS8U -https://youtube.com/watch?v=tr72UkaBdtk -https://youtube.com/watch?v=nf0_s-Ijl3A -https://youtube.com/watch?v=_O-wMuGt63c -https://youtube.com/watch?v=cb2w2m1JmCY -https://youtube.com/watch?v=_xuowwzjmTI -https://youtube.com/watch?v=8-jfsUusSDQ -https://youtube.com/watch?v=GW2pFhSo8Cg -https://youtube.com/watch?v=jTuBTsyXbc4 -https://youtube.com/watch?v=53645-blv5o -https://youtube.com/watch?v=eMBZHUhBAYU -https://youtube.com/watch?v=fvgf0yPAqGI -https://youtube.com/watch?v=7sgNYrz0b4o -https://youtube.com/watch?v=CCVp_X9YquA -https://youtube.com/watch?v=eYEl4EaCPJs -https://youtube.com/watch?v=n7Vbps6GLoI -https://youtube.com/watch?v=ZueOBSGhCEw -https://youtube.com/watch?v=hRIXys1xMGc -https://youtube.com/watch?v=X8Ooy2mzrRk -https://youtube.com/watch?v=9Nn_Nghem60 -https://youtube.com/watch?v=62p-CXrYmf4 -https://youtube.com/watch?v=sgn7VfXH2GY -https://youtube.com/watch?v=1EjBJvYIj5Q -https://youtube.com/watch?v=bJULMOw69EI -https://youtube.com/watch?v=zUFg6HvljDE -https://youtube.com/watch?v=Ga7Hh6EzV0o -https://youtube.com/watch?v=UiQcYNEFx_E -https://youtube.com/watch?v=ObtLNz7NQuQ -https://youtube.com/watch?v=WzSQsl2C5dM -https://youtube.com/watch?v=x0f5dcOWsNU -https://youtube.com/watch?v=Q-kOFFCkhu0 -https://youtube.com/watch?v=DggGN8E2vx0 -https://youtube.com/watch?v=KxadblDT6zI -https://youtube.com/watch?v=rdeuQChFJAg -https://youtube.com/watch?v=oQ3C8fjqu_A -https://youtube.com/watch?v=dVZWSnD15t4 -https://youtube.com/watch?v=N_Q5LnUXiNA -https://youtube.com/watch?v=INskc6SaCu0 -https://youtube.com/watch?v=1jccsHMOdZo -https://youtube.com/watch?v=DNbD1JIH344 -https://youtube.com/watch?v=BA9BK71KoIc -https://youtube.com/watch?v=sOd5Ot5-cXE -https://youtube.com/watch?v=rMTlthu5V0g -https://youtube.com/watch?v=xr0Tfng9SP0 -https://youtube.com/watch?v=G5odaPQ0eVo -https://youtube.com/watch?v=1a1Ph-ioxoA -https://youtube.com/watch?v=hyb_wr40pog -https://youtube.com/watch?v=dnK6OHPQZbA -https://youtube.com/watch?v=dtiSA2RKDzc -https://youtube.com/watch?v=Djcti31JFGg -https://youtube.com/watch?v=f0mSDdncUVw -https://youtube.com/watch?v=7tnPkQufnZY -https://youtube.com/watch?v=nPHUz8apHjY -https://youtube.com/watch?v=_lzwSBF2gIA -https://youtube.com/watch?v=VBY3WI7DyV4 -https://youtube.com/watch?v=jqqwb5FYifo -https://youtube.com/watch?v=uH_-w-NeDiU -https://youtube.com/watch?v=4WPCBieSESI -https://youtube.com/watch?v=lbjC6Q6OLvU -https://youtube.com/watch?v=M8JUWVgIYgM -https://youtube.com/watch?v=5Pi5ZJZ07ME -https://youtube.com/watch?v=Q8QNzvtnOHc -https://youtube.com/watch?v=AaTVbFyynI4 -https://youtube.com/watch?v=FycpDrxdr2o -https://youtube.com/watch?v=PQyzK7XJQ0s -https://youtube.com/watch?v=qEjGhOdFfYo -https://youtube.com/watch?v=Us0EU-yXAlg -https://youtube.com/watch?v=myUuXffyu_k -https://youtube.com/watch?v=7toKjKtbeeI -https://youtube.com/watch?v=8urhUop-ouI -https://youtube.com/watch?v=sPbi1YWjox4 -https://youtube.com/watch?v=smJ617KKpcA -https://youtube.com/watch?v=P5OQIm2MI1s -https://youtube.com/watch?v=SgxlkyqN_Js -https://youtube.com/watch?v=g-jsW61e_-w -https://youtube.com/watch?v=lZbahdBHv9E -https://youtube.com/watch?v=DyAY4QA2unY -https://youtube.com/watch?v=Nv2GgV34qIg -https://youtube.com/watch?v=xRvdCRM_jzk -https://youtube.com/watch?v=sxz9eZ1Aons -https://youtube.com/watch?v=1SW2HlX94eg -https://youtube.com/watch?v=iD6k2E61ABY -https://youtube.com/watch?v=c16m8xspz8U -https://youtube.com/watch?v=IKayR1oqC7w -https://youtube.com/watch?v=65lEbMkxO1I -https://youtube.com/watch?v=svpPe1tlKlY -https://youtube.com/watch?v=RbaGDDbpcQ4 -https://youtube.com/watch?v=bbw1r32MJpY -https://youtube.com/watch?v=yOsTPyBSoKU -https://youtube.com/watch?v=jmovwneQ7iQ -https://youtube.com/watch?v=rKtqLZQaszE -https://youtube.com/watch?v=izO68Vu2sx8 -https://youtube.com/watch?v=9rv0EwudrIc -https://youtube.com/watch?v=hvdOgM9wsrw -https://youtube.com/watch?v=aUmOqNU3cqw -https://youtube.com/watch?v=nmLsA1z68VQ -https://youtube.com/watch?v=wqHe50_tBVc -https://youtube.com/watch?v=FuKF-nGpvFA -https://youtube.com/watch?v=v6UZTw1uHmk -https://youtube.com/watch?v=wOuNZMNGwWo -https://youtube.com/watch?v=ZBI9DexZJRo -https://youtube.com/watch?v=sBhbCjSnemE -https://youtube.com/watch?v=yQgljgngO14 -https://youtube.com/watch?v=qkogQxKXwZc -https://youtube.com/watch?v=H2Kme_AXBgU -https://youtube.com/watch?v=ru3sxF4KxHU -https://youtube.com/watch?v=HhndO6GdAHg -https://youtube.com/watch?v=-ZHYfjSg7A4 -https://youtube.com/watch?v=_J0ZpJMQjDo -https://youtube.com/watch?v=qceZZhvelqU -https://youtube.com/watch?v=keJQiIHaIWA -https://youtube.com/watch?v=LDYkdd1FkaA -https://youtube.com/watch?v=aUZ7T636aks -https://youtube.com/watch?v=29J0Qsp3yns -https://youtube.com/watch?v=Y9rxeyzyKVw -https://youtube.com/watch?v=vy2q5qM2tzk -https://youtube.com/watch?v=xafJW_VtA8w -https://youtube.com/watch?v=3ktfwLMivUw -https://youtube.com/watch?v=G6gQbM4VjV4 -https://youtube.com/watch?v=tpGOXpvqtbY -https://youtube.com/watch?v=gXYrCfP3hX0 -https://youtube.com/watch?v=X_AOwrXev60 -https://youtube.com/watch?v=4_iC0MyIykM -https://youtube.com/watch?v=ZICaUybMucY -https://youtube.com/watch?v=YLKJASUKB0g -https://youtube.com/watch?v=2KaeXksNA1o -https://youtube.com/watch?v=D27zVtVPWnQ -https://youtube.com/watch?v=mCscZ2tPFmI -https://youtube.com/watch?v=C4zw9qvo4PQ -https://youtube.com/watch?v=J4iapfF2BCc -https://youtube.com/watch?v=R0H4mL3OW-4 -https://youtube.com/watch?v=Tyt_4N4LNz4 -https://youtube.com/watch?v=fHfH1hRmB78 -https://youtube.com/watch?v=TxH9Dg1JLio -https://youtube.com/watch?v=4WtmkES0X48 -https://youtube.com/watch?v=FU89y-AWDSg -https://youtube.com/watch?v=B0x1zzQBeX0 -https://youtube.com/watch?v=0UWBO4r11AY -https://youtube.com/watch?v=0lv8cNsmVJo -https://youtube.com/watch?v=G5zPqgQ67yo -https://youtube.com/watch?v=Z7dFA3hoAwQ -https://youtube.com/watch?v=X-lUHu_oGe8 -https://youtube.com/watch?v=aWA5f1l3ulg -https://youtube.com/watch?v=WkM9T1IoQgI -https://youtube.com/watch?v=T9pd8VWyibA -https://youtube.com/watch?v=Y3ohZjCKzjg -https://youtube.com/watch?v=i_LfbN1EG3c -https://youtube.com/watch?v=iM-eewbBOCA -https://youtube.com/watch?v=Q-Yp9AlifJg -https://youtube.com/watch?v=-m91DYI0--I -https://youtube.com/watch?v=nsyK9_iaCoA -https://youtube.com/watch?v=Bg4UjKYHMuM -https://youtube.com/watch?v=QQKmh3RsRgg -https://youtube.com/watch?v=qCp6ZWSPo-4 -https://youtube.com/watch?v=Dp_Ms6Q-zO8 -https://youtube.com/watch?v=AvXroQ5zMhE -https://youtube.com/watch?v=LR82f0GJgXg -https://youtube.com/watch?v=IhSG1deLTmY -https://youtube.com/watch?v=ZHBvFDPz0J0 -https://youtube.com/watch?v=BpDnB_9fPbU -https://youtube.com/watch?v=RzBS0H75D1U -https://youtube.com/watch?v=bogGO4UUxvo -https://youtube.com/watch?v=haVlcMsRIHE -https://youtube.com/watch?v=JFv_rFiYGzQ -https://youtube.com/watch?v=uD73uTlu708 -https://youtube.com/watch?v=ocEsAH40fWs -https://youtube.com/watch?v=of4oefTUY-8 -https://youtube.com/watch?v=wUp3OhwksUM -https://youtube.com/watch?v=_H1ktl3onMQ -https://youtube.com/watch?v=ONcXJljaoyE -https://youtube.com/watch?v=Ea06lSzLvBo -https://youtube.com/watch?v=VgvJrWwbW-k -https://youtube.com/watch?v=gQ3YJh_jUFc -https://youtube.com/watch?v=iWEkIVi7FKo -https://youtube.com/watch?v=Yqln3nmwS90 -https://youtube.com/watch?v=SPedPSBreNk -https://youtube.com/watch?v=_pbIj-2vak4 -https://youtube.com/watch?v=mDQHqNf-IEg -https://youtube.com/watch?v=71LUw5iKoiw -https://youtube.com/watch?v=OvHcHQ9-jdo -https://youtube.com/watch?v=ajRPpn5CYFE -https://youtube.com/watch?v=ZIGxnhQDjh8 -https://youtube.com/watch?v=oA7VV2z2K1o -https://youtube.com/watch?v=NlpgFuhpgmk -https://youtube.com/watch?v=uTnxi7i_yWg -https://youtube.com/watch?v=-lxIzlHAJTw -https://youtube.com/watch?v=lxBCEuHQVms -https://youtube.com/watch?v=71QmMPEnDBI -https://youtube.com/watch?v=opXvrMQEXUk -https://youtube.com/watch?v=3yeEUpRnyV4 -https://youtube.com/watch?v=aFuYIkYx3EY -https://youtube.com/watch?v=-BIlJRa-1pw -https://youtube.com/watch?v=Pq9VEnUc1sw -https://youtube.com/watch?v=GYhDtr-HTps -https://youtube.com/watch?v=Wl2eEI7a46A -https://youtube.com/watch?v=P-a6c1b0qCs -https://youtube.com/watch?v=2MferjKXc1c -https://youtube.com/watch?v=VGA_Y6YZLhM -https://youtube.com/watch?v=ls3jLz5GK-k -https://youtube.com/watch?v=g4az93FLo9s -https://youtube.com/watch?v=lZbgyKJkHxQ -https://youtube.com/watch?v=eiNHxi6YPEU -https://youtube.com/watch?v=ptdDbLKDHwo -https://youtube.com/watch?v=Pssb8lCRjnQ -https://youtube.com/watch?v=VhbG1JPe_JI -https://youtube.com/watch?v=ycslsuleRCA -https://youtube.com/watch?v=BQCx1kW3kMc -https://youtube.com/watch?v=jQH0GPL33uc -https://youtube.com/watch?v=H5qgwnfvf1c -https://youtube.com/watch?v=M47Bsg6Bt3M -https://youtube.com/watch?v=69oNGLx0Sxg -https://youtube.com/watch?v=WBIsw5rtWjk -https://youtube.com/watch?v=bw1ArZ3zLDg -https://youtube.com/watch?v=77dxA6S_BpY -https://youtube.com/watch?v=oGDS_xiHHCM -https://youtube.com/watch?v=k0kI8tcFxM8 -https://youtube.com/watch?v=qQMUWlse5I8 -https://youtube.com/watch?v=mDmbKzaCkGY -https://youtube.com/watch?v=yis_itRsT_8 -https://youtube.com/watch?v=ClE5MBXh4rg -https://youtube.com/watch?v=gnxbNaW4vDk -https://youtube.com/watch?v=rWm41a4hyw8 -https://youtube.com/watch?v=flWB-WaKm5U -https://youtube.com/watch?v=AtxRk7kzU0Q -https://youtube.com/watch?v=rYNIs6HnyMY -https://youtube.com/watch?v=LWay7pPEWeg -https://youtube.com/watch?v=HMnrl0tmd3k -https://youtube.com/watch?v=Uv3FQb2AvZM -https://youtube.com/watch?v=yeJx04_47Lc -https://youtube.com/watch?v=TYRDgd3Tb44 -https://youtube.com/watch?v=bLo5pj04wag -https://youtube.com/watch?v=KEXQkrllGbA -https://youtube.com/watch?v=hwZNL7QVJjE -https://youtube.com/watch?v=rF2UauLtZag -https://youtube.com/watch?v=wEA5Xuc4-a4 -https://youtube.com/watch?v=lRgGiS2CHec -https://youtube.com/watch?v=7uy0ldI_1HA +## https://temp.discord.fm/ + +# Generated by Discord.FM - electro-hub +https://youtube.com/watch?v=nEt1bKGlCpM +https://youtube.com/watch?v=wNwY8JCBm6o +https://youtube.com/watch?v=nedAfpJV53w +https://youtube.com/watch?v=Xq-knHXSKYY +https://youtube.com/watch?v=ovrGzbsQZqc +https://youtube.com/watch?v=jK2aIUmmdP4 +https://youtube.com/watch?v=7m_QZZTb6Xc +https://youtube.com/watch?v=pisxxUpS7o8 +https://youtube.com/watch?v=UwbVx-XTubM +https://youtube.com/watch?v=2YVtby__ZS0 +https://youtube.com/watch?v=PKfxmFU3lWY +https://youtube.com/watch?v=ngsGBSCDwcI +https://youtube.com/watch?v=EfR2OXNECWo +https://youtube.com/watch?v=IzIHf1EToTE +https://youtube.com/watch?v=oC-GflRB0y4 +https://youtube.com/watch?v=AJh1o0wvqKI +https://youtube.com/watch?v=bTNTNxZaTp0 +https://youtube.com/watch?v=MwSkC85TDgY +https://youtube.com/watch?v=8RTR1Ag0rhQ +https://youtube.com/watch?v=GzataxzdwIs +https://youtube.com/watch?v=n3uQghHbcaQ +https://youtube.com/watch?v=RvJYIGJilG0 +https://youtube.com/watch?v=ARgdBb2Go0w +https://youtube.com/watch?v=du8iQQ0zoRc +https://youtube.com/watch?v=x-4O0y3rDW4 +https://youtube.com/watch?v=IKKXdjRXsXQ +https://youtube.com/watch?v=4QTh79V696Q +https://youtube.com/watch?v=dXpFEgi43lU +https://youtube.com/watch?v=ClM5UqKQvEk +https://youtube.com/watch?v=0t2tjNqGyJI +https://youtube.com/watch?v=oMf4ap3OrO8 +https://youtube.com/watch?v=60ItHLz5WEA +https://youtube.com/watch?v=cNxNDWWwC9w +https://youtube.com/watch?v=JA7bmiafKNM +https://youtube.com/watch?v=usXhiWE2Uc0 +https://youtube.com/watch?v=5lLclBfKj48 +https://youtube.com/watch?v=FYyCbKZIkgc +https://youtube.com/watch?v=S5_Mf04nbLw +https://youtube.com/watch?v=ou03DhIp3zI +https://youtube.com/watch?v=13TIWyeuY4w +https://youtube.com/watch?v=C_fpzKoHyw8 +https://youtube.com/watch?v=WbksTnQVqyI +https://youtube.com/watch?v=pAGVvPfwdCY +https://youtube.com/watch?v=hgKDu5pp_fU +https://youtube.com/watch?v=YaHw1lYbE7I +https://youtube.com/watch?v=UifuuynvrlY +https://youtube.com/watch?v=pe6du2o_vdc +https://youtube.com/watch?v=3FPwcaflCS8 +https://youtube.com/watch?v=WPNq_VJOSxU +https://youtube.com/watch?v=Rns6bSR_OFQ +https://youtube.com/watch?v=J9nMlGRDXlw +https://youtube.com/watch?v=dS5UpPflmnM +https://youtube.com/watch?v=lznKG_PovSo +https://youtube.com/watch?v=Pk7b7YC93qQ +https://youtube.com/watch?v=44PO8jPGvsE +https://youtube.com/watch?v=m-tjK8hQwrU +https://youtube.com/watch?v=F0uBAB0i1uY +https://youtube.com/watch?v=FMUf8K-dkIk +https://youtube.com/watch?v=cGAU_Xa-Xl0 +https://youtube.com/watch?v=ZH2DMNk6udI +https://youtube.com/watch?v=QHfCeR8cXvc +https://youtube.com/watch?v=5QQ0ebVrLQw +https://youtube.com/watch?v=cIbqvbwI5Pg +https://youtube.com/watch?v=7DZ-alFDXns +https://youtube.com/watch?v=sH0BPn2jkP4 +https://youtube.com/watch?v=0K3p26aj6jE +https://youtube.com/watch?v=L_pqQBKt-dM +https://youtube.com/watch?v=XZy5dQH0xZs +https://youtube.com/watch?v=sEX98pH5qIA +https://youtube.com/watch?v=ux9vr4xfWj4 +https://youtube.com/watch?v=YlXRq9-0alw +https://youtube.com/watch?v=e4dZoM5kAfU +https://youtube.com/watch?v=3x5eFVWfcVA +https://youtube.com/watch?v=7lI2HST_lvA +https://youtube.com/watch?v=qEdf1qdO3_c +https://youtube.com/watch?v=BWuHMes6kag +https://youtube.com/watch?v=_eaIurlPB7w +https://youtube.com/watch?v=3j1U0Io65Ds +https://youtube.com/watch?v=X62lV9WdVmo +https://youtube.com/watch?v=3FMfZbdvX9A +https://youtube.com/watch?v=ZN4NxYy3vVQ +https://youtube.com/watch?v=MQ0hFNd5aaU +https://youtube.com/watch?v=574LrnfW2_s +https://youtube.com/watch?v=h8NwXM6SNbU +https://youtube.com/watch?v=EZ7zIrNMIH8 +https://youtube.com/watch?v=vbjoupCWk_M +https://youtube.com/watch?v=H_tgomTUiWY +https://youtube.com/watch?v=g2rdrNONy7k +https://youtube.com/watch?v=n5vdgTt9VPU +https://youtube.com/watch?v=QSb46QzHlWg +https://youtube.com/watch?v=WSb6HYnFT3Q +https://youtube.com/watch?v=lJ1NYJQnJTI +https://youtube.com/watch?v=34thwBLMe4g +https://youtube.com/watch?v=Q1DvVzKXktY +https://youtube.com/watch?v=hwywsmBbPIQ +https://youtube.com/watch?v=dDnwuokL07o +https://youtube.com/watch?v=qC4NdLg_05c +https://youtube.com/watch?v=R0P_f0gXXqs +https://youtube.com/watch?v=fnQgDgB5kbw +https://youtube.com/watch?v=Lc14Z1kgTb8 +https://youtube.com/watch?v=s1IrZxUYw5Q +https://youtube.com/watch?v=cWsDw8sDTJ4 +https://youtube.com/watch?v=kMHFn4Ra7uk +https://youtube.com/watch?v=TJUVNg5zxAs +https://youtube.com/watch?v=C9Bv1DiDZTM +https://youtube.com/watch?v=i78U3VEAwK8 +https://youtube.com/watch?v=PM98IHH0rfE +https://youtube.com/watch?v=9PB30JUOncw +https://youtube.com/watch?v=QIMlGbv9K9w +https://youtube.com/watch?v=d3Oc26AFDdU +https://youtube.com/watch?v=VGh5DV0D3wk +https://youtube.com/watch?v=71rSc6LXlSo +https://youtube.com/watch?v=phn2JZ2xTz4 +https://youtube.com/watch?v=xshEZzpS4CQ +https://youtube.com/watch?v=5tAsUGEqob4 +https://youtube.com/watch?v=FtveSk1N7Uo +https://youtube.com/watch?v=zGERGT06AsM +https://youtube.com/watch?v=3_-a9nVZYjk +https://youtube.com/watch?v=B7xai5u_tnk +https://youtube.com/watch?v=jqkPqfOFmbY +https://youtube.com/watch?v=v5a0YGaVS0I +https://youtube.com/watch?v=cIe6x_s14Is +https://youtube.com/watch?v=qDcFryDXQ7U +https://youtube.com/watch?v=TKZUhs9Gcdo +https://youtube.com/watch?v=T8fcbqDUwbU +https://youtube.com/watch?v=IIrCDAV3EgI +https://youtube.com/watch?v=HAIDqt2aUek +https://youtube.com/watch?v=ONoNjKtf3z8 +https://youtube.com/watch?v=mFQ_5dmzFsU +https://youtube.com/watch?v=-kAsZVn44aI +https://youtube.com/watch?v=vARpxoSM0kU +https://youtube.com/watch?v=6vUjU3_YS1k +https://youtube.com/watch?v=ZXI-LXszvkQ +https://youtube.com/watch?v=X3LInDIIU0U +https://youtube.com/watch?v=T_XHUA9G2zU +https://youtube.com/watch?v=-CzBYn7iRSI +https://youtube.com/watch?v=bzrtS_IuNGw +https://youtube.com/watch?v=2-DJeXSWrCg +https://youtube.com/watch?v=OVMuwa-HRCQ +https://youtube.com/watch?v=4lXBHD5C8do +https://youtube.com/watch?v=EfOn2yyKz1g +https://youtube.com/watch?v=czd0Er-_qI8 +https://youtube.com/watch?v=g2Sh7SANjng +https://youtube.com/watch?v=saAHXkRh6ms +https://youtube.com/watch?v=7BhYmwFSOas +https://youtube.com/watch?v=w_r-y92gmPI +https://youtube.com/watch?v=DljSVcwVImU +https://youtube.com/watch?v=Kky7rIEePQk +https://youtube.com/watch?v=FdznALpbovU +https://youtube.com/watch?v=cNT3q6tO-ZY +https://youtube.com/watch?v=_jU2V8sT_pE +https://youtube.com/watch?v=Gqw62pN960U +https://youtube.com/watch?v=_ud3mOQxWYo +https://youtube.com/watch?v=2EsdeUWAD34 +https://youtube.com/watch?v=ZHZxmp88Ts8 +https://youtube.com/watch?v=T3wvPpVOL04 +https://youtube.com/watch?v=NeVqF1pBEbU +https://youtube.com/watch?v=pfHM9HyRnRc +https://youtube.com/watch?v=TLkYY4lcNE0 +https://youtube.com/watch?v=0LWHowDwKn4 +https://youtube.com/watch?v=US7wauHA8MI +https://youtube.com/watch?v=EpiWHALFH-U +https://youtube.com/watch?v=WEhpAg1jLEQ +https://youtube.com/watch?v=Al23Vj-YPn8 +https://youtube.com/watch?v=hQsozlJv20k +https://youtube.com/watch?v=WK1OFAiCg9g +https://youtube.com/watch?v=2Q4KLb3CqOA +https://youtube.com/watch?v=7PRrzMWECeU +https://youtube.com/watch?v=39b3zjk_hKg +https://youtube.com/watch?v=7-W-djGV6og +https://youtube.com/watch?v=z269QQh7ano +https://youtube.com/watch?v=TEyndDhVZUg +https://youtube.com/watch?v=-pbsYf4Dc7w +https://youtube.com/watch?v=gZ11wHTS0Bk +https://youtube.com/watch?v=GN8zUPYivuQ +https://youtube.com/watch?v=hNNwtDgQf_0 +https://youtube.com/watch?v=CI9sIgU-WNY +https://youtube.com/watch?v=feQhtf-KJvw +https://youtube.com/watch?v=T6kG5vuPVSs +https://youtube.com/watch?v=RkqdK0Yiyh8 +https://youtube.com/watch?v=5tfZAyNYWN4 +https://youtube.com/watch?v=nVDQfKk_E2g +https://youtube.com/watch?v=69yieWP0g10 +https://youtube.com/watch?v=fcYazsR6w-k +https://youtube.com/watch?v=FHccClTAdzc +https://youtube.com/watch?v=phhPSwFdgS8 +https://youtube.com/watch?v=OX3eAI0eZqE +https://youtube.com/watch?v=W-5OUle-U3c +https://youtube.com/watch?v=qYk7Ko9QY-E +https://youtube.com/watch?v=cXER29tPVow +https://youtube.com/watch?v=QVkGFtSTwis +https://youtube.com/watch?v=NZhFMC0_mTk +https://youtube.com/watch?v=dFEBpDW-K7E +https://youtube.com/watch?v=6nRy10_iOPc +https://youtube.com/watch?v=Kji10fsHyVs +https://youtube.com/watch?v=oiWzM3zUvF8 +https://youtube.com/watch?v=c29bgvu4egI +https://youtube.com/watch?v=rkJy9feER_o +https://youtube.com/watch?v=tfpVib0ji54 +https://youtube.com/watch?v=xfEtO5Zs8Zk +https://youtube.com/watch?v=duTPsznmSlU +https://youtube.com/watch?v=stGTBsIyYZQ +https://youtube.com/watch?v=e_aioZQA3kk +https://youtube.com/watch?v=ZXKexscG5u8 +https://youtube.com/watch?v=2MG74eZfkJ4 +https://youtube.com/watch?v=xMz3AwBE4ZQ +https://youtube.com/watch?v=c0ubrGE1Egk +https://youtube.com/watch?v=qqZp8FEKCB4 +https://youtube.com/watch?v=3i-VrbTFIWI +https://youtube.com/watch?v=aN_ZCMOx0lo +https://youtube.com/watch?v=W_5unoZTpoQ +https://youtube.com/watch?v=94M_tkjf-JA +https://youtube.com/watch?v=HaxVJg4WiXw +https://youtube.com/watch?v=qDm3Dtr_LR4 +https://youtube.com/watch?v=Tcq55RDiVqw +https://youtube.com/watch?v=As-uiQ7Tvoo +https://youtube.com/watch?v=a52Ul2AM92c +https://youtube.com/watch?v=_mwL6R-Z1e4 +https://youtube.com/watch?v=7fugVGRFqe0 +https://youtube.com/watch?v=lABPt0CRO_U +https://youtube.com/watch?v=paWIfLD4S2o +https://youtube.com/watch?v=BL_0sHPMrQI +https://youtube.com/watch?v=Ygf_yk5QJXY +https://youtube.com/watch?v=ip4Q1pbrYDg +https://youtube.com/watch?v=J2X5mJ3HDYE +https://youtube.com/watch?v=yrEbCGtZFAQ +https://youtube.com/watch?v=1dcXmkco5ko +https://youtube.com/watch?v=6nuOSTiFNO0 +https://youtube.com/watch?v=5HQefcytyhk +https://youtube.com/watch?v=bSfpSOBD30U +https://youtube.com/watch?v=x_OwcYTNbHs +https://youtube.com/watch?v=vxOewDbARxk +https://youtube.com/watch?v=_cb0O-pRdF0 +https://youtube.com/watch?v=ZtaRRcoTQ4E +https://youtube.com/watch?v=8U2rKAnyyDE +https://youtube.com/watch?v=NV2qji32jic +https://youtube.com/watch?v=BUV2sRIcnqw +https://youtube.com/watch?v=hf4IxNNiqbU +https://youtube.com/watch?v=-mSRraXCY9w +https://youtube.com/watch?v=GWVd1Db16uE +https://youtube.com/watch?v=tyrUaI4KBRk +https://youtube.com/watch?v=eUL6AKzJQw8 +https://youtube.com/watch?v=c6P7iqvq1Og +https://youtube.com/watch?v=2sh0ENwPGXw +https://youtube.com/watch?v=Byuhn6hkJbM +https://youtube.com/watch?v=R7-hFVbDiIo +https://youtube.com/watch?v=gJeh_dLjPN4 +https://youtube.com/watch?v=SyggBM8Bqls +https://youtube.com/watch?v=yXLL46xkdlY +https://youtube.com/watch?v=7TsLBmXNKeo +https://youtube.com/watch?v=iN_Vzi5DVhY +https://youtube.com/watch?v=vBdnfyfBSKg +https://youtube.com/watch?v=OLGN9_mycsU +https://youtube.com/watch?v=FYh29RMpmAc +https://youtube.com/watch?v=lbV-YwTwkTI +https://youtube.com/watch?v=Qn5sYvn_H2w +https://youtube.com/watch?v=ivLdLtOtOzU +https://youtube.com/watch?v=j2BAT1UqoHE +https://youtube.com/watch?v=9Mlvjb5aoq4 +https://youtube.com/watch?v=9d4il0lDszg +https://youtube.com/watch?v=pa9DAW7PtFA +https://youtube.com/watch?v=p6XagVe8bmw +https://youtube.com/watch?v=fDZIHq0D6vc +https://youtube.com/watch?v=tI2LwQGZTDA +https://youtube.com/watch?v=njckdova0bY +https://youtube.com/watch?v=Zv1QV6lrc_Y +https://youtube.com/watch?v=m3T9JgHLIAk +https://youtube.com/watch?v=Ey1_nkmS54g +https://youtube.com/watch?v=a7cGKQeqfrI +https://youtube.com/watch?v=0mOqIsnqSqM +https://youtube.com/watch?v=pTBQRFWiiHo +https://youtube.com/watch?v=PwY-PlXdK6M +https://youtube.com/watch?v=ivY2Kfhw31Q +https://youtube.com/watch?v=aVzh-b7HenE +https://youtube.com/watch?v=z872doHfVXs +https://youtube.com/watch?v=zIjKbIdJ82w +https://youtube.com/watch?v=8sxAeb9BTKY +https://youtube.com/watch?v=Pw_Fq8pjQE4 +https://youtube.com/watch?v=5txjj5awqS0 +https://youtube.com/watch?v=LAoZSikvqz8 +https://youtube.com/watch?v=5aQqJLHpTqw +https://youtube.com/watch?v=4Um6HAbXYnY +https://youtube.com/watch?v=qoQLxO54JZY +https://youtube.com/watch?v=hGdU7vPWPMc +https://youtube.com/watch?v=mSU-TWxNjJA +https://youtube.com/watch?v=m8UjXEnSNIg +https://youtube.com/watch?v=Q0vmiuBdYH0 +https://youtube.com/watch?v=iafxqkKZacA +https://youtube.com/watch?v=cFIR80BZ0sM +https://youtube.com/watch?v=zkl3-BqhfRU +https://youtube.com/watch?v=V0tiM_RLXCs +https://youtube.com/watch?v=d01XRSB-7dA +https://youtube.com/watch?v=15ry8nvYLdQ +https://youtube.com/watch?v=G1k9Ag69LI8 +https://youtube.com/watch?v=ZqJiXLJs_Pg +https://youtube.com/watch?v=5hd53EIKRXI +https://youtube.com/watch?v=p13lhwtSaQc +https://youtube.com/watch?v=K1xrQcbAwgE +https://youtube.com/watch?v=unx9er0sG6o +https://youtube.com/watch?v=IAAh4s5JrAs +https://youtube.com/watch?v=91wK-WFHAhQ +https://youtube.com/watch?v=0rLAIF4JhHs +https://youtube.com/watch?v=VHMG0tQ1sq0 +https://youtube.com/watch?v=mc9LKJMedaY +https://youtube.com/watch?v=QNfQq_z255c +https://youtube.com/watch?v=B88mv0dhYwc +https://youtube.com/watch?v=eeKjgkveAh0 +https://youtube.com/watch?v=5ejWHwI72bU +https://youtube.com/watch?v=oRrq6zXFUKg +https://youtube.com/watch?v=9rixtkYjbRQ +https://youtube.com/watch?v=aUGA-RJoqNA +https://youtube.com/watch?v=4oQ7VTB5zqs +https://youtube.com/watch?v=VPxUQiH--kU +https://youtube.com/watch?v=BNFcrNX_hOE +https://youtube.com/watch?v=IkDj2D3KiPc +https://youtube.com/watch?v=qpx8HJAYb8k +https://youtube.com/watch?v=v0g1xzCpEOM +https://youtube.com/watch?v=oRV5DbcLivs +https://youtube.com/watch?v=LjFSPklTE8w +https://youtube.com/watch?v=KR-eV7fHNbM +https://youtube.com/watch?v=e6LUWscWEw4 +https://youtube.com/watch?v=UVnn6ueVs9A +https://youtube.com/watch?v=lAivBjfVH0o +https://youtube.com/watch?v=pkmrSXtSt84 +https://youtube.com/watch?v=f_DX1A7f43o +https://youtube.com/watch?v=_qg0j-mCCwc +https://youtube.com/watch?v=RO3V1V5Valk +https://youtube.com/watch?v=kn9_rgoX14A +https://youtube.com/watch?v=ow4i6I-OptM +https://youtube.com/watch?v=hGxUXFlSvbU +https://youtube.com/watch?v=9NwZdxiLvGo +https://youtube.com/watch?v=TPZnDVnNZ6E +https://youtube.com/watch?v=wltiSg6O0PY +https://youtube.com/watch?v=Ve1N7hShM7M +https://youtube.com/watch?v=0O2aH4XLbto +https://youtube.com/watch?v=ttFyuRmFgZY +https://youtube.com/watch?v=5tp8iVL9LPc +https://youtube.com/watch?v=AyBYKl8SyK8 +https://youtube.com/watch?v=XgvIBouzEso +https://youtube.com/watch?v=-uEkDyHp4vA +https://youtube.com/watch?v=_9eHO1V-EYw +https://youtube.com/watch?v=Lq6n7Hlgjw4 +https://youtube.com/watch?v=eqsXMVobPZM +https://youtube.com/watch?v=XhohLI1Rupc +https://youtube.com/watch?v=-iYzuc_gM9U +https://youtube.com/watch?v=DWLz0yJegtA +https://youtube.com/watch?v=8Gbop-ZLUfA +https://youtube.com/watch?v=u01YGBPh-YQ +https://youtube.com/watch?v=F41lj80297E +https://youtube.com/watch?v=ImXmEPGKljI +https://youtube.com/watch?v=c3Lui73UEk4 +https://youtube.com/watch?v=RQoUnnsa_xg +https://youtube.com/watch?v=3D_fiyrxSIs +https://youtube.com/watch?v=Nqqc2FHf9Ug +https://youtube.com/watch?v=EIwtr-VqwcM +https://youtube.com/watch?v=0ZgNpboHPMI +https://youtube.com/watch?v=jWBP05rL36U +https://youtube.com/watch?v=6y_NJg-xoeE +https://youtube.com/watch?v=0BH7XF117Ek +https://youtube.com/watch?v=dfO4aOcf4F8 +https://youtube.com/watch?v=-WR0o7NWUy8 +https://youtube.com/watch?v=BQX9x6P5w7k +https://youtube.com/watch?v=a0Aauep0VWs +https://youtube.com/watch?v=DytrHrwoG4k +https://youtube.com/watch?v=GhKm_SdHsLs +https://youtube.com/watch?v=4eGk7KVTRSk +https://youtube.com/watch?v=As_4MEJUzeY +https://youtube.com/watch?v=mpQeKHrZGWU +https://youtube.com/watch?v=GnqSIa0GNSA +https://youtube.com/watch?v=C-x7ZJ5aMNM +https://youtube.com/watch?v=hPpK_GkAK30 +https://youtube.com/watch?v=dba3MYL6Nzc +https://youtube.com/watch?v=BQrNh80N6Hg +https://youtube.com/watch?v=QBXrhgg9s0c +https://youtube.com/watch?v=OilPvUo2vac +https://youtube.com/watch?v=qTPqCUyLLhA +https://youtube.com/watch?v=UkC5uVSfa7k +https://youtube.com/watch?v=RhzJGZ5lzgM +https://youtube.com/watch?v=eLBozbquURs +https://youtube.com/watch?v=FsQjo7Z11_Q +https://youtube.com/watch?v=fIpCwYJnYLg +https://youtube.com/watch?v=dNLOZjCWTs4 +https://youtube.com/watch?v=rpkDl6UN4a8 +https://youtube.com/watch?v=kw8xqJ7SXmY +https://youtube.com/watch?v=_cB3HXVvm0g +https://youtube.com/watch?v=YBlrSdfUgPI +https://youtube.com/watch?v=110csW7KUbM +https://youtube.com/watch?v=Xz5qHx-MHDo +https://youtube.com/watch?v=Iaa03itxNZ0 +https://youtube.com/watch?v=9W8Q9FvH1XA +https://youtube.com/watch?v=ijfNbbcP2k0 +https://youtube.com/watch?v=I5z2--4O7sA +https://youtube.com/watch?v=j8F1NwrHBIU +https://youtube.com/watch?v=Z--UAlidTyI +https://youtube.com/watch?v=Y-fYkVi3HjQ +https://youtube.com/watch?v=ztsrgkKUctk +https://youtube.com/watch?v=LdG3aC95P7w +https://youtube.com/watch?v=Mv0g-j0iL-s +https://youtube.com/watch?v=uqzQfOKZoPc +https://youtube.com/watch?v=5LM4zck0LJ0 +https://youtube.com/watch?v=NwYlewhSkBQ +https://youtube.com/watch?v=C9FNqHTq8aU +https://youtube.com/watch?v=BxmZovupVYU +https://youtube.com/watch?v=UlBrE-4NBzs +https://youtube.com/watch?v=a59gmGkq_pw +https://youtube.com/watch?v=SqVSMucFDWk +https://youtube.com/watch?v=fBOPmzfBAnc +https://youtube.com/watch?v=awimSQD2Dyo +https://youtube.com/watch?v=jBmxH56XQBw +https://youtube.com/watch?v=9-VL30-Bn48 +https://youtube.com/watch?v=GaxEm9MPlzM +https://youtube.com/watch?v=AIkM352LpN8 +https://youtube.com/watch?v=UaerdFeq32E +https://youtube.com/watch?v=YcK3XCEeTsg +https://youtube.com/watch?v=rgc_lIMkRzc +https://youtube.com/watch?v=aq9YpxZiHY4 +https://youtube.com/watch?v=ztV9Z1T04RE +https://youtube.com/watch?v=SCD2tB1qILc +https://youtube.com/watch?v=PFKCFewHMc4 +https://youtube.com/watch?v=hImf920RCGI +https://youtube.com/watch?v=9xx69FxiZrc +https://youtube.com/watch?v=KWyhhDi5n8g + +# Generated by Discord.FM - chill-corner +https://youtube.com/watch?v=SfVBQ_0CsFo +https://youtube.com/watch?v=6e3QMgWuWi0 +https://youtube.com/watch?v=ezenAqbiBxY +https://youtube.com/watch?v=BJxGx2IIIwU +https://youtube.com/watch?v=Fd96lH5-RzY +https://youtube.com/watch?v=vTpZdfm7iuk +https://youtube.com/watch?v=TQxp1aP_IaE +https://youtube.com/watch?v=GfTBEZP09D8 +https://youtube.com/watch?v=phXRX1p8woY +https://youtube.com/watch?v=DeOnsIBXtz8 +https://youtube.com/watch?v=rHuUJqNsezg +https://youtube.com/watch?v=ZH8VGGvZBok +https://youtube.com/watch?v=Fptml7Dgp4E +https://youtube.com/watch?v=_GdOhROdh9c +https://youtube.com/watch?v=Pe7ZzNx-FTE +https://youtube.com/watch?v=-MrwLLxyPGc +https://youtube.com/watch?v=gUAWeM28wjQ +https://youtube.com/watch?v=nOnrDAjdr7s +https://youtube.com/watch?v=oXhYxDWgk9c +https://youtube.com/watch?v=NhFRmebmwWc +https://youtube.com/watch?v=4fC67Kjsf4k +https://youtube.com/watch?v=lRGPbaFy8hw +https://youtube.com/watch?v=mkMVyw-7avI +https://youtube.com/watch?v=O1RHkPGb31Q +https://youtube.com/watch?v=Pryb1VugJq4 +https://youtube.com/watch?v=j9FfYWp_d5w +https://youtube.com/watch?v=SM27KSKeiA4 +https://youtube.com/watch?v=-1H6usve0nY +https://youtube.com/watch?v=-HFQs_2Uy1w +https://youtube.com/watch?v=xfaHZXWV0g8 +https://youtube.com/watch?v=cOy222ay7nc +https://youtube.com/watch?v=QrC7UUcUW1s +https://youtube.com/watch?v=Q_Qst39q6jw +https://youtube.com/watch?v=PwIYdaplcv4 +https://youtube.com/watch?v=4mHW3eGF3Mw +https://youtube.com/watch?v=gx4rsZkCCss +https://youtube.com/watch?v=acHKPu4oIro +https://youtube.com/watch?v=5Y5xjtNltJA +https://youtube.com/watch?v=fn_amMJehPU +https://youtube.com/watch?v=FpQY90M-hww +https://youtube.com/watch?v=b8PPap4dJog +https://youtube.com/watch?v=9K09Ra2l0G8 +https://youtube.com/watch?v=0guABiTAbBk +https://youtube.com/watch?v=v9U0qMHHkSo +https://youtube.com/watch?v=6nc8PJvkU2E +https://youtube.com/watch?v=Obx3e7MfEaI +https://youtube.com/watch?v=BVomQtrtMTM +https://youtube.com/watch?v=71rSc6LXlSo +https://youtube.com/watch?v=EkTHpKKD7N0 +https://youtube.com/watch?v=7PClJma9Q8U +https://youtube.com/watch?v=cIzM9p3dUm8 +https://youtube.com/watch?v=Q1DvVzKXktY +https://youtube.com/watch?v=pk5tpGclppc +https://youtube.com/watch?v=jUqN1Jfw1cA +https://youtube.com/watch?v=Q2gFi6R_h-I +https://youtube.com/watch?v=H-KCI6bsN6E +https://youtube.com/watch?v=vW8Qcgo7X8A +https://youtube.com/watch?v=TsBXn4M9dJE +https://youtube.com/watch?v=ZhzN7-Q00KU +https://youtube.com/watch?v=dfBj4i8MKH4 +https://youtube.com/watch?v=jLzuObMhVAI +https://youtube.com/watch?v=7tkPp0YO4lw +https://youtube.com/watch?v=OrcVS3s5D34 +https://youtube.com/watch?v=_BJDK15HhV4 +https://youtube.com/watch?v=F-wNjIgdgXU +https://youtube.com/watch?v=z_axLG1szU8 +https://youtube.com/watch?v=BkTTWqGFywo +https://youtube.com/watch?v=TD51KO-gCtQ +https://youtube.com/watch?v=mPDLoGm6E-Q +https://youtube.com/watch?v=2WTtz0rpYAk +https://youtube.com/watch?v=LLyXx7Zmxkg +https://youtube.com/watch?v=XektDORSOQs +https://youtube.com/watch?v=zE-qxNVoUSo +https://youtube.com/watch?v=It42TsD7_sI +https://youtube.com/watch?v=gmBRRaqGYNw +https://youtube.com/watch?v=NhK8Ehv6aPI +https://youtube.com/watch?v=JtimyzJYUgc +https://youtube.com/watch?v=AMzjbyZhM5U +https://youtube.com/watch?v=qQfteZb53RM +https://youtube.com/watch?v=_UMK9RrdnnM +https://youtube.com/watch?v=Ox25h4qUgOw +https://youtube.com/watch?v=YthChN1Wq8M +https://youtube.com/watch?v=lABPt0CRO_U +https://youtube.com/watch?v=K8_xAAX92BE +https://youtube.com/watch?v=V5-AQTPFJSg +https://youtube.com/watch?v=wd3NsE5wxX0 +https://youtube.com/watch?v=m6bNfhj0_nA +https://youtube.com/watch?v=vi7wzz9kXxg +https://youtube.com/watch?v=s8yyuv3eJKM +https://youtube.com/watch?v=OqYCwK4BZK0 +https://youtube.com/watch?v=W6Hy0G0R3AQ +https://youtube.com/watch?v=in7CifqoM-M +https://youtube.com/watch?v=eH2Aibf2Fxc +https://youtube.com/watch?v=dBJvstD7khU +https://youtube.com/watch?v=IRhS4Iux50E +https://youtube.com/watch?v=s8XIgR5OGJc +https://youtube.com/watch?v=pgQF1QznOQ8 +https://youtube.com/watch?v=NY8IS0ssnXQ +https://youtube.com/watch?v=ngKBxTFplLg +https://youtube.com/watch?v=px9RtIj2tsA +https://youtube.com/watch?v=HEg7lQhRdyw +https://youtube.com/watch?v=Ut-Rk8cYaHA +https://youtube.com/watch?v=Bj6TiOJi1tI +https://youtube.com/watch?v=p_6In1gr36A +https://youtube.com/watch?v=0g2fKSkaSx4 +https://youtube.com/watch?v=8HFAARSfmrQ +https://youtube.com/watch?v=Lx2zzIkaUZQ +https://youtube.com/watch?v=Nrx6JIdMB8Y +https://youtube.com/watch?v=EHIiUS6TfXI +https://youtube.com/watch?v=94GmmzhZsko +https://youtube.com/watch?v=8nW1c_li-uw +https://youtube.com/watch?v=tB1Ge-s5bH4 +https://youtube.com/watch?v=DUK5v7itSxU +https://youtube.com/watch?v=BKkoRfaUiv0 +https://youtube.com/watch?v=vocE5gcqNDk +https://youtube.com/watch?v=qn4hQufHVsE +https://youtube.com/watch?v=4xiZRYEasvY +https://youtube.com/watch?v=LO3uqkaFRkY +https://youtube.com/watch?v=Nh0uMweFR10 +https://youtube.com/watch?v=nbbeMhDsoY8 +https://youtube.com/watch?v=FXZeZz0kPq0 +https://youtube.com/watch?v=jWEw6k6MDhM +https://youtube.com/watch?v=KEVEFgmuBFQ +https://youtube.com/watch?v=7_VR3trN82M +https://youtube.com/watch?v=_3h_n2seS1g +https://youtube.com/watch?v=NuK56z2FaK4 +https://youtube.com/watch?v=jfSc58Jk4zg +https://youtube.com/watch?v=Xda_K7abC2I +https://youtube.com/watch?v=KJdO6aFlKCU +https://youtube.com/watch?v=AL4Tc7jLuK4 +https://youtube.com/watch?v=lIhvOOT2zbQ +https://youtube.com/watch?v=zJZu54gtmNc +https://youtube.com/watch?v=rloprnff9iM +https://youtube.com/watch?v=cqkzoskWfww +https://youtube.com/watch?v=QVkGFtSTwis +https://youtube.com/watch?v=E2JQxgffxKg +https://youtube.com/watch?v=-yfI6KAPTPU +https://youtube.com/watch?v=45pBJzi_YaY +https://youtube.com/watch?v=iGZC5w_Qosc +https://youtube.com/watch?v=fcsDG_jVYbc +https://youtube.com/watch?v=TzFZTqIesYM +https://youtube.com/watch?v=v7Srbp8WPMY +https://youtube.com/watch?v=FZWHVo-t2Vo +https://youtube.com/watch?v=1hJKhiew2O0 +https://youtube.com/watch?v=9VPfprmtSF4 +https://youtube.com/watch?v=Erj8GpZFQnM +https://youtube.com/watch?v=SWMG9xA2OJQ +https://youtube.com/watch?v=9EgLB1_FXqg +https://youtube.com/watch?v=R27SK1s1FAg +https://youtube.com/watch?v=j4n7fWjmomA +https://youtube.com/watch?v=WZNHgs8QIs8 +https://youtube.com/watch?v=IufdJpZT_ak +https://youtube.com/watch?v=F7khiq25Xr0 +https://youtube.com/watch?v=ksNBf8kXpqQ +https://youtube.com/watch?v=_aIOM9_8I8U +https://youtube.com/watch?v=IRD7WylAfkw +https://youtube.com/watch?v=5LWj1MFUTrk +https://youtube.com/watch?v=uNgqPMI3jQk +https://youtube.com/watch?v=_ILsdcs__ME +https://youtube.com/watch?v=gEhNQGBlxBI +https://youtube.com/watch?v=WinkoZiOYQc +https://youtube.com/watch?v=bzXJv7gTjeg +https://youtube.com/watch?v=UVnn6ueVs9A +https://youtube.com/watch?v=3gxNW2Ulpwk +https://youtube.com/watch?v=f_DX1A7f43o +https://youtube.com/watch?v=HNuqVGGNr04 +https://youtube.com/watch?v=uLUbpz8AOoI +https://youtube.com/watch?v=D3fHXpgqGEc +https://youtube.com/watch?v=Cy8duEIHEig +https://youtube.com/watch?v=s0aMSTtI8nE +https://youtube.com/watch?v=wltiSg6O0PY +https://youtube.com/watch?v=PnfkZrbqqVs +https://youtube.com/watch?v=2ApY1nY6IYg +https://youtube.com/watch?v=cElu1JcNqfg +https://youtube.com/watch?v=O8tIRYECJbk +https://youtube.com/watch?v=MRHojNbDEUg +https://youtube.com/watch?v=6tpGC4lgpMg +https://youtube.com/watch?v=ioMq8f_UUX4 +https://youtube.com/watch?v=eD6MeGYG7Ok +https://youtube.com/watch?v=WZdH6rvhKd8 +https://youtube.com/watch?v=sNAQ6Y7VXsQ +https://youtube.com/watch?v=1adJmULQiAI +https://youtube.com/watch?v=ijlJjrk0rTk +https://youtube.com/watch?v=nLZvnaP0h9g + +# Generated by Discord.FM - country-countdown +https://youtube.com/watch?v=gju4CyAsMhI +https://youtube.com/watch?v=w9PXnACu9jo +https://youtube.com/watch?v=f2Exzqu2ocs +https://youtube.com/watch?v=TIwKZLcQM0E +https://youtube.com/watch?v=fQPS2sk1VTY +https://youtube.com/watch?v=3tthIHXUsPs +https://youtube.com/watch?v=hRjQmIqA1dY +https://youtube.com/watch?v=vvgLilGV-es +https://youtube.com/watch?v=CbxuXq_981s +https://youtube.com/watch?v=lB8Nkn3Xjes +https://youtube.com/watch?v=m3auI7AYoZA +https://youtube.com/watch?v=kc823UD0LeU +https://youtube.com/watch?v=61KfoldSxOA +https://youtube.com/watch?v=xH8R1Mt7IA8 +https://youtube.com/watch?v=a_2P4gxO7yo +https://youtube.com/watch?v=YbAE9HWha-k +https://youtube.com/watch?v=YWBZM5mztE4 +https://youtube.com/watch?v=zPIuQcr6SsQ +https://youtube.com/watch?v=r9_0u0porO8 +https://youtube.com/watch?v=A_wbMkk0gSs +https://youtube.com/watch?v=ODRWKGIxB4M +https://youtube.com/watch?v=l3zhOoDKVvs +https://youtube.com/watch?v=ckt4ScASUhg +https://youtube.com/watch?v=lrzd6R0PyoM +https://youtube.com/watch?v=3-FjESLZytk +https://youtube.com/watch?v=tLKA3CE_fsQ +https://youtube.com/watch?v=3B_UiWgbMRg +https://youtube.com/watch?v=TJJgWAqTHMU +https://youtube.com/watch?v=_yQl3C52Smw +https://youtube.com/watch?v=6OwYVg4n1Qk +https://youtube.com/watch?v=4IIgzZpuv6A +https://youtube.com/watch?v=OU87ugesC3Q +https://youtube.com/watch?v=0fpyrHJwag8 +https://youtube.com/watch?v=IX5P2v9jcQ0 +https://youtube.com/watch?v=xscn7s0PEcY +https://youtube.com/watch?v=RwPLmiwf9fM +https://youtube.com/watch?v=UL_7LMXHEyw +https://youtube.com/watch?v=gFccdvKehQI +https://youtube.com/watch?v=-tcAwyNlSjs +https://youtube.com/watch?v=oew35i9czi8 +https://youtube.com/watch?v=3R422tahouA +https://youtube.com/watch?v=PcvN28p7Fzc +https://youtube.com/watch?v=NoSD5rloyCI +https://youtube.com/watch?v=Sf6Ivae_88s +https://youtube.com/watch?v=j0bADL4UhBc +https://youtube.com/watch?v=jRAKHoKzgNg +https://youtube.com/watch?v=9eiOjNVdJmk +https://youtube.com/watch?v=otdh67EINMU +https://youtube.com/watch?v=BAMQ9QBgSdc +https://youtube.com/watch?v=IJ5jIOl957M +https://youtube.com/watch?v=ifwhV0FJiaY +https://youtube.com/watch?v=6TZvzU1MPM4 +https://youtube.com/watch?v=Fy15IulKtjw +https://youtube.com/watch?v=UIJRVG8yD1M +https://youtube.com/watch?v=1GqhBP2Pp6o +https://youtube.com/watch?v=enEZjjk77Nk +https://youtube.com/watch?v=AA8O9hvHPUo +https://youtube.com/watch?v=OHwm_TLgYJA +https://youtube.com/watch?v=JIRfMD9lvLg +https://youtube.com/watch?v=lHEZ3bQAUCU +https://youtube.com/watch?v=a633nyqWA48 +https://youtube.com/watch?v=8a3jr-Xn1GM +https://youtube.com/watch?v=8m4Uwttzuy4 +https://youtube.com/watch?v=9TL7Eo04a3A +https://youtube.com/watch?v=y3MeFrri9YI +https://youtube.com/watch?v=v5ZKmEjNnTw +https://youtube.com/watch?v=bz_bUjPMAAM +https://youtube.com/watch?v=hYkfQa3ZHM4 +https://youtube.com/watch?v=Pkb7d1gdBoM +https://youtube.com/watch?v=fyfMZSaw0i0 +https://youtube.com/watch?v=ddaKazRHyzU +https://youtube.com/watch?v=aw-PTVoblRk +https://youtube.com/watch?v=fGj77BrEgj4 +https://youtube.com/watch?v=irxgOdaykPE +https://youtube.com/watch?v=k4bBu9HD_Qo +https://youtube.com/watch?v=PwmXO0J-PAA +https://youtube.com/watch?v=Wz5_ktnCbvo +https://youtube.com/watch?v=uyGSe76rAJc +https://youtube.com/watch?v=JM07F5bYRhc +https://youtube.com/watch?v=r4byIiHc5Eg +https://youtube.com/watch?v=lECJ2bu0Kv8 +https://youtube.com/watch?v=hPn-TCxXjn0 +https://youtube.com/watch?v=Qq1nGVSRx4g +https://youtube.com/watch?v=J8YvzZsXghQ +https://youtube.com/watch?v=C1fU7KkI1Y0 +https://youtube.com/watch?v=LP5JaEJ5jHY +https://youtube.com/watch?v=DQYNM6SjD_o +https://youtube.com/watch?v=kyFD-YevcEM +https://youtube.com/watch?v=rRcSdOcUQPk +https://youtube.com/watch?v=z2uPKDXS8BA +https://youtube.com/watch?v=fbp8-Yr0gPs +https://youtube.com/watch?v=SkWOaOAd924 +https://youtube.com/watch?v=MH0lI2TSEVU +https://youtube.com/watch?v=Q8XkLrErSHw +https://youtube.com/watch?v=X09s37tJ09s +https://youtube.com/watch?v=dbAp5nphTz4 +https://youtube.com/watch?v=Pskx1w4rOEg +https://youtube.com/watch?v=Ai4kVwg1kkc +https://youtube.com/watch?v=ysqX8YKvtmU +https://youtube.com/watch?v=yhPNZKdVRh8 +https://youtube.com/watch?v=1SCOimBo5tg +https://youtube.com/watch?v=MgJ7v8D8iFE +https://youtube.com/watch?v=55EARrP_1w8 +https://youtube.com/watch?v=el9WpGaoLFw +https://youtube.com/watch?v=2t3z1jISiVc +https://youtube.com/watch?v=yi8ypj_2acE +https://youtube.com/watch?v=p4nhRyDZX90 +https://youtube.com/watch?v=FLQATzCyxfE +https://youtube.com/watch?v=FAsQ4nOJgO4 +https://youtube.com/watch?v=nujTVzx3hQU +https://youtube.com/watch?v=rReQoBp5d5c +https://youtube.com/watch?v=G_lNXzdowlU +https://youtube.com/watch?v=yOPLHA133m0 +https://youtube.com/watch?v=B1xyoRXt7K4 +https://youtube.com/watch?v=PFcboZcAzqg +https://youtube.com/watch?v=7K0akU-Rdv8 +https://youtube.com/watch?v=4zAThXFOy2c +https://youtube.com/watch?v=HP6qPkJq2hM +https://youtube.com/watch?v=H5jSwgcS7rY +https://youtube.com/watch?v=BrPK4huvorI +https://youtube.com/watch?v=jjm5p2zgQYo +https://youtube.com/watch?v=8_DqQ7CuCuQ +https://youtube.com/watch?v=tD3IVvPJUYs +https://youtube.com/watch?v=RWSaZ1ivz2M +https://youtube.com/watch?v=6ab86ynfedQ +https://youtube.com/watch?v=GwHpiBXDaj8 +https://youtube.com/watch?v=kWBNRCZlEk0 +https://youtube.com/watch?v=XOmI-7yVNNE +https://youtube.com/watch?v=m9lDtvaGQio +https://youtube.com/watch?v=eR8lqZuOCOg +https://youtube.com/watch?v=tghmK218P5E +https://youtube.com/watch?v=WSRVbSGacqs +https://youtube.com/watch?v=bozmKNFYaHQ +https://youtube.com/watch?v=OWSq240NXEY +https://youtube.com/watch?v=BlOk5wV0DRo +https://youtube.com/watch?v=DLokeU1Ck-Q +https://youtube.com/watch?v=9YyGCwvFm-U +https://youtube.com/watch?v=DRjOBvnpXVU +https://youtube.com/watch?v=Ja7PhPTG1JE +https://youtube.com/watch?v=ouWQ25O-Mcg +https://youtube.com/watch?v=_VVtOIzPg9Q +https://youtube.com/watch?v=rOuF3k_-asA +https://youtube.com/watch?v=HUAUsbbhRmc +https://youtube.com/watch?v=iYVPkqpS_Dw +https://youtube.com/watch?v=pyBNd_-F5Ts +https://youtube.com/watch?v=vwkYxPpmEPE +https://youtube.com/watch?v=FiyXZhhqWqc +https://youtube.com/watch?v=cgPRvCA5-PM +https://youtube.com/watch?v=My7bYa3podM +https://youtube.com/watch?v=awzNHuGqoMc +https://youtube.com/watch?v=zY6cMMtLCcQ +https://youtube.com/watch?v=KRw-55l_hw0 +https://youtube.com/watch?v=pxdOHJjjNek +https://youtube.com/watch?v=w2CELiObPeQ +https://youtube.com/watch?v=4Phu1jJhVT4 +https://youtube.com/watch?v=GzMJ6DvrXKE +https://youtube.com/watch?v=K8WlCqZPTeg +https://youtube.com/watch?v=Gdu8M2val_w +https://youtube.com/watch?v=8N8_CRpL6wk +https://youtube.com/watch?v=mpc3ffTLm_g +https://youtube.com/watch?v=zY9es8R4PD4 +https://youtube.com/watch?v=25AEc6dJbws +https://youtube.com/watch?v=EQY87ZICa9E +https://youtube.com/watch?v=heyIXXCfyaM +https://youtube.com/watch?v=KfDr_7LN-Ew +https://youtube.com/watch?v=GWVBRuGVlHI +https://youtube.com/watch?v=VrgCwAM06Yg +https://youtube.com/watch?v=3ealNayCkaU +https://youtube.com/watch?v=8IMn4c4MwM0 +https://youtube.com/watch?v=0uPHfQSe5rI +https://youtube.com/watch?v=QWVAJ7xqqGU +https://youtube.com/watch?v=Gz2oHRD2pF4 +https://youtube.com/watch?v=iUgQLz5y7QI +https://youtube.com/watch?v=vuha_SUwoBU +https://youtube.com/watch?v=cacL5jNJ87c +https://youtube.com/watch?v=hxcmik9Rs40 +https://youtube.com/watch?v=1FhRhzAWzLA +https://youtube.com/watch?v=wQfP1lcJ_eo +https://youtube.com/watch?v=cd1HS2Yf7Yw +https://youtube.com/watch?v=rNJwu-YkQlc +https://youtube.com/watch?v=h9YEWIpBQco +https://youtube.com/watch?v=gDWepmUXk3w +https://youtube.com/watch?v=UL0TTihpfxA +https://youtube.com/watch?v=e3lCzEOy5xs +https://youtube.com/watch?v=56m-t2PeKg8 +https://youtube.com/watch?v=k8JN4T8p8Pg +https://youtube.com/watch?v=0-yBejAuns4 +https://youtube.com/watch?v=YeLqgmVJk0Y +https://youtube.com/watch?v=l2gGXlW6wSY +https://youtube.com/watch?v=xQDbjIh3_Ts +https://youtube.com/watch?v=6LPDBZXgdA0 +https://youtube.com/watch?v=s-F0US5eKnY +https://youtube.com/watch?v=KoQrH6EMnas +https://youtube.com/watch?v=UkLp4S-x5b4 +https://youtube.com/watch?v=dV0eMaIFlvA +https://youtube.com/watch?v=6VQJHSnGIXk +https://youtube.com/watch?v=H10IyxaVwx8 +https://youtube.com/watch?v=-hVqG44A6No +https://youtube.com/watch?v=-GUWXF3LIy8 +https://youtube.com/watch?v=aRh-vBOS-dU +https://youtube.com/watch?v=dCN4QH2peJQ +https://youtube.com/watch?v=FDUOcHg5ijg +https://youtube.com/watch?v=xZjosn2u1gA +https://youtube.com/watch?v=4tjg5c7Wo4g +https://youtube.com/watch?v=TEotikBN5Bw +https://youtube.com/watch?v=-NPqM3vPDg8 +https://youtube.com/watch?v=QsRMlR0CUt8 +https://youtube.com/watch?v=_rHuitW9xDc +https://youtube.com/watch?v=eHVax41cwcM +https://youtube.com/watch?v=9n5G0qFBsHM +https://youtube.com/watch?v=hpKFRP05Po4 +https://youtube.com/watch?v=-XC3kiW6UNE +https://youtube.com/watch?v=o1C3mVUkAt8 +https://youtube.com/watch?v=31KOGb1MU4g +https://youtube.com/watch?v=wA0jkVfrhuI +https://youtube.com/watch?v=ZV1oQiRdoPc +https://youtube.com/watch?v=JXAgv665J14 +https://youtube.com/watch?v=ZhcjZjLOv38 +https://youtube.com/watch?v=3YfNFR6gh2E +https://youtube.com/watch?v=KmxaY_OVvWA +https://youtube.com/watch?v=usGv0gB2zEU +https://youtube.com/watch?v=ukick72Qafc +https://youtube.com/watch?v=T1pMmg4_FWU +https://youtube.com/watch?v=RYKnP-6cDWE +https://youtube.com/watch?v=gq2ZJ418ad8 +https://youtube.com/watch?v=I4keD5Qvya4 +https://youtube.com/watch?v=e4ujS1er1r0 +https://youtube.com/watch?v=eiBinM-f-Pk +https://youtube.com/watch?v=RM5aW83L_DE +https://youtube.com/watch?v=F7v2TmV3Zuc +https://youtube.com/watch?v=-R9GrGheMRw +https://youtube.com/watch?v=9RWm-IXjYz0 +https://youtube.com/watch?v=yHGPmbu3QNk +https://youtube.com/watch?v=DY9D01WPIN0 +https://youtube.com/watch?v=x5XvT8NMI8g +https://youtube.com/watch?v=etr7UtnUflM +https://youtube.com/watch?v=D6ablYH-rpw +https://youtube.com/watch?v=G2BWyY4B36Y +https://youtube.com/watch?v=lJIB_s_7dcw +https://youtube.com/watch?v=qebEy8p6pAY +https://youtube.com/watch?v=py5VdvxO9cE +https://youtube.com/watch?v=02J61h9eqAM +https://youtube.com/watch?v=7dtfBxUTXRY +https://youtube.com/watch?v=oiG-4-V7Xd0 +https://youtube.com/watch?v=R-onRguTLz0 +https://youtube.com/watch?v=JpZ82oU_UQc +https://youtube.com/watch?v=YNXq6Jxp3dM +https://youtube.com/watch?v=nTE4IS0NXxo +https://youtube.com/watch?v=Qt0_oPPK6eA +https://youtube.com/watch?v=ppC5bfJduhE +https://youtube.com/watch?v=7bRJLkNqNXI +https://youtube.com/watch?v=aFkcAH-m9W0 +https://youtube.com/watch?v=lALI9UXOv18 +https://youtube.com/watch?v=PMqUat-Oqsk + +# Generated by Discord.FM - rock-n-roll +https://youtube.com/watch?v=pR30knJs4Xk +https://youtube.com/watch?v=o1tj2zJ2Wvg +https://youtube.com/watch?v=nf0oXY4nDxE +https://youtube.com/watch?v=xhgE5bfcFTU +https://youtube.com/watch?v=KCy7lLQwToI +https://youtube.com/watch?v=7wRHBLwpASw +https://youtube.com/watch?v=Mke9EHMQMYI +https://youtube.com/watch?v=Qq4j1LtCdww +https://youtube.com/watch?v=hTWKbfoikeg +https://youtube.com/watch?v=BWrtrK1Q2EQ +https://youtube.com/watch?v=auLBLk4ibAk +https://youtube.com/watch?v=f3t9SfrfDZM +https://youtube.com/watch?v=ZXhuso4OTG4 +https://youtube.com/watch?v=zUwEIt9ez7M +https://youtube.com/watch?v=s4nWy8pmIM4 +https://youtube.com/watch?v=ye5BuYf8q4o +https://youtube.com/watch?v=TcJ-wNmazHQ +https://youtube.com/watch?v=qFhM1XZsh6o +https://youtube.com/watch?v=XwqMKf7r7Xg +https://youtube.com/watch?v=2X_2IdybTV0 +https://youtube.com/watch?v=MbXWrmQW-OE +https://youtube.com/watch?v=kyXz6eMCj2k +https://youtube.com/watch?v=BPwZaQfoIbU +https://youtube.com/watch?v=mAxUIjJrFKQ +https://youtube.com/watch?v=pEyBu0OiWtg +https://youtube.com/watch?v=dZEnQogAd8U +https://youtube.com/watch?v=qGaOlfmX8rQ +https://youtube.com/watch?v=TuCGiV-EVjA +https://youtube.com/watch?v=Vppbdf-qtGU +https://youtube.com/watch?v=aIM4gmho8P0 +https://youtube.com/watch?v=S7q_12tYZdA +https://youtube.com/watch?v=PdLIerfXuZ4 +https://youtube.com/watch?v=2Dq-k_jzEtI +https://youtube.com/watch?v=AQ4xwmZ6zi4 +https://youtube.com/watch?v=jACrmwTsi08 +https://youtube.com/watch?v=VZ5bS3_BCDs +https://youtube.com/watch?v=uXFxPN7Sqxo +https://youtube.com/watch?v=-jB_QM73Slk +https://youtube.com/watch?v=bJ9r8LMU9bQ +https://youtube.com/watch?v=8Zx6RXGNISk +https://youtube.com/watch?v=d8ekz_CSBVg +https://youtube.com/watch?v=ixZDTiXiHsc +https://youtube.com/watch?v=-U98qkjbYek +https://youtube.com/watch?v=okC4hw8IPYg +https://youtube.com/watch?v=QkSASi_eN_k +https://youtube.com/watch?v=A_WjRhKVftQ +https://youtube.com/watch?v=x7bIbVlIqEc +https://youtube.com/watch?v=d2GCp8vs168 +https://youtube.com/watch?v=uijnGTq4wgI +https://youtube.com/watch?v=P2LDMT7DsJ8 +https://youtube.com/watch?v=8Zf7lgMpTXA +https://youtube.com/watch?v=rKhQ2HZi8g8 +https://youtube.com/watch?v=jFi2ZM_7FnM +https://youtube.com/watch?v=yNnH1sN0dw8 +https://youtube.com/watch?v=lZiNtbgm9oM +https://youtube.com/watch?v=rDbVY3gCJgg +https://youtube.com/watch?v=acLYS3oDLEg +https://youtube.com/watch?v=sFz678yh_6U +https://youtube.com/watch?v=8-r-V0uK4u0 +https://youtube.com/watch?v=l5Zpmaz2OKE +https://youtube.com/watch?v=qHFxncb1gRY +https://youtube.com/watch?v=O7GroZ60UYc +https://youtube.com/watch?v=Dqok5m4lqeE +https://youtube.com/watch?v=GOJk0HW_hJw +https://youtube.com/watch?v=76k95Je3daw +https://youtube.com/watch?v=vpEwKz6YCEs +https://youtube.com/watch?v=5XfRjVo5wOE +https://youtube.com/watch?v=5MnDbWqe_kQ +https://youtube.com/watch?v=ZBsFntczDoM +https://youtube.com/watch?v=lrXIQQ8PeRs +https://youtube.com/watch?v=HndTMmVIKRc +https://youtube.com/watch?v=btPJPFnesV4 +https://youtube.com/watch?v=G-FpHV3xCJI +https://youtube.com/watch?v=v3H7oanysGg +https://youtube.com/watch?v=iC8oP4Z_xPw +https://youtube.com/watch?v=OjyZKfdwlng +https://youtube.com/watch?v=OuJUq58VQXQ +https://youtube.com/watch?v=fr6KVNt-1Ek +https://youtube.com/watch?v=3MutXUvS37k +https://youtube.com/watch?v=rMbATaj7Il8 +https://youtube.com/watch?v=1XHcPYorSJw +https://youtube.com/watch?v=fhxFXi4IQzE +https://youtube.com/watch?v=nEIcTstEmnQ +https://youtube.com/watch?v=Haypxj24_Uw +https://youtube.com/watch?v=KUv2zaj9mPs +https://youtube.com/watch?v=1etbYLm05W4 +https://youtube.com/watch?v=eHKqA5mkT7I +https://youtube.com/watch?v=UJor2jV_czE +https://youtube.com/watch?v=GqH21LEmfbQ +https://youtube.com/watch?v=cibZydv3XLM +https://youtube.com/watch?v=7mdIWaRi-7c +https://youtube.com/watch?v=gxEPV4kolz0 +https://youtube.com/watch?v=EErSKhC0CZs +https://youtube.com/watch?v=Red3R17FlUQ +https://youtube.com/watch?v=JsntlJZ9h1U +https://youtube.com/watch?v=cjqOsYRQI0o +https://youtube.com/watch?v=qYkbTyHXwbs +https://youtube.com/watch?v=fyHXlE9Z3m8 +https://youtube.com/watch?v=dJe1iUuAW4M +https://youtube.com/watch?v=_3rVtcm6pBE +https://youtube.com/watch?v=vFUJrg5GAvs +https://youtube.com/watch?v=LatorN4P9aA +https://youtube.com/watch?v=tNG62fULYgI +https://youtube.com/watch?v=MxGEVIvSFeY +https://youtube.com/watch?v=OMD8hBsA-RI +https://youtube.com/watch?v=2lLmYLw0WRI +https://youtube.com/watch?v=WhnZdSU2OlY +https://youtube.com/watch?v=5QkoOHvrViM +https://youtube.com/watch?v=2rxWPEdYCnI +https://youtube.com/watch?v=yK0P1Bk8Cx4 +https://youtube.com/watch?v=N4d7Wp9kKjA +https://youtube.com/watch?v=LD1BWcf8vhE +https://youtube.com/watch?v=OyQVjGdJ60g +https://youtube.com/watch?v=T3phscjgc_A +https://youtube.com/watch?v=ltrMfT4Qz5Y +https://youtube.com/watch?v=3pYNd0MSVXs +https://youtube.com/watch?v=eFTLKWw542g +https://youtube.com/watch?v=zpOULjyy-n8 +https://youtube.com/watch?v=5c1m2BAg2Sc +https://youtube.com/watch?v=XKc7z-enzmA +https://youtube.com/watch?v=SECVGN4Bsgg +https://youtube.com/watch?v=_izt7vlJKM0 +https://youtube.com/watch?v=BqDjMZKf-wg +https://youtube.com/watch?v=8ZIOkbrX_uU +https://youtube.com/watch?v=cOeKidp-iWo +https://youtube.com/watch?v=YkADj0TPrJA +https://youtube.com/watch?v=R-O3kYrDPbI +https://youtube.com/watch?v=OMOGaugKpzs +https://youtube.com/watch?v=KNIZofPB8ZM +https://youtube.com/watch?v=7v2GDbEmjGE +https://youtube.com/watch?v=aENX1Sf3fgQ +https://youtube.com/watch?v=svWINSRhQU0 +https://youtube.com/watch?v=ZfNR98ajB1U +https://youtube.com/watch?v=0Uc3ZrmhDN4 +https://youtube.com/watch?v=LTCyZvb2Uzw +https://youtube.com/watch?v=RKox6__hziY +https://youtube.com/watch?v=ZaLI1pRL11Y +https://youtube.com/watch?v=ayE6Shlv598 +https://youtube.com/watch?v=rGvR6s0yF3k +https://youtube.com/watch?v=8NsJ84YV1oA +https://youtube.com/watch?v=FTQbiNvZqaY +https://youtube.com/watch?v=MV0F_XiR48Q +https://youtube.com/watch?v=quMlRhlVR3I +https://youtube.com/watch?v=IwSTe9uit48 +https://youtube.com/watch?v=i3MXiTeH_Pg +https://youtube.com/watch?v=ij1AJRymxvA +https://youtube.com/watch?v=jxcZAHTyVCI +https://youtube.com/watch?v=62XB9IbMnxQ +https://youtube.com/watch?v=raNGeq3_DtM +https://youtube.com/watch?v=Th3ycKQV_4k +https://youtube.com/watch?v=r3g1kPGDcbc +https://youtube.com/watch?v=p5rQHoaQpTw +https://youtube.com/watch?v=buadfz2qcbY +https://youtube.com/watch?v=qqszqHKIqEk +https://youtube.com/watch?v=CdqoNKCCt7A +https://youtube.com/watch?v=t1TcDHrkQYg +https://youtube.com/watch?v=IAmgTNATJkk +https://youtube.com/watch?v=5eAQa4MOGkE +https://youtube.com/watch?v=Sx3kpa51EyY +https://youtube.com/watch?v=SRvCvsRp5ho +https://youtube.com/watch?v=lDK9QqIzhwk +https://youtube.com/watch?v=RY7S6EgSlCI +https://youtube.com/watch?v=ye-MwxuXfeo +https://youtube.com/watch?v=QGTzMvXTUiY +https://youtube.com/watch?v=fwtzUvcJIPw +https://youtube.com/watch?v=K1b8AhIsSYQ +https://youtube.com/watch?v=FgDU17xqNXo +https://youtube.com/watch?v=c1f7eZ8cHpM +https://youtube.com/watch?v=VMnjF1O4eH0 +https://youtube.com/watch?v=0CVLVaBECuc +https://youtube.com/watch?v=h04CH9YZcpI +https://youtube.com/watch?v=C11MzbEcHlw +https://youtube.com/watch?v=3QGMCSCFoKA +https://youtube.com/watch?v=YoDh_gHDvkk +https://youtube.com/watch?v=9TcztyNlFx0 +https://youtube.com/watch?v=u4xp2lgiAjY +https://youtube.com/watch?v=JSUIQgEVDM4 +https://youtube.com/watch?v=Sx3Tv0ESXOM +https://youtube.com/watch?v=rrSdXtFJG20 +https://youtube.com/watch?v=xl7Hd2r0LOs +https://youtube.com/watch?v=pJyQpAiMXkg +https://youtube.com/watch?v=rnKFtJB0ALc +https://youtube.com/watch?v=6VxoXn-0Ezs +https://youtube.com/watch?v=xF9J06CAXm8 +https://youtube.com/watch?v=eyhMgXmR3w4 +https://youtube.com/watch?v=zg21Rkew874 +https://youtube.com/watch?v=lNDe0kEKrqY +https://youtube.com/watch?v=eYEgYVyBDuM +https://youtube.com/watch?v=mjwV5w0IrcA +https://youtube.com/watch?v=deB_u-to-IE +https://youtube.com/watch?v=Ww-qVcLm97c +https://youtube.com/watch?v=RbMS0BzOMV0 +https://youtube.com/watch?v=KUwjNBjqR-c +https://youtube.com/watch?v=x2KRpRMSu4g +https://youtube.com/watch?v=zSQp7YOPdJ8 +https://youtube.com/watch?v=Eab_beh07HU +https://youtube.com/watch?v=T0spkrwl9Qk +https://youtube.com/watch?v=Al8UHnjusq0 +https://youtube.com/watch?v=DDOL7iY8kfo +https://youtube.com/watch?v=nA7ZyJqq5WI +https://youtube.com/watch?v=NsLyI1_R01M +https://youtube.com/watch?v=QQLWF_ItzYs +https://youtube.com/watch?v=ooYjf95rATg +https://youtube.com/watch?v=rgczlrYM4eI +https://youtube.com/watch?v=oOg5VxrRTi0 +https://youtube.com/watch?v=Bl4dEAtxo0M +https://youtube.com/watch?v=2OlAx4Dok38 +https://youtube.com/watch?v=OCwigPhpiXs +https://youtube.com/watch?v=2MVplfdNC6E +https://youtube.com/watch?v=pQ9pYwCKopE +https://youtube.com/watch?v=oYXqb6x50lA +https://youtube.com/watch?v=1VaEdKwXJhM +https://youtube.com/watch?v=sZLKtjATZt0 +https://youtube.com/watch?v=vyGzPmgR1QY +https://youtube.com/watch?v=i2RKWJD5ops +https://youtube.com/watch?v=rsMW3VSHAKg +https://youtube.com/watch?v=rCp2h5jslKY +https://youtube.com/watch?v=y2oKRKZnEoA +https://youtube.com/watch?v=wdCJRybAtso +https://youtube.com/watch?v=ttR9Hek6MyA +https://youtube.com/watch?v=oxKCPjcvbys +https://youtube.com/watch?v=D2qAj2XnLYo +https://youtube.com/watch?v=6Whgn_iE5uc +https://youtube.com/watch?v=aS_sAa37xag +https://youtube.com/watch?v=lrfhf1Gv4Tw +https://youtube.com/watch?v=YH5Arbm47IQ +https://youtube.com/watch?v=82cJgPXU-ik +https://youtube.com/watch?v=ZDwotNLyz10 +https://youtube.com/watch?v=XjV0z3Rf-ac +https://youtube.com/watch?v=4PvN7ujfj2w +https://youtube.com/watch?v=e5MAg_yWsq8 +https://youtube.com/watch?v=p1Y-rfbzmgY +https://youtube.com/watch?v=Oextk-If8HQ +https://youtube.com/watch?v=bjPqsDU0j2I +https://youtube.com/watch?v=OZuW6BH_Vak +https://youtube.com/watch?v=3T1c7GkzRQQ +https://youtube.com/watch?v=siMFORx8uO8 +https://youtube.com/watch?v=LFQMk6WWcoM +https://youtube.com/watch?v=SSR6ZzjDZ94 +https://youtube.com/watch?v=Dy4HA3vUv2c +https://youtube.com/watch?v=DohRa9lsx0Q +https://youtube.com/watch?v=rwYU8jq6Qw0 +https://youtube.com/watch?v=9jK-NcRmVcw +https://youtube.com/watch?v=CQ5_QxwFjNI +https://youtube.com/watch?v=wIjUY3pjN8E +https://youtube.com/watch?v=mIjZE4kcg_Q +https://youtube.com/watch?v=wyQUCYl-ocs +https://youtube.com/watch?v=FQ2yXWi0ppw +https://youtube.com/watch?v=djV11Xbc914 +https://youtube.com/watch?v=HP_NE4XZGAc +https://youtube.com/watch?v=htgr3pvBr-I +https://youtube.com/watch?v=hQo1HIcSVtg +https://youtube.com/watch?v=RVJiwyg0iDM +https://youtube.com/watch?v=hHRNSeuvzlM +https://youtube.com/watch?v=6ul-cZyuYq4 +https://youtube.com/watch?v=EvuL5jyCHOw +https://youtube.com/watch?v=0j6d7VeYvdQ +https://youtube.com/watch?v=LcMSFZZ-erw +https://youtube.com/watch?v=FsglRLoUdtc +https://youtube.com/watch?v=4dOsbsuhYGQ +https://youtube.com/watch?v=s71Em_Po2ZY +https://youtube.com/watch?v=9meo3vazXcw +https://youtube.com/watch?v=iP8_Dbvpi-A +https://youtube.com/watch?v=rj__jhmPMgI +https://youtube.com/watch?v=JE-dqW4uBEE +https://youtube.com/watch?v=jlV3zeWnWZY +https://youtube.com/watch?v=zSAJ0l4OBHM +https://youtube.com/watch?v=9C1BCAgu2I8 +https://youtube.com/watch?v=mrZRURcb1cM +https://youtube.com/watch?v=ySWVxTNUu0c +https://youtube.com/watch?v=waLhF-tFv-Q +https://youtube.com/watch?v=MNqqs4h4M7c +https://youtube.com/watch?v=OlKaVFqxERk +https://youtube.com/watch?v=-sftw5k_JRs +https://youtube.com/watch?v=ztYl3nmq3uM +https://youtube.com/watch?v=aUzBgeI5dpc +https://youtube.com/watch?v=Ygv7C3nyN0w +https://youtube.com/watch?v=fjgCqbPGq2A +https://youtube.com/watch?v=4fWyzwo1xg0 +https://youtube.com/watch?v=k_0U3DlLFSU +https://youtube.com/watch?v=Gu2pVPWGYMQ +https://youtube.com/watch?v=clJb4zx0o1o +https://youtube.com/watch?v=BOKQFTH5w5I +https://youtube.com/watch?v=46Cfrl7hMoQ +https://youtube.com/watch?v=oZdiXvDU4P0 +https://youtube.com/watch?v=SBjQ9tuuTJQ +https://youtube.com/watch?v=77R1Wp6Y_5Y +https://youtube.com/watch?v=7uy0ldI_1HA +https://youtube.com/watch?v=bNCT6pA5I9A +https://youtube.com/watch?v=RRKJiM9Njr8 +https://youtube.com/watch?v=_FrOQC-zEog +https://youtube.com/watch?v=yvPr9YV7-Xw +https://youtube.com/watch?v=hMr3KtYUCcI +https://youtube.com/watch?v=BGBM5vWiBLo +https://youtube.com/watch?v=yjoPWxmOCtc +https://youtube.com/watch?v=nDbeqj-1XOo +https://youtube.com/watch?v=DVQ3-Xe_suY +https://youtube.com/watch?v=ZiRuj2_czzw +https://youtube.com/watch?v=jQUDiCiNlqQ +https://youtube.com/watch?v=nEVDZl5UvN4 +https://youtube.com/watch?v=gDbAtWpoA6k +https://youtube.com/watch?v=K_PQ4fRQ5Kc +https://youtube.com/watch?v=La4Dcd1aUcE +https://youtube.com/watch?v=SEb8tuYhDBI +https://youtube.com/watch?v=8x2tG4X0cdc +https://youtube.com/watch?v=wV0ff1puRUg +https://youtube.com/watch?v=Z5-rdr0qhWk +https://youtube.com/watch?v=jl067ilGr54 +https://youtube.com/watch?v=X9FyQNx8oyU +https://youtube.com/watch?v=WwqHarJnQP8 +https://youtube.com/watch?v=LB5YkmjalDg +https://youtube.com/watch?v=97ECZMvbLxg +https://youtube.com/watch?v=x0q8Oho_RjM +https://youtube.com/watch?v=G9tenSy-vzo +https://youtube.com/watch?v=iPUmE-tne5U +https://youtube.com/watch?v=Hn-enjcgV1o +https://youtube.com/watch?v=bjrOcrisGyI +https://youtube.com/watch?v=IZr6AE-u2UM +https://youtube.com/watch?v=13GD78Bmo8s +https://youtube.com/watch?v=zueQ7Hz7l8s +https://youtube.com/watch?v=kLoskF32tCU + +# Generated by Discord.FM - metal-mix +https://youtube.com/watch?v=Hj2vU2nr5Jw +https://youtube.com/watch?v=gkhwK6Wlod8 +https://youtube.com/watch?v=Fq3QmtV8vT0 +https://youtube.com/watch?v=_yNAABKD4IA +https://youtube.com/watch?v=iOKV9Stri_M +https://youtube.com/watch?v=jRGrNDV2mKc +https://youtube.com/watch?v=VAWjsVoDpm0 +https://youtube.com/watch?v=3moLkjvhEu0 +https://youtube.com/watch?v=3VNUyjRRjxM +https://youtube.com/watch?v=ySdLh_B3HjA +https://youtube.com/watch?v=5i7qZxICwgQ +https://youtube.com/watch?v=gqI-6xag8Mg +https://youtube.com/watch?v=zUzd9KyIDrM +https://youtube.com/watch?v=iywaBOMvYLI +https://youtube.com/watch?v=CSvFpBOe8eY +https://youtube.com/watch?v=8nW-IPrzM1g +https://youtube.com/watch?v=6fVE8kSM43I +https://youtube.com/watch?v=EqQuihD0hoI +https://youtube.com/watch?v=BvsMPOfblfg +https://youtube.com/watch?v=uY3LAFJbKyY +https://youtube.com/watch?v=xnKhsTXoKCI +https://youtube.com/watch?v=2vObp0vBDOY +https://youtube.com/watch?v=3IHWKU9V1lA +https://youtube.com/watch?v=wJuEjAo4ues +https://youtube.com/watch?v=gy8HPSIFXEM +https://youtube.com/watch?v=liW-kWFiXtQ +https://youtube.com/watch?v=BHRyMcH6WMM +https://youtube.com/watch?v=CSJXle3LP_Q +https://youtube.com/watch?v=tczU6OWoUkI +https://youtube.com/watch?v=K5jvUXij7nU +https://youtube.com/watch?v=Evc3Xtc84N0 +https://youtube.com/watch?v=9ZGt4JVX860 +https://youtube.com/watch?v=OLqNFjLsJLk +https://youtube.com/watch?v=qw2LU1yS7aw +https://youtube.com/watch?v=emNahB_96JY +https://youtube.com/watch?v=LEb2ap6rELA +https://youtube.com/watch?v=1Qt3QbEzq7Q +https://youtube.com/watch?v=9YGL3amPmyc +https://youtube.com/watch?v=kOaqcfTZgno +https://youtube.com/watch?v=ZkW-K5RQdzo +https://youtube.com/watch?v=YIqbdnaPcT8 +https://youtube.com/watch?v=D79peD6i-rw +https://youtube.com/watch?v=01fttIlMgIg +https://youtube.com/watch?v=VDsaNnQnd7U +https://youtube.com/watch?v=IHS3qJdxefY +https://youtube.com/watch?v=86iJ-JbP9xo +https://youtube.com/watch?v=5abamRO41fE +https://youtube.com/watch?v=AGzIcLfRMcY +https://youtube.com/watch?v=1JZGFjufJEY +https://youtube.com/watch?v=Z5ou8N3U8yg +https://youtube.com/watch?v=RFc-2aNZ6VY +https://youtube.com/watch?v=pwu4v7VV5Hc +https://youtube.com/watch?v=7q2bNqe0Xyk +https://youtube.com/watch?v=A-TO-L1Escc +https://youtube.com/watch?v=b1RKaRgVFKk +https://youtube.com/watch?v=E-S9ErhqPSo +https://youtube.com/watch?v=U400PmUJWXs +https://youtube.com/watch?v=IxhtvzzfstE +https://youtube.com/watch?v=89q0LjmwXwk +https://youtube.com/watch?v=Auuqlcom6tM +https://youtube.com/watch?v=0pKlvG4XWAg +https://youtube.com/watch?v=36PSBsiSszw +https://youtube.com/watch?v=vcf7DnHi54g +https://youtube.com/watch?v=71BCqL2ecoE +https://youtube.com/watch?v=9gsAz6S_zSw +https://youtube.com/watch?v=xJzE1m9aELk +https://youtube.com/watch?v=l9VFg44H2z8 +https://youtube.com/watch?v=mk0PdLZqZqU +https://youtube.com/watch?v=heDGwljdmvM +https://youtube.com/watch?v=sXYIxJScSik +https://youtube.com/watch?v=9WjNGF9_go0 +https://youtube.com/watch?v=DelhLppPSxY +https://youtube.com/watch?v=UcGvCE0nGG4 +https://youtube.com/watch?v=x3HRaDov0Qg +https://youtube.com/watch?v=yg8VFMZ6_g8 +https://youtube.com/watch?v=aUWCrCXiVpA +https://youtube.com/watch?v=4ACe9IDkJo0 +https://youtube.com/watch?v=5c2nqRf1QOY +https://youtube.com/watch?v=bFGbVCs9Awo +https://youtube.com/watch?v=qBCMg6R2bwA +https://youtube.com/watch?v=aRL7P_D1dOo +https://youtube.com/watch?v=3Ji17cLVsUU +https://youtube.com/watch?v=xETgd1pROaA +https://youtube.com/watch?v=B66l1S0E70I +https://youtube.com/watch?v=u_VsvZmIWxY +https://youtube.com/watch?v=S9Qrvxa-n20 +https://youtube.com/watch?v=sqLdyZBjZeo +https://youtube.com/watch?v=LydRLQnXZmc +https://youtube.com/watch?v=He4YV1uqwfs +https://youtube.com/watch?v=RqD09X6KlEw +https://youtube.com/watch?v=81S2mEHkTwg +https://youtube.com/watch?v=xmOOGeZE-aE +https://youtube.com/watch?v=TkzK2jubKeA +https://youtube.com/watch?v=4Rog8XY8oxg +https://youtube.com/watch?v=ijPWBALdFcY +https://youtube.com/watch?v=qw5G6fF-wqQ +https://youtube.com/watch?v=TZnjF8c1lEY +https://youtube.com/watch?v=qRF0aAGnJOw +https://youtube.com/watch?v=71tyUqMZOSc +https://youtube.com/watch?v=MiCPrYdraL4 +https://youtube.com/watch?v=xqKwozw9Tww +https://youtube.com/watch?v=B1Bi1c9LmhU +https://youtube.com/watch?v=0Hvv6BXdQiU +https://youtube.com/watch?v=LrKMDRBQgaI +https://youtube.com/watch?v=L182WF235i4 +https://youtube.com/watch?v=I4KXMyb-aGY +https://youtube.com/watch?v=-oVW8gcse4g +https://youtube.com/watch?v=8ZmAKMtd58w +https://youtube.com/watch?v=hNmW-QA_kmU +https://youtube.com/watch?v=Yvwo8f3SXKA +https://youtube.com/watch?v=ZVinwOpllQk +https://youtube.com/watch?v=vpL2sWLwEtU +https://youtube.com/watch?v=NSPv6Fa0cyY +https://youtube.com/watch?v=lo62kvjLHvY +https://youtube.com/watch?v=BSINdbWPtss +https://youtube.com/watch?v=QrV61ATP3Ec +https://youtube.com/watch?v=bg92QpjRcJk +https://youtube.com/watch?v=9opx_afte0I +https://youtube.com/watch?v=1FCyvV5V8Jo +https://youtube.com/watch?v=GM_qKlltwt4 +https://youtube.com/watch?v=E8zlthr2-xA +https://youtube.com/watch?v=du9LCbYq9Wo +https://youtube.com/watch?v=a_7TMeDTX_U +https://youtube.com/watch?v=EjP1w3MIZsg +https://youtube.com/watch?v=_lAsCaj_nVs +https://youtube.com/watch?v=J51LPlP-s9o +https://youtube.com/watch?v=zr-j001aHE0 +https://youtube.com/watch?v=f0Hm79q4M-U +https://youtube.com/watch?v=ECQ2kVpzpLA +https://youtube.com/watch?v=I-QaFWURsMU +https://youtube.com/watch?v=bXbTtU252yM +https://youtube.com/watch?v=c8qrwON1-zE +https://youtube.com/watch?v=9sTQ0QdkN3Q +https://youtube.com/watch?v=cU4GXgaCFTI +https://youtube.com/watch?v=lRt54xjIq7w +https://youtube.com/watch?v=CGC2YvtXiRc +https://youtube.com/watch?v=3kLafYgKCTU +https://youtube.com/watch?v=am-Y0cuz0mw +https://youtube.com/watch?v=xo-1iAsqmQI +https://youtube.com/watch?v=lQ4IRzwi_Gg +https://youtube.com/watch?v=qrVKmTPFYZ8 +https://youtube.com/watch?v=ZNbaZMMCaD8 +https://youtube.com/watch?v=MmAtwvZYTe8 +https://youtube.com/watch?v=EK4Wd8mD8CA +https://youtube.com/watch?v=m0J7XnbUN5o +https://youtube.com/watch?v=EhGEGIBGLu8 +https://youtube.com/watch?v=rjCBV6o_DSE +https://youtube.com/watch?v=5hDs6mCVAKs +https://youtube.com/watch?v=u5Xe4EvTN_U +https://youtube.com/watch?v=uyj8j8Yaeeg +https://youtube.com/watch?v=NbLMrce7OJI +https://youtube.com/watch?v=9d4ui9q7eDM +https://youtube.com/watch?v=MVM8DUhdLyo +https://youtube.com/watch?v=cSOnn1gspjs +https://youtube.com/watch?v=82CTtc72s4k +https://youtube.com/watch?v=NPX5H8N1a94 +https://youtube.com/watch?v=NUDls2PgDUY +https://youtube.com/watch?v=ZPzsx3AdHpw +https://youtube.com/watch?v=sIPdH7vLmgQ +https://youtube.com/watch?v=gbw62iCsS34 +https://youtube.com/watch?v=GTN2oKj4kmM +https://youtube.com/watch?v=L397TWLwrUU +https://youtube.com/watch?v=QdGD3Ukb3Q0 +https://youtube.com/watch?v=QIFVzhWRjDM +https://youtube.com/watch?v=433S3tuuB94 +https://youtube.com/watch?v=5s7_WbiR79E +https://youtube.com/watch?v=hkXHsK4AQPs +https://youtube.com/watch?v=9MKJNZS3kGk +https://youtube.com/watch?v=6WEHRveRhU4 +https://youtube.com/watch?v=-w2m-TeLi6I +https://youtube.com/watch?v=NmIBSeFhnfc +https://youtube.com/watch?v=qUlK3S_9IOo +https://youtube.com/watch?v=iVzahm7HAJg +https://youtube.com/watch?v=C7NSUFDHFgg +https://youtube.com/watch?v=EMHLXMt-6Og +https://youtube.com/watch?v=dIs04P-B20Q +https://youtube.com/watch?v=NGTyKh_EqIc +https://youtube.com/watch?v=68SgSalvrVY +https://youtube.com/watch?v=y-LJIWMeLNY +https://youtube.com/watch?v=ThwSWIXhiRw +https://youtube.com/watch?v=3LlPC_PGgfQ +https://youtube.com/watch?v=5Hpa6MfcY8U +https://youtube.com/watch?v=YV4oYkIeGJc +https://youtube.com/watch?v=Z83TPaV_w74 +https://youtube.com/watch?v=WnAvNdVyJB0 +https://youtube.com/watch?v=5DccN_SId6A +https://youtube.com/watch?v=iVvXB-Vwnco +https://youtube.com/watch?v=757SiXkPlH4 +https://youtube.com/watch?v=d1lQ6E1a_-I +https://youtube.com/watch?v=46MALEk-7cE +https://youtube.com/watch?v=RZ_arKTDkmA +https://youtube.com/watch?v=a8BrqjFj48A +https://youtube.com/watch?v=66R8ayavwR4 +https://youtube.com/watch?v=DFdHhYha9t4 +https://youtube.com/watch?v=mS8LvHT_zcQ +https://youtube.com/watch?v=K6KSx3QO2DU +https://youtube.com/watch?v=W6CjO0H2j0s +https://youtube.com/watch?v=9P4Xcl2njCU +https://youtube.com/watch?v=IoX98MOBFHc +https://youtube.com/watch?v=1FirtNx9YR0 +https://youtube.com/watch?v=DECp8LKurKs +https://youtube.com/watch?v=DaHe4z9mA74 +https://youtube.com/watch?v=qdDOWUPzrWA +https://youtube.com/watch?v=fyRwfUw7ayg +https://youtube.com/watch?v=UwuDhK_EV5k +https://youtube.com/watch?v=2Kx1qiyK-Uo +https://youtube.com/watch?v=lSOMf8VTqnw +https://youtube.com/watch?v=oX4KTg3W3Bc +https://youtube.com/watch?v=N5irNnMNJqk +https://youtube.com/watch?v=0IxiUognQe0 +https://youtube.com/watch?v=eQcLWjHnBp0 +https://youtube.com/watch?v=pvkxxaFaT5Y +https://youtube.com/watch?v=bNY3pKJ0A-A +https://youtube.com/watch?v=VSKhPqvb0jw +https://youtube.com/watch?v=ZpbpOgUybBM +https://youtube.com/watch?v=DQ47U0sH3hY +https://youtube.com/watch?v=r-NhWrpfZQM +https://youtube.com/watch?v=CXHd-nsw6XY +https://youtube.com/watch?v=4vDjoLOAA6k +https://youtube.com/watch?v=VoAXB_Swj-Y +https://youtube.com/watch?v=V6BifoKqR-o +https://youtube.com/watch?v=qc98u-eGzlc +https://youtube.com/watch?v=vOd-T58qHLA +https://youtube.com/watch?v=2-DVhzFGXjE +https://youtube.com/watch?v=3y87bEqMUsw +https://youtube.com/watch?v=_Vq6NevcLOQ +https://youtube.com/watch?v=L0VPVawpN8E +https://youtube.com/watch?v=sOOebk_dKFo +https://youtube.com/watch?v=fNPGhxfbQxk +https://youtube.com/watch?v=1oTEQf1d9Iw +https://youtube.com/watch?v=7tNVaV96PuI +https://youtube.com/watch?v=j-qQ_brIsfY +https://youtube.com/watch?v=z-UJoY5WP5s +https://youtube.com/watch?v=tysmwGx7TNU +https://youtube.com/watch?v=3gmmi2SvMMk +https://youtube.com/watch?v=2DfYLar2QGI +https://youtube.com/watch?v=8CoGDjtBtVE +https://youtube.com/watch?v=FdBqOCS8LmM +https://youtube.com/watch?v=SMwT2V6TUSA +https://youtube.com/watch?v=HK_tNFzXmmI +https://youtube.com/watch?v=uivxr3O6rSE +https://youtube.com/watch?v=6WXBob7a9go +https://youtube.com/watch?v=FRW1mdm3CaI +https://youtube.com/watch?v=VNBWgtCTLfw +https://youtube.com/watch?v=-N0UcnswlUQ +https://youtube.com/watch?v=GVYl_hiD1oQ +https://youtube.com/watch?v=DEwk1ZEnBWE +https://youtube.com/watch?v=6NzD7zLww2A +https://youtube.com/watch?v=CW7OXRF7yGY +https://youtube.com/watch?v=fUja-wrQVgs +https://youtube.com/watch?v=mofmOWY3SKc +https://youtube.com/watch?v=fNWrgH6sVjc +https://youtube.com/watch?v=ORsGOVtRH5A +https://youtube.com/watch?v=aXzIeI0mkFI +https://youtube.com/watch?v=gx4jaqmTVRE +https://youtube.com/watch?v=NolrcYGVJ_A +https://youtube.com/watch?v=3nJrkXwAD3I +https://youtube.com/watch?v=KFFtzy1G27c +https://youtube.com/watch?v=ZDJEuZXw7ao +https://youtube.com/watch?v=qceX99lxee8 +https://youtube.com/watch?v=EC6gds4QVQE +https://youtube.com/watch?v=Z590mDXHpLk +https://youtube.com/watch?v=7RJsRQOneMY +https://youtube.com/watch?v=PL5ZyYJBU4c +https://youtube.com/watch?v=89rvBQwWUOc +https://youtube.com/watch?v=cvNaHKw9ydk +https://youtube.com/watch?v=iHKqbc_9Rc8 +https://youtube.com/watch?v=-TTaay0Z7Lw +https://youtube.com/watch?v=01uzWZsTH-M +https://youtube.com/watch?v=gA4E_2A4L3s +https://youtube.com/watch?v=BPjVLEaExTY +https://youtube.com/watch?v=iBdxN2oy8xM +https://youtube.com/watch?v=Uw1TGRj77kU +https://youtube.com/watch?v=1OK1HRqP-fg +https://youtube.com/watch?v=SeYpVif6AaI +https://youtube.com/watch?v=C-qXym0teh8 +https://youtube.com/watch?v=4YHu_DH1zfs +https://youtube.com/watch?v=BJXfe4eHDnQ +https://youtube.com/watch?v=5PyQ-e9lBdw +https://youtube.com/watch?v=XV_RZvtWNiM +https://youtube.com/watch?v=ATc8Jefnl-U +https://youtube.com/watch?v=1AfNOKQdY-U +https://youtube.com/watch?v=3ZlDZPYzfm4 +https://youtube.com/watch?v=3K_0GhyaTJc +https://youtube.com/watch?v=rWpTr-vVT-0 +https://youtube.com/watch?v=xO0scDfrcR0 +https://youtube.com/watch?v=1CcKbWhEluE +https://youtube.com/watch?v=SDDn4Kh65MA +https://youtube.com/watch?v=gRnWPnY1dgk +https://youtube.com/watch?v=8O317T6Zlno +https://youtube.com/watch?v=0L_iOnLNt9M +https://youtube.com/watch?v=f1PdUMHQAFE +https://youtube.com/watch?v=nq9j1qkj2Vc +https://youtube.com/watch?v=0K67veEPOYM +https://youtube.com/watch?v=SdJBgidYc0k +https://youtube.com/watch?v=Ax7cdHiZ010 +https://youtube.com/watch?v=Z4UfIAsnBBE +https://youtube.com/watch?v=Us2ylGAwBnk +https://youtube.com/watch?v=X-2yuGgp_U8 +https://youtube.com/watch?v=OzvasAJIHb4 + +# Generated by Discord.FM - retro-renegade +https://youtube.com/watch?v=c2orBsXp4HM +https://youtube.com/watch?v=ekawaLsryiU +https://youtube.com/watch?v=_sC6epraFkY +https://youtube.com/watch?v=Cao09dP7gM0 +https://youtube.com/watch?v=nw2qiR6f05Q +https://youtube.com/watch?v=mabK8AEGY3s +https://youtube.com/watch?v=e9f2sX3_JzM +https://youtube.com/watch?v=6hqxj-I9f8o +https://youtube.com/watch?v=LvcRvOp4Y8g +https://youtube.com/watch?v=xRkczJrr5mI +https://youtube.com/watch?v=5UUwc0llyEk +https://youtube.com/watch?v=wjKHEXsA7lg +https://youtube.com/watch?v=33dNh9H-o5c +https://youtube.com/watch?v=RF1rFSoN3JQ +https://youtube.com/watch?v=Em_B1AcfJL0 +https://youtube.com/watch?v=dnwdYWXuU4s +https://youtube.com/watch?v=YWQ0dBnl_7k +https://youtube.com/watch?v=yhviMWU_AxM +https://youtube.com/watch?v=9OquWmdUYXw +https://youtube.com/watch?v=ALq1ENqfu8E +https://youtube.com/watch?v=3bZfVORx54g +https://youtube.com/watch?v=eGynKE9eRAs +https://youtube.com/watch?v=1vBxDS0lliQ +https://youtube.com/watch?v=joNX2QJ7jto +https://youtube.com/watch?v=py_I6a9rUUI +https://youtube.com/watch?v=yRDmUeM4PQI +https://youtube.com/watch?v=TF5IETKtvGg +https://youtube.com/watch?v=kmI_VYPXub0 +https://youtube.com/watch?v=KGO0RcIDR8U +https://youtube.com/watch?v=5Unwj0PFwf4 +https://youtube.com/watch?v=izMEU4orFBU +https://youtube.com/watch?v=xPmAHhcWEvE +https://youtube.com/watch?v=ryhybXuK1r0 +https://youtube.com/watch?v=00vYncpl0pk +https://youtube.com/watch?v=hzGmbwS_Drs +https://youtube.com/watch?v=Zpu861-LpCE +https://youtube.com/watch?v=4ILeW9CMfBA +https://youtube.com/watch?v=VUTUuAoBFPk +https://youtube.com/watch?v=55mbyhqIcNo +https://youtube.com/watch?v=wkFhhnApeF4 +https://youtube.com/watch?v=1VNyQgGSXzQ +https://youtube.com/watch?v=O9WPbCmLmD4 +https://youtube.com/watch?v=C8uAc-oCtR8 +https://youtube.com/watch?v=4qsWFFuYZYI +https://youtube.com/watch?v=4Yi9fb4pyTc +https://youtube.com/watch?v=9TTnTu3ql_g +https://youtube.com/watch?v=iCNfYjZ26ow +https://youtube.com/watch?v=oSeQ1_QNf-c +https://youtube.com/watch?v=euTyRhnqFtA +https://youtube.com/watch?v=I7e-65ziIe0 +https://youtube.com/watch?v=6kHckkkJI9o +https://youtube.com/watch?v=nY3ac_FkoSw +https://youtube.com/watch?v=tU5zyCQb1Wk +https://youtube.com/watch?v=cUDuKLNB8Ec +https://youtube.com/watch?v=c92bEgiFAF4 +https://youtube.com/watch?v=9BoWlVmlQa0 +https://youtube.com/watch?v=o0vDydAHGp0 +https://youtube.com/watch?v=wuCHmGbve0c +https://youtube.com/watch?v=mgE398yDoPA +https://youtube.com/watch?v=IcYpQLyHsxc +https://youtube.com/watch?v=s7RRgF5Ve_E +https://youtube.com/watch?v=QyPR77rg1to +https://youtube.com/watch?v=OSPbX0lkTmQ +https://youtube.com/watch?v=JRU6GnETSN4 +https://youtube.com/watch?v=W1i4mTyidOc +https://youtube.com/watch?v=xflkF-sqNaM +https://youtube.com/watch?v=FKdtstAo6iU +https://youtube.com/watch?v=woPff-Tpkns +https://youtube.com/watch?v=zdeZwAk6ULE +https://youtube.com/watch?v=Zzo6L3wsf8c +https://youtube.com/watch?v=dtYwq4aBr0E +https://youtube.com/watch?v=ShK_Tj-Ee3Y +https://youtube.com/watch?v=JQ8bpWkoC7A +https://youtube.com/watch?v=VH6HIHmhvQU +https://youtube.com/watch?v=PPapt88_3aU +https://youtube.com/watch?v=XxMf4BdVq_g +https://youtube.com/watch?v=eijdNQMYikY +https://youtube.com/watch?v=Z51lfE2k7jU +https://youtube.com/watch?v=N3epEVMNJdY +https://youtube.com/watch?v=nu_ruGyTNEs +https://youtube.com/watch?v=ewxyxByJPP0 +https://youtube.com/watch?v=PLDyWLbuptQ +https://youtube.com/watch?v=qrBB3_rFPjg +https://youtube.com/watch?v=xG2AtyD3elY +https://youtube.com/watch?v=9uwEAugeH8w +https://youtube.com/watch?v=P0PpyUsvT9w +https://youtube.com/watch?v=qzQyP99Q0pE +https://youtube.com/watch?v=YZ3XjVVNagU +https://youtube.com/watch?v=gTCSQevpuOg +https://youtube.com/watch?v=tDuEWw648jo +https://youtube.com/watch?v=2TgO-tN5wAM +https://youtube.com/watch?v=YivzBeEwzWI +https://youtube.com/watch?v=hMa4hZQbrms +https://youtube.com/watch?v=yWjavxcGfqM +https://youtube.com/watch?v=tz82xbLvK_k +https://youtube.com/watch?v=mZRP7nQkfrM +https://youtube.com/watch?v=WgRfPc1lfJk +https://youtube.com/watch?v=x_P5smsopK0 +https://youtube.com/watch?v=aWBtpBwzzdM +https://youtube.com/watch?v=VM83BpH2_3U +https://youtube.com/watch?v=Qet3zBfaM78 +https://youtube.com/watch?v=G8DpAL2B9MQ +https://youtube.com/watch?v=PThRzauX8pk +https://youtube.com/watch?v=lC_RwbN8h9s +https://youtube.com/watch?v=ZSEmhhyuktU +https://youtube.com/watch?v=EnDBauPSjLI +https://youtube.com/watch?v=1DWD_hEz4HI +https://youtube.com/watch?v=7SY2zTT9tos +https://youtube.com/watch?v=8zuiIENc7lE +https://youtube.com/watch?v=Ixb08g2ND5M +https://youtube.com/watch?v=tOlsYflFiEE +https://youtube.com/watch?v=85K4BI-GsGw +https://youtube.com/watch?v=WptSlwpJ5Jk +https://youtube.com/watch?v=ukVp9AN219A +https://youtube.com/watch?v=8JHiCljnMVs +https://youtube.com/watch?v=tqLgJ9puo_c +https://youtube.com/watch?v=eW6RBQQEfQM +https://youtube.com/watch?v=Y5ZMPJyxNLI +https://youtube.com/watch?v=UbHmYTbHlmA +https://youtube.com/watch?v=UyNllqk-4iM +https://youtube.com/watch?v=7en8t8gZBlo +https://youtube.com/watch?v=YfScJUuSV68 +https://youtube.com/watch?v=ddQpf8m4ij0 +https://youtube.com/watch?v=Bl62_UMR0qI +https://youtube.com/watch?v=kEE3LDIcXxk +https://youtube.com/watch?v=0CoZG3S_JzA +https://youtube.com/watch?v=ztOR6RpWjgY +https://youtube.com/watch?v=rrMueRMVsTM +https://youtube.com/watch?v=kcPtMyOPgBw +https://youtube.com/watch?v=JHqMxtYEArY +https://youtube.com/watch?v=36Yh5PMynrg +https://youtube.com/watch?v=cAMumZKiKRQ +https://youtube.com/watch?v=Zmd2nbHP5kQ +https://youtube.com/watch?v=wPqwxBnNxWU +https://youtube.com/watch?v=Y46QKkIjZwc +https://youtube.com/watch?v=V_c2pjuxWMM +https://youtube.com/watch?v=sSjyrEtVb6U +https://youtube.com/watch?v=jy1scistRy0 +https://youtube.com/watch?v=J67nkzoJ_2M +https://youtube.com/watch?v=OFgGAVBA2NY +https://youtube.com/watch?v=C4RkHNgUcxM +https://youtube.com/watch?v=umdi-RZ8ntM +https://youtube.com/watch?v=YjQ0tFIpAn8 +https://youtube.com/watch?v=o1ZNxTyD93Q +https://youtube.com/watch?v=nY9WcDbjMmE +https://youtube.com/watch?v=I9T4S2VbDw0 +https://youtube.com/watch?v=NF2ok3ktsl4 +https://youtube.com/watch?v=jPXGELbDmqA +https://youtube.com/watch?v=ojS_e7URi10 +https://youtube.com/watch?v=NLTkBltKlrM +https://youtube.com/watch?v=eLibL3JuhrA +https://youtube.com/watch?v=UvvsZalq5QA +https://youtube.com/watch?v=knPVJ9rj5dM +https://youtube.com/watch?v=_UZwzA9qr2I +https://youtube.com/watch?v=C68qUfkJYSI +https://youtube.com/watch?v=-C_7CHq6XsQ +https://youtube.com/watch?v=rT8k9N_K0Q8 +https://youtube.com/watch?v=JtnYO3-4zMg +https://youtube.com/watch?v=oge5XXXMcys +https://youtube.com/watch?v=N2P7nkAf030 +https://youtube.com/watch?v=MIe1LMMQ5m4 +https://youtube.com/watch?v=HWbE2mz68ZE +https://youtube.com/watch?v=J5fo4XpIYNk +https://youtube.com/watch?v=A_E-QcfWwSs +https://youtube.com/watch?v=d-DKo_pDaNE +https://youtube.com/watch?v=Y_XxFAJanhE +https://youtube.com/watch?v=EcTl3TFZwFg +https://youtube.com/watch?v=Zp9bb3MB4Qc +https://youtube.com/watch?v=LCP6ZviZjb0 +https://youtube.com/watch?v=jvPIdPSmf2A +https://youtube.com/watch?v=UXD6rTBj8ek +https://youtube.com/watch?v=hewBOkOuSts +https://youtube.com/watch?v=vhDToOmsKUo +https://youtube.com/watch?v=83jGCWCcBzc +https://youtube.com/watch?v=jCFdBhby0jc +https://youtube.com/watch?v=NnVx_6Mdsj4 +https://youtube.com/watch?v=aTBSQKh8teE +https://youtube.com/watch?v=FTrumdi55tA +https://youtube.com/watch?v=ObclY0UOj3c +https://youtube.com/watch?v=A4wYdsQ8_JY +https://youtube.com/watch?v=y0zqju5Eevc +https://youtube.com/watch?v=WYZs4ExdlfA +https://youtube.com/watch?v=h848dMB0LgU +https://youtube.com/watch?v=d7hghjDM7_I +https://youtube.com/watch?v=4X6UqQDmjBk +https://youtube.com/watch?v=OJvNVDn7BgU +https://youtube.com/watch?v=TyLNQsGTby8 +https://youtube.com/watch?v=bFQmrye0jss +https://youtube.com/watch?v=25m3Gk7mRQM +https://youtube.com/watch?v=uxiaYyRkxMQ +https://youtube.com/watch?v=JfxM1QCtvb4 +https://youtube.com/watch?v=1MVAIf-leiQ +https://youtube.com/watch?v=eA36OFxe-uY +https://youtube.com/watch?v=kRTJoouX2z8 +https://youtube.com/watch?v=C0j6pe043L4 +https://youtube.com/watch?v=Tp3qiOKuEBM +https://youtube.com/watch?v=twPSaCABakA +https://youtube.com/watch?v=P1YBW-rj_jk +https://youtube.com/watch?v=96AzlkwtRmc +https://youtube.com/watch?v=kMmpRcld1FU +https://youtube.com/watch?v=kDssUvBiHFk +https://youtube.com/watch?v=xYtBAbqJO9k +https://youtube.com/watch?v=D5o_UOPNaQQ +https://youtube.com/watch?v=avyasO9uqfo +https://youtube.com/watch?v=wAPpVplHiDE +https://youtube.com/watch?v=9lyRI_M8ZXE +https://youtube.com/watch?v=lS7_tcwsj4E +https://youtube.com/watch?v=TY-mhdPdtq0 +https://youtube.com/watch?v=8ir0d7bjMIk +https://youtube.com/watch?v=eV7YovopMxw +https://youtube.com/watch?v=slKNBP7VEvI +https://youtube.com/watch?v=zLcyg4Tq5uY +https://youtube.com/watch?v=wGFpMPgSbB4 +https://youtube.com/watch?v=iPe3LT37h-Y +https://youtube.com/watch?v=TNh7wxRsOyE +https://youtube.com/watch?v=ICJezWy9m8g +https://youtube.com/watch?v=KUTHBCpiU8Y +https://youtube.com/watch?v=CIZ1FIK3-HU +https://youtube.com/watch?v=PaQxdGtSjVA +https://youtube.com/watch?v=Xu04qI3BsBA +https://youtube.com/watch?v=P5ChKb_9JoY +https://youtube.com/watch?v=TVyBV_HC8eg +https://youtube.com/watch?v=Pb6KyewC_Vg +https://youtube.com/watch?v=afwK743PL2Y +https://youtube.com/watch?v=SIPGFhFPJhg +https://youtube.com/watch?v=wqAYMZSOQao +https://youtube.com/watch?v=uv85Ai8bwfA +https://youtube.com/watch?v=DI9weHFUtuk +https://youtube.com/watch?v=nUf07IdSPFQ +https://youtube.com/watch?v=4hAz3oI-VD0 +https://youtube.com/watch?v=336OIKnPA54 +https://youtube.com/watch?v=4rJFgTNiRuQ +https://youtube.com/watch?v=Q1kf-OJdvb4 +https://youtube.com/watch?v=WdVfnKCYdJ8 +https://youtube.com/watch?v=Yr0chA6MNAI +https://youtube.com/watch?v=zKtJHPSv0pI +https://youtube.com/watch?v=VM2UJ6E5D-U +https://youtube.com/watch?v=pfshXZRcQ2c +https://youtube.com/watch?v=6DB6hBRPsWc +https://youtube.com/watch?v=RzrT1iK2B0s +https://youtube.com/watch?v=8nBgXXHvKHU +https://youtube.com/watch?v=CZMWszd5SRk +https://youtube.com/watch?v=BxYzjjs6d1s +https://youtube.com/watch?v=Jxk9DqdYsJ4 +https://youtube.com/watch?v=2AZnFWbQB_Q +https://youtube.com/watch?v=-4vpdkEkup8 +https://youtube.com/watch?v=rq_F7lGOj7I +https://youtube.com/watch?v=Fupfr_eVLPo +https://youtube.com/watch?v=z26SXn-J9NY +https://youtube.com/watch?v=RJKIrqO1Zas +https://youtube.com/watch?v=gBC5cnFjPpU +https://youtube.com/watch?v=69wxutaRWO4 +https://youtube.com/watch?v=rt_H9qkzeMQ +https://youtube.com/watch?v=CaG0lnjaYNs +https://youtube.com/watch?v=nXgAj5KdAC0 +https://youtube.com/watch?v=Qd78OMGLkVA +https://youtube.com/watch?v=2sH-l2xN3gU +https://youtube.com/watch?v=decbYrsCjOk +https://youtube.com/watch?v=B7D0GKJDU3I +https://youtube.com/watch?v=ibjNly0E_gk +https://youtube.com/watch?v=ixA3SzX6uUc +https://youtube.com/watch?v=1yfxp1NhLIs +https://youtube.com/watch?v=8Tj3-bmDnS8 +https://youtube.com/watch?v=IbFEEfNE1YQ +https://youtube.com/watch?v=9NcPvmk4vfo +https://youtube.com/watch?v=jRpPp0RCh-4 +https://youtube.com/watch?v=Zjgst_cWtrs +https://youtube.com/watch?v=2SYYM78rjYQ +https://youtube.com/watch?v=e5lcETwAItA +https://youtube.com/watch?v=VQWeJYI033Q +https://youtube.com/watch?v=Q88wKrzj3QM +https://youtube.com/watch?v=wR3gaYTqkDQ +https://youtube.com/watch?v=f4ERRGkGtpo +https://youtube.com/watch?v=z6oOVUyCi6Y +https://youtube.com/watch?v=1MR5xe1z-eU +https://youtube.com/watch?v=aDlNMawir4o +https://youtube.com/watch?v=eZq5DdR_Aq4 +https://youtube.com/watch?v=9IPBuQI1GG0 +https://youtube.com/watch?v=oBllGsz-6Os +https://youtube.com/watch?v=ghPbv7HiNzY +https://youtube.com/watch?v=ZS5oJ2-MmEU +https://youtube.com/watch?v=_-NcLHvn2I0 +https://youtube.com/watch?v=LE_Lrs8LomE +https://youtube.com/watch?v=xLsuam9o9BA +https://youtube.com/watch?v=dBgfMPLX4GA + +# Generated by Discord.FM - hip-hop +https://youtube.com/watch?v=jvEQD2pzPBY +https://youtube.com/watch?v=REaZpu0_4WQ +https://youtube.com/watch?v=Wfsm9VrVsco +https://youtube.com/watch?v=kHhOfdLpKCg +https://youtube.com/watch?v=MmUeuXNtTDY +https://youtube.com/watch?v=tBQemP6AKSg +https://youtube.com/watch?v=QU4MkRugX2E +https://youtube.com/watch?v=WgEtUuEK-to +https://youtube.com/watch?v=G0qUMwlc9wM +https://youtube.com/watch?v=2Y5J3VUC9qM +https://youtube.com/watch?v=lsJLLEwUYZM +https://youtube.com/watch?v=paaFchdXAbc +https://youtube.com/watch?v=oeMCcZfhRqk +https://youtube.com/watch?v=fBOucGAkFAw +https://youtube.com/watch?v=YLs1oVbbaEg +https://youtube.com/watch?v=KTC72QoifDQ +https://youtube.com/watch?v=kiOZHPf3hYg +https://youtube.com/watch?v=K65gJEsqegE +https://youtube.com/watch?v=zIrhcTkHX_A +https://youtube.com/watch?v=ZFqw6zxd7J8 +https://youtube.com/watch?v=I2wrBy6PAxM +https://youtube.com/watch?v=46n2V4Py0Og +https://youtube.com/watch?v=4CZR50b3A9g +https://youtube.com/watch?v=Tp8h7L8Fi0o +https://youtube.com/watch?v=qiFHp-Ik3MQ +https://youtube.com/watch?v=hLj_n0pP7MM +https://youtube.com/watch?v=yHMuIDpL6KM +https://youtube.com/watch?v=jAVMElUXLi0 +https://youtube.com/watch?v=o59U6zVVnkU +https://youtube.com/watch?v=Lv-If1xZx80 +https://youtube.com/watch?v=A9nz5UxBZNc +https://youtube.com/watch?v=C8jRc7LWxB0 +https://youtube.com/watch?v=pJMtm4PuFwg +https://youtube.com/watch?v=omowNsoplUM +https://youtube.com/watch?v=dQlU0bJjQdU +https://youtube.com/watch?v=kufiqwix0tc +https://youtube.com/watch?v=EkkpRE660Ls +https://youtube.com/watch?v=i-zF8XQView +https://youtube.com/watch?v=HdWatPF782g +https://youtube.com/watch?v=d4GBuzLaz8c +https://youtube.com/watch?v=5RoUHTB8Ivc +https://youtube.com/watch?v=drsJ50vH6ro +https://youtube.com/watch?v=wk4ftn4PArg +https://youtube.com/watch?v=G_Alt8lzKcU +https://youtube.com/watch?v=rivFCwwvoh8 +https://youtube.com/watch?v=10yrPDf92hY +https://youtube.com/watch?v=ISy0Hl0SBfg +https://youtube.com/watch?v=XbGs_qK2PQA +https://youtube.com/watch?v=X1ZwaRVlNVY +https://youtube.com/watch?v=6Un9HLDCTCs +https://youtube.com/watch?v=eJO5HU_7_1w +https://youtube.com/watch?v=jh-cryHRew4 +https://youtube.com/watch?v=ICQ7JSCBZn0 +https://youtube.com/watch?v=_xAWiV4drB4 +https://youtube.com/watch?v=fJT3b4urwcU +https://youtube.com/watch?v=F4DSyzonCZc +https://youtube.com/watch?v=yQ84j8HuojY +https://youtube.com/watch?v=SvqoKFI7tfw +https://youtube.com/watch?v=sC2n3oOPOH4 +https://youtube.com/watch?v=i_gg9ttaaxI +https://youtube.com/watch?v=0b_9VQcnQZY +https://youtube.com/watch?v=JNrD-_VH0qM +https://youtube.com/watch?v=aeSA2kh9fhg +https://youtube.com/watch?v=ytQ5CYE1VZw +https://youtube.com/watch?v=r0_AmbzMedE +https://youtube.com/watch?v=Tz6OUIjtM6E +https://youtube.com/watch?v=ZEBGCOCxLgA +https://youtube.com/watch?v=jCDSZr2zzws +https://youtube.com/watch?v=-c3X91Ld-GU +https://youtube.com/watch?v=xRRen4nuVkg +https://youtube.com/watch?v=NnkLcBY8o1I +https://youtube.com/watch?v=PFVvgETFoUk +https://youtube.com/watch?v=fzSQG472L9k +https://youtube.com/watch?v=oUvQvP0FyJU +https://youtube.com/watch?v=4UXpe2n9TtM +https://youtube.com/watch?v=M2NIMHVmGwk +https://youtube.com/watch?v=pDlbsFmMB3E +https://youtube.com/watch?v=e6zqnVo4ArQ +https://youtube.com/watch?v=8mtA9GvpzwU +https://youtube.com/watch?v=8p9jSRxguAA +https://youtube.com/watch?v=UvVuEEPM3j0 +https://youtube.com/watch?v=mzGwHKIYo9c +https://youtube.com/watch?v=AfuCLp8VEng +https://youtube.com/watch?v=OG4ROzg78Bo +https://youtube.com/watch?v=xDDnSWdZJqM +https://youtube.com/watch?v=zpNrrdLo4Wk +https://youtube.com/watch?v=YbnhUVTTdHE +https://youtube.com/watch?v=6sRQ9q4hzv4 +https://youtube.com/watch?v=AlgvnoigyLE +https://youtube.com/watch?v=ZtdRdbjgPBc +https://youtube.com/watch?v=ExVtrghW5Y4 +https://youtube.com/watch?v=PobrSpMwKk4 +https://youtube.com/watch?v=pJJyKlRxyvA +https://youtube.com/watch?v=odBpBp3j1tI +https://youtube.com/watch?v=XbZR9JhGJ0Q +https://youtube.com/watch?v=QkZurfE8Gbc +https://youtube.com/watch?v=6MS-JqECvf4 +https://youtube.com/watch?v=8uC35poq1Zs +https://youtube.com/watch?v=1AZsIIX4k1c +https://youtube.com/watch?v=rT4wUByldo4 +https://youtube.com/watch?v=ERnVdMkIJtc +https://youtube.com/watch?v=oCd6SQ67k-Y +https://youtube.com/watch?v=XSbZidsgMfw +https://youtube.com/watch?v=TErySTMbFlk +https://youtube.com/watch?v=lj3eZQigvsI +https://youtube.com/watch?v=NtxmnBQmfZs +https://youtube.com/watch?v=yRfQGXFRr30 +https://youtube.com/watch?v=AGbMQ2efZPU +https://youtube.com/watch?v=h9_31bUYHvA +https://youtube.com/watch?v=czBPOwSZVys +https://youtube.com/watch?v=BQFrezbeL10 +https://youtube.com/watch?v=OwSpn4pmv9Q +https://youtube.com/watch?v=DnedDvXYr8A +https://youtube.com/watch?v=BLR_wRa0hXo +https://youtube.com/watch?v=JnNzq5Nl-dE +https://youtube.com/watch?v=VOL0-EE3ieY +https://youtube.com/watch?v=mOmsU91AxVg +https://youtube.com/watch?v=HkytRz29bE0 +https://youtube.com/watch?v=pcGGfojS58U +https://youtube.com/watch?v=q0rYiIiJusQ +https://youtube.com/watch?v=8uUk691o8BI +https://youtube.com/watch?v=L_Rn7UvP0yo +https://youtube.com/watch?v=B6-wjxeaTOY +https://youtube.com/watch?v=oihGlmD1r24 +https://youtube.com/watch?v=3jkb1dN3Ot8 +https://youtube.com/watch?v=MLedibUShaY +https://youtube.com/watch?v=Et_E4M4JgIU +https://youtube.com/watch?v=acdtvO-yHqQ +https://youtube.com/watch?v=jRn9BRo4Igw +https://youtube.com/watch?v=CxnaPa8ohmM +https://youtube.com/watch?v=LQrJHsWN7hc +https://youtube.com/watch?v=VRa_PwL2aws +https://youtube.com/watch?v=nYQPcD8MOoc +https://youtube.com/watch?v=0twahcMCgss +https://youtube.com/watch?v=cixIP4uv270 +https://youtube.com/watch?v=PqX1SkYpNJQ +https://youtube.com/watch?v=zOXaouay5Jk +https://youtube.com/watch?v=89F5fpvwPr0 +https://youtube.com/watch?v=ydWjQwvzxKw +https://youtube.com/watch?v=byODfQUUsEI +https://youtube.com/watch?v=monkG1OWZXA +https://youtube.com/watch?v=fV80H9rScSQ +https://youtube.com/watch?v=Lk1POuNuCnI +https://youtube.com/watch?v=b0g4BDl8ZiE +https://youtube.com/watch?v=rCpoMFbDAdM +https://youtube.com/watch?v=vtgZsq_oUvw +https://youtube.com/watch?v=P2rT2vw9i_k +https://youtube.com/watch?v=bQXj4ZtuwuI +https://youtube.com/watch?v=E4jkMB3OV_g +https://youtube.com/watch?v=-9r7ezjl1us +https://youtube.com/watch?v=K533gW3boIY +https://youtube.com/watch?v=pKh_ZHexNZQ +https://youtube.com/watch?v=ijy2GFWqeAs +https://youtube.com/watch?v=A2B5clYLtOc +https://youtube.com/watch?v=q0tnCdJQwTE +https://youtube.com/watch?v=imgYGfH2yNM +https://youtube.com/watch?v=lTpaBK5HYz4 +https://youtube.com/watch?v=9Zw2qMXqvxU +https://youtube.com/watch?v=SXEo-Z6JFVU +https://youtube.com/watch?v=B51pw1teuSg +https://youtube.com/watch?v=NK2FqPNIT_U +https://youtube.com/watch?v=fyfOvJ6ByIY +https://youtube.com/watch?v=QJQtXeUEH6s +https://youtube.com/watch?v=PGpgdQc4e0c +https://youtube.com/watch?v=qggxTtnKTMo +https://youtube.com/watch?v=yf9OAFML_Eg +https://youtube.com/watch?v=s9_HY6uZwVc +https://youtube.com/watch?v=LQLD3S8nhvs +https://youtube.com/watch?v=_srvHOu75vM +https://youtube.com/watch?v=FCbWLSZrZfw +https://youtube.com/watch?v=stoLqWXsIOY +https://youtube.com/watch?v=jId1L0gmoDY +https://youtube.com/watch?v=zVnlyC0ytgY +https://youtube.com/watch?v=aES4SbFTH2Y +https://youtube.com/watch?v=YPCwL__3Lss +https://youtube.com/watch?v=_KMywQHeDWI +https://youtube.com/watch?v=CtRbEgoTqQs +https://youtube.com/watch?v=igUsHrFqegE +https://youtube.com/watch?v=RMizZU12awo +https://youtube.com/watch?v=1ewkF_Al52o +https://youtube.com/watch?v=9rKmdRdNO7s +https://youtube.com/watch?v=8CPlF-IEkXQ +https://youtube.com/watch?v=cKutTL_KLig +https://youtube.com/watch?v=qjeAx2rSPy8 +https://youtube.com/watch?v=SW9H1b7zXUY +https://youtube.com/watch?v=J7IMwop3RHs +https://youtube.com/watch?v=sy7JwllhUR8 +https://youtube.com/watch?v=DWuBTLJdoJY +https://youtube.com/watch?v=-cDEQKl2EWM +https://youtube.com/watch?v=rZJXpZPFQaI +https://youtube.com/watch?v=nmte57oKe6U +https://youtube.com/watch?v=w_nGIhgggiM +https://youtube.com/watch?v=GwTmJ9KptfI +https://youtube.com/watch?v=OG6OWMsc4z0 +https://youtube.com/watch?v=gc2NgotkfWE +https://youtube.com/watch?v=JEHc4u-1QIk +https://youtube.com/watch?v=WUH9NaZI9eA +https://youtube.com/watch?v=wRZ6QyjGIEM +https://youtube.com/watch?v=pwHuEDCM7xs +https://youtube.com/watch?v=3mpAJjXSVUE +https://youtube.com/watch?v=F-4KiszXxHM +https://youtube.com/watch?v=T6QKqFPRZSA +https://youtube.com/watch?v=pR0VsbyZxWg +https://youtube.com/watch?v=CQkVPtWjfUk +https://youtube.com/watch?v=1plPyJdXKIY +https://youtube.com/watch?v=zQrdKtPJxI0 +https://youtube.com/watch?v=cg0XOi8AxJo +https://youtube.com/watch?v=gG_dA32oH44 +https://youtube.com/watch?v=nFF66bVgqvw +https://youtube.com/watch?v=67sDhNyuzLU +https://youtube.com/watch?v=hRK7PVJFbS8 +https://youtube.com/watch?v=i-YykLXxTzk +https://youtube.com/watch?v=m_ZDBLjicDw +https://youtube.com/watch?v=7LnEeRidcXw +https://youtube.com/watch?v=0eiJsI4kVJs +https://youtube.com/watch?v=A66LmUwXnGA +https://youtube.com/watch?v=E5s6jcuw6NM +https://youtube.com/watch?v=6jd0VICL4og +https://youtube.com/watch?v=uNTpPNo3LBg +https://youtube.com/watch?v=rKWjsa3fwpE +https://youtube.com/watch?v=_L2vJEb6lVE +https://youtube.com/watch?v=2lzD5NTs3l0 +https://youtube.com/watch?v=tNRAuzj2ImA +https://youtube.com/watch?v=SiYDJ432b0U +https://youtube.com/watch?v=9-kWlUbkHS4 +https://youtube.com/watch?v=AE0GC4tGZW0 +https://youtube.com/watch?v=Rv6bRHM8YMc +https://youtube.com/watch?v=oyveOd7jOx4 +https://youtube.com/watch?v=n1CLmap_CVU +https://youtube.com/watch?v=HDSksIctszk +https://youtube.com/watch?v=uPqnrQfm8oU +https://youtube.com/watch?v=TMZi25Pq3T8 +https://youtube.com/watch?v=PMbELEUfmIA +https://youtube.com/watch?v=t8gdslsaCkM +https://youtube.com/watch?v=duU1wKYexs4 +https://youtube.com/watch?v=lVehcuJXe6I +https://youtube.com/watch?v=WUN04IC9L3Y +https://youtube.com/watch?v=Be8nu4w-NS0 +https://youtube.com/watch?v=5souw4K5UQc +https://youtube.com/watch?v=QMdeUooDwzs +https://youtube.com/watch?v=wZYt2GTH5cs +https://youtube.com/watch?v=kWXAYDQ_K7k +https://youtube.com/watch?v=7l48bfQuJeE +https://youtube.com/watch?v=PlBTqsWJyas +https://youtube.com/watch?v=XsZDWNk_RIA +https://youtube.com/watch?v=kqjeNSNuNPM +https://youtube.com/watch?v=LsfoI96_rSo +https://youtube.com/watch?v=Gwfm9wuIj40 +https://youtube.com/watch?v=QsLAm_nrSyY +https://youtube.com/watch?v=p1h9PBQSCDY +https://youtube.com/watch?v=-4zXv6ys2t4 +https://youtube.com/watch?v=AmSvsQn2CP8 +https://youtube.com/watch?v=0_xZt5rt4u0 +https://youtube.com/watch?v=Y-PRLKaFU-M +https://youtube.com/watch?v=5aDpLYTcfVc +https://youtube.com/watch?v=oWNCXxBlZCw +https://youtube.com/watch?v=1dLTKcGx76w +https://youtube.com/watch?v=RnDwKSAp-Qs +https://youtube.com/watch?v=3LRmrpUV6iQ +https://youtube.com/watch?v=JiqNwliG0jo +https://youtube.com/watch?v=60l9vZf65AI +https://youtube.com/watch?v=ltGltaUs_S4 +https://youtube.com/watch?v=rz-_mstXfr0 +https://youtube.com/watch?v=gNPIOi2LiQk +https://youtube.com/watch?v=-59jGD4WrmE + +# Generated by Discord.FM - coffee-house-jazz +https://youtube.com/watch?v=vmDDOFXSgAs +https://youtube.com/watch?v=RPfFhfSuUZ4 +https://youtube.com/watch?v=ZrfzenYhv9w +https://youtube.com/watch?v=CWeXOm49kE0 +https://youtube.com/watch?v=qWG2dsXV5HI +https://youtube.com/watch?v=T5jFPrx51Dc +https://youtube.com/watch?v=WqEweV0eScg +https://youtube.com/watch?v=TDETNk20Vkc +https://youtube.com/watch?v=xISaCzXYYg8 +https://youtube.com/watch?v=N76ErzOdk9g +https://youtube.com/watch?v=Cx-TxiBi43c +https://youtube.com/watch?v=KV8Hj_E8LJc +https://youtube.com/watch?v=HmroWIcCNUI +https://youtube.com/watch?v=ujChUYkPvec +https://youtube.com/watch?v=h6NCx0wcrC4 +https://youtube.com/watch?v=xlAwFV0clcM +https://youtube.com/watch?v=I777BcgQL9o +https://youtube.com/watch?v=yXK0pZx92MU +https://youtube.com/watch?v=jUN01HYwRX4 +https://youtube.com/watch?v=KsAf0ra6Vd4 +https://youtube.com/watch?v=JIfdYs8WErM +https://youtube.com/watch?v=CTzRHq_cH5E +https://youtube.com/watch?v=mP0flneNfaQ +https://youtube.com/watch?v=6tBJa8Ew6fQ +https://youtube.com/watch?v=u23Etcb-L9M +https://youtube.com/watch?v=YjRbmtrDJI4 +https://youtube.com/watch?v=0rjP5MPA3qs +https://youtube.com/watch?v=fvJzCdgB3Tc +https://youtube.com/watch?v=1OKduoWWWsE +https://youtube.com/watch?v=36wafFjFdYs +https://youtube.com/watch?v=M69YdmAJoLs +https://youtube.com/watch?v=YmtHdBPzi_w +https://youtube.com/watch?v=FGT67EzVcfs +https://youtube.com/watch?v=qlIbs0mZYSA +https://youtube.com/watch?v=AL5G6QnW-ek +https://youtube.com/watch?v=J4X5folutT8 +https://youtube.com/watch?v=RJEjFh2FOzA +https://youtube.com/watch?v=2vOWMz1z7rk +https://youtube.com/watch?v=9b2AOlCGpKY +https://youtube.com/watch?v=p0PlMNt02Ck +https://youtube.com/watch?v=3rSNqhEWH9M +https://youtube.com/watch?v=iqhN6rvfJt4 +https://youtube.com/watch?v=a1WDW-swiAA +https://youtube.com/watch?v=8TdY6iqV2k0 +https://youtube.com/watch?v=IrVnm66joQk +https://youtube.com/watch?v=fvRkGglLe-U +https://youtube.com/watch?v=UA2XIWZxMKM +https://youtube.com/watch?v=s4rXEKtC8iY +https://youtube.com/watch?v=EMuyV5jSKl4 +https://youtube.com/watch?v=CsHtO_i4qzM +https://youtube.com/watch?v=5m2HN2y0yV8 +https://youtube.com/watch?v=p0AGYvMFdNo +https://youtube.com/watch?v=6WjW5orDM2c +https://youtube.com/watch?v=YjRWditGKRY +https://youtube.com/watch?v=jsFST-7Hx-Y +https://youtube.com/watch?v=eNWDwOsQqlw +https://youtube.com/watch?v=FB2P1oaP-gk +https://youtube.com/watch?v=W985hWD5KYg +https://youtube.com/watch?v=0Q7J4PgrRsY +https://youtube.com/watch?v=dH3GSrCmzC8 +https://youtube.com/watch?v=kOO8Gzr__zc +https://youtube.com/watch?v=q1z2BdvHVCk +https://youtube.com/watch?v=wylto0E63Q8 +https://youtube.com/watch?v=_3vpiTgG59A +https://youtube.com/watch?v=K_h1geOaLvY +https://youtube.com/watch?v=rsz6TE6t7-A +https://youtube.com/watch?v=KAlVasHbipo +https://youtube.com/watch?v=2FaMtXw2mRE +https://youtube.com/watch?v=Bm1NxfevGro +https://youtube.com/watch?v=w3TMe98FJDw +https://youtube.com/watch?v=II_LtoZGSVg +https://youtube.com/watch?v=or5qBh8Xbpc +https://youtube.com/watch?v=wA1ZelIbUfI +https://youtube.com/watch?v=Ae0nwSv6cTU +https://youtube.com/watch?v=lBbGRxSiYBs +https://youtube.com/watch?v=f60JYoHdfVM +https://youtube.com/watch?v=Lo18F5ObPng +https://youtube.com/watch?v=qagOblqhBhk +https://youtube.com/watch?v=JMiLAxMnoqE +https://youtube.com/watch?v=tNR7822K_40 +https://youtube.com/watch?v=CkyTS_-Pqqw +https://youtube.com/watch?v=0yQyjcpnx3g +https://youtube.com/watch?v=x8UcxgE21kM +https://youtube.com/watch?v=tu4o65SwUIw +https://youtube.com/watch?v=hbreWwFKQNg +https://youtube.com/watch?v=hLUyVyM626A +https://youtube.com/watch?v=zre0u5XyNfY +https://youtube.com/watch?v=k0FJ1SdS-ts +https://youtube.com/watch?v=fKb0Sc2lYVU +https://youtube.com/watch?v=x8cFdZyWOOs +https://youtube.com/watch?v=BO_Lfk-8P5c +https://youtube.com/watch?v=ADPgTmca6Zs +https://youtube.com/watch?v=hkyJQcmVtZQ +https://youtube.com/watch?v=BqLDTKun4so +https://youtube.com/watch?v=Oi4G6UmYK9U +https://youtube.com/watch?v=3XvJFW0DHbU +https://youtube.com/watch?v=O6oA9MBb1-Q +https://youtube.com/watch?v=dqn3PF_DcSg +https://youtube.com/watch?v=C-o8EeITzYM +https://youtube.com/watch?v=SRFhsMvWKmM +https://youtube.com/watch?v=xSaPCoTZr-8 +https://youtube.com/watch?v=8CsKnTUbth0 +https://youtube.com/watch?v=1z88Vc1oyvU +https://youtube.com/watch?v=lLkFCavQGrc +https://youtube.com/watch?v=BQYXn1DP38s +https://youtube.com/watch?v=ZbHJHPTikQA +https://youtube.com/watch?v=BhqQFs7huwU +https://youtube.com/watch?v=-mZ54FJ6h-k +https://youtube.com/watch?v=83Cn2UU79F8 +https://youtube.com/watch?v=iqtmUC6L9fc +https://youtube.com/watch?v=qiy9dCCnG10 +https://youtube.com/watch?v=_Ago8dP4fFA +https://youtube.com/watch?v=St6bhwx7WDo +https://youtube.com/watch?v=ba7vMzLbU7w +https://youtube.com/watch?v=yjj9Dgd6vRU +https://youtube.com/watch?v=D-CNZxoethA +https://youtube.com/watch?v=hwmRQ0PBtXU +https://youtube.com/watch?v=S4mRaEzwTYo +https://youtube.com/watch?v=xCqRYneOdIM +https://youtube.com/watch?v=ryNtmkfeJk4 +https://youtube.com/watch?v=M7HYVow1kHQ +https://youtube.com/watch?v=0CmftpbG4ig +https://youtube.com/watch?v=8zFgtqK39Zg +https://youtube.com/watch?v=7UAWVM5aMUw +https://youtube.com/watch?v=8696ckI64Vs +https://youtube.com/watch?v=AGB_fNG0R94 +https://youtube.com/watch?v=DldxgV41SYM +https://youtube.com/watch?v=xOeDdS7Ic1Q +https://youtube.com/watch?v=rLwZ0QnwUBg +https://youtube.com/watch?v=CAeO7nicvns +https://youtube.com/watch?v=0dGFeIcGb_4 +https://youtube.com/watch?v=6_YG9XBX04Y +https://youtube.com/watch?v=1MCGweQ8Oso +https://youtube.com/watch?v=YI5fU6ZbyaA +https://youtube.com/watch?v=g3JyQnYPkZk +https://youtube.com/watch?v=PoPL7BExSQU +https://youtube.com/watch?v=CEmq2V1IMkk +https://youtube.com/watch?v=zpzOFpPum6w +https://youtube.com/watch?v=59aXJ8GvMYE +https://youtube.com/watch?v=oslMFOeFoLI +https://youtube.com/watch?v=XpueyrkcMyQ +https://youtube.com/watch?v=eUSYlOTP2_k +https://youtube.com/watch?v=DAsUNTHRjaM +https://youtube.com/watch?v=5eSzsJKn8FM +https://youtube.com/watch?v=CpaBpm3_R-8 +https://youtube.com/watch?v=c8teZAt66jo +https://youtube.com/watch?v=HLzqjmoZZAc +https://youtube.com/watch?v=X9qgI95n6rM +https://youtube.com/watch?v=gzU0PLa9-9I +https://youtube.com/watch?v=lcKQ3wGI8ZQ +https://youtube.com/watch?v=gg1Wl-NmzWg +https://youtube.com/watch?v=7myLXPUBB_w +https://youtube.com/watch?v=qDQpZT3GhDg +https://youtube.com/watch?v=uRIaFOKYN0k +https://youtube.com/watch?v=kqwdRBWvPs0 +https://youtube.com/watch?v=3kOWGBDJALY +https://youtube.com/watch?v=sOES7AZ-d60 +https://youtube.com/watch?v=Z9IFiHiSq88 +https://youtube.com/watch?v=P__YyaRlym8 +https://youtube.com/watch?v=jSxY4OwV8vg +https://youtube.com/watch?v=cIrE6sZduWo +https://youtube.com/watch?v=-vl4_f8Emtw +https://youtube.com/watch?v=0HUEiUOCLeI +https://youtube.com/watch?v=73g2Vw_gpkQ +https://youtube.com/watch?v=pCpekvOkwNM +https://youtube.com/watch?v=b80myMYmboY +https://youtube.com/watch?v=8B1oIXGX0Io +https://youtube.com/watch?v=fpDa0kaV6hQ +https://youtube.com/watch?v=6sfe_8RAaJ0 +https://youtube.com/watch?v=rG9myp90oM4 +https://youtube.com/watch?v=DlAEdcMy_0A +https://youtube.com/watch?v=IxlL8l48qcM +https://youtube.com/watch?v=xKGeUPRjNZ8 +https://youtube.com/watch?v=Tnygv7J6VNg +https://youtube.com/watch?v=Gsz3mrnIBd0 +https://youtube.com/watch?v=khby51sf82s +https://youtube.com/watch?v=0izjSUqCcSQ +https://youtube.com/watch?v=RckKPzpU1eo +https://youtube.com/watch?v=OkbwGv3QKQc +https://youtube.com/watch?v=Z_1LfT1MvzI +https://youtube.com/watch?v=tpILJTxT1_s +https://youtube.com/watch?v=JXwMgIlmoaM +https://youtube.com/watch?v=IQaM-SqDqSY +https://youtube.com/watch?v=fBQxsQlPDkU +https://youtube.com/watch?v=llPQnwDAIVU +https://youtube.com/watch?v=iRdlvzIEz-g +https://youtube.com/watch?v=RABTXslPaS8 +https://youtube.com/watch?v=dvdQYSWOobc +https://youtube.com/watch?v=MV5apkGSkfM +https://youtube.com/watch?v=x6zypc_LhnM +https://youtube.com/watch?v=XX6TpqRmeJ0 +https://youtube.com/watch?v=qeJ9NEyxk8I +https://youtube.com/watch?v=Jv5j_Lx2R4g +https://youtube.com/watch?v=yIlpEnsa2d8 +https://youtube.com/watch?v=WMW3RloxEyA +https://youtube.com/watch?v=PygdDdJ0IRY +https://youtube.com/watch?v=FhZ-yTIXXYI +https://youtube.com/watch?v=s0igE09HI1U +https://youtube.com/watch?v=iB2Z2DY17yQ +https://youtube.com/watch?v=oLaIrVB1av4 +https://youtube.com/watch?v=KcoqwKEtYDs +https://youtube.com/watch?v=rjU0Gryw8LY +https://youtube.com/watch?v=x5gAl119keA +https://youtube.com/watch?v=zNcPnEc99UE +https://youtube.com/watch?v=O6pSffe4k60 +https://youtube.com/watch?v=KX_iUXGk0js +https://youtube.com/watch?v=uKpK8RbGlO4 +https://youtube.com/watch?v=5M7LdviC2IQ +https://youtube.com/watch?v=lN1iQQS5E_A +https://youtube.com/watch?v=8fY5oRxwCoM +https://youtube.com/watch?v=a6KDpB6skA4 +https://youtube.com/watch?v=jmwjpHJHolM +https://youtube.com/watch?v=_li7u9X3F3c +https://youtube.com/watch?v=KDrxzKYdwsA +https://youtube.com/watch?v=d3qSLlk8ruE +https://youtube.com/watch?v=GslhRUBgXNI +https://youtube.com/watch?v=gCbdDLa8Z-0 +https://youtube.com/watch?v=9pUKEqpHGA8 +https://youtube.com/watch?v=sztK_qd1Pjc +https://youtube.com/watch?v=j0Jb72PZAls +https://youtube.com/watch?v=KfFBdViZHzk +https://youtube.com/watch?v=CqybaIesbuA +https://youtube.com/watch?v=AKTwwGh8gMo +https://youtube.com/watch?v=FKsfvx5h_jg +https://youtube.com/watch?v=d5SBYhZyo1s +https://youtube.com/watch?v=KntkqJAoHFk +https://youtube.com/watch?v=z2_WYOLnrzQ +https://youtube.com/watch?v=ih0c1UeFC_4 +https://youtube.com/watch?v=LDnJPW-PYgA +https://youtube.com/watch?v=GvkS0P2a2-U +https://youtube.com/watch?v=xDW4AuHl-kM +https://youtube.com/watch?v=n_aVFVveJNs +https://youtube.com/watch?v=sYiM-sOC6nE +https://youtube.com/watch?v=xPpEOUVpxrM +https://youtube.com/watch?v=_Gs3fg_WsEg +https://youtube.com/watch?v=baflobFjTwk +https://youtube.com/watch?v=N3TGcG9k2aA +https://youtube.com/watch?v=q7MH68ayDXY +https://youtube.com/watch?v=pZQI1jgOC_g +https://youtube.com/watch?v=YZNx5S5zuqs +https://youtube.com/watch?v=Y4UZROmf3GQ +https://youtube.com/watch?v=7-RlcOPNb6A +https://youtube.com/watch?v=KUBw0B6RdBQ +https://youtube.com/watch?v=UuhYZrn4flo +https://youtube.com/watch?v=xvIaD14LsAs +https://youtube.com/watch?v=wNLKkYEzbb0 +https://youtube.com/watch?v=ZBiA8XvkLoo +https://youtube.com/watch?v=UyyNbsNKWcQ +https://youtube.com/watch?v=sR13ECD71xU +https://youtube.com/watch?v=3ZyHNyVgaqA +https://youtube.com/watch?v=KGBXVsdY9hw +https://youtube.com/watch?v=SkrKBmnZtB0 +https://youtube.com/watch?v=LA-CBTXvHHY +https://youtube.com/watch?v=ylXk1LBvIqU +https://youtube.com/watch?v=aOwYA_vEZYo +https://youtube.com/watch?v=4bjPlBC4h_8 +https://youtube.com/watch?v=KU70hNzHZRY +https://youtube.com/watch?v=n2wr9FR-m70 +https://youtube.com/watch?v=XPACdaj3t0Q +https://youtube.com/watch?v=_wcbUAFirUE +https://youtube.com/watch?v=48eAYnfgrAo +https://youtube.com/watch?v=yzsWc5mYWGI +https://youtube.com/watch?v=icuMgDWZw2A +https://youtube.com/watch?v=jNnplwRbS8U +https://youtube.com/watch?v=tr72UkaBdtk +https://youtube.com/watch?v=nf0_s-Ijl3A +https://youtube.com/watch?v=_O-wMuGt63c +https://youtube.com/watch?v=cb2w2m1JmCY +https://youtube.com/watch?v=_xuowwzjmTI +https://youtube.com/watch?v=8-jfsUusSDQ +https://youtube.com/watch?v=GW2pFhSo8Cg +https://youtube.com/watch?v=jTuBTsyXbc4 +https://youtube.com/watch?v=53645-blv5o +https://youtube.com/watch?v=eMBZHUhBAYU +https://youtube.com/watch?v=fvgf0yPAqGI +https://youtube.com/watch?v=7sgNYrz0b4o +https://youtube.com/watch?v=CCVp_X9YquA +https://youtube.com/watch?v=eYEl4EaCPJs +https://youtube.com/watch?v=n7Vbps6GLoI +https://youtube.com/watch?v=ZueOBSGhCEw +https://youtube.com/watch?v=hRIXys1xMGc +https://youtube.com/watch?v=X8Ooy2mzrRk +https://youtube.com/watch?v=9Nn_Nghem60 +https://youtube.com/watch?v=62p-CXrYmf4 +https://youtube.com/watch?v=sgn7VfXH2GY +https://youtube.com/watch?v=1EjBJvYIj5Q +https://youtube.com/watch?v=bJULMOw69EI +https://youtube.com/watch?v=zUFg6HvljDE +https://youtube.com/watch?v=Ga7Hh6EzV0o +https://youtube.com/watch?v=UiQcYNEFx_E +https://youtube.com/watch?v=ObtLNz7NQuQ +https://youtube.com/watch?v=WzSQsl2C5dM +https://youtube.com/watch?v=x0f5dcOWsNU +https://youtube.com/watch?v=Q-kOFFCkhu0 +https://youtube.com/watch?v=DggGN8E2vx0 +https://youtube.com/watch?v=KxadblDT6zI +https://youtube.com/watch?v=rdeuQChFJAg +https://youtube.com/watch?v=oQ3C8fjqu_A +https://youtube.com/watch?v=dVZWSnD15t4 +https://youtube.com/watch?v=N_Q5LnUXiNA +https://youtube.com/watch?v=INskc6SaCu0 +https://youtube.com/watch?v=1jccsHMOdZo +https://youtube.com/watch?v=DNbD1JIH344 +https://youtube.com/watch?v=BA9BK71KoIc +https://youtube.com/watch?v=sOd5Ot5-cXE +https://youtube.com/watch?v=rMTlthu5V0g +https://youtube.com/watch?v=xr0Tfng9SP0 +https://youtube.com/watch?v=G5odaPQ0eVo +https://youtube.com/watch?v=1a1Ph-ioxoA +https://youtube.com/watch?v=hyb_wr40pog +https://youtube.com/watch?v=dnK6OHPQZbA +https://youtube.com/watch?v=dtiSA2RKDzc +https://youtube.com/watch?v=Djcti31JFGg +https://youtube.com/watch?v=f0mSDdncUVw +https://youtube.com/watch?v=7tnPkQufnZY +https://youtube.com/watch?v=nPHUz8apHjY +https://youtube.com/watch?v=_lzwSBF2gIA +https://youtube.com/watch?v=VBY3WI7DyV4 +https://youtube.com/watch?v=jqqwb5FYifo +https://youtube.com/watch?v=uH_-w-NeDiU +https://youtube.com/watch?v=4WPCBieSESI +https://youtube.com/watch?v=lbjC6Q6OLvU +https://youtube.com/watch?v=M8JUWVgIYgM +https://youtube.com/watch?v=5Pi5ZJZ07ME +https://youtube.com/watch?v=Q8QNzvtnOHc +https://youtube.com/watch?v=AaTVbFyynI4 +https://youtube.com/watch?v=FycpDrxdr2o +https://youtube.com/watch?v=PQyzK7XJQ0s +https://youtube.com/watch?v=qEjGhOdFfYo +https://youtube.com/watch?v=Us0EU-yXAlg +https://youtube.com/watch?v=myUuXffyu_k +https://youtube.com/watch?v=7toKjKtbeeI +https://youtube.com/watch?v=8urhUop-ouI +https://youtube.com/watch?v=sPbi1YWjox4 +https://youtube.com/watch?v=smJ617KKpcA +https://youtube.com/watch?v=P5OQIm2MI1s +https://youtube.com/watch?v=SgxlkyqN_Js +https://youtube.com/watch?v=g-jsW61e_-w +https://youtube.com/watch?v=lZbahdBHv9E +https://youtube.com/watch?v=DyAY4QA2unY +https://youtube.com/watch?v=Nv2GgV34qIg +https://youtube.com/watch?v=xRvdCRM_jzk +https://youtube.com/watch?v=sxz9eZ1Aons +https://youtube.com/watch?v=1SW2HlX94eg +https://youtube.com/watch?v=iD6k2E61ABY +https://youtube.com/watch?v=c16m8xspz8U +https://youtube.com/watch?v=IKayR1oqC7w +https://youtube.com/watch?v=65lEbMkxO1I +https://youtube.com/watch?v=svpPe1tlKlY +https://youtube.com/watch?v=RbaGDDbpcQ4 +https://youtube.com/watch?v=bbw1r32MJpY +https://youtube.com/watch?v=yOsTPyBSoKU +https://youtube.com/watch?v=jmovwneQ7iQ +https://youtube.com/watch?v=rKtqLZQaszE +https://youtube.com/watch?v=izO68Vu2sx8 +https://youtube.com/watch?v=9rv0EwudrIc +https://youtube.com/watch?v=hvdOgM9wsrw +https://youtube.com/watch?v=aUmOqNU3cqw +https://youtube.com/watch?v=nmLsA1z68VQ +https://youtube.com/watch?v=wqHe50_tBVc +https://youtube.com/watch?v=FuKF-nGpvFA +https://youtube.com/watch?v=v6UZTw1uHmk +https://youtube.com/watch?v=wOuNZMNGwWo +https://youtube.com/watch?v=ZBI9DexZJRo +https://youtube.com/watch?v=sBhbCjSnemE +https://youtube.com/watch?v=yQgljgngO14 +https://youtube.com/watch?v=qkogQxKXwZc +https://youtube.com/watch?v=H2Kme_AXBgU +https://youtube.com/watch?v=ru3sxF4KxHU +https://youtube.com/watch?v=HhndO6GdAHg +https://youtube.com/watch?v=-ZHYfjSg7A4 +https://youtube.com/watch?v=_J0ZpJMQjDo +https://youtube.com/watch?v=qceZZhvelqU +https://youtube.com/watch?v=keJQiIHaIWA +https://youtube.com/watch?v=LDYkdd1FkaA +https://youtube.com/watch?v=aUZ7T636aks +https://youtube.com/watch?v=29J0Qsp3yns +https://youtube.com/watch?v=Y9rxeyzyKVw +https://youtube.com/watch?v=vy2q5qM2tzk +https://youtube.com/watch?v=xafJW_VtA8w +https://youtube.com/watch?v=3ktfwLMivUw +https://youtube.com/watch?v=G6gQbM4VjV4 +https://youtube.com/watch?v=tpGOXpvqtbY +https://youtube.com/watch?v=gXYrCfP3hX0 +https://youtube.com/watch?v=X_AOwrXev60 +https://youtube.com/watch?v=4_iC0MyIykM +https://youtube.com/watch?v=ZICaUybMucY +https://youtube.com/watch?v=YLKJASUKB0g +https://youtube.com/watch?v=2KaeXksNA1o +https://youtube.com/watch?v=D27zVtVPWnQ +https://youtube.com/watch?v=mCscZ2tPFmI +https://youtube.com/watch?v=C4zw9qvo4PQ +https://youtube.com/watch?v=J4iapfF2BCc +https://youtube.com/watch?v=R0H4mL3OW-4 +https://youtube.com/watch?v=Tyt_4N4LNz4 +https://youtube.com/watch?v=fHfH1hRmB78 +https://youtube.com/watch?v=TxH9Dg1JLio +https://youtube.com/watch?v=4WtmkES0X48 +https://youtube.com/watch?v=FU89y-AWDSg +https://youtube.com/watch?v=B0x1zzQBeX0 +https://youtube.com/watch?v=0UWBO4r11AY +https://youtube.com/watch?v=0lv8cNsmVJo +https://youtube.com/watch?v=G5zPqgQ67yo +https://youtube.com/watch?v=Z7dFA3hoAwQ +https://youtube.com/watch?v=X-lUHu_oGe8 +https://youtube.com/watch?v=aWA5f1l3ulg +https://youtube.com/watch?v=WkM9T1IoQgI +https://youtube.com/watch?v=T9pd8VWyibA +https://youtube.com/watch?v=Y3ohZjCKzjg +https://youtube.com/watch?v=i_LfbN1EG3c +https://youtube.com/watch?v=iM-eewbBOCA +https://youtube.com/watch?v=Q-Yp9AlifJg +https://youtube.com/watch?v=-m91DYI0--I +https://youtube.com/watch?v=nsyK9_iaCoA +https://youtube.com/watch?v=Bg4UjKYHMuM +https://youtube.com/watch?v=QQKmh3RsRgg +https://youtube.com/watch?v=qCp6ZWSPo-4 +https://youtube.com/watch?v=Dp_Ms6Q-zO8 +https://youtube.com/watch?v=AvXroQ5zMhE +https://youtube.com/watch?v=LR82f0GJgXg +https://youtube.com/watch?v=IhSG1deLTmY +https://youtube.com/watch?v=ZHBvFDPz0J0 +https://youtube.com/watch?v=BpDnB_9fPbU +https://youtube.com/watch?v=RzBS0H75D1U +https://youtube.com/watch?v=bogGO4UUxvo +https://youtube.com/watch?v=haVlcMsRIHE +https://youtube.com/watch?v=JFv_rFiYGzQ +https://youtube.com/watch?v=uD73uTlu708 +https://youtube.com/watch?v=ocEsAH40fWs +https://youtube.com/watch?v=of4oefTUY-8 +https://youtube.com/watch?v=wUp3OhwksUM +https://youtube.com/watch?v=_H1ktl3onMQ +https://youtube.com/watch?v=ONcXJljaoyE +https://youtube.com/watch?v=Ea06lSzLvBo +https://youtube.com/watch?v=VgvJrWwbW-k +https://youtube.com/watch?v=gQ3YJh_jUFc +https://youtube.com/watch?v=iWEkIVi7FKo +https://youtube.com/watch?v=Yqln3nmwS90 +https://youtube.com/watch?v=SPedPSBreNk +https://youtube.com/watch?v=_pbIj-2vak4 +https://youtube.com/watch?v=mDQHqNf-IEg +https://youtube.com/watch?v=71LUw5iKoiw +https://youtube.com/watch?v=OvHcHQ9-jdo +https://youtube.com/watch?v=ajRPpn5CYFE +https://youtube.com/watch?v=ZIGxnhQDjh8 +https://youtube.com/watch?v=oA7VV2z2K1o +https://youtube.com/watch?v=NlpgFuhpgmk +https://youtube.com/watch?v=uTnxi7i_yWg +https://youtube.com/watch?v=-lxIzlHAJTw +https://youtube.com/watch?v=lxBCEuHQVms +https://youtube.com/watch?v=71QmMPEnDBI +https://youtube.com/watch?v=opXvrMQEXUk +https://youtube.com/watch?v=3yeEUpRnyV4 +https://youtube.com/watch?v=aFuYIkYx3EY +https://youtube.com/watch?v=-BIlJRa-1pw +https://youtube.com/watch?v=Pq9VEnUc1sw +https://youtube.com/watch?v=GYhDtr-HTps +https://youtube.com/watch?v=Wl2eEI7a46A +https://youtube.com/watch?v=P-a6c1b0qCs +https://youtube.com/watch?v=2MferjKXc1c +https://youtube.com/watch?v=VGA_Y6YZLhM +https://youtube.com/watch?v=ls3jLz5GK-k +https://youtube.com/watch?v=g4az93FLo9s +https://youtube.com/watch?v=lZbgyKJkHxQ +https://youtube.com/watch?v=eiNHxi6YPEU +https://youtube.com/watch?v=ptdDbLKDHwo +https://youtube.com/watch?v=Pssb8lCRjnQ +https://youtube.com/watch?v=VhbG1JPe_JI +https://youtube.com/watch?v=ycslsuleRCA +https://youtube.com/watch?v=BQCx1kW3kMc +https://youtube.com/watch?v=jQH0GPL33uc +https://youtube.com/watch?v=H5qgwnfvf1c +https://youtube.com/watch?v=M47Bsg6Bt3M +https://youtube.com/watch?v=69oNGLx0Sxg +https://youtube.com/watch?v=WBIsw5rtWjk +https://youtube.com/watch?v=bw1ArZ3zLDg +https://youtube.com/watch?v=77dxA6S_BpY +https://youtube.com/watch?v=oGDS_xiHHCM +https://youtube.com/watch?v=k0kI8tcFxM8 +https://youtube.com/watch?v=qQMUWlse5I8 +https://youtube.com/watch?v=mDmbKzaCkGY +https://youtube.com/watch?v=yis_itRsT_8 +https://youtube.com/watch?v=ClE5MBXh4rg +https://youtube.com/watch?v=gnxbNaW4vDk +https://youtube.com/watch?v=rWm41a4hyw8 +https://youtube.com/watch?v=flWB-WaKm5U +https://youtube.com/watch?v=AtxRk7kzU0Q +https://youtube.com/watch?v=rYNIs6HnyMY +https://youtube.com/watch?v=LWay7pPEWeg +https://youtube.com/watch?v=HMnrl0tmd3k +https://youtube.com/watch?v=Uv3FQb2AvZM +https://youtube.com/watch?v=yeJx04_47Lc +https://youtube.com/watch?v=TYRDgd3Tb44 +https://youtube.com/watch?v=bLo5pj04wag +https://youtube.com/watch?v=KEXQkrllGbA +https://youtube.com/watch?v=hwZNL7QVJjE +https://youtube.com/watch?v=rF2UauLtZag +https://youtube.com/watch?v=wEA5Xuc4-a4 +https://youtube.com/watch?v=lRgGiS2CHec +https://youtube.com/watch?v=7uy0ldI_1HA diff --git a/config/aliases.json b/config/aliases.json deleted file mode 100644 index 4760c7e..0000000 --- a/config/aliases.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "play": ["p"], - "skip": ["s"], - "queue": ["q"] -} \ No newline at end of file diff --git a/config/example_options.ini b/config/example_options.ini index a25d9f9..cdd5a3d 100644 --- a/config/example_options.ini +++ b/config/example_options.ini @@ -2,7 +2,7 @@ # to setup the bot. Do not edit this file using Notepad as it ruins the # formatting - use Notepad++ or a code editor like Visual Studio Code. -# For help, see: https://just-some-bots.github.io/MusicBot/ +# For help, see: https://team-jsb.github.io/MusicBot/ # To get IDs, enable Developer Mode (Options -> Settings -> Appearance) # on Discord and then right-click the person/channel you want to get the @@ -18,14 +18,18 @@ [Credentials] # This is your Discord bot account token. -# Find your bot's token here: https://discordapp.com/developers/applications/me/ +# Find your bot's token here: https://discord.com/developers/applications/me/ # Create a new application, with no redirect URI or boxes ticked. # Then click 'Create Bot User' on the application page and copy the token here. Token = bot_token # The bot supports converting Spotify links and URIs to YouTube videos and -# playing them. To enable this feature, please fill in these two options with valid -# details, following these instructions: https://just-some-bots.github.io/MusicBot/using/spotify/ +# playing them. The bot offers 2 methods to use this feature: +# 1. (Recommended) You can fill in the two options below with the credentials, +# following these instructions: https://team-jsb.github.io/MusicBot/using/spotify/ +# 2. The bot will try to generate it's own credentials and communicate with +# Spotify's API using them. This will be automatically enabled when +# the two options below are left empty. Spotify_ClientID = Spotify_ClientSecret = @@ -44,6 +48,10 @@ OwnerID = auto # are familiar with Python code. DevIDs = +# Automatically add app team members as devs +# The app must be in a team to use this feature +TeamDevs = no + # This option determines if the bot should respond to other any other bots # put bot ID's here seperated with spaces # Any id you put here the bot WILL respond to. @@ -97,11 +105,6 @@ DeleteNowPlaying = yes # The volume of the bot, between 0.01 and 1.0. DefaultVolume = 0.25 -# Only allows whitelisted users (in whitelist.txt) to use commands. -# WARNING: This option has been deprecated and will be removed in a future version -# of the bot. Use permissions.ini instead. -WhiteListCheck = no - # The number of people voting to skip in order for a song to be skipped successfully, # whichever value is lower will be used. Ratio refers to the percentage of undefeaned, non- # owner users in the channel. @@ -180,7 +183,7 @@ RemoveFromAPOnError = yes # Whether to show the configuration for the bot in the console when it launches. ShowConfigOnLaunch = no -# Whether to use leagcy skip behaviour. This will change it so that those with permission +# Whether to use legacy skip behaviour. This will change it so that those with permission # do not need to use "skip f" to force-skip a song, they will instead force-skip by default. LegacySkip = no @@ -190,6 +193,9 @@ LeaveServersWithoutOwner = no # Use command alias defined in aliases.json. UseAlias = yes +# Specify a custom message to use as the bots embed footer. +CustomEmbedFooter = + [Files] # Path to your i18n file. Do not set this if you do not know what it does. i18nFile = diff --git a/config/i18n/en.json b/config/i18n/en.json index 8ab9efe..287023d 100644 --- a/config/i18n/en.json +++ b/config/i18n/en.json @@ -38,6 +38,7 @@ "cmd-play-song-reply": "Enqueued `%s` to be played. Position in queue: %s", "cmd-play-next": "Up next!", "cmd-play-eta": " - estimated time until playing: %s", + "cmd-play-eta-error": " - cannot estimate time until playing", "cmd-play-badextractor": "You do not have permission to play media from this service.", "cmd-stream-limit": "You have reached your enqueued song limit ({0})", "cmd-stream-success": "Streaming.", diff --git a/config/i18n/it.json b/config/i18n/it.json new file mode 100644 index 0000000..e817b77 --- /dev/null +++ b/config/i18n/it.json @@ -0,0 +1,107 @@ +{ + "cmd-resetplaylist-response": "La playlist automatica del server è stata resettata.", + "cmd-help-invalid": "Il comando non esiste", + "cmd-help-no-perms": "Non hai il permesso di usare alcun comando. Digita `{}help all` per mostrare comunque la lista di comandi", + "cmd-help-response": "Per informazioni su un comando particolare, digita `{}help [command]`\n Per maggiori info, visita http://just-some-bots.github.io/MusicBot/", + "cmd-help-all": "\nEcco i comandi che puoi usare. Per la lista di tutti i comandi, digita `{}help all`", + "cmd-blacklist-invalid": "L'opzione '{0}' non è valida; puoi usare +, -, add, o remove", + "cmd-blacklist-added": "{0} utenti sono stati aggiunti alla blacklist", + "cmd-blacklist-none": "Nessuno di questi utenti si trovano nella blacklist.", + "cmd-blacklist-removed": "{0} utenti sono stati rimossi dalla blacklist", + "cmd-id-self": "Il tuo ID è `{0}`", + "cmd-id-other": "L'ID di **{0}**s è `{1}`", + "cmd-save-exists": "Questa traccia si trova già nell'autoplaylist.", + "cmd-save-invalid": "Non ci sono tracce valide in riproduzione.", + "cmd-save-success": "Aggiunta <{0}> all'autoplaylist.", + "cmd-joinserver-response": "Clicca qui per aggiungermi a un server: \n{}", + "cmd-play-spotify-album-process": "Processando l'album `{0}` (`{1}`)", + "cmd-play-spotify-album-queued": "Album `{0}` aggiunto alla coda con **{1}** tracce.", + "cmd-play-spotify-playlist-process": "Processando la playlist `{0}` (`{1}`)", + "cmd-play-spotify-playlist-queued": "Playlist `{0}` aggiunta alla coda con **{1}** tracce.", + "cmd-play-spotify-unsupported": "Questo URI Spotify non è supportato.", + "cmd-play-spotify-invalid": "Hai inserito un URI non valido, oppure qualcosa è andato storto.", + "cmd-play-spotify-unavailable": "Il bot non è configurato per supportare URI Spotify. Controlla il tuo file di configurazione.", + "cmd-play-limit": "Hai raggiunto il limite di tracce che puoi inserire in coda ({0})", + "cmd-play-noinfo": "Non posso riprodurre questo video. Prova con il comando {0}stream .", + "cmd-play-nodata": "Errore nell'estrazione delle informazioni dalla query di ricerca, youtubedl non ha restituito risultati. Potresti dover riavviare il bot se questo accade nuovamente.", + "cmd-play-playlist-error": "Errore nell'aggiunta alla coda della playlist:\n`{0}`", + "cmd-play-playlist-gathering-1": "Recupero le info della playlist per {0} tracce{1}", + "cmd-play-playlist-gathering-2": ", tempo rimasto: {0} secondi", + "cmd-play-playlist-maxduration": "Nessuna traccia è stata aggiunta, superavano tutte la massima durata(%ss)", + "cmd-play-playlist-reply": "**%s** tracce aggiunte alla coda. Posizione in coda: %s", + "cmd-play-playlist-invalid": "Questa playlist non può essere riprodotta.", + "cmd-play-playlist-process": "Processando {0} tracce...", + "cmd-play-playlist-queueerror": "Errore nell'aggiunta alla coda della playlist {0}.", + "cmd-play-playlist-skipped": "\nInoltre, la traccia corrente è stata saltata poiché è troppo lunga.", + "cmd-play-playlist-reply-secs": "Aggiunte alla coda {0} tracce. Saranno riprodotte in {1} seconds", + "cmd-play-song-limit": "La durata della canzone supera il limite ({0} > {1})", + "cmd-play-song-reply": "`%s` aggiunta alla coda. Posizione in coda: %s", + "cmd-play-next": "In riproduzione ora!", + "cmd-play-eta": " - tempo stimato alla riproduzione: %s", + "cmd-play-badextractor": "Non hai il permesso di riprodurre media da questo servizio.", + "cmd-stream-limit": "Hai raggiunto il limite di tracce che puoi aggiungere in coda ({0})", + "cmd-stream-success": "Streaming.", + "cmd-search-limit": "Hai raggiunto il limite di elementi che puoi aggiungere in coda ({0})", + "cmd-search-noquery": "Perfavore specifica cosa vuoi cercare.\n%s", + "cmd-search-noquote": "Perfavore scrivi la ricerca fra virgolette.", + "cmd-search-searchlimit": "Non puoi cercare più di %s video", + "cmd-search-searching": "Cercando i video...", + "cmd-search-none": "Nessun video trovato.", + "cmd-search-result": "Risultato {0}/{1}: {2}", + "cmd-search-accept": "Ok, è la prossima!", + "cmd-search-decline": "Come vuoi :(", + "cmd-np-action-streaming": "Streaming", + "cmd-np-action-playing": "In riproduzione", + "cmd-np-reply-author": "Ora {action}: **{title}** aggiunto da **{author}**\nProgresso: {progress_bar} {progress}\n:point_right: <{url}>", + "cmd-np-reply-noauthor": "Ora {action}: **{title}**\nProgresso: {progress_bar} {progress}\n:point_right: <{url}>", + "cmd-np-none": "Non ci sono canzoni in coda! Aggiungi qualcosa invocando {0}play.", + "cmd-summon-novc": "Non stai partecipando a un canale vocale!", + "cmd-summon-noperms-connect": "Non posso unirmi al canale `{0}`, non ho il permesso di connessione.", + "cmd-summon-noperms-speak": "Non posso unirmi al canale `{0}`, non ho il permesso di parlare .", + "cmd-summon-reply": "Connesso a `{0.name}`", + "cmd-pause-reply": "Musica in pausa in `{0.name}`", + "cmd-pause-none": "Niente in riproduzione.", + "cmd-resume-reply": "Riproduzione ripresa in `{0.name}`", + "cmd-resume-none": "Riproduzione non in pausa.", + "cmd-shuffle-reply": "Coda di `{0}` in riproduzione casuale.", + "cmd-clear-reply": "Coda di `{0}` cancellata", + "cmd-remove-none": "Niente da rimuovere!", + "cmd-remove-reply": "Rimossa `{0}`, era stata aggiunta da `{1}`", + "cmd-remove-missing": "Nella coda dell'utente `%s` non c'è nulla.", + "cmd-remove-noperms": "Non hai i permessi necessari per rimuovere questo elemento dalla coda, assicurati di averla aggiunta tu o di avere i permessi di instant skip.", + "cmd-remove-invalid": "Numero non valido. Usa {}queue per trovare la posizione in coda.", + "cmd-remove-reply-author": "Rimosso l'elemento `{0}`, era stato aggiunto da `{1}`", + "cmd-remove-reply-noauthor": "Rimosso l'elemento `{0}`", + "cmd-skip-none": "Richiesta non valida, non c'è nulla in riproduzione!", + "cmd-skip-dl": "La prossima canzone (`%s`) è in dowload, attendi.", + "cmd-skip-force": "Salto forzatamente `{}`.", + "cmd-skip-force-noperms": "Non hai il permesso di saltare forzatamente.", + "cmd-skip-reply-skipped-1": "La tua richiesta di saltare `{0}` è stata ricevuta.\nIl voto per saltare è passato.{1}", + "cmd-skip-reply-skipped-2": " Prossima traccia in arrivo!", + "cmd-skip-reply-voted-1": "La tua richiesta di saltare `{0}` è stata ricevuta.\n**{1}** {2} per saltare la traccia.", + "cmd-skip-reply-voted-2": "voto mancante", + "cmd-skip-reply-voted-3": "voti mancanti", + "cmd-volume-current": "Volume corrente: `%s%%`", + "cmd-volume-invalid": "`{0}` non è un volume valido", + "cmd-volume-reply": "Volume cambiato da **%d** a **%d**", + "cmd-volume-unreasonable-relative": "Valore di volume non valido: {}{:+} -> {}%. Inserire un valore fra {} e {:+}.", + "cmd-volume-unreasonable-absolute": "Valore di volume non valido: {}%. Inserire un valore compreso fra 1 e 100.", + "cmd-option-autoplaylist-enabled": "L'autoplaylist è già attiva!", + "cmd-option-autoplaylist-disabled": "L'autoplaylist è già disattiva!", + "cmd-option-autoplaylist-none": "Non ci sono elementi nel file di autoplaylist.", + "cmd-option-invalid-value": "Il valore inserito non è valido.", + "cmd-option-invalid-param": "I parametri inseriti non sono validi.", + "cmd-queue-more": "\n... e %s in più", + "cmd-queue-none": "Non ci sono tracce in coda! Aggiungi qualcosa usando {}play.", + "cmd-queue-playing-author": "Ora in riproduzione: `{0}` aggiunta da `{1}` {2}\n", + "cmd-queue-playing-noauthor": "Ora in riproduzione: `{0}` {1}\n", + "cmd-queue-entry-author": "{0} -- `{1}` da `{2}`", + "cmd-queue-entry-noauthor": "{0} -- `{1}`", + "cmd-clean-invalid": "Parametro non valido. Inserire un numero di messaggi da cercare.", + "cmd-clean-reply": "Cancellati {0} messaggi.", + "playlists-noperms": "Non hai il permesso di richiedere playlist.", + "playlists-big": "La playlist ha troppi elementi ({0} > {1})", + "playlists-limit": "I nuovi elementi più le tracce già presenti hanno raggiunto il limite ({0} + {1} > {2})", + "karaoke-enabled": "La modalità karaoke è abilitata, prova ancora quando viene disattivata!", + "left-no-owner-guilds": "Lascio `{}` poichè il proprietario del bot non si trova qui." +} diff --git a/config/options.ini b/config/options.ini index 6a30487..d4f6f20 100644 --- a/config/options.ini +++ b/config/options.ini @@ -2,7 +2,7 @@ # to setup the bot. Do not edit this file using Notepad as it ruins the # formatting - use Notepad++ or a code editor like Visual Studio Code. -# For help, see: https://just-some-bots.github.io/MusicBot/ +# For help, see: https://team-jsb.github.io/MusicBot/ # To get IDs, enable Developer Mode (Options -> Settings -> Appearance) # on Discord and then right-click the person/channel you want to get the @@ -18,14 +18,18 @@ [Credentials] # This is your Discord bot account token. -# Find your bot's token here: https://discordapp.com/developers/applications/me/ +# Find your bot's token here: https://discord.com/developers/applications/me/ # Create a new application, with no redirect URI or boxes ticked. # Then click 'Create Bot User' on the application page and copy the token here. Token = bot_token # The bot supports converting Spotify links and URIs to YouTube videos and -# playing them. To enable this feature, please fill in these two options with valid -# details, following these instructions: https://just-some-bots.github.io/MusicBot/using/spotify/ +# playing them. The bot offers 2 methods to use this feature: +# 1. (Recommended) You can fill in the two options below with the credentials, +# following these instructions: https://team-jsb.github.io/MusicBot/using/spotify/ +# 2. The bot will try to generate it's own credentials and communicate with +# Spotify's API using them. This will be automatically enabled when +# the two options below are left empty. Spotify_ClientID = Spotify_ClientSecret = @@ -44,6 +48,10 @@ OwnerID = auto # are familiar with Python code. DevIDs = +# Automatically add app team members as devs +# The app must be in a team to use this feature +TeamDevs = no + # This option determines if the bot should respond to other any other bots # put bot ID's here seperated with spaces # Any id you put here the bot WILL respond to. @@ -97,11 +105,6 @@ DeleteNowPlaying = yes # The volume of the bot, between 0.01 and 1.0. DefaultVolume = 0.25 -# Only allows whitelisted users (in whitelist.txt) to use commands. -# WARNING: This option has been deprecated and will be removed in a future version -# of the bot. Use permissions.ini instead. -WhiteListCheck = no - # The number of people voting to skip in order for a song to be skipped successfully, # whichever value is lower will be used. Ratio refers to the percentage of undefeaned, non- # owner users in the channel. @@ -180,7 +183,7 @@ RemoveFromAPOnError = yes # Whether to show the configuration for the bot in the console when it launches. ShowConfigOnLaunch = no -# Whether to use leagcy skip behaviour. This will change it so that those with permission +# Whether to use legacy skip behaviour. This will change it so that those with permission # do not need to use "skip f" to force-skip a song, they will instead force-skip by default. LegacySkip = no @@ -190,6 +193,9 @@ LeaveServersWithoutOwner = no # Use command alias defined in aliases.json. UseAlias = yes +# Specify a custom message to use as the bots embed footer. +CustomEmbedFooter = + [Files] # Path to your i18n file. Do not set this if you do not know what it does. i18nFile = diff --git a/musicbot.service b/musicbot.service new file mode 100644 index 0000000..31a038d --- /dev/null +++ b/musicbot.service @@ -0,0 +1,10 @@ +[Unit] +Description=MusicBot + +[Service] +WorkingDirectory=mbdirectory +ExecStart=/usr/bin/pythonversionnum mbdirectory/run.py +Restart=on-failure + +[Install] +WantedBy=default.target \ No newline at end of file diff --git a/musicbot/bot.py b/musicbot/bot.py index 9fbadab..fbd4eaa 100644 --- a/musicbot/bot.py +++ b/musicbot/bot.py @@ -72,10 +72,11 @@ def __init__(self, config_file=None, perms_file=None, aliases_file=None): self.last_status = None self.config = Config(config_file) - + self._setup_logging() - - self.permissions = Permissions(perms_file, grant_all=[self.config.owner_id]) + + self.permissions = Permissions( + perms_file, grant_all=[self.config.owner_id]) self.str = Json(self.config.i18n_file) if self.config.usealias: @@ -93,10 +94,12 @@ def __init__(self, config_file=None, perms_file=None, aliases_file=None): log.warning("Autoplaylist is empty, disabling.") self.config.auto_playlist = False else: - log.info("Loaded autoplaylist with {} entries".format(len(self.autoplaylist))) + log.info("Loaded autoplaylist with {} entries".format( + len(self.autoplaylist))) if self.blacklist: - log.debug("Loaded blacklist with {} entries".format(len(self.blacklist))) + log.debug("Loaded blacklist with {} entries".format( + len(self.blacklist))) # TODO: Do these properly ssd_defaults = { @@ -113,16 +116,38 @@ def __init__(self, config_file=None, perms_file=None, aliases_file=None): self.spotify = None if self.config._spotify: try: - self.spotify = Spotify(self.config.spotify_clientid, self.config.spotify_clientsecret, aiosession=self.aiosession, loop=self.loop) + self.spotify = Spotify( + self.config.spotify_clientid, self.config.spotify_clientsecret, aiosession=self.aiosession, loop=self.loop) if not self.spotify.token: - log.warning('Spotify did not provide us with a token. Disabling.') + log.warning( + 'Spotify did not provide us with a token. Disabling.') self.config._spotify = False else: - log.info('Authenticated with Spotify successfully using client ID and secret.') + log.info( + 'Authenticated with Spotify successfully using client ID and secret.') except exceptions.SpotifyError as e: - log.warning('There was a problem initialising the connection to Spotify. Is your client ID and secret correct? Details: {0}. Continuing anyway in 5 seconds...'.format(e)) + log.warning( + 'There was a problem initialising the connection to Spotify. Is your client ID and secret correct? Details: {0}. Continuing anyway in 5 seconds...'.format(e)) self.config._spotify = False time.sleep(5) # make sure they see the problem + else: + try: + log.warning( + 'The config did not have Spotify app credentials, attempting to use guest mode.') + self.spotify = Spotify( + None, None, aiosession=self.aiosession, loop=self.loop) + if not self.spotify.token: + log.warning( + 'Spotify did not provide us with a token. Disabling.') + self.config._spotify = False + else: + log.info( + 'Authenticated with Spotify successfully using guest mode.') + self.config._spotify = True + except exceptions.SpotifyError as e: + log.warning( + 'There was a problem initialising the connection to Spotify using guest mode. Details: {0}.'.format(e)) + self.config._spotify = False # TODO: Add some sort of `denied` argument for a message to send when someone else tries to use it def owner_only(func): @@ -135,7 +160,8 @@ async def wrapper(self, *args, **kwargs): # noinspection PyCallingNonCallable return await func(self, *args, **kwargs) else: - raise exceptions.PermissionsError("Only the owner can use this command.", expire_in=30) + raise exceptions.PermissionsError( + "Only the owner can use this command.", expire_in=30) return wrapper @@ -144,11 +170,12 @@ def dev_only(func): async def wrapper(self, *args, **kwargs): orig_msg = _get_variable('message') - if str(orig_msg.author.id) in self.config.dev_ids: + if orig_msg.author.id in self.config.dev_ids: # noinspection PyCallingNonCallable return await func(self, *args, **kwargs) else: - raise exceptions.PermissionsError("Only dev users can use this command.", expire_in=30) + raise exceptions.PermissionsError( + "Only dev users can use this command.", expire_in=30) wrapper.dev_cmd = True return wrapper @@ -163,10 +190,11 @@ async def wrapper(self, *args, **kwargs): return wrapper def _get_owner(self, *, server=None, voice=False): - return discord.utils.find( - lambda m: m.id == self.config.owner_id and (m.voice if voice else True), - server.members if server else self.get_all_members() - ) + return discord.utils.find( + lambda m: m.id == self.config.owner_id and ( + m.voice if voice else True), + server.members if server else self.get_all_members() + ) def _delete_old_audiocache(self, path=AUDIO_CACHE_PATH): try: @@ -191,20 +219,8 @@ def _setup_logging(self): return shandler = logging.StreamHandler(stream=sys.stdout) - shandler.setFormatter(colorlog.LevelFormatter( - fmt = { - 'DEBUG': '{log_color}[{levelname}:{module}] {message}', - 'INFO': '{log_color}{message}', - 'WARNING': '{log_color}{levelname}: {message}', - 'ERROR': '{log_color}[{levelname}:{module}] {message}', - 'CRITICAL': '{log_color}[{levelname}:{module}] {message}', - - 'EVERYTHING': '{log_color}[{levelname}:{module}] {message}', - 'NOISY': '{log_color}[{levelname}:{module}] {message}', - 'VOICEDEBUG': '{log_color}[{levelname}:{module}][{relativeCreated:.9f}] {message}', - 'FFMPEG': '{log_color}[{levelname}:{module}][{relativeCreated:.9f}] {message}' - }, - log_colors = { + sformatter = colorlog.LevelFormatter( + log_colors={ 'DEBUG': 'cyan', 'INFO': 'white', 'WARNING': 'yellow', @@ -215,20 +231,36 @@ def _setup_logging(self): 'NOISY': 'white', 'FFMPEG': 'bold_purple', 'VOICEDEBUG': 'purple', - }, - style = '{', - datefmt = '' - )) + }, + style='{', + datefmt='' + ) + sformatter.fmt = { + 'DEBUG': '{log_color}[{levelname}:{module}] {message}', + 'INFO': '{log_color}{message}', + 'WARNING': '{log_color}{levelname}: {message}', + 'ERROR': '{log_color}[{levelname}:{module}] {message}', + 'CRITICAL': '{log_color}[{levelname}:{module}] {message}', + + 'EVERYTHING': '{log_color}[{levelname}:{module}] {message}', + 'NOISY': '{log_color}[{levelname}:{module}] {message}', + 'VOICEDEBUG': '{log_color}[{levelname}:{module}][{relativeCreated:.9f}] {message}', + 'FFMPEG': '{log_color}[{levelname}:{module}][{relativeCreated:.9f}] {message}' + } + shandler.setFormatter(sformatter) shandler.setLevel(self.config.debug_level) logging.getLogger(__package__).addHandler(shandler) - log.debug("Set logging level to {}".format(self.config.debug_level_str)) + log.debug("Set logging level to {}".format( + self.config.debug_level_str)) if self.config.debug_mode: dlogger = logging.getLogger('discord') dlogger.setLevel(logging.DEBUG) - dhandler = logging.FileHandler(filename='logs/discord.log', encoding='utf-8', mode='w') - dhandler.setFormatter(logging.Formatter('{asctime}:{levelname}:{name}: {message}', style='{')) + dhandler = logging.FileHandler( + filename='logs/discord.log', encoding='utf-8', mode='w') + dhandler.setFormatter(logging.Formatter( + '{asctime}:{levelname}:{name}: {message}', style='{')) dlogger.addHandler(dhandler) @staticmethod @@ -263,31 +295,37 @@ def _autopause(player): continue if guild.me.voice: - log.info("Found resumable voice channel {0.guild.name}/{0.name}".format(guild.me.voice.channel)) + log.info( + "Found resumable voice channel {0.guild.name}/{0.name}".format(guild.me.voice.channel)) channel_map[guild] = guild.me.voice.channel if autosummon: owner = self._get_owner(server=guild, voice=True) if owner: - log.info("Found owner in \"{}\"".format(owner.voice.channel.name)) + log.info("Found owner in \"{}\"".format( + owner.voice.channel.name)) channel_map[guild] = owner.voice.channel for guild, channel in channel_map.items(): if guild in joined_servers: - log.info("Already joined a channel in \"{}\", skipping".format(guild.name)) + log.info( + "Already joined a channel in \"{}\", skipping".format(guild.name)) continue if channel and isinstance(channel, discord.VoiceChannel): - log.info("Attempting to join {0.guild.name}/{0.name}".format(channel)) + log.info( + "Attempting to join {0.guild.name}/{0.name}".format(channel)) chperms = channel.permissions_for(guild.me) if not chperms.connect: - log.info("Cannot join channel \"{}\", no permission.".format(channel.name)) + log.info( + "Cannot join channel \"{}\", no permission.".format(channel.name)) continue elif not chperms.speak: - log.info("Will not join channel \"{}\", no permission to speak.".format(channel.name)) + log.info( + "Will not join channel \"{}\", no permission to speak.".format(channel.name)) continue try: @@ -301,16 +339,20 @@ def _autopause(player): if self.config.auto_playlist: if self.config.auto_pause: - player.once('play', lambda player, **_: _autopause(player)) + player.once('play', lambda player, + **_: _autopause(player)) if not player.playlist.entries: await self.on_player_finished_playing(player) except Exception: - log.debug("Error joining {0.guild.name}/{0.name}".format(channel), exc_info=True) - log.error("Failed to join {0.guild.name}/{0.name}".format(channel)) + log.debug( + "Error joining {0.guild.name}/{0.name}".format(channel), exc_info=True) + log.error( + "Failed to join {0.guild.name}/{0.name}".format(channel)) elif channel: - log.warning("Not joining {0.guild.name}/{0.name}, that's a text channel.".format(channel)) + log.warning( + "Not joining {0.guild.name}/{0.name}, that's a text channel.".format(channel)) else: log.warning("Invalid channel thing: {}".format(channel)) @@ -344,15 +386,15 @@ async def _cache_app_info(self, *, update=False): return self.cached_app_info - - async def remove_from_autoplaylist(self, song_url:str, *, ex:Exception=None, delete_from_ap=False): + async def remove_from_autoplaylist(self, song_url: str, *, ex: Exception = None, delete_from_ap=False): if song_url not in self.autoplaylist: log.debug("URL \"{}\" not in autoplaylist, ignoring".format(song_url)) return async with self.aiolocks[_func_()]: self.autoplaylist.remove(song_url) - log.info("Removing unplayable song from session autoplaylist: %s" % song_url) + log.info( + "Removing unplayable song from session autoplaylist: %s" % song_url) with open(self.config.auto_playlist_removed_file, 'a', encoding='utf8') as f: f.write( @@ -360,10 +402,11 @@ async def remove_from_autoplaylist(self, song_url:str, *, ex:Exception=None, del '# Reason: {ex}\n' '{url}\n\n{sep}\n\n'.format( ctime=time.ctime(), - ex=str(ex).replace('\n', '\n#' + ' ' * 10), # 10 spaces to line up with # Reason: + # 10 spaces to line up with # Reason: + ex=str(ex).replace('\n', '\n#' + ' ' * 10), url=song_url, sep='#' * 32 - )) + )) if delete_from_ap: log.info("Updating autoplaylist") @@ -395,13 +438,6 @@ async def disconnect_voice_client(self, guild): await vc.disconnect() - async def force_disconnect_from_channel(self, channel): - try: - voice_client = await self.get_voice_client(channel) - await voice_client.disconnect(force=True) - except: - return - async def disconnect_all_voice_clients(self): for vc in list(self.voice_clients).copy(): await self.disconnect_voice_client(vc.channel.guild) @@ -417,7 +453,7 @@ async def set_voice_state(self, vchannel, *, mute=False, deaf=False): # I hope I don't have to set the channel here # instead of waiting for the event to update it - def get_player_in(self, guild:discord.Guild) -> MusicPlayer: + def get_player_in(self, guild: discord.Guild) -> MusicPlayer: return self.players.get(guild.id) async def get_player(self, channel, create=False, *, deserialize=False) -> MusicPlayer: @@ -425,12 +461,12 @@ async def get_player(self, channel, create=False, *, deserialize=False) -> Music async with self.aiolocks[_func_() + ':' + str(guild.id)]: if deserialize: - await self.force_disconnect_from_channel(channel) voice_client = await self.get_voice_client(channel) player = await self.deserialize_queue(guild, voice_client) if player: - log.debug("Created player via deserialization for guild %s with %s entries", guild.id, len(player.playlist)) + log.debug("Created player via deserialization for guild %s with %s entries", guild.id, len( + player.playlist)) # Since deserializing only happens when the bot starts, I should never need to reconnect return self._init_player(player, guild=guild) @@ -561,10 +597,12 @@ def _autopause(player): if not player.autoplaylist: if not self.autoplaylist: # TODO: When I add playlist expansion, make sure that's not happening during this check - log.warning("No playable songs in the autoplaylist, disabling.") + log.warning( + "No playable songs in the autoplaylist, disabling.") self.config.auto_playlist = False else: - log.debug("No content in current autoplaylist. Filling with new music...") + log.debug( + "No content in current autoplaylist. Filling with new music...") player.autoplaylist = list(self.autoplaylist) while player.autoplaylist: @@ -582,24 +620,28 @@ def _autopause(player): except downloader.youtube_dl.utils.DownloadError as e: if 'YouTube said:' in e.args[0]: # url is bork, remove from list and put in removed list - log.error("Error processing youtube url:\n{}".format(e.args[0])) + log.error( + "Error processing youtube url:\n{}".format(e.args[0])) else: # Probably an error from a different extractor, but I've only seen youtube's - log.error("Error processing \"{url}\": {ex}".format(url=song_url, ex=e)) + log.error("Error processing \"{url}\": {ex}".format( + url=song_url, ex=e)) await self.remove_from_autoplaylist(song_url, ex=e, delete_from_ap=self.config.remove_ap) continue except Exception as e: - log.error("Error processing \"{url}\": {ex}".format(url=song_url, ex=e)) + log.error("Error processing \"{url}\": {ex}".format( + url=song_url, ex=e)) log.exception() self.autoplaylist.remove(song_url) continue if info.get('entries', None): # or .get('_type', '') == 'playlist' - log.debug("Playlist found but is unsupported at this time, skipping.") + log.debug( + "Playlist found but is unsupported at this time, skipping.") # TODO: Playlist expansion # Do I check the initial conditions again? @@ -611,7 +653,8 @@ def _autopause(player): try: await player.playlist.add_entry(song_url, channel=None, author=None) except exceptions.ExtractionError as e: - log.error("Error adding song from autoplaylist: {}".format(e)) + log.error( + "Error adding song from autoplaylist: {}".format(e)) log.debug('', exc_info=True) continue @@ -619,10 +662,11 @@ def _autopause(player): if not self.autoplaylist: # TODO: When I add playlist expansion, make sure that's not happening during this check - log.warning("No playable songs in the autoplaylist, disabling.") + log.warning( + "No playable songs in the autoplaylist, disabling.") self.config.auto_playlist = False - else: # Don't serialize for autoplaylist events + else: # Don't serialize for autoplaylist events await self.serialize_queue(player.voice_client.channel.guild) if not player.is_stopped and not player.is_dead: @@ -637,7 +681,7 @@ async def on_player_error(self, player, entry, ex, **_): if 'channel' in entry.meta: await self.safe_send_message( entry.meta['channel'], - "```\nError from FFmpeg:\n{}\n```".format(ex) + "```\nError while playing:\n{}\n```".format(ex) ) else: log.exception("Player error", exc_info=ex) @@ -647,13 +691,16 @@ async def update_now_playing_status(self, entry=None, is_paused=False): if not self.config.status_message: if self.user.bot: - activeplayers = sum(1 for p in self.players.values() if p.is_playing) + activeplayers = sum( + 1 for p in self.players.values() if p.is_playing) if activeplayers > 1: - game = discord.Game(type=0, name="music on %s guilds" % activeplayers) + game = discord.Game( + type=0, name="music on %s guilds" % activeplayers) entry = None elif activeplayers == 1: - player = discord.utils.get(self.players.values(), is_playing=True) + player = discord.utils.get( + self.players.values(), is_playing=True) entry = player.current_entry if entry: @@ -662,7 +709,8 @@ async def update_now_playing_status(self, entry=None, is_paused=False): name = u'{}{}'.format(prefix, entry.title)[:128] game = discord.Game(type=0, name=name) else: - game = discord.Game(type=0, name=self.config.status_message.strip()[:128]) + game = discord.Game( + type=0, name=self.config.status_message.strip()[:128]) async with self.aiolocks[_func_()]: if game != self.last_status: @@ -687,7 +735,7 @@ async def update_now_playing_message(self, guild, message, *, channel=None): else: m = await self.safe_edit_message(lnp, message, send_if_fail=True, quiet=False) - elif channel: # If we have a new channel to send it to + elif channel: # If we have a new channel to send it to await self.safe_delete_message(lnp, quiet=True) m = await self.safe_send_message(channel, message, quiet=True) @@ -695,12 +743,11 @@ async def update_now_playing_message(self, guild, message, *, channel=None): await self.safe_delete_message(lnp, quiet=True) m = await self.safe_send_message(oldchannel, message, quiet=True) - elif channel: # No previous message + elif channel: # No previous message m = await self.safe_send_message(channel, message, quiet=True) self.server_specific_data[guild]['last_np_msg'] = m - async def serialize_queue(self, guild, *, dir=None): """ Serialize the current queue for a server's player to json. @@ -776,14 +823,13 @@ async def _on_ready_sanity_checks(self): # config/permissions async validate? await self._scheck_configs() - async def _scheck_ensure_env(self): log.debug("Ensuring data folders exist") for guild in self.guilds: pathlib.Path('data/%s/' % guild.id).mkdir(exist_ok=True) with open('data/server_names.txt', 'w', encoding='utf8') as f: - for guild in sorted(self.guilds, key=lambda s:int(s.id)): + for guild in sorted(self.guilds, key=lambda s: int(s.id)): f.write('{:<22} {}\n'.format(guild.id, guild.name)) if not self.config.save_videos and os.path.isdir(AUDIO_CACHE_PATH): @@ -792,14 +838,13 @@ async def _scheck_ensure_env(self): else: log.debug("Could not delete old audio cache, moving on.") - async def _scheck_server_permissions(self): log.debug("Checking server permissions") - pass # TODO + pass # TODO async def _scheck_autoplaylist(self): log.debug("Auditing autoplaylist") - pass # TODO + pass # TODO async def _scheck_configs(self): log.debug("Validating config") @@ -809,10 +854,8 @@ async def _scheck_configs(self): await self.permissions.async_validate(self) - ####################################################################################################################### - async def safe_send_message(self, dest, content, **kwargs): tts = kwargs.pop('tts', False) quiet = kwargs.pop('quiet', False) @@ -838,17 +881,20 @@ async def safe_send_message(self, dest, content, **kwargs): except discord.HTTPException: if len(content) > DISCORD_MSG_CHAR_LIMIT: - lfunc("Message is over the message size limit (%s)", DISCORD_MSG_CHAR_LIMIT) + lfunc("Message is over the message size limit (%s)", + DISCORD_MSG_CHAR_LIMIT) else: lfunc("Failed to send message") - log.noise("Got HTTPException trying to send message to %s: %s", dest, content) + log.noise( + "Got HTTPException trying to send message to %s: %s", dest, content) finally: if msg and expire_in: asyncio.ensure_future(self._wait_delete_msg(msg, expire_in)) if also_delete and isinstance(also_delete, discord.Message): - asyncio.ensure_future(self._wait_delete_msg(also_delete, expire_in)) + asyncio.ensure_future( + self._wait_delete_msg(also_delete, expire_in)) return msg @@ -859,10 +905,12 @@ async def safe_delete_message(self, message, *, quiet=False): return await message.delete() except discord.Forbidden: - lfunc("Cannot delete message \"{}\", no permission".format(message.clean_content)) + lfunc("Cannot delete message \"{}\", no permission".format( + message.clean_content)) except discord.NotFound: - lfunc("Cannot delete message \"{}\", message not found".format(message.clean_content)) + lfunc("Cannot delete message \"{}\", message not found".format( + message.clean_content)) async def safe_edit_message(self, message, new, *, send_if_fail=False, quiet=False): lfunc = log.debug if quiet else log.warning @@ -871,7 +919,8 @@ async def safe_edit_message(self, message, new, *, send_if_fail=False, quiet=Fal return await message.edit(content=new) except discord.NotFound: - lfunc("Cannot edit message \"{}\", message not found".format(message.clean_content)) + lfunc("Cannot edit message \"{}\", message not found".format( + message.clean_content)) if send_if_fail: lfunc("Sending message instead") return await self.safe_send_message(message.channel, new) @@ -880,7 +929,8 @@ async def send_typing(self, destination): try: return await destination.trigger_typing() except discord.Forbidden: - log.warning("Could not send typing to {}, no permission".format(destination)) + log.warning( + "Could not send typing to {}, no permission".format(destination)) async def restart(self): self.exit_signal = exceptions.RestartSignal() @@ -893,7 +943,8 @@ def _cleanup(self): try: self.loop.run_until_complete(self.logout()) self.loop.run_until_complete(self.aiosession.close()) - except: pass + except: + pass pending = asyncio.Task.all_tasks() gathered = asyncio.gather(*pending) @@ -902,7 +953,8 @@ def _cleanup(self): gathered.cancel() self.loop.run_until_complete(gathered) gathered.exception() - except: pass + except: + pass # noinspection PyMethodOverriding def run(self): @@ -915,7 +967,7 @@ def run(self): "Bot cannot login, bad credentials.", "Fix your token in the options file. " "Remember that each field should be on their own line." - ) # ^^^^ In theory self.config.auth should never have no items + ) # ^^^^ In theory self.config.auth should never have no items finally: try: @@ -924,7 +976,7 @@ def run(self): log.error("Error in cleanup", exc_info=True) if self.exit_signal: - raise self.exit_signal # pylint: disable=E0702 + raise self.exit_signal # pylint: disable=E0702 async def logout(self): await self.disconnect_all_voice_clients() @@ -961,7 +1013,8 @@ async def on_ready(self): self.ws._keep_alive.name = 'Gateway Keepalive' if self.init_ok: - log.debug("Received additional READY event, may have failed to resume") + log.debug( + "Received additional READY event, may have failed to resume") return await self._on_ready_sanity_checks() @@ -987,7 +1040,8 @@ async def on_ready(self): log.info('Guild List:') unavailable_servers = 0 for s in self.guilds: - ser = ('{} (unavailable)'.format(s.name) if s.unavailable else s.name) + ser = ('{} (unavailable)'.format(s.name) + if s.unavailable else s.name) log.info(' - ' + ser) if self.config.leavenonowners: if s.unavailable: @@ -996,16 +1050,20 @@ async def on_ready(self): check = s.get_member(owner.id) if check == None: await s.leave() - log.info('Left {} due to bot owner not found'.format(s.name)) + log.info( + 'Left {} due to bot owner not found'.format(s.name)) if unavailable_servers != 0: - log.info('Not proceeding with checks in {} servers due to unavailability'.format(str(unavailable_servers))) + log.info('Not proceeding with checks in {} servers due to unavailability'.format( + str(unavailable_servers))) elif self.guilds: - log.warning("Owner could not be found on any guild (id: %s)\n" % self.config.owner_id) + log.warning( + "Owner could not be found on any guild (id: %s)\n" % self.config.owner_id) log.info('Guild List:') for s in self.guilds: - ser = ('{} (unavailable)'.format(s.name) if s.unavailable else s.name) + ser = ('{} (unavailable)'.format(s.name) + if s.unavailable else s.name) log.info(' - ' + ser) else: @@ -1021,25 +1079,29 @@ async def on_ready(self): print(flush=True) if self.config.bound_channels: - chlist = set(self.get_channel(i) for i in self.config.bound_channels if i) + chlist = set(self.get_channel(i) + for i in self.config.bound_channels if i) chlist.discard(None) invalids = set() - invalids.update(c for c in chlist if isinstance(c, discord.VoiceChannel)) + invalids.update(c for c in chlist if isinstance( + c, discord.VoiceChannel)) chlist.difference_update(invalids) self.config.bound_channels.difference_update(invalids) if chlist: log.info("Bound to text channels:") - [log.info(' - {}/{}'.format(ch.guild.name.strip(), ch.name.strip())) for ch in chlist if ch] + [log.info(' - {}/{}'.format(ch.guild.name.strip(), + ch.name.strip())) for ch in chlist if ch] else: print("Not bound to any text channels") if invalids and self.config.debug_mode: print(flush=True) log.info("Not binding to voice channels:") - [log.info(' - {}/{}'.format(ch.guild.name.strip(), ch.name.strip())) for ch in invalids if ch] + [log.info(' - {}/{}'.format(ch.guild.name.strip(), + ch.name.strip())) for ch in invalids if ch] print(flush=True) @@ -1047,57 +1109,76 @@ async def on_ready(self): log.info("Not bound to any text channels") if self.config.autojoin_channels: - chlist = set(self.get_channel(i) for i in self.config.autojoin_channels if i) + chlist = set(self.get_channel(i) + for i in self.config.autojoin_channels if i) chlist.discard(None) invalids = set() - invalids.update(c for c in chlist if isinstance(c, discord.TextChannel)) + invalids.update(c for c in chlist if isinstance( + c, discord.TextChannel)) chlist.difference_update(invalids) self.config.autojoin_channels.difference_update(invalids) if chlist: log.info("Autojoining voice channels:") - [log.info(' - {}/{}'.format(ch.guild.name.strip(), ch.name.strip())) for ch in chlist if ch] + [log.info(' - {}/{}'.format(ch.guild.name.strip(), + ch.name.strip())) for ch in chlist if ch] else: log.info("Not autojoining any voice channels") if invalids and self.config.debug_mode: print(flush=True) log.info("Cannot autojoin text channels:") - [log.info(' - {}/{}'.format(ch.guild.name.strip(), ch.name.strip())) for ch in invalids if ch] + [log.info(' - {}/{}'.format(ch.guild.name.strip(), + ch.name.strip())) for ch in invalids if ch] self.autojoin_channels = chlist else: log.info("Not autojoining any voice channels") self.autojoin_channels = set() - + if self.config.show_config_at_start: print(flush=True) log.info("Options:") log.info(" Command prefix: " + self.config.command_prefix) - log.info(" Default volume: {}%".format(int(self.config.default_volume * 100))) + log.info(" Default volume: {}%".format( + int(self.config.default_volume * 100))) log.info(" Skip threshold: {} votes or {}%".format( self.config.skips_required, fixg(self.config.skip_ratio_required * 100))) - log.info(" Now Playing @mentions: " + ['Disabled', 'Enabled'][self.config.now_playing_mentions]) - log.info(" Auto-Summon: " + ['Disabled', 'Enabled'][self.config.auto_summon]) - log.info(" Auto-Playlist: " + ['Disabled', 'Enabled'][self.config.auto_playlist] + " (order: " + ['sequential', 'random'][self.config.auto_playlist_random] + ")") - log.info(" Auto-Pause: " + ['Disabled', 'Enabled'][self.config.auto_pause]) - log.info(" Delete Messages: " + ['Disabled', 'Enabled'][self.config.delete_messages]) + log.info(" Now Playing @mentions: " + + ['Disabled', 'Enabled'][self.config.now_playing_mentions]) + log.info(" Auto-Summon: " + + ['Disabled', 'Enabled'][self.config.auto_summon]) + log.info(" Auto-Playlist: " + ['Disabled', 'Enabled'][self.config.auto_playlist] + + " (order: " + ['sequential', 'random'][self.config.auto_playlist_random] + ")") + log.info(" Auto-Pause: " + + ['Disabled', 'Enabled'][self.config.auto_pause]) + log.info(" Delete Messages: " + + ['Disabled', 'Enabled'][self.config.delete_messages]) if self.config.delete_messages: - log.info(" Delete Invoking: " + ['Disabled', 'Enabled'][self.config.delete_invoking]) - log.info(" Debug Mode: " + ['Disabled', 'Enabled'][self.config.debug_mode]) - log.info(" Downloaded songs will be " + ['deleted', 'saved'][self.config.save_videos]) + log.info(" Delete Invoking: " + + ['Disabled', 'Enabled'][self.config.delete_invoking]) + log.info(" Debug Mode: " + + ['Disabled', 'Enabled'][self.config.debug_mode]) + log.info(" Downloaded songs will be " + + ['deleted', 'saved'][self.config.save_videos]) if self.config.status_message: log.info(" Status message: " + self.config.status_message) - log.info(" Write current songs to file: " + ['Disabled', 'Enabled'][self.config.write_current_song]) - log.info(" Author insta-skip: " + ['Disabled', 'Enabled'][self.config.allow_author_skip]) - log.info(" Embeds: " + ['Disabled', 'Enabled'][self.config.embeds]) - log.info(" Spotify integration: " + ['Disabled', 'Enabled'][self.config._spotify]) - log.info(" Legacy skip: " + ['Disabled', 'Enabled'][self.config.legacy_skip]) - log.info(" Leave non owners: " + ['Disabled', 'Enabled'][self.config.leavenonowners]) + log.info(" Write current songs to file: " + + ['Disabled', 'Enabled'][self.config.write_current_song]) + log.info(" Author insta-skip: " + + ['Disabled', 'Enabled'][self.config.allow_author_skip]) + log.info(" Embeds: " + ['Disabled', + 'Enabled'][self.config.embeds]) + log.info(" Spotify integration: " + + ['Disabled', 'Enabled'][self.config._spotify]) + log.info(" Legacy skip: " + + ['Disabled', 'Enabled'][self.config.legacy_skip]) + log.info(" Leave non owners: " + + ['Disabled', 'Enabled'][self.config.leavenonowners]) print(flush=True) @@ -1121,8 +1202,10 @@ def _gen_embed(self): """Provides a basic template for embeds""" e = discord.Embed() e.colour = 7506394 - e.set_footer(text='Just-Some-Bots/MusicBot ({})'.format(BOTVERSION), icon_url='https://i.imgur.com/gFHBoZA.png') - e.set_author(name=self.user.name, url='https://github.com/Just-Some-Bots/MusicBot', icon_url=self.user.avatar_url) + e.set_footer(text=self.config.footer_text, + icon_url='https://i.imgur.com/gFHBoZA.png') + e.set_author(name=self.user.name, url='https://github.com/Team-JSB/MusicBot', + icon_url=self.user.avatar_url) return e async def cmd_resetplaylist(self, player, channel): @@ -1163,7 +1246,8 @@ async def cmd_help(self, message, channel, command=None): delete_after=60 ) else: - raise exceptions.CommandError(self.str.get('cmd-help-invalid', "No such command"), expire_in=10) + raise exceptions.CommandError(self.str.get( + 'cmd-help-invalid', "No such command"), expire_in=10) elif message.author.id == self.config.owner_id: await self.gen_cmd_list(message, list_all_cmds=True) @@ -1173,9 +1257,10 @@ async def cmd_help(self, message, channel, command=None): desc = '```\n' + ', '.join(self.commands) + '\n```\n' + self.str.get( 'cmd-help-response', 'For information about a particular command, run `{}help [command]`\n' - 'For further help, see https://just-some-bots.github.io/MusicBot/').format(prefix) + 'For further help, see https://team-jsb.github.io/MusicBot/').format(prefix) if not self.is_all: - desc += self.str.get('cmd-help-all', '\nOnly showing commands you can use, for a list of all commands, run `{}help all`').format(prefix) + desc += self.str.get('cmd-help-all', + '\nOnly showing commands you can use, for a list of all commands, run `{}help all`').format(prefix) return Response(desc, reply=True, delete_after=60) @@ -1209,7 +1294,8 @@ async def cmd_blacklist(self, message, user_mentions, option, something): write_file(self.config.blacklist_file, self.blacklist) return Response( - self.str.get('cmd-blacklist-added', '{0} users have been added to the blacklist').format(len(self.blacklist) - old_len), + self.str.get('cmd-blacklist-added', '{0} users have been added to the blacklist').format( + len(self.blacklist) - old_len), reply=True, delete_after=10 ) @@ -1218,11 +1304,13 @@ async def cmd_blacklist(self, message, user_mentions, option, something): return Response(self.str.get('cmd-blacklist-none', 'None of those users are in the blacklist.'), reply=True, delete_after=10) else: - self.blacklist.difference_update(user.id for user in user_mentions) + self.blacklist.difference_update( + user.id for user in user_mentions) write_file(self.config.blacklist_file, self.blacklist) return Response( - self.str.get('cmd-blacklist-removed', '{0} users have been removed from the blacklist').format(old_len - len(self.blacklist)), + self.str.get('cmd-blacklist-removed', '{0} users have been removed from the blacklist').format( + old_len - len(self.blacklist)), reply=True, delete_after=10 ) @@ -1256,9 +1344,11 @@ async def cmd_save(self, player, url=None): log.debug("Appended {} to autoplaylist".format(url)) return Response(self.str.get('cmd-save-success', 'Added <{0}> to the autoplaylist.').format(url)) else: - raise exceptions.CommandError(self.str.get('cmd-save-exists', 'This song is already in the autoplaylist.')) + raise exceptions.CommandError(self.str.get( + 'cmd-save-exists', 'This song is already in the autoplaylist.')) else: - raise exceptions.CommandError(self.str.get('cmd-save-invalid', 'There is no valid song playing.')) + raise exceptions.CommandError(self.str.get( + 'cmd-save-invalid', 'There is no valid song playing.')) @owner_only async def cmd_joinserver(self, message, server_link=None): @@ -1271,7 +1361,8 @@ async def cmd_joinserver(self, message, server_link=None): url = await self.generate_invite_link() return Response( - self.str.get('cmd-joinserver-response', "Click here to add me to a server: \n{}").format(url), + self.str.get('cmd-joinserver-response', + "Click here to add me to a server: \n{}").format(url), reply=True, delete_after=30 ) @@ -1291,11 +1382,13 @@ async def _do_playlist_checks(self, permissions, player, author, testobj): # I have to do exe extra checks anyways because you can request an arbitrary number of search results if not permissions.allow_playlists and num_songs > 1: - raise exceptions.PermissionsError(self.str.get('playlists-noperms', "You are not allowed to request playlists"), expire_in=30) + raise exceptions.PermissionsError(self.str.get( + 'playlists-noperms', "You are not allowed to request playlists"), expire_in=30) if permissions.max_playlist_length and num_songs > permissions.max_playlist_length: raise exceptions.PermissionsError( - self.str.get('playlists-big', "Playlist has too many entries ({0} > {1})").format(num_songs, permissions.max_playlist_length), + self.str.get('playlists-big', "Playlist has too many entries ({0} > {1})").format( + num_songs, permissions.max_playlist_length), expire_in=30 ) @@ -1335,17 +1428,21 @@ async def cmd_play(self, message, player, channel, author, permissions, leftover linksRegex = '((http(s)*:[/][/]|www.)([a-z]|[A-Z]|[0-9]|[/.]|[~])*)' pattern = re.compile(linksRegex) matchUrl = pattern.match(song_url) - song_url = song_url.replace('/', '%2F') if matchUrl is None else song_url + song_url = song_url.replace( + '/', '%2F') if matchUrl is None else song_url # Rewrite YouTube playlist URLs if the wrong URL type is given playlistRegex = r'watch\?v=.+&(list=[^&]+)' matches = re.search(playlistRegex, song_url) groups = matches.groups() if matches is not None else [] - song_url = "https://www.youtube.com/playlist?" + groups[0] if len(groups) > 0 else song_url + song_url = "https://www.youtube.com/playlist?" + \ + groups[0] if len(groups) > 0 else song_url if self.config._spotify: if 'open.spotify.com' in song_url: - song_url = 'spotify:' + re.sub('(http[s]?:\/\/)?(open.spotify.com)\/', '', song_url).replace('/', ':') + song_url = 'spotify:' + \ + re.sub('(http[s]?:\/\/)?(open.spotify.com)\/', + '', song_url).replace('/', ':') # remove session id (and other query stuff) song_url = re.sub('\?.*', '', song_url) if song_url.startswith('spotify:'): @@ -1353,19 +1450,21 @@ async def cmd_play(self, message, player, channel, author, permissions, leftover try: if 'track' in parts: res = await self.spotify.get_track(parts[-1]) - song_url = res['artists'][0]['name'] + ' ' + res['name'] + song_url = res['artists'][0]['name'] + \ + ' ' + res['name'] elif 'album' in parts: res = await self.spotify.get_album(parts[-1]) await self._do_playlist_checks(permissions, player, author, res['tracks']['items']) procmesg = await self.safe_send_message(channel, self.str.get('cmd-play-spotify-album-process', 'Processing album `{0}` (`{1}`)').format(res['name'], song_url)) for i in res['tracks']['items']: - song_url = i['name'] + ' ' + i['artists'][0]['name'] + song_url = i['name'] + ' ' + \ + i['artists'][0]['name'] log.debug('Processing {0}'.format(song_url)) await self.cmd_play(message, player, channel, author, permissions, leftover_args, song_url) await self.safe_delete_message(procmesg) return Response(self.str.get('cmd-play-spotify-album-queued', "Enqueued `{0}` with **{1}** songs.").format(res['name'], len(res['tracks']['items']))) - + elif 'playlist' in parts: res = [] r = await self.spotify.get_playlist_tracks(parts[-1]) @@ -1379,16 +1478,32 @@ async def cmd_play(self, message, player, channel, author, permissions, leftover await self._do_playlist_checks(permissions, player, author, res) procmesg = await self.safe_send_message(channel, self.str.get('cmd-play-spotify-playlist-process', 'Processing playlist `{0}` (`{1}`)').format(parts[-1], song_url)) for i in res: - song_url = i['track']['name'] + ' ' + i['track']['artists'][0]['name'] + song_url = i['track']['name'] + ' ' + \ + i['track']['artists'][0]['name'] log.debug('Processing {0}'.format(song_url)) await self.cmd_play(message, player, channel, author, permissions, leftover_args, song_url) await self.safe_delete_message(procmesg) return Response(self.str.get('cmd-play-spotify-playlist-queued', "Enqueued `{0}` with **{1}** songs.").format(parts[-1], len(res))) - + else: - raise exceptions.CommandError(self.str.get('cmd-play-spotify-unsupported', 'That is not a supported Spotify URI.'), expire_in=30) + raise exceptions.CommandError(self.str.get( + 'cmd-play-spotify-unsupported', 'That is not a supported Spotify URI.'), expire_in=30) except exceptions.SpotifyError: - raise exceptions.CommandError(self.str.get('cmd-play-spotify-invalid', 'You either provided an invalid URI, or there was a problem.')) + raise exceptions.CommandError(self.str.get( + 'cmd-play-spotify-invalid', 'You either provided an invalid URI, or there was a problem.')) + + async def get_info(song_url): + info = await self.downloader.extract_info(player.playlist.loop, song_url, download=False, process=False) + # If there is an exception arise when processing we go on and let extract_info down the line report it + # because info might be a playlist and thing that's broke it might be individual entry + try: + info_process = await self.downloader.extract_info(player.playlist.loop, song_url, download=False) + info_process_err = None + except Exception as e: + info_process = None + info_process_err = e + + return (info, info_process, info_process_err) # This lock prevent spamming play command to add entries that exceeds time limit/ maximum song limit async with self.aiolocks[_func_() + ':' + str(author.id)]: @@ -1405,23 +1520,19 @@ async def cmd_play(self, message, player, channel, author, permissions, leftover # Try to determine entry type, if _type is playlist then there should be entries while True: try: - info = await self.downloader.extract_info(player.playlist.loop, song_url, download=False, process=False) - # If there is an exception arise when processing we go on and let extract_info down the line report it - # because info might be a playlist and thing that's broke it might be individual entry - try: - info_process = await self.downloader.extract_info(player.playlist.loop, song_url, download=False) - except: - info_process = None - + info, info_process, info_process_err = await get_info(song_url) log.debug(info) if info_process and info and info_process.get('_type', None) == 'playlist' and 'entries' not in info and not info.get('url', '').startswith('ytsearch'): - use_url = info_process.get('webpage_url', None) or info_process.get('url', None) + use_url = info_process.get( + 'webpage_url', None) or info_process.get('url', None) if use_url == song_url: - log.warning("Determined incorrect entry type, but suggested url is the same. Help.") - break # If we break here it will break things down the line and give "This is a playlist" exception as a result + log.warning( + "Determined incorrect entry type, but suggested url is the same. Help.") + break # If we break here it will break things down the line and give "This is a playlist" exception as a result - log.debug("Assumed url \"%s\" was a single entry, was actually a playlist" % song_url) + log.debug( + "Assumed url \"%s\" was a single entry, was actually a playlist" % song_url) log.debug("Using \"%s\" instead" % use_url) song_url = use_url else: @@ -1429,14 +1540,16 @@ async def cmd_play(self, message, player, channel, author, permissions, leftover except Exception as e: if 'unknown url type' in str(e): - song_url = song_url.replace(':', '') # it's probably not actually an extractor - info = await self.downloader.extract_info(player.playlist.loop, song_url, download=False, process=False) + # it's probably not actually an extractor + song_url = song_url.replace(':', '') + info, info_process, info_process_err = await get_info(song_url) else: raise exceptions.CommandError(e, expire_in=30) if not info: raise exceptions.CommandError( - self.str.get('cmd-play-noinfo', "That video cannot be played. Try using the {0}stream command.").format(self.config.command_prefix), + self.str.get( + 'cmd-play-noinfo', "That video cannot be played. Try using the {0}stream command.").format(self.config.command_prefix), expire_in=30 ) @@ -1449,32 +1562,22 @@ async def cmd_play(self, message, player, channel, author, permissions, leftover # our ytdl options allow us to use search strings as input urls if info.get('url', '').startswith('ytsearch'): # print("[Command:play] Searching for \"%s\"" % song_url) - info = await self.downloader.extract_info( - player.playlist.loop, - song_url, - download=False, - process=True, # ASYNC LAMBDAS WHEN - on_error=lambda e: asyncio.ensure_future( - self.safe_send_message(channel, "```\n%s\n```" % e, expire_in=120), loop=self.loop), - retry_on_error=True - ) - - if not info: + if info_process: + info = info_process + else: + await self.safe_send_message(channel, "```\n%s\n```" % info_process_err, expire_in=120) raise exceptions.CommandError( self.str.get('cmd-play-nodata', "Error extracting info from search string, youtubedl returned no data. " "You may need to restart the bot if this continues to happen."), expire_in=30 ) - if not all(info.get('entries', [])): - # empty list, no data - log.debug("Got empty list, no data") - return + song_url = info_process.get( + 'webpage_url', None) or info_process.get('url', None) - # TODO: handle 'webpage_url' being 'ytsearch:...' or extractor type - song_url = info['entries'][0]['webpage_url'] - info = await self.downloader.extract_info(player.playlist.loop, song_url, download=False, process=False) - # Now I could just do: return await self.cmd_play(player, channel, author, song_url) - # But this is probably fine + if 'entries' in info: + # if entry is playlist then only get the first one + song_url = info['entries'][0]['webpage_url'] + info = info['entries'][0] # If it's playlist if 'entries' in info: @@ -1489,7 +1592,8 @@ async def cmd_play(self, message, player, channel, author, permissions, leftover raise except Exception as e: log.error("Error queuing playlist", exc_info=True) - raise exceptions.CommandError(self.str.get('cmd-play-playlist-error', "Error queuing playlist:\n`{0}`").format(e), expire_in=30) + raise exceptions.CommandError(self.str.get( + 'cmd-play-playlist-error', "Error queuing playlist:\n`{0}`").format(e), expire_in=30) t0 = time.time() @@ -1544,11 +1648,13 @@ async def cmd_play(self, message, player, channel, author, permissions, leftover if not listlen - drop_count: raise exceptions.CommandError( - self.str.get('cmd-play-playlist-maxduration', "No songs were added, all songs were over max duration (%ss)") % permissions.max_song_length, + self.str.get('cmd-play-playlist-maxduration', + "No songs were added, all songs were over max duration (%ss)") % permissions.max_song_length, expire_in=30 ) - reply_text = self.str.get('cmd-play-playlist-reply', "Enqueued **%s** songs to be played. Position in queue: %s") + reply_text = self.str.get( + 'cmd-play-playlist-reply', "Enqueued **%s** songs to be played. Position in queue: %s") btext = str(listlen - drop_count) # If it's an entry @@ -1562,13 +1668,15 @@ async def cmd_play(self, message, player, channel, author, permissions, leftover if permissions.max_song_length and info.get('duration', 0) > permissions.max_song_length: raise exceptions.PermissionsError( - self.str.get('cmd-play-song-limit', "Song duration exceeds limit ({0} > {1})").format(info['duration'], permissions.max_song_length), + self.str.get('cmd-play-song-limit', "Song duration exceeds limit ({0} > {1})").format( + info['duration'], permissions.max_song_length), expire_in=30 ) entry, position = await player.playlist.add_entry(song_url, channel=channel, author=author) - reply_text = self.str.get('cmd-play-song-reply', "Enqueued `%s` to be played. Position in queue: %s") + reply_text = self.str.get( + 'cmd-play-song-reply', "Enqueued `%s` to be played. Position in queue: %s") btext = entry.title if position == 1 and player.is_stopped: @@ -1576,14 +1684,16 @@ async def cmd_play(self, message, player, channel, author, permissions, leftover reply_text %= (btext, position) else: + reply_text %= (btext, position) try: time_until = await player.playlist.estimate_time_until(position, player) - reply_text += self.str.get('cmd-play-eta', ' - estimated time until playing: %s') + reply_text += (self.str.get('cmd-play-eta', + ' - estimated time until playing: %s') % ftimedelta(time_until)) + except exceptions.InvalidDataError: + reply_text += self.str.get('cmd-play-eta-error', + ' - cannot estimate time until playing') except: traceback.print_exc() - time_until = '' - - reply_text %= (btext, position, ftimedelta(time_until)) return Response(reply_text, delete_after=30) @@ -1596,7 +1706,8 @@ async def _cmd_play_playlist_async(self, player, channel, author, permissions, p info = await self.downloader.extract_info(player.playlist.loop, playlist_url, download=False, process=False) if not info: - raise exceptions.CommandError(self.str.get('cmd-play-playlist-invalid', "That playlist cannot be played.")) + raise exceptions.CommandError(self.str.get( + 'cmd-play-playlist-invalid', "That playlist cannot be played.")) num_songs = sum(1 for _ in info['entries']) t0 = time.time() @@ -1615,7 +1726,8 @@ async def _cmd_play_playlist_async(self, player, channel, author, permissions, p except Exception: log.error("Error processing playlist", exc_info=True) - raise exceptions.CommandError(self.str.get('cmd-play-playlist-queueerror', 'Error handling playlist {0} queuing.').format(playlist_url), expire_in=30) + raise exceptions.CommandError(self.str.get( + 'cmd-play-playlist-queueerror', 'Error handling playlist {0} queuing.').format(playlist_url), expire_in=30) elif extractor_type.lower() in ['soundcloud:set', 'bandcamp:album']: try: @@ -1626,8 +1738,8 @@ async def _cmd_play_playlist_async(self, player, channel, author, permissions, p except Exception: log.error("Error processing playlist", exc_info=True) - raise exceptions.CommandError(self.str.get('cmd-play-playlist-queueerror', 'Error handling playlist {0} queuing.').format(playlist_url), expire_in=30) - + raise exceptions.CommandError(self.str.get( + 'cmd-play-playlist-queueerror', 'Error handling playlist {0} queuing.').format(playlist_url), expire_in=30) songs_processed = len(entries_added) drop_count = 0 @@ -1672,9 +1784,11 @@ async def _cmd_play_playlist_async(self, player, channel, author, permissions, p ) if not songs_added: - basetext = self.str.get('cmd-play-playlist-maxduration', "No songs were added, all songs were over max duration (%ss)") % permissions.max_song_length + basetext = self.str.get('cmd-play-playlist-maxduration', + "No songs were added, all songs were over max duration (%ss)") % permissions.max_song_length if skipped: - basetext += self.str.get('cmd-play-playlist-skipped', "\nAdditionally, the current song was skipped for being too long.") + basetext += self.str.get('cmd-play-playlist-skipped', + "\nAdditionally, the current song was skipped for being too long.") raise exceptions.CommandError(basetext, expire_in=30) @@ -1729,7 +1843,8 @@ async def cmd_search(self, message, player, channel, author, permissions, leftov if permissions.max_songs and player.playlist.count_for_user(author) > permissions.max_songs: raise exceptions.PermissionsError( - self.str.get('cmd-search-limit', "You have reached your playlist item limit ({0})").format(permissions.max_songs), + self.str.get( + 'cmd-search-limit', "You have reached your playlist item limit ({0})").format(permissions.max_songs), expire_in=30 ) @@ -1752,7 +1867,8 @@ def argcheck(): try: leftover_args = shlex.split(' '.join(leftover_args)) except ValueError: - raise exceptions.CommandError(self.str.get('cmd-search-noquote', "Please quote your search query properly."), expire_in=30) + raise exceptions.CommandError(self.str.get( + 'cmd-search-noquote', "Please quote your search query properly."), expire_in=30) service = 'youtube' items_requested = 3 @@ -1775,7 +1891,8 @@ def argcheck(): argcheck() if items_requested > max_items: - raise exceptions.CommandError(self.str.get('cmd-search-searchlimit', "You cannot search for more than %s videos") % max_items) + raise exceptions.CommandError(self.str.get( + 'cmd-search-searchlimit', "You cannot search for more than %s videos") % max_items) # Look jake, if you see this and go "what the fuck are you doing" # and have a better idea on how to do this, i'd be delighted to know. @@ -1787,7 +1904,8 @@ def argcheck(): leftover_args[0] = leftover_args[0].lstrip(lchar) leftover_args[-1] = leftover_args[-1].rstrip(lchar) - search_query = '%s%s:%s' % (services[service], items_requested, ' '.join(leftover_args)) + search_query = '%s%s:%s' % ( + services[service], items_requested, ' '.join(leftover_args)) search_msg = await self.safe_send_message(channel, self.str.get('cmd-search-searching', "Searching for videos...")) await self.send_typing(channel) @@ -1809,7 +1927,8 @@ def argcheck(): info['entries'].index(e) + 1, len(info['entries']), e['webpage_url'])) def check(reaction, user): - return user == message.author and reaction.message.id == result_message.id # why can't these objs be compared directly? + # why can't these objs be compared directly? + return user == message.author and reaction.message.id == result_message.id reactions = ['\u2705', '\U0001F6AB', '\U0001F3C1'] for r in reactions: @@ -1849,7 +1968,8 @@ async def cmd_np(self, player, channel, guild, message): # TODO: Fix timedelta garbage with util function song_progress = ftimedelta(timedelta(seconds=player.progress)) - song_total = ftimedelta(timedelta(seconds=player.current_entry.duration)) + song_total = ftimedelta(timedelta(seconds=player.current_entry.duration) + ) if player.current_entry.duration != None else '(no duration data)' streaming = isinstance(player.current_entry, StreamPlaylistEntry) prog_str = ('`[{progress}]`' if streaming else '`[{progress}/{total}]`').format( @@ -1859,7 +1979,7 @@ async def cmd_np(self, player, channel, guild, message): # percentage shows how much of the current song has already been played percentage = 0.0 - if player.current_entry.duration > 0: + if player.current_entry.duration and player.current_entry.duration > 0: percentage = player.progress / player.current_entry.duration # create the actual bar @@ -1870,7 +1990,8 @@ async def cmd_np(self, player, channel, guild, message): else: prog_bar_str += '■' - action_text = self.str.get('cmd-np-action-streaming', 'Streaming') if streaming else self.str.get('cmd-np-action-playing', 'Playing') + action_text = self.str.get( + 'cmd-np-action-streaming', 'Streaming') if streaming else self.str.get('cmd-np-action-playing', 'Playing') if player.current_entry.meta.get('channel', False) and player.current_entry.meta.get('author', False): np_text = self.str.get('cmd-np-reply-author', "Now {action}: **{title}** added by **{author}**\nProgress: {progress_bar} {progress}\n\N{WHITE RIGHT POINTING BACKHAND INDEX} <{url}>").format( @@ -1896,7 +2017,8 @@ async def cmd_np(self, player, channel, guild, message): await self._manual_delete_check(message) else: return Response( - self.str.get('cmd-np-none', 'There are no songs queued! Queue something with {0}play.') .format(self.config.command_prefix), + self.str.get( + 'cmd-np-none', 'There are no songs queued! Queue something with {0}play.') .format(self.config.command_prefix), delete_after=30 ) @@ -1909,7 +2031,8 @@ async def cmd_summon(self, channel, guild, author, voice_channel): """ if not author.voice: - raise exceptions.CommandError(self.str.get('cmd-summon-novc', 'You are not connected to voice. Try joining a voice channel!')) + raise exceptions.CommandError(self.str.get( + 'cmd-summon-novc', 'You are not connected to voice. Try joining a voice channel!')) voice_client = self.voice_client_in(guild) if voice_client and guild == author.voice.channel.guild: @@ -1919,16 +2042,20 @@ async def cmd_summon(self, channel, guild, author, voice_channel): chperms = author.voice.channel.permissions_for(guild.me) if not chperms.connect: - log.warning("Cannot join channel '{0}', no permission.".format(author.voice.channel.name)) + log.warning("Cannot join channel '{0}', no permission.".format( + author.voice.channel.name)) raise exceptions.CommandError( - self.str.get('cmd-summon-noperms-connect', "Cannot join channel `{0}`, no permission to connect.").format(author.voice.channel.name), + self.str.get('cmd-summon-noperms-connect', + "Cannot join channel `{0}`, no permission to connect.").format(author.voice.channel.name), expire_in=25 ) elif not chperms.speak: - log.warning("Cannot join channel '{0}', no permission to speak.".format(author.voice.channel.name)) + log.warning("Cannot join channel '{0}', no permission to speak.".format( + author.voice.channel.name)) raise exceptions.CommandError( - self.str.get('cmd-summon-noperms-speak', "Cannot join channel `{0}`, no permission to speak.").format(author.voice.channel.name), + self.str.get('cmd-summon-noperms-speak', + "Cannot join channel `{0}`, no permission to speak.").format(author.voice.channel.name), expire_in=25 ) @@ -1940,7 +2067,8 @@ async def cmd_summon(self, channel, guild, author, voice_channel): if self.config.auto_playlist: await self.on_player_finished_playing(player) - log.info("Joining {0.guild.name}/{0.name}".format(author.voice.channel)) + log.info( + "Joining {0.guild.name}/{0.name}".format(author.voice.channel)) return Response(self.str.get('cmd-summon-reply', 'Connected to `{0.name}`').format(author.voice.channel)) @@ -1957,7 +2085,8 @@ async def cmd_pause(self, player): return Response(self.str.get('cmd-pause-reply', 'Paused music in `{0.name}`').format(player.voice_client.channel)) else: - raise exceptions.CommandError(self.str.get('cmd-pause-none', 'Player is not playing.'), expire_in=30) + raise exceptions.CommandError(self.str.get( + 'cmd-pause-none', 'Player is not playing.'), expire_in=30) async def cmd_resume(self, player): """ @@ -1970,9 +2099,11 @@ async def cmd_resume(self, player): if player.is_paused: player.resume() return Response(self.str.get('cmd-resume-reply', 'Resumed music in `{0.name}`').format(player.voice_client.channel), delete_after=15) - + elif player.is_stopped and player.playlist: + player.play() else: - raise exceptions.CommandError(self.str.get('cmd-resume-none', 'Player is not paused.'), expire_in=30) + raise exceptions.CommandError(self.str.get( + 'cmd-resume-none', 'Player is not paused.'), expire_in=30) async def cmd_shuffle(self, channel, player): """ @@ -1984,7 +2115,8 @@ async def cmd_shuffle(self, channel, player): player.playlist.shuffle() - cards = ['\N{BLACK SPADE SUIT}', '\N{BLACK CLUB SUIT}', '\N{BLACK HEART SUIT}', '\N{BLACK DIAMOND SUIT}'] + cards = ['\N{BLACK SPADE SUIT}', '\N{BLACK CLUB SUIT}', + '\N{BLACK HEART SUIT}', '\N{BLACK DIAMOND SUIT}'] random.shuffle(cards) hand = await self.safe_send_message(channel, ' '.join(cards)) @@ -2018,13 +2150,15 @@ async def cmd_remove(self, user_mentions, message, author, permissions, channel, """ if not player.playlist.entries: - raise exceptions.CommandError(self.str.get('cmd-remove-none', "There's nothing to remove!"), expire_in=20) + raise exceptions.CommandError(self.str.get( + 'cmd-remove-none', "There's nothing to remove!"), expire_in=20) if user_mentions: for user in user_mentions: if permissions.remove or author == user: try: - entry_indexes = [e for e in player.playlist.entries if e.meta.get('author', None) == user] + entry_indexes = [e for e in player.playlist.entries if e.meta.get( + 'author', None) == user] for entry in entry_indexes: player.playlist.entries.remove(entry) entry_text = '%s ' % len(entry_indexes) + 'item' @@ -2033,7 +2167,8 @@ async def cmd_remove(self, user_mentions, message, author, permissions, channel, return Response(self.str.get('cmd-remove-reply', "Removed `{0}` added by `{1}`").format(entry_text, user.name).strip()) except ValueError: - raise exceptions.CommandError(self.str.get('cmd-remove-missing', "Nothing found in the queue from user `%s`") % user.name, expire_in=20) + raise exceptions.CommandError(self.str.get( + 'cmd-remove-missing', "Nothing found in the queue from user `%s`") % user.name, expire_in=20) raise exceptions.PermissionsError( self.str.get('cmd-remove-noperms', "You do not have the valid permissions to remove that entry from the queue, make sure you're the one who queued it or have instant skip permissions"), expire_in=20) @@ -2044,10 +2179,12 @@ async def cmd_remove(self, user_mentions, message, author, permissions, channel, try: index = int(index) except (TypeError, ValueError): - raise exceptions.CommandError(self.str.get('cmd-remove-invalid', "Invalid number. Use {}queue to find queue positions.").format(self.config.command_prefix), expire_in=20) + raise exceptions.CommandError(self.str.get( + 'cmd-remove-invalid', "Invalid number. Use {}queue to find queue positions.").format(self.config.command_prefix), expire_in=20) if index > len(player.playlist.entries): - raise exceptions.CommandError(self.str.get('cmd-remove-invalid', "Invalid number. Use {}queue to find queue positions.").format(self.config.command_prefix), expire_in=20) + raise exceptions.CommandError(self.str.get( + 'cmd-remove-invalid', "Invalid number. Use {}queue to find queue positions.").format(self.config.command_prefix), expire_in=20) if permissions.remove or author == player.playlist.get_entry_at_index(index - 1).meta.get('author', None): entry = player.playlist.delete_entry_at_index((index - 1)) @@ -2071,7 +2208,8 @@ async def cmd_skip(self, player, channel, author, message, permissions, voice_ch """ if player.is_stopped: - raise exceptions.CommandError(self.str.get('cmd-skip-none', "Can't skip! The player is not playing!"), expire_in=20) + raise exceptions.CommandError(self.str.get( + 'cmd-skip-none', "Can't skip! The player is not playing!"), expire_in=20) if not player.current_entry: if player.playlist.peek(): @@ -2086,31 +2224,36 @@ async def cmd_skip(self, player, channel, author, message, permissions, voice_ch else: print("Something strange is happening. " "You might want to restart the bot if it doesn't start working.") - + current_entry = player.current_entry - if (param.lower() in ['force', 'f']) or self.config.legacy_skip: - if permissions.instaskip \ - or (self.config.allow_author_skip and author == player.current_entry.meta.get('author', None)): + permission_force_skip = permissions.instaskip or ( + self.config.allow_author_skip and author == player.current_entry.meta.get('author', None)) + force_skip = param.lower() in ['force', 'f'] - player.skip() # TODO: check autopause stuff here - await self._manual_delete_check(message) - return Response(self.str.get('cmd-skip-force', 'Force skipped `{}`.').format(current_entry.title), reply=True, delete_after=30) - else: - raise exceptions.PermissionsError(self.str.get('cmd-skip-force-noperms', 'You do not have permission to force skip.'), expire_in=30) + if permission_force_skip and (force_skip or self.config.legacy_skip): + player.skip() # TODO: check autopause stuff here + await self._manual_delete_check(message) + return Response(self.str.get('cmd-skip-force', 'Force skipped `{}`.').format(current_entry.title), reply=True, delete_after=30) + + if not permission_force_skip and force_skip: + raise exceptions.PermissionsError(self.str.get( + 'cmd-skip-force-noperms', 'You do not have permission to force skip.'), expire_in=30) # TODO: ignore person if they're deaf or take them out of the list or something? # Currently is recounted if they vote, deafen, then vote num_voice = sum(1 for m in voice_channel.members if not ( m.voice.deaf or m.voice.self_deaf or m == self.user)) - if num_voice == 0: num_voice = 1 # incase all users are deafened, to avoid divison by zero + if num_voice == 0: + num_voice = 1 # incase all users are deafened, to avoid divison by zero num_skips = player.skip_state.add_skipper(author.id, message) skips_remaining = min( self.config.skips_required, - math.ceil(self.config.skip_ratio_required / (1 / num_voice)) # Number of skips from config ratio + # Number of skips from config ratio + math.ceil(self.config.skip_ratio_required / (1 / num_voice)) ) - num_skips if skips_remaining <= 0: @@ -2119,7 +2262,8 @@ async def cmd_skip(self, player, channel, author, message, permissions, voice_ch return Response( self.str.get('cmd-skip-reply-skipped-1', 'Your skip for `{0}` was acknowledged.\nThe vote to skip has been passed.{1}').format( current_entry.title, - self.str.get('cmd-skip-reply-skipped-2', ' Next song coming up!') if player.playlist.peek() else '' + self.str.get('cmd-skip-reply-skipped-2', + ' Next song coming up!') if player.playlist.peek() else '' ), reply=True, delete_after=20 @@ -2131,7 +2275,8 @@ async def cmd_skip(self, player, channel, author, message, permissions, voice_ch self.str.get('cmd-skip-reply-voted-1', 'Your skip for `{0}` was acknowledged.\n**{1}** more {2} required to vote to skip this song.').format( current_entry.title, skips_remaining, - self.str.get('cmd-skip-reply-voted-2', 'person is') if skips_remaining == 1 else self.str.get('cmd-skip-reply-voted-3', 'people are') + self.str.get('cmd-skip-reply-voted-2', 'person is') if skips_remaining == 1 else self.str.get( + 'cmd-skip-reply-voted-3', 'people are') ), reply=True, delete_after=20 @@ -2157,7 +2302,8 @@ async def cmd_volume(self, message, player, new_volume=None): new_volume = int(new_volume) except ValueError: - raise exceptions.CommandError(self.str.get('cmd-volume-invalid', '`{0}` is not a valid number').format(new_volume), expire_in=20) + raise exceptions.CommandError(self.str.get( + 'cmd-volume-invalid', '`{0}` is not a valid number').format(new_volume), expire_in=20) vol_change = None if relative: @@ -2207,32 +2353,41 @@ async def cmd_option(self, player, option, value): if option in ['autoplaylist', 'auto_playlist']: if value in bool_y: if self.config.auto_playlist: - raise exceptions.CommandError(self.str.get('cmd-option-autoplaylist-enabled', 'The autoplaylist is already enabled!')) + raise exceptions.CommandError(self.str.get( + 'cmd-option-autoplaylist-enabled', 'The autoplaylist is already enabled!')) else: if not self.autoplaylist: - raise exceptions.CommandError(self.str.get('cmd-option-autoplaylist-none', 'There are no entries in the autoplaylist file.')) + raise exceptions.CommandError(self.str.get( + 'cmd-option-autoplaylist-none', 'There are no entries in the autoplaylist file.')) self.config.auto_playlist = True await self.on_player_finished_playing(player) elif value in bool_n: if not self.config.auto_playlist: - raise exceptions.CommandError(self.str.get('cmd-option-autoplaylist-disabled', 'The autoplaylist is already disabled!')) + raise exceptions.CommandError(self.str.get( + 'cmd-option-autoplaylist-disabled', 'The autoplaylist is already disabled!')) else: self.config.auto_playlist = False else: - raise exceptions.CommandError(self.str.get('cmd-option-invalid-value', 'The value provided was not valid.')) + raise exceptions.CommandError(self.str.get( + 'cmd-option-invalid-value', 'The value provided was not valid.')) return Response("The autoplaylist is now " + ['disabled', 'enabled'][self.config.auto_playlist] + '.') else: - is_generic = [o for o in generic if o == option] # check if it is a generic bool option + # check if it is a generic bool option + is_generic = [o for o in generic if o == option] if is_generic and (value in bool_y or value in bool_n): name = is_generic[0] log.debug('Setting attribute {0}'.format(name)) - setattr(self.config, name, True if value in bool_y else False) # this is scary but should work + # this is scary but should work + setattr(self.config, name, True if value in bool_y else False) attr = getattr(self.config, name) - res = "The option {0} is now ".format(option) + ['disabled', 'enabled'][attr] + '.' - log.warning('Option overriden for this session: {0}'.format(res)) + res = "The option {0} is now ".format( + option) + ['disabled', 'enabled'][attr] + '.' + log.warning( + 'Option overriden for this session: {0}'.format(res)) return Response(res) else: - raise exceptions.CommandError(self.str.get('cmd-option-invalid-param' ,'The parameters provided were invalid.')) + raise exceptions.CommandError(self.str.get( + 'cmd-option-invalid-param', 'The parameters provided were invalid.')) async def cmd_queue(self, channel, player): """ @@ -2244,28 +2399,33 @@ async def cmd_queue(self, channel, player): lines = [] unlisted = 0 - andmoretext = '* ... and %s more*' % ('x' * len(player.playlist.entries)) + andmoretext = '* ... and %s more*' % ('x' * + len(player.playlist.entries)) if player.is_playing: # TODO: Fix timedelta garbage with util function song_progress = ftimedelta(timedelta(seconds=player.progress)) - song_total = ftimedelta(timedelta(seconds=player.current_entry.duration)) + song_total = ftimedelta(timedelta(seconds=player.current_entry.duration) + ) if player.current_entry.duration != None else '(no duration data)' prog_str = '`[%s/%s]`' % (song_progress, song_total) if player.current_entry.meta.get('channel', False) and player.current_entry.meta.get('author', False): lines.append(self.str.get('cmd-queue-playing-author', "Currently playing: `{0}` added by `{1}` {2}\n").format( player.current_entry.title, player.current_entry.meta['author'].name, prog_str)) else: - lines.append(self.str.get('cmd-queue-playing-noauthor', "Currently playing: `{0}` {1}\n").format(player.current_entry.title, prog_str)) - + lines.append(self.str.get('cmd-queue-playing-noauthor', + "Currently playing: `{0}` {1}\n").format(player.current_entry.title, prog_str)) for i, item in enumerate(player.playlist, 1): if item.meta.get('channel', False) and item.meta.get('author', False): - nextline = self.str.get('cmd-queue-entry-author', '{0} -- `{1}` by `{2}`').format(i, item.title, item.meta['author'].name).strip() + nextline = self.str.get('cmd-queue-entry-author', '{0} -- `{1}` by `{2}`').format( + i, item.title, item.meta['author'].name).strip() else: - nextline = self.str.get('cmd-queue-entry-noauthor', '{0} -- `{1}`').format(i, item.title).strip() + nextline = self.str.get( + 'cmd-queue-entry-noauthor', '{0} -- `{1}`').format(i, item.title).strip() - currentlinesum = sum(len(x) + 1 for x in lines) # +1 is for newline char + # +1 is for newline char + currentlinesum = sum(len(x) + 1 for x in lines) if (currentlinesum + len(nextline) + len(andmoretext) > DISCORD_MSG_CHAR_LIMIT) or (i > self.config.queue_length): if currentlinesum + len(andmoretext): @@ -2275,7 +2435,8 @@ async def cmd_queue(self, channel, player): lines.append(nextline) if unlisted: - lines.append(self.str.get('cmd-queue-more', '\n... and %s more') % unlisted) + lines.append(self.str.get('cmd-queue-more', + '\n... and %s more') % unlisted) if not lines: lines.append( @@ -2306,7 +2467,8 @@ def is_possible_command_invoke(entry): return valid_call and not entry.content[1:2].isspace() delete_invokes = True - delete_all = channel.permissions_for(author).manage_messages or self.config.owner_id == author.id + delete_all = channel.permissions_for( + author).manage_messages or self.config.owner_id == author.id def check(message): if is_possible_command_invoke(message) and delete_invokes: @@ -2329,30 +2491,34 @@ async def cmd_pldump(self, channel, author, song_url): try: info = await self.downloader.extract_info(self.loop, song_url.strip('<>'), download=False, process=False) except Exception as e: - raise exceptions.CommandError("Could not extract info from input url\n%s\n" % e, expire_in=25) + raise exceptions.CommandError( + "Could not extract info from input url\n%s\n" % e, expire_in=25) if not info: - raise exceptions.CommandError("Could not extract info from input url, no data.", expire_in=25) + raise exceptions.CommandError( + "Could not extract info from input url, no data.", expire_in=25) if not info.get('entries', None): # TODO: Retarded playlist checking # set(url, webpageurl).difference(set(url)) if info.get('url', None) != info.get('webpage_url', info.get('url', None)): - raise exceptions.CommandError("This does not seem to be a playlist.", expire_in=25) + raise exceptions.CommandError( + "This does not seem to be a playlist.", expire_in=25) else: return await self.cmd_pldump(channel, info.get('')) linegens = defaultdict(lambda: None, **{ - "youtube": lambda d: 'https://www.youtube.com/watch?v=%s' % d['id'], + "youtube": lambda d: 'https://www.youtube.com/watch?v=%s' % d['id'], "soundcloud": lambda d: d['url'], - "bandcamp": lambda d: d['url'] + "bandcamp": lambda d: d['url'] }) exfunc = linegens[info['extractor'].split(':')[0]] if not exfunc: - raise exceptions.CommandError("Could not extract info from input url, unsupported playlist type.", expire_in=25) + raise exceptions.CommandError( + "Could not extract info from input url, unsupported playlist type.", expire_in=25) with BytesIO() as fcontent: for item in info['entries']: @@ -2393,7 +2559,8 @@ async def cmd_listids(self, guild, author, leftover_args, cat='all'): if cur_cat == 'users': data.append("\nUser IDs:") - rawudata = ['%s #%s: %s' % (m.name, m.discriminator, m.id) for m in guild.members] + rawudata = ['%s #%s: %s' % + (m.name, m.discriminator, m.id) for m in guild.members] elif cur_cat == 'roles': data.append("\nRole IDs:") @@ -2401,11 +2568,13 @@ async def cmd_listids(self, guild, author, leftover_args, cat='all'): elif cur_cat == 'channels': data.append("\nText Channel IDs:") - tchans = [c for c in guild.channels if isinstance(c, discord.TextChannel)] + tchans = [c for c in guild.channels if isinstance( + c, discord.TextChannel)] rawudata = ['%s: %s' % (c.name, c.id) for c in tchans] rawudata.append("\nVoice Channel IDs:") - vchans = [c for c in guild.channels if isinstance(c, discord.VoiceChannel)] + vchans = [c for c in guild.channels if isinstance( + c, discord.VoiceChannel)] rawudata.extend('%s: %s' % (c.name, c.id) for c in vchans) if rawudata: @@ -2420,7 +2589,6 @@ async def cmd_listids(self, guild, author, leftover_args, cat='all'): return Response("Sent a message with a list of IDs.", delete_after=20) - async def cmd_perms(self, author, user_mentions, channel, guild, message, permissions, target=None): """ Usage: @@ -2430,10 +2598,10 @@ async def cmd_perms(self, author, user_mentions, channel, guild, message, permis if user_mentions: user = user_mentions[0] - + if not user_mentions and not target: user = author - + if not user_mentions and target: user = guild.get_member_named(target) if user == None: @@ -2442,22 +2610,23 @@ async def cmd_perms(self, author, user_mentions, channel, guild, message, permis except discord.NotFound: return Response("Invalid user ID or server nickname, please double check all typing and try again.", reply=False, delete_after=30) - permissions = self.permissions.for_user(user) - + permissions = self.permissions.for_user(user) + if user == author: lines = ['Command permissions in %s\n' % guild.name, '```', '```'] else: - lines = ['Command permissions for {} in {}\n'.format(user.name, guild.name), '```', '```'] + lines = ['Command permissions for {} in {}\n'.format( + user.name, guild.name), '```', '```'] for perm in permissions.__dict__: if perm in ['user_list'] or permissions.__dict__[perm] == set(): continue - lines.insert(len(lines) - 1, "%s: %s" % (perm, permissions.__dict__[perm])) + lines.insert(len(lines) - 1, "%s: %s" % + (perm, permissions.__dict__[perm])) await self.safe_send_message(author, '\n'.join(lines)) return Response("\N{OPEN MAILBOX WITH RAISED FLAG}", delete_after=20) - @owner_only async def cmd_setname(self, leftover_args, name): """ @@ -2492,7 +2661,8 @@ async def cmd_setnick(self, guild, channel, leftover_args, nick): """ if not channel.permissions_for(guild.me).change_nickname: - raise exceptions.CommandError("Unable to change nickname: no permission.") + raise exceptions.CommandError( + "Unable to change nickname: no permission.") nick = ' '.join([nick, *leftover_args]) @@ -2518,7 +2688,8 @@ async def cmd_setavatar(self, message, url=None): elif url: thing = url.strip('<>') else: - raise exceptions.CommandError("You must provide a URL or attach a file.", expire_in=20) + raise exceptions.CommandError( + "You must provide a URL or attach a file.", expire_in=20) try: timeout = aiohttp.ClientTimeout(total=10) @@ -2526,16 +2697,16 @@ async def cmd_setavatar(self, message, url=None): await self.user.edit(avatar=await res.read()) except Exception as e: - raise exceptions.CommandError("Unable to change avatar: {}".format(e), expire_in=20) + raise exceptions.CommandError( + "Unable to change avatar: {}".format(e), expire_in=20) return Response("Changed the bot's avatar.", delete_after=20) - async def cmd_disconnect(self, guild): """ Usage: {command_prefix}disconnect - + Forces the bot leave the current voice channel. """ await self.disconnect_voice_client(guild) @@ -2545,13 +2716,13 @@ async def cmd_restart(self, channel): """ Usage: {command_prefix}restart - + Restarts the bot. Will not properly load new dependencies or file updates unless fully shutdown and restarted. """ await self.safe_send_message(channel, "\N{WAVING HAND SIGN} Restarting. If you have updated your bot " - "or its dependencies, you need to restart the bot properly, rather than using this command.") + "or its dependencies, you need to restart the bot properly, rather than using this command.") player = self.get_player_in(channel.guild) if player and player.is_paused: @@ -2564,15 +2735,15 @@ async def cmd_shutdown(self, channel): """ Usage: {command_prefix}shutdown - + Disconnects from voice channels and closes the bot process. """ await self.safe_send_message(channel, "\N{WAVING HAND SIGN}") - + player = self.get_player_in(channel.guild) if player and player.is_paused: player.resume() - + await self.disconnect_all_voice_clients() raise exceptions.TerminateSignal() @@ -2591,7 +2762,8 @@ async def cmd_leaveserver(self, val, leftover_args): if t is None: t = discord.utils.get(self.guilds, name=val) if t is None: - raise exceptions.CommandError('No guild was found with the ID or name as `{0}`'.format(val)) + raise exceptions.CommandError( + 'No guild was found with the ID or name as `{0}`'.format(val)) await t.leave() return Response('Left the guild: `{0.name}` (Owner: `{0.owner.name}`, ID: `{0.id}`)'.format(t)) @@ -2615,7 +2787,8 @@ async def cmd_objgraph(self, channel, func='most_common_types()'): elif func == 'leaks': f = StringIO() - objgraph.show_most_common_types(objects=objgraph.get_leaking_objects(), file=f) + objgraph.show_most_common_types( + objects=objgraph.get_leaking_objects(), file=f) f.seek(0) data = f.read() f.close() @@ -2663,17 +2836,20 @@ async def on_message(self, message): return if message.author == self.user: - log.warning("Ignoring command from myself ({})".format(message.content)) + log.warning( + "Ignoring command from myself ({})".format(message.content)) return if message.author.bot and message.author.id not in self.config.bot_exception_ids: - log.warning("Ignoring command from other bot ({})".format(message.content)) + log.warning( + "Ignoring command from other bot ({})".format(message.content)) return if (not isinstance(message.channel, discord.abc.GuildChannel)) and (not isinstance(message.channel, discord.abc.PrivateChannel)): return - command, *args = message_content.split(' ') # Uh, doesn't this break prefixes with spaces in them (it doesn't, config parser already breaks them) + # Uh, doesn't this break prefixes with spaces in them (it doesn't, config parser already breaks them) + command, *args = message_content.split(' ') command = command[len(self.config.command_prefix):].lower().strip() # [] produce [''] which is not what we want (it break things) @@ -2707,11 +2883,13 @@ async def on_message(self, message): return # if I want to log this I just move it under the prefix check if message.author.id in self.blacklist and message.author.id != self.config.owner_id: - log.warning("User blacklisted: {0.id}/{0!s} ({1})".format(message.author, command)) + log.warning( + "User blacklisted: {0.id}/{0!s} ({1})".format(message.author, command)) return else: - log.info("{0.id}/{0!s}: {1}".format(message.author, message_content.replace('\n', '\n... '))) + log.info("{0.id}/{0!s}: {1}".format(message.author, + message_content.replace('\n', '\n... '))) user_permissions = self.permissions.for_user(message.author) @@ -2748,10 +2926,12 @@ async def on_message(self, message): handler_kwargs['permissions'] = user_permissions if params.pop('user_mentions', None): - handler_kwargs['user_mentions'] = list(map(message.guild.get_member, message.raw_mentions)) + handler_kwargs['user_mentions'] = list( + map(message.guild.get_member, message.raw_mentions)) if params.pop('channel_mentions', None): - handler_kwargs['channel_mentions'] = list(map(message.guild.get_channel, message.raw_channel_mentions)) + handler_kwargs['channel_mentions'] = list( + map(message.guild.get_channel, message.raw_channel_mentions)) if params.pop('voice_channel', None): handler_kwargs['voice_channel'] = message.guild.me.voice.channel if message.guild.me.voice else None @@ -2775,7 +2955,8 @@ async def on_message(self, message): params.pop(key) continue - doc_key = '[{}={}]'.format(key, param.default) if param.default is not param.empty else key + doc_key = '[{}={}]'.format( + key, param.default) if param.default is not param.empty else key args_expected.append(doc_key) # Ignore keyword args with default values when the command had no arguments @@ -2792,12 +2973,14 @@ async def on_message(self, message): if message.author.id != self.config.owner_id: if user_permissions.command_whitelist and command not in user_permissions.command_whitelist: raise exceptions.PermissionsError( - "This command is not enabled for your group ({}).".format(user_permissions.name), + "This command is not enabled for your group ({}).".format( + user_permissions.name), expire_in=20) elif user_permissions.command_blacklist and command in user_permissions.command_blacklist: raise exceptions.PermissionsError( - "This command is disabled for your group ({}).".format(user_permissions.name), + "This command is disabled for your group ({}).".format( + user_permissions.name), expire_in=20) # Invalid usage, return docstring @@ -2813,7 +2996,8 @@ async def on_message(self, message): docs = dedent(docs) await self.safe_send_message( message.channel, - '```\n{}\n```'.format(docs.format(command_prefix=self.config.command_prefix)), + '```\n{}\n```'.format(docs.format( + command_prefix=self.config.command_prefix)), expire_in=60 ) return @@ -2829,9 +3013,11 @@ async def on_message(self, message): if response.reply: if isinstance(content, discord.Embed): - content.description = '{} {}'.format(message.author.mention, content.description if content.description is not discord.Embed.Empty else '') + content.description = '{} {}'.format( + message.author.mention, content.description if content.description is not discord.Embed.Empty else '') else: - content = '{}: {}'.format(message.author.mention, content) + content = '{}: {}'.format( + message.author.mention, content) sentmsg = await self.safe_send_message( message.channel, content, @@ -2840,7 +3026,8 @@ async def on_message(self, message): ) except (exceptions.CommandError, exceptions.HelpfulError, exceptions.ExtractionError) as e: - log.error("Error in {0}: {1.__class__.__name__}: {1.message}".format(command, e), exc_info=True) + log.error("Error in {0}: {1.__class__.__name__}: {1.message}".format( + command, e), exc_info=True) expirein = e.expire_in if self.config.delete_messages else None alsodelete = message if self.config.delete_invoking else None @@ -2881,7 +3068,8 @@ async def gen_cmd_list(self, message, list_all_cmds=False): whitelist = user_permissions.command_whitelist blacklist = user_permissions.command_blacklist if list_all_cmds: - self.commands.append('{}{}'.format(self.config.command_prefix, command_name)) + self.commands.append('{}{}'.format( + self.config.command_prefix, command_name)) elif blacklist and command_name in blacklist: pass @@ -2890,7 +3078,8 @@ async def gen_cmd_list(self, message, list_all_cmds=False): pass else: - self.commands.append("{}{}".format(self.config.command_prefix, command_name)) + self.commands.append("{}{}".format( + self.config.command_prefix, command_name)) async def on_voice_state_update(self, member, before, after): if not self.init_ok: @@ -2903,6 +3092,10 @@ async def on_voice_state_update(self, member, before, after): else: return + if member == self.user and not after.channel: # if bot was disconnected from channel + await self.disconnect_voice_client(before.channel.guild) + return + if not self.config.auto_pause: return @@ -2918,19 +3111,20 @@ async def on_voice_state_update(self, member, before, after): def is_active(member): if not member.voice: return False - + if any([member.voice.deaf, member.voice.self_deaf, member.bot]): return False return True - if not member == self.user and is_active(member): # if the user is not inactive + # if the user is not inactive + if not member == self.user and is_active(member): if player.voice_client.channel != before.channel and player.voice_client.channel == after.channel: # if the person joined if auto_paused and player.is_paused: log.info(autopause_msg.format( - state = "Unpausing", - channel = player.voice_client.channel, - reason = "" + state="Unpausing", + channel=player.voice_client.channel, + reason="" ).strip()) self.server_specific_data[player.voice_client.guild]['auto_paused'] = False @@ -2939,9 +3133,9 @@ def is_active(member): if not any(is_active(m) for m in player.voice_client.channel.members): # channel is empty if not auto_paused and player.is_playing: log.info(autopause_msg.format( - state = "Pausing", - channel = player.voice_client.channel, - reason = "(empty channel)" + state="Pausing", + channel=player.voice_client.channel, + reason="(empty channel)" ).strip()) self.server_specific_data[player.voice_client.guild]['auto_paused'] = True @@ -2949,9 +3143,9 @@ def is_active(member): elif player.voice_client.channel == before.channel and player.voice_client.channel == after.channel: # if the person undeafen if auto_paused and player.is_paused: log.info(autopause_msg.format( - state = "Unpausing", - channel = player.voice_client.channel, - reason = "(member undeafen)" + state="Unpausing", + channel=player.voice_client.channel, + reason="(member undeafen)" ).strip()) self.server_specific_data[player.voice_client.guild]['auto_paused'] = False @@ -2960,30 +3154,31 @@ def is_active(member): if any(is_active(m) for m in player.voice_client.channel.members): # channel is not empty if auto_paused and player.is_paused: log.info(autopause_msg.format( - state = "Unpausing", - channel = player.voice_client.channel, - reason = "" + state="Unpausing", + channel=player.voice_client.channel, + reason="" ).strip()) - + self.server_specific_data[player.voice_client.guild]['auto_paused'] = False player.resume() else: if not auto_paused and player.is_playing: log.info(autopause_msg.format( - state = "Pausing", - channel = player.voice_client.channel, - reason = "(empty channel or member deafened)" + state="Pausing", + channel=player.voice_client.channel, + reason="(empty channel or member deafened)" ).strip()) self.server_specific_data[player.voice_client.guild]['auto_paused'] = True player.pause() - async def on_guild_update(self, before:discord.Guild, after:discord.Guild): + async def on_guild_update(self, before: discord.Guild, after: discord.Guild): if before.region != after.region: - log.warning("Guild \"%s\" changed regions: %s -> %s" % (after.name, before.region, after.region)) + log.warning("Guild \"%s\" changed regions: %s -> %s" % + (after.name, before.region, after.region)) - async def on_guild_join(self, guild:discord.Guild): + async def on_guild_join(self, guild: discord.Guild): log.info("Bot has been added to guild: {}".format(guild.name)) owner = self._get_owner(voice=True) or self._get_owner() if self.config.leavenonowners: @@ -2996,7 +3191,7 @@ async def on_guild_join(self, guild:discord.Guild): log.debug("Creating data folder for guild %s", guild.id) pathlib.Path('data/%s/' % guild.id).mkdir(exist_ok=True) - async def on_guild_remove(self, guild:discord.Guild): + async def on_guild_remove(self, guild: discord.Guild): log.info("Bot has been removed from guild: {}".format(guild.name)) log.debug('Updated guild list:') [log.debug(' - ' + s.name) for s in self.guilds] @@ -3004,10 +3199,9 @@ async def on_guild_remove(self, guild:discord.Guild): if guild.id in self.players: self.players.pop(guild.id).kill() - - async def on_guild_available(self, guild:discord.Guild): + async def on_guild_available(self, guild: discord.Guild): if not self.init_ok: - return # Ignore pre-ready events + return # Ignore pre-ready events log.debug("Guild \"{}\" has become available.".format(guild.name)) @@ -3017,18 +3211,19 @@ async def on_guild_available(self, guild:discord.Guild): av_paused = self.server_specific_data[guild]['availability_paused'] if av_paused: - log.debug("Resuming player in \"{}\" due to availability.".format(guild.name)) + log.debug( + "Resuming player in \"{}\" due to availability.".format(guild.name)) self.server_specific_data[guild]['availability_paused'] = False player.resume() - - async def on_guild_unavailable(self, guild:discord.Guild): + async def on_guild_unavailable(self, guild: discord.Guild): log.debug("Guild \"{}\" has become unavailable.".format(guild.name)) player = self.get_player_in(guild) if player and player.is_playing: - log.debug("Pausing player in \"{}\" due to unavailability.".format(guild.name)) + log.debug( + "Pausing player in \"{}\" due to unavailability.".format(guild.name)) self.server_specific_data[guild]['availability_paused'] = True player.pause() diff --git a/musicbot/config.py b/musicbot/config.py index 7941efa..172c3eb 100644 --- a/musicbot/config.py +++ b/musicbot/config.py @@ -6,6 +6,7 @@ import configparser from .exceptions import HelpfulError +from .constants import VERSION as BOTVERSION log = logging.getLogger(__name__) @@ -19,7 +20,8 @@ def __init__(self, config_file): config = configparser.ConfigParser(interpolation=None) config.read(config_file, encoding='utf-8') - confsections = {"Credentials", "Permissions", "Chat", "MusicBot"}.difference(config.sections()) + confsections = {"Credentials", "Permissions", + "Chat", "MusicBot"}.difference(config.sections()) if confsections: raise HelpfulError( "One or more required config sections are missing.", @@ -33,57 +35,102 @@ def __init__(self, config_file): self._confpreface = "An error has occured reading the config:\n" self._confpreface2 = "An error has occured validating the config:\n" - self._login_token = config.get('Credentials', 'Token', fallback=ConfigDefaults.token) + self._login_token = config.get( + 'Credentials', 'Token', fallback=ConfigDefaults.token) self.auth = () - self.spotify_clientid = config.get('Credentials', 'Spotify_ClientID', fallback=ConfigDefaults.spotify_clientid) - self.spotify_clientsecret = config.get('Credentials', 'Spotify_ClientSecret', fallback=ConfigDefaults.spotify_clientsecret) - - self.owner_id = config.get('Permissions', 'OwnerID', fallback=ConfigDefaults.owner_id) - self.dev_ids = config.get('Permissions', 'DevIDs', fallback=ConfigDefaults.dev_ids) - self.bot_exception_ids = config.get("Permissions", "BotExceptionIDs", fallback=ConfigDefaults.bot_exception_ids) - - self.command_prefix = config.get('Chat', 'CommandPrefix', fallback=ConfigDefaults.command_prefix) - self.bound_channels = config.get('Chat', 'BindToChannels', fallback=ConfigDefaults.bound_channels) - self.unbound_servers = config.getboolean('Chat', 'AllowUnboundServers', fallback=ConfigDefaults.unbound_servers) - self.autojoin_channels = config.get('Chat', 'AutojoinChannels', fallback=ConfigDefaults.autojoin_channels) - self.dm_nowplaying = config.getboolean('Chat', 'DMNowPlaying', fallback=ConfigDefaults.dm_nowplaying) - self.no_nowplaying_auto = config.getboolean('Chat', 'DisableNowPlayingAutomatic', fallback=ConfigDefaults.no_nowplaying_auto) - self.nowplaying_channels = config.get('Chat', 'NowPlayingChannels', fallback=ConfigDefaults.nowplaying_channels) - self.delete_nowplaying = config.getboolean('Chat', 'DeleteNowPlaying', fallback=ConfigDefaults.delete_nowplaying) - - self.default_volume = config.getfloat('MusicBot', 'DefaultVolume', fallback=ConfigDefaults.default_volume) - self.skips_required = config.getint('MusicBot', 'SkipsRequired', fallback=ConfigDefaults.skips_required) - self.skip_ratio_required = config.getfloat('MusicBot', 'SkipRatio', fallback=ConfigDefaults.skip_ratio_required) - self.save_videos = config.getboolean('MusicBot', 'SaveVideos', fallback=ConfigDefaults.save_videos) - self.now_playing_mentions = config.getboolean('MusicBot', 'NowPlayingMentions', fallback=ConfigDefaults.now_playing_mentions) - self.auto_summon = config.getboolean('MusicBot', 'AutoSummon', fallback=ConfigDefaults.auto_summon) - self.auto_playlist = config.getboolean('MusicBot', 'UseAutoPlaylist', fallback=ConfigDefaults.auto_playlist) - self.auto_playlist_random = config.getboolean('MusicBot', 'AutoPlaylistRandom', fallback=ConfigDefaults.auto_playlist_random) - self.auto_pause = config.getboolean('MusicBot', 'AutoPause', fallback=ConfigDefaults.auto_pause) - self.delete_messages = config.getboolean('MusicBot', 'DeleteMessages', fallback=ConfigDefaults.delete_messages) - self.delete_invoking = config.getboolean('MusicBot', 'DeleteInvoking', fallback=ConfigDefaults.delete_invoking) - self.persistent_queue = config.getboolean('MusicBot', 'PersistentQueue', fallback=ConfigDefaults.persistent_queue) - self.status_message = config.get('MusicBot', 'StatusMessage', fallback=ConfigDefaults.status_message) - self.write_current_song = config.getboolean('MusicBot', 'WriteCurrentSong', fallback=ConfigDefaults.write_current_song) - self.allow_author_skip = config.getboolean('MusicBot', 'AllowAuthorSkip', fallback=ConfigDefaults.allow_author_skip) - self.use_experimental_equalization = config.getboolean('MusicBot', 'UseExperimentalEqualization', fallback=ConfigDefaults.use_experimental_equalization) - self.embeds = config.getboolean('MusicBot', 'UseEmbeds', fallback=ConfigDefaults.embeds) - self.queue_length = config.getint('MusicBot', 'QueueLength', fallback=ConfigDefaults.queue_length) - self.remove_ap = config.getboolean('MusicBot', 'RemoveFromAPOnError', fallback=ConfigDefaults.remove_ap) - self.show_config_at_start = config.getboolean('MusicBot', 'ShowConfigOnLaunch', fallback=ConfigDefaults.show_config_at_start) - self.legacy_skip = config.getboolean('MusicBot', 'LegacySkip', fallback=ConfigDefaults.legacy_skip) - self.leavenonowners = config.getboolean('MusicBot', 'LeaveServersWithoutOwner', fallback=ConfigDefaults.leavenonowners) - self.usealias = config.getboolean('MusicBot', 'UseAlias', fallback=ConfigDefaults.usealias) - - self.debug_level = config.get('MusicBot', 'DebugLevel', fallback=ConfigDefaults.debug_level) + self.spotify_clientid = config.get( + 'Credentials', 'Spotify_ClientID', fallback=ConfigDefaults.spotify_clientid) + self.spotify_clientsecret = config.get( + 'Credentials', 'Spotify_ClientSecret', fallback=ConfigDefaults.spotify_clientsecret) + + self.owner_id = config.get( + 'Permissions', 'OwnerID', fallback=ConfigDefaults.owner_id) + self.dev_ids = config.get( + 'Permissions', 'DevIDs', fallback=ConfigDefaults.dev_ids) + self.team_devs = config.getboolean( + "Permissions", "TeamDevs", fallback=ConfigDefaults.team_devs) + self.bot_exception_ids = config.get( + "Permissions", "BotExceptionIDs", fallback=ConfigDefaults.bot_exception_ids) + + self.command_prefix = config.get( + 'Chat', 'CommandPrefix', fallback=ConfigDefaults.command_prefix) + self.bound_channels = config.get( + 'Chat', 'BindToChannels', fallback=ConfigDefaults.bound_channels) + self.unbound_servers = config.getboolean( + 'Chat', 'AllowUnboundServers', fallback=ConfigDefaults.unbound_servers) + self.autojoin_channels = config.get( + 'Chat', 'AutojoinChannels', fallback=ConfigDefaults.autojoin_channels) + self.dm_nowplaying = config.getboolean( + 'Chat', 'DMNowPlaying', fallback=ConfigDefaults.dm_nowplaying) + self.no_nowplaying_auto = config.getboolean( + 'Chat', 'DisableNowPlayingAutomatic', fallback=ConfigDefaults.no_nowplaying_auto) + self.nowplaying_channels = config.get( + 'Chat', 'NowPlayingChannels', fallback=ConfigDefaults.nowplaying_channels) + self.delete_nowplaying = config.getboolean( + 'Chat', 'DeleteNowPlaying', fallback=ConfigDefaults.delete_nowplaying) + + self.default_volume = config.getfloat( + 'MusicBot', 'DefaultVolume', fallback=ConfigDefaults.default_volume) + self.skips_required = config.getint( + 'MusicBot', 'SkipsRequired', fallback=ConfigDefaults.skips_required) + self.skip_ratio_required = config.getfloat( + 'MusicBot', 'SkipRatio', fallback=ConfigDefaults.skip_ratio_required) + self.save_videos = config.getboolean( + 'MusicBot', 'SaveVideos', fallback=ConfigDefaults.save_videos) + self.now_playing_mentions = config.getboolean( + 'MusicBot', 'NowPlayingMentions', fallback=ConfigDefaults.now_playing_mentions) + self.auto_summon = config.getboolean( + 'MusicBot', 'AutoSummon', fallback=ConfigDefaults.auto_summon) + self.auto_playlist = config.getboolean( + 'MusicBot', 'UseAutoPlaylist', fallback=ConfigDefaults.auto_playlist) + self.auto_playlist_random = config.getboolean( + 'MusicBot', 'AutoPlaylistRandom', fallback=ConfigDefaults.auto_playlist_random) + self.auto_pause = config.getboolean( + 'MusicBot', 'AutoPause', fallback=ConfigDefaults.auto_pause) + self.delete_messages = config.getboolean( + 'MusicBot', 'DeleteMessages', fallback=ConfigDefaults.delete_messages) + self.delete_invoking = config.getboolean( + 'MusicBot', 'DeleteInvoking', fallback=ConfigDefaults.delete_invoking) + self.persistent_queue = config.getboolean( + 'MusicBot', 'PersistentQueue', fallback=ConfigDefaults.persistent_queue) + self.status_message = config.get( + 'MusicBot', 'StatusMessage', fallback=ConfigDefaults.status_message) + self.write_current_song = config.getboolean( + 'MusicBot', 'WriteCurrentSong', fallback=ConfigDefaults.write_current_song) + self.allow_author_skip = config.getboolean( + 'MusicBot', 'AllowAuthorSkip', fallback=ConfigDefaults.allow_author_skip) + self.use_experimental_equalization = config.getboolean( + 'MusicBot', 'UseExperimentalEqualization', fallback=ConfigDefaults.use_experimental_equalization) + self.embeds = config.getboolean( + 'MusicBot', 'UseEmbeds', fallback=ConfigDefaults.embeds) + self.queue_length = config.getint( + 'MusicBot', 'QueueLength', fallback=ConfigDefaults.queue_length) + self.remove_ap = config.getboolean( + 'MusicBot', 'RemoveFromAPOnError', fallback=ConfigDefaults.remove_ap) + self.show_config_at_start = config.getboolean( + 'MusicBot', 'ShowConfigOnLaunch', fallback=ConfigDefaults.show_config_at_start) + self.legacy_skip = config.getboolean( + 'MusicBot', 'LegacySkip', fallback=ConfigDefaults.legacy_skip) + self.leavenonowners = config.getboolean( + 'MusicBot', 'LeaveServersWithoutOwner', fallback=ConfigDefaults.leavenonowners) + self.usealias = config.getboolean( + 'MusicBot', 'UseAlias', fallback=ConfigDefaults.usealias) + self.footer_text = config.get( + 'MusicBot', 'CustomEmbedFooter', fallback=ConfigDefaults.footer_text) + + self.debug_level = config.get( + 'MusicBot', 'DebugLevel', fallback=ConfigDefaults.debug_level) self.debug_level_str = self.debug_level self.debug_mode = False - self.blacklist_file = config.get('Files', 'BlacklistFile', fallback=ConfigDefaults.blacklist_file) - self.auto_playlist_file = config.get('Files', 'AutoPlaylistFile', fallback=ConfigDefaults.auto_playlist_file) - self.i18n_file = config.get('Files', 'i18nFile', fallback=ConfigDefaults.i18n_file) + self.blacklist_file = config.get( + 'Files', 'BlacklistFile', fallback=ConfigDefaults.blacklist_file) + self.auto_playlist_file = config.get( + 'Files', 'AutoPlaylistFile', fallback=ConfigDefaults.auto_playlist_file) + self.i18n_file = config.get( + 'Files', 'i18nFile', fallback=ConfigDefaults.i18n_file) self.auto_playlist_removed_file = None self.run_checks() @@ -111,14 +158,16 @@ def check_changes(self, conf): return ex_keys = self.get_all_keys(exconf) if set(usr_keys) != set(ex_keys): - self.missing_keys = set(ex_keys) - set(usr_keys) # to raise this as an issue in bot.py later + # to raise this as an issue in bot.py later + self.missing_keys = set(ex_keys) - set(usr_keys) def run_checks(self): """ Validation logic for bot settings. """ if self.i18n_file != ConfigDefaults.i18n_file and not os.path.isfile(self.i18n_file): - log.warning('i18n file does not exist. Trying to fallback to {0}.'.format(ConfigDefaults.i18n_file)) + log.warning('i18n file does not exist. Trying to fallback to {0}.'.format( + ConfigDefaults.i18n_file)) self.i18n_file = ConfigDefaults.i18n_file if not os.path.isfile(self.i18n_file): @@ -135,7 +184,7 @@ def run_checks(self): raise HelpfulError( "No bot token was specified in the config.", "As of v1.9.6_1, you are required to use a Discord bot account. " - "See https://github.com/Just-Some-Bots/MusicBot/wiki/FAQ for info.", + "See https://github.com/Team-JSB/MusicBot/wiki/FAQ for info.", preface=self._confpreface ) @@ -158,7 +207,7 @@ def run_checks(self): self.owner_id = int(self.owner_id) elif self.owner_id == 'auto': - pass # defer to async check + pass # defer to async check else: self.owner_id = None @@ -170,33 +219,49 @@ def run_checks(self): preface=self._confpreface ) + if len(self.dev_ids) > 0: + ids = self.dev_ids.split() + self.dev_ids = set() + for did in ids: + self.dev_ids.add(int(did)) + else: + self.dev_ids = set() + if self.bot_exception_ids: try: - self.bot_exception_ids = set(int(x) for x in self.bot_exception_ids.replace(',', ' ').split()) + self.bot_exception_ids = set( + int(x) for x in self.bot_exception_ids.replace(',', ' ').split()) except: - log.warning("BotExceptionIDs data is invalid, will ignore all bots") + log.warning( + "BotExceptionIDs data is invalid, will ignore all bots") self.bot_exception_ids = set() if self.bound_channels: try: - self.bound_channels = set(x for x in self.bound_channels.replace(',', ' ').split() if x) + self.bound_channels = set( + int(x) for x in self.bound_channels.replace(',', ' ').split() if x) except: - log.warning("BindToChannels data is invalid, will not bind to any channels") + log.warning( + "BindToChannels data is invalid, will not bind to any channels") self.bound_channels = set() if self.autojoin_channels: try: - self.autojoin_channels = set(x for x in self.autojoin_channels.replace(',', ' ').split() if x) + self.autojoin_channels = set( + int(x) for x in self.autojoin_channels.replace(',', ' ').split() if x) except: - log.warning("AutojoinChannels data is invalid, will not autojoin any channels") + log.warning( + "AutojoinChannels data is invalid, will not autojoin any channels") self.autojoin_channels = set() if self.nowplaying_channels: try: - self.nowplaying_channels = set(int(x) for x in self.nowplaying_channels.replace(',', ' ').split() if x) + self.nowplaying_channels = set( + int(x) for x in self.nowplaying_channels.replace(',', ' ').split() if x) except: - log.warning("NowPlayingChannels data is invalid, will use the default behavior for all servers") - self.autojoin_channels = set() + log.warning( + "NowPlayingChannels data is invalid, will use the default behavior for all servers") + self.nowplaying_channels = set() self._spotify = False if self.spotify_clientid and self.spotify_clientsecret: @@ -204,18 +269,16 @@ def run_checks(self): self.delete_invoking = self.delete_invoking and self.delete_messages - self.bound_channels = set(int(item) for item in self.bound_channels) - - self.autojoin_channels = set(int(item) for item in self.autojoin_channels) - ap_path, ap_name = os.path.split(self.auto_playlist_file) apn_name, apn_ext = os.path.splitext(ap_name) - self.auto_playlist_removed_file = os.path.join(ap_path, apn_name + '_removed' + apn_ext) + self.auto_playlist_removed_file = os.path.join( + ap_path, apn_name + '_removed' + apn_ext) if hasattr(logging, self.debug_level.upper()): self.debug_level = getattr(logging, self.debug_level.upper()) else: - log.warning("Invalid DebugLevel option \"{}\" given, falling back to INFO".format(self.debug_level_str)) + log.warning("Invalid DebugLevel option \"{}\" given, falling back to INFO".format( + self.debug_level_str)) self.debug_level = logging.INFO self.debug_level_str = 'INFO' @@ -224,6 +287,9 @@ def run_checks(self): self.create_empty_file_ifnoexist('config/blacklist.txt') self.create_empty_file_ifnoexist('config/whitelist.txt') + if not self.footer_text: + self.footer_text = ConfigDefaults.footer_text + def create_empty_file_ifnoexist(self, path): if not os.path.isfile(path): open(path, 'a').close() @@ -246,7 +312,14 @@ async def async_validate(self, bot): preface=self._confpreface2 ) - self.owner_id = bot.cached_app_info.owner.id + app_info = bot.cached_app_info + if app_info.team: + self.owner_id = app_info.team.owner_id + if self.team_devs: + for mem in app_info.team.members: + self.dev_ids.add(mem.id) + else: + self.owner_id = app_info.owner.id log.debug("Acquired owner id via API") if self.owner_id == bot.user.id: @@ -262,7 +335,6 @@ async def async_validate(self, bot): preface=self._confpreface2 ) - def find_config(self): config = configparser.ConfigParser(interpolation=None) @@ -275,7 +347,8 @@ def find_config(self): elif os.path.isfile('config/example_options.ini'): shutil.copy('config/example_options.ini', self.config_file) - log.warning('Options file not found, copying example_options.ini') + log.warning( + 'Options file not found, copying example_options.ini') else: raise HelpfulError( @@ -290,12 +363,13 @@ def find_config(self): # load the config again and check to see if the user edited that one c.read(self.config_file, encoding='utf-8') - if not int(c.get('Permissions', 'OwnerID', fallback=0)): # jake pls no flame + if not int(c.get('Permissions', 'OwnerID', fallback=0)): # jake pls no flame print(flush=True) - log.critical("Please configure config/options.ini and re-run the bot.") + log.critical( + "Please configure config/options.ini and re-run the bot.") sys.exit(1) - except ValueError: # Config id value was changed but its not valid + except ValueError: # Config id value was changed but its not valid raise HelpfulError( 'Invalid value "{}" for OwnerID, config cannot be loaded. '.format( c.get('Permissions', 'OwnerID', fallback=None) @@ -305,18 +379,19 @@ def find_config(self): except Exception as e: print(flush=True) - log.critical("Unable to copy config/example_options.ini to {}".format(self.config_file), exc_info=e) + log.critical( + "Unable to copy config/example_options.ini to {}".format(self.config_file), exc_info=e) sys.exit(2) def find_autoplaylist(self): if not os.path.exists(self.auto_playlist_file): if os.path.exists('config/_autoplaylist.txt'): - shutil.copy('config/_autoplaylist.txt', self.auto_playlist_file) + shutil.copy('config/_autoplaylist.txt', + self.auto_playlist_file) log.debug("Copying _autoplaylist.txt to autoplaylist.txt") else: log.warning("No autoplaylist file found.") - def write_default_config(self, location): pass @@ -325,7 +400,8 @@ class ConfigDefaults: owner_id = None token = None - dev_ids = set() + dev_ids = list() + team_devs = False bot_exception_ids = set() spotify_clientid = None @@ -364,20 +440,29 @@ class ConfigDefaults: legacy_skip = False leavenonowners = False usealias = True + footer_text = 'Team-JSB/MusicBot ({})'.format(BOTVERSION) options_file = 'config/options.ini' blacklist_file = 'config/blacklist.txt' - auto_playlist_file = 'config/autoplaylist.txt' # this will change when I add playlists + # this will change when I add playlists + auto_playlist_file = 'config/autoplaylist.txt' i18n_file = 'config/i18n/en.json' -setattr(ConfigDefaults, codecs.decode(b'ZW1haWw=', '\x62\x61\x73\x65\x36\x34').decode('ascii'), None) -setattr(ConfigDefaults, codecs.decode(b'cGFzc3dvcmQ=', '\x62\x61\x73\x65\x36\x34').decode('ascii'), None) -setattr(ConfigDefaults, codecs.decode(b'dG9rZW4=', '\x62\x61\x73\x65\x36\x34').decode('ascii'), None) + +setattr(ConfigDefaults, codecs.decode(b'ZW1haWw=', + '\x62\x61\x73\x65\x36\x34').decode('ascii'), None) +setattr(ConfigDefaults, codecs.decode(b'cGFzc3dvcmQ=', + '\x62\x61\x73\x65\x36\x34').decode('ascii'), None) +setattr(ConfigDefaults, codecs.decode(b'dG9rZW4=', + '\x62\x61\x73\x65\x36\x34').decode('ascii'), None) # These two are going to be wrappers for the id lists, with add/remove/load/save functions # and id/object conversion so types aren't an issue + + class Blacklist: pass + class Whitelist: pass diff --git a/musicbot/constants.py b/musicbot/constants.py index 024cc78..2c5ebb2 100644 --- a/musicbot/constants.py +++ b/musicbot/constants.py @@ -1,6 +1,6 @@ import os.path -MAIN_VERSION = 'release-260819' +MAIN_VERSION = 'release-010620u' SUB_VERSION = '' VERSION = MAIN_VERSION + SUB_VERSION diff --git a/musicbot/entry.py b/musicbot/entry.py index 5a33004..fc30aaa 100644 --- a/musicbot/entry.py +++ b/musicbot/entry.py @@ -10,6 +10,12 @@ from .exceptions import ExtractionError from .utils import get_header, md5sum +# optionally using pymediainfo instead of ffprobe if presents +try: + import pymediainfo +except: + pymediainfo = None + log = logging.getLogger(__name__) @@ -81,13 +87,18 @@ def __hash__(self): class URLPlaylistEntry(BasePlaylistEntry): - def __init__(self, playlist, url, title, duration=0, expected_filename=None, **meta): + def __init__(self, playlist, url, title, duration=None, expected_filename=None, **meta): super().__init__() self.playlist = playlist self.url = url self.title = title self.duration = duration + if duration == None: # duration could be 0 + log.info('Cannot extract duration of the entry. This does not affect the ability of the bot. ' + 'However, estimated time for this entry will not be unavailable and estimated time ' + 'of the queue will also not be available until this entry got downloaded.\n' + 'entry name: {}'.format(self.title)) self.expected_filename = expected_filename self.meta = meta self.aoptions = '-vn' @@ -216,10 +227,44 @@ async def _download(self): else: await self._really_download() + if self.duration == None: + if pymediainfo: + try: + mediainfo = pymediainfo.MediaInfo.parse(self.filename) + self.duration = (mediainfo.tracks[0].duration)/1000 + except: + self.duration = None + + else: + args = [ + 'ffprobe', + '-i', self.filename, + '-show_entries', 'format=duration', + '-v', 'quiet', + '-of', 'csv="p=0"' + ] + + output = await self.run_command(' '.join(args)) + output = output.decode("utf-8") + + try: + self.duration = float(output) + except ValueError: + # @TheerapakG: If somehow it is not string of float + self.duration = None + + if not self.duration: + log.error('Cannot extract duration of downloaded entry, invalid output from ffprobe or pymediainfo. ' + 'This does not affect the ability of the bot. However, estimated time for this entry ' + 'will not be unavailable and estimated time of the queue will also not be available ' + 'until this entry got removed.\n' + 'entry file: {}'.format(self.filename)) + else: + log.debug('Get duration of {} as {} seconds by inspecting it directly'.format(self.filename, self.duration)) + if self.playlist.bot.config.use_experimental_equalization: try: - mean, maximum = await self.get_mean_volume(self.filename) - aoptions = '-af "volume={}dB"'.format((maximum * -1)) + aoptions = await self.get_mean_volume(self.filename) except Exception as e: log.error('There as a problem with working out EQ, likely caused by a strange installation of FFmpeg. ' 'This has not impacted the ability for the bot to work, but will mean your tracks will not be equalised.') @@ -268,24 +313,53 @@ def is_exe(fpath): async def get_mean_volume(self, input_file): log.debug('Calculating mean volume of {0}'.format(input_file)) - cmd = '"' + self.get('ffmpeg') + '" -i "' + input_file + '" -af "volumedetect" -f null /dev/null' + cmd = '"' + self.get('ffmpeg') + '" -i "' + input_file + '" -af loudnorm=I=-24.0:LRA=7.0:TP=-2.0:linear=true:print_format=json -f null /dev/null' output = await self.run_command(cmd) output = output.decode("utf-8") + log.debug(output) # print('----', output) - mean_volume_matches = re.findall(r"mean_volume: ([\-\d\.]+) dB", output) - if (mean_volume_matches): - mean_volume = float(mean_volume_matches[0]) + + I_matches = re.findall(r'"input_i" : "([-]?([0-9]*\.[0-9]+))",', output) + if (I_matches): + log.debug('I_matches={}'.format(I_matches[0][0])) + I = float(I_matches[0][0]) + else: + log.debug('Could not parse I in normalise json.') + I = float(0) + + LRA_matches = re.findall(r'"input_lra" : "([-]?([0-9]*\.[0-9]+))",', output) + if (LRA_matches): + log.debug('LRA_matches={}'.format(LRA_matches[0][0])) + LRA = float(LRA_matches[0][0]) + else: + log.debug('Could not parse LRA in normalise json.') + LRA = float(0) + + TP_matches = re.findall(r'"input_tp" : "([-]?([0-9]*\.[0-9]+))",', output) + if (TP_matches): + log.debug('TP_matches={}'.format(TP_matches[0][0])) + TP = float(TP_matches[0][0]) + else: + log.debug('Could not parse TP in normalise json.') + TP = float(0) + + thresh_matches = re.findall(r'"input_thresh" : "([-]?([0-9]*\.[0-9]+))",', output) + if (thresh_matches): + log.debug('thresh_matches={}'.format(thresh_matches[0][0])) + thresh = float(thresh_matches[0][0]) else: - mean_volume = float(0) + log.debug('Could not parse thresh in normalise json.') + thresh = float(0) - max_volume_matches = re.findall(r"max_volume: ([\-\d\.]+) dB", output) - if (max_volume_matches): - max_volume = float(max_volume_matches[0]) + offset_matches = re.findall(r'"target_offset" : "([-]?([0-9]*\.[0-9]+))', output) + if (offset_matches): + log.debug('offset_matches={}'.format(offset_matches[0][0])) + offset = float(offset_matches[0][0]) else: - max_volume = float(0) + log.debug('Could not parse offset in normalise json.') + offset = float(0) - log.debug('Calculated mean volume as {0}'.format(mean_volume)) - return mean_volume, max_volume + return '-af loudnorm=I=-24.0:LRA=7.0:TP=-2.0:linear=true:measured_I={}:measured_LRA={}:measured_TP={}:measured_thresh={}:offset={}'.format(I, LRA, TP, thresh, offset) # noinspection PyShadowingBuiltins async def _really_download(self, *, hash=False): @@ -328,7 +402,7 @@ def __init__(self, playlist, url, title, *, destination=None, **meta): self.url = url self.title = title self.destination = destination - self.duration = 0 + self.duration = None self.meta = meta if self.destination: diff --git a/musicbot/exceptions.py b/musicbot/exceptions.py index c625820..a73112e 100644 --- a/musicbot/exceptions.py +++ b/musicbot/exceptions.py @@ -24,6 +24,10 @@ class CommandError(MusicbotException): class ExtractionError(MusicbotException): pass +# Something is wrong about data +class InvalidDataError(MusicbotException): + pass + # The no processing entry type failed and an entry was a playlist/vice versa # TODO: Add typing options instead of is_playlist class WrongEntryTypeError(ExtractionError): diff --git a/musicbot/opus_loader.py b/musicbot/opus_loader.py index d8d188e..0c1e729 100644 --- a/musicbot/opus_loader.py +++ b/musicbot/opus_loader.py @@ -8,7 +8,6 @@ def load_opus_lib(): opus._load_default() return except OSError: - pass + pass raise RuntimeError('Could not load an opus lib.') - diff --git a/musicbot/player.py b/musicbot/player.py index 3156f14..49be0b7 100644 --- a/musicbot/player.py +++ b/musicbot/player.py @@ -206,10 +206,17 @@ def _playback_finished(self, error=None): self._current_entry = None self._source = None + if error: + self.stop() + self.emit('error', player=self, entry=entry, ex=error) + return + if self._stderr_future.done() and self._stderr_future.exception(): # I'm not sure that this would ever not be done if it gets to this point # unless ffmpeg is doing something highly questionable + self.stop() self.emit('error', player=self, entry=entry, ex=self._stderr_future.exception()) + return if not self.bot.config.save_videos and entry: if not isinstance(entry, StreamPlaylistEntry): @@ -241,11 +248,8 @@ def _playback_finished(self, error=None): def _kill_current_player(self): if self._current_player: - if self.voice_client.is_paused(): - self.voice_client.resume() - try: - self.voice_client.stop() + self._current_player.stop() except OSError: pass self._current_player = None diff --git a/musicbot/playlist.py b/musicbot/playlist.py index a205694..a26902e 100644 --- a/musicbot/playlist.py +++ b/musicbot/playlist.py @@ -13,7 +13,7 @@ from .constructs import Serializable from .lib.event_emitter import EventEmitter from .entry import URLPlaylistEntry, StreamPlaylistEntry -from .exceptions import ExtractionError, WrongEntryTypeError +from .exceptions import ExtractionError, WrongEntryTypeError,InvalidDataError log = logging.getLogger(__name__) @@ -108,7 +108,7 @@ async def add_entry(self, song_url, **meta): self, song_url, info.get('title', 'Untitled'), - info.get('duration', 0) or 0, + info.get('duration', None) or None, self.downloader.ytdl.prepare_filename(info), **meta ) @@ -140,7 +140,7 @@ async def add_stream_entry(self, song_url, info=None, **meta): except Exception as e: log.error('Could not extract information from {} ({}), falling back to direct'.format(song_url, e), exc_info=True) - if info.get('is_live') is None and info.get('extractor', None) is not 'generic': # wew hacky + if info.get('is_live') is None and info.get('extractor', None) != 'generic': # wew hacky raise ExtractionError("This is not a stream.") dest_url = song_url @@ -344,11 +344,17 @@ async def estimate_time_until(self, position, player): """ (very) Roughly estimates the time till the queue will 'position' """ - estimated_time = sum(e.duration for e in islice(self.entries, position - 1)) + if any(e.duration == None for e in islice(self.entries, position - 1)): + raise InvalidDataError('no duration data') + else: + estimated_time = sum(e.duration for e in islice(self.entries, position - 1)) # When the player plays a song, it eats the first playlist item, so we just have to add the time back if not player.is_stopped and player.current_entry: - estimated_time += player.current_entry.duration - player.progress + if player.current_entry.duration == None: # duration can be 0 + raise InvalidDataError('no duration data in current entry') + else: + estimated_time += player.current_entry.duration - player.progress return datetime.timedelta(seconds=estimated_time) diff --git a/musicbot/spotify.py b/musicbot/spotify.py index 1351992..4e1cfdc 100644 --- a/musicbot/spotify.py +++ b/musicbot/spotify.py @@ -15,6 +15,8 @@ class Spotify: def __init__(self, client_id, client_secret, aiosession=None, loop=None): self.client_id = client_id self.client_secret = client_secret + self.guest_mode = (client_id is None or client_secret is None) + self.aiosession = aiosession if aiosession else aiohttp.ClientSession() self.loop = loop if loop else asyncio.get_event_loop() @@ -22,10 +24,6 @@ def __init__(self, client_id, client_secret, aiosession=None, loop=None): self.loop.run_until_complete(self.get_token()) # validate token - def _make_token_auth(self, client_id, client_secret): - auth_header = base64.b64encode((client_id + ':' + client_secret).encode('ascii')) - return {'Authorization': 'Basic %s' % auth_header.decode('ascii')} - async def get_track(self, uri): """Get a track's info from its URI""" return await self.make_spotify_req(self.API_BASE + 'tracks/{0}'.format(uri)) @@ -66,18 +64,27 @@ async def get_token(self): if self.token and not await self.check_token(self.token): return self.token['access_token'] - token = await self.request_token() - if token is None: - raise SpotifyError('Requested a token from Spotify, did not end up getting one') - token['expires_at'] = int(time.time()) + token['expires_in'] - self.token = token - log.debug('Created a new access token: {0}'.format(token)) + if self.guest_mode: + token = await self.request_guest_token() + if token is None: + raise SpotifyError('Failed to get a guest token from Spotify, please try specifying client id and client secret') + self.token = { + "access_token": token["accessToken"], + "expires_at": int(token["accessTokenExpirationTimestampMs"]) / 1000 + } + else: + token = await self.request_token() + if token is None: + raise SpotifyError('Requested a token from Spotify, did not end up getting one') + token['expires_at'] = int(time.time()) + token['expires_in'] + self.token = token + log.debug('Created a new {0}access token: {1}'.format("guest " if self.guest_mode else "", self.token)) return self.token['access_token'] async def check_token(self, token): """Checks a token is valid""" now = int(time.time()) - return token['expires_at'] - now < 60 + return token["expires_at"] - now < 60 async def request_token(self): """Obtains a token from Spotify and returns it""" @@ -85,3 +92,17 @@ async def request_token(self): headers = self._make_token_auth(self.client_id, self.client_secret) r = await self.make_post(self.OAUTH_TOKEN_URL, payload=payload, headers=headers) return r + + async def request_guest_token(self): + """Obtains a web player token from Spotify and returns it""" + async with self.aiosession.get("https://open.spotify.com/get_access_token?reason=transport&productType=web_player") as r: + if r.status != 200: + try: + raise SpotifyError('Issue generating guest token: [{0.status}] {1}'.format(r, await r.json())) + except aiohttp.client_exceptions.ContentTypeError as e: + raise SpotifyError('Issue generating guest token: [{0.status}] {1}'.format(r, e)) + return await r.json() + + def _make_token_auth(self, client_id, client_secret): + auth_header = base64.b64encode((client_id + ':' + client_secret).encode('ascii')) + return {'Authorization': 'Basic %s' % auth_header.decode('ascii')} diff --git a/musicbotcmd b/musicbotcmd new file mode 100644 index 0000000..2df242f --- /dev/null +++ b/musicbotcmd @@ -0,0 +1,78 @@ +#!/bin/bash + +ProgName=$(basename $0) + +sub_help(){ + echo "Usage: $ProgName [options]" + echo "Subcommands:" + echo " start Start the MusicBot service" + echo " stop Stop the MusicBot service" + echo " restart Restart the MusicBot service" + echo " logs View logs for MusicBot" + echo " startup Toggle whether MusicBot will launch on startup" + echo "" + echo "For help with each subcommand run:" + echo "$ProgName -h|--help" + echo "" +} + +sub_start(){ + sudo systemctl start musicbot +} + +sub_stop(){ + sudo systemctl stop musicbot +} + +sub_restart(){ + sudo systemctl restart musicbot +} + +sub_logs(){ + journalctl -u musicbot -e -f +} + +sub_startup(){ + option=$1 + case $option in + "--enable" | "-e") + echo "Enabling MusicBot launching on startup" + sudo systemctl enable musicbot;; + "--disable" | "-d") + echo "Disabling MusicBot launching on startup" + sudo systemctl disable musicbot;; + "-h" | "--help") + echo "Usage: $ProgName startup [options]" + echo "Toggles whether MusicBot will be started on system startup" + echo "" + echo "Options:" + echo " -e, --enable Enable starting MusicBot on startup" + echo " -d, --disable Disable starting MusicBot on startup" + echo "";; + *) + if test -f /etc/systemd/system/default.target.wants/musicbot.service; then + echo "Disabling MusicBot launching on startup" + sudo systemctl disable musicbot + else + echo "Enabling MusicBot launching on startup" + sudo systemctl enable musicbot + fi;; + esac + +} + +subcommand=$1 +case $subcommand in + "" | "-h" | "--help") + sub_help + ;; + *) + shift + sub_${subcommand} $@ + if [ $? = 127 ]; then + echo "Error: '$subcommand' is not a known subcommand." >&2 + echo " Run '$ProgName --help' for a list of known subcommands." >&2 + exit 1 + fi + ;; +esac diff --git a/requirements.txt b/requirements.txt index 89bc1a3..8228a90 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,10 +1,9 @@ -discord.py[voice]==1.2.5 +discord.py[voice]>=1.3.4 pip youtube_dl>=2020.06.16.1 colorlog cffi --only-binary all; -aiohttp>=3.3.0,<3.6.0 -websockets>=6.0,<7.0 +aiohttp>=3.6.0,<3.7.0 +websockets>=6.0,!=7.0,!=8.0,!=8.0.1,<9.0 chardet -opuslib -pynacl==1.2.1 +opuslib \ No newline at end of file diff --git a/run.py b/run.py index f4f2670..3d16d6e 100644 --- a/run.py +++ b/run.py @@ -176,7 +176,11 @@ def finalize_logging(): dlog = logging.getLogger('discord') dlh = logging.StreamHandler(stream=sys.stdout) dlh.terminator = '' - dlh.setFormatter(logging.Formatter('.')) + try: + dlh.setFormatter(logging.Formatter('.')) + except ValueError: + dlh.setFormatter(logging.Formatter('.', validate=False) + ) # pylint: disable=unexpected-keyword-arg dlog.addHandler(dlh) @@ -188,7 +192,7 @@ def bugger_off(msg="Press enter to continue . . .", code=1): # TODO: all of this def sanity_checks(optional=True): log.info("Starting sanity checks") - ## Required + # Required # Make sure we're on Python 3.5+ req_ensure_py3() @@ -207,7 +211,7 @@ def sanity_checks(optional=True): log.info("Required checks passed.") - ## Optional + # Optional if not optional: return @@ -221,7 +225,8 @@ def req_ensure_py3(): log.info("Checking for Python 3.5+") if sys.version_info < (3, 5): - log.warning("Python 3.5+ is required. This version is %s", sys.version.split()[0]) + log.warning("Python 3.5+ is required. This version is %s", + sys.version.split()[0]) log.warning("Attempting to locate Python 3.5...") pycom = None @@ -251,15 +256,18 @@ def req_ensure_py3(): else: log.info('Trying "python3.5"') try: - pycom = subprocess.check_output('python3.5 -c "exit()"'.split()).strip().decode() + pycom = subprocess.check_output( + 'python3.5 -c "exit()"'.split()).strip().decode() except: pass if pycom: - log.info("\nPython 3 found. Re-launching bot using: %s run.py\n", pycom) + log.info( + "\nPython 3 found. Re-launching bot using: %s run.py\n", pycom) pyexec(pycom, 'run.py') - log.critical("Could not find Python 3.5 or higher. Please run the bot using Python 3.5") + log.critical( + "Could not find Python 3.5 or higher. Please run the bot using Python 3.5") bugger_off() @@ -267,7 +275,8 @@ def req_check_deps(): try: import discord if discord.version_info.major < 1: - log.critical("This version of MusicBot requires a newer version of discord.py (1.0+). Your version is {0}. Try running update.py.".format(discord.__version__)) + log.critical( + "This version of MusicBot requires a newer version of discord.py (1.0+). Your version is {0}. Try running update.py.".format(discord.__version__)) bugger_off() except ImportError: # if we can't import discord.py, an error will be thrown later down the line anyway @@ -281,8 +290,9 @@ def req_ensure_encoding(): log.info("Setting console encoding to UTF-8") import io - sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding='utf8', line_buffering=True) - # only slightly evil + sys.stdout = io.TextIOWrapper( + sys.stdout.detach(), encoding='utf8', line_buffering=True) + # only slightly evil sys.__stdout__ = sh.stream = sys.stdout if os.environ.get('PYCHARM_HOSTED', None) not in (None, '0'): @@ -294,15 +304,18 @@ def req_ensure_env(): log.info("Ensuring we're in the right environment") # if os.environ.get('APP_ENV') != 'docker' and not os.path.isdir(b64decode('LmdpdA==').decode('utf-8')): - # log.critical(b64decode('Qm90IHdhc24ndCBpbnN0YWxsZWQgdXNpbmcgR2l0LiBSZWluc3RhbGwgdXNpbmcgaHR0cDovL2JpdC5seS9tdXNpY2JvdGRvY3Mu').decode('utf-8')) + # log.critical(b64decode( + # 'VGhlIGJvdCB3YXNuJ3QgaW5zdGFsbGVkIHVzaW5nIEdpdC4gUmVpbnN0YWxsIHVzaW5nIGh0dHBzOi8vYml0Lmx5L2pzY211c2ljYm90ZG9jcy4=').decode('utf-8')) # bugger_off() try: assert os.path.isdir('config'), 'folder "config" not found' assert os.path.isdir('musicbot'), 'folder "musicbot" not found' - assert os.path.isfile('musicbot/__init__.py'), 'musicbot folder is not a Python module' + assert os.path.isfile( + 'musicbot/__init__.py'), 'musicbot folder is not a Python module' - assert importlib.util.find_spec('musicbot'), "musicbot module is not importable" + assert importlib.util.find_spec( + 'musicbot'), "musicbot module is not importable" except AssertionError as e: log.critical("Failed environment check, %s", e) bugger_off() @@ -319,16 +332,18 @@ def req_ensure_env(): if sys.platform.startswith('win'): log.info("Adding local bins/ folder to path") os.environ['PATH'] += ';' + os.path.abspath('bin/') - sys.path.append(os.path.abspath('bin/')) # might as well + sys.path.append(os.path.abspath('bin/')) # might as well def req_ensure_folders(): pathlib.Path('logs').mkdir(exist_ok=True) pathlib.Path('data').mkdir(exist_ok=True) + def opt_check_disk_space(warnlimit_mb=200): if disk_usage('.').free < warnlimit_mb*1024*2: - log.warning("Less than %sMB of free space remains on this device" % warnlimit_mb) + log.warning( + "Less than %sMB of free space remains on this device" % warnlimit_mb) ################################################# @@ -387,7 +402,7 @@ def main(): err = PIP.run_install('--upgrade -r requirements.txt') - if err: # TODO: add the specific error check back as not to always tell users to sudo it + if err: # TODO: add the specific error check back as not to always tell users to sudo it print() log.critical("You may need to %s to install dependencies." % ['use sudo', 'run as admin'][sys.platform.startswith('win')]) diff --git a/run.sh b/run.sh index 5e9e87e..a316fbf 100644 --- a/run.sh +++ b/run.sh @@ -9,6 +9,7 @@ declare -A python3=( ["0"]=`python3 -c 'import sys; version=sys.version_info[:3] PYTHON35_VERSION=`python3.5 -c 'import sys; version=sys.version_info[:3]; print("{0}".format(version[2]))' || { echo "no py35"; }` PYTHON36_VERSION=`python3.6 -c 'import sys; version=sys.version_info[:3]; print("{0}".format(version[1]))' || { echo "no py36"; }` PYTHON37_VERSION=`python3.7 -c 'import sys; version=sys.version_info[:3]; print("{0}".format(version[1]))' || { echo "no py37"; }` +PYTHON38_VERSION=`python3.8 -c 'import sys; version=sys.version_info[:3]; print("{0}".format(version[1]))' || { echo "no py38"; }` if [ "${python[0]}" -eq "3" ]; then # Python = 3 @@ -50,5 +51,10 @@ if [ "$PYTHON37_VERSION" -eq "7" ]; then # Python3.7 = 3.7 exit fi +if [ "$PYTHON38_VERSION" -eq "8" ]; then # Python3.8 = 3.8 + python3.8 run.py + exit +fi + echo "You are running an unsupported Python version." echo "Please use a version of Python above 3.5.2." diff --git a/runtime.txt b/runtime.txt index 32a8d83..43b47fb 100644 --- a/runtime.txt +++ b/runtime.txt @@ -1 +1 @@ -python-3.7.8 +python-3.8.5 diff --git a/update.sh b/update.sh index 71f98f3..71165e8 100644 --- a/update.sh +++ b/update.sh @@ -9,6 +9,7 @@ declare -A python3=( ["0"]=`python3 -c 'import sys; version=sys.version_info[:3] PYTHON35_VERSION=`python3.5 -c 'import sys; version=sys.version_info[:3]; print("{0}".format(version[2]))' || { echo "no py35"; }` PYTHON36_VERSION=`python3.6 -c 'import sys; version=sys.version_info[:3]; print("{0}".format(version[1]))' || { echo "no py36"; }` PYTHON37_VERSION=`python3.7 -c 'import sys; version=sys.version_info[:3]; print("{0}".format(version[1]))' || { echo "no py37"; }` +PYTHON38_VERSION=`python3.8 -c 'import sys; version=sys.version_info[:3]; print("{0}".format(version[1]))' || { echo "no py38"; }` if [ "${python[0]}" -eq "3" ]; then # Python = 3 @@ -50,5 +51,10 @@ if [ "$PYTHON37_VERSION" -eq "7" ]; then # Python3.7 = 3.7 exit fi +if [ "$PYTHON38_VERSION" -eq "8" ]; then # Python3.8 = 3.8 + python3.8 update.py + exit +fi + echo "You are running an unsupported Python version." echo "Please use a version of Python above 3.5.2."