TA的每日心情 | 开心 2019-9-4 10:12 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
本帖最后由 jiaqiangmit2 于 2019-8-2 21:30 编辑
2 M1 r9 \3 U+ {1 F$ Y5 P/ k7 I
4 E, K' P3 d9 f各位大神
) x( m* V. E, p) F5 ~我在anki里已经实现提取LDOCE6真人朗读例句的制卡。现在希望能将音频文件单独放手机,睡觉和开车等时间听。问题来了:anki对媒体文件的命名是以类似于HAsh方式“乱码”命名的,从媒体文件夹里复制出来,所有的例句和单词的朗读时打乱的。能否实现:单词以其拼写命名(example.mp3),对应的几个例句音频以单词拼写加后缀的方式命名,这样,放在手机里,单词和对应例句就可以一起读了。. l7 Q3 X+ x5 H
% h1 P( v) z) h* j, F' B
* V. A; K, n. @+ s. Z6 h如图,文件名是“l乱码”的# A. c$ U9 u4 c! Q8 ^" q% f3 h
无法上任附件,名字是这样的:# Z. q& R3 h t8 ^/ q, o" _
[sound:-ldoce6-b0ab2fba-11b6ffb4-d84db123-b00153f3-9971952a.mp3]
) R9 _* j& s" x' C( J; ]
- _) [( T; v) ~( u$ Z: I6 X0 `对应 脚本 ( I" b- w7 A* I1 |* `5 D% E
0 H( h( J# o" s9 @' v6 k( p/ S. _------------------------------3 A% \- g: Q8 q$ ?
3 X/ R5 N- [4 p, o
+ B( L! ]" B# r: w+ @7 a#-*- coding:utf-8 -*-+ k5 {: m! g5 G$ q/ R/ Z
import os
7 |5 K1 u( H2 z7 Nimport re
# v4 N8 h7 b9 ~* I6 Q; [! dimport random3 |& g' W2 G% F) }
from ..base import *8 ~2 y+ u! X5 D4 y( r
# O2 U8 R, Z E! c0 C6 S9 j+ \: |! ~) h
VOICE_PATTERN = r'<a href="sound://([\w/]+\w*\.mp3)"><img src="img/spkr_%s.png"></a>', B5 V; |3 B0 J; { ~# w! A1 a
VOICE_PATTERN_WQ = r'<span class="%s"><a href="sound://([\w/]+\w*\.mp3)">(.*?)</span %s>'3 n8 Q3 c$ u3 G: @6 b$ I# B0 b! [
MAPPINGS = [! i) s( _, r+ \% W# j+ w2 G
['br', [re.compile(VOICE_PATTERN % r'r'), re.compile(VOICE_PATTERN_WQ % (r'brevoice', r'brevoice'))]],3 o3 v) z) h; G; i& r$ {
['us', [re.compile(VOICE_PATTERN % r'b'), re.compile(VOICE_PATTERN_WQ % (r'amevoice', r'amevoice'))]]
5 ^& S+ ]0 H9 I. m3 y+ r]
' u# X9 H; I+ B. y5 n, G- KLANG_TO_REGEXPS = {lang: regexps for lang, regexps in MAPPINGS}
7 [- A! X, F- o2 S* UDICT_PATH =u'E:\Anki\Dick\L6mp3.mdx'
; ^5 {$ ~# \; D4 v! z' D }/ b5 _: Z6 A. X( r6 \5 B& q9 a" T$ _% P
" S, q1 t+ l, ] V@register([u'本地词典-LDOCE6', u'MDX-LDOCE6'])' M( i3 q& f2 C4 M
class Ldoce6(MdxService):
* U! a0 C0 k k6 s. y+ { L4 \- e9 ]
def __init__(self):5 u' e: n* S6 w0 F$ G# Y
dict_path = DICT_PATH1 C9 A: ?' @! g& o- K' C# ^6 X' t
# if DICT_PATH is a path, stop auto detect6 A1 I/ _5 N) H7 _+ {
if not dict_path:
1 ? q2 G% N) M( W4 C) X! e from ...service import service_manager, service_pool
6 E$ g. t6 b3 b) }( [4 M3 ~ for clazz in service_manager.mdx_services:
) U! o6 g7 K: B% G0 k. W$ Y( D) D service = service_pool.get(clazz.__unique__): o m+ p9 F5 ~% d
title = service.builder._title if service and service.support else u''
% H( Q6 J: B$ B H3 F! ? service_pool.put(service)+ Y+ Y7 x/ F. J5 O ~9 \
if title.startswith(u'LDOCE6'):, Y& e9 @+ ]) r8 y) i, z! T9 q
dict_path = service.dict_path* F! b/ f$ B7 F7 m7 W! r# s
break; Z$ H- s; I3 v$ ^) `+ a8 g: L: E) j
super(Ldoce6, self).__init__(dict_path)
+ I: R; Y* M' e: W# r
+ n' F: B" O+ V- c0 | @property! s, r' L7 G- r1 P6 u6 A
def title(self):
( N; |0 T8 Z% u) n6 w; d return getattr(self, '__register_label__', self.unique). X) M: c# S7 {! }2 k* I4 o
) s7 Q! T) M( [1 n: I: a @export('PHON')
, @! h: x- e4 a% i! S def fld_phonetic(self):* |# l; ]) i! v# V
html = self.get_html()
5 ^) s0 ~, N1 c) d$ x+ I* z m = re.search(r'<span class="pron">(.*?)</span>', html)6 o& |% \# f B8 x% ?& h
if m:
/ J4 @( Q7 A( ^ return m.groups()[0]
2 h1 s0 g1 v8 _ return '') U B: c3 M* {" X, n5 k' B! {7 U2 h
: M" T# u" B' C% c- P def _fld_voice(self, html, voice):" {5 I% Q! Z, ]& g' J
"""获取发音字段"""1 E) @0 Q& e5 N/ `4 U+ `
for regexp in LANG_TO_REGEXPS[voice]:: Z1 H" b0 O D1 Q8 V# H
match = regexp.search(html)* u' x5 u* e! X5 E
if match:
$ C( l W; H- ` val = '/' + match.group(1)5 e) t5 @* t( \
name = get_hex_name('mdx-'+self.unique.lower(), val, 'mp3')
' d3 `" R6 B9 U2 J2 b- i name = self.save_file(val, name)6 Q8 I7 t4 Q0 G/ n
if name:4 q0 d3 _0 }# ~2 q- b
return self.get_anki_label(name, 'audio'). `: Y3 N6 _7 a9 j
return ''% k0 q) g4 u* _, D
- O# m* r6 `3 K- @. d
@export('BRE_PRON')
, C2 Q1 [; ^6 [1 d1 n0 b/ z def fld_voicebre(self):; L" Z; g6 c7 j% v6 M. q2 C
return self._fld_voice(self.get_html(), 'br')
/ ]3 r) v+ Q1 L- k9 }% q# \3 l& `- u9 ^ r4 v1 b5 W
@export('AME_PRON')
3 `% w, ?) p% v- V def fld_voiceame(self):' g4 H: H p. z6 u/ _2 [
return self._fld_voice(self.get_html(), 'us')
2 _5 d' d9 w' O4 e0 |
5 }- y' t* j" H, [8 [5 P! D def _fld_image(self, img):
5 F% Q7 C) X+ Q/ c val = '/' + img6 [3 Y5 p3 m3 _* U. K
# file extension isn't always jpg+ \9 o+ m: Z- d9 S0 x. Q, x7 v
file_extension = os.path.splitext(img)[1][1:].strip().lower()
7 k2 h8 A6 k+ G( H# h0 Y name = get_hex_name('mdx-'+self.unique.lower(), val, file_extension)
, h$ N* ~" J& [! N V* f name = self.save_file(val, name)( T* |" {7 @% a& I) n
if name:
2 }. j3 E z( W4 s6 b return self.get_anki_label(name, 'img')
+ m( M" d) H+ P1 i4 Q! J return ''
1 r; {' V4 t8 F( }6 x1 f+ ]% A! Z; i% M5 l4 @
@export('IMAGE')
7 V& M( Z, u2 n+ c; J- a def fld_image(self):1 B% S$ p* ?! y# [
html = self.get_html()
( b" h: x) J' T8 S8 Q. m6 x m = re.search(r'<span class="imgholder"><img src="(.*?)".*?></span>', html)
$ s; ]: j( |! m5 m( @ if m:
2 T5 ]6 {$ k7 u6 ` return self._fld_image(m.groups()[0]), S% D2 z, P; f2 ~6 r7 p$ g7 M
return ''
- H8 O& W/ v/ @
% U+ {0 g& W: }- d$ y* r" b: q @export('EXAMPLE')" Z. l* ?* w" u% |* d+ X9 T
def fld_sentence(self):1 _( ?! ^( X" |
return self._range_sentence([i for i in range(0, 100)])+ {' a' R. k% m: ^1 `) d
! W* q7 `$ `1 n0 U6 W def _fld_audio(self, audio):2 {5 b3 x1 |/ Z8 d
name = get_hex_name('mdx-'+self.unique.lower(), audio, 'mp3')! i! D x; B; q8 G
name = self.save_file(audio, name)' c( s) E& ] o. m
if name:
) x: b- O) Q% h! R return self.get_anki_label(name, 'audio')3 q0 Z% m2 j9 K; W: v. o
return ''
8 s% F5 p; `7 L6 l {) W- I" p9 r% e
@export([u'例句加音频', u'Examples with audios'])1 y! M, e3 X* R) g" F2 |
def fld_sentence_audio(self):2 D+ Y# c' z$ Q% m/ k1 _3 ?
return self._range_sentence_audio([i for i in range(0, 100)])! F; b* m) g- F+ [3 n( l# }4 S/ Y+ X7 |
# ?# n% Z. M8 e# |, K
@export('DEF')6 s& H8 W# e3 b. S8 v$ r# c
def fld_definate(self):
9 P B5 K% e6 s& x m = m = re.findall(r'<span class="def"\s*.*>\s*.*<\/span>', self.get_html())
$ a) ]- }! w+ I2 \ if m:
* M: U1 e8 v. T, n1 Q3 I# h+ O1 ] soup = parse_html(m[0])3 G. d/ s5 \* W/ Q, ]! l. B- f
el_list = soup.findAll('span', {'class':'def'})
" B! ^9 O3 X; x4 g- M0 ]- b if el_list:
" a1 w5 h8 I2 c* g" K maps = [u''.join(str(content) for content in element.contents) 8 T' S) ^1 m4 p1 c6 ]: @
for element in el_list]/ U! q5 U1 Z3 l7 |8 Y
my_str = ''( t+ F4 W6 T. D7 N& g
for i_str in maps:' ~( z' d7 S+ a2 T; b3 n
my_str = my_str + '<li>' + i_str + '</li>'
5 C6 E3 Q; _ j7 A7 v return self._css(my_str)
7 s8 ^: O- ]" O) l return ''
# z6 H {# z2 q; u0 l5 G4 _: ~3 Z* F, |; Q* ]2 R5 z
@export([u'随机例句', u'Random example'])
# ]- [2 v% S1 R' m$ C def fld_random_sentence(self):
# ` T3 n9 C0 T return self._range_sentence()
8 P: c! X, ?+ b+ N3 A. t7 I' s* @+ `2 J8 G* G8 ]
@export([u'首2个例句', u'First 2 examples'])$ U) {7 h/ Y. ^$ u, Y! L6 K
def fld_first2_sentence(self):
: F. o9 Z0 W, w4 m. Y1 p# ~ return self._range_sentence([0, 1])8 P2 K8 O- j: ?9 [8 I" ^
: y8 w% ?# \! V
@export([u'随机例句加音频', u'Random example with audio'])
8 h V7 Z5 d' X/ }' F; |1 `* A def fld_random_sentence_audio(self):
3 ]$ ]! H/ l* J0 ?$ @ return self._range_sentence_audio()
- }# _1 [1 I& Q# t
; S; K4 d1 D9 a; ] @export([u'首2个例句加音频', u'First 2 examples with audios'])
& }! w* r# j2 o7 F: p& p def fld_first2_sentence_audio(self):
0 Q+ @* u' _5 `' B return self._range_sentence_audio([0, 1])! p8 i; b) O5 k, N4 `/ E
( v6 P0 W( o& k) i2 K def _range_sentence(self, range_arr=None):8 e- @, }& R/ {( r, Q( D G
m = re.findall(r'<span class="example"\s*.*>\s*.*<\/span>', self.get_html())8 m' M) |6 P, O) N1 O v, ^
if m:
/ O; C! U" l" H$ S- i5 \ soup = parse_html(m[0])
+ d# M6 b G1 \9 d$ D2 W el_list = soup.findAll('span', {'class':'example'})$ j5 W1 W; d( t6 r
if el_list:
+ M0 U4 y6 G: }3 f8 c& b maps = [u''.join(str(content) for content in element.contents)
5 J+ a: j" B" C3 Z: {! O for element in el_list]
1 t, h" }5 ]& y1 y+ L% \# G my_str = ''! N9 Y+ x0 x4 c! i; z) K( o
range_arr = range_arr if range_arr else [random.randrange(0, len(maps) - 1, 1)]
3 c4 @( u9 A' L4 m# s( R for i, i_str in enumerate(maps):
9 o, r5 q9 B0 s3 r$ V# V if i in range_arr:
4 _# P4 D! v) N8 L; P, C# c i_str = re.sub(r'<a[^>]+?href=\"sound\:.*\.mp3\".*</a>', '', i_str).strip()
9 K" @. H( F$ ~& H my_str = my_str + '<li>' + i_str + '</li>'8 v) c$ V- J$ J4 ]$ ?# Q
return self._css(my_str)
# A" L. T' I3 X/ J# P- } m return ''
4 V( M% I4 m- C. L' w/ E) w3 `- P$ w& Y7 r+ N$ z7 b
def _range_sentence_audio(self, range_arr=None):
" }% V+ _- A$ C; z" U2 F; K0 z% K m = re.findall(r'<span class="example"\s*.*>\s*.*<\/span>', self.get_html())
9 L9 [' H6 ^5 ]4 N8 b9 A% j0 B# m if m:/ ?, P x: I" f# d7 I) j9 J' Q
soup = parse_html(m[0])3 q- m# @5 l U/ T- J' m' {
el_list = soup.findAll('span', {'class':'example'})/ j9 X( g* \4 y. J
if el_list:
( O" `5 O) l7 }) c6 v maps = []
3 A6 Z% |& ~9 w% g* d/ r2 p, M for element in el_list:
! ]5 W$ o: F! R$ k7 X0 M i_str = ''; q- x+ V! I* o
for content in element.contents:
8 i) }3 K$ I# u m* u: z i_str = i_str + str(content)2 `' R$ O/ B0 G- \0 m( c
sound = re.search(r'<a[^>]+?href=\"sound\:\/(.*?\.mp3)\".*</a>', i_str)6 S' H" u# |1 I* x
if sound:
8 n; O8 g& O) g, O" i; X maps.append([sound, i_str])
" [) L) v( q+ X& Y* } my_str = ''
% o o2 g4 S( y range_arr = range_arr if range_arr else [random.randrange(0, len(maps) - 1, 1)]
' T, w8 b# L) Y; z for i, e in enumerate(maps):" X6 b9 s( j% x& M
if i in range_arr:9 e1 N$ P7 K$ s e; I" x
i_str = e[1] p" N R8 T8 x- F5 s7 y
sound = e[0]: r8 d/ f* S. G8 R0 B% x
mp3 = self._fld_audio(sound.groups()[0])
1 t6 p; c, @# r& |% C0 J( L) @ i_str = re.sub(r'<a[^>]+?href=\"sound\:.*\.mp3\".*</a>', '', i_str).strip()
5 D2 N( ?' t% G8 ]0 Q' N! f- F my_str = my_str + '<li>' + i_str + ' ' + mp3 + '</li>'
( e r# u3 y0 ? \2 Z* m# } return self._css(my_str), V( P% s3 J( l1 ~
return ''9 |$ S; p1 y2 W$ U+ X# y
1 U- ^4 d R( z# o0 V @export([u'额外例句', u'Extra Examples'])& M$ c6 t9 d0 C% S8 T4 I: n
def fld_extra_examples(self):/ {7 Z% \- m: s& L% f
lst = re.findall(r'href="/(@examples_.*?)\">.*?<', self.get_html())' r7 S, ^$ H: n$ d- E% O% [: w
if lst:
" h" A$ I+ u. `5 p2 ^' ^& \, V str_content = u''! J9 d7 G: C+ J4 n. S( ?7 l$ e
for m in lst:" @, D% U- F( R# S3 O
content = self.builder.mdx_lookup(m)
- J! y7 ? r$ {6 w0 ]; o if len(content) > 0:1 w$ Q5 m8 I; ]( b( |
for c in content:
2 f% v5 x7 z' e+ r% t8 i str_content += c.replace("\r\n","").replace("entry:/","")
. H+ b$ |: d, T" M6 i return self._css(str_content)
! ?! l( ^: m* Q* A7 `8 Q0 L& } return '' ) Z3 r# Y7 H% Z) I) M7 {1 Z
2 v5 ~3 Q7 L {4 N: \ @with_styles(cssfile='_ldoce6.css')# q9 C4 J: b$ V [2 F0 \$ J, y4 t. M3 w/ h
def _css(self, val):1 r" _8 d6 A' F3 R$ U
return val
6 k! u. h: v6 h3 w& M+ V: A ---------------------) w, E8 K9 _4 G2 G2 ~( ?, @
" R' o. L+ v) d5 y) p
谢谢各位
. F8 O" L3 c6 \4 E: c |1 Z( F0 q7 H, @
* J- {( W9 n4 m( H9 _ |
|