#!/usr/bin/env python3

"""
yt2mp3
A program that simplifies the process of searching, downloading and
converting Youtube videos to MP3 files with embedded metadata via the
iTunes API.
bin/yt2mp3
Brett Stevenson (c) 2018
"""

import sys, logging, argparse, yt2mp3
from collections import defaultdict

def main():
  parser = argparse.ArgumentParser(prog='yt2mp3', usage='%(prog)s [options]', add_help=True)
  parser.add_argument('--version', action='version', version='v1.0.5', help='show the program version number and exit')
  parser.add_argument('-t', '--track', default='', help='Specify the track name query', nargs='+')
  parser.add_argument('-a', '--artist', default='', help='specify the artist name query', nargs='+')
  parser.add_argument('-u', '--url', help='specify the YouTube URL/ID of the video to convert')
  parser.add_argument('-p', '--playlist', help='specify the YouTube URL/ID of the playlist to convert')
  parser.add_argument('-o', '--overwrite', help='overwrite file if one exists in output directory', action='store_true')
  parser.add_argument('-v', '--verbose', help='display a download progress bar', action='store_true')
  parser.add_argument('-q', '--quiet', help='suppress command-line output', action='store_true')
  args = parser.parse_args()
  # Set logging level
  logging.basicConfig(level=logging.WARNING if args.quiet else logging.INFO, format='%(message)s')

  data = defaultdict(str)
  if args.playlist:
    url = 'https://www.youtube.com/playlist?list='+args.playlist.split('list=')[-1]
    queue = yt2mp3.getVideoList(url)
    yt2mp3.downloadPlaylist(queue, args.verbose, args.overwrite)
    sys.exit()
  elif args.url:
    url = args.url
    if len(url) <= 12:
      url = 'https://www.youtube.com/watch?v='+url
    result = yt2mp3.getVideoData(yt2mp3.getVideoTitle(url))
    if not result:
      data['track_name'] = input(' Track: ')
      data['artist_name'] = input(' Artist: ')
      data['artwork_url_100'] = 'https://img.youtube.com/vi/'+url.split('watch?v=')[-1]+'/maxresdefault.jpg'
      result = yt2mp3.getSongData(data['track_name'], data['artist_name'], False)
  else:
    # Get song track/artist from user
    if args.track or args.artist:
      data['track_name'] = ' '.join(args.track)
      data['artist_name'] = ' '.join(args.artist)
    else:
      data['track_name'] = input(' Track: ')
      data['artist_name'] = input(' Artist: ')
    if data['track_name'] and data['artist_name']:
      result = yt2mp3.getSongData(data['track_name'], data['artist_name'])
    elif data['track_name'] or data['artist_name']:
      songs = yt2mp3.getSongData(data['track_name'], data['artist_name'])
      if data['track_name']:
        options = ['%-30.25s %10.25s' % (s.track_name, s.artist_name) for s in songs]
      elif data['artist_name']:
        options = [s.track_name for s in songs]
      result = songs[yt2mp3.showMenu(options)]
    if not data['track_name'] and not data['artist_name'] or not result:
      logging.warning('Sorry, no results were found.')
      sys.exit()
    url = yt2mp3.getVideoURL(data['track_name'], data['artist_name'])
  if result:
    data = defaultdict(str, result.__dict__)
  data['video_url'] = url
  song = yt2mp3.Song(data)
  if not args.overwrite and yt2mp3.fileExists(song):
    logging.info('This song already exists in the output directory')
    sys.exit()
  video = yt2mp3.download(song.video_url, args.verbose)
  path = yt2mp3.convertToMP3(video, song)
  yt2mp3.setID3(path, song)
  logging.info(' ✔ Done')


if __name__ == '__main__':
  main()
