diff --git a/app/filters.py b/app/filters.py
index f1ec19e..c4ff498 100644
--- a/app/filters.py
+++ b/app/filters.py
@@ -3,7 +3,8 @@ import re
from markupsafe import Markup
from app.classes import AudioProfile
-from app import app
+from app import app, functions, read_dev_build_file
+from .version import __version__
filters = {}
@@ -55,6 +56,37 @@ def audioprofile(text: str, path: str) -> Markup:
)
return Markup(audio_profile_html)
+@template_filter('version_check')
+def version_check(version: str) -> Markup:
+ version = f"{__version__}{read_dev_build_file()}"
+ # if version contains a dash and the text after the dash is LOCAL, return version as a blue badge
+ if app.config['CHECK_FOR_UPDATES']:
+ if '-' in version and version.split('-')[1] == 'LOCAL':
+ return Markup(f"{version}")
+ # else if the version string contains a dash and the text after the dash is not LOCAL, check whether it contains another dash (like in e.g. v0.1.7-dev-89a1bc2) and split both parts
+ elif '-' in version and version.split('-')[1] != 'LOCAL' :
+ branch, commit_sha = version.split('-')[1], version.split('-')[2]
+ nra,url = functions.get_latest_dev_releases(branch_name = branch, commit_sha = commit_sha)
+ if nra:
+ return Markup(f"{version}")
+ else:
+ return Markup(f"{version}")
+ else:
+ nra,url = functions.get_latest_release(version)
+ if nra:
+ return Markup(f"{version}")
+
+
+ return Markup(f"{version}")
+ else:
+ return Markup(f"{version}")
+
+
+
+
+
+
+
@template_filter('jellyfin_link')
def jellyfin_link(jellyfin_id: str) -> Markup:
diff --git a/app/functions.py b/app/functions.py
index f82805a..ea9ce53 100644
--- a/app/functions.py
+++ b/app/functions.py
@@ -206,4 +206,42 @@ def get_longest_substring(input_string):
pattern = "[" + re.escape("".join(special_chars)) + "]"
substrings = re.split(pattern, input_string)
longest_substring = max(substrings, key=len, default="")
- return longest_substring
\ No newline at end of file
+ return longest_substring
+
+@cache.memoize(timeout=3600*2)
+def get_latest_dev_releases(branch_name :str, commit_sha : str):
+ try:
+ response = requests.get('https://api.github.com/repos/kamilkosek/jellyplist/releases')
+ if response.status_code == 200:
+ data = response.json()
+ latest_release = None
+ for release in data:
+ if branch_name in release['tag_name']:
+ if latest_release is None or release['published_at'] > latest_release['published_at']:
+ latest_release = release
+
+ if latest_release:
+ response = requests.get(f'https://api.github.com/repos/kamilkosek/jellyplist/git/ref/tags/{latest_release["tag_name"]}')
+ if response.status_code == 200:
+ data = response.json()
+ if commit_sha != data['object']['sha'][:7]:
+ return True, latest_release['html_url']
+
+
+ return False, ''
+ except requests.exceptions.RequestException as e:
+ app.logger.error(f"Error fetching latest version: {str(e)}")
+ return False, ''
+
+@cache.memoize(timeout=3600*2)
+def get_latest_release(tag_name :str):
+ try:
+ response = requests.get('https://api.github.com/repos/kamilkosek/jellyplist/releases/latest')
+ if response.status_code == 200:
+ data = response.json()
+ if data['tag_name'] != tag_name:
+ return True, data['html_url']
+ return False, ''
+ except requests.exceptions.RequestException as e:
+ app.logger.error(f"Error fetching latest version: {str(e)}")
+ return False,''
\ No newline at end of file
diff --git a/config.py b/config.py
index 7f254c7..b996c99 100644
--- a/config.py
+++ b/config.py
@@ -32,7 +32,7 @@ class Config:
LIDARR_URL = os.getenv('LIDARR_URL','')
LIDARR_MONITOR_ARTISTS = os.getenv('LIDARR_MONITOR_ARTISTS','false').lower() == 'true'
MUSIC_STORAGE_BASE_PATH = os.getenv('MUSIC_STORAGE_BASE_PATH')
-
+ CHECK_FOR_UPDATES = os.getenv('CHECK_FOR_UPDATES','true').lower() == 'true'
# SpotDL specific configuration
SPOTDL_CONFIG = {
'cookie_file': '/jellyplist/cookies.txt',
diff --git a/static/css/styles.css b/static/css/styles.css
index 3c1e918..7425b90 100644
--- a/static/css/styles.css
+++ b/static/css/styles.css
@@ -3,16 +3,18 @@ body {
}
.sidebar {
- background-color: #1a1d21;
+ background-color: #1a1d21;
height: 100vh;
padding-top: 20px;
padding-left: 10px;
color: white;
}
+
.top-bar {
- background-color: #1a1d21;
+ background-color: #1a1d21;
}
+
.sidebar h3 {
color: white;
padding-left: 15px;
@@ -50,47 +52,51 @@ body {
width: 140px;
margin-right: 10px;
}
-.logo img{
+
+.logo img {
width: 100%;
}
+
@media screen and (min-width: 1600px) {
.modal-dialog {
- max-width: 90%; /* New width for default modal */
+ max-width: 90%;
+ /* New width for default modal */
}
}
-.searchbar{
+
+.searchbar {
margin-bottom: auto;
margin-top: auto;
height: 60px;
background-color: #353b48;
border-radius: 30px;
padding: 10px;
- }
+}
- .search_input{
+.search_input {
color: white;
border: 0;
outline: 0;
background: none;
width: 450px;
- caret-color:transparent;
+ caret-color: transparent;
line-height: 40px;
transition: width 0.4s linear;
- }
+}
- .searchbar:hover > .search_input{
+.searchbar:hover>.search_input {
/* padding: 0 10px; */
width: 450px;
- caret-color:red;
+ caret-color: red;
/* transition: width 0.4s linear; */
- }
+}
- .searchbar:hover > .search_icon{
+.searchbar:hover>.search_icon {
background: white;
color: #e74c3c;
- }
+}
- .search_icon{
+.search_icon {
height: 40px;
width: 40px;
float: right;
@@ -98,6 +104,24 @@ body {
justify-content: center;
align-items: center;
border-radius: 50%;
- color:white;
- text-decoration:none;
- }
\ No newline at end of file
+ color: white;
+ text-decoration: none;
+}
+
+.btn-pulsing {
+ animation: pulse 2s infinite;
+ }
+
+ @keyframes pulse {
+ 0% {
+ transform: scale(1);
+ }
+
+ 50% {
+ transform: scale(1.08);
+ }
+
+ 100% {
+ transform: scale(1);
+ }
+ }
\ No newline at end of file
diff --git a/templates/base.html b/templates/base.html
index 93bb6b7..53d6a38 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -116,7 +116,7 @@
- {{version}}
+ {{version | version_check}}