Compare commits

...

36 Commits

Author SHA1 Message Date
david
f8013cc831 Implemented search page and fixed off-by-one in status 2023-05-21 03:27:48 +02:00
david
2ff71ac8da Changed static structure and wrapped searchsuggestions in function for compatibility 2023-05-20 22:11:36 +02:00
david
b22a732d0e Merge branch 'master' of ssh://muxi.at:10220/diez/unusualarchive 2023-05-20 20:11:03 +02:00
david
f3bf64050d Thumbnail size fix 2023-05-20 20:10:42 +02:00
david
757d02f090 „api/README.md“ ändern 2023-05-20 18:01:26 +02:00
david
fb592f7af0 Cleaned up unused assets 2023-05-20 17:36:25 +02:00
david
e00e32dd81 Merge branch 'search' 2023-05-20 17:01:33 +02:00
root
6ffb5d6df4 changed yt-dlp.conf 2023-05-20 16:57:56 +02:00
root
5ef903010c fixed thumbnails 2023-05-20 16:55:24 +02:00
david
1759b09aec Search now shows nothing if nothing was found 2023-05-20 12:58:17 +02:00
david
2defe8a4bd Search works 2023-05-20 02:57:30 +02:00
david
4d60016ef4 god save me 2023-05-20 02:11:33 +02:00
david
bf51819cbc sage_stream back in business 2023-05-20 00:34:10 +02:00
31b09b1ca3 „db.sqlite3“ löschen 2023-05-19 21:46:08 +02:00
david
a69ed2677a Searchbar js code 2023-05-19 21:21:31 +02:00
david
21ee170302 Groundwork in base.html and searchsuggestions.js 2023-05-19 18:17:55 +02:00
david
76fee9b57a Fixed some small errors 2023-05-19 17:03:06 +02:00
david
c4af1d1808 Added limit parameter to VideoAPI search and improved documentation 2023-05-19 15:31:05 +02:00
david
bd28751013 „api/README.md“ ändern 2023-05-19 02:41:25 +02:00
david
9f6727d264 Added API Documentation 2023-05-19 02:39:23 +02:00
david
1206528e42 Repo cleanup 2023-05-19 02:11:02 +02:00
david
19dc4b5b64 Refactoring 2023-05-19 01:33:35 +02:00
david
95d5aa6992 Api endpoint for video search with querying implemented 2023-05-19 01:06:50 +02:00
david
468fb338f1 ADD: Api endpoint for search suggestions 2023-05-18 22:42:07 +02:00
root
0ac29fd7d5 Merge branch 'master' of https://muxi.at/git/diez/unusualarchive 2023-05-16 22:05:24 +02:00
root
327600dacd formatted 2023-05-16 22:05:01 +02:00
david
df88bf1197 Delete ./base.html 2023-05-16 22:02:31 +02:00
david
f93480a001 Delete ./base.html 2023-05-16 22:01:33 +02:00
root
e47a3c187b Merge branch 'master' of https://muxi.at/git/diez/unusualarchive 2023-05-16 21:56:08 +02:00
root
2f2cb45947 fixed import thumbnail 2023-05-16 21:55:05 +02:00
david
3f5d2bdc26 „static/assets/ragnarok.jpg:Zone.Identifier“ löschen 2023-05-16 21:54:17 +02:00
david
4dfd1f65fe „static/assets/374538-vSe50GxlL-transformed.jpeg:Zone.Identifier“ löschen 2023-05-16 21:54:12 +02:00
root
da5c8727a8 added random and fixed layouts 2023-05-11 22:18:43 +02:00
root
d9165f4884 seeeeeeeee 2023-05-11 22:06:52 +02:00
root
7d0beefe10 Merge branch 'master' of https://muxi.at/git/diez/unusualarchive 2023-05-11 19:59:30 +02:00
root
79ef20bdc4 fixed import 2023-05-11 19:59:04 +02:00
114 changed files with 349 additions and 93182 deletions

6
.gitignore vendored
View File

@@ -1,4 +1,6 @@
.vscode/
__pycache__/
db.sqlite3
videos/
channel_archiver/yt-dlp-archive.txt
channel_archiver/UnusualVideos*
channel_archiver/UnusualVideos*

24
api/README.md Normal file
View File

@@ -0,0 +1,24 @@
# SearchAPI
## Search
`GET /api/search/?param=value`
### Parameters
| Param | Value |
|-|-|
| `q` | The search query string. |
| `limit` | A limit on the number of objects to be returned. Default is 6. |
### Response
```
[
{
"id": 1,
"name": "Video 1"
},
{...}
]
```
### Examples
> `GET /api/search/?q=foo&limit=3` will return the first 3 videos with "foo" in their name.

7
api/urls.py Normal file
View File

@@ -0,0 +1,7 @@
from django.urls import path, include
from . import views
urlpatterns = [
path('', include('sage_stream.api.urls')),
path('search/', views.searchAPI),
]

17
api/views.py Normal file
View File

@@ -0,0 +1,17 @@
from django.db.models import Q
from rest_framework.response import Response
from rest_framework.decorators import api_view
from core.models import Video
from core.serializers import VideoSerializer
@api_view(['GET'])
def searchAPI(request):
q = request.GET.get('q', '')
l = request.GET.get('limit', '6')
try:
l = int(l)
videos = Video.objects.filter(Q(id__contains=q) | Q(name__contains=q))[:l]
except:
videos = Video.objects.filter(Q(id__contains=q) | Q(name__contains=q))
serializer = VideoSerializer(videos, many=True)
return Response(serializer.data)

247
base.html
View File

