掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 3802|回复: 7

[经验交流] 如何在卡片编辑界面提取[sound:xxxxxx.mp3]这个元素

[复制链接]
  • TA的每日心情
    慵懒
    2026-4-16 20:46
  • 签到天数: 709 天

    [LV.9]以坛为家II

    发表于 2022-3-28 15:07:02 | 显示全部楼层 |阅读模式
    本帖最后由 496147678 于 2022-3-28 15:09 编辑 * c( Y: @! M7 p$ ?
    1 }6 Y/ K' D8 _, z5 N, r7 [
    想用2 c+ G3 u. r6 h9 T
    <audio loop autoplay controls src="xxxxx.mp3">的方式完成音频无限制自动循环播放
    ) T: T6 i0 A/ g8 i! ~7 p4 q$ h& _0 }/ E' y
    于是想提取 xxxxx 的内容- C  q6 ]0 B1 ?% Q$ c
    / Q9 v) c& p, {4 B2 k
    var price = document.getElementById("audio").innerTEXT;
    3 Y% M7 }! O4 U9 O* J  ?/ lalert (price)4 n- G. t% O- w0 c/ Z
    ' {) ]; \+ O1 ?) x  h% @
    但是并不可行,想破脑袋,不知道有什么解决方法
    8 P! C) Z7 ]3 B# T+ V! {6 {0 V3 Z5 @4 B1 F) v
    已经定义了 音频的 id=audio
      }4 C) r: y" t9 t- p6 W5 Lprice反馈的结果是空白0 B" G* _; l: ]0 n: ?& v  C
    ( y( _3 [/ k, |# Y
    用这个方法去弄expression,也就是{{正面}},是可行的
  • TA的每日心情
    慵懒
    2026-4-16 20:46
  • 签到天数: 709 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-4-1 20:27:38 | 显示全部楼层
    arruno 发表于 2022-4-1 10:46
    ( }  }3 q- U. T' E: S9 L# I我今天抽空试试。其实有一个不那么美观、但是简单有效的方法,就是你在卡片里,把{{音频}}这个字段复制n次 ...
    4 B* w; m8 r/ o! s
    % G' Z' o6 |9 r2 Y1 ?4 t* m% _) `
    十分感谢!!我就准备这么做了。另外我也看到了一个帖子,也挺有意思的,与帖子无关,也可以看看学习一下。
    ; |% `9 R7 e. C7 l  w' ]+ J- U4 |! j& N# b" f6 p# @3 ~; t
    再次感谢!/ ^' M4 _) o& S- g, j' n: U

    * g- B4 n7 F/ }( W* N———————————————
    " `5 I+ z, F" m0 {: [0 D  y% l; z1 ^% \- P! `
    基本流程:1 ^4 {3 I; m) j+ ~
    • 卡负责其模板渲染: render_output% U' [; p6 E6 u; Y( l! T
        ) W; K! U, P# e2 p3 N" F6 P
      • render_into2 l' l, G: P# A7 [' A6 o8 Q' q

        " t3 b# p5 B+ m! x5 O/ C
    • 从模板解析{{tts en_US voices=Bob,Jane:Field}}并转换为[anki:tts][en_US voices=Bob,Jane]text[/anki:tts] : tts_filter
    • 从[anki:tts]转换为[anki:play:q:0] : extract_av_tags
      3 M9 a2 [: k/ R- g# h. D  V
        ) l8 s0 h5 D. h/ I+ B: L, w' @) c
      • [sound:]标签也已完成此操作
        + Z, L$ D0 R( P9 Z; E5 h4 T) l  q& J
      • 这会将其转换为AVTag的列表,并且文本表示形式引用此列表的索引。0 j- J+ S- E  e1 ]: e* q

        4 H4 Q9 r/ u6 @! t
    • AVTag的列表存储在卡中: render_card_from_context , render_card , question_av_tags
      ( Q# t! A6 l1 U' n

        / h4 f7 Y; e: ?+ d/ |' N% f
      • 列出了两个列表,一个用于问题,一个用于答案。
        # ^" T- G7 D1 F" z
        3 T" R* G+ Z: C
    • 在卡片上渲染: prepare_card_text_for_display; l& O" M" w+ C3 k

        1 T7 H' i! L) H/ o8 O
      • [anki:play]转换为svg,其调用pycmd('play:q:0') av_refs_to_play_icons
        / ]3 Q# o/ v* u+ \6 e
        9 c2 Z% Q5 q% ]- `
    • 审阅者将卡中的AVTag传递给sounds.av_player : replay_audio
    • aqt.sounds.av_player是玩家列表的抽象。 这些设置为接受AVTag ,并将其排名为setup_audio _best_player_for_tag
    • 排名逻辑: voice_for_tag
      9 _' }6 M" v9 H* `* .play在播放器上被调用,
    • 添加{{tts-voices}}字段: on_tts_voices$ f  ^; [; Y! }
  • TA的每日心情
    慵懒
    2026-4-16 20:46
  • 签到天数: 709 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-3-31 19:36:58 | 显示全部楼层
    arruno 发表于 2022-3-30 22:45- ~! ]" b, F; ]: I7 q
    那个,js对大小写敏感,你改成innerText试试。innerHTML/innerText/ ?  e" ^* R6 x% Q0 S" V2 r/ E
    另外,直接写上不可以么,如果这个占位 ...

    ' U# P. Y5 S' i! S占位符都是[sound:appppppple.mp3]的格式,我在浏览器上测试过了没有问题,anki里跑不成,其他方式也试过了,都不行. ?1 b* Y- y5 x7 Z- d! s2 L7 g

    6 r* J) P3 |& K+ R. z& z卡片HTML部分:5 j, x) t0 l  F! c+ k
    <span id="audio1" class="voice">{{音频}}</span>) R2 ?* D8 ^$ w
    <audio id="audio2" loop autoplay></audio>
    : t( n0 B6 R$ z8 ^- M, s/ ]+ L
    8 U  x  v% m3 _JS部分:
    " {6 ]/ g; ~- D% p    var str = document.getElementById("audio1").innerHTML; ' z! Q; ^# o: S9 y2 e
        var txt = str.replace("[sound:","").replace("]","");% \6 e' k) |  A3 s: ?3 w) p- M7 s
            txt = "<source src=" + txt + ">"0 C3 g/ P" ]7 h; Y6 L1 A
        document.getElementById("audio2").innerHTML = txt;
  • TA的每日心情
    慵懒
    2026-4-16 20:46
  • 签到天数: 709 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-3-31 19:15:27 | 显示全部楼层
    arruno 发表于 2022-3-30 22:45
    : M# ]' G% c$ [0 E% s' v2 Z. z! |那个,js对大小写敏感,你改成innerText试试。innerHTML/innerText
    7 e& d) Z3 |+ Q0 L" \另外,直接写上不可以么,如果这个占位 ...
    : j' W! v$ C: ]( [7 V' L
    尝试过了,不行,哎。似乎各种方法都识别不了{{音频}},似乎卡片在生成之前就已经被提取转换了。2 H# z8 e' w1 p/ U9 X# C
    8 U% c- g) {# t1 w, w4 j4 B
    头秃啊
  • TA的每日心情
    慵懒
    2026-4-16 20:46
  • 签到天数: 709 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-3-29 23:14:02 | 显示全部楼层
    本帖最后由 496147678 于 2022-3-29 23:23 编辑 # Q2 [9 N4 `$ l( x/ o
    arruno 发表于 2022-3-29 12:02
    , C$ s( |8 @% m2 W2 p没有定义id啊,document.getElementsByTagName("audio")[0].src 这样就可以

    - |$ ^- U5 i) g' ^# Z. |0 r; o1 ^+ q! K: p
    您可能没有理解我意思。
    / d$ |9 u& d* ]举个例子,我现在有一张卡片,卡片正面是apple,这张卡片是有音频的,但音频的文件名是随机的,我不清楚。我现在想让这张卡片音频循环播放,于是想到用<audio loop autoplay controls src="xxxxx.mp3">的方法,其中xxxx我不知道。于是我想提取每张卡片的音频文件的名字。  S# G9 [# P( D  i5 W
    卡片正面是这样的:
    . _9 S, `& @! v0 n<div class="section">: e+ \: X: c% g1 d" ?! x
    <div class="expression">{{单词}}</div>/ |* A$ q& M9 B3 P* o$ c
    <span id=“audio” class="voice">{{音频}}</span9 J8 i6 X" y0 k0 y9 @3 E% [& G
    </div>/ ]5 p" @. Q, k; t' l

    , A- U% e' |. k也就是我想知道  {{音频}}  的名字是什么,以便下一部操作' J+ m; y& I) x! P" t
    " L9 n- G4 }' m  z+ ?1 }2 v
    于是我尝试:; C$ G4 ~8 ^7 t" T9 o
    var price = document.getElementById("audio").innerTEXT;8 O6 W" G$ ?' ]6 p) a$ Z
    alert (price)
    0 v& \' U8 ?6 oprice返回是undefined( X4 S: z6 x% W

    % ]2 V+ @: b- [  Q4 Q1 ?您的方法我也试了,也是一样
    ; v" a* Q3 S+ U% S
    8 E5 k1 K1 m& S4 k! M很抱歉麻烦您了,您看看有什么好的建议吗
    , V! E- v, l6 v! A0 S7 v
  • TA的每日心情
    衰
    2025-5-12 16:44
  • 签到天数: 461 天

    [LV.9]以坛为家II

    发表于 2022-3-29 12:02:08 | 显示全部楼层
    <audio loop autoplay controls src="xxxxx.mp3"> 没有定义id啊,document.getElementsByTagName("audio")[0].src 这样就可以
  • TA的每日心情
    衰
    2025-5-12 16:44
  • 签到天数: 461 天

    [LV.9]以坛为家II

    发表于 2022-3-30 22:45:04 | 显示全部楼层
    那个,js对大小写敏感,你改成innerText试试。innerHTML/innerText
    0 [! ?( g% E# E+ j9 \: }另外,直接写上<audio loop autoplay controls src="{{音频}}">不可以么,如果这个占位符就是文件名本身的话,不需要再用js绕一下。
  • TA的每日心情
    衰
    2025-5-12 16:44
  • 签到天数: 461 天

    [LV.9]以坛为家II

    发表于 2022-4-1 10:46:14 | 显示全部楼层
    本帖最后由 arruno 于 2022-4-1 10:59 编辑
    2 T' R3 O! ?) _/ {, o( v
      S* n  ^+ V- n0 Q8 p. b) ?我今天抽空试试。其实有一个不那么美观、但是简单有效的方法,就是你在卡片里,把{{音频}}这个字段复制n次,它就会自动播放n次。) ?: ]( [, S, {* [4 A' M: ]* T
    比如:{{音频}}{{音频}}{{音频}} 这样就会重复3次。
    6 \- E+ c/ |# t! @! _3 j如果不能解决,至少这样可以部分实现你的需求。
    0 W7 ]6 l3 D& H8 W' d! c5 [7 u' O3 d' g3 w/ d* |
    ———————————————1 C6 @3 z. ^' I5 m  p
    看了一下,是我的疏忽,音频比较特殊,会被Anki模板引擎渲染成这样的HTML结构:/ \4 S  b! Y( \2 z7 c* i( g4 g* a
    <a class="replay-button soundLink" href="#" onclick="pycmd('play:a:0'); return false;">
    4 X6 @9 V. i0 g; i% H4 o1 N<svg class="playImage" viewBox="0 0 64 64" version="1.1">
    6 @7 C# J# Z2 I5 _8 t& E* T8 [! v<circle cx="32" cy="32" r="29"></circle>$ ~: E* n- B+ _  @2 W
    <path d="M56.502,32.301l-37.502,20.101l0.329,-40.804l37.173,20.703Z"></path>
    9 _) @3 f8 G/ M</svg>
    + ]6 f( X$ i9 G! l</a>6 q2 ?; v0 o8 b- y7 E8 i
    建议还是用上面的方法吧,可以加一个hidden属性做好看一点:  w9 q' T% K5 O( O4 Y0 V

    % `4 E9 p- m* k, Z5 q<div hidden="true">' \3 R! H' I; ?: C) j% y3 D
    {{音频}}
    1 s' Y5 O$ o* w6 C{{音频}}
    8 ]% s; i! n+ J: ?  d4 b  B6 B8 t- b1 B{{音频}}
    ( y. c, w' U- x5 k: n% W+ o</div>
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

    小黑屋|手机版|Archiver|PDAWIKI |网站地图

    GMT+8, 2026-10-24 15:36 , Processed in 0.020349 second(s), 22 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表