TA的每日心情 | 开心 2019-9-4 10:12 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
本帖最后由 jiaqiangmit2 于 2019-8-2 21:30 编辑 " _" J/ t( d' m+ }3 s
5 R2 H2 U B: }; e+ N各位大神: w$ L4 [! {% |5 N2 Z* z
我在anki里已经实现提取LDOCE6真人朗读例句的制卡。现在希望能将音频文件单独放手机,睡觉和开车等时间听。问题来了:anki对媒体文件的命名是以类似于HAsh方式“乱码”命名的,从媒体文件夹里复制出来,所有的例句和单词的朗读时打乱的。能否实现:单词以其拼写命名(example.mp3),对应的几个例句音频以单词拼写加后缀的方式命名,这样,放在手机里,单词和对应例句就可以一起读了。7 {& ]. h) T6 ] k h) N( y- K
! V! G9 R1 M0 G& H# f# f$ ^3 e
, ?9 p( ^ } _3 l* q如图,文件名是“l乱码”的
; F3 j. A2 Z" Y+ {9 I7 i6 |+ R无法上任附件,名字是这样的:4 D, L \. o+ h4 R U4 l( m! |1 J
[sound:-ldoce6-b0ab2fba-11b6ffb4-d84db123-b00153f3-9971952a.mp3]4 |8 C5 N. q- }0 q
( ]- w; q2 D4 U+ c7 G" o对应 脚本 / {1 W% l" C, t# a" p. R O
6 ~7 V1 a3 L, {* i" y" B------------------------------
3 ^8 _' b+ R5 y. p. z. f- O; x/ [3 e) p& G4 u; T
% h7 ~2 T" P; K! m$ Z
#-*- coding:utf-8 -*-
) c' r9 c/ t, t8 S. D* z5 Z$ {& Aimport os
) E. e: ^* F. v( [7 O2 Oimport re
; u8 X0 {8 ^ Y. D3 J3 u7 qimport random
& ]2 k9 t1 L7 G: U# b& I( Gfrom ..base import *
5 T5 f& K$ d- z2 P. P Q8 q; J; F
# s* E: Z0 z8 y7 k% K2 S
VOICE_PATTERN = r'<a href="sound://([\w/]+\w*\.mp3)"><img src="img/spkr_%s.png"></a>'
Z ?, _6 w9 ]( L# `5 e+ bVOICE_PATTERN_WQ = r'<span class="%s"><a href="sound://([\w/]+\w*\.mp3)">(.*?)</span %s>'8 v ~ r3 V3 O6 U$ u
MAPPINGS = [ i5 g T" J( t: l- }
['br', [re.compile(VOICE_PATTERN % r'r'), re.compile(VOICE_PATTERN_WQ % (r'brevoice', r'brevoice'))]],4 r$ d7 {' B* i" X3 l& u$ v% R. l
['us', [re.compile(VOICE_PATTERN % r'b'), re.compile(VOICE_PATTERN_WQ % (r'amevoice', r'amevoice'))]]" O, @8 Y* z3 r& [
]
! l& v% B4 j# l4 y3 FLANG_TO_REGEXPS = {lang: regexps for lang, regexps in MAPPINGS}) v8 n& K! G- H6 J. M, r+ p
DICT_PATH =u'E:\Anki\Dick\L6mp3.mdx'
. T2 z2 O: x* K3 I1 Q
) V8 \. |3 p: B
6 T% B* y- v) F( _ {@register([u'本地词典-LDOCE6', u'MDX-LDOCE6'])6 t f U1 T1 I& P( s
class Ldoce6(MdxService):# @8 }0 @ F+ a& X9 V( [- G! I
+ M- W8 z- l9 n5 d; f+ F def __init__(self):
- r7 D& b2 c* b R dict_path = DICT_PATH- S# ?" d- Z! ~
# if DICT_PATH is a path, stop auto detect6 C4 y: O# \7 U$ i# R" f- M! k ]
if not dict_path:, B2 V6 a# F& A. D
from ...service import service_manager, service_pool, f; d& \! B. u( K7 t+ l, y+ Z$ H" q* F
for clazz in service_manager.mdx_services:
6 K$ U6 J. c2 R+ \) H6 z service = service_pool.get(clazz.__unique__)
) d: H+ w( D5 N4 u- N title = service.builder._title if service and service.support else u''
; r* T& B) n2 x& y4 w C service_pool.put(service)
( j: W x! I+ \! O4 h- U+ V if title.startswith(u'LDOCE6'):
/ m# l1 _2 w* k: D dict_path = service.dict_path
! c# Z0 ~; Z6 y4 w9 n W break
$ A9 H4 r: Z* a4 G( V: e3 A, \ super(Ldoce6, self).__init__(dict_path)) G2 k5 D" E/ a" ]. I' e0 a
4 s: A$ _. @& T
@property
/ A1 T2 B% ~6 {; \+ D def title(self):& _- J4 }/ J5 V& i3 J
return getattr(self, '__register_label__', self.unique)
% f. l; m* |' b. A
8 J! g7 B' g- K @export('PHON')+ |! T+ _/ Y! l1 w# Q
def fld_phonetic(self):
7 e( N$ `4 w2 J; a) M8 D html = self.get_html()
* k8 n- U: Z8 `8 E" \7 v" A( D m = re.search(r'<span class="pron">(.*?)</span>', html)
2 ?! n& D3 a& d4 |) m+ N d if m:
5 X; }# K# A6 D9 K0 c W" O return m.groups()[0]
! C) G% N# I& J: z return ''
0 q/ Y) B5 r' i8 d" Z9 d: [4 m- \3 R5 Z& \7 E! D- n, T
def _fld_voice(self, html, voice):3 V3 y3 P( R F8 J8 o* T" p
"""获取发音字段"""/ J1 O9 M; D8 y/ c: I3 ]
for regexp in LANG_TO_REGEXPS[voice]:- W( ]0 {& M- L1 n4 j4 E6 X/ l
match = regexp.search(html)8 d0 T, u/ _3 O: q7 D9 f0 Q0 `& B6 A
if match:7 T- }7 l/ Q% ^, M! @' i
val = '/' + match.group(1), [: w& e+ ~: h. e( b6 x9 H
name = get_hex_name('mdx-'+self.unique.lower(), val, 'mp3')
7 @' @# _! B5 h: E! a' W name = self.save_file(val, name)& u% i3 W0 \# W* u9 D1 l
if name:0 Y8 t2 ]* o. a& A% }
return self.get_anki_label(name, 'audio')
1 w0 p- x3 i7 B% a return ''
. G9 A5 B% i( g4 U( y- r8 ^4 O# B
" p$ Y- \" S+ n8 n @export('BRE_PRON')+ ?6 x+ q' J+ u
def fld_voicebre(self):* {6 { Q; X' |+ x$ B5 j! P7 C& w
return self._fld_voice(self.get_html(), 'br')9 F9 m8 l$ @" K' j: z8 @5 ~
2 u) I. [+ ~ T' r. i
@export('AME_PRON')
4 f! X$ ~3 v0 ^0 z8 g6 K" V A! m4 B3 u def fld_voiceame(self):
R( _" |, v) w, K; V) D# ~- _ return self._fld_voice(self.get_html(), 'us')
' L& ^6 G3 @: T8 S$ V" G+ a
# B( C2 S6 K" x* Z/ z# U% u0 k def _fld_image(self, img):# s$ b7 X6 U: B& M& d
val = '/' + img: h5 A8 m2 g8 B* M5 w* I" c
# file extension isn't always jpg
& M) `' T/ a# X$ I file_extension = os.path.splitext(img)[1][1:].strip().lower()# J1 t( ?" u% J" D
name = get_hex_name('mdx-'+self.unique.lower(), val, file_extension)8 {' _9 O- b0 ^
name = self.save_file(val, name)
& S% ?, T, g# a1 ?: u& B if name:
! J* r3 K6 s# S$ P9 {2 z: C6 B return self.get_anki_label(name, 'img')7 h! e9 d; j( B- B ]% M. k
return ''
' q3 g- X% m6 E% q& x6 e" k; I6 O! N2 O+ u
@export('IMAGE')" `( ` Y7 {9 G
def fld_image(self):6 j% c; ]0 E+ i& X
html = self.get_html()
* C2 E) Q) N" V m = re.search(r'<span class="imgholder"><img src="(.*?)".*?></span>', html)- @, g% J v: |$ u5 m$ C) l: d- a
if m:* y+ A% S) U; e8 K
return self._fld_image(m.groups()[0])
% w0 v( J, H# l3 `& A8 ^% n6 I return ''- m" c0 L: J( l% H: h+ e$ ~
* ^( Y( x# {$ h
@export('EXAMPLE')- d: c0 e% I- n* k8 v0 N) {: G0 J: F
def fld_sentence(self):
6 X- t( |6 w% G+ H9 s return self._range_sentence([i for i in range(0, 100)])
6 t2 d( G# |' m; g! E
9 Z5 u$ q( K/ K7 _7 m8 r def _fld_audio(self, audio):) h8 s7 H* `: E. G$ y
name = get_hex_name('mdx-'+self.unique.lower(), audio, 'mp3')8 b8 g# E) G0 ]- x* Q* o- O
name = self.save_file(audio, name)" M4 X- H. `, i; [% {) p* a
if name:
' w4 Y$ P+ n- d6 y Y return self.get_anki_label(name, 'audio'); l3 h! [$ x0 @* {7 S! k
return ''1 w- d+ u$ R1 P$ p8 N
9 s3 P/ n0 L- U! q# C) d @export([u'例句加音频', u'Examples with audios'])
9 H2 C1 T4 d$ F9 j% \1 k; [ def fld_sentence_audio(self):
: x8 r" _/ j1 `$ G return self._range_sentence_audio([i for i in range(0, 100)])
* O. W3 b+ l, t) ~, C$ E' o Q+ k8 R- ]: X' Z- d
@export('DEF')0 S& H9 r2 t( A/ X, s& X6 h
def fld_definate(self):
( f7 f1 J# [2 Z, L! `) s m = m = re.findall(r'<span class="def"\s*.*>\s*.*<\/span>', self.get_html())
* v4 p7 F7 R" m7 L# d3 Z if m:
; q9 ^+ h3 V& V8 k! H3 C& x soup = parse_html(m[0]). ?9 j. ]/ o3 v1 }3 e0 g5 B
el_list = soup.findAll('span', {'class':'def'})
$ D. T/ b# X2 W0 }; S if el_list:6 j; d; @, g+ E5 S1 T$ }
maps = [u''.join(str(content) for content in element.contents) ! j! U! ~, U* X4 a8 N! c! W) k
for element in el_list]
* f2 d5 O0 Y1 d( a+ b1 w2 Q. U my_str = '') o# z* \% O8 N! [ f( a/ U$ m. t
for i_str in maps:
& k0 |/ z" E% g' ~ my_str = my_str + '<li>' + i_str + '</li>'
3 I5 e" l: M3 v/ U0 c return self._css(my_str)
8 Y. d( f% H3 r) ^8 K4 d return ''' ^( q1 J8 S, S! H- N& A
- R( ]9 b$ D* R8 K" R @export([u'随机例句', u'Random example'])0 X9 U4 C1 F* y/ a
def fld_random_sentence(self):
# K. v- z8 s" T: E% _- T0 V* c return self._range_sentence()2 a4 Y3 E- C4 t" x/ W
" U+ y- G! a" l @export([u'首2个例句', u'First 2 examples'])+ w9 U1 H& Q7 ]% n- H* a6 j
def fld_first2_sentence(self):
" A7 N$ I2 ?5 J" c, G" z& D return self._range_sentence([0, 1])
4 J- Z! ?: s* @( k3 c% X 2 b/ [, U; f. N
@export([u'随机例句加音频', u'Random example with audio'])
4 }- W4 E% ?* v: E def fld_random_sentence_audio(self):
; k& K; c2 X0 z& [) g; ] return self._range_sentence_audio() J+ n' r6 ~' `7 S8 ~3 s: E, K" N
' W; G" Q; {7 v8 }$ T+ I; v+ n( W
@export([u'首2个例句加音频', u'First 2 examples with audios'])- C0 a- I8 r9 ^ [% j8 X
def fld_first2_sentence_audio(self):( J: e; H! h3 Y( @* w( c
return self._range_sentence_audio([0, 1])6 l4 X* \+ z, O/ D w0 |. N$ o9 X
V t# Q% ~0 x7 Z: r def _range_sentence(self, range_arr=None):
$ Q6 A6 S' O0 E h5 u7 E5 |" `1 }/ S' o m = re.findall(r'<span class="example"\s*.*>\s*.*<\/span>', self.get_html())) G$ T, d' k; L
if m:
" X7 W4 D0 P9 Q" y3 f; v7 s& ?; ? soup = parse_html(m[0])! q/ h$ x2 K. N* @4 x* j
el_list = soup.findAll('span', {'class':'example'})
9 h% ^( V( X- z! A- G8 Y if el_list:
0 p, N0 c a5 m0 x5 o0 } maps = [u''.join(str(content) for content in element.contents)
j+ r f9 ^, F* @) C for element in el_list]
5 [0 w+ j, `+ [$ T6 D2 g( {" R8 w my_str = ''$ A2 q: z5 J' Q7 a. T8 T6 @
range_arr = range_arr if range_arr else [random.randrange(0, len(maps) - 1, 1)]- h8 s! q0 \9 E- r0 p3 [& k7 N1 d" S! Q
for i, i_str in enumerate(maps):( n" a' ?& X$ A( o* z: X& S
if i in range_arr:7 Q+ w0 p( \* [) Y% |- J# R) }" F
i_str = re.sub(r'<a[^>]+?href=\"sound\:.*\.mp3\".*</a>', '', i_str).strip()
# w" M' o' ]2 P, T) |$ n9 {8 X my_str = my_str + '<li>' + i_str + '</li>'- a1 j+ k0 q6 x, l
return self._css(my_str)7 T) T. f, }7 v* e& k$ V
return ''
8 k6 H7 b% W# h2 W: `+ Q% J" w, l! q" z9 {
def _range_sentence_audio(self, range_arr=None):
! A X9 n# ~3 o9 \2 w& e/ E" j m = re.findall(r'<span class="example"\s*.*>\s*.*<\/span>', self.get_html())7 z& w" ^+ I3 d. F! b" ~4 l
if m:
2 L8 X, i' @3 T/ D6 u soup = parse_html(m[0])$ b% h) d; e) i* R( N
el_list = soup.findAll('span', {'class':'example'})
0 i8 D) t% M5 t# C3 \" { if el_list:
# c4 B- J8 h: n maps = []
( v& Y. D6 ]# [6 I1 ]9 Z* ? for element in el_list:
2 t6 j! K2 H9 p& e$ D# Z i_str = ''
) U4 w: A7 Z7 J) I, C for content in element.contents:
- Q6 {; F4 ]& z) j" ^& W i_str = i_str + str(content)$ m) R6 N9 s; O2 ~& G4 s" J
sound = re.search(r'<a[^>]+?href=\"sound\:\/(.*?\.mp3)\".*</a>', i_str)2 c( c# g8 Z. y+ t/ C
if sound:7 ^/ n8 ]% }' Z! s) Y
maps.append([sound, i_str])2 F/ K: k& m5 H& v. I2 V9 s
my_str = ''
+ j( C+ `. j2 M8 J! x; D range_arr = range_arr if range_arr else [random.randrange(0, len(maps) - 1, 1)]
9 o4 ^5 N `( y# y) x* o! N. ` for i, e in enumerate(maps):6 j0 _" Q$ M! F# \6 {4 M* f) t
if i in range_arr:+ {( T( }; o! {: d0 P; h
i_str = e[1]
' [1 c& f2 Q7 o! E$ ` sound = e[0]- |! G3 y9 k: }* ^* g# ?3 A7 s4 Q
mp3 = self._fld_audio(sound.groups()[0])& t: _- O* e1 P. G' V9 q
i_str = re.sub(r'<a[^>]+?href=\"sound\:.*\.mp3\".*</a>', '', i_str).strip()
6 _& u" n- M1 ]4 R& d) W$ P my_str = my_str + '<li>' + i_str + ' ' + mp3 + '</li>'
M; j) F5 E1 t J, s; K- Y return self._css(my_str)
2 l7 u/ m- Q0 K return ''& y' D3 l- k# x- U. N4 q* H3 w/ t
) J; M$ m, A; c- q/ w+ j2 ~6 \
@export([u'额外例句', u'Extra Examples'])
' D8 j9 ]7 j! ^4 V. P def fld_extra_examples(self):
7 \; k X% T e5 W( R lst = re.findall(r'href="/(@examples_.*?)\">.*?<', self.get_html())
3 x0 k! j; o! k! t if lst: r) B* L9 v+ R1 o5 q
str_content = u''; n3 J1 U/ M9 T e& B3 S
for m in lst:0 D8 X( ~7 c4 W2 p/ l
content = self.builder.mdx_lookup(m)
2 D* k: f0 U- N; L if len(content) > 0:
: v; C4 v! H3 e& S; Q; V$ [+ Y3 i for c in content:1 s' E% p: x/ T# c& l
str_content += c.replace("\r\n","").replace("entry:/","")$ c4 P! H; `, U( Q
return self._css(str_content)) A7 V$ _( V& U
return '' ( M5 o8 D8 T) m$ M
9 @" R+ {* ]6 @9 V% p" a7 o @with_styles(cssfile='_ldoce6.css')
0 S" S! f- P# ?! ]( |% h' ^5 _ def _css(self, val):
3 y0 Y* ]1 C( d& T3 b return val, |, Y* j1 S2 [( x: [ I/ D6 D
---------------------
) w2 f9 K5 ~+ ~: R; C6 c. Y3 J: D& K' z1 N( H/ Y3 y7 H. i
谢谢各位0 y" A. I) l6 q: p; V- f
3 [# j9 {' n) u' g0 M' |. W4 _0 F& S% z0 {4 `5 @, E9 j
|
|