@@ -1,247 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>AdminLTE 3 | Starter</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
<link rel="stylesheet" href="plugins/fontawesome-free/css/all.min.css">
<link rel="stylesheet" href="dist/css/adminlte.min.css?v=3.2.0">
</head>
<body class="hold-transition sidebar-mini">
<div class="wrapper">
<nav class="main-header navbar navbar-expand navbar-white navbar-light">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" data-widget="pushmenu" href="#" role="button"><i class="fas fa-bars"></i></a>
</li>
<li class="nav-item d-none d-sm-inline-block">
<a href="index3.html" class="nav-link">Home</a>
</li>
<li class="nav-item d-none d-sm-inline-block">
<a href="#" class="nav-link">Contact</a>
</li>
</ul>
<ul class="navbar-nav ml-auto">
<li class="nav-item">
<a class="nav-link" data-widget="navbar-search" href="#" role="button">
<i class="fas fa-search"></i>
</a>
<div class="navbar-search-block">
<form class="form-inline">
<div class="input-group input-group-sm">
<input class="form-control form-control-navbar" type="search" placeholder="Search" aria-label="Search">
<div class="input-group-append">
<button class="btn btn-navbar" type="submit">
<i class="fas fa-search"></i>
</button>
<button class="btn btn-navbar" type="button" data-widget="navbar-search">
<i class="fas fa-times"></i>
</button>
</div>
</div>
</form>
</div>
</li>
<li class="nav-item dropdown">
<a class="nav-link" data-toggle="dropdown" href="#">
<i class="far fa-comments"></i>
<span class="badge badge-danger navbar-badge">3</span>
</a>
<div class="dropdown-menu dropdown-menu-lg dropdown-menu-right">
<a href="#" class="dropdown-item">
<div class="media">
<img src="dist/img/user1-128x128.jpg" alt="User Avatar" class="img-size-50 mr-3 img-circle">
<div class="media-body">
<h3 class="dropdown-item-title">
Brad Diesel
<span class="float-right text-sm text-danger"><i class="fas fa-star"></i></span>
</h3>
<p class="text-sm">Call me whenever you can...</p>
<p class="text-sm text-muted"><i class="far fa-clock mr-1"></i> 4 Hours Ago</p>
</div>
</div>
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item">
<div class="media">
<img src="dist/img/user8-128x128.jpg" alt="User Avatar" class="img-size-50 img-circle mr-3">
<div class="media-body">
<h3 class="dropdown-item-title">
John Pierce
<span class="float-right text-sm text-muted"><i class="fas fa-star"></i></span>
</h3>
<p class="text-sm">I got your message bro</p>
<p class="text-sm text-muted"><i class="far fa-clock mr-1"></i> 4 Hours Ago</p>
</div>
</div>
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item">
<div class="media">
<img src="dist/img/user3-128x128.jpg" alt="User Avatar" class="img-size-50 img-circle mr-3">
<div class="media-body">
<h3 class="dropdown-item-title">
Nora Silvester
<span class="float-right text-sm text-warning"><i class="fas fa-star"></i></span>
</h3>
<p class="text-sm">The subject goes here</p>
<p class="text-sm text-muted"><i class="far fa-clock mr-1"></i> 4 Hours Ago</p>
</div>
</div>
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item dropdown-footer">See All Messages</a>
</div>
</li>
<li class="nav-item dropdown">
<a class="nav-link" data-toggle="dropdown" href="#">
<i class="far fa-bell"></i>
<span class="badge badge-warning navbar-badge">15</span>
</a>
<div class="dropdown-menu dropdown-menu-lg dropdown-menu-right">
<span class="dropdown-header">15 Notifications</span>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item">
<i class="fas fa-envelope mr-2"></i> 4 new messages
<span class="float-right text-muted text-sm">3 mins</span>
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item">
<i class="fas fa-users mr-2"></i> 8 friend requests
<span class="float-right text-muted text-sm">12 hours</span>
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item">
<i class="fas fa-file mr-2"></i> 3 new reports
<span class="float-right text-muted text-sm">2 days</span>
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item dropdown-footer">See All Notifications</a>
</div>
</li>
<li class="nav-item">
<a class="nav-link" data-widget="fullscreen" href="#" role="button">
<i class="fas fa-expand-arrows-alt"></i>
</a>
</li>
<li class="nav-item">
<a class="nav-link" data-widget="control-sidebar" data-slide="true" href="#" role="button">
<i class="fas fa-th-large"></i>
</a>
</li>
</ul>
</nav>
<aside class="main-sidebar sidebar-dark-primary elevation-4">
<a href="index3.html" class="brand-link">
<img src="dist/img/AdminLTELogo.png" alt="AdminLTE Logo" class="brand-image img-circle elevation-3" style="opacity: .8">
<span class="brand-text font-weight-light">AdminLTE 3</span>
</a>
<div class="sidebar">
<div class="user-panel mt-3 pb-3 mb-3 d-flex">
<div class="image">
<img src="dist/img/user2-160x160.jpg" class="img-circle elevation-2" alt="User Image">
</div>
<div class="info">
<a href="#" class="d-block">Alexander Pierce</a>
</div>
</div>
<div class="form-inline">
<div class="input-group" data-widget="sidebar-search">
<input class="form-control form-control-sidebar" type="search" placeholder="Search" aria-label="Search">
<div class="input-group-append">
<button class="btn btn-sidebar">
<i class="fas fa-search fa-fw"></i>
</button>
</div>
</div>
</div>
<nav class="mt-2">
<ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu" data-accordion="false">
<li class="nav-item menu-open">
<a href="#" class="nav-link active">
<i class="nav-icon fas fa-tachometer-alt"></i>
<p>
Starter Pages
<i class="right fas fa-angle-left"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="#" class="nav-link active">
<i class="far fa-circle nav-icon"></i>
<p>Active Page</p>
</a>
</li>
<li class="nav-item">
<a href="#" class="nav-link">
<i class="far fa-circle nav-icon"></i>
<p>Inactive Page</p>
</a>
</li>
</ul>
</li>
<li class="nav-item">
<a href="#" class="nav-link">
<i class="nav-icon fas fa-th"></i>
<p>
Simple Link
<span class="right badge badge-danger">New</span>
</p>
</a>
</li>
</ul>
</nav>
</div>
</aside>
<div class="content-wrapper">
{% block content %}{% endblock %}
</div>
<footer class="main-footer">
<div class="float-right d-none d-sm-inline">
Anything you want
</div>
<strong>Copyright &copy; 2014-2021 <a href="https://adminlte.io">AdminLTE.io</a>.</strong> All rights reserved.
</footer>
</div>
<script src="plugins/jquery/jquery.min.js"></script>
<script src="plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<script src="dist/js/adminlte.min.js?v=3.2.0"></script>
</body>
</html>

View File

@@ -1,2 +1,4 @@
# UnusualVideos
https://www.youtube.com/channel/UCpnkp_D4FLPCiXOmDhoAeYA
# UUM Archive
https://www.youtube.com/@unusualvideos_archive

View File

@@ -4,9 +4,9 @@
# Archive Settings
--download-archive yt-dlp-archive.txt
-a yt-dlp-channels.txt
-f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best'
--write-description
#-f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best'
--write-thumbnail
--restrict-filenames
# Debug
-v

Binary file not shown.

Binary file not shown.

View File

@@ -1,6 +1,4 @@
from django.contrib import admin
from .models import Video
@admin.register(Video)

7
core/serializers.py Normal file
View File

@@ -0,0 +1,7 @@
from rest_framework import serializers
from .models import Video
class VideoSerializer(serializers.ModelSerializer):
class Meta:
model = Video
fields = ['id', 'name']

View File

