Skip to content

Commit

Permalink
notifications, auto-updating latest releases on main menu
Browse files Browse the repository at this point in the history
  • Loading branch information
ThaUnknown committed Jan 27, 2021
1 parent ff73af9 commit 0d7f6e1
Show file tree
Hide file tree
Showing 5 changed files with 102 additions and 53 deletions.
17 changes: 14 additions & 3 deletions app/css/misc.css
Expand Up @@ -74,13 +74,18 @@ input:invalid {
cursor: pointer;
overflow: hidden;
transition: transform .2s ease;
height: 27rem !important;
box-shadow: rgba(0, 4, 12, .3) 0px 7px 15px, rgba(0, 4, 12, .05) 0px 4px 4px;
}

.gallery .card:hover {
transform: scale(1.05)
}

.gallery .day-row {
grid-column: 1 / -1;
}

#home .gallery {
padding: .7rem 4rem;
grid-template-columns: repeat(5, 50rem);
Expand Down Expand Up @@ -110,19 +115,22 @@ input:invalid {
.gallery {
display: grid;
grid-template-columns: repeat(auto-fill, 50rem);
grid-auto-rows: 27rem;
grid-auto-rows: auto;
justify-content: center;
grid-gap: 2rem;
padding: 4rem
}
#browse.loading .gallery{

#browse.loading .gallery {
overflow-y: initial !important;
}
#browse.loading{

#browse.loading {
height: 50rem !important;
position: relative;
overflow-y: hidden !important;
}

#browse.loading:after {
content: "";
position: absolute;
Expand All @@ -139,6 +147,9 @@ input:invalid {
padding: 1rem 0;
justify-content: start;
}
.gallery-sm .card{
height: 16.2rem !important
}

