SongThumbnail.vue 2.0 KB

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