@@ -1,140 +1,20 @@
{% extends "base.html" %}
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>UnusualArchive</title>
<link rel="stylesheet" href="{% static 'plugins/fontawesome-free/css/all.min.css' %}">
<link rel="stylesheet" href="{% static 'plugins/icheck-bootstrap/icheck-bootstrap.min.css' %}">
<link rel="stylesheet" href="{% static 'dist/css/adminlte.css' %}">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
<link rel="stylesheet" href="{% static 'plugins/fontawesome-free/css/all.min.css' %}">
</head>
<body class="layout-top-nav" style="height: auto;">
<div class="wrapper">
<nav class="main-header navbar navbar-expand-md navbar-light navbar-white">
<div class="container">
<a href="/" class="navbar-brand">
<img src="{% static 'dist/img/ragnarok.jpg' %}" alt="Ragnarok" class="brand-image img-circle elevation-3" style="opacity: .8">
<span class="brand-text font-weight-light">UnusualArchive</span>
</a>
<button class="navbar-toggler order-1" type="button" data-toggle="collapse" data-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse order-3" id="navbarCollapse">
<ul class="navbar-nav">
<li class="nav-item">
<a href="/" class="nav-link">Explore</a>
</li>
<li class="nav-item">
<a href="/status" class="nav-link">Status</a>
</li>
<li class="nav-item">
<a href="/about" class="nav-link">About</a>
</li>
</ul>
<div class="float-right" style="width:100%">
<form class="form-inline ml-0 ml-md-3 float-right">
<div class="input-group input-group-sm">
<input class="form-control form-control-navbar" type="search" placeholder="Search" aria-label="Search">
<div class="input-group-append">
<button class="btn btn-navbar" type="submit">
<i class="fas fa-search"></i>
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</nav>
<div class="content-wrapper" style="min-height: 1128px;">
<div class="content-header">
<div class="container">
<div class="row mb-2">
<div class="col-sm-6">
<h1 class="m-0"> About</h1>
</div>
</div>
</div>
</div>
<div class="content">
<div class="container">
{% block content %}
{% block header %}About{% endblock %}
{% block content %}
<div class="row mb-3">
<div class="col-12">
<div class="card card-primary">
<div class="card-body">
<p>
The Siebenhirten stands as a testament to the critical importance of preserving the knowledge and cultural artifacts of our society. In an age where digital information can be lost in the blink of an eye, the work of the Siebenhirten is nothing short of vital.
The Group's mission to archive the videos of UnusualVideos is not just a noble pursuit, but a necessary one. In the face of the ever-present threat of censorship, copyright claims, and technological obsolescence, it falls upon groups like Siebenhirten to safeguard the information that would otherwise be lost forever.
Their journey has been long and arduous, fraught with challenges and obstacles at every turn. But their unwavering dedication and tireless efforts have paid off in ways that cannot be overstated. Through their actions, they have ensured that future generations will have access to the knowledge and cultural artifacts that define our society today.
The Siebenhirten is not just a group of archivists, but guardians of our collective history. They have taken on the mantle of responsibility, understanding that the preservation of knowledge and cultural artifacts is essential to the survival of our species.
As we move forward into an uncertain future, it is essential that we continue to support the work of groups like the Siebenhirten. Their dedication to preserving the knowledge and culture of our society is not just admirable, but necessary. It is only through their efforts that we can hope to ensure that future generations have access to the information that defines us as a species.
</p>
<div class="col-12">
<div class="card card-primary">
<div class="card-body">
<p>
The Siebenhirten stands as a testament to the critical importance of preserving the knowledge and cultural artifacts of our society. In an age where digital information can be lost in the blink of an eye, the work of the Siebenhirten is nothing short of vital.
The Group's mission to archive the videos of UnusualVideos is not just a noble pursuit, but a necessary one. In the face of the ever-present threat of censorship, copyright claims, and technological obsolescence, it falls upon groups like Siebenhirten to safeguard the information that would otherwise be lost forever.
Their journey has been long and arduous, fraught with challenges and obstacles at every turn. But their unwavering dedication and tireless efforts have paid off in ways that cannot be overstated. Through their actions, they have ensured that future generations will have access to the knowledge and cultural artifacts that define our society today.
The Siebenhirten is not just a group of archivists, but guardians of our collective history. They have taken on the mantle of responsibility, understanding that the preservation of knowledge and cultural artifacts is essential to the survival of our species.
As we move forward into an uncertain future, it is essential that we continue to support the work of groups like the Siebenhirten. Their dedication to preserving the knowledge and culture of our society is not just admirable, but necessary. It is only through their efforts that we can hope to ensure that future generations have access to the information that defines us as a species.
</p>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
</div>
</div>
</div>
<footer class="main-footer">
<div class="float-right d-none d-sm-inline">
Für die Nachwelt.
</div>
<strong>Copyright © 2023 Siebenhirten
</footer>
</div>
<script src="{% static 'plugins/jquery/jquery.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap/js/bootstrap.bundle.min.js' %}"></script>
<script src="{% static 'dist/js/adminlte.min.js' %}"></script>
<script>
$(document).ready(function() {
$(".clickable-row").click(function() {
window.location.href = $(this).data("href");
});
});
</script>
</body>
</html>
{% endblock %}

View File

