diff --git a/MANIFEST.in b/MANIFEST.in index 1f84b76..9e0cef4 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,2 +1 @@ -# Include the license file -include LICENSE README.rst +include LICENSE README.rst doc/screenshot.png diff --git a/README.rst b/README.rst index cf121f4..0f31f78 100644 --- a/README.rst +++ b/README.rst @@ -1,36 +1,39 @@ -================================= -comp - Curses Online Media Player -================================= +=============================== +comp - Curses Omni Media Player +=============================== This program is a curses front-end for mpv and youtube-dl. -.. image:: https://ipfs.io/ipfs/QmVhz4F53Sym48kXC7vhDMFsfvJ7iL8gaQ1EgoQADJvuAB +.. image:: doc/screenshot.png Installation ------------ -Dependencies -^^^^^^^^^^^^ +comp requires Python 3.5+ with ``curses`` module (only available on Unix-like +OSes such as GNU/Linux and the BSDs) and ``libmpv``. It also depends on +``python-mpv`` and ``youtube-dl`` but the setup program will automatically +install them if they are missing. -This program currently only runs on Python 3.5+ on operating systems that the -``curses`` module is supported (i.e. Unix-like OS, e.g. GNU/Linux, macOS and -the BSDs). +Using pip +^^^^^^^^^ -It also depends on ``youtube-dl`` and ``libmpv``. Both of those should be -available in your operating system's repository, although it's more -recommended to install ``youtube-dl`` using ``pip`` (currently most distros -still use Python 2 as default so the command is something like ``pip3 install -youtube-dl``). +Python 2 is still the default on most distributions so the command would be +``pip3 install comp``. You can use the ``--user`` flag to avoid system-wide +installation. -Installing comp -^^^^^^^^^^^^^^^ +Using setup.py +^^^^^^^^^^^^^^ -I will try to upload the program to PyPI when it's more completed but as of -this moment, I'd suggest you to use ``git`` to get the software:: +To install the latest version or test the development branch (called +``bachelor``, in contrast to ``master``), you'll need to do it manually:: git clone https://github.com/McSinyx/comp.git cd comp - sudo ./setup.py install + git checkout bachelor # usually master is synced with the PyPI repo + sudo ./setup.py install -e . + +Note ``setup.py`` uses ``setuptools`` which is a third-party module and can be +install using ``pip3``. Usage ----- @@ -88,6 +91,8 @@ Keyboard control +--------------+---------------------------------------------+ | ``d`` | Delete current entry | +--------------+---------------------------------------------+ +| ``i`` | Insert playlist | ++--------------+---------------------------------------------+ | ``m``, ``M`` | Cycle through playing modes | +--------------+---------------------------------------------+ | ``n`` | Repeat previous search | @@ -120,8 +125,8 @@ Keyboard control Configuration files ------------------- -The system-wide configuration file is ``/etc/comp/settings.ini``, the -user-specific one is ``~/.config/mpv/settings.ini``. Default configurations +If not specified by the ``--config``, (user-specific) configuration file is +``~/.config/mpv/settings.ini``. Default configurations are listed below:: [comp] diff --git a/comp b/comp index dbf2d5d..076702b 100755 --- a/comp +++ b/comp @@ -1,6 +1,5 @@ #!/usr/bin/env python3 -# -# comp - Curses Online Media Player +# comp - Curses Omni Media Player # # comp is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -24,18 +23,20 @@ from argparse import ArgumentParser from collections import deque from configparser import ConfigParser from functools import reduce -from gettext import gettext as _, textdomain +from gettext import bindtextdomain, gettext as _, textdomain from os import makedirs from os.path import abspath, dirname, expanduser, isfile from threading import Thread -from youtube_dl import YoutubeDL from mpv import MPV +from pkg_resources import resource_filename +from youtube_dl import YoutubeDL from omp import extract_info, Omp # Init gettext -textdomain('comp') +bindtextdomain('omp', resource_filename('omp', 'locale')) +textdomain('omp') # Global constants SYSTEM_CONFIG = '/etc/comp/settings.ini' @@ -92,6 +93,8 @@ class Comp(Omp): ' ' if self.vid == 'no' else 'V') adds(right.rjust(curses.COLS), curses.color_pair(12)) try: + self.played[self.playing]['duration'] = self.mp.osd.duration + self.print(self.played[self.playing]) left = ' {} / {} {} '.format( self.mp.osd.time_pos, self.mp.osd.duration, '|' if self.mp.pause else '>') @@ -151,7 +154,7 @@ class Comp(Omp): def _writeln(self, y, title, duration, attr): title_len = curses.COLS-DURATION_COL_LEN-3 title = justified(title, title_len) - duration = duration.ljust(DURATION_COL_LEN) + duration = (duration or '00:00:00').ljust(DURATION_COL_LEN) self.scr.addstr(y, 0, ' {} {} '.format(title, duration), attr) self.scr.refresh() @@ -188,7 +191,7 @@ class Comp(Omp): def __init__(self, entries, json_file, mode, mpv_vid, mpv_vo, ytdlf): Omp.__init__(self, entries, lambda name, val: self.update_status(), - json_file, mode, mpv_vo, mpv_vid, ytdlf) + json_file, mode, mpv_vid, mpv_vo, ytdlf) curses.noecho() curses.cbreak() self.scr.keypad(True) @@ -319,7 +322,7 @@ parser.add_argument('-e', '--extractor', default='youtube-dl', choices=('json', 'mpv', 'youtube-dl'), required=False, help=_("playlist extractor, default is youtube-dl")) parser.add_argument('file', help=_("path or URL to the playlist to be opened")) -parser.add_argument('-c', '--config', required=False, +parser.add_argument('-c', '--config', default=USER_CONFIG, required=False, help=_("path to the configuration file")) parser.add_argument('--vid', required=False, help=_("initial video channel. auto selects the default,\ @@ -333,32 +336,12 @@ parser.add_argument('-f', '--format', required=False, metavar='YTDL_FORMAT', args = parser.parse_args() entries = extract_info(args.file, args.extractor) json_file = args.file if args.extractor == 'json' else '' - config = ConfigParser() -if args.config is not None and isfile(args.config): - config_file = args.config -elif isfile(USER_CONFIG): - config_file = USER_CONFIG -else: - config_file = SYSTEM_CONFIG -config.read(config_file) - -if args.vid is not None: - vid = args.vid -else: - vid = config.get('mpv', 'video', fallback='auto') - -if args.vo is not None: - vo = args.vo -else: - vo = config.get('mpv', 'video-output', fallback=None) - +config.read(args.config) +vid = args.vid or config.get('mpv', 'video', fallback='auto') +vo = args.vo or config.get('mpv', 'video-output', fallback=None) mode = config.get('comp', 'play-mode', fallback='play-current') - -if args.format is not None: - ytdlf = args.format -else: - ytdlf = config.get('youtube-dl', 'format', fallback='best') +ytdlf = args.format or config.get('youtube-dl', 'format', fallback='best') with Comp(entries, json_file, mode, vid, vo, ytdlf) as comp: c = comp.scr.getch() @@ -399,7 +382,9 @@ with Comp(entries, json_file, mode, vid, vo, ytdlf) as comp: if s: comp.json_file = s try: makedirs(dirname(abspath(comp.json_file)), exist_ok=True) - with open(comp.json_file, 'w') as f: json.dump(comp.entries, f) + with open(comp.json_file, 'w') as f: + json.dump(comp.entries, f, ensure_ascii=False, + indent=2, sort_keys=True) except: errmsg = _("'{}': Can't open file for writing").format( comp.json_file) @@ -407,14 +392,25 @@ with Comp(entries, json_file, mode, vid, vo, ytdlf) as comp: else: comp.update_status(_("'{}' written").format(comp.json_file)) elif c == 100: # letter d - i = comp.idx() - if i + 1 < len(entries): - comp.entries.pop(i) - elif len(entries) > 1: - comp.entries.pop(i) - else: - comp.entries = [] + comp.entries.pop(comp.idx()) + if 1 < len(comp.entries) - curses.LINES + 4 == comp.start: + comp.start -= 1 + elif comp.idx() == len(comp.entries): + comp.y -= 1 comp.redraw() + elif c == 105: # letter i + extractor = comp.gets(_("Playlist extractor: ")) + filename = comp.gets(_("Insert: ")) + entries = extract_info(filename, extractor) + if entries is None: + comp.update_status( + _("'{}': Can't extract playlist").format(filename)) + else: + bottom = comp.entries[comp.idx():] + comp.entries = comp.entries[:comp.idx()] + comp.entries.extend(entries) + comp.entries.extend(bottom) + comp.redraw() elif c == 109: # letter m comp.mode = MODES[(MODES.index(comp.mode) + 1) % 8] comp.update_status() @@ -422,9 +418,14 @@ with Comp(entries, json_file, mode, vid, vo, ytdlf) as comp: comp.next_search() elif c == 111: # letter o extractor = comp.gets(_("Playlist extractor: ")) - comp.entries = extract_info(comp.gets(_("Open: ")), extractor) - comp.start, comp.y = 0, 1 - comp.redraw() + filename = comp.gets(_("Open: ")) + entries = extract_info(filename, extractor) + if entries is None: + comp.update_status( + _("'{}': Can't extract playlist").format(filename)) + else: + comp.entries, comp.start, comp.y = entries, 0, 1 + comp.redraw() elif c == 112: # letter p comp.mp.pause ^= True elif c in (curses.KEY_UP, 107): # up arrow or letter k diff --git a/doc/screenshot.png b/doc/screenshot.png new file mode 100644 index 0000000..36b8564 Binary files /dev/null and b/doc/screenshot.png differ diff --git a/omp/__init__.py b/omp/__init__.py new file mode 100644 index 0000000..bc48ace --- /dev/null +++ b/omp/__init__.py @@ -0,0 +1,24 @@ +# omp - Omni Media Player +# This is a part of comp +# +# comp is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# comp program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with comp. If not, see . +# +# Copyright (C) 2017 Nguyễn Gia Phong + +"""Omni Media Player - an handy mpv front-end library for interactive +control. +""" + +from .ie import extract_info +from .omp import Omp diff --git a/omp/ie.py b/omp/ie.py new file mode 100644 index 0000000..714819d --- /dev/null +++ b/omp/ie.py @@ -0,0 +1,114 @@ +# ie.py - Omni Media Player infomation extractor +# This is a part of comp +# +# comp is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# comp program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with comp. If not, see . +# +# Copyright (C) 2017 Nguyễn Gia Phong + +import json +from os.path import abspath, expanduser, expandvars, isfile +from time import gmtime, sleep, strftime + +from youtube_dl import YoutubeDL +from mpv import MPV + +DEFAULT_ENTRY = {'filename': '', 'title': '', 'duration': '00:00:00', + 'error': False, 'playing': False, 'selected': False} +YTDL_OPTS = {'quiet': True, 'default_search': 'ytsearch', + 'extract_flat': 'in_playlist'} + + +def json_extract_info(filename): + """Return list of entries extracted from a file using json. If an + error occur during the extraction, return None. + """ + try: + with open(filename) as f: raw_info, info = json.load(f), [] + for i in raw_info: + e = DEFAULT_ENTRY.copy() + for k in e: + if k in i and isinstance(i[k], type(e[k])): e[k] = i[k] + info.append(e) + except: + return None + else: + return info + + +def mpv_extract_info(filename): + """Return list of entries extracted from a path or URL using mpv. If + an error occur during the extraction, return None. + """ + mp = MPV(ytdl=True, vid=False) + mp.play(filename) + while mp.duration is None: + sleep(0.25) + if mp.playback_abort: return None + info = {'filename': filename, 'title': mp.media_title.decode(), + 'duration': mp.osd.duration, 'error': False, 'playing': False, + 'selected': False} + mp.quit() + return [info] + + +def ytdl_extract_info(filename): + """Return list of entries extracted from a path or URL using + youtube-dl. If an error occur during the extraction, return None. + """ + with YoutubeDL(YTDL_OPTS) as ytdl: + try: + raw_info = ytdl.extract_info(filename, download=False) + except: + return None + info = raw_info.get('entries', [raw_info]) + for i in info: + if 'webpage_url' in i: + i['filename'] = i['webpage_url'] + elif (i['ie_key'] == 'Youtube' + or i['extractor'] == 'youtube'): + i['filename'] = 'https://youtu.be/' + i['id'] + else: + i['filename'] = i['url'] + if 'title' not in i: + try: + i['title'] = ytdl.extract_info(i['filename'], + download=False)['title'] + except: + return None + if 'duration' not in i: + i['duration'] = '00:00:00' + elif isinstance(i['duration'], int): + i['duration'] = strftime('%H:%M:%S', gmtime(i['duration'])) + for k in 'error', 'playing', 'selected': i.setdefault(k, False) + for k in i.copy(): + if k not in DEFAULT_ENTRY: i.pop(k) + return info + + +def extract_info(filename, extractor='youtube-dl'): + """Return list of entries extracted from a path or URL using + specified extractor. If an error occur during the extraction, + return None. + + The extractor could be either 'json', 'mpv' or 'youtube-dl' and + fallback to 'youtube-dl'. + """ + if isfile(expanduser(expandvars(filename))): + filename = abspath(expanduser(expandvars(filename))) + if extractor == 'json': + return json_extract_info(filename) + elif extractor == 'mpv': + return mpv_extract_info(filename) + else: + return ytdl_extract_info(filename) diff --git a/omp/locale/vi/LC_MESSAGES/omp.mo b/omp/locale/vi/LC_MESSAGES/omp.mo new file mode 100644 index 0000000..748c01b Binary files /dev/null and b/omp/locale/vi/LC_MESSAGES/omp.mo differ diff --git a/omp/locale/vi/LC_MESSAGES/omp.po b/omp/locale/vi/LC_MESSAGES/omp.po new file mode 100644 index 0000000..7854a99 --- /dev/null +++ b/omp/locale/vi/LC_MESSAGES/omp.po @@ -0,0 +1,72 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: 2017-04-05 11:00+0700\n" +"PO-Revision-Date: 2017-04-06 22:29+0700\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" +"X-Generator: Poedit 1.8.11\n" +"Last-Translator: \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Language: vi_VN\n" + +msgid "Curses Online Media Player" +msgstr "Phần mềm chơi đa phương tiện trực tuyến sử dụng curses" + +msgid "play-current" +msgstr "chơi-một" + +msgid "play-all" +msgstr "chơi-tất-cả" + +msgid "play-selected" +msgstr "chơi-đã-chọn" + +msgid "repeat-current" +msgstr "lặp-một" + +msgid "repeat-all" +msgstr "lặp-tất-cả" + +msgid "repeat-selected" +msgstr "lặp-đã-chọn" + +msgid "shuffle-all" +msgstr "ngẫu-nhiên-tất-cả" + +msgid "shuffle-selected" +msgstr "ngẫu-nhiên-đã-chọn" + +msgid "URL" +msgstr "URL" + +msgid "Title" +msgstr "Tiêu đề" + +msgid "Source" +msgstr "Nguồn" + +msgid "Current size: {}x{}. Minimum size: {}x4." +msgstr "Kích thước hiện tại: {}x{}. Kích thước tối thiểu: {}x4." + +msgid "Save playlist to [{}]:" +msgstr "Lưu playlist tại [{}]:" + +msgid "'{}': Can't open file for writing" +msgstr "'{}': Không mở được tệp để ghi" + +msgid "'{}' written" +msgstr "'{}' đã ghi" + +msgid "path to playlist in JSON format" +msgstr "đường dẫn đến playlist ở định dạng JSON" + +msgid "URL to an playlist on Youtube" +msgstr "URL của playlist trên Youtube" diff --git a/omp.py b/omp/omp.py similarity index 64% rename from omp.py rename to omp/omp.py index f9b4c91..a0d168c 100644 --- a/omp.py +++ b/omp/omp.py @@ -1,4 +1,4 @@ -# omp.py - comp library for playing and playlist management +# omp.py - Omni Media Player meta object # This is a part of comp # # comp is free software: you can redistribute it and/or modify @@ -10,7 +10,6 @@ # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. - # # You should have received a copy of the GNU Affero General Public License # along with comp. If not, see . @@ -22,8 +21,8 @@ from collections import deque from itertools import cycle from os.path import abspath, expanduser, expandvars, isfile from random import choice -from requests import head from time import gmtime, sleep, strftime +from urllib import request from youtube_dl import YoutubeDL from mpv import MPV, MpvFormat @@ -34,79 +33,8 @@ YTDL_OPTS = {'quiet': True, 'default_search': 'ytsearch', 'extract_flat': 'in_playlist'} -def extract_info(filename, extractor='youtube-dl'): - """Return list of entries extracted from a path or URL using - specified extractor. - - The extractor could be either 'json', 'mpv' or 'youtube-dl'. If it - is not one of them or not specified, youtube-dl will be used. - """ - def json_extract_info(filename): - try: - with open(filename) as f: raw_info = json.load(f) - info = [] - for i in raw_info: - e = DEFAULT_ENTRY.copy() - for k in e: - if k in i and isinstance(i[k], type(e[k])): e[k] = i[k] - info.append(e) - except: - return [] - else: - return info - - def mpv_extract_info(filename): - mp = MPV(ytdl=True) - mp.play(filename) - while mp.duration is None: - sleep(0.25) - if mp.playback_abort: return [] - info = {'filename': filename, 'title': mp.media_title.decode(), - 'duration': mp.osd.duration, 'error': False, 'playing': False, - 'selected': False} - mp.quit() - return [info] - - def ytdl_extract_info(filename): - with YoutubeDL(YTDL_OPTS) as ytdl: - raw_info = ytdl.extract_info(filename, download=False) - info = raw_info.get('entries', [raw_info]) - for i in info: - if 'webpage_url' in i: - i['filename'] = i['webpage_url'] - elif (i['ie_key'] == 'Youtube' - or i['extractor'] == 'youtube'): - i['filename'] = 'https://youtu.be/' + i['id'] - else: - i['filename'] = i['url'] - if 'title' not in i: - i['title'] = ytdl.extract_info(i['filename'], - download=False)['title'] - if 'duration' not in i: - i['duration'] = '00:00:00' - elif isinstance(i['duration'], int): - i['duration'] = strftime('%H:%M:%S', gmtime(i['duration'])) - for k in 'error', 'playing', 'selected': i.setdefault(k, False) - for k in i.copy(): - if k not in DEFAULT_ENTRY: i.pop(k) - return info - - try: - if (extractor != 'youtube-dl' and head(filename).status_code >= 400 - and isfile(expanduser(expandvars(filename)))): - filename = abspath(expanduser(expandvars(filename))) - except: - pass - if extractor == 'json': - return json_extract_info(filename) - elif extractor == 'mpv': - return mpv_extract_info(filename) - else: - return ytdl_extract_info(filename) - - class Omp(object): - """Meta object for playing and playlist management. + """Omni Media Player meta object. Attributes: entries (list): list of all tracks @@ -174,7 +102,7 @@ class Omp(object): pass def next(self, force=False, backward=False): - comp.play_backward = backward + self.play_backward = backward if self.mp.idle_active: self.play(force) else: diff --git a/setup.py b/setup.py index c37f0bb..28fb21b 100755 --- a/setup.py +++ b/setup.py @@ -1,8 +1,7 @@ #!/usr/bin/env python3 -from os import walk +from os import listdir from os.path import join -from sys import prefix from setuptools import setup @@ -11,8 +10,8 @@ with open('README.rst') as f: setup( name='comp', - version='0.3.1', - description=('Curses Online Media Player'), + version='0.3.2', + description=('Curses Omni Media Player'), long_description=long_description, url='https://github.com/McSinyx/comp', author='Nguyễn Gia Phong', @@ -29,16 +28,10 @@ setup( 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Topic :: Multimedia :: Sound/Audio :: Players', - 'Topic :: Multimedia :: Video :: Display' - ], + 'Topic :: Multimedia :: Video :: Display'], keywords='youtube-dl mpv-wrapper curses console-application multimedia', + packages=['omp'], install_requires=['python-mpv', 'youtube-dl'], - data_files=[ - *((join(prefix, 'share', i[0]), [join(i[0], 'comp.mo')]) - for i in walk('locale') if i[2]), - ('/etc/comp', ['settings.ini']) - ], - py_modules=['omp'], + package_data={'omp': ['locale/*/LC_MESSAGES/omp.mo']}, scripts=['comp'], - platforms=['POSIX'] -) + platforms=['POSIX']) diff --git a/test.json b/test.json deleted file mode 100644 index 789f98c..0000000 --- a/test.json +++ /dev/null @@ -1 +0,0 @@ -[{"filename": "https://youtu.be/JGwWNGJdvx8", "title": "Ed Sheeran - Shape of You [Official Video]", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/weeI1G46q0o", "title": "DJ Khaled - I'm the One ft. Justin Bieber, Quavo, Chance the Rapper, Lil Wayne", "selected": false, "error": true, "playing": true, "duration": "00:00:00"}, {"filename": "https://youtu.be/PMivT7MJ41M", "title": "Bruno Mars - That\u2019s What I Like [Official Video]", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/CTFtOOh47oo", "title": "French Montana - Unforgettable ft. Swae Lee", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/NLZRYQMLDW4", "title": "Kendrick Lamar - DNA.", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/FM7MFYoylVs", "title": "The Chainsmokers & Coldplay - Something Just Like This (Lyric)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/72UO0v5ESUo", "title": "Luis Fonsi, Daddy Yankee - Despacito (Audio) ft. Justin Bieber", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/D5drYkLiLI8", "title": "Kygo, Selena Gomez - It Ain't Me (with Selena Gomez) (Audio)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/Zgmvg-zzctI", "title": "Lil Uzi Vert - XO TOUR Llif3 (Produced By TM88)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/Um7pMggPnug", "title": "Katy Perry - Chained To The Rhythm (Official) ft. Skip Marley", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/xvZqHgFz51I", "title": "Future - Mask Off", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/8j9zMok6two", "title": "Miley Cyrus - Malibu (Official Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/aatr_2MstrI", "title": "Clean Bandit - Symphony feat. Zara Larsson [Official Video]", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/7F37r50VUTQ", "title": "ZAYN, Taylor Swift - I Don\u2019t Wanna Live Forever (Fifty Shades Darker)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/qFLhGq0060w", "title": "The Weeknd - I Feel It Coming ft. Daft Punk", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/5XK4v2fgMPU", "title": "KYLE - iSpy (feat. Lil Yachty) [Official Music Video]", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/SC4xMk98Pdc", "title": "Post Malone - Congratulations ft. Quavo", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/VkXjvHfP3MM", "title": "Nicki Minaj, Drake, Lil Wayne - No Frauds", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/NGLxoKOvzu4", "title": "Jason Derulo - Swalla (feat. Nicki Minaj & Ty Dolla $ign) (Official Music Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/Hm1YFszJWbQ", "title": "Migos - Slippery feat. Gucci Mane [Official Video]", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/Dst9gZkq1a8", "title": "Travis Scott - goosebumps ft. Kendrick Lamar", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/nfs8NYg7yQM", "title": "Charlie Puth - Attention [Official Video]", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/dMK_npDG12Q", "title": "Lorde - Green Light", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/h--P8HzYZ74", "title": "Zedd, Alessia Cara - Stay (Lyric Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/Xvjnoagk6GU", "title": "PSY - \u2018I LUV IT\u2019 M/V", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/Mdh2p03cRfw", "title": "Sam Hunt - Body Like A Back Road (Audio)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/XatXy6ZhKZw", "title": "Maroon 5 - Cold ft. Future", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/Fq0xEpRDL9Q", "title": "Chris Brown - Privacy (Explicit Version)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/7wtfhZwyrcc", "title": "Imagine Dragons - Believer", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/AEB6ibtdPZc", "title": "Paramore: Hard Times [OFFICIAL VIDEO]", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/vqW18C4plZ8", "title": "WizKid - Come Closer ft. Drake", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/FG9M0aEpJGE", "title": "G-Eazy & Kehlani - Good Life (from The Fate of the Furious: The Album) [MUSIC VIDEO]", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/wzZWXrlDj-A", "title": "DNCE - Kissing Strangers ft. Nicki Minaj", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/5qJp6xlKEug", "title": "Gorillaz - Saturnz Barz (Spirit House)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/A7xzXDStQnk", "title": "Shawn Mendes - There's Nothing Holdin' Me Back (Lyric Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/vp8VZe5kqEM", "title": "Lady Gaga - The Cure (Audio)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/9sg-A-eS6Ig", "title": "Enrique Iglesias - SUBEME LA RADIO (Official Video) ft. Descemer Bueno, Zion & Lennox", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/xiecZPzJoCQ", "title": "Sean Paul - Body ft. Migos", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/ZvUBGN4KoP0", "title": "Young Thug, 2 Chainz, Wiz Khalifa & PnB Rock \u2013 Gang Up (The Fate of the Furious: The Album) [VIDEO]", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/sxjC4CNG3_c", "title": "Logic - Black SpiderMan ft. Damian Lemar Hudson", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/c8OG5ffqfoE", "title": "Lil Yachty - Peek A Boo ft. Migos", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/kMRRIMmICmM", "title": "Move Your Lakk Video Song | Noor | Sonakshi Sinha & Diljit Dosanjh, Badshah | T-Series", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/3-NTv0CdFCk", "title": "Lana Del Rey - Love", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/DpMfP6qUSBo", "title": "Marian Hill - Down", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/u6p6dubzHAc", "title": "Baarish | Half Girlfriend | Arjun K & Shraddha K | Ash King & Shashaa Tirupati | Tanishk Bagchi", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/v4R7Q9SAcvM", "title": "Jeremih - I Think Of You ft. Chris Brown, Big Sean", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/7qaHdHpSjX8", "title": "Brett Young - In Case You Didn't Know", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/tgvbhxb9yk8", "title": "Machine Gun Kelly - At My Best ft. Hailee Steinfeld", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/QMhkdatUUPA", "title": "Florida Georgia Line - God, Your Mama, And Me ft. Backstreet Boys", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/MRLyREkZles", "title": "NAV - Some Way ft. The Weeknd", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/A-sS_Ts2Bjc", "title": "G-Eazy x Carnage - Guala ft. Thirty Rack", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/5dmQ3QWpy1Q", "title": "Heavy (Official Video) - Linkin Park (feat. Kiiara)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/z0GKGpObgPY", "title": "Harry Styles - Sign of the Times (Audio)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/GzT4p-OaJ5c", "title": "Keith Urban - The Fighter ft. Carrie Underwood", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/9Ke4480MicU", "title": "Julia Michaels - Issues", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/t_jHrUE5IOk", "title": "Maluma - Felices los 4 (Official Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/axySrE0Kg6k", "title": "Beauty and the Beast (From \"Beauty and the Beast\"/Official Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/HnCiU8mcPWs", "title": "Kodak Black - Too Many Years (feat. PNB Rock) [Official Music Video]", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/THfc1R09Te8", "title": "Thomas Rhett - Craving You ft. Maren Morris", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/jn40gqhxoSY", "title": "Cheat Codes - No Promises ft. Demi Lovato [Official Video]", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/uy3KFOykGQc", "title": "Noah Cyrus - Stay Together (Official Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/uEJuoEs1UxY", "title": "Bebe Rexha - I Got You [Official Music Video]", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/p3kbQeWshk4", "title": "10Digits - Fool For Love ft. Charmie", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/sPTn0QEhxds", "title": "Shakira - Me Enamor\u00e9 (Official Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/f6tU6BfnWEI", "title": "Andra - Lie To Me", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/LKroRc-gZVA", "title": "Major Lazer - Run Up (feat. PARTYNEXTDOOR & Nicki Minaj) (Official Lyric Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/VQtonf1fv_s", "title": "TWICE \"SIGNAL\" M/V", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/phr1pOFK1V8", "title": "Big Sean - Bounce Back", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/wor8gumz-1E", "title": "Cola Vs Milk: Anmol Gagan Maan (Full Video Song) | AKS | Latest Punjabi Songs 2017 | T-Series", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/euCqAq6BRa4", "title": "DJ Snake - Let Me Love You ft. Justin Bieber", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/KYgvXjtGcmg", "title": "David Guetta ft Nicki Minaj & Lil Wayne - Light My Body Up (Official Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/rvaJ7QlhH0g", "title": "A Boogie Wit Da Hoodie - Drowning (WATER) ft Kodak Black [Official Audio]", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/sI0TeFf6uD8", "title": "Chris Stapleton - Broken Halos (Audio)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/S7UAj9bl1-I", "title": "Meek Mill - Litty (feat. Tory Lanez) [OFFICIAL MUSIC VIDEO]", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/O8lFeVfYw_s", "title": "Amin\u00e9 - REDMERCEDES", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/QH35AWCnugg", "title": "Luke Bryan - Fast", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/YG2p6XBuSKA", "title": "05. El Amante - Nicky Jam (Video Oficial) (\u00c1lbum F\u00e9nix)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/UWLr2va3hu0", "title": "Pitbull & J Balvin - Hey Ma ft Camila Cabello (Spanish Version | The Fate of the Furious: The Album)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/qXiuVQ-GgA4", "title": "OneRepublic - No Vacancy (Lyric Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/WFQqAZBOwfQ", "title": "Calvin Harris - Slide (Audio Preview) ft. Frank Ocean & Migos", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/hXs1fWCgOW4", "title": "2 Chainz - Good Drank ft. Gucci Mane, Quavo", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/helEv0kGHd4", "title": "Davido - If", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/Y1h_wAVybsY", "title": "Kid Ink - F With U (Official Video) ft. Ty Dolla $ign", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/I-VsisgVkHw", "title": "Starley - Call On Me (Ryan Riback Remix)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/qBB_QOZNEdc", "title": "Hailee Steinfeld - Most Girls", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/rmuudxyM0t4", "title": "Flo Rida & 99 Percent - \"Cake\" (Official Music Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/kzQTc0-iBX8", "title": "Halsey - Now Or Never", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/XEvKn-QgAY0", "title": "Prince Royce, Shakira - Deja vu (Official Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/4tBnF46ybZk", "title": "WINNER - \u2018REALLY REALLY\u2019 M/V", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/3X9wEwulYhk", "title": "Wisin - Esc\u00e1pate Conmigo (Official Video) ft. Ozuna", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/b8m9zhNAgKs", "title": "Rae Sremmurd - Black Beatles ft. Gucci Mane", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/GoNAbDoXros", "title": "Jason Aldean - Any Ol' Barstool", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/K573xRzMY0U", "title": "Russ - Exposed (Official Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/lheKC1iC0CM", "title": "Jon Pardi - Dirt On My Boots", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/zsCt3Or4_Ss", "title": "Massari - So Long", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/kyxGsD-eP1I", "title": "Asma Lmnawar ... Andou Zine - Video Clip | \u0627\u0633\u0645\u0627 \u0644\u0645\u0646\u0648\u0631 ... \u0639\u0646\u062f\u0648 \u0627\u0644\u0632\u064a\u0646 - \u0641\u064a\u062f\u064a\u0648 \u0643\u0644\u064a\u0628", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/mThqhAT2Irk", "title": "Post Malone - Candy Paint (The Fate of the Furious: The Album)\u00a0[OFFICIAL AUDIO]", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/oHmBf4ExtZk", "title": "Ariana Grande - Everyday ft. Future", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/Qwu-B6gPHKU", "title": "Rascal Flatts - Yours If You Want It", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/yU0tnrEk8H4", "title": "Marshmello - Moving On (Official Music Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/vQvp6EghJ18", "title": "Arkells - Knocking At The Door", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/f6dUH2JnN04", "title": "B.o.B - 4 Lit (feat. T.I. & Ty Dolla $ign) (Official Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/lPAxgLXfXQo", "title": "James Barker Band - Chills", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/W6e1TctNyw8", "title": "Stargate - Waterfall ft. P!nk, Sia", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/NlrYn_dZdqk", "title": "Camila Cabello - Crying in the Club", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/b4ozdiGys5g", "title": "MUSE - Dig Down [Official Music Video]", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/YVtzQms7lps", "title": "Selena Gomez - Bad Liar (Audio)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/qqob4D3BoZc", "title": "Anne-Marie - Ciao Adios [Official Video]", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/MJYcQaAlLFQ", "title": "Rick Ross - Trap Trap Trap ft. Young Thug, Wale", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/WXmTEyq5nXc", "title": "Coldplay - Hypnotised\u00a0(Official Lyric Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/VtVFTuIZFYU", "title": "Fall Out Boy - Young And Menace", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/pBkHHoOIIn8", "title": "Portugal. The Man - \"Feel It Still\" (Official Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/HHCC4ndeJyE", "title": "Little Mix - No More Sad Songs (Official Video) ft. Machine Gun Kelly", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/c73Cu3TQnlg", "title": "Ahora Dice ft. J. Balvin, Ozuna, Arc\u00e1ngel (Official Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/PK7A-WdXW_A", "title": "Kiiara - Whippin (feat. Felix Snow) [Official Video]", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/TwyPsUd9LAk", "title": "Missy Elliott - I'm Better ft. Lamb [Official Video]", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/o5FzCz8NC58", "title": "Niall Horan - Slow Hands (Audio)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/kIDjovcTQhA", "title": "Brett Eldredge - Somethin' I'm Good At (Official Music Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/4Kg9PcSADyM", "title": "Dean Brody - Beautiful Freakshow ft. Shevy Price", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/J34esa_aJxc", "title": "Willie Nelson - Still Not Dead", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/SPoJJ7D4knk", "title": "Dierks Bentley - Black", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/Z7N64vUHxvw", "title": "P-Square - Nobody Ugly [Official Video]", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/9nfVWiXY3WY", "title": "J. Cole - Neighbors", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/d9IxdwEFk1c", "title": "[MV] IU(\uc544\uc774\uc720) _ Palette(\ud314\ub808\ud2b8) (Feat. G-DRAGON)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/fERLJoAvd5k", "title": "Aaron Goodvin - Lonely Drum - Official Lyric Video", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/aMimIZJiMp0", "title": "PnB Rock, Kodak Black & A Boogie \u2013 Horses (from The Fate of the Furious: The Album) [OFFICIAL AUDIO]", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/wqFROi1DUmQ", "title": "Nimrat Khaira - Rohab Rakhdi (Full Video Song) | Panj-aab Records | Preet Hundal | Latest Song 2017", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/bxD7BeZE4j8", "title": "Juicy J - Ain't Nothing ft. Wiz Khalifa, Ty Dolla $ign", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/zsQnCwV4Gr8", "title": "Tekno - Yawa (Official Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/fM8V1XOI-14", "title": "Kane Brown - What Ifs ft. Lauren Alaina", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/zaaxUvi-zUE", "title": "DVBBS & CMC$ - Not Going Home feat. Gia Koka (Official Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/DdCsTVcL4vM", "title": "Roon Wargi - Kulwinder Billa (Full Song) \u0a30\u0a42\u0a70 \u0a35\u0a30\u0a17\u0a40 | Latest Punjabi Song 2017 | Lokdhun Punjabi", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/WH9C6oLEtOg", "title": "Jax Jones - You Don't Know Me (Official Video) ft. RAYE", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/u1aVmoweBUI", "title": "Alkaline - Pretty Girl Team", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/qPTfXwPf_HM", "title": "Jonas Blue - Mama ft. William Singe", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/xALCpLXcIYY", "title": "Pitbull - Options ft. Stephen Marley", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/BSDxUVZJwTg", "title": "Dustin Lynch - Small Town Boy (Official Audio)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/AE0I0r1rwKg", "title": "Kabza (Full Video) Gagan Tung ft Deep Jandu | Latest Punjabi New Song 2017", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/IEA4_fUgOlc", "title": "Kevin Gates - What If [Official Audio]", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/W5j3bSprL1k", "title": "Shawn Hook - Reminding Me ft. Vanessa Hudgens", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/0yW7w8F2TVA", "title": "James Arthur - Say You Won't Let Go", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/IwC1xMwxVnI", "title": "YCee - Juice (Official Video) ft. Maleek Berry", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/lf8xoMhV8pI", "title": "Gente de Zona - Si No Vuelves (Official Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/3v5HZTwFBCs", "title": "Trey Songz \u2013 Nobody Else But You [Official Music Video]", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/Kp7eSUU9oy8", "title": "Childish Gambino - Redbone (Official Audio)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/KtlgYxa6BMU", "title": "Lord Huron - The Night We Met", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/WAE07gCjkhA", "title": "Dogus - Yara Bere (Official Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/T_uGcW-v5EI", "title": "Zac Brown Band - My Old Man (Lyric Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/RLYksQvr5zY", "title": "Playboi Carti - Magnolia (Audio)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/7kZ46Lz8rug", "title": "John Legend - Surefire", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/LWkoquUvD98", "title": "Brad Paisley - Last Time for Everything", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/4f1ywgU4i-c", "title": "Old Dominion - No Such Thing as a Broken Heart (Audio)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/Km4BayZykwE", "title": "J. Balvin - Si Tu Novio Te Deja Sola ft. Bad Bunny", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/5_lKAb2MD64", "title": "Bryson Tiller - Get Mine (Audio) ft. Young Thug", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/ivxPepDyqmI", "title": "Afrojack & David Guetta ft. Ester Dean - Another Life (Official Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/afUx6AIG3Tg", "title": "Tu Foto - Ozuna (Video Oficial)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/vsrhIUmPf-w", "title": "Omarion - Distance [Official Music Video]", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/ZeNwB4lNojs", "title": "Gucci Mane - Both Remix feat. Drake & Lil Wayne [Official Audio]", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/ZSznpyG9CHY", "title": "Royal Blood \u2013 Lights Out (Official Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/EfZfURgx9b0", "title": "Blake Shelton - Every Time I Hear That Song (Official Music Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/94MHIeeGwys", "title": "Michael Bubl\u00e9 - I Believe in You [OFFICIAL MUSIC VIDEO]", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/1Al-nuR1iAU", "title": "Rag'n'Bone Man - Skin (Official Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/4MzJKeMv8co", "title": "Tim McGraw, Faith Hill - Speak to a Girl (Audio)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/ob-jS7bqYgI", "title": "John Mayer - In the Blood (Audio)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/VO8qCRVj8dI", "title": "Galantis - Hunter (Official Audio)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/txCCYBMKdB0", "title": "AJR - Weak (OFFICIAL MUSIC VIDEO)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/CKhmCh68Qu0", "title": "Cashmere Cat - Quit (Lyric Video) ft. Ariana Grande", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/yiMtAmH0_vU", "title": "6LACK - Free (Official Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/P9-4xHVc7uk", "title": "Robin Schulz \u2013 OK (feat. James Blunt) (Official Music Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/D7krrRoJpT0", "title": "HAIM - Want You Back (Audio)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/E5RDEXpc8OY", "title": "Brothers Osborne - It Ain't My Fault", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/X6wQOW9ihDA", "title": "CNCO, Yandel - Hey DJ (Official Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/K4ZeDuKF4m8", "title": "ZAYN - Still Got Time (Lyric) ft. PARTYNEXTDOOR", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/CFGVpKKs1CQ", "title": "New Punjabi Songs 2017 -Jinna Tera Main Kardi (Full HD)-Gurnam Bhullar Ft. MixSingh - Jass Records", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/2O6duDDkhis", "title": "The National - 'The System Only Dreams in Total Darkness'", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/FkFVMDlcJF8", "title": "K.Flay - High Enough (Lyric Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/sjle_ZI4elo", "title": "Mura Masa & Charli XCX - 1 Night (Official Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/g7f6HiQ2LuU", "title": "Midland - Drinkin' Problem", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/zPYitm8kIcg", "title": "Cole Swindell ft. Dierks Bentley - Flatliner (Official Music Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/txTqtm58AqM", "title": "Red Hot Chili Peppers - Goodbye Angels [OFFICIAL VIDEO]", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/sR_pfk9JVlc", "title": "Drake - Gyalchester (Live From The 2017 Billboard Music Awards)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/0l9kzS_B7gg", "title": "Vince Staples - Big Fish", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/v4pi1LxuDHc", "title": "The Lumineers - Sleep On The Floor", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/yYcyacLRPNs", "title": "Elton John - Tiny Dancer (Official Music Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/aluHS4bANM8", "title": "Jonathan Roy - Good Things - Official Music Video", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/eLlPpxDGKrE", "title": "Don Omar, Zion & Lennox - Te Quiero Pa\u00b4Mi", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/yN41UT1aIAg", "title": "King Kosa ft Konshens & Shenseea - Best NaNa", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/jbgI-YDxvfk", "title": "Mike WiLL Made-It - On The Come Up ft. Big Sean", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/36DETSu8hlY", "title": "High Valley - I Be U Be (Official Music Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/ZwBkXgWNs_M", "title": "alt-J - 3WW (Official Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/GKSRyLdjsPA", "title": "Sia - The Greatest", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/Ktq4zATPFsI", "title": "Romeo Santos - H\u00e9roe Favorito (Official Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/QRRPt0ysfyI", "title": "MHD - AFRO TRAP Part.8 (Never)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/_3P26FaPxgk", "title": "Of Mice & Men - Unbreakable (Official Music Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/S9q-08aTNh8", "title": "Reba McEntire - Back To God", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/8-0uoRNERE4", "title": "Fna\u00efre - Ngoul Mali (EXCLUSIVE Music Video) | (\u0641\u0646\u0627\u064a\u0631 - \u0646\u06ad\u0648\u0644 \u0645\u0627\u0644\u064a (\u0641\u064a\u062f\u064a\u0648 \u0643\u0644\u064a\u0628 \u062d\u0635\u0631\u064a", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/Dyg32hMf7Fk", "title": "Khalid - Saved (Audio)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/12cUm2OwnPs", "title": "Miranda Lambert - Tin Man (2017 ACM Awards Performance)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/3rk6_Ax0mQo", "title": "J Hus - Did You See (Official Video)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}, {"filename": "https://youtu.be/7e9DSdkRQu4", "title": "Keith Urban - Blue Ain't Your Color (Home Free)", "selected": false, "error": false, "playing": false, "duration": "00:00:00"}] \ No newline at end of file diff --git a/test/gplv3.ogg b/test/gplv3.ogg new file mode 100644 index 0000000..e9c55b7 Binary files /dev/null and b/test/gplv3.ogg differ diff --git a/test/playlist.json b/test/playlist.json new file mode 100644 index 0000000..4a5c8b7 --- /dev/null +++ b/test/playlist.json @@ -0,0 +1,322 @@ +[ + { + "duration": "00:05:21", + "error": false, + "filename": "https://youtu.be/weeI1G46q0o", + "playing": false, + "selected": true, + "title": "DJ Khaled - I'm the One ft. Justin Bieber, Quavo, Chance the Rapper, Lil Wayne" + }, + { + "duration": "00:04:23", + "error": false, + "filename": "https://youtu.be/JGwWNGJdvx8", + "playing": false, + "selected": true, + "title": "Ed Sheeran - Shape of You [Official Video]" + }, + { + "duration": "00:03:30", + "error": false, + "filename": "https://youtu.be/PMivT7MJ41M", + "playing": false, + "selected": true, + "title": "Bruno Mars - That’s What I Like [Official Video]" + }, + { + "duration": "00:04:46", + "error": false, + "filename": "https://youtu.be/CTFtOOh47oo", + "playing": false, + "selected": false, + "title": "French Montana - Unforgettable ft. Swae Lee" + }, + { + "duration": "00:04:45", + "error": false, + "filename": "https://youtu.be/NLZRYQMLDW4", + "playing": false, + "selected": false, + "title": "Kendrick Lamar - DNA." + }, + { + "duration": "00:04:07", + "error": false, + "filename": "https://youtu.be/FM7MFYoylVs", + "playing": false, + "selected": true, + "title": "The Chainsmokers & Coldplay - Something Just Like This (Lyric)" + }, + { + "duration": "00:03:48", + "error": false, + "filename": "https://youtu.be/72UO0v5ESUo", + "playing": false, + "selected": true, + "title": "Luis Fonsi, Daddy Yankee - Despacito (Audio) ft. Justin Bieber" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/D5drYkLiLI8", + "playing": false, + "selected": false, + "title": "Kygo, Selena Gomez - It Ain't Me (with Selena Gomez) (Audio)" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/Zgmvg-zzctI", + "playing": false, + "selected": false, + "title": "Lil Uzi Vert - XO TOUR Llif3 (Produced By TM88)" + }, + { + "duration": "00:12:53", + "error": false, + "filename": "test/gplv3.ogg", + "playing": false, + "selected": true, + "title": "gplv3.ogg" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/xvZqHgFz51I", + "playing": false, + "selected": false, + "title": "Future - Mask Off" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/8j9zMok6two", + "playing": false, + "selected": false, + "title": "Miley Cyrus - Malibu (Official Video)" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/dPI-mRFEIH0", + "playing": false, + "selected": false, + "title": "Katy Perry - Bon Appétit (Official) ft. Migos" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/aatr_2MstrI", + "playing": false, + "selected": false, + "title": "Clean Bandit - Symphony feat. Zara Larsson [Official Video]" + }, + { + "duration": "00:34:38", + "error": false, + "filename": "https://www.tube8.com/teen/nicole-ray-and-james-deen/409802/", + "playing": false, + "selected": true, + "title": "Nicole Ray and James Deen" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/7F37r50VUTQ", + "playing": false, + "selected": true, + "title": "ZAYN, Taylor Swift - I Don’t Wanna Live Forever (Fifty Shades Darker)" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/qFLhGq0060w", + "playing": false, + "selected": true, + "title": "The Weeknd - I Feel It Coming ft. Daft Punk" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/6ImFf__U6io", + "playing": false, + "selected": true, + "title": "Birdman - Dark Shades (Explicit) ft. Lil Wayne, Mack Maine" + }, + { + "duration": "00:03:56", + "error": false, + "filename": "https://www.youtube.com/watch?v=3M3xfu0m5o4", + "playing": false, + "selected": false, + "title": "David Banner - Play (Dirty version)" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/NGLxoKOvzu4", + "playing": false, + "selected": false, + "title": "Jason Derulo - Swalla (feat. Nicki Minaj & Ty Dolla $ign) (Official Music Video)" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/Hm1YFszJWbQ", + "playing": false, + "selected": false, + "title": "Migos - Slippery feat. Gucci Mane [Official Video]" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/SC4xMk98Pdc", + "playing": false, + "selected": false, + "title": "Post Malone - Congratulations ft. Quavo" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/nfs8NYg7yQM", + "playing": false, + "selected": false, + "title": "Charlie Puth - Attention [Official Video]" + }, + { + "duration": "00:04:10", + "error": false, + "filename": "https://www.youtube.com/watch?v=sRIkXM8S1J8", + "playing": false, + "selected": true, + "title": "Best Goat Song Versions Compilation Ever! (HD)" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/Dst9gZkq1a8", + "playing": false, + "selected": false, + "title": "Travis Scott - goosebumps ft. Kendrick Lamar" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/dMK_npDG12Q", + "playing": false, + "selected": false, + "title": "Lorde - Green Light" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/h--P8HzYZ74", + "playing": false, + "selected": true, + "title": "Zedd, Alessia Cara - Stay (Lyric Video)" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/Mdh2p03cRfw", + "playing": false, + "selected": false, + "title": "Sam Hunt - Body Like A Back Road (Audio)" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/Fq0xEpRDL9Q", + "playing": false, + "selected": false, + "title": "Chris Brown - Privacy (Explicit Version)" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/7wtfhZwyrcc", + "playing": false, + "selected": false, + "title": "Imagine Dragons - Believer" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/t_jHrUE5IOk", + "playing": false, + "selected": false, + "title": "Maluma - Felices los 4 (Official Video)" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/wzZWXrlDj-A", + "playing": false, + "selected": false, + "title": "DNCE - Kissing Strangers ft. Nicki Minaj" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/AEB6ibtdPZc", + "playing": false, + "selected": false, + "title": "Paramore: Hard Times [OFFICIAL VIDEO]" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/vqW18C4plZ8", + "playing": false, + "selected": false, + "title": "WizKid - Come Closer ft. Drake" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/A7xzXDStQnk", + "playing": false, + "selected": false, + "title": "Shawn Mendes - There's Nothing Holdin' Me Back (Lyric Video)" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/FG9M0aEpJGE", + "playing": false, + "selected": false, + "title": "G-Eazy & Kehlani - Good Life (from The Fate of the Furious: The Album) [MUSIC VIDEO]" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/vp8VZe5kqEM", + "playing": false, + "selected": false, + "title": "Lady Gaga - The Cure (Audio)" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/eP4eqhWc7sI", + "playing": false, + "selected": false, + "title": "Lana Del Rey - Lust For Life (Official Video) ft. The Weeknd" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/5qJp6xlKEug", + "playing": false, + "selected": false, + "title": "Gorillaz - Saturnz Barz (Spirit House)" + }, + { + "duration": "00:00:00", + "error": false, + "filename": "https://youtu.be/9sg-A-eS6Ig", + "playing": false, + "selected": true, + "title": "Enrique Iglesias - SUBEME LA RADIO (Official Video) ft. Descemer Bueno, Zion & Lennox" + } +] \ No newline at end of file