index.html 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. {% load socialaccount %}
  2. {% load static %}
  3. <!doctype html>
  4. <html lang="en">
  5. <head>
  6. <meta charset="utf-8">
  7. <meta name="keywords" content="youtube, playlists, videos, delete videos, delete playlists, delete multiple videos, move multiple videos, merge playlists, video manager, playlist manager, youtube playlists, untube, google">
  8. <meta name="viewport" content="width=device-width, initial-scale=1">
  9. <meta name="description" content="UnTube is a simple Youtube playlist manager. Modify and keep track of your YouTube playlists with ease.">
  10. <meta name="author" content="Mohammed Abu Bakar Khan">
  11. <title>UnTube - A Youtube Playlist Manager</title>
  12. <link rel="canonical" href="https://getbootstrap.com/docs/5.0/examples/carousel/">
  13. <link href="https://fonts.googleapis.com/css2?family=Fredoka+One&family=Open+Sans&display=swap" rel="stylesheet">
  14. <link href="{% static 'fontawesome-free-5.15.3-web/css/all.min.css' %}" rel="stylesheet">
  15. <!-- Bootstrap core CSS -->
  16. <link href="{% static 'bootstrap5.0.1/css/bootstrap.min.css' %}" rel="stylesheet">
  17. <style>
  18. .bd-placeholder-img {
  19. font-size: 1.125rem;
  20. text-anchor: middle;
  21. -webkit-user-select: none;
  22. -moz-user-select: none;
  23. user-select: none;
  24. }
  25. @media (min-width: 768px) {
  26. .bd-placeholder-img-lg {
  27. font-size: 3.5rem;
  28. }
  29. }
  30. </style>
  31. <link href="https://fonts.googleapis.com/css2?family=Fredoka+One&family=Open+Sans&display=swap" rel="stylesheet">
  32. <!-- Custom styles for this template -->
  33. <link href="{% static 'css/carousel.css' %}" rel="stylesheet">
  34. </head>
  35. <body style="font-family: 'Fredoka One',serif; background-color: #FDF4DC;">
  36. <main>
  37. <div class="container py-4">
  38. {% if messages %}
  39. {% for message in messages %}
  40. <div class="alert alert-dismissible bg-{% if message.tags == "error" %}danger{% else %}{{ message.tags }}{% endif %} text-white border-0 fade show" role="alert">
  41. <strong>{{message|safe}}</strong>
  42. </div>
  43. {% endfor %}
  44. {% endif %}
  45. <div class="p-5 mb-4 bg-light rounded-3">
  46. <div class="container-fluid py-5">
  47. <h1 class="display-5 fw-bold">UnTube</h1>
  48. <p class="col-md-8 fs-4">A simple Youtube playlist manager to help you modify and keep track of your YouTube playlists with ease.</p>
  49. {% if user.is_authenticated %}
  50. <a class="btn btn-success btn-lg" href="{% url 'home' %}">Visit Dashboard</a>
  51. {% else %}
  52. <a class="btn btn-danger btn-lg" href="{% provider_login_url 'google' %}">Login with Google</a>
  53. {% endif %}
  54. <a class="btn btn-primary btn-lg" href="#more">Tell me more</a>
  55. </div>
  56. </div>
  57. <footer class="mastfoot mt-auto">
  58. <div class="d-flex justify-content-center text-dark">
  59. <h5>Made with <i class="fas fa-heart" style="color: #e25555;"></i> & <i class="fas fa-mug-hot" style="color: brown;"></i> by <a href="https://github.com/sleepytaco" target="_blank" style="text-decoration: none;"><span style="border-bottom: 3px #d56b6b dashed;">Mohammed Khan</span></a> </h5>
  60. </div>
  61. </footer>
  62. </div>
  63. <!-- Marketing messaging and featurettes
  64. ================================================== -->
  65. <!-- Wrap the rest of the page in another container to center all the content. -->
  66. <div class="container marketing">
  67. <!-- START THE FEATURETTES -->
  68. <hr class="featurette-divider" id="more">
  69. <div class="row featurette">
  70. <div class="col-md-7 order-md-2">
  71. <h1>UnTube automatically gets statistics for all your playlists when you first log in.</h1>
  72. <p class="lead">For all of your YouTube playlists, statistics like playlist duration, number of unavailable videos, or whether the playlist has any duplicate videos are automatically calculated.</p>
  73. </div>
  74. <div class="col-md-5 order-md-1">
  75. <div class="text-center">
  76. <img src="{% static 'assets/imgs/playlist_stats.gif' %}" class="rounded" style="max-width:100%; height: auto">
  77. </div>
  78. </div>
  79. </div>
  80. <hr class="featurette-divider">
  81. <div class="row featurette">
  82. <div class="col-md-7">
  83. <h1 class="">Ideal for people with a lot of playlists on YouTube.</h1>
  84. <p class="lead">UnTube offers features like bulk deletion as well as copying and moving videos from one playlist to multiple other playlists at once.</p>
  85. </div>
  86. <div class="col-md-5">
  87. <div class="text-center">
  88. <img src="{% static 'assets/imgs/features.gif' %}" class="rounded" style="max-width:100%; height: auto">
  89. </div>
  90. </div>
  91. </div>
  92. <hr class="featurette-divider">
  93. <div class="row featurette">
  94. <div class="col-md-7 order-md-2">
  95. <h1 class="">Organize and search for playlists and videos in your collection.</h1>
  96. <p class="lead">
  97. UnTube organizes your playlists into specific categories. Further, you can create your own categories by tagging playlists.
  98. Since UnTube stores a reference to all the videos in your playlists, you can easily search for the videos you want.
  99. </p>
  100. </div>
  101. <div class="col-md-5 order-md-1">
  102. <div class="text-center">
  103. <img src="{% static 'assets/imgs/organize.gif' %}" class="rounded" style="max-width:100%; height: auto">
  104. </div>
  105. </div>
  106. </div>
  107. <hr class="featurette-divider">
  108. <div class="row featurette">
  109. <div class="col-md-7">
  110. <h1 class="">Mark playlists as watching.</h1>
  111. <p class="lead">A small tool to keep track of the duration left for a playlist by letting you mark videos as watched.
  112. Might serve as a motivator to finish any kind of academic playlist <i class="far fa-smile-wink fa-lg"></i> </p>
  113. </div>
  114. <div class="col-md-5">
  115. <div class="text-center">
  116. <img src="{% static 'assets/imgs/watching.gif' %}" class="rounded" style=" max-width:100%; height: auto">
  117. </div>
  118. </div>
  119. </div>
  120. <hr class="featurette-divider">
  121. <div class="row featurette">
  122. <div class="col-md-7 order-md-2">
  123. <h1 class="">
  124. There's a public playlist you like? Import them into your collection.</h1>
  125. <p class="lead">
  126. You can import playlists you do not own into your UnTube collection. All the features above would still apply to playlists you do not own.
  127. That means you can mark imported playlists as watching, tag them and also copy videos from imported playlists
  128. into your own playlists.
  129. </p>
  130. </div>
  131. <div class="col-md-5 order-md-1">
  132. <div class="text-center">
  133. <img src="{% static 'assets/imgs/import.gif' %}" class="rounded" style="max-width:100%; height: auto">
  134. </div>
  135. </div>
  136. </div>
  137. <hr class="featurette-divider">
  138. <div class="row featurette">
  139. <div class="col-md-7">
  140. <h1 class="">And lastly, a beautiful dashboard.</h1>
  141. <p class="lead">Get greeted by some beautiful charts, view your most popular tags, and see a progress list of playlist you've marked as watching. </p>
  142. </div>
  143. <div class="col-md-5">
  144. <div class="text-center">
  145. <img src="{% static 'assets/imgs/dashboard.gif' %}" class="rounded" style=" max-width:100%; height: auto">
  146. </div>
  147. </div>
  148. </div>
  149. <hr class="featurette-divider">
  150. <div class="row featurette justify-content-center">
  151. <div class="col-md d-flex flex-column justify-content-center">
  152. <h1>
  153. Some more features:
  154. </h1>
  155. <h3>
  156. <span style="border-bottom: 4px #c2d56b dashed;">take notes on videos</span>,
  157. </h3>
  158. <h3>
  159. <span style="border-bottom: 4px #c2d56b dashed;">filter and sort playlists/videos</span>,
  160. </h3>
  161. <h3>
  162. <span style="border-bottom: 4px #c2d56b dashed;">auto-update your playlists with YouTube</span>,
  163. </h3>
  164. <h3>
  165. <span style="border-bottom: 4px #c2d56b dashed;">pin and like playlists/videos</span>,
  166. </h3>
  167. <h3>
  168. <span style="border-bottom: 4px #c2d56b dashed;">storing names of videos that go unavailable</span>
  169. </h3>
  170. </div>
  171. <div class="col-md d-flex flex-column justify-content-center">
  172. <h1>About:</h1>
  173. <h3>
  174. This app was made possible because of the <a href="https://developers.google.com/youtube/v3/" target="_blank" style="text-decoration: none;"><span style="border-bottom: 4px #d56b80 dashed;">YouTube Data API</span></a>. By logging in with Google I get access to your
  175. public Google account information <i class="fa fa-plus"></i> the permission to modify your YouTube data. That means you can manage
  176. your private playlists on UnTube.
  177. </h3>
  178. </div>
  179. </div>
  180. <hr class="featurette-divider">
  181. <!-- /END THE FEATURETTES -->
  182. </div><!-- /.container -->
  183. <!-- FOOTER -->
  184. <footer class="container">
  185. <p class="float-end h4 text-dark"><a href="#" style="color: black"><i class="fas fa-angle-double-up fa-lg"></i></a></p>
  186. <p class="text-dark">
  187. <i class="far fa-copyright"></i> 2021–2022
  188. <a href="https://github.com/sleepytaco" target="_blank" style="text-decoration: none; color: black">
  189. Mohammed Khan
  190. </a>
  191. <!--
  192. <small><i class="fas fa-circle fa-sm"></i></small>
  193. Loved what I made?
  194. <a href="https://www.buymeacoffee.com/mohammedabkhan" style="text-decoration: none" target="_blank">
  195. <span style="border-bottom: 3px #d56b6b dashed;">You can support me by buying me some coffee <i class="far fa-smile"></i> </span>
  196. </a>
  197. -->
  198. <small><i class="fas fa-circle fa-sm"></i></small>
  199. <a style="text-decoration: none; color: black" href="https://github.com/sleepytaco/UnTube" target="_blank"><i class="fab fa-github fa-lg" style="color: black;"></i></a>
  200. <small><i class="fas fa-circle fa-sm"></i></small>
  201. <a {% if request.session.liked_untube %}hx-post="{% url 'unlike_untube' %}"{% else %}hx-post="{% url 'like_untube' %}"{% endif %} hx-trigger="click" hx-swap="outerHTML" style="text-decoration: none; color: black">
  202. <i class="fas fa-heart" {% if request.session.liked_untube %}style="color: #d02e2e"{% endif %}></i> {{ likes }} likes {% if not request.session.liked_untube %}(click it){% endif %}
  203. </a>
  204. <small><i class="fas fa-circle fa-sm"></i></small>
  205. <a href="#" style="text-decoration: none; color: black">
  206. <i class="fas fa-users"></i> {{ users_joined }} users joined
  207. </a>
  208. </p>
  209. </footer>
  210. </main>
  211. <script src="{% static 'htmx/htmx.min.js' %}" type="application/javascript"></script>
  212. <script src="{% static 'bootstrap5.0.1/js/bootstrap.bundle.min.js' %}" type="application/javascript"></script>
  213. <script type="application/javascript">
  214. // send csrf_token when htmx does a post request
  215. document.body.addEventListener('htmx:configRequest', (event) => {
  216. event.detail.headers['X-CSRFToken'] = '{{ csrf_token }}';
  217. })
  218. </script>
  219. </body>
  220. </html>