/usr/lib/python3/dist-packages/audiotools/toc/tokrules.py is in audiotools 3.1.1-1+b1.
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 | # Audio Tools, a module and set of tools for manipulating audio data
# Copyright (C) 2007-2015 Brian Langenberger
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
RESERVED = {"CATALOG": "CATALOG",
"CD_DA": "CD_DA",
"CD_ROM": "CD_ROM",
"CD_ROM_XA": "CD_ROM_XA",
"CD_TEXT": "CD_TEXT",
"TRACK": "TRACK",
"AUDIO": "AUDIO",
"MODE1": "MODE1",
"MODE1_RAW": "MODE1_RAW",
"MODE2": "MODE2",
"MODE2_FORM1": "MODE2_FORM1",
"MODE2_FORM2": "MODE2_FORM2",
"MODE2_FORM_MIX": "MODE2_FORM_MIX",
"MODE2_RAW": "MODE2_RAW",
"RW": "RW",
"RW_RAW": "RW_RAW",
"NO": "NO",
"COPY": "COPY",
"PRE_EMPHASIS": "PRE_EMPHASIS",
"TWO_CHANNEL_AUDIO": "TWO_CHANNEL_AUDIO",
"FOUR_CHANNEL_AUDIO": "FOUR_CHANNEL_AUDIO",
"ISRC": "ISRC",
"SILENCE": "SILENCE",
"ZERO": "ZERO",
"FILE": "FILE",
"AUDIOFILE": "AUDIOFILE",
"DATAFILE": "DATAFILE",
"FIFO": "FIFO",
"START": "START",
"PREGAP": "PREGAP",
"INDEX": "INDEX",
"LANGUAGE_MAP": "LANGUAGE_MAP",
"LANGUAGE": "LANGUAGE",
"TITLE": "TITLE",
"PERFORMER": "PERFORMER",
"SONGWRITER": "SONGWRITER",
"COMPOSER": "COMPOSER",
"ARRANGER": "ARRANGER",
"MESSAGE": "MESSAGE",
"DISC_ID": "DISC_ID",
"GENRE": "GENRE",
"TOC_INFO1": "TOC_INFO1",
"TOC_INFO2": "TOC_INFO2",
"UPC_EAN": "UPC_EAN",
"SIZE_INFO": "SIZE_INFO",
"EN": "EN"}
tokens = ["COMMENT",
"START_BLOCK",
"END_BLOCK",
"COLON",
"COMMA",
"TIMESTAMP",
"NUMBER",
"ID",
"STRING"] + list(RESERVED.values())
def t_COMMENT(t):
r'//.*'
pass
t_START_BLOCK = r'{'
t_END_BLOCK = r'}'
t_COLON = r':'
t_COMMA = r','
def t_ID(t):
r'[A-Z][A-Z0-9_]*'
if t.value in RESERVED.keys():
t.type = RESERVED[t.value]
return t
def t_STRING(t):
r'\"(\\.|[^"])*\"'
from re import sub
t.value = sub(r'\\.', lambda s: s.group(0)[1:], t.value[1:-1])
return t
def t_TIMESTAMP(t):
r'[0-9]{1,3}:[0-9]{1,2}:[0-9]{1,2}'
(m, s, f) = t.value.split(":")
t.value = ((int(m) * 75 * 60) + (int(s) * 75) + (int(f)))
return t
def t_NUMBER(t):
r'[0-9]+'
t.value = int(t.value)
return t
t_ignore = " \r\t"
def t_newline(t):
r'\n+'
t.lexer.lineno += t.value.count("\n")
def t_error(t):
raise ValueError("illegal character %s" % (repr(t.value[0])))
|