/usr/lib/pypy/dist-packages/mutagen/_tools/mid3cp.py is in pypy-mutagen 1.36-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | # -*- coding: utf-8 -*-
# Copyright 2014 Marcus Sundman
# This program is free software; you can redistribute it and/or modify
# it under the terms of version 2 of the GNU General Public License as
# published by the Free Software Foundation.
"""A program replicating the functionality of id3lib's id3cp, using mutagen for
tag loading and saving.
"""
import sys
import os.path
import mutagen
import mutagen.id3
from mutagen._senf import print_, argv
from mutagen._compat import text_type
from ._util import SignalHandler, OptionParser
VERSION = (0, 1)
_sig = SignalHandler()
def printerr(*args, **kwargs):
kwargs.setdefault("file", sys.stderr)
print_(*args, **kwargs)
class ID3OptionParser(OptionParser):
def __init__(self):
mutagen_version = mutagen.version_string
my_version = ".".join(map(str, VERSION))
version = "mid3cp %s\nUses Mutagen %s" % (my_version, mutagen_version)
self.disable_interspersed_args()
OptionParser.__init__(
self, version=version,
usage="%prog [option(s)] <src> <dst>",
description=("Copies ID3 tags from <src> to <dst>. Mutagen-based "
"replacement for id3lib's id3cp."))
def copy(src, dst, merge, write_v1=True, excluded_tags=None, verbose=False):
"""Returns 0 on success"""
if excluded_tags is None:
excluded_tags = []
try:
id3 = mutagen.id3.ID3(src, translate=False)
except mutagen.id3.ID3NoHeaderError:
print_(u"No ID3 header found in ", src, file=sys.stderr)
return 1
except Exception as err:
print_(str(err), file=sys.stderr)
return 1
if verbose:
print_(u"File", src, u"contains:", file=sys.stderr)
print_(id3.pprint(), file=sys.stderr)
for tag in excluded_tags:
id3.delall(tag)
if merge:
try:
target = mutagen.id3.ID3(dst, translate=False)
except mutagen.id3.ID3NoHeaderError:
# no need to merge
pass
except Exception as err:
print_(str(err), file=sys.stderr)
return 1
else:
for frame in id3.values():
target.add(frame)
id3 = target
# if the source is 2.3 save it as 2.3
if id3.version < (2, 4, 0):
id3.update_to_v23()
v2_version = 3
else:
id3.update_to_v24()
v2_version = 4
try:
id3.save(dst, v1=(2 if write_v1 else 0), v2_version=v2_version)
except Exception as err:
print_(u"Error saving", dst, u":\n%s" % text_type(err),
file=sys.stderr)
return 1
else:
if verbose:
print_(u"Successfully saved", dst, file=sys.stderr)
return 0
def main(argv):
parser = ID3OptionParser()
parser.add_option("-v", "--verbose", action="store_true", dest="verbose",
help="print out saved tags", default=False)
parser.add_option("--write-v1", action="store_true", dest="write_v1",
default=False, help="write id3v1 tags")
parser.add_option("-x", "--exclude-tag", metavar="TAG", action="append",
dest="x", help="exclude the specified tag", default=[])
parser.add_option("--merge", action="store_true",
help="Copy over frames instead of the whole ID3 tag",
default=False)
(options, args) = parser.parse_args(argv[1:])
if len(args) != 2:
parser.print_help(file=sys.stderr)
return 1
(src, dst) = args
if not os.path.isfile(src):
print_(u"File not found:", src, file=sys.stderr)
parser.print_help(file=sys.stderr)
return 1
if not os.path.isfile(dst):
printerr(u"File not found:", dst, file=sys.stderr)
parser.print_help(file=sys.stderr)
return 1
# Strip tags - "-x FOO" adds whitespace at the beginning of the tag name
excluded_tags = [x.strip() for x in options.x]
with _sig.block():
return copy(src, dst, options.merge, options.write_v1, excluded_tags,
options.verbose)
def entry_point():
_sig.init()
return main(argv)
|