SongThumbnail.vue 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. <template>
  2. <div class="thumbnail">
  3. <div
  4. v-if="
  5. song.youtubeId &&
  6. (!song.thumbnail ||
  7. (song.thumbnail &&
  8. (song.thumbnail.lastIndexOf('notes-transparent') !==
  9. -1 ||
  10. song.thumbnail.lastIndexOf(
  11. '/assets/notes.png'
  12. ) !== -1 ||
  13. song.thumbnail.lastIndexOf('i.ytimg.com') !==
  14. -1)) ||
  15. song.thumbnail === 'empty' ||
  16. song.thumbnail == null)
  17. "
  18. class="yt-thumbnail-bg"
  19. :style="{
  20. 'background-image':
  21. 'url(' +
  22. `https://img.youtube.com/vi/${song.youtubeId}/mqdefault.jpg` +
  23. ')'
  24. }"
  25. ></div>
  26. <img
  27. v-if="
  28. song.youtubeId &&
  29. (!song.thumbnail ||
  30. (song.thumbnail &&
  31. (song.thumbnail.lastIndexOf('notes-transparent') !==
  32. -1 ||
  33. song.thumbnail.lastIndexOf(
  34. '/assets/notes.png'
  35. ) !== -1 ||
  36. song.thumbnail.lastIndexOf('i.ytimg.com') !==
  37. -1)) ||
  38. song.thumbnail === 'empty' ||
  39. song.thumbnail == null)
  40. "
  41. loading="lazy"
  42. :src="`https://img.youtube.com/vi/${song.youtubeId}/mqdefault.jpg`"
  43. onerror="this.src='/assets/notes-transparent.png'"
  44. />
  45. <img
  46. v-else
  47. loading="lazy"
  48. :src="song.thumbnail"
  49. onerror="this.src='/assets/notes-transparent.png'"
  50. />
  51. </div>
  52. </template>
  53. <script>
  54. export default {
  55. props: {
  56. song: {
  57. type: Object,
  58. default: () => {}
  59. }
  60. }
  61. };
  62. </script>
  63. <style lang="scss">
  64. .thumbnail {
  65. min-width: 130px;
  66. height: 130px;
  67. position: relative;
  68. margin-top: -15px;
  69. margin-bottom: -15px;
  70. margin-left: -10px;
  71. .yt-thumbnail-bg {
  72. height: 100%;
  73. width: 100%;
  74. position: absolute;
  75. top: 0;
  76. filter: blur(1px);
  77. background: url("/assets/notes-transparent.png") no-repeat center center;
  78. }
  79. img {
  80. height: auto;
  81. width: 100%;
  82. margin-top: auto;
  83. margin-bottom: auto;
  84. z-index: 1;
  85. position: absolute;
  86. top: 0;
  87. bottom: 0;
  88. left: 0;
  89. right: 0;
  90. }
  91. }
  92. </style>