@@ -295,3 +295,86 @@ export function seekToVerse(verseClicked) {
295295 //forces highlighting change
296296 updateTime ( ) ;
297297}
298+
299+ // This algorithm is based on the Android code in
300+ // AudioVideoFileManager::getExtractAudioProcessingTask
301+ export function getTimingForVerseRange ( verseRange : string ) {
302+ const timing = currentAudioPlayer . timing ;
303+
304+ if ( timing && timing . length > 0 ) {
305+ // Ensure the final timing has its end time set properly
306+ const lastTiming = timing [ timing . length - 1 ] ;
307+ if ( lastTiming . endtime - lastTiming . starttime < 0.01 ) {
308+ lastTiming . endtime = currentAudioPlayer . audio . duration ;
309+ }
310+ }
311+
312+ let timing1 = null ;
313+ let timing2 = null ;
314+
315+ const vs = verseRange . split ( '-' ) ;
316+ if ( vs . length === 1 ) {
317+ const verse = vs [ 0 ] ;
318+ timing1 = timing . find ( ( t ) => t . tag . includes ( verse ) ) ;
319+ timing2 = timing1 ;
320+ }
321+ const startVerse = verseRange . split ( '-' ) [ 0 ] ;
322+ const endVerse = verseRange . split ( '-' ) [ 1 ] ;
323+ const startTiming = timing . find ( ( t ) => t . tag . includes ( startVerse ) ) ;
324+ const endTiming = timing . find ( ( t ) => t . tag . includes ( endVerse ) ) ;
325+ return {
326+ start : startTiming ,
327+ end : endTiming
328+ } ;
329+ }
330+
331+ function getTimingForVerse ( timings : Array < any > , verse : string ) {
332+ const result = [ ] ;
333+ for ( let i = 0 ; i < timings . length ; i ++ ) {
334+ if ( ! isTimingForVerseRange ( timings [ i ] ) ) {
335+ // This timing is for a single verse or phrases in a verse
336+ // e.g. "4" - return timings 4a, 4b, 4c.
337+ if ( getVerseForTiming ( timings [ i ] ) === verse ) {
338+ result . push ( timings [ i ] ) ;
339+ }
340+ } else {
341+ }
342+ }
343+ }
344+
345+ function getVerseForTiming ( timing : any ) {
346+ function extractNumericalPart ( inputString ) {
347+ let numericalPart = '' ;
348+ let index = 0 ;
349+
350+ // Skip non-numerical characters at the beginning of the string
351+ while ( index < inputString . length && isNaN ( parseInt ( inputString [ index ] ) ) ) {
352+ index ++ ;
353+ }
354+
355+ // Extract numerical characters until a non-numerical character is encountered
356+ while ( index < inputString . length && ! isNaN ( parseInt ( inputString [ index ] ) ) ) {
357+ numericalPart += inputString [ index ] ;
358+ index ++ ;
359+ }
360+
361+ // Return the numerical part or null if no numerical part is found
362+ return numericalPart . length > 0 ? numericalPart : null ;
363+ }
364+
365+ return extractNumericalPart ( timing . tag ) ;
366+ }
367+
368+ function isVerseNumberInVerseRange ( verse : string , verseRange : string ) {
369+ const vs = verseRange . split ( '-' ) ;
370+ if ( vs . length === 1 ) {
371+ return verse === vs [ 0 ] ;
372+ }
373+ const startVerse = vs [ 0 ] ;
374+ const endVerse = vs [ 1 ] ;
375+ return verse >= startVerse && verse <= endVerse ;
376+ }
377+
378+ function isTimingForVerseRange ( timing : any ) {
379+ return timing . tag && timing . tag . includes ( '-' ) ;
380+ }
0 commit comments