掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 2502|回复: 7

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

[复制链接]
  • TA的每日心情
    无聊
    7 天前
  • 签到天数: 669 天

    [LV.9]以坛为家II

    发表于 2022-3-28 15:07:02 | 显示全部楼层 |阅读模式
    本帖最后由 496147678 于 2022-3-28 15:09 编辑 ' ^' s0 c% i2 |

    / F$ P& e. z# a# X想用
    ( ]! p' a: ^* L1 t* e1 i<audio loop autoplay controls src="xxxxx.mp3">的方式完成音频无限制自动循环播放4 [* ?# e) g- [/ H% D* Y

    0 n; g4 X: \! a) N9 \" n于是想提取 xxxxx 的内容1 u& @9 R2 F: \( g
    , a# h" @2 M8 |- K, r
    var price = document.getElementById("audio").innerTEXT;  K% Y( p& Z8 U7 O- s  g2 q1 N3 h# @
    alert (price)" Q, _  q: N7 e- w3 O0 d

    / J7 m1 M+ X" J9 t4 x. ]3 m$ G但是并不可行,想破脑袋,不知道有什么解决方法% [3 y2 A& @! F0 F
    9 S% m+ I5 k. u8 n; M
    已经定义了 音频的 id=audio$ F9 i0 X5 Q" q1 Y$ n: {4 U! v0 m) `
    price反馈的结果是空白
    $ q  L: g; M9 `8 g( ]' ^0 g- `& S, S2 T" d) Z! C* x# ~
    用这个方法去弄expression,也就是{{正面}},是可行的
  • TA的每日心情
    无聊
    7 天前
  • 签到天数: 669 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-4-1 20:27:38 | 显示全部楼层
    arruno 发表于 2022-4-1 10:46# s3 q7 i( w* D7 d0 v
    我今天抽空试试。其实有一个不那么美观、但是简单有效的方法,就是你在卡片里,把{{音频}}这个字段复制n次 ...

    ; q5 a# a/ [: ^5 m8 z3 l- {2 k  F0 S; v, s7 F
    十分感谢!!我就准备这么做了。另外我也看到了一个帖子,也挺有意思的,与帖子无关,也可以看看学习一下。
    0 b5 L% n7 s$ P) `- J' V' z; A& |+ B  h# a
    再次感谢!
    % ]: W3 m  p7 r8 f" U' q! s; W+ D1 F) n  ^7 J
    ———————————————
    9 X5 b+ Z1 o- j: B( |4 f1 [$ `0 U; }
    基本流程:
    ' L( i% b# \3 [$ M, m4 h
    • 卡负责其模板渲染: render_output
      . b$ K, y) I' j

        7 m# `7 P9 Z, f' w3 P4 C: r
      • render_into
        3 c8 W" _) \) f8 `' Q+ n
        - X  B$ }+ \7 C9 e2 R% Z
    • 从模板解析{{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. P; {9 y$ w% G6 a

        * K8 E- P7 E% F
      • [sound:]标签也已完成此操作, P' s+ P5 y- E$ @- x* I. k7 \
      • 这会将其转换为AVTag的列表,并且文本表示形式引用此列表的索引。
          Y% M8 |4 c/ U9 N  w# r0 s! L1 g! m) V) H3 s9 ^9 b3 D
    • AVTag的列表存储在卡中: render_card_from_contextrender_cardquestion_av_tags( ]# X: A  B) }- w3 @
        . s- F9 q  l: U* T$ {4 y& z
      • 列出了两个列表,一个用于问题,一个用于答案。/ y4 b% q; l5 D" u) Y7 i

        & a# l4 Q# B, T+ w# Y+ K
    • 在卡片上渲染: prepare_card_text_for_display( @$ H, S5 m+ E6 [

        ( c7 ~* z- U( z/ c
      • [anki:play]转换为svg,其调用pycmd('play:q:0') av_refs_to_play_icons
        8 L. U# H3 H: f0 M2 M# `9 i2 C7 J* X" d; m5 {4 l2 A* u, X' s: w; K# B4 y/ q
    • 审阅者将卡中的AVTag传递给sounds.av_player : replay_audio
    • aqt.sounds.av_player是玩家列表的抽象。 这些设置为接受AVTag ,并将其排名为setup_audio _best_player_for_tag
    • 排名逻辑: voice_for_tag) o4 M3 V8 N9 N$ e' ~
      * .play在播放器上被调用,
    • 添加{{tts-voices}}字段: on_tts_voices
      . o, t8 R  S; b
  • TA的每日心情
    无聊
    7 天前
  • 签到天数: 669 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-3-31 19:36:58 | 显示全部楼层
    arruno 发表于 2022-3-30 22:45
    2 x; m$ o1 U" k% R4 r) D1 n那个,js对大小写敏感,你改成innerText试试。innerHTML/innerText
    ! l; }% h3 ]; k- [另外,直接写上不可以么,如果这个占位 ...
    ' x9 L5 k; [+ t- S0 x
    占位符都是[sound:appppppple.mp3]的格式,我在浏览器上测试过了没有问题,anki里跑不成,其他方式也试过了,都不行: P6 K! n7 c: D1 M
    # \  H. d& ~8 H0 B
    卡片HTML部分:9 Y. `/ ?5 }) b9 e
    <span id="audio1" class="voice">{{音频}}</span>+ w! N7 I, a2 v
    <audio id="audio2" loop autoplay></audio>* _" e5 X6 r) D' W! k

    , F% |; v' n# b& B8 i/ @( w! pJS部分:& j6 o6 F4 `8 h9 q  ?
        var str = document.getElementById("audio1").innerHTML;
    0 m; |. c7 a! c9 t    var txt = str.replace("[sound:","").replace("]","");1 h" P+ V, i3 S1 K# a
            txt = "<source src=" + txt + ">"# }4 K  s; F9 |1 w% H8 r
        document.getElementById("audio2").innerHTML = txt;
  • TA的每日心情
    无聊
    7 天前
  • 签到天数: 669 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-3-31 19:15:27 | 显示全部楼层
    arruno 发表于 2022-3-30 22:45
    4 ~+ f2 y8 ]+ L- T9 x* H/ c2 |# c: `那个,js对大小写敏感,你改成innerText试试。innerHTML/innerText  J1 p$ \) s1 S
    另外,直接写上不可以么,如果这个占位 ...

    ; Z3 j8 b2 }/ _% l# t. E, ?尝试过了,不行,哎。似乎各种方法都识别不了{{音频}},似乎卡片在生成之前就已经被提取转换了。
    & x( E: d" M" `$ Y9 ?) c8 K) m: Z; u; e
    头秃啊
  • TA的每日心情
    无聊
    7 天前
  • 签到天数: 669 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-3-29 23:14:02 | 显示全部楼层
    本帖最后由 496147678 于 2022-3-29 23:23 编辑
    # k4 A) e" L4 C  r6 a
    arruno 发表于 2022-3-29 12:02: v- M+ R5 j# i1 m, v
    没有定义id啊,document.getElementsByTagName("audio")[0].src 这样就可以

    * M0 e& l& H0 f. X' a* _  ?0 R" v  K( K+ X5 R4 E$ t# f% d
    您可能没有理解我意思。
    ! J1 B& J" o7 t4 Y& |' l举个例子,我现在有一张卡片,卡片正面是apple,这张卡片是有音频的,但音频的文件名是随机的,我不清楚。我现在想让这张卡片音频循环播放,于是想到用<audio loop autoplay controls src="xxxxx.mp3">的方法,其中xxxx我不知道。于是我想提取每张卡片的音频文件的名字。
    0 s% f9 W- f9 A1 @2 t+ f" t, v卡片正面是这样的:
    / \6 ~" q! w4 Z. H' M( q8 x<div class="section">
    3 w4 A6 t7 f$ C# f% D! E<div class="expression">{{单词}}</div>; A, `3 L. k0 j# E6 Y
    <span id=“audio” class="voice">{{音频}}</span
    6 n: m8 C/ m$ Z! v' H</div>
    , r. U( l/ n! [1 o* f8 a7 M. d
    ( d+ H6 D4 u( M& |% f6 _也就是我想知道  {{音频}}  的名字是什么,以便下一部操作6 Q- @6 m4 J) v; ]
    5 l4 w, c' @% z: j- A& p1 x; h
    于是我尝试:' i" L( Z0 U4 u  Q6 M; v& j; s4 o1 m
    var price = document.getElementById("audio").innerTEXT;/ O) [$ C- I; t! t' S) H# a
    alert (price)
      M3 H/ {8 ~6 J1 }7 V% F( v$ \price返回是undefined
    2 [2 L& _. G6 c7 v8 n9 L* i0 t: T! d5 ^0 O7 c% {" f- v8 H5 r4 D! O& a
    您的方法我也试了,也是一样
    1 Q8 U! E! b; R0 g; B3 L
    $ I  W* ]( c: l2 D% P3 A) ]很抱歉麻烦您了,您看看有什么好的建议吗) m- |, J, Y, {4 o- X
  • TA的每日心情
    开心
    2024-8-23 08:38
  • 签到天数: 459 天

    [LV.9]以坛为家II

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

    [LV.9]以坛为家II

    发表于 2022-3-30 22:45:04 | 显示全部楼层
    那个,js对大小写敏感,你改成innerText试试。innerHTML/innerText1 v8 s, y9 g  Q$ v3 i' ^# g# m
    另外,直接写上<audio loop autoplay controls src="{{音频}}">不可以么,如果这个占位符就是文件名本身的话,不需要再用js绕一下。
  • TA的每日心情
    开心
    2024-8-23 08:38
  • 签到天数: 459 天

    [LV.9]以坛为家II

    发表于 2022-4-1 10:46:14 | 显示全部楼层
    本帖最后由 arruno 于 2022-4-1 10:59 编辑
    1 G; ~- i: |* t; J* \0 V' ]
      i1 q6 }2 |9 X我今天抽空试试。其实有一个不那么美观、但是简单有效的方法,就是你在卡片里,把{{音频}}这个字段复制n次,它就会自动播放n次。
    ! d# A2 E. m  z比如:{{音频}}{{音频}}{{音频}} 这样就会重复3次。
    - q* h! [. F+ U# _4 w& z# W如果不能解决,至少这样可以部分实现你的需求。
    5 `5 [8 K- x, l8 F9 x" M; Y9 S% S" M1 m2 Z* ^* ?3 I; }1 S
    ———————————————
    3 t; Q$ S/ U9 u/ [% @看了一下,是我的疏忽,音频比较特殊,会被Anki模板引擎渲染成这样的HTML结构:. Y3 o- f( T8 H5 h1 M7 F& M, l
    <a class="replay-button soundLink" href="#" onclick="pycmd('play:a:0'); return false;">
    6 \  L2 _+ |9 V6 h1 ^<svg class="playImage" viewBox="0 0 64 64" version="1.1">
    " t: C9 v1 i: v7 Z' ~<circle cx="32" cy="32" r="29"></circle>
    ( A" S, _: N+ c2 [# X<path d="M56.502,32.301l-37.502,20.101l0.329,-40.804l37.173,20.703Z"></path>
    ' M8 o2 @) ~$ W</svg>
    5 R! @6 y# |2 H$ w</a>
    ( K) W4 d; y6 M4 ^建议还是用上面的方法吧,可以加一个hidden属性做好看一点:
    , z# l6 t# Z1 p0 }7 j8 O4 l8 ~! k
    + `: L5 t7 q" u+ s) s+ R5 [! Y<div hidden="true">- j5 G' m: i4 F1 l0 `
    {{音频}}
    7 q3 P% d: S. C- c4 b, [{{音频}}
    % C( E( h3 w: |0 a4 s# y1 H8 k{{音频}}
    ( x; R8 G1 |& c4 w! p  d! P</div>
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

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

    GMT+8, 2025-5-5 02:18 , Processed in 0.021707 second(s), 22 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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