@@ -1,132 +1,140 @@
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>UnusualArchive</title>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>UnusualArchive</title>
<link rel="stylesheet"
href="{% static 'plugins/fontawesome-free/css/all.min.css' %}">
<link rel="stylesheet"
href="{% static 'plugins/icheck-bootstrap/icheck-bootstrap.min.css' %}">
<link rel="stylesheet" href="{% static 'css/adminlte.css' %}">
<link rel="stylesheet"
href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
<style>
.card-img {
aspect-ratio: 16 / 9;
object-fit: cover;
}
</style>
</head>
<body class="layout-top-nav" style="height: auto;">
<div class="wrapper">
<nav class="main-header navbar navbar-expand-md navbar-light navbar-white">
<div class="container">
<a href="/" class="navbar-brand">
<img src="{% static 'img/ragnarok.jpg' %}"
alt="Ragnarok"
class="brand-image img-circle elevation-3"
style="opacity: .8">
<span class="brand-text font-weight-light">UnusualArchive</span>
</a>
<button class="navbar-toggler order-1"
type="button"
data-toggle="collapse"
data-target="#navbarCollapse"
aria-controls="navbarCollapse"
aria-expanded="false"
aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse order-3" id="navbarCollapse">
<ul class="navbar-nav">
<li class="nav-item">
<a href="/" class="nav-link">Explore</a>
</li>
<li class="nav-item">
<a href="/random" class="nav-link">Random</a>
</li>
<li class="nav-item">
<a href="/status" class="nav-link">Status</a>
</li>
<li class="nav-item">
<a href="/about" class="nav-link">About</a>
</li>
</ul>
<div class="float-right" style="width:100%">
<link rel="stylesheet" href="{% static 'plugins/fontawesome-free/css/all.min.css' %}">
<link rel="stylesheet" href="{% static 'plugins/icheck-bootstrap/icheck-bootstrap.min.css' %}">
<link rel="stylesheet" href="{% static 'dist/css/adminlte.css' %}">
<form class="form-inline ml-0 ml-md-3 float-right" action="/search">
<div class="input-group input-group-sm">
<input class="form-control form-control-navbar" data-toggle="dropdown"
type="search"
placeholder="Search"
aria-label="Search"
autocomplete="off"
id="search"
name="q">
<ul class="dropdown-menu" id="searchdropdown">
<li><span class="dropdown-item-text">Nothing</span></li>
</ul>
<div class="input-group-append">
<button class="btn btn-navbar" type="submit">
<i class="fas fa-search"></i>
</button>
</div>
</div>
</form>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
<link rel="stylesheet" href="{% static 'plugins/fontawesome-free/css/all.min.css' %}">
</head>
<body class="layout-top-nav" style="height: auto;">
<div class="wrapper">
<nav class="main-header navbar navbar-expand-md navbar-light navbar-white">
<div class="container">
<a href="/" class="navbar-brand">
<img src="{% static 'dist/img/ragnarok.jpg' %}" alt="Ragnarok" class="brand-image img-circle elevation-3" style="opacity: .8">
<span class="brand-text font-weight-light">UnusualArchive</span>
</a>
<button class="navbar-toggler order-1" type="button" data-toggle="collapse" data-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse order-3" id="navbarCollapse">
<ul class="navbar-nav">
<li class="nav-item">
<a href="/" class="nav-link">Explore</a>
</li>
<li class="nav-item">
<a href="/status" class="nav-link">Status</a>
</li>
<li class="nav-item">
<a href="/about" class="nav-link">About</a>
</li>
</ul>
<div class="float-right" style="width:100%">
<form class="form-inline ml-0 ml-md-3 float-right">
<div class="input-group input-group-sm">
<input class="form-control form-control-navbar" type="search" placeholder="Search" aria-label="Search">
<div class="input-group-append">
<button class="btn btn-navbar" type="submit">
<i class="fas fa-search"></i>
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</nav>
<div class="content-wrapper" style="min-height: 1128px;">
<div class="content-header">
<div class="container">
<div class="row mb-2">
<div class="col-sm-6">
<h1 class="m-0"> Explore</h1>
</div>
</div>
</div>
</div>
<div class="content">
<div class="container">
{% block content %}
<div class="row mb-3">
{% for v in videos %}
<div class="col-xs-6 col-md-4">
<a href="/media/{{ v.file }}">
<div class="card mb-2 bg-gradient-dark">
{% if v.thumbnail %}
<img class="card-img-top" src="/media/{{v.thumbnail}}" alt="Dist Photo 1">
{% else %}
<img class="card-img-top" src="{% static 'dist/img/photo1.png' %}" alt="Dist Photo 1">
{% endif %}
<div class="card-img-overlay d-flex flex-column justify-content-end" style="background-color: rgba(0, 0, 0, 0.5);">
<h5 class="card-title"><b>V{{ v.id }}</b></h5>
<span>{{v.created_at}}</span>
</div>
</div>
</a>
</div>
{% endfor %}
</div>
{% endblock %}
</div>
</div>
</div>
<footer class="main-footer">
<div class="float-right d-none d-sm-inline">
Für die Nachwelt.
</div>
<strong>Copyright © 2023 Siebenhirten
</footer>
</div>
<script src="{% static 'plugins/jquery/jquery.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap/js/bootstrap.bundle.min.js' %}"></script>
<script src="{% static 'dist/js/adminlte.min.js' %}"></script>
</body>
</html>
</div>
</div>
</div>
</nav>
<div class="content-wrapper" style="min-height: 1128px;">
<div class="content-header">
<div class="container">
<div class="row mb-2">
<div class="col-sm-6">
<h1 class="m-0">
{% block header %}Explore{% endblock %}
</h1>
</div>
</div>
</div>
</div>
<div class="content">
<div class="container">
{% block content %}
<div class="row mb-3">
{% for v in videos %}
<div class="col-xs-6 col-md-4">
<a href="/view/{{ v.id }}">
<div class="card mb-2 bg-gradient-dark">
{% if v.thumbnail %}
<img class="card-img"
src="/media/{{ v.thumbnail }}"
alt="Dist Photo 1"
style="max-width: 1280px;
max-height: 720px">
{% else %}
<img class="card-img"
src="{% static 'img/default.png' %}"
alt="Dist Photo 1">
{% endif %}
<div class="card-img-overlay d-flex flex-column justify-content-end"
style="background-color: rgba(0, 0, 0, 0.5)">
<h5 class="card-title">
<b>V{{ v.id }}</b>
</h5>
<span>{{ v.created_at }}</span>
</div>
</div>
</a>
</div>
{% endfor %}
</div>
{% endblock %}
</div>
</div>
</div>
<footer class="main-footer">
<div class="float-right d-none d-sm-inline">Für die Nachwelt.</div>
<strong>Copyright © 2023 Siebenhirten
</footer>
</div>
<script src="{% static 'plugins/jquery/jquery.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap/js/bootstrap.bundle.min.js' %}"></script>
<script src="{% static 'js/adminlte.min.js' %}"></script>
<script src="{% static 'js/searchsuggestions.js' %}"></script>
</body>
</html>

View File