.pointer {
cursor: pointer
Expand Down
7 changes: 6 additions & 1 deletion app/index.html
Expand Up @@ -741,11 +741,16 @@ <h1 class="content-title font-size-22">
<h1 class="content-title font-size-22">
Other Settings
</h1>
<div class="custom-switch mb-20" data-toggle="tooltip" data-placement="top"
<div class="custom-switch mb-10" data-toggle="tooltip" data-placement="top"
data-title="Automatically Marks Episodes As Complete On AniList When You Finish Watching Them, Requires AniList Login">
<input type="checkbox" id="other2">
<label for="other2">Autocomplete Episodes</label>
</div>
<div class="custom-switch mb-20" data-toggle="tooltip" data-placement="top"
data-title="Sends A Notification When A New Episode Is Released">
<input type="checkbox" id="other3">
<label for="other3">Release Notifications</label>
</div>
</div>
</div>

Expand Down
72 changes: 33 additions & 39 deletions app/js/animeHandler.js
Expand Up @@ -675,56 +675,50 @@ async function resolveFileMedia(opts) {
return { media: media, episode: episode, parseObject: elems }
}

let store = JSON.parse(localStorage.getItem("store")) || {},
lastResult
let store = JSON.parse(localStorage.getItem("store")) || {}

async function releasesRss(limit) {
let frag = document.createDocumentFragment(),
url
function getRSSurl() {
if (Object.values(torrent4list.options).filter(item => item.value == settings.torrent4)[0]) {
//add my own cors proxy for erai
url = settings.torrent4 == "Erai-raws" ? new URL(Object.values(torrent4list.options).filter(item => item.value == settings.torrent4)[0].innerHTML + settings.torrent1 + "-magnet") : new URL(Object.values(torrent4list.options).filter(item => item.value == settings.torrent4)[0].innerHTML + settings.torrent1)
return settings.torrent4 == "Erai-raws" ? new URL(Object.values(torrent4list.options).filter(item => item.value == settings.torrent4)[0].innerHTML + settings.torrent1 + "-magnet") : new URL(Object.values(torrent4list.options).filter(item => item.value == settings.torrent4)[0].innerHTML + settings.torrent1)
} else {
url = settings.torrent4 + settings.torrent1 // add custom RSS
return settings.torrent4 + settings.torrent1 // add custom RSS
}
let res = await fetch(url)
await res.text().then(async (xmlTxt) => {
try {
let doc = DOMPARSER(xmlTxt, "text/xml")
if (lastResult != doc) {
lastResult = doc
let items = doc.querySelectorAll("item"),
mediaItems = []
for (let l = 0; l < (limit || items.length); l++) {
let i = items[l].querySelector.bind(items[l])
mediaItems.push(resolveFileMedia({ fileName: i("title").innerHTML, method: "SearchName", isRelease: true }))
}
await Promise.all(mediaItems).then(results => {
results.forEach((mediaInformation, index) => {
let o = items[index].querySelector.bind(items[index])
template = cardCreator(mediaInformation)
template.onclick = async () => {
addTorrent(o('link').innerHTML, { media: mediaInformation.media, episode: mediaInformation.episode })
store[mediaInformation.parseObject.anime_title] = await alRequest({ id: mediaInformation.media.id, method: "SearchIDSingle" }).then(res => res.data.Media)
// force updates entry data on play in case its outdated, needs to be made cleaner and somewhere else...
}
frag.appendChild(template)
})
})
}
async function releasesCards(items, frag, limit) {
console.log(items, frag, limit)
let mediaItems = []
for (let l = 0; l < (limit || items.length); l++) {
let i = items[l].querySelector.bind(items[l])
mediaItems.push(resolveFileMedia({ fileName: i("title").innerHTML, method: "SearchName", isRelease: true }))
}
await Promise.all(mediaItems).then(results => {
results.forEach((mediaInformation, index) => {
let o = items[index].querySelector.bind(items[index])
template = cardCreator(mediaInformation)
template.onclick = async () => {
addTorrent(o('link').innerHTML, { media: mediaInformation.media, episode: mediaInformation.episode })
store[mediaInformation.parseObject.anime_title] = await alRequest({ id: mediaInformation.media.id, method: "SearchIDSingle" }).then(res => res.data.Media)
// force updates entry data on play in case its outdated, needs to be made cleaner and somewhere else...
}
frag.appendChild(template)
})
})
localStorage.setItem("store", JSON.stringify(store))
}
async function releasesRss(limit) {
let frag = document.createDocumentFragment()
await fetch(getRSSurl()).then(res => res.text().then(async xmlTxt => {
try {
let doc = DOMPARSER(xmlTxt, "text/xml"),
items = doc.querySelectorAll("item")
await releasesCards(items, frag, limit)
} catch (e) {
console.error(e)
}
})
localStorage.setItem("store", JSON.stringify(store))
}))
return frag
}
//latest releases auto-update
// setInterval(() => {
// if (document.location.hash == "#releases") {
// releasesRss()
// }
// }, 30000);
let alID // login icon
async function loadAnime() {
// await searchAnime()
Expand Down
53 changes: 44 additions & 9 deletions app/js/interface.js
Expand Up @@ -6,7 +6,7 @@ async function loadHomePage() {
continue: async function (page) {
if (!page) gallerySkeleton(browseGallery)
let res = await alRequest({ method: "UserLists", status_in: "CURRENT", id: alID, page: page || 1 })
galleryAppend({ media: res.data.Page.mediaList.map(i => i.media), gallery: browseGallery, method: "continue", page: page || 1, schedule: true})
galleryAppend({ media: res.data.Page.mediaList.map(i => i.media), gallery: browseGallery, method: "continue", page: page || 1 })
},
releases: async function () {
gallerySkeleton(browseGallery)
Expand Down Expand Up @@ -46,12 +46,36 @@ async function loadHomePage() {
homePreviewFunctions = {
continue: async function () {
let res = await alRequest({ method: "UserLists", status_in: "CURRENT", id: alID, perPage: 4 })
galleryAppend({ media: res.data.Page.mediaList.map(i => i.media), gallery: homeContinue, schedule: true })
galleryAppend({ media: res.data.Page.mediaList.map(i => i.media), gallery: homeContinue })
},
releases: async function () {
let frag = await releasesRss(4)
homeReleases.innerHTML = ''
homeReleases.appendChild(frag)
releases: async function () { // this could be cleaner, but oh well
await fetch(getRSSurl()).then(res => res.text().then(async xmlTxt => {
let doc = DOMPARSER(xmlTxt, "text/xml"),
pubDate = doc.querySelector("pubDate").innerHTML
if (lastRSSDate != pubDate) {
if (lastRSSDate) {
homeReleases.innerHTML = ''
homeReleases.appendChild(gallerySkeletonFrag(4))
resolveFileMedia({ fileName: doc.querySelector("item").querySelector("title").innerHTML, method: "SearchName", isRelease: true }).then(mediaInformation => {
let notification = new Notification('A New Episode Was Released!', {
body: `Episode ${mediaInformation.episode} of ${mediaInformation.media.title.userPrefered} Was Just Released!`,
icon: mediaInformation.media.coverImage.medium
});
notification.onclick = async () => {
window.parent.focus();
addTorrent(doc.querySelector("item").querySelector("link").innerHTML, { media: mediaInformation.media, episode: mediaInformation.episode })
store[mediaInformation.parseObject.anime_title] = await alRequest({ id: mediaInformation.media.id, method: "SearchIDSingle" }).then(res => res.data.Media)
}
})
}
let frag = document.createDocumentFragment()
lastRSSDate = pubDate
await releasesCards(doc.querySelectorAll("item"), frag, 4)
homeReleases.innerHTML = ''
homeReleases.appendChild(frag)
}
}))
setTimeout(homePreviewFunctions["releases"], 30000)
},
planning: async function () {
let res = await alRequest({ method: "UserLists", status_in: "PLANNING", id: alID, perPage: 4 })
Expand All @@ -70,14 +94,16 @@ async function loadHomePage() {
galleryAppend({ media: res.data.Page.media, gallery: homeAction })
}
},
loadTimeout,
gallerySkeletonFrag = function (limit) {
let frag = document.createDocumentFragment()
for (let i = 0; i < limit; i++) {
frag.appendChild(cardCreator({}))
}
return frag
}
},
loadTimeout,
lastDate,
lastRSSDate

function gallerySkeleton(gallery) {
browse.classList.add("loading")
Expand All @@ -94,8 +120,16 @@ async function loadHomePage() {
if (!opts.page || opts.page == 1) {
opts.gallery.innerHTML = '';
}
let frag = document.createDocumentFragment()
let frag = document.createDocumentFragment(),
date = new Date()
opts.media.forEach(media => {
if (opts.schedule && (!lastDate || (new Date(+date + media.nextAiringEpisode.timeUntilAiring * 1000).getDay() != lastDate.getDay()))) {
let div = document.createElement("div")
lastDate = new Date(+date + media.nextAiringEpisode.timeUntilAiring * 1000)
div.classList.add("day-row", "font-size-24", "font-weight-bold", "h-50", "d-flex", "align-items-end")
div.innerHTML = lastDate.toLocaleDateString("en-US", { weekday: 'long' })
frag.appendChild(div)
}
let template = cardCreator({ media: media, schedule: opts.schedule })
template.onclick = () => viewAnime(media)
frag.appendChild(template)
Expand All @@ -116,6 +150,7 @@ async function loadHomePage() {
}
}
navHome.onclick = () => {
lastRSSDate = undefined
for (let item of homePreviewElements) {
item.innerHTML = ''
item.appendChild(gallerySkeletonFrag(4))
Expand Down
6 changes: 5 additions & 1 deletion app/js/settingsHandler.js
@@ -1,5 +1,5 @@
const settingsElements = [
volume, player2, player3, player5, player6, player8, player10, subtitle1, subtitle3, torrent1, torrent2, torrent3, torrent4, torrent5, torrent6, torrent9, other2
volume, player2, player3, player5, player6, player8, player10, subtitle1, subtitle3, torrent1, torrent2, torrent3, torrent4, torrent5, torrent6, torrent9, other2, other3
]
setRes.addEventListener("click", restoreDefaults)
settingsTab.addEventListener("click", applySettingsTimeout)
Expand Down Expand Up @@ -50,6 +50,10 @@ clearRelCache.onclick = () => {
}
renderSettings()

other3.onclick = () => {
Notification.requestPermission().then(perm => perm == "denied" ? other3.checked = false : "")
}

let searchParams = new URLSearchParams(location.href)
if (searchParams.get("access_token")) {
localStorage.setItem("ALtoken", searchParams.get("access_token"))
Expand Down

0 comments on commit 0d7f6e1

Please sign in to comment.