offline-submit.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #!/usr/bin/python
  2. import datetime
  3. import getpass
  4. from optparse import OptionParser
  5. import subprocess
  6. import sys
  7. import mutagen
  8. from mutagen import easyid3
  9. from gobble import get_parser, GobbleServer, GobbleTrack
  10. def _parse_date(string):
  11. process = subprocess.Popen(['date', '-d %s' % (string,), '+%s'],
  12. stdout=subprocess.PIPE)
  13. string = process.communicate()[0].strip()
  14. return datetime.datetime.utcfromtimestamp(float(string))
  15. def _date_prompt(dt):
  16. input = ''
  17. while input not in ['y', 'n']:
  18. input = raw_input("Did you mean '%s UTC'? [Y/n]: " % (dt,)).lower()
  19. if input == 'n':
  20. sys.exit()
  21. def _get_date_from_string(start_string):
  22. dt = _parse_date(start_string)
  23. _date_prompt(dt)
  24. return dt
  25. def _get_offset_date(tracks):
  26. offset = datetime.timedelta()
  27. for track in tracks:
  28. offset += datetime.timedelta(seconds=_get_track(track).info.length)
  29. dt = datetime.datetime.now() - offset
  30. _date_prompt(dt)
  31. return dt
  32. def _get_track(filename):
  33. f = mutagen.File(filename)
  34. if f is None:
  35. raise Exception("%s caused problems." % (track,))
  36. if isinstance(f, mutagen.mp3.MP3):
  37. f = mutagen.mp3.MP3(filename, ID3=easyid3.EasyID3)
  38. return f
  39. if __name__ == '__main__':
  40. usage = "%prog [--server <SERVER>] <USERNAME> <START TIME> <MEDIA FILES>"
  41. parser = get_parser(usage=usage)
  42. parser.add_option('-j', '--just-finished', action="store_true",
  43. help="Works out START TIME as if you've just finished"
  44. " listening to MEDIA FILES. START TIME argument"
  45. " will be treated as a media file, so don't pass"
  46. " it.")
  47. parser.set_defaults(just_finished=False)
  48. opts,args = parser.parse_args()
  49. if opts.just_finished:
  50. expected_args = 2
  51. else:
  52. expected_args = 3
  53. if len(args) < expected_args:
  54. parser.error("All arguments are required.")
  55. username = args.pop(0)
  56. start_string = None
  57. if not opts.just_finished:
  58. start_string = args.pop(0)
  59. server = opts.server
  60. password = getpass.getpass()
  61. tracks = args
  62. server = GobbleServer(server, username, password)
  63. if opts.just_finished:
  64. dt = _get_offset_date(tracks)
  65. else:
  66. dt = _get_date_from_string(start_string)
  67. for track in tracks:
  68. f = _get_track(track)
  69. title = f['title'][0]
  70. artist = f['artist'][0]
  71. length = f.info.length
  72. album = f['album'][0]
  73. tracknumber = f['tracknumber'][0]
  74. t = GobbleTrack(artist, title, dt, album=album, length=length,
  75. tracknumber=tracknumber)
  76. server.add_track(t)
  77. dt += datetime.timedelta(seconds=length)
  78. server.submit()