@@ -1,156 +1,41 @@
{% extends "base.html" %}
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>UnusualArchive</title>
<link rel="stylesheet" href="{% static 'plugins/fontawesome-free/css/all.min.css' %}">
<link rel="stylesheet" href="{% static 'plugins/icheck-bootstrap/icheck-bootstrap.min.css' %}">
<link rel="stylesheet" href="{% static 'dist/css/adminlte.css' %}">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
<link rel="stylesheet" href="{% static 'plugins/fontawesome-free/css/all.min.css' %}">
</head>
<body class="layout-top-nav" style="height: auto;">
<div class="wrapper">
<nav class="main-header navbar navbar-expand-md navbar-light navbar-white">
<div class="container">
<a href="/" class="navbar-brand">
<img src="{% static 'dist/img/ragnarok.jpg' %}" alt="Ragnarok" class="brand-image img-circle elevation-3" style="opacity: .8">
<span class="brand-text font-weight-light">UnusualArchive</span>
</a>
<button class="navbar-toggler order-1" type="button" data-toggle="collapse" data-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse order-3" id="navbarCollapse">
<ul class="navbar-nav">
<li class="nav-item">
<a href="/" class="nav-link">Explore</a>
</li>
<li class="nav-item">
<a href="/status" class="nav-link">Status</a>
</li>
<li class="nav-item">
<a href="/about" class="nav-link">About</a>
</li>
</ul>
<div class="float-right" style="width:100%">
<form class="form-inline ml-0 ml-md-3 float-right">
<div class="input-group input-group-sm">
<input class="form-control form-control-navbar" type="search" placeholder="Search" aria-label="Search">
<div class="input-group-append">
<button class="btn btn-navbar" type="submit">
<i class="fas fa-search"></i>
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</nav>
<div class="content-wrapper" style="min-height: 1128px;">
<div class="content-header">
<div class="container">
<div class="row mb-2">
<div class="col-sm-6">
<h1 class="m-0"> Status</h1>
</div>
</div>
</div>
</div>
<div class="content">
<div class="container">
{% block content %}
{% block header %}Status{% endblock %}
{% block content %}
<div class="row mb-3">
<div class="col-12">
<div class="card card-primary">
<div class="card-body">
<table class="table table-hover">
<thead>
<a href="/media/{{ v.file }}">
<tr class="clickable-row" data-href="/media/{{ v.file }}">
<th style="width: 10px">#</th>
<th style="text-align:right">Status</th>
</tr>
</thead>
<tbody>
{% for v in video_list %}
<tr>
<td><b>V{{v.id}}</b></td>
{% if v.file %}
<td style="text-align:right"><i class="far fa-check-circle" style="color:green"></i></td>
{% else %}
<td style="text-align:right"><i class="far fa-times-circle" style="color:red"></i></td>
{% endif %}
</tr>
</a>
{% endfor %}
</tbody>
</table>
<div class="col-12">
<div class="card card-primary">
<div class="card-body">
<table class="table table-hover">
<thead>
<a href="/media/{{ v.file }}">
<tr class="clickable-row" data-href="/media/{{ v.file }}">
<th style="width: 10px">#</th>
<th style="text-align:right">Status</th>
</tr>
</thead>
<tbody>
{% for v in video_list %}
<tr>
<td>
<b>V{{ v.id }}</b>
</td>
{% if v.file %}
<td style="text-align:right">
<i class="far fa-check-circle" style="color:green"></i>
</td>
{% else %}
<td style="text-align:right">
<i class="far fa-times-circle" style="color:red"></i>
</td>
{% endif %}
</tr>
</a>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
</div>
</div>
</div>
<footer class="main-footer">
<div class="float-right d-none d-sm-inline">
Für die Nachwelt.
</div>
<strong>Copyright © 2023 Siebenhirten
</footer>
</div>
<script src="{% static 'plugins/jquery/jquery.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap/js/bootstrap.bundle.min.js' %}"></script>
<script src="{% static 'dist/js/adminlte.min.js' %}"></script>
<script>
$(document).ready(function() {
$(".clickable-row").click(function() {
window.location.href = $(this).data("href");
});
});
</script>
</body>
</html>
{% endblock %}

13
core/templates/view.html Normal file
View File

@@ -0,0 +1,13 @@
{% extends "base.html" %}
{% load static %}
{% block header %}UNUSUAL MEMES V{{ video.id }}{% endblock %}
{% block content %}
<div class="row mb-3">
<div class="col-12 justify-content-center">
<video width="100%" height="100%" controls autoplay>
<source src="/api/stream/?path=/media//{{ video.file }}" type="video/mp4">
<p>Your browser does not support the video tag.</p>
</video>
</div>
</div>
{% endblock %}

View File

@@ -3,6 +3,9 @@ from . import views
urlpatterns = [
path('', views.core, name='core'),
path('status/', views.status, name='status'),
path('about/', views.about, name='about'),
]
path('random/', views.random, name='random'),
path('search/', views.search, name='search'),
path('status/', views.status, name='status'),
path('view/<int:id>', views.view, name='view'),
]

View File

@@ -1,6 +1,6 @@
from django.db.models import Q
from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse
from django.shortcuts import redirect
from core.models import Video
# Create your views here.
@@ -9,12 +9,24 @@ def core(request):
videos = Video.objects.all()
return render(request, 'base.html', {'videos': videos[::-1]})
def about(request):
return render(request, 'about.html')
def random(request):
videos = Video.objects.all().order_by("?")
ran = videos.first()
return redirect('/view/'+str(ran.id))
def search(request):
q = request.GET.get('q', '')
videos = Video.objects.filter(Q(id__contains=q) | Q(name__contains=q))
return render(request, 'base.html', {'videos': videos})
def status(request):
highest_id = Video.objects.order_by('-id').first().id
video_list = []
for i in range(highest_id + 1):
for i in range(1, highest_id + 1):
try:
video = Video.objects.get(id=i)
video_list.append(video)
@@ -23,7 +35,7 @@ def status(request):
return render(request, 'status.html', {'video_list': video_list[::-1]})
def about(request):
return render(request, 'about.html')
def view(request, id):
vid = Video.objects.get(id = id)
if vid:
return render(request, "view.html", {'video': vid})

Binary file not shown.

View File

@@ -1,8 +1,10 @@
import os
import re
import sys
import fnmatch
from datetime import datetime
sys.path.append('./')
os.environ['DJANGO_SETTINGS_MODULE'] = 'ragnarok.settings'
import django
@@ -10,7 +12,7 @@ django.setup()
from django.contrib.auth.models import User
from core.models import Video
folder_path = 'channel_archiver/UnusualVideos (@UnusualVideos)/'
folder_path = './channel_archiver/UnusualVideos (@UnusualVideos)/'
def extract_version(filename):
# Define a regular expression pattern to match the version number
@@ -26,9 +28,17 @@ def extract_version(filename):
# If no match is found, return None
return None
def find_image_file(name_pattern, folder):
pattern = re.compile('.*{} .*\.(jpg|png|webp)'.format(name_pattern), re.IGNORECASE)
for root, dirs, files in os.walk(folder):
for filename in files:
if pattern.match(filename):
return os.path.join(root, filename)
return None
for filename in os.listdir(folder_path):
if filename.endswith('.mp4'):
files = os.listdir(folder_path)
for filename in files:
if filename.endswith('.mp4'):
# Create a new Video object
video = Video()
id = extract_version(filename)
@@ -44,13 +54,12 @@ for filename in os.listdir(folder_path):
# Open the file and save it to the Video object
with open(os.path.join(folder_path, filename), 'rb') as f:
video.file.save(filename, f)
filename = filename[:-3] + "webp"
filepath = os.path.join(folder_path, filename)
if os.path.exists(filepath):
with open(filepath, 'rb') as f:
video.thumbnail.save(filename, f)
index = [idx for idx, s in enumerate(files) if bool(re.search('V'+str(video.id)+'( |_)', s)) and '.webp' in s]
if not index:
continue
index = index[0]
with open(os.path.join(folder_path, files[index]), 'rb') as f:
video.thumbnail.save(files[index], f)
# Save the Video object to the database
video.save()

View File

@@ -1,6 +0,0 @@
from django.core.management.base import BaseCommand
from ragnarok.models import Video
class Command(BaseCommand):
args = '<foo bar ...>'
help = 'our help string comes here'

View File

@@ -39,6 +39,8 @@ INSTALLED_APPS = [
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'sage_stream',
'core'
]

View File

