summaryrefslogtreecommitdiff
path: root/animism-align/frontend/app/utils/annotation.utils.js
blob: 3afd096ac94158ec0247b80010b11768d418ca18 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
import { clamp, timestampToSeconds } from 'app/utils'

export const annotationFadeTimings = annotation => {
  const fadeInDuration = timestampToSeconds(annotation.settings.fade_in_duration || '0') || 0.0
  const fadeOutDuration = timestampToSeconds(annotation.settings.fade_out_duration || '0') || 0.0
  const duration = timestampToSeconds(annotation.settings.duration || '0') || 0.1

  const start_ts = annotation.start_ts
  const end_ts = start_ts + duration
  const fade_in_end_ts = start_ts + fadeInDuration
  const fade_out_start_ts = end_ts - fadeOutDuration

  return {
    fadeInDuration, fadeOutDuration, duration,
    start_ts, end_ts, fade_in_end_ts, fade_out_start_ts,
  }
}

export const thumbnailURL = media => {
  let image_id
  // console.log(media)
  switch (media.type) {
    case 'video':
      if (media.settings.poster) {
        return media.settings.poster.url
      }
      return media.settings.video.thumbnail_url

    case 'image':
      return media.settings.thumbnail.url

    case 'gallery':
      if (media.settings.thumbnail) {
        return media.settings.thumbnail.url
      }
      if (!media.settings.image_order || !media.settings.image_order.length) {
        return null
      }
      image_id = media.settings.image_order[0]
      return media.settings.thumbnail_lookup[image_id].url

    default:
      return null
  }
}

export const displayThumbnailURL = media => {
  if (!media) return null
  let image_id
  switch (media.type) {
    case 'video':
      if (media.settings.poster) {
        return media.settings.poster.url
      }
      return media.settings.video.thumbnail_url

    case 'image':
      return media.settings.display.url

    case 'gallery':
      if (media.settings.display) {
        return media.settings.display.url
      }
      if (media.settings.thumbnail) {
        return media.settings.thumbnail.url
      }
      if (!media.settings.image_order || !media.settings.image_order.length) {
        return null
      }
      image_id = media.settings.image_order[0]
      return media.settings.display_lookup[image_id].url

    default:
      return null
  }
}

export const displayElementImageURL = (element, mediaItem) => {
  // console.log(element, mediaItem)
  if (!element || !mediaItem) return null
  if (mediaItem.type === 'gallery') {
    const index = parseInt(element.settings.frame_index)
    const frame_id = mediaItem.settings.image_order[index]
    const frame = mediaItem.settings.display_lookup[frame_id]
    if (!frame) {
      console.error("Slide not found:", element.settings.frame_index)
      return null
    }
    return frame.url
  }
  return mediaItem.settings.display.url
}

// list all full-size images URLs for the vitrine
export const galleryFullsizeImageURLS = media => {
  const { image_order, image_lookup, display_lookup } = media.settings
  return image_order.map(id => (
    display_lookup[id] || image_lookup[id]
  )).map(img => img.url)
}

export const posterURL = media => {
  if (!media.settings.video) return null
  if (media.settings.poster) return media.settings.poster.url
  return media.settings.video.thumbnail_url
}

export const sectionProgress = (section, play_ts) => {
  return (clamp(play_ts, section.start_ts, section.end_ts) - section.start_ts) / section.duration
}

export const sectionProgressPercentage = (section, play_ts) => {
  return (Math.round(sectionProgress(section, play_ts) * 2000) / 20) + '%'
}

export const makeMediaItems = (media, types) => {
  const { lookup, order } = media
  if (types instanceof String) {
    types = new Set([ types ])
  } else if (!(types instanceof Set)) {
    types = new Set(types)
  }
  const listItems = order.filter(id => types.has(lookup[id].type)).map(id => {
    const { title, author, type } = lookup[id]
    return {
      name: id,
      label: '[' + type + '] ' + author + ' - ' + title
    }
  }).sort((a,b) => a.label.localeCompare(b.label))
  return listItems
}

export const makeGalleryItems = (annotation, media) => {
  if (!annotation.settings.media_id) return {}
  if (!media.lookup[annotation.settings.media_id]) return {}
  let thumbnail, frame_id
  const item = media.lookup[annotation.settings.media_id]
  if (item.type !== 'gallery') return {}
  const gallery_items = item.settings.image_order.map((id, index) => {
    const caption = item.settings.caption_lookup && item.settings.caption_lookup[id]
    // console.log(caption)
    return {
      name: index,
      label: (index + 1) + ") " + (caption ? (caption.title || "") : "")
    }
  })
  if (annotation.settings.frame_index) {
    frame_id = item.settings.image_order[annotation.settings.frame_index]
    thumbnail = item.settings.thumbnail_lookup[frame_id]
  }
  return { item, gallery_items, frame_id, thumbnail }
}