TA的每日心情 | 开心 2019-9-4 10:12 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
本帖最后由 jiaqiangmit2 于 2019-8-2 21:30 编辑 1 `! P8 V/ k5 X2 `: d! ?! _
) l, R r. a* Z1 |各位大神; N% F) [/ {4 M3 v( B
我在anki里已经实现提取LDOCE6真人朗读例句的制卡。现在希望能将音频文件单独放手机,睡觉和开车等时间听。问题来了:anki对媒体文件的命名是以类似于HAsh方式“乱码”命名的,从媒体文件夹里复制出来,所有的例句和单词的朗读时打乱的。能否实现:单词以其拼写命名(example.mp3),对应的几个例句音频以单词拼写加后缀的方式命名,这样,放在手机里,单词和对应例句就可以一起读了。
& F( l# N! Q8 h# l" @
# i1 E, w2 Y- x; h) @
" j' X5 q' o/ w$ f( b& H# a1 Q: l如图,文件名是“l乱码”的
; U& F5 a3 Q; r. @( Q# X; ^ C( B无法上任附件,名字是这样的:
: q' A( l& f8 f( o+ A7 |% ~ [sound:-ldoce6-b0ab2fba-11b6ffb4-d84db123-b00153f3-9971952a.mp3]7 a& ~9 N/ t- }0 Z5 b
/ ]% d! R0 X; H; U2 ~$ k0 R/ l f5 y对应 脚本
1 ?6 b5 I/ r8 Q3 Y+ F" N3 @5 @3 ^% f* g) E% ]8 B( ?; F
------------------------------5 {; S. D* N0 W' V
9 `3 K5 |' j' _! l- E9 d
9 m9 N, O7 c7 H, _7 s) p#-*- coding:utf-8 -*-
4 { W9 N1 {% M9 G7 ]' u* qimport os
7 e! I: n+ C0 j7 ~import re# c: K* V7 T/ ]7 [7 ?
import random! ], _6 L/ r1 a+ K
from ..base import *
8 s. h" w, U1 R/ W! a. Y" `: r- u$ a4 r
/ `9 A- t/ F) W& x9 F1 \1 M' P9 @VOICE_PATTERN = r'<a href="sound://([\w/]+\w*\.mp3)"><img src="img/spkr_%s.png"></a>'
( a( P5 W& i( N! ?. G1 }VOICE_PATTERN_WQ = r'<span class="%s"><a href="sound://([\w/]+\w*\.mp3)">(.*?)</span %s>'
2 m" b0 s \0 JMAPPINGS = [5 j+ j1 z t+ P6 c- s% ]6 K
['br', [re.compile(VOICE_PATTERN % r'r'), re.compile(VOICE_PATTERN_WQ % (r'brevoice', r'brevoice'))]],8 I7 h4 y% I+ G! L8 c& f
['us', [re.compile(VOICE_PATTERN % r'b'), re.compile(VOICE_PATTERN_WQ % (r'amevoice', r'amevoice'))]]2 `3 }+ @0 x1 P7 @3 |, @3 }& Z
]0 _; L! e, r% I1 u( Y
LANG_TO_REGEXPS = {lang: regexps for lang, regexps in MAPPINGS}& x& p7 A/ S/ `3 Y* y. I
DICT_PATH =u'E:\Anki\Dick\L6mp3.mdx'
% `0 m! Q, T' _3 [1 G8 H5 X. v4 P4 t1 n0 t5 m, o
+ y N+ N2 `. k& j& C
@register([u'本地词典-LDOCE6', u'MDX-LDOCE6'])0 p% `5 I3 R9 ?; P4 x
class Ldoce6(MdxService):
0 D' l0 ^* e% O" U2 o7 q
9 c/ q3 H5 T# f3 o t def __init__(self):) ?7 V) m: F) }
dict_path = DICT_PATH
( S2 z0 }, v: P u1 b6 @% v& u5 z # if DICT_PATH is a path, stop auto detect
2 g& H E# \: ]' E if not dict_path: }' ?( ]( \8 x$ @- ~" }1 i
from ...service import service_manager, service_pool
& F% H; Z$ W4 ^* ^ for clazz in service_manager.mdx_services:, r% C2 H2 P/ X
service = service_pool.get(clazz.__unique__)
Y# ~( M6 u) O" n1 b title = service.builder._title if service and service.support else u''/ f5 z1 |) x2 d1 o v" O
service_pool.put(service)
7 f4 y9 l% `8 p/ \0 Q+ z. A if title.startswith(u'LDOCE6'):6 Q. Y/ U% W8 |0 ^- i' k
dict_path = service.dict_path; ^% e6 I6 h# P" r
break' b& \! W. M/ h/ l/ w
super(Ldoce6, self).__init__(dict_path)( D+ K, o9 ]; `( v: T/ X
% p# C4 i1 @9 d8 T$ w$ y* Z. e) _
@property1 m5 E# S& ]0 x2 v- }
def title(self):
( q: o6 f: f3 Y$ } o8 h8 x- P return getattr(self, '__register_label__', self.unique)
9 o8 o7 W) \$ p7 L4 m9 Q0 l6 o& U) i- X( r% ^2 \
@export('PHON')' E$ e7 Q! D( E4 C0 J
def fld_phonetic(self):, f7 j! H1 V3 d' X
html = self.get_html()
5 d6 _- D$ c5 e2 B$ z m = re.search(r'<span class="pron">(.*?)</span>', html)$ u' R! S+ h) v& G N, ?
if m:
- c$ D, g0 s3 l3 p2 Q return m.groups()[0]- E/ B5 M6 y5 g* x0 [0 l! ~3 N
return ''! `* \+ y$ L9 K5 r f' t n
) g! |, U6 w" _7 v def _fld_voice(self, html, voice):
/ _) X6 \! Z+ s2 e t" c """获取发音字段"""
: N& L* @. e' o for regexp in LANG_TO_REGEXPS[voice]:( _8 }4 C+ Y5 ^& \/ B! G2 G7 ~+ f
match = regexp.search(html)
* [0 \, ^* I1 Y7 l if match:3 n$ R- ~% s. j
val = '/' + match.group(1)) }! J. d G! U9 ~
name = get_hex_name('mdx-'+self.unique.lower(), val, 'mp3')
1 y( U! u1 g" J; c' Z0 }& A name = self.save_file(val, name)
5 d1 @9 b: K; l if name:
7 k! v5 s' @# a0 T0 ^ return self.get_anki_label(name, 'audio')
: y8 g# G# r4 {7 o$ r% _7 d return ''
2 e0 Y( D9 y! A
0 ]! K/ [$ x9 U" | @export('BRE_PRON')# v! [' P! X- m1 F
def fld_voicebre(self):+ s/ a! f' M5 s+ _0 h! L! W
return self._fld_voice(self.get_html(), 'br')
1 }6 C1 a& X2 C- B: ?2 M' }0 t% x
@export('AME_PRON')
+ D* s2 I) _/ }) T' O8 W1 D def fld_voiceame(self):" E$ x( a! ]7 g4 w- Y
return self._fld_voice(self.get_html(), 'us')
% c# H/ ^+ N1 n- K) W) r, Y! x! R% s6 K( w- H
def _fld_image(self, img):# K8 u: i5 h7 D- t4 \/ v; ]0 q3 w
val = '/' + img
* q( t7 A0 [4 m9 {# \: F # file extension isn't always jpg' R% o/ {' e1 y" @9 g3 D
file_extension = os.path.splitext(img)[1][1:].strip().lower()
0 r( Z; E o. f2 j) H name = get_hex_name('mdx-'+self.unique.lower(), val, file_extension)9 b# n, o5 T W. k: K
name = self.save_file(val, name)
" l8 Z" E) m: {( i if name:; U1 u7 o4 o" ]* o8 } w1 R
return self.get_anki_label(name, 'img')) f$ M, M- L# Y/ B) t6 R% h
return ''0 a7 Q; ?6 O, O" Q; W3 P
b0 P5 c) N1 z2 i5 h+ x9 G3 U @export('IMAGE')& v) R. ?9 A; X! u/ {0 h* V
def fld_image(self):- }. J& T( Q, f# p7 t
html = self.get_html()
' h5 ^, h" |- _& E" d4 V- A" a m = re.search(r'<span class="imgholder"><img src="(.*?)".*?></span>', html) N2 U3 b- [5 i; @: Y0 C4 N3 ]
if m:
F& I! t; K2 `4 i/ d& X return self._fld_image(m.groups()[0])
8 v; {- l7 B2 S, e6 N' R return ''
# ]9 ]% D$ X8 ?1 p
% V& |* T3 d/ m- n' q" A @export('EXAMPLE')
/ u1 e7 @3 }# { def fld_sentence(self):
i5 u6 ~* j) [4 s% Y, y. Q return self._range_sentence([i for i in range(0, 100)])- L. H1 I' I9 F2 b" j
7 K7 |6 y& r7 N4 H. W' t% K def _fld_audio(self, audio):
+ |/ w6 S1 T/ ~* L name = get_hex_name('mdx-'+self.unique.lower(), audio, 'mp3')
. D. n- H! \' w' H& ? name = self.save_file(audio, name)% U' g0 s" _1 B6 w. Q
if name:
/ `( P. u4 `: H: }+ A$ { return self.get_anki_label(name, 'audio')! o3 Z1 B% S( e( o+ f; X; L
return ''
% A5 c9 O9 @* w; r4 M8 ?, ]
. ]8 F% ~5 x" s# C4 T$ B @export([u'例句加音频', u'Examples with audios'])
- z E2 b; C. R9 E, c/ \ def fld_sentence_audio(self):
2 x8 o+ W2 J* L9 ~# t& w w d return self._range_sentence_audio([i for i in range(0, 100)])# h$ Z( m$ ?$ S d( w) q3 u
+ M- k3 |/ c) z
@export('DEF')
H- w/ e# o& ^7 ]8 a def fld_definate(self):
2 f0 H& c. I3 ~5 m: n- x m = m = re.findall(r'<span class="def"\s*.*>\s*.*<\/span>', self.get_html())1 l& e* G1 w3 h: {" X5 ^# Y$ Y
if m:
. w5 k" _1 z V soup = parse_html(m[0])$ ~, o, u; W) ]" `+ w7 e& M/ w7 @
el_list = soup.findAll('span', {'class':'def'})
- [7 h9 X1 ~9 y: F D% J$ K2 w if el_list:
* i" b7 I* u5 [! q: M- `& @ maps = [u''.join(str(content) for content in element.contents)
, u3 V% V- Q* D' {5 \, o for element in el_list]
2 M4 ^+ y7 R" A% p0 t. w my_str = ''8 }" ~" ~4 Z. M$ `9 Y( o4 t: `& x$ p
for i_str in maps:1 o$ F; |7 _( t( x* Z
my_str = my_str + '<li>' + i_str + '</li>'1 d8 O4 T9 K, }0 m
return self._css(my_str)
# h5 Q. `5 }0 s return '': L# a' u4 w; F- j5 B$ B" d6 I3 P
% n& V; Y6 W& v' @' a+ e$ `
@export([u'随机例句', u'Random example'])
$ u5 l4 B" i$ _+ c+ c0 ^1 m) D def fld_random_sentence(self):( x* H" {1 Z! ?9 B t/ S
return self._range_sentence()+ \4 q" S" ]$ K3 D8 D, J
8 b8 Y2 ^ h; Y8 V' f) M+ z T* C, a
@export([u'首2个例句', u'First 2 examples'])# V( u. K: g+ ?) d9 G( I3 N( Q
def fld_first2_sentence(self):
1 c0 J4 w, Y. a) I( ^- S9 u! G: A4 X return self._range_sentence([0, 1])4 O' Z5 y. S# z
; G: \0 O& n0 ` I" |8 s @export([u'随机例句加音频', u'Random example with audio'])
4 j/ H, s* \! v+ k4 C0 I def fld_random_sentence_audio(self):- Z+ _4 G0 U4 o: h2 a
return self._range_sentence_audio()
1 U& n' x- K" r# Z+ k+ F6 N) p) K0 R0 N% y- d1 A' _; \4 h& U6 |
@export([u'首2个例句加音频', u'First 2 examples with audios'])+ c; s! D5 `& ?0 [5 w" I2 N
def fld_first2_sentence_audio(self):2 m, ] H" D$ g+ [8 U
return self._range_sentence_audio([0, 1])6 p, E. H, p5 V7 y
" o' E1 g$ U o, X3 Y
def _range_sentence(self, range_arr=None):
& V+ v5 y( V- W( I: m" I& g m = re.findall(r'<span class="example"\s*.*>\s*.*<\/span>', self.get_html())
0 J, ^4 P- D0 P0 z7 a6 N2 H$ Q if m:; {1 w! N* [. @
soup = parse_html(m[0])' t8 D( S0 U1 u b4 @" w2 C
el_list = soup.findAll('span', {'class':'example'})& N/ G9 K- ^. W' W. u. U
if el_list:
3 F [( I0 J" c% X* r0 D+ m s! t maps = [u''.join(str(content) for content in element.contents)
0 K+ C; j, V! B for element in el_list]2 U. B. h) {# |+ h2 L
my_str = ''
9 E( j# S* p. v X: P4 G2 O range_arr = range_arr if range_arr else [random.randrange(0, len(maps) - 1, 1)]) g! j' f. Z9 G; O) h! u
for i, i_str in enumerate(maps):
, ^* v9 M4 N4 [. K2 O% L if i in range_arr:, p& A% v* R% D9 H0 {+ s
i_str = re.sub(r'<a[^>]+?href=\"sound\:.*\.mp3\".*</a>', '', i_str).strip()2 ]5 A1 C- ~0 p
my_str = my_str + '<li>' + i_str + '</li>'2 g S& w8 Q9 l) A
return self._css(my_str)5 |$ {/ A$ t4 r
return ''% F5 M; E$ x6 b {! Z) [2 ^8 j
$ @# B, i: k0 H) K
def _range_sentence_audio(self, range_arr=None):
/ ^; m% S% k- J$ d4 q m = re.findall(r'<span class="example"\s*.*>\s*.*<\/span>', self.get_html())
6 y3 J) y7 w4 P* q/ E* q if m:
3 D, j _, c) @( R; B soup = parse_html(m[0])
z! S! y. ]' Q; w7 j- ~! A el_list = soup.findAll('span', {'class':'example'})- z3 V- J3 q8 g1 e/ _
if el_list:4 h$ l! c- B/ M
maps = []
* {& h# C X# }) b+ G; I for element in el_list:% q: n- {8 e4 S, u& | g0 N P
i_str = ''
: W% ?" U: ~" W/ M for content in element.contents:
% q% e- w- t+ J7 u# z% g, H i_str = i_str + str(content)7 h ]) o, j$ b; C
sound = re.search(r'<a[^>]+?href=\"sound\:\/(.*?\.mp3)\".*</a>', i_str)8 ^4 I) y8 E1 h1 [5 b( K) G
if sound:
( _( o- Q1 f! a maps.append([sound, i_str])# ^/ N. k8 X8 s) m# N; X# F, R
my_str = ''8 d z( o+ B% w
range_arr = range_arr if range_arr else [random.randrange(0, len(maps) - 1, 1)]
W1 w+ Y% @. b7 [ O for i, e in enumerate(maps):
+ I" O4 ]( W8 T4 y if i in range_arr:9 O/ e2 ?' {# m8 H. x1 ^+ z
i_str = e[1]
, l3 F* ^8 a; o1 h. v6 `! Q sound = e[0]
5 N3 h2 D7 }1 G6 B6 s5 i0 \ mp3 = self._fld_audio(sound.groups()[0])
, M. n( _3 c" h6 q5 n" \, C4 h- s i_str = re.sub(r'<a[^>]+?href=\"sound\:.*\.mp3\".*</a>', '', i_str).strip()8 k5 F$ T' V }# s6 P
my_str = my_str + '<li>' + i_str + ' ' + mp3 + '</li>'
, [: _! K7 U: @7 `% s- x return self._css(my_str)* h' {! f R( ? \
return ''
% M( Q8 I/ ?$ J% X+ n
6 B+ [* s) a" X0 k6 ^3 m( o4 U( _% N @export([u'额外例句', u'Extra Examples'])
- i/ W# F/ w" d# s& A8 w def fld_extra_examples(self):, ?. D# W' a7 `- M& T
lst = re.findall(r'href="/(@examples_.*?)\">.*?<', self.get_html())
: Z8 @0 h- T' X5 |' w if lst:
1 V$ K1 l/ G) r. `( T. Y str_content = u''% r: M/ ^4 g) T8 ?. V) i/ q
for m in lst:
. X B+ j; J! Z" y# v+ q content = self.builder.mdx_lookup(m): l: t9 L; d) {7 c# G8 O- E& d
if len(content) > 0:: [4 R) }( U3 j" I5 ~8 W6 j
for c in content:
8 m) f6 H8 K- N* Q str_content += c.replace("\r\n","").replace("entry:/","")
% V1 @' \) z" ?+ X return self._css(str_content)
: c) p, L; n- L return '' 3 W* H8 a6 q: s5 ~ V
1 a/ u/ p9 U2 ^7 n$ c' w
@with_styles(cssfile='_ldoce6.css')
6 x2 Q; l- \" j8 a def _css(self, val):6 t! z n$ {# w$ a3 Q1 I
return val
" W6 {0 i3 k0 n. M! ~% M2 Q ---------------------
7 q* ~9 z( x. V7 Z3 `$ E) M( D& j! B- q5 E$ t- f
谢谢各位4 ?- f7 a9 z ^3 q$ X* ^
& }. z7 V+ r! I, H6 Z# S3 Y
1 V9 @; K5 h% v9 f |
|