TA的每日心情 | 开心 2019-9-4 10:12 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
本帖最后由 jiaqiangmit2 于 2019-8-2 21:30 编辑 % `, H2 {: Q1 @" x+ @
! z5 x4 z" ^+ o* b8 B
各位大神: L0 e% y. p6 }* }3 T; q% T1 }
我在anki里已经实现提取LDOCE6真人朗读例句的制卡。现在希望能将音频文件单独放手机,睡觉和开车等时间听。问题来了:anki对媒体文件的命名是以类似于HAsh方式“乱码”命名的,从媒体文件夹里复制出来,所有的例句和单词的朗读时打乱的。能否实现:单词以其拼写命名(example.mp3),对应的几个例句音频以单词拼写加后缀的方式命名,这样,放在手机里,单词和对应例句就可以一起读了。
2 ]2 E& @) p; j+ Q [5 g1 Q; U$ I3 n2 Z
$ f1 D; R8 [4 N/ Q
如图,文件名是“l乱码”的/ L& s/ H3 }8 ~8 x
无法上任附件,名字是这样的:, P3 }7 ~. _ s5 R0 Y
[sound:-ldoce6-b0ab2fba-11b6ffb4-d84db123-b00153f3-9971952a.mp3]
& g2 ]# l& n G0 H+ X) n
" T* k# @% ]% @4 E对应 脚本
2 c: ~7 g$ ]7 O v; s) T
; e1 z% w4 I! Z2 n$ x7 O- G------------------------------) D! N: F7 F* P3 T. w s( H
2 @8 l. c' E' \
2 C/ B7 L* x) T, X5 g5 T" _( J0 t#-*- coding:utf-8 -*-
- v. J& ?9 j6 ~7 P) ~: bimport os; L7 i( p, e( T# l6 \8 F9 |
import re
) [4 k y$ x5 j9 Z; [6 a- Wimport random
9 L* ^. |8 j2 m& Q' ufrom ..base import *
2 i) i* f& k7 h7 T7 [
5 N o6 T# Y" ^3 M7 W7 l% T
9 s. _7 ?% S e" W7 s$ oVOICE_PATTERN = r'<a href="sound://([\w/]+\w*\.mp3)"><img src="img/spkr_%s.png"></a>'4 v4 K/ R+ [( h: ]8 B/ N. ?
VOICE_PATTERN_WQ = r'<span class="%s"><a href="sound://([\w/]+\w*\.mp3)">(.*?)</span %s>'& m' I A$ E$ w6 t% Y8 m }
MAPPINGS = [& K( f+ o- O* S0 w
['br', [re.compile(VOICE_PATTERN % r'r'), re.compile(VOICE_PATTERN_WQ % (r'brevoice', r'brevoice'))]],
& O+ v1 z" Y. [9 i9 b$ _/ a ['us', [re.compile(VOICE_PATTERN % r'b'), re.compile(VOICE_PATTERN_WQ % (r'amevoice', r'amevoice'))]]4 o, ~; V. ^5 z) B( A8 X* f; L
]6 q3 H: A7 n' Q0 r
LANG_TO_REGEXPS = {lang: regexps for lang, regexps in MAPPINGS}6 { q3 R- b" u
DICT_PATH =u'E:\Anki\Dick\L6mp3.mdx'" ?8 `- \3 A5 t" y
& w" x9 |4 k6 a7 h
' \, k, j; s' `; M' e
@register([u'本地词典-LDOCE6', u'MDX-LDOCE6']) U# C8 j' }! T* h
class Ldoce6(MdxService):
& e7 Z& ` I4 H4 V6 g
/ Y9 b/ s p6 y' q) `- O" n/ L+ s8 G def __init__(self):' M5 k6 l2 u* w! c7 {
dict_path = DICT_PATH" }% s- m9 @7 Y
# if DICT_PATH is a path, stop auto detect9 S2 p' Q5 s2 g5 Z' r* M- m$ L
if not dict_path:1 e4 `+ l1 f2 t+ |# z' _
from ...service import service_manager, service_pool
0 B* m5 ~! w4 {" s for clazz in service_manager.mdx_services:
" S5 U# v% {# {8 T' s1 O service = service_pool.get(clazz.__unique__)
$ l/ I/ [& Z' O ^8 | title = service.builder._title if service and service.support else u''
" b8 A# Q( U+ g% C( m& f- T service_pool.put(service)
7 o1 \3 T' u' s4 W if title.startswith(u'LDOCE6'):
. P& O8 x7 t, A dict_path = service.dict_path
L( B4 y: f, S: J# c break
3 X9 P5 a0 m! s0 A. g super(Ldoce6, self).__init__(dict_path)
n3 y$ E. H% n7 ^, i( e' v" [ j# }* h1 ~! A
@property9 O4 J' c- K: _& l$ m5 O9 A) T! Z7 ?
def title(self):8 c; _3 s$ h: {: o
return getattr(self, '__register_label__', self.unique)
0 e; [4 ^8 o7 F8 W
( D X2 ?, n/ {; a0 I( k. } @export('PHON')3 }& g: s1 b' S q( y+ d
def fld_phonetic(self):
1 c! o6 X8 t6 t# g' N html = self.get_html()8 |2 @# C9 F% |) G1 _/ j
m = re.search(r'<span class="pron">(.*?)</span>', html)
: @' ~1 X6 L( e. g) S; m r if m:4 A e$ Q/ ?) w3 e& y
return m.groups()[0]5 R. [$ f7 V# ?8 J. p+ e
return ''# t% i+ w0 f- m5 o% e
9 Y$ W- F# K2 e2 b, }$ W6 r6 q def _fld_voice(self, html, voice):, @# L6 X9 [# k- A! Z+ f- U
"""获取发音字段"""/ T( V! _& Y: x9 l( U
for regexp in LANG_TO_REGEXPS[voice]:
0 n: n$ G1 u- ~' ]7 A4 W+ Y" @ match = regexp.search(html). K2 n+ K5 n. d( Q% U! v
if match:
, i7 ?; U$ j# C; h" Y* M# r8 x val = '/' + match.group(1)6 X! U1 A3 M# \ c
name = get_hex_name('mdx-'+self.unique.lower(), val, 'mp3')9 _1 S( m: g, M. u t0 Y% B( _! f/ u
name = self.save_file(val, name)4 x" ]$ e5 N( M# p1 ]
if name:
0 b- g' V8 d- ?3 l4 q4 O6 @9 u! D return self.get_anki_label(name, 'audio')
! O" o+ I8 X/ @8 S8 c return ''! j' ?! _3 M. M2 k+ m% Z* l
5 `1 ^" y: a" C6 B- \: c
@export('BRE_PRON')1 I& T: n7 T: r: X0 Q- ]/ H
def fld_voicebre(self):3 c- e T- G. w; a3 w1 I
return self._fld_voice(self.get_html(), 'br')
0 C& H5 g" B% m8 h, W7 V
/ d" U! @% o' Q2 z$ M: X0 u @export('AME_PRON')
6 _& B# S3 [/ A def fld_voiceame(self):
" W# g3 \* s' Z% y N; r return self._fld_voice(self.get_html(), 'us')
: w3 E* e: C [" F1 y0 f( n7 m3 D2 e: _& h! s
def _fld_image(self, img):/ i& r/ R; j& c3 t$ F* O! f* h
val = '/' + img. ?) P9 S0 k* {
# file extension isn't always jpg
( n' v, Y7 {. y6 t file_extension = os.path.splitext(img)[1][1:].strip().lower(); o0 x' G) ~7 |6 X
name = get_hex_name('mdx-'+self.unique.lower(), val, file_extension)! i/ p8 g2 F; R
name = self.save_file(val, name)
9 @% Z1 ]5 c; S& \) \ if name:7 P! H( Y7 _& E0 H9 H: D9 v% P# X
return self.get_anki_label(name, 'img')
; H; A7 y, _* K. s8 h6 s( _! k return ''' B) f& U8 e) b$ _1 u
& W% z. d& b7 u8 H A. I6 E* E/ E; s8 t
@export('IMAGE')
. W9 o8 ~8 J, d6 K9 O% n def fld_image(self):
3 [4 F+ U& P5 e0 K" u html = self.get_html()1 q9 h3 Z8 d' k, s7 T! Q
m = re.search(r'<span class="imgholder"><img src="(.*?)".*?></span>', html)
$ K7 U2 z7 B# j if m:" A9 K# e. W2 e5 i
return self._fld_image(m.groups()[0])5 r0 q! ]1 F* N3 i+ |: w
return ''
& E2 [0 m) m( ~& l) i
" v9 u' u {. d' y9 z9 K @export('EXAMPLE')3 N# w2 Z' U* D9 y0 m1 j1 ^7 F$ o2 {
def fld_sentence(self):% R) n5 U; l. M; N7 a* l
return self._range_sentence([i for i in range(0, 100)])
& N$ c/ s/ j- K) k
6 v# |- N8 o6 A9 w def _fld_audio(self, audio):# b+ ] f1 P/ `: N; {2 S, I" a3 R
name = get_hex_name('mdx-'+self.unique.lower(), audio, 'mp3')
+ M) U8 ^# U1 ^% p name = self.save_file(audio, name)' y6 J1 H* n% u4 ] }; _$ d; U
if name:1 ^9 n1 S; U) @& w
return self.get_anki_label(name, 'audio')8 u, Q$ L9 s# y. K
return ''" u N4 c# P$ ?7 }3 Z! [+ q
' v1 @0 o1 y, z) e- c( M, q @export([u'例句加音频', u'Examples with audios'])
& G9 v: m3 G' x6 r; q( e) U def fld_sentence_audio(self):
( c( V6 f3 B( Z return self._range_sentence_audio([i for i in range(0, 100)])
0 v0 m f0 J2 ~9 x4 `
w% y+ T b9 U- Q+ L @export('DEF')% n \ ?0 @- J1 E" w- P
def fld_definate(self):4 P" ~1 e+ L8 Q! V1 n* O: h/ `
m = m = re.findall(r'<span class="def"\s*.*>\s*.*<\/span>', self.get_html())
) O% p- D- O7 Y ?$ V/ c. n4 a if m:+ U/ E, s- u5 I, f3 j) D
soup = parse_html(m[0]). j4 ~0 z+ T% O0 e1 Z8 v
el_list = soup.findAll('span', {'class':'def'})
' W& G8 \4 z& Q/ Y if el_list:( y" @7 [9 C9 I- u& z$ Q, x
maps = [u''.join(str(content) for content in element.contents)
9 w9 f3 D0 B$ G: X for element in el_list]9 {+ F3 {" _3 a8 Q( W/ K2 h
my_str = ''/ q! B' w8 v: ~/ V$ f
for i_str in maps:
) }( @1 t1 E W/ {1 `, t2 L% W my_str = my_str + '<li>' + i_str + '</li>'1 W7 H! Z. P/ j0 P
return self._css(my_str)/ b/ A1 @ g1 B- |% D7 T* }
return ''
, n5 A2 p3 `1 e2 v* b1 v5 E+ {( f
@export([u'随机例句', u'Random example']), w3 ?( W4 d. }' ]
def fld_random_sentence(self):# a0 y) |" V% ^ p
return self._range_sentence()
( e" P5 K- s6 e* h' d% K& ^/ s, V) `# ^( @+ R) K
@export([u'首2个例句', u'First 2 examples'])
. P4 ~/ y- D9 F; P def fld_first2_sentence(self):
* k$ }6 @1 _% ~" L5 z/ \, r! }2 U return self._range_sentence([0, 1])" K4 J/ S$ W E s* ~- t
6 N d4 v8 r9 f* ^) G; ~. q; A& ~
@export([u'随机例句加音频', u'Random example with audio']), e+ f, V9 `$ J8 ?. ]7 r
def fld_random_sentence_audio(self):
7 V1 G9 r0 @3 T6 A9 y8 f% f return self._range_sentence_audio()
: \6 k+ U0 m/ w
" }9 j4 P6 D, g$ E) _9 t: y o @export([u'首2个例句加音频', u'First 2 examples with audios'])
! b9 x P* B7 ~/ o1 J% ? def fld_first2_sentence_audio(self):: r- S- C4 K w# d
return self._range_sentence_audio([0, 1])0 ^8 B5 O& i* F" v5 h- E9 a, W
4 W, v5 z7 k; U# L, v' w def _range_sentence(self, range_arr=None):
" e' `; l8 j- ` m = re.findall(r'<span class="example"\s*.*>\s*.*<\/span>', self.get_html())3 D. P& M2 u; `0 n% D
if m:
. Z- |8 P" Q' x1 L1 H- k; F soup = parse_html(m[0])7 U& P7 [$ n/ C. H M
el_list = soup.findAll('span', {'class':'example'})
3 W7 e" B. a3 f" m) \ if el_list:
1 v4 q8 Q5 i. X" x/ U maps = [u''.join(str(content) for content in element.contents) ) u& G+ x- J9 q2 W
for element in el_list]8 G o4 L1 H1 ^" r0 D. l# E" |. [
my_str = '', {0 S( h- V5 ^ \0 [; H7 ` c
range_arr = range_arr if range_arr else [random.randrange(0, len(maps) - 1, 1)]
R d* y; w8 b8 P for i, i_str in enumerate(maps):3 D8 U3 E% ?2 l' }) j, _: \
if i in range_arr:2 z& _& {0 \5 @1 D3 V
i_str = re.sub(r'<a[^>]+?href=\"sound\:.*\.mp3\".*</a>', '', i_str).strip()
7 n" x# |% s. ^# H$ p! E5 B1 @ my_str = my_str + '<li>' + i_str + '</li>', R% V Q7 {( H i
return self._css(my_str)/ n, t+ t1 s* u
return ''' ^0 X- h0 v- ]" ]1 V
4 _3 ]/ L; M# T. | O
def _range_sentence_audio(self, range_arr=None):$ [( {. G. R4 g( K8 [* c
m = re.findall(r'<span class="example"\s*.*>\s*.*<\/span>', self.get_html())
4 ~" C" g2 a4 }- j, ^0 L. N+ R if m:4 j7 y8 ?( f# q
soup = parse_html(m[0])* O7 J9 Y8 ?2 r2 d: [) l
el_list = soup.findAll('span', {'class':'example'})
. i" X+ p) H0 N3 {' s if el_list:
" i/ t( X. e5 z, x F+ I maps = []
8 O+ c) S- K* i! i n, ]3 I$ A% Q7 F for element in el_list:& n& y- m6 b4 b$ D2 [
i_str = ''
8 M# c1 j7 x# L7 E9 f: C for content in element.contents:
0 E5 T$ V6 W6 I6 E) ~+ U. V i_str = i_str + str(content)$ V" S1 A3 p) @0 I# O. I Q9 |
sound = re.search(r'<a[^>]+?href=\"sound\:\/(.*?\.mp3)\".*</a>', i_str), i* j9 _5 ^" l; ~6 B
if sound:% K1 P# s# B; x% U+ Q8 J* J1 F3 Y
maps.append([sound, i_str])
. d/ K& i2 p, I0 r my_str = ''$ ~$ d5 i/ X U+ {- {
range_arr = range_arr if range_arr else [random.randrange(0, len(maps) - 1, 1)]
- P7 K' a. ]8 o2 W for i, e in enumerate(maps):9 j2 X/ n$ h* l7 Q
if i in range_arr:" X3 r) {9 U4 ]/ a8 I+ {" E9 ?- c2 M% A; K
i_str = e[1]
+ o0 R( g8 `$ l F. Z7 ^. B$ e5 f% s sound = e[0]
( x: ~4 a+ z, D mp3 = self._fld_audio(sound.groups()[0])
. P9 b9 m* V/ j! [ i_str = re.sub(r'<a[^>]+?href=\"sound\:.*\.mp3\".*</a>', '', i_str).strip()1 N- Z( Z& U" j' G8 d9 w
my_str = my_str + '<li>' + i_str + ' ' + mp3 + '</li>'* G* b" V! z, E( h# W" H
return self._css(my_str)
7 [8 D8 r+ ^: Q0 \7 R9 I( k return ''
0 v9 Y, r& b) l D3 F7 Q- g+ c2 O' E0 Y
@export([u'额外例句', u'Extra Examples'])9 ~: [$ g) {6 ]
def fld_extra_examples(self):
% A) n; ~6 f% W: T& s1 ~ lst = re.findall(r'href="/(@examples_.*?)\">.*?<', self.get_html())
' s( e( T( W: C5 b7 p. e if lst:7 r& v5 r$ ^+ f+ w) u, P
str_content = u''
8 B! D& i0 E9 o3 Y* O+ [, c6 } for m in lst:
& K/ h) A) E) N# \+ ]9 v content = self.builder.mdx_lookup(m): N1 o5 \+ h+ `) }/ D% [
if len(content) > 0:
" ?- f+ J" S" C6 R# I& X7 O" Z for c in content:; v7 s8 S; G+ L( U
str_content += c.replace("\r\n","").replace("entry:/","")
5 E% f: G) \! D, o6 x3 x* ~, F% ~2 m return self._css(str_content), O8 `7 ~0 z2 M* h, J# i+ _) S* d" ^
return '' / N, i" K* @* y$ L- c
! i$ C+ T1 x- B3 ]2 ?' Y2 J$ ` @with_styles(cssfile='_ldoce6.css')% d M6 U! x1 g- g7 ^
def _css(self, val):
0 X+ j8 l V9 ^1 N return val+ i6 h5 }3 B' n) M
---------------------
$ U( n5 M+ Z: m, @9 i5 ?5 q# I! n1 x0 f! T: L0 `3 k) U9 i" k
谢谢各位- R% d4 w8 o; U; u1 u' M5 {% T5 y
, w+ {8 p' @( n" W* `7 w& H; ]& p+ p; _
|
|