mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	Merge pull request #4419 from advplyr/episode-timestamps-clickable
Episode view modal makes timestamps in description clickable
This commit is contained in:
		
						commit
						cb7632b216
					
				@ -16,7 +16,7 @@
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
      <p dir="auto" class="text-lg font-semibold mb-6">{{ title }}</p>
 | 
			
		||||
      <div v-if="description" dir="auto" class="default-style less-spacing" v-html="description" />
 | 
			
		||||
      <div v-if="description" dir="auto" class="default-style less-spacing" @click="handleDescriptionClick" v-html="description" />
 | 
			
		||||
      <p v-else class="mb-2">{{ $strings.MessageNoDescription }}</p>
 | 
			
		||||
 | 
			
		||||
      <div class="w-full h-px bg-white/5 my-4" />
 | 
			
		||||
@ -68,7 +68,7 @@ export default {
 | 
			
		||||
      return this.episode.title || 'No Episode Title'
 | 
			
		||||
    },
 | 
			
		||||
    description() {
 | 
			
		||||
      return this.episode.description || ''
 | 
			
		||||
      return this.parseDescription(this.episode.description || '')
 | 
			
		||||
    },
 | 
			
		||||
    media() {
 | 
			
		||||
      return this.libraryItem?.media || {}
 | 
			
		||||
@ -94,7 +94,41 @@ export default {
 | 
			
		||||
      return this.$store.getters['libraries/getBookCoverAspectRatio']
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  methods: {},
 | 
			
		||||
  methods: {
 | 
			
		||||
    handleDescriptionClick(e) {
 | 
			
		||||
      if (e.target.matches('span.time-marker')) {
 | 
			
		||||
        const time = parseInt(e.target.dataset.time)
 | 
			
		||||
        if (!isNaN(time)) {
 | 
			
		||||
          this.$eventBus.$emit('play-item', {
 | 
			
		||||
            episodeId: this.episodeId,
 | 
			
		||||
            libraryItemId: this.libraryItem.id,
 | 
			
		||||
            startTime: time
 | 
			
		||||
          })
 | 
			
		||||
        }
 | 
			
		||||
        e.preventDefault()
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    parseDescription(description) {
 | 
			
		||||
      const timeMarkerLinkRegex = /<a href="#([^"]*?\b\d{1,2}:\d{1,2}(?::\d{1,2})?)">(.*?)<\/a>/g
 | 
			
		||||
      const timeMarkerRegex = /\b\d{1,2}:\d{1,2}(?::\d{1,2})?\b/g
 | 
			
		||||
 | 
			
		||||
      function convertToSeconds(time) {
 | 
			
		||||
        const timeParts = time.split(':').map(Number)
 | 
			
		||||
        return timeParts.reduce((acc, part, index) => acc * 60 + part, 0)
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      return description
 | 
			
		||||
        .replace(timeMarkerLinkRegex, (match, href, displayTime) => {
 | 
			
		||||
          const time = displayTime.match(timeMarkerRegex)[0]
 | 
			
		||||
          const seekTimeInSeconds = convertToSeconds(time)
 | 
			
		||||
          return `<span class="time-marker cursor-pointer text-blue-400 hover:text-blue-300" data-time="${seekTimeInSeconds}">${displayTime}</span>`
 | 
			
		||||
        })
 | 
			
		||||
        .replace(timeMarkerRegex, (match) => {
 | 
			
		||||
          const seekTimeInSeconds = convertToSeconds(match)
 | 
			
		||||
          return `<span class="time-marker cursor-pointer text-blue-400 hover:text-blue-300" data-time="${seekTimeInSeconds}">${match}</span>`
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  mounted() {}
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user