Blob Blame History Raw
diff -up nicotine+-1.2.16/pynicotine/metadata_mutagen.py.orig nicotine+-1.2.16/pynicotine/metadata_mutagen.py
--- nicotine+-1.2.16/pynicotine/metadata_mutagen.py.orig	2009-09-30 17:53:21.000000000 +0200
+++ nicotine+-1.2.16/pynicotine/metadata_mutagen.py	2014-07-31 01:30:44.187442933 +0200
@@ -1,7 +1,9 @@
 #!/usr/bin/env python
 
+# Python core
 from __future__ import division
 
+# Python modules
 import mutagen
 
 from mutagen.mp3 import MP3, MPEGInfo
@@ -14,13 +16,20 @@ from mutagen.asf import ASFInfo
 from mutagen.monkeysaudio import MonkeysAudioInfo
 from mutagen.mp4 import MP4Info
 
+# Application specific
+from logfacility import log
+
+
 def detect(path):
 	try:
 		audio = mutagen.File(path)
 	except IOError:
 		return None
-	# mutagen didn't think the file was audio
+	except Exception, e:
+		log.addwarning("Mutagen crashed on '%s': %s" % (path, e))
+		return None
 	if not audio:
+		# mutagen didn't think the file was audio
 		return None
 	if type(audio.info) == MPEGInfo:
 		return processMPEG(audio)
diff -up nicotine+-1.2.16/pynicotine/shares.py.orig nicotine+-1.2.16/pynicotine/shares.py
--- nicotine+-1.2.16/pynicotine/shares.py.orig	2010-07-11 12:29:58.000000000 +0200
+++ nicotine+-1.2.16/pynicotine/shares.py	2014-07-31 01:30:50.608262924 +0200
@@ -5,6 +5,7 @@ import dircache
 import gobject
 import string, sys, os
 import time
+import struct
 
 # N+ imports
 import slskmessages
@@ -53,9 +54,13 @@ class Shares:
 		self.queue.put(slskmessages.SharedFoldersFiles(sharedfolders, sharedfiles))
 
 	def RescanShares(self, msg, rebuild=False):
-		files, streams, wordindex, fileindex, mtimes = self.rescandirs(msg.shared, self.config.sections["transfers"]["sharedmtimes"], self.config.sections["transfers"]["sharedfiles"], self.config.sections["transfers"]["sharedfilesstreams"], msg.yieldfunction, self.np.frame.SharesProgress, name=_("Shares"), rebuild=rebuild)
-		time.sleep(0.5)
-		self.np.frame.RescanFinished([files, streams, wordindex, fileindex, mtimes], "normal")
+		try:
+			files, streams, wordindex, fileindex, mtimes = self.rescandirs(msg.shared, self.config.sections["transfers"]["sharedmtimes"], self.config.sections["transfers"]["sharedfiles"], self.config.sections["transfers"]["sharedfilesstreams"], msg.yieldfunction, self.np.frame.SharesProgress, name=_("Shares"), rebuild=rebuild)
+			time.sleep(0.5)
+			self.np.frame.RescanFinished([files, streams, wordindex, fileindex, mtimes], "normal")
+		except:
+			log.addwarning("Failed to rebuild share, serious error occurred. If this problem persists delete ~/.nicotine/*.db and try again. If that doesn't help please file a bug report with the stack trace included (see terminal output after this message)")
+			raise
 		
 	def RebuildShares(self, msg):
 		self.RescanShares(msg, rebuild=True)
@@ -651,23 +656,26 @@ class Shares:
 	def getByteStream(self, fileinfo):
 		message = slskmessages.SlskMessage()
 		
-		#size = long(fileinfo[1])
-		#size1 = size & 0xffffffff
-		#size2 = size >> 32
-		
-		#X print "chr1-" + repr(chr(1) + message.packObject(fileinfo[0]) + message.packObject(fileinfo[1]))
-		#X print "chr1+" + repr(chr(1) + message.packObject(fileinfo[0]) + message.packObject(NetworkIntType(fileinfo[1])))
 		stream = chr(1) + message.packObject(fileinfo[0]) + message.packObject(NetworkLongLongType(fileinfo[1]))
 		if fileinfo[2] is not None:
-			stream += message.packObject('mp3') + message.packObject(3)
-			#X print "net-" + repr(message.packObject(0) + message.packObject(fileinfo[2][0]) + message.packObject(1) + message.packObject(fileinfo[3]) + message.packObject(2) + message.packObject(fileinfo[2][1]))
-			#X print "net+" + repr(message.packObject(0) + message.packObject(NetworkIntType(fileinfo[2][0])) + message.packObject(1) + message.packObject(NetworkIntType(fileinfo[3])) + message.packObject(2) + message.packObject(NetworkIntType(fileinfo[2][1])))
-			stream += (message.packObject(0) +
-			           message.packObject(NetworkIntType(fileinfo[2][0])) +
-			           message.packObject(1) +
-			           message.packObject(NetworkIntType(fileinfo[3])) +
-			           message.packObject(2) +
-			           message.packObject(NetworkIntType(fileinfo[2][1])))
+			try:
+				msgbytes = ''
+				msgbytes += message.packObject('mp3') + message.packObject(3)
+				msgbytes += (message.packObject(0) +
+						message.packObject(NetworkIntType(fileinfo[2][0])) +
+						message.packObject(1) +
+						message.packObject(NetworkIntType(fileinfo[3])) +
+						message.packObject(2) +
+						message.packObject(NetworkIntType(fileinfo[2][1])))
+				stream += msgbytes
+			except struct.error:
+				log.addwarning(_("Found meta data that couldn't be encoded, possible corrupt file: '%(file)s' has a bitrate of %(bitrate)s kbs, a length of %(length)s seconds and a VBR of %(vbr)s" % {
+						'file':    fileinfo[0],
+						'bitrate': fileinfo[2][0],
+						'length':  fileinfo[3],
+						'vbr':     fileinfo[2][1]
+					}))
+				stream += message.packObject('') + message.packObject(0)
 		else:
 			stream += message.packObject('') + message.packObject(0)
 		return stream