/iconoclast/completed Modules/music/tagreading.py

https://github.com/MM294/Soprano-Player
Python | 232 lines | 195 code | 19 blank | 18 comment | 28 complexity | 01d7a2a718e90bd7291433b2a5007aa1 MD5 | raw file
  1. from mutagenx.mp3 import MP3
  2. from mutagenx.id3 import ID3
  3. from mutagenx.mp4 import MP4
  4. from mutagenx.oggvorbis import OggVorbis
  5. from mutagenx.flac import FLAC
  6. from mutagenx.asf import ASF
  7. import os.path, magic
  8. from settings import sopranoGlobals, settings
  9. FILE_FORMATS = {'.mp3','.ogg','.oga','.wma','.flac','.m4a','.mp4','.aac'}
  10. #FILE_FORMATS = {'.audio/mp4; charset=binary','audio/mpeg; charset=binary','application/ogg; charset=binary','audio/x-flac; charset=binary','audio/x-wav; charset=binary','audio/x-ms-asf; charset=binary','video/x-ms-asf; charset=binary','application/octet-stream; charset=binary'}
  11. #Including octet-stream to work around magic not correctly identifying mp3 with image metadata
  12. class TrackMetaData:
  13. def getTrackType(self, filepath):
  14. m = magic.open(magic.MAGIC_MIME)
  15. m.load()
  16. # options = { 'application/ogg; charset=binary' : self.oggInfo,
  17. # '.audio/mp4; charset=binary' : self.m4aInfo,
  18. # 'audio/mpeg; charset=binary' : self.id3Info,
  19. # 'audio/x-flac; charset=binary' : self.flacInfo,
  20. # 'audio/x-ms-asf; charset=binary' : self.wmaInfo,
  21. # 'video/x-ms-asf; charset=binary' : self.wmaInfo,
  22. # 'audio/x-wav; charset=binary' : self.id3Info}
  23. options = { '.ogg' : self.oggInfo,
  24. '.oga' : self.oggInfo,
  25. '.mp4' : self.m4aInfo,
  26. '.m4a' : self.m4aInfo,
  27. '.mp3' : self.id3Info,
  28. '.flac' : self.flacInfo,
  29. '.wma' : self.wmaInfo,
  30. '.asf' : self.wmaInfo,
  31. '.wav' : self.id3Info}
  32. fileExtension = os.path.splitext(filepath.lower())[1]
  33. filepath = filepath.replace('file://','')
  34. #try: fileDescription = m.file(filepath)
  35. #except: fileDescription = "Invalid Format"
  36. if filepath[:7] == 'http://' or filepath[:6] == 'mms://':
  37. return self.radioInfo(filepath)
  38. elif fileExtension in FILE_FORMATS:
  39. filepath = filepath.replace('%5B','[').replace('%5D',']').replace('%25', '%').replace('%23', '#')
  40. if os.path.exists(filepath):
  41. return options[fileExtension](filepath)
  42. #return options[fileDescription](filepath)
  43. else:
  44. return False
  45. elif filepath[:7] == 'cdda://':
  46. return self.cdtrkInfo(filepath)
  47. else:
  48. return False
  49. def radioInfo(self, filepath):
  50. self.editPref = settings.IconoPrefs(sopranoGlobals.RADIO_DATA)
  51. stations = self.editPref.get_radioStations()
  52. for key, value in self.editPref.get_radioStations().items():
  53. if filepath == value:
  54. songtitle = key
  55. break
  56. else:
  57. songtitle = "Unknown Title"
  58. tracknum = 0
  59. artist = "Radio Station"
  60. album = "Radio Station"
  61. genre = "None"
  62. tracklength = "N/A"
  63. return [None, tracknum, songtitle, artist, album, tracklength, genre, filepath]
  64. def cdtrkInfo(self, filepath):
  65. tracknum = int(filepath.replace('cdda://',''))
  66. songtitle = "Track " + str(tracknum)
  67. artist = "Unknown Artist"
  68. album = "Compact Disc"
  69. genre = "None"
  70. tracklength = "%02i:%02i" %(0,0)
  71. return [None, tracknum, songtitle, artist, album, tracklength, genre, filepath]
  72. def getTracklength(self, filepath):
  73. tracklength = int(round(MP3(filepath).info.length))
  74. m,s = divmod(tracklength, 60)
  75. tracklength = "%02i:%02i" %(m,s)
  76. return tracklength
  77. def id3Info(self, filepath):
  78. #from time import time as systime
  79. #systime1 = systime()
  80. try: audio = MP3(filepath)
  81. except: return [None, 0, '', '', '', self.getTracklength(filepath), '', filepath]
  82. #print(systime() - systime1)
  83. try: tracknum = audio["TRCK"][0]
  84. except: tracknum = 0
  85. if tracknum is not None:
  86. try: tracknum = int(tracknum.split('/')[0])
  87. except ValueError: tracknum = 0
  88. except: tracknum = int(tracknum)
  89. #print (audio["TIT2"][0]).encode('ascii', 'replace')
  90. try: songtitle = (audio["TIT2"][0])#.encode('ascii', 'replace')
  91. except: songtitle = "Unknown Title"
  92. try: artist = audio["TPE1"][0]
  93. except: artist = "Unknown Artist"
  94. try: album = audio["TALB"][0]
  95. except: album = "Unknown Album"
  96. try: genre = audio["TCON"][0]
  97. except: genre = "None"
  98. tracklength = int(round(audio.info.length))
  99. m,s = divmod(tracklength, 60)
  100. tracklength = "%02i:%02i" %(m,s)
  101. filepath = "%s%s" % ("file://",filepath)
  102. return [None, tracknum, songtitle, artist, album, tracklength, genre, filepath]
  103. def m4aInfo(self, filepath):
  104. try: audio = MP4(filepath)
  105. except: return [None, 0, '', '', '', self.getTracklength(filepath), '', filepath]
  106. try: tracknum = audio["trkn"][0][0]
  107. except: tracknum = 0
  108. if tracknum is not None:
  109. try: tracknum = int(tracknum.split('/')[0])
  110. except ValueError: tracknum = 0
  111. except: tracknum = int(tracknum)
  112. #python3.x
  113. try: songtitle = audio[b"\xa9nam"][0]
  114. except: songtitle = "Unknown Title"
  115. try: artist = audio[b"\xa9ART"][0]
  116. except: artist = "Unknown Artist"
  117. try: album = audio[b"\xa9alb"][0]
  118. except: album = "Unknown Album"
  119. try: genre = audio[b"\xa9gen"][0]
  120. except: genre = "None"""
  121. """#python2.7
  122. try: songtitle = audio["\xa9nam"][0]
  123. except: songtitle = "Unknown Title"
  124. try: artist = audio["\xa9ART"][0]
  125. except: artist = "Unknown Artist"
  126. try: album = audio["\xa9alb"][0]
  127. except: album = "Unknown Album"
  128. try: genre = audio["\xa9gen"][0]
  129. except: genre = "None"""
  130. tracklength = int(round(audio.info.length))
  131. m,s = divmod(tracklength, 60)
  132. tracklength = "%02i:%02i" %(m,s)
  133. filepath = "%s%s" % ("file://",filepath)
  134. return [None, tracknum, songtitle, artist, album, tracklength, genre, filepath]
  135. def oggInfo(self, filepath):
  136. try: audio = OggVorbis(filepath)
  137. except: return [None, 0, '', '', '', self.getTracklength(filepath), '', filepath]
  138. try: tracknum = audio["tracknumber"][0]
  139. except: tracknum = 0
  140. if tracknum is not None:
  141. try: tracknum = int(tracknum.split('/')[0])
  142. except ValueError: tracknum = 0
  143. except: tracknum = int(tracknum)
  144. try: songtitle = audio["title"][0]
  145. except: songtitle = "Unknown Title"
  146. try: artist = audio["artist"][0]
  147. except: artist = "Unknown Artist"
  148. try: album = audio["album"][0]
  149. except: album = "Unknown Album"
  150. try: genre = audio["genre"][0]
  151. except: genre = "None"
  152. tracklength = int(round(audio.info.length))
  153. m,s = divmod(tracklength, 60)
  154. tracklength = "%02i:%02i" %(m,s)
  155. filepath = "%s%s" % ("file://",filepath)
  156. return [None, tracknum, songtitle, artist, album, tracklength, genre, filepath]
  157. def flacInfo(self, filepath):
  158. try: audio = FLAC(filepath)
  159. except: return [None, 0, '', '', '', self.getTracklength(filepath), '', filepath]
  160. try: tracknum = audio["tracknumber"][0]
  161. except: tracknum = 0
  162. if tracknum is not None:
  163. try: tracknum = int(tracknum.split('/')[0])
  164. except ValueError: tracknum = 0
  165. except: tracknum = int(tracknum)
  166. try: songtitle = audio["title"][0]
  167. except: songtitle = "Unknown Title"
  168. try: artist = audio["artist"][0]
  169. except: artist = "Unknown Artist"
  170. try: album = audio["album"][0]
  171. except: album = "Unknown Album"
  172. try: genre = audio["genre"][0]
  173. except: genre = "None"
  174. tracklength = int(round(audio.info.length))
  175. m,s = divmod(tracklength, 60)
  176. tracklength = "%02i:%02i" %(m,s)
  177. filepath = "%s%s" % ("file://",filepath)
  178. return [None, tracknum, songtitle, artist, album, tracklength, genre, filepath]
  179. def wmaInfo(self, filepath):
  180. try: audio = ASF(filepath)
  181. except: return [None, 0, '', '', '', self.getTracklength(filepath), '', filepath]
  182. try: tracknum = audio["WM/TrackNumber"][0]
  183. except: tracknum = 0
  184. if tracknum is not None:
  185. try: tracknum = int(tracknum.split('/')[0])
  186. except ValueError: tracknum = 0
  187. except: tracknum = int(tracknum)
  188. try: songtitle = str(audio["Title"][0])
  189. except: songtitle = "Unknown Title"
  190. try: artist = str(audio["Author"][0])
  191. except: artist = "Unknown Artist"
  192. try: album = str(audio["WM/AlbumTitle"][0])
  193. except: album = "Unknown Album"
  194. try: genre = str(audio["WM/Genre"][0])
  195. except: genre = "None"
  196. tracklength = int(round(audio.info.length))
  197. m,s = divmod(tracklength, 60)
  198. tracklength = "%02i:%02i" %(m,s)
  199. filepath = "%s%s" % ("file://",filepath)
  200. return [None, tracknum, songtitle, artist, album, tracklength, genre, filepath]
  201. #getmesumdatabruv = TrackMetaData()
  202. #print(getmesumdatabruv.getTrackType("/media/Media/Music/Noel Gallagher/High Flying Birds/01 Everybody's On The Run.mp3"))