TA的每日心情 | 开心 2019-9-4 10:12 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
本帖最后由 jiaqiangmit2 于 2019-8-2 21:30 编辑 * P3 ?2 D9 |2 B) J: w7 z$ x5 G3 n
5 ^1 d+ l/ u8 c+ M/ W
各位大神
3 D8 x' L' H1 b3 {我在anki里已经实现提取LDOCE6真人朗读例句的制卡。现在希望能将音频文件单独放手机,睡觉和开车等时间听。问题来了:anki对媒体文件的命名是以类似于HAsh方式“乱码”命名的,从媒体文件夹里复制出来,所有的例句和单词的朗读时打乱的。能否实现:单词以其拼写命名(example.mp3),对应的几个例句音频以单词拼写加后缀的方式命名,这样,放在手机里,单词和对应例句就可以一起读了。8 Q" c" O: J2 w: Z
# q3 Y1 b, A, S( j7 S$ Y9 ^ E& o4 X1 u" g
如图,文件名是“l乱码”的
3 o' w$ c& d( h1 j# `3 k* _5 R无法上任附件,名字是这样的:
' J, P9 m. V" l [sound:-ldoce6-b0ab2fba-11b6ffb4-d84db123-b00153f3-9971952a.mp3]
5 t0 ?* K8 w$ U V' y& y u
~: x# B9 }+ m @( n$ V对应 脚本 ) d: a9 B' X* w" W8 m3 ?
3 [) P# i( `1 H
------------------------------" {% b2 q" k- H! y' ~, o
: q8 A6 u- @$ _ _, X' Q, v) f8 O+ r5 g! a( G
#-*- coding:utf-8 -*-7 y5 I) \5 e$ ?3 B) d& d
import os
4 i2 F7 L8 e u3 Kimport re
g# |7 M5 e& s" Aimport random8 t) N* C9 V F& f( |6 ~6 }
from ..base import *, }; P1 A/ l' J1 H- D$ r2 w( }
6 B' y% s) e3 e3 L8 f, W% s
5 m0 E* e$ L$ D# uVOICE_PATTERN = r'<a href="sound://([\w/]+\w*\.mp3)"><img src="img/spkr_%s.png"></a>'6 c! x+ e1 n) g/ t3 q, P
VOICE_PATTERN_WQ = r'<span class="%s"><a href="sound://([\w/]+\w*\.mp3)">(.*?)</span %s>'
; C* d L4 g3 M0 ] g6 `MAPPINGS = [
* [. ] }6 v; ], b+ O0 h; P9 x! V ['br', [re.compile(VOICE_PATTERN % r'r'), re.compile(VOICE_PATTERN_WQ % (r'brevoice', r'brevoice'))]],' S! D( B) G& X* R
['us', [re.compile(VOICE_PATTERN % r'b'), re.compile(VOICE_PATTERN_WQ % (r'amevoice', r'amevoice'))]]0 `4 Z' I5 L) A: @
]
9 c: X4 |5 Y9 ^" {( U3 h9 k& ^LANG_TO_REGEXPS = {lang: regexps for lang, regexps in MAPPINGS}
: R; x$ q+ _& s! N: O7 l! s$ NDICT_PATH =u'E:\Anki\Dick\L6mp3.mdx'2 B4 s. O* ?! q& j4 o7 f
% l2 }# m- L; ^+ Q+ k
5 T" F' E% Q. z0 F1 ~* R@register([u'本地词典-LDOCE6', u'MDX-LDOCE6'])" `! m, ~$ u$ V0 R) H
class Ldoce6(MdxService):
( [9 U6 }) J* ?! U- e5 H% S
' O2 K' P5 I3 B9 \' b! M/ B' ~& L def __init__(self):8 n- {8 o' E# V3 I% r6 d
dict_path = DICT_PATH
* }1 g0 F3 b* d) x% e # if DICT_PATH is a path, stop auto detect
. o1 `$ A- D* ^0 g6 m4 ~ if not dict_path:9 b6 ]& {1 I' |# ]
from ...service import service_manager, service_pool
. ?3 V/ e5 D% _5 s7 n L% R for clazz in service_manager.mdx_services:- O) [( L* m/ {8 [' L
service = service_pool.get(clazz.__unique__)) J& T! D1 Q# g8 \7 ~
title = service.builder._title if service and service.support else u''
$ R1 N( }0 x: Z. Q' i m service_pool.put(service)$ U3 R) W9 Q$ e- q
if title.startswith(u'LDOCE6'):! |# n% z w; }" @6 D
dict_path = service.dict_path, h2 l+ R/ D+ p
break
/ S9 m& L: Y# `9 L, ?5 c) d super(Ldoce6, self).__init__(dict_path)
1 Z g- \0 y% P! i0 A9 P/ |& h; b1 U* T* w" D; y1 U+ D( m( T
@property
2 ^1 s) {+ M h3 D+ q def title(self):: j! d( L8 q" f
return getattr(self, '__register_label__', self.unique)
, b4 i1 F# _" c; w+ U" l- _& B
7 M! I/ k! P0 }4 M @export('PHON'). S/ x% J# A/ G6 c* @ Z
def fld_phonetic(self):
7 t$ a4 o2 y, W html = self.get_html()3 I$ v# j# Z: U; R& B+ J. Y
m = re.search(r'<span class="pron">(.*?)</span>', html)8 C2 W/ c7 a8 O/ ?0 }$ l
if m:8 Y/ O) N# R& |8 X
return m.groups()[0]4 ~1 G& ?: _6 j
return ''
* p, x( [; i0 R3 j3 G6 o
' T+ I5 l6 ?2 \, P$ N def _fld_voice(self, html, voice):
# _ `8 `* I7 W0 U """获取发音字段"""
4 d) }% d: |" M5 N3 V/ ]/ K8 _ for regexp in LANG_TO_REGEXPS[voice]:
# K9 P" G' O# @% F/ i* C, b match = regexp.search(html)
& ^: @" w" D! Z3 Z$ p: _ if match:
$ U8 P7 p2 o7 q val = '/' + match.group(1), R4 E; m& w( M' n/ i( o
name = get_hex_name('mdx-'+self.unique.lower(), val, 'mp3')& Z, b+ ]; r' F& `; M
name = self.save_file(val, name)8 u! ^) u! l: q) S0 h6 {7 q
if name:6 [; O- h2 h# [$ E% E8 t
return self.get_anki_label(name, 'audio')
0 o1 R& Z# l+ P! A: Z+ e& m1 Q return ''0 T5 S+ j! P0 T( R4 X: v
' p, ?3 m2 E" D) ~- N: c, [- t
@export('BRE_PRON')1 m# j. Z( |! A- q- v8 |
def fld_voicebre(self):% J3 X/ q6 m8 t( b: q6 K
return self._fld_voice(self.get_html(), 'br')
a7 ?4 M; o9 b) A$ ]3 E# r2 U a
: r: Z, U) S' L4 L" \ @export('AME_PRON')
$ v, i( F! k. i# t def fld_voiceame(self):3 T. _5 v; a1 c! d# Z$ L
return self._fld_voice(self.get_html(), 'us')
/ V7 h0 z& s" h: a9 M8 E1 \: n$ |& Q) e+ d) s( i1 a( U" j
def _fld_image(self, img):6 E/ W. a0 V( S$ [
val = '/' + img
1 b$ p1 t. l1 [ i # file extension isn't always jpg6 `; C& r$ f4 X* ^; b: @
file_extension = os.path.splitext(img)[1][1:].strip().lower()
8 |9 B7 k" ~3 B3 Y9 ^9 ^! ~, q0 f, @ name = get_hex_name('mdx-'+self.unique.lower(), val, file_extension)
8 r$ l! v6 q5 W. n name = self.save_file(val, name)
& S2 m9 v3 B0 e) g/ H* W& b if name:
/ u& d' N$ D9 L5 P. o return self.get_anki_label(name, 'img')
' O! y& R" @$ e# V5 B6 I0 a) ^$ S return '') k( O0 C8 |% Y- u% G
6 ~$ l/ h$ l! {" T
@export('IMAGE')7 Y& z4 i' L9 a/ L6 _3 z/ K/ ?
def fld_image(self):' j2 h* H' Z" \# H. q
html = self.get_html()9 v, N4 E# w8 P: p' ]4 J3 H: i$ w7 S
m = re.search(r'<span class="imgholder"><img src="(.*?)".*?></span>', html)
' F1 Q$ t' k% d& B! [$ C if m:9 z g" Y& t0 E/ b3 X7 b$ c
return self._fld_image(m.groups()[0])$ D" J$ k8 b; I! c2 x. y. ~
return ''
5 J; k/ @4 e4 [+ S( N; U& w
$ U. r/ B$ v4 R5 o7 a* O @export('EXAMPLE')
$ Y" u# k0 |+ q* D def fld_sentence(self):
" B' }$ X* [2 N: X0 j/ P return self._range_sentence([i for i in range(0, 100)])
9 r) F) U# G4 t1 J/ S, t6 S7 W0 z. o2 m
def _fld_audio(self, audio):
- n. Z& c; N- o7 a$ y3 d1 `$ h1 x name = get_hex_name('mdx-'+self.unique.lower(), audio, 'mp3')8 i$ g( g* }+ c" t8 c$ o
name = self.save_file(audio, name)- y7 T3 f7 m4 J5 w" S/ g1 ^1 f1 T
if name:" L- h4 H( {1 ~" k9 s
return self.get_anki_label(name, 'audio')2 ~5 u" x6 x* B! c1 N% O
return ''3 h* i% z2 ^. X) R' w/ Y
% B7 h$ G9 ]8 X9 g
@export([u'例句加音频', u'Examples with audios'])
6 s, J% e$ Q( r8 F def fld_sentence_audio(self):9 z9 H; G- ?* e" `
return self._range_sentence_audio([i for i in range(0, 100)])
4 z# k3 s' C0 ^: N: c) M+ b7 t) l. C- @, {+ Y, ?( a
@export('DEF')
" f4 d: R8 h: r( o# p& j def fld_definate(self):1 T K' ]2 T! p0 ~6 X
m = m = re.findall(r'<span class="def"\s*.*>\s*.*<\/span>', self.get_html())
) S8 E1 G2 a0 u1 h if m:! \1 t; A7 L' I" t7 \! J% u
soup = parse_html(m[0])
/ Q+ x- x N/ [) Z# v+ x2 L el_list = soup.findAll('span', {'class':'def'})
, T8 H8 n- x7 a- ~4 C, E. h if el_list:; x4 l- y8 e1 p$ F4 L3 X, j
maps = [u''.join(str(content) for content in element.contents)
5 {1 i* j. y( s for element in el_list]
3 j* _8 I# a' a2 W my_str = ''
" ?5 q. I+ p( I4 M- G& d: x* U$ ~ for i_str in maps:
' f8 l6 ^* K9 p3 l' [8 @7 Q my_str = my_str + '<li>' + i_str + '</li>'
2 [, V1 i' t; C+ Y5 p return self._css(my_str)
t3 f( J6 G7 V2 q: u return ''& v/ c. z. J9 v, o% X/ M
; e5 t' T! M/ v) O
@export([u'随机例句', u'Random example'])# j1 u7 x! J. }9 _1 |1 m
def fld_random_sentence(self):
; P" K9 q6 h4 B8 I6 o! y return self._range_sentence(); N6 X" r h$ _3 P7 H$ E
' a! M3 h" @5 G% R5 q7 f
@export([u'首2个例句', u'First 2 examples'])
0 B" W3 X4 M9 W def fld_first2_sentence(self):
7 |1 z2 n" z' N6 C2 u; c return self._range_sentence([0, 1]). p8 T! t6 |( f4 G
. W) G7 B. W, c) P9 h
@export([u'随机例句加音频', u'Random example with audio'])
8 r( W/ m" c7 [3 b5 K$ y. g5 R def fld_random_sentence_audio(self):
# i$ g; h1 @' o return self._range_sentence_audio()
" E* h+ `" P5 m! V
! S3 A2 d2 H. |# m- Y @export([u'首2个例句加音频', u'First 2 examples with audios'])
$ k3 `% f+ @- T$ ?) R2 }% n def fld_first2_sentence_audio(self):
0 A, u5 p3 A$ j0 x4 L return self._range_sentence_audio([0, 1]) p* n7 P$ x8 y8 g `" z* n
" L9 p k! s3 L2 y+ s) e5 E3 r def _range_sentence(self, range_arr=None):$ T5 a2 I1 B( U: ~( A
m = re.findall(r'<span class="example"\s*.*>\s*.*<\/span>', self.get_html())3 k! z* H/ P# F" M. D" B W& J( G" e
if m:" p: P* q5 {. o" u/ S6 {. z
soup = parse_html(m[0])
& r0 ?5 v, o" m el_list = soup.findAll('span', {'class':'example'})* H! U, _: S# q' x2 Y: `, P
if el_list:$ S9 J+ h0 f" ], U
maps = [u''.join(str(content) for content in element.contents)
4 b+ @" d5 U5 D% B for element in el_list]
* }* }3 |) s/ ^6 z+ r0 h my_str = ''% R b; ?, Z; ^9 H( ?% I! G* {
range_arr = range_arr if range_arr else [random.randrange(0, len(maps) - 1, 1)]
7 x8 h- V5 V3 q A" K0 _; L for i, i_str in enumerate(maps):: h+ \) n4 G6 y. j2 J
if i in range_arr:
! U! R; S2 @ Z4 W* v i_str = re.sub(r'<a[^>]+?href=\"sound\:.*\.mp3\".*</a>', '', i_str).strip()- U$ V' d6 @1 Q3 z
my_str = my_str + '<li>' + i_str + '</li>'
+ ?/ E& ~% f+ ` return self._css(my_str)( ~1 T( p0 {# {1 h1 K' {
return ''3 q4 H# S0 A3 L
$ G9 W, c; Z' O* ] def _range_sentence_audio(self, range_arr=None):; L3 L; m: p2 d8 @9 R. s
m = re.findall(r'<span class="example"\s*.*>\s*.*<\/span>', self.get_html())
5 P4 H3 l1 Y4 |3 o1 ` if m:5 y9 k, Z& U: I7 ~9 Y' G. Z
soup = parse_html(m[0])
. M0 D7 U3 M) E7 X8 q) { el_list = soup.findAll('span', {'class':'example'})
0 ?4 \) z. a: m$ ?1 r( ~, C- d; _/ Z if el_list:
. [- b# X2 E6 J) D2 Z maps = []
, ^/ T0 o1 g( L8 y for element in el_list:( s& n+ p- V2 Q, T3 |+ c0 }
i_str = ''
+ y5 W7 q, |! |" B/ ^ for content in element.contents:# H- | b/ z& u+ Z- B' d7 {
i_str = i_str + str(content)
s: q$ [, R l8 i9 I- x1 K sound = re.search(r'<a[^>]+?href=\"sound\:\/(.*?\.mp3)\".*</a>', i_str). G: G$ v5 `# D( i" x8 X
if sound:
( c# I( [' B4 o% \$ l- n maps.append([sound, i_str])% U' D% }1 Y$ @: k2 E
my_str = '') ^) {3 k% I1 J" a4 o% c
range_arr = range_arr if range_arr else [random.randrange(0, len(maps) - 1, 1)]- `$ V9 `. j h! C) t
for i, e in enumerate(maps):
1 [. x$ x" c- a if i in range_arr:4 O' S. _: u5 g {2 ^- \; K3 z
i_str = e[1]
/ w5 f- G3 Q* K/ Q. w4 `, B sound = e[0]
, u. [' r/ j* K/ B! H. J3 Y mp3 = self._fld_audio(sound.groups()[0])
. A- W b6 T# j" } i_str = re.sub(r'<a[^>]+?href=\"sound\:.*\.mp3\".*</a>', '', i_str).strip()/ g# c0 Q% | u' v9 L
my_str = my_str + '<li>' + i_str + ' ' + mp3 + '</li>'2 t/ K# f5 ~" O" Y) U6 Z4 n
return self._css(my_str)- A- K5 F& D9 a# b
return ''% v. ?6 n( Z) {8 t0 G
$ }; f0 Z5 W6 A. b! y0 b/ x5 w @export([u'额外例句', u'Extra Examples'])9 b+ f. R! \& V$ Q; U8 F0 R( R
def fld_extra_examples(self):
' Z$ }5 _8 i `/ ~& d lst = re.findall(r'href="/(@examples_.*?)\">.*?<', self.get_html())
* x: }/ q0 v. n. S% }# t if lst:, K$ F1 c E& D0 x4 q& p& I" [
str_content = u''/ i8 A" W7 J8 P. m
for m in lst:
% O- K, a# Z' E/ D: l$ U9 p; G content = self.builder.mdx_lookup(m)8 E8 p! I! G! V! W# f Z
if len(content) > 0:
- ]; j8 s/ f. K- U3 h- r for c in content:& m8 n9 P# h+ ~/ [' ?
str_content += c.replace("\r\n","").replace("entry:/",""), I, c2 r2 B0 z7 W* V( `. }
return self._css(str_content)
9 C8 E6 t& |: I* W: S1 s, X return '' - b" S7 d1 ^8 t/ j4 I5 v# w
, W; o6 }; W* [8 Y* g/ v- U @with_styles(cssfile='_ldoce6.css') @* ?* u. r2 N& G. r$ |) [ W
def _css(self, val):) w2 s* L+ _ S6 T, H+ h
return val7 p/ o: k9 u C* w% [9 b1 d+ M
---------------------
) k; x+ z4 R, D
; q; z, }+ f$ i3 A0 V. h8 ?谢谢各位" z, ]9 s: K: V
3 u+ O+ j/ i$ K% }) f
n/ Y/ }' u5 c2 z |
|