[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re:Re: New emms-info-native
From: |
tumashu |
Subject: |
Re:Re: New emms-info-native |
Date: |
Thu, 18 Feb 2021 08:41:56 +0800 (CST) |
I have tested with this benchmark, find three problem:
Maybe emms-info-native should ignore errors and use message to tell user which
file can not be handle properly.
1. if mp3 file can't be readed for control access. info-native will error.
2.
------------------------
Debugger entered--Lisp error: (args-out-of-range "" 0)
bindat--unpack-u8()
bindat--unpack-item(u8 1 nil)
bindat--unpack-item(vec 3 nil)
bindat--unpack-group(((file-identifier vec 3) (eval (unless (equal last
emms-info-native--id3v2-magic-array) (error "id3v2 framing mismatch: expected
‘%s’, got ‘%s’" emms-info-native--id3v2-magic-array last))) (version u8) (eval
(setq emms-info-native--id3v2-version last)) (revision u8) (flags bits 1)
(size-bytes vec 4) (size eval (emms-info-native--checked-id3v2-size 'tag
last))))
bindat-unpack(((file-identifier vec 3) (eval (unless (equal last
emms-info-native--id3v2-magic-array) (error "id3v2 framing mismatch: expected
‘%s’, got ‘%s’" emms-info-native--id3v2-magic-array last))) (version u8) (eval
(setq emms-info-native--id3v2-version last)) (revision u8) (flags bits 1)
(size-bytes vec 4) (size eval (emms-info-native--checked-id3v2-size 'tag
last))) "")
(progn (set-buffer-multibyte nil) (insert-file-contents-literally filename
nil 0 10) (bindat-unpack emms-info-native--id3v2-header-bindat-spec
(buffer-string)))
(unwind-protect (progn (set-buffer-multibyte nil)
(insert-file-contents-literally filename nil 0 10) (bindat-unpack
emms-info-native--id3v2-header-bindat-spec (buffer-string))) (and (buffer-name
temp-buffer) (kill-buffer temp-buffer)))
(save-current-buffer (set-buffer temp-buffer) (unwind-protect (progn
(set-buffer-multibyte nil) (insert-file-contents-literally filename nil 0 10)
(bindat-unpack emms-info-native--id3v2-header-bindat-spec (buffer-string)))
(and (buffer-name temp-buffer) (kill-buffer temp-buffer))))
(let ((temp-buffer (generate-new-buffer " *temp*" t))) (save-current-buffer
(set-buffer temp-buffer) (unwind-protect (progn (set-buffer-multibyte nil)
(insert-file-contents-literally filename nil 0 10) (bindat-unpack
emms-info-native--id3v2-header-bindat-spec (buffer-string))) (and (buffer-name
temp-buffer) (kill-buffer temp-buffer)))))
emms-info-native--decode-id3v2-header("/home/feng/音乐/李玉刚/逐梦令 四美图/月光.mp3")
(let* (emms-info-native--id3v2-version (header
(emms-info-native--decode-id3v2-header filename)) (tag-size (bindat-get-field
header 'size)) (unsync (memq 7 (bindat-get-field header 'flags))) (offset 10))
(if (memq 6 (bindat-get-field header 'flags)) (progn (setq offset (+ offset
(emms-info-native--decode-id3v2-ext-header-size filename)))))
(emms-info-native--decode-id3v2-frames filename offset (+ tag-size 10) unsync))
emms-info-native--decode-id3v2("/home/feng/音乐/李玉刚/逐梦令 四美图/月光.mp3")
(cond ((or (eq stream-type 'vorbis) (eq stream-type 'opus))
(emms-info-native--decode-ogg-comments filename stream-type)) ((eq stream-type
'flac) (emms-info-native--decode-flac-comments filename)) ((eq stream-type
'mp3) (emms-info-native--decode-id3v2 filename)) (t nil))
(let ((stream-type (emms-info-native--find-stream-type filename))) (cond ((or
(eq stream-type 'vorbis) (eq stream-type 'opus))
(emms-info-native--decode-ogg-comments filename stream-type)) ((eq stream-type
'flac) (emms-info-native--decode-flac-comments filename)) ((eq stream-type
'mp3) (emms-info-native--decode-id3v2 filename)) (t nil)))
emms-info-native--decode-info-fields("/home/feng/音乐/李玉刚/逐梦令 四美图/月光.mp3")
eval((emms-info-native--decode-info-fields "/home/feng/音乐/李玉刚/逐梦令
四美图/月光.mp3") nil)
elisp--eval-last-sexp(nil)
#f(compiled-function (eval-last-sexp-arg-internal) "Evaluate sexp before
point; print value in the echo area.\nInteractively, with a non `-' prefix
argument, print output into\ncurrent buffer.\n\nThis commands handles `defvar',
`defcustom' and `defface' the\nsame way that `eval-defun' does. See the doc
string of that\nfunction for details.\n\nNormally, this function truncates long
output according to the\nvalue of the variables `eval-expression-print-length'
and\n`eval-expression-print-level'. With a prefix argument of zero,\nhowever,
there is no such truncation.\nInteger values are printed in several formats
(decimal, octal,\nand hexadecimal). When the prefix argument is -1 or the
value\ndoesn't exceed `eval-expression-print-maximum-character', an\ninteger
value is also printed as a character of that codepoint.\n\nIf
`eval-expression-debug-on-error' is non-nil, which is the default,\nthis
command arranges for all errors to enter the debugger." (interactive "P")
#<bytecode 0x1d1337931c73bf61>)(nil)
apply(#f(compiled-function (eval-last-sexp-arg-internal) "Evaluate sexp
before point; print value in the echo area.\nInteractively, with a non `-'
prefix argument, print output into\ncurrent buffer.\n\nThis commands handles
`defvar', `defcustom' and `defface' the\nsame way that `eval-defun' does. See
the doc string of that\nfunction for details.\n\nNormally, this function
truncates long output according to the\nvalue of the variables
`eval-expression-print-length' and\n`eval-expression-print-level'. With a
prefix argument of zero,\nhowever, there is no such truncation.\nInteger values
are printed in several formats (decimal, octal,\nand hexadecimal). When the
prefix argument is -1 or the value\ndoesn't exceed
`eval-expression-print-maximum-character', an\ninteger value is also printed as
a character of that codepoint.\n\nIf `eval-expression-debug-on-error' is
non-nil, which is the default,\nthis command arranges for all errors to enter
the debugger." (interactive "P") #<bytecode 0x1d1337931c73bf61>) nil)
eval-last-sexp(nil)
funcall-interactively(eval-last-sexp nil)
command-execute(eval-last-sexp)
--------------------------
3.
--------------------------------------------------------------------------------------------------------------------------------------
Debugger entered--Lisp error: (error "id3v2 framing mismatch: expected ‘[73 68
51]’, got...")
error("id3v2 framing mismatch: expected ‘%s’, got ‘%s’" [73 68 51] [255 251
224])
(if (equal last emms-info-native--id3v2-magic-array) nil (error "id3v2
framing mismatch: expected ‘%s’, got ‘%s’" emms-info-native--id3v2-magic-array
last))
(unless (equal last emms-info-native--id3v2-magic-array) (error "id3v2
framing mismatch: expected ‘%s’, got ‘%s’" emms-info-native--id3v2-magic-array
last))
bindat--unpack-group(((file-identifier vec 3) (eval (unless (equal last
emms-info-native--id3v2-magic-array) (error "id3v2 framing mismatch: expected
‘%s’, got ‘%s’" emms-info-native--id3v2-magic-array last))) (version u8) (eval
(setq emms-info-native--id3v2-version last)) (revision u8) (flags bits 1)
(size-bytes vec 4) (size eval (emms-info-native--checked-id3v2-size 'tag
last))))
bindat-unpack(((file-identifier vec 3) (eval (unless (equal last
emms-info-native--id3v2-magic-array) (error "id3v2 framing mismatch: expected
‘%s’, got ‘%s’" emms-info-native--id3v2-magic-array last))) (version u8) (eval
(setq emms-info-native--id3v2-version last)) (revision u8) (flags bits 1)
(size-bytes vec 4) (size eval (emms-info-native--checked-id3v2-size 'tag
last))) "\377\373\340\4\0\0\0\0\0\0")
(progn (set-buffer-multibyte nil) (insert-file-contents-literally filename
nil 0 10) (bindat-unpack emms-info-native--id3v2-header-bindat-spec
(buffer-string)))
(unwind-protect (progn (set-buffer-multibyte nil)
(insert-file-contents-literally filename nil 0 10) (bindat-unpack
emms-info-native--id3v2-header-bindat-spec (buffer-string))) (and (buffer-name
temp-buffer) (kill-buffer temp-buffer)))
(save-current-buffer (set-buffer temp-buffer) (unwind-protect (progn
(set-buffer-multibyte nil) (insert-file-contents-literally filename nil 0 10)
(bindat-unpack emms-info-native--id3v2-header-bindat-spec (buffer-string)))
(and (buffer-name temp-buffer) (kill-buffer temp-buffer))))
(let ((temp-buffer (generate-new-buffer " *temp*" t))) (save-current-buffer
(set-buffer temp-buffer) (unwind-protect (progn (set-buffer-multibyte nil)
(insert-file-contents-literally filename nil 0 10) (bindat-unpack
emms-info-native--id3v2-header-bindat-spec (buffer-string))) (and (buffer-name
temp-buffer) (kill-buffer temp-buffer)))))
emms-info-native--decode-id3v2-header("/home/feng/音乐/未整理/Jambalaya (On The
Bayou).mp3")
(let* (emms-info-native--id3v2-version (header
(emms-info-native--decode-id3v2-header filename)) (tag-size (bindat-get-field
header 'size)) (unsync (memq 7 (bindat-get-field header 'flags))) (offset 10))
(if (memq 6 (bindat-get-field header 'flags)) (progn (setq offset (+ offset
(emms-info-native--decode-id3v2-ext-header-size filename)))))
(emms-info-native--decode-id3v2-frames filename offset (+ tag-size 10) unsync))
emms-info-native--decode-id3v2("/home/feng/音乐/未整理/Jambalaya (On The
Bayou).mp3")
(cond ((or (eq stream-type 'vorbis) (eq stream-type 'opus))
(emms-info-native--decode-ogg-comments filename stream-type)) ((eq stream-type
'flac) (emms-info-native--decode-flac-comments filename)) ((eq stream-type
'mp3) (emms-info-native--decode-id3v2 filename)) (t nil))
(let ((stream-type (emms-info-native--find-stream-type filename))) (cond ((or
(eq stream-type 'vorbis) (eq stream-type 'opus))
(emms-info-native--decode-ogg-comments filename stream-type)) ((eq stream-type
'flac) (emms-info-native--decode-flac-comments filename)) ((eq stream-type
'mp3) (emms-info-native--decode-id3v2 filename)) (t nil)))
emms-info-native--decode-info-fields("/home/feng/音乐/未整理/Jambalaya (On The
Bayou).mp3")
eval((emms-info-native--decode-info-fields "/home/feng/音乐/未整理/Jambalaya (On
The Bayou).mp3") nil)
elisp--eval-last-sexp(nil)
#f(compiled-function (eval-last-sexp-arg-internal) "Evaluate sexp before
point; print value in the echo area.\nInteractively, with a non `-' prefix
argument, print output into\ncurrent buffer.\n\nThis commands handles `defvar',
`defcustom' and `defface' the\nsame way that `eval-defun' does. See the doc
string of that\nfunction for details.\n\nNormally, this function truncates long
output according to the\nvalue of the variables `eval-expression-print-length'
and\n`eval-expression-print-level'. With a prefix argument of zero,\nhowever,
there is no such truncation.\nInteger values are printed in several formats
(decimal, octal,\nand hexadecimal). When the prefix argument is -1 or the
value\ndoesn't exceed `eval-expression-print-maximum-character', an\ninteger
value is also printed as a character of that codepoint.\n\nIf
`eval-expression-debug-on-error' is non-nil, which is the default,\nthis
command arranges for all errors to enter the debugger." (interactive "P")
#<bytecode 0x1d1337931c73bf61>)(nil)
apply(#f(compiled-function (eval-last-sexp-arg-internal) "Evaluate sexp
before point; print value in the echo area.\nInteractively, with a non `-'
prefix argument, print output into\ncurrent buffer.\n\nThis commands handles
`defvar', `defcustom' and `defface' the\nsame way that `eval-defun' does. See
the doc string of that\nfunction for details.\n\nNormally, this function
truncates long output according to the\nvalue of the variables
`eval-expression-print-length' and\n`eval-expression-print-level'. With a
prefix argument of zero,\nhowever, there is no such truncation.\nInteger values
are printed in several formats (decimal, octal,\nand hexadecimal). When the
prefix argument is -1 or the value\ndoesn't exceed
`eval-expression-print-maximum-character', an\ninteger value is also printed as
a character of that codepoint.\n\nIf `eval-expression-debug-on-error' is
non-nil, which is the default,\nthis command arranges for all errors to enter
the debugger." (interactive "P") #<bytecode 0x1d1337931c73bf61>) nil)
eval-last-sexp(nil)
funcall-interactively(eval-last-sexp nil)
command-execute(eval-last-sexp)
-----------------------------------------------------------
At 2021-02-18 05:16:06, "Fran Burstall (Gmail)" <fran.burstall@gmail.com> wrote:
Hi,
I did
(benchmark-run
(dolist (filename (map-keys emms-cache-db))
(condition-case nil
(emms-info-native--decode-info-fields filename)
(error (message "Error while processing %s" filename)))))
which read tags from 14051 files (mostly mp3 with some flac and ogg) in 710
seconds and only errored out on 75 files. Not too bad!
The errors were of the form
id3v2 tag or frame size 3832965 is invalid
Let me know what more data I can provide to help debug...
---Fran
On Wed, 17 Feb 2021 at 17:31, Petteri Hintsanen <petterih@iki.fi> wrote:
Yoni Rabkin <yoni@rabkins.net> writes:
> Can you please merge this so that people living with the main branch of
> the git repo can give it a go?
Merged and pushed.
Thanks,
Petteri
- Re: New emms-info-native, (continued)
- Re: New emms-info-native, Yoni Rabkin, 2021/02/21
- Re: New emms-info-native, Petteri Hintsanen, 2021/02/22
- Re: New emms-info-native, Petteri Hintsanen, 2021/02/19
- Re:Re: New emms-info-native, tumashu, 2021/02/18
- Re:Re:Re: New emms-info-native, tumashu, 2021/02/18
- Re: New emms-info-native, Yoni Rabkin, 2021/02/18
- Re:Re: New emms-info-native, tumashu, 2021/02/18
- Re: New emms-info-native, Petteri Hintsanen, 2021/02/19
- Re:Re: New emms-info-native,
tumashu <=
- Re: New emms-info-native, Yoni Rabkin, 2021/02/18
- Re:Re:Re: New emms-info-native, tumashu, 2021/02/18
- Re: New emms-info-native, Yoni Rabkin, 2021/02/18