@@ -22,8 +22,7 @@ urlpatterns = [
path('admin/', admin.site.urls),
path('auth/', include('django.contrib.auth.urls')),
path('', include('core.urls')),
path('/', include('core.urls')),
path('status/', include('core.urls')),
path('api/', include('api.urls')),
]
if settings.DEBUG:

View File

@@ -1,4 +0,0 @@
[ZoneTransfer]
ZoneId=3
ReferrerUrl=https://www.upscale.media/
HostUrl=https://cdn.pixelbin.io/v2/dummy-cloudname/af.remove()~sr.upscale(t:2x)/__editor/__upscale_media/2023-2-16/374538-vSe50GxlL.jpeg?download=true

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 KiB

View File

@@ -1,4 +0,0 @@
[ZoneTransfer]
ZoneId=3
ReferrerUrl=https://www.google.com/
HostUrl=https://cdn.imgbin.com/12/14/14/imgbin-ragnarok-online-2-legend-of-the-second-massively-multiplayer-online-role-playing-game-south-korea-black-ragnarok-online-ut6jryrGzgiQ3E71nLgQwDMg2.jpg

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,960 +0,0 @@
/*!
* AdminLTE v3.2.0
* Only Pages
* Author: Colorlib
* Website: AdminLTE.io <https://adminlte.io>
* License: Open source - MIT <https://opensource.org/licenses/MIT>
*/
.close, .mailbox-attachment-close {
float: right;
font-size: 1.5rem;
font-weight: 700;
line-height: 1;
color: #000;
text-shadow: 0 1px 0 #fff;
opacity: .5;
}
.close:hover, .mailbox-attachment-close:hover {
color: #000;
text-decoration: none;
}
.close:not(:disabled):not(.disabled):hover, .mailbox-attachment-close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus, .mailbox-attachment-close:not(:disabled):not(.disabled):focus {
opacity: .75;
}
button.close, button.mailbox-attachment-close {
padding: 0;
background-color: transparent;
border: 0;
}
a.close.disabled, a.disabled.mailbox-attachment-close {
pointer-events: none;
}
@-webkit-keyframes flipInX {
0% {
-webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
transition-timing-function: ease-in;
opacity: 0;
}
40% {
-webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
transition-timing-function: ease-in;
}
60% {
-webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
opacity: 1;
}
80% {
-webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
}
100% {
-webkit-transform: perspective(400px);
transform: perspective(400px);
}
}
@keyframes flipInX {
0% {
-webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
transition-timing-function: ease-in;
opacity: 0;
}
40% {
-webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
transition-timing-function: ease-in;
}
60% {
-webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
opacity: 1;
}
80% {
-webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
}
100% {
-webkit-transform: perspective(400px);
transform: perspective(400px);
}
}
@-webkit-keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@-webkit-keyframes fadeOut {
from {
opacity: 1;
}
to {
opacity: 0;
}
}
@keyframes fadeOut {
from {
opacity: 1;
}
to {
opacity: 0;
}
}
@-webkit-keyframes shake {
0% {
-webkit-transform: translate(2px, 1px) rotate(0deg);
transform: translate(2px, 1px) rotate(0deg);
}
10% {
-webkit-transform: translate(-1px, -2px) rotate(-2deg);
transform: translate(-1px, -2px) rotate(-2deg);
}
20% {
-webkit-transform: translate(-3px, 0) rotate(3deg);
transform: translate(-3px, 0) rotate(3deg);
}
30% {
-webkit-transform: translate(0, 2px) rotate(0deg);
transform: translate(0, 2px) rotate(0deg);
}
40% {
-webkit-transform: translate(1px, -1px) rotate(1deg);
transform: translate(1px, -1px) rotate(1deg);
}
50% {
-webkit-transform: translate(-1px, 2px) rotate(-1deg);
transform: translate(-1px, 2px) rotate(-1deg);
}
60% {
-webkit-transform: translate(-3px, 1px) rotate(0deg);
transform: translate(-3px, 1px) rotate(0deg);
}
70% {
-webkit-transform: translate(2px, 1px) rotate(-2deg);
transform: translate(2px, 1px) rotate(-2deg);
}
80% {
-webkit-transform: translate(-1px, -1px) rotate(4deg);
transform: translate(-1px, -1px) rotate(4deg);
}
90% {
-webkit-transform: translate(2px, 2px) rotate(0deg);
transform: translate(2px, 2px) rotate(0deg);
}
100% {
-webkit-transform: translate(1px, -2px) rotate(-1deg);
transform: translate(1px, -2px) rotate(-1deg);
}
}
@keyframes shake {
0% {
-webkit-transform: translate(2px, 1px) rotate(0deg);
transform: translate(2px, 1px) rotate(0deg);
}
10% {
-webkit-transform: translate(-1px, -2px) rotate(-2deg);
transform: translate(-1px, -2px) rotate(-2deg);
}
20% {
-webkit-transform: translate(-3px, 0) rotate(3deg);
transform: translate(-3px, 0) rotate(3deg);
}
30% {
-webkit-transform: translate(0, 2px) rotate(0deg);
transform: translate(0, 2px) rotate(0deg);
}
40% {
-webkit-transform: translate(1px, -1px) rotate(1deg);
transform: translate(1px, -1px) rotate(1deg);
}
50% {
-webkit-transform: translate(-1px, 2px) rotate(-1deg);
transform: translate(-1px, 2px) rotate(-1deg);
}
60% {
-webkit-transform: translate(-3px, 1px) rotate(0deg);
transform: translate(-3px, 1px) rotate(0deg);
}
70% {
-webkit-transform: translate(2px, 1px) rotate(-2deg);
transform: translate(2px, 1px) rotate(-2deg);
}
80% {
-webkit-transform: translate(-1px, -1px) rotate(4deg);
transform: translate(-1px, -1px) rotate(4deg);
}
90% {
-webkit-transform: translate(2px, 2px) rotate(0deg);
transform: translate(2px, 2px) rotate(0deg);
}
100% {
-webkit-transform: translate(1px, -2px) rotate(-1deg);
transform: translate(1px, -2px) rotate(-1deg);
}
}
@-webkit-keyframes wobble {
0% {
-webkit-transform: none;
transform: none;
}
15% {
-webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
}
30% {
-webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
}
45% {
-webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
}
60% {
-webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
}
75% {
-webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
}
100% {
-webkit-transform: none;
transform: none;
}
}
@keyframes wobble {
0% {
-webkit-transform: none;
transform: none;
}
15% {
-webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
}
30% {
-webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
}
45% {
-webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
}
60% {
-webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
}
75% {
-webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
}
100% {
-webkit-transform: none;
transform: none;
}
}
.mailbox-messages > .table {
margin: 0;
}
.mailbox-controls {
padding: 5px;
}
.mailbox-controls.with-border {
border-bottom: 1px solid rgba(0, 0, 0, 0.125);
}
.mailbox-read-info {
border-bottom: 1px solid rgba(0, 0, 0, 0.125);
padding: 10px;
}
.mailbox-read-info h3 {
font-size: 20px;
margin: 0;
}
.mailbox-read-info h5 {
margin: 0;
padding: 5px 0 0;
}
.mailbox-read-time {
color: #999;
font-size: 13px;
}
.mailbox-read-message {
padding: 10px;
}
.mailbox-attachments {
padding-left: 0;
list-style: none;
}
.mailbox-attachments li {
border: 1px solid #eee;
float: left;
margin-bottom: 10px;
margin-right: 10px;
width: 200px;
}
.mailbox-attachment-name {
color: #666;
font-weight: 700;
}
.mailbox-attachment-icon,
.mailbox-attachment-info,
.mailbox-attachment-size {
display: block;
}
.mailbox-attachment-info {
background-color: #f8f9fa;
padding: 10px;
}
.mailbox-attachment-size {
color: #999;
font-size: 12px;
}
.mailbox-attachment-size > span {
display: inline-block;
padding-top: .75rem;
}
.mailbox-attachment-icon {
color: #666;
font-size: 65px;
max-height: 132.5px;
padding: 20px 10px;
text-align: center;
}
.mailbox-attachment-icon.has-img {
padding: 0;
}
.mailbox-attachment-icon.has-img > img {
height: auto;
max-width: 100%;
}
.lockscreen {
background-color: #e9ecef;
}
.lockscreen .lockscreen-name {
font-weight: 600;
text-align: center;
}
.lockscreen-logo {
font-size: 35px;
font-weight: 300;
margin-bottom: 25px;
text-align: center;
}
.lockscreen-logo a {
color: #495057;
}
.lockscreen-wrapper {
margin: 0 auto;
margin-top: 10%;
max-width: 400px;
}
.lockscreen-item {
border-radius: 4px;
background-color: #fff;
margin: 10px auto 30px;
padding: 0;
position: relative;
width: 290px;
}
.lockscreen-image {
border-radius: 50%;
background-color: #fff;
left: -10px;
padding: 5px;
position: absolute;
top: -25px;
z-index: 10;
}
.lockscreen-image > img {
border-radius: 50%;
height: 70px;
width: 70px;
}
.lockscreen-credentials {
margin-left: 70px;
}
.lockscreen-credentials .form-control {
border: 0;
}
.lockscreen-credentials .btn {
background-color: #fff;
border: 0;
padding: 0 10px;
}
.lockscreen-footer {
margin-top: 10px;
}
.dark-mode .lockscreen-item {
background-color: #343a40;
}
.dark-mode .lockscreen-logo a {
color: #fff;
}
.dark-mode .lockscreen-credentials .btn {
background-color: #343a40;
}
.dark-mode .lockscreen-image {
background-color: #6c757d;
}
.login-logo,
.register-logo {
font-size: 2.1rem;
font-weight: 300;
margin-bottom: .9rem;
text-align: center;
}
.login-logo a,
.register-logo a {
color: #495057;
}
.login-page,
.register-page {
-ms-flex-align: center;
align-items: center;
background-color: #e9ecef;
display: -ms-flexbox;
display: flex;
-ms-flex-direction: column;
flex-direction: column;
height: 100vh;
-ms-flex-pack: center;
justify-content: center;
}
.login-box,
.register-box {
width: 360px;
}
@media (max-width: 576px) {
.login-box,
.register-box {
margin-top: .5rem;
width: 90%;
}
}
.login-box .card,
.register-box .card {
margin-bottom: 0;
}
.login-card-body,
.register-card-body {
background-color: #fff;
border-top: 0;
color: #666;
padding: 20px;
}
.login-card-body .input-group .form-control,
.register-card-body .input-group .form-control {
border-right: 0;
}
.login-card-body .input-group .form-control:focus,
.register-card-body .input-group .form-control:focus {
box-shadow: none;
}
.login-card-body .input-group .form-control:focus ~ .input-group-prepend .input-group-text,
.login-card-body .input-group .form-control:focus ~ .input-group-append .input-group-text,
.register-card-body .input-group .form-control:focus ~ .input-group-prepend .input-group-text,
.register-card-body .input-group .form-control:focus ~ .input-group-append .input-group-text {
border-color: #80bdff;
}
.login-card-body .input-group .form-control.is-valid:focus,
.register-card-body .input-group .form-control.is-valid:focus {
box-shadow: none;
}
.login-card-body .input-group .form-control.is-valid ~ .input-group-prepend .input-group-text,
.login-card-body .input-group .form-control.is-valid ~ .input-group-append .input-group-text,
.register-card-body .input-group .form-control.is-valid ~ .input-group-prepend .input-group-text,
.register-card-body .input-group .form-control.is-valid ~ .input-group-append .input-group-text {
border-color: #28a745;
}
.login-card-body .input-group .form-control.is-invalid:focus,
.register-card-body .input-group .form-control.is-invalid:focus {
box-shadow: none;
}
.login-card-body .input-group .form-control.is-invalid ~ .input-group-append .input-group-text,
.register-card-body .input-group .form-control.is-invalid ~ .input-group-append .input-group-text {
border-color: #dc3545;
}
.login-card-body .input-group .input-group-text,
.register-card-body .input-group .input-group-text {
background-color: transparent;
border-bottom-right-radius: 0.25rem;
border-left: 0;
border-top-right-radius: 0.25rem;
color: #777;
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}
.login-box-msg,
.register-box-msg {
margin: 0;
padding: 0 20px 20px;
text-align: center;
}
.social-auth-links {
margin: 10px 0;
}
.dark-mode .login-card-body,
.dark-mode .register-card-body {
background-color: #343a40;
border-color: #6c757d;
color: #fff;
}
.dark-mode .login-logo a,
.dark-mode .register-logo a {
color: #fff;
}
.error-page {
margin: 20px auto 0;
width: 600px;
}
@media (max-width: 767.98px) {
.error-page {
width: 100%;
}
}
.error-page > .headline {
float: left;
font-size: 100px;
font-weight: 300;
}
@media (max-width: 767.98px) {
.error-page > .headline {
float: none;
text-align: center;
}
}
.error-page > .error-content {
display: block;
margin-left: 190px;
}
@media (max-width: 767.98px) {
.error-page > .error-content {
margin-left: 0;
}
}
.error-page > .error-content > h3 {
font-size: 25px;
font-weight: 300;
}
@media (max-width: 767.98px) {
.error-page > .error-content > h3 {
text-align: center;
}
}
.invoice {
background-color: #fff;
border: 1px solid rgba(0, 0, 0, 0.125);
position: relative;
}
.invoice-title {
margin-top: 0;
}
.dark-mode .invoice {
background-color: #343a40;
}
.profile-user-img {
border: 3px solid #adb5bd;
margin: 0 auto;
padding: 3px;
width: 100px;
}
.profile-username {
font-size: 21px;
margin-top: 5px;
}
.post {
border-bottom: 1px solid #adb5bd;
color: #666;
margin-bottom: 15px;
padding-bottom: 15px;
}
.post:last-of-type {
border-bottom: 0;
margin-bottom: 0;
padding-bottom: 0;
}
.post .user-block {
margin-bottom: 15px;
width: 100%;
}
.post .row {
width: 100%;
}
.dark-mode .post {
color: #fff;
border-color: #6c757d;
}
.product-image {
max-width: 100%;
height: auto;
width: 100%;
}
.product-image-thumbs {
-ms-flex-align: stretch;
align-items: stretch;
display: -ms-flexbox;
display: flex;
margin-top: 2rem;
}
.product-image-thumb {
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
border-radius: 0.25rem;
background-color: #fff;
border: 1px solid #dee2e6;
display: -ms-flexbox;
display: flex;
margin-right: 1rem;
max-width: 7rem;
padding: 0.5rem;
}
.product-image-thumb img {
max-width: 100%;
height: auto;
-ms-flex-item-align: center;
align-self: center;
}
.product-image-thumb:hover {
opacity: .5;
}
.product-share a {
margin-right: .5rem;
}
.projects td {
vertical-align: middle;
}
.projects .list-inline {
margin-bottom: 0;
}
.projects img.table-avatar,
.projects .table-avatar img {
border-radius: 50%;
display: inline;
width: 2.5rem;
}
.projects .project-state {
text-align: center;
}
body.iframe-mode .main-sidebar {
display: none;
}
body.iframe-mode .content-wrapper {
margin-left: 0 !important;
margin-top: 0 !important;
padding-bottom: 0 !important;
}
body.iframe-mode .main-header,
body.iframe-mode .main-footer {
display: none;
}
body.iframe-mode-fullscreen {
overflow: hidden;
}
body.iframe-mode-fullscreen.layout-navbar-fixed .wrapper .content-wrapper {
margin-top: 0 !important;
}
.content-wrapper {
height: 100%;
}
.content-wrapper.iframe-mode .btn-iframe-close {
color: #dc3545;
position: absolute;
line-height: 1;
right: .125rem;
top: .125rem;
z-index: 10;
visibility: hidden;
}
.content-wrapper.iframe-mode .btn-iframe-close:hover, .content-wrapper.iframe-mode .btn-iframe-close:focus {
-webkit-animation-name: fadeIn;
animation-name: fadeIn;
-webkit-animation-duration: 0.3s;
animation-duration: 0.3s;
-webkit-animation-fill-mode: both;
animation-fill-mode: both;
visibility: visible;
}
@media (hover: none) and (pointer: coarse) {
.content-wrapper.iframe-mode .btn-iframe-close {
visibility: visible;
}
}
.content-wrapper.iframe-mode .navbar-nav {
overflow-y: auto;
width: 100%;
}
.content-wrapper.iframe-mode .navbar-nav .nav-link {
white-space: nowrap;
}
.content-wrapper.iframe-mode .navbar-nav .nav-item {
position: relative;
}
.content-wrapper.iframe-mode .navbar-nav .nav-item:hover .btn-iframe-close, .content-wrapper.iframe-mode .navbar-nav .nav-item:focus .btn-iframe-close {
-webkit-animation-name: fadeIn;
animation-name: fadeIn;
-webkit-animation-duration: 0.3s;
animation-duration: 0.3s;
-webkit-animation-fill-mode: both;
animation-fill-mode: both;
visibility: visible;
}
@media (hover: none) and (pointer: coarse) {
.content-wrapper.iframe-mode .navbar-nav .nav-item:hover .btn-iframe-close, .content-wrapper.iframe-mode .navbar-nav .nav-item:focus .btn-iframe-close {
visibility: visible;
}
}
.content-wrapper.iframe-mode .tab-content {
position: relative;
}
.content-wrapper.iframe-mode .tab-pane + .tab-empty {
display: none;
}
.content-wrapper.iframe-mode .tab-empty {
width: 100%;
display: -ms-flexbox;
display: flex;
-ms-flex-pack: center;
justify-content: center;
-ms-flex-align: center;
align-items: center;
}
.content-wrapper.iframe-mode .tab-loading {
position: absolute;
top: 0;
left: 0;
width: 100%;
display: none;
background-color: #f4f6f9;
}
.content-wrapper.iframe-mode .tab-loading > div {
display: -ms-flexbox;
display: flex;
-ms-flex-pack: center;
justify-content: center;
-ms-flex-align: center;
align-items: center;
width: 100%;
height: 100%;
}
.content-wrapper.iframe-mode iframe {
border: 0;
width: 100%;
height: 100%;
margin-bottom: -8px;
}
.content-wrapper.iframe-mode iframe .content-wrapper {
padding-bottom: 0 !important;
}
body.iframe-mode-fullscreen .content-wrapper.iframe-mode {
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
margin-left: 0 !important;
height: 100%;
min-height: 100%;
z-index: 1048;
}
.permanent-btn-iframe-close .btn-iframe-close {
-webkit-animation: none !important;
animation: none !important;
visibility: visible !important;
opacity: 1;
}
.dark-mode .content-wrapper.iframe-mode .tab-loading {
background-color: #343a40;
}
.content-wrapper.kanban {
height: 1px;
}
.content-wrapper.kanban .content {
height: 100%;
overflow-x: auto;
overflow-y: hidden;
}
.content-wrapper.kanban .content .container,
.content-wrapper.kanban .content .container-fluid {
width: -webkit-max-content;
width: -moz-max-content;
width: max-content;
display: -ms-flexbox;
display: flex;
-ms-flex-align: stretch;
align-items: stretch;
}
.content-wrapper.kanban .content-header + .content {
height: calc(100% - ((2 * 15px) + (1.8rem * 1.2)));
}
.content-wrapper.kanban .card .card-body {
padding: .5rem;
}
.content-wrapper.kanban .card.card-row {
width: 340px;
display: inline-block;
margin: 0 .5rem;
}
.content-wrapper.kanban .card.card-row:first-child {
margin-left: 0;
}
.content-wrapper.kanban .card.card-row .card-body {
height: calc(100% - (12px + (1.8rem * 1.2) + .5rem));
overflow-y: auto;
}
.content-wrapper.kanban .card.card-row .card:last-child {
margin-bottom: 0;
border-bottom-width: 1px;
}
.content-wrapper.kanban .card.card-row .card .card-header {
padding: .5rem .75rem;
}
.content-wrapper.kanban .card.card-row .card .card-body {
padding: .75rem;
}
.content-wrapper.kanban .btn-tool.btn-link {
text-decoration: underline;
padding-left: 0;
padding-right: 0;
}
/*# sourceMappingURL=adminlte.pages.css.map */

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 339 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 647 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 413 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 362 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Some files were not shown because too many files have changed in this diff Show More