From 579d78ba434059eb5d8012e07c2227554d4969b7 Mon Sep 17 00:00:00 2001 From: Gabe Farrell Date: Tue, 10 Dec 2024 02:15:24 -0500 Subject: [PATCH] infinite scrolling fixed --- bun.lockb | Bin 179808 -> 182107 bytes index.html | 2 +- package.json | 2 + src/App.vue | 34 ++- src/components/EpisodeThumb.vue | 74 ++++++ src/components/HomeMedia.vue | 14 +- src/components/LatestMedia.vue | 24 +- src/components/MediaGrid.vue | 74 ++++-- src/components/MediaScroller.vue | 27 +- src/components/NextUp.vue | 15 +- src/components/ScrollerItemLandscape.vue | 101 +++----- src/components/ScrollerItemPortrait.vue | 119 +++------ src/feed.ts | 312 +---------------------- src/jfapi.ts | 184 +++++++++++-- src/router/index.ts | 17 ++ src/{components => }/utils.ts | 0 src/views/BrowseView.vue | 30 ++- src/views/ItemView.vue | 253 +++++++++++++----- src/views/LoginView.vue | 4 +- src/views/VideoView.vue | 42 +++ 20 files changed, 664 insertions(+), 664 deletions(-) create mode 100644 src/components/EpisodeThumb.vue rename src/{components => }/utils.ts (100%) create mode 100644 src/views/VideoView.vue diff --git a/bun.lockb b/bun.lockb index b401fecde8539c37bca4e2de52f7df678d4ec8f9..7bba183d0d88f427ac3c4b72b4f479e3b3b4ced9 100755 GIT binary patch delta 33691 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 delta 32522 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 PM7!^{xv;% Vite App diff --git a/package.json b/package.json index f3929ca..4ef70ef 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,8 @@ "@fortawesome/free-solid-svg-icons": "^6.7.1", "@fortawesome/vue-fontawesome": "^3.0.8", "@jellyfin/sdk": "^0.11.0", + "@vueuse/components": "^12.0.0", + "hls.js": "^1.5.17", "pinia": "^2.2.6", "vue": "^3.5.13", "vue-router": "^4.4.5" diff --git a/src/App.vue b/src/App.vue index 7d758fb..43967c3 100644 --- a/src/App.vue +++ b/src/App.vue @@ -2,6 +2,7 @@ import { RouterLink, RouterView } from 'vue-router' import { ref } from 'vue' import jfapi from './jfapi' +import { OnClickOutside } from '@vueuse/components' const menuOpen = ref(false) const logout = () => { @@ -14,18 +15,27 @@ const logout = () => { } @@ -40,8 +50,8 @@ const logout = () => { .menu-toggle { position: absolute; - top: 30px; - left: 30px; + top: 20px; + left: 20px; } .menu-toggle:hover { cursor: pointer; diff --git a/src/components/EpisodeThumb.vue b/src/components/EpisodeThumb.vue new file mode 100644 index 0000000..28ce588 --- /dev/null +++ b/src/components/EpisodeThumb.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/src/components/HomeMedia.vue b/src/components/HomeMedia.vue index 87cfc14..8338345 100644 --- a/src/components/HomeMedia.vue +++ b/src/components/HomeMedia.vue @@ -3,25 +3,21 @@ import type { View } from '@/jfapi' import NextUp from './NextUp.vue' import LatestMedia from './LatestMedia.vue' import { onBeforeMount, ref } from 'vue' - -// const props = defineProps<{ -// views: View[] -// }>() +import jfapi from '@/jfapi' const views = ref() const viewstring = ref('') views.value = undefined onBeforeMount(() => { viewstring.value = localStorage.getItem('jf_views') - views.value = JSON.parse(viewstring.value ? viewstring.value : '') + views.value = JSON.parse(viewstring.value) }) -console.log('HomeMedia =>', views.value) diff --git a/src/components/LatestMedia.vue b/src/components/LatestMedia.vue index 6e88be5..4ee3f6c 100644 --- a/src/components/LatestMedia.vue +++ b/src/components/LatestMedia.vue @@ -3,7 +3,7 @@ import jfapi from '@/jfapi' import MediaScroller from './MediaScroller.vue' import type { FeedItem } from '@/feed' import type { View } from '@/jfapi' -import { getDisplayDuration, getImageLink } from './utils' +import { getDisplayDuration, getImageLink } from '../utils' const props = defineProps<{ view: View @@ -17,29 +17,22 @@ const Items = async (): Promise => { if (data !== null) { console.log(data) for (const item of data) { - const summary = '' if (userid === null) { window.location.href = '/login' } - // const fullitem = await jfapi.GetItem(userid, item.Id) - // if (fullitem === null) { - // continue - // } else { - // summary = fullitem.Overview - // } feed.push({ title: item.SeriesName || item.Name, subtext: item.SeriesName ? `S${item.ParentIndexNumber}:E${item.IndexNumber} - ${item.Name}` : String(item.ProductionYear), image: getImageLink(item), - summary: summary, - // infoSubtext: item.SeriesName - // ? `S${item.ParentIndexNumber}:E${item.IndexNumber} - ${item.Name}` - // : fullitem.OriginalTitle != item.Name - // ? fullitem.OriginalTitle - // : '', - infoSubtext: '', + summary: item.Overview, + infoSubtext: + item.Type === 'Episode' + ? `S${item.ParentIndexNumber}:E${item.IndexNumber} - ${item.Name}` + : item.OriginalTitle != item.Name + ? item.OriginalTitle + : '', imdbRating: String(item.CommunityRating), runtime: getDisplayDuration(item.RunTimeTicks), date: String(item.ProductionYear), @@ -49,6 +42,7 @@ const Items = async (): Promise => { ? String(item.UserData.UnplayedItemCount) : '', itemId: item.Id, + type: item.Type, }) } console.log('LatestMedia.vue =>', feed) diff --git a/src/components/MediaGrid.vue b/src/components/MediaGrid.vue index 7d8ef82..9716f3a 100644 --- a/src/components/MediaGrid.vue +++ b/src/components/MediaGrid.vue @@ -1,25 +1,32 @@ diff --git a/src/views/ItemView.vue b/src/views/ItemView.vue index 1472dcd..043428f 100644 --- a/src/views/ItemView.vue +++ b/src/views/ItemView.vue @@ -1,8 +1,9 @@ + + + +