=== compat.c
==================================================================
--- compat.c	(revision 60405)
+++ compat.c	(local)
@@ -357,7 +357,7 @@
 
   end = data + length;
 
-  if (id3_field_parse(&frame->fields[0], &data, end - data, &encoding) == -1)
+  if (id3_field_parse(&frame->fields[0], &data, end - data, &encoding, frame) == -1)
     goto fail;
 
   string = id3_parse_string(&data, end - data, encoding, 0);
@@ -420,7 +420,7 @@
       frame->fields[i].type = ID3_FIELD_TYPE_LANGUAGE;
     }
 
-    if (id3_field_parse(&frame->fields[i], &data, end - data, &encoding) == -1)
+    if (id3_field_parse(&frame->fields[i], &data, end - data, &encoding, frame) == -1)
       return -1;
   }
   
=== compat.gperf
==================================================================
--- compat.gperf	(revision 60405)
+++ compat.gperf	(local)
@@ -151,7 +151,7 @@
 
   end = data + length;
 
-  if (id3_field_parse(&frame->fields[0], &data, end - data, &encoding) == -1)
+  if (id3_field_parse(&frame->fields[0], &data, end - data, &encoding, frame) == -1)
     goto fail;
 
   string = id3_parse_string(&data, end - data, encoding, 0);
@@ -214,7 +214,7 @@
       frame->fields[i].type = ID3_FIELD_TYPE_LANGUAGE;
     }
 
-    if (id3_field_parse(&frame->fields[i], &data, end - data, &encoding) == -1)
+    if (id3_field_parse(&frame->fields[i], &data, end - data, &encoding, frame) == -1)
       return -1;
   }
   
=== field.c
==================================================================
--- field.c	(revision 60405)
+++ field.c	(local)
@@ -179,7 +179,7 @@
  * DESCRIPTION:	parse a field value
  */
 int id3_field_parse(union id3_field *field, id3_byte_t const **ptr,
-		    id3_length_t length, enum id3_field_textencoding *encoding)
+		    id3_length_t length, enum id3_field_textencoding *encoding, struct id3_frame *frame)
 {
   assert(field);
 
@@ -329,12 +329,32 @@
   case ID3_FIELD_TYPE_BINARYDATA:
     {
       id3_byte_t *data;
+      id3_byte_t skip = 0;
+      
+      // Optimization: avoid reading APIC artwork data if AUDIO_SCAN_NO_ARTWORK variable is true
+      // The length field will be correct, data will be 0
+      if ( !strcmp(frame->id, "APIC") ) {
+        char *env = getenv("AUDIO_SCAN_NO_ARTWORK");
+        if ( env != NULL && env[0] != '0' ) {
+          // env is true, skip art
+          skip = 1;
+        }
+      }
+      
+      if (skip) {
+        // Skip past binary data
+        *ptr += length;
+        field->binary.data = 0;
+      }
+      else {
+        // Parse binary data
+        data = id3_parse_binary(ptr, length);
+        if (data == 0)
+  	      goto fail;
+  	    
+  	    field->binary.data = data;
+  	  }
 
-      data = id3_parse_binary(ptr, length);
-      if (data == 0)
-	goto fail;
-
-      field->binary.data   = data;
       field->binary.length = length;
     }
     break;
=== field.h
==================================================================
--- field.h	(revision 60405)
+++ field.h	(local)
@@ -28,7 +28,7 @@
 void id3_field_finish(union id3_field *);
 
 int id3_field_parse(union id3_field *, id3_byte_t const **,
-		    id3_length_t, enum id3_field_textencoding *);
+		    id3_length_t, enum id3_field_textencoding *, struct id3_frame *);
 
 id3_length_t id3_field_render(union id3_field const *, id3_byte_t **,
 			      enum id3_field_textencoding *, int);
=== frame.c
==================================================================
--- frame.c	(revision 60405)
+++ frame.c	(local)
@@ -260,7 +260,7 @@
   end = data + length;
 
   for (i = 0; i < frame->nfields; ++i) {
-    if (id3_field_parse(&frame->fields[i], &data, end - data, &encoding) == -1)
+    if (id3_field_parse(&frame->fields[i], &data, end - data, &encoding, frame) == -1)
       return -1;
   }