views.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. from django.db.models import Q
  2. from django.http import HttpResponse
  3. from django.shortcuts import render, redirect
  4. from apps.main.models import Playlist
  5. from django.contrib.auth.decorators import login_required # redirects user to settings.LOGIN_URL
  6. from allauth.socialaccount.models import SocialToken
  7. from django.views.decorators.http import require_POST
  8. from django.contrib import messages
  9. from django.template import Context, loader
  10. # Create your views here.
  11. @login_required
  12. def home(request):
  13. user_profile = request.user.profile
  14. user_playlists = user_profile.playlists.order_by("-num_of_accesses")
  15. watching = user_profile.playlists.filter(marked_as="watching").order_by("-num_of_accesses")
  16. #### FOR NEWLY JOINED USERS ######
  17. channel_found = True
  18. if user_profile.just_joined:
  19. if user_profile.import_in_progress:
  20. return render(request, "import_in_progress.html")
  21. else:
  22. if user_profile.access_token.strip() == "" or user_profile.refresh_token.strip() == "":
  23. user_social_token = SocialToken.objects.get(account__user=request.user)
  24. user_profile.access_token = user_social_token.token
  25. user_profile.refresh_token = user_social_token.token_secret
  26. user_profile.expires_at = user_social_token.expires_at
  27. request.user.save()
  28. user_profile.just_joined = False
  29. user_profile.save()
  30. return render(request, "home.html", {"import_successful": True})
  31. # if Playlist.objects.getUserYTChannelID(request.user) == -1: # user channel not found
  32. # channel_found = False
  33. # else:
  34. # Playlist.objects.initPlaylist(request.user, None) # get all playlists from user's YT channel
  35. # return render(request, "home.html", {"import_successful": True})
  36. ##################################
  37. if request.method == "POST":
  38. print(request.POST)
  39. if Playlist.objects.initPlaylist(request.user, request.POST['playlist-id'].strip()) == -1:
  40. print("No such playlist found.")
  41. playlist = []
  42. videos = []
  43. else:
  44. playlist = user_profile.playlists.get(playlist_id__exact=request.POST['playlist-id'].strip())
  45. videos = playlist.videos.all()
  46. else: # GET request
  47. videos = []
  48. playlist = []
  49. print("TESTING")
  50. return render(request, 'home.html', {"channel_found": channel_found,
  51. "playlist": playlist,
  52. "videos": videos,
  53. "user_playlists": user_playlists,
  54. "watching": watching})
  55. @login_required
  56. def view_video(request, playlist_id, video_id):
  57. video = request.user.profile.playlists.get(playlist_id=playlist_id).videos.get(video_id=video_id)
  58. print(video.name)
  59. return HttpResponse(loader.get_template("intercooler/video_details.html").render({"video": video}))
  60. @login_required
  61. def video_notes(request, playlist_id, video_id):
  62. video = request.user.profile.playlists.get(playlist_id=playlist_id).videos.get(video_id=video_id)
  63. if request.method == "POST":
  64. if 'video-notes-text-area' in request.POST:
  65. video.user_notes = request.POST['video-notes-text-area']
  66. video.save()
  67. return HttpResponse(loader.get_template("intercooler/messages.html").render(
  68. {"message_type": "success", "message_content": "Saved!"}))
  69. else:
  70. print("GET VIDEO NOTES")
  71. return HttpResponse(loader.get_template("intercooler/video_notes.html").render({"video": video,
  72. "playlist_id": playlist_id}))
  73. @login_required
  74. def view_playlist(request, playlist_id):
  75. user_profile = request.user.profile
  76. user_playlists = user_profile.playlists.all()
  77. # specific playlist requested
  78. playlist = user_profile.playlists.get(playlist_id__exact=playlist_id)
  79. playlist.num_of_accesses += 1
  80. playlist.save()
  81. videos = playlist.videos.all()
  82. if not playlist.has_playlist_changed:
  83. Playlist.objects.checkIfPlaylistChangedOnYT(request.user, playlist_id)
  84. return render(request, 'view_playlist.html', {"playlist": playlist,
  85. "videos": videos,
  86. "user_playlists": user_playlists})
  87. @login_required
  88. def all_playlists(request, playlist_type):
  89. """
  90. Possible playlist types for marked_as attribute: (saved in database like this)
  91. "none", "watching", "plan-to-watch"
  92. """
  93. playlist_type = playlist_type.lower()
  94. if playlist_type == "" or playlist_type == "all":
  95. playlists = request.user.profile.playlists.all()
  96. playlist_type_display = "All Playlists"
  97. elif playlist_type == "user-owned": # YT playlists owned by user
  98. playlists = request.user.profile.playlists.all().filter(is_user_owned=True)
  99. playlist_type_display = "Your YouTube Playlists"
  100. elif playlist_type == "imported": # YT playlists (public) owned by others
  101. playlists = request.user.profile.playlists.all().filter(is_user_owned=False)
  102. playlist_type_display = "Imported playlists"
  103. elif playlist_type == "favorites": # YT playlists (public) owned by others
  104. playlists = request.user.profile.playlists.all().filter(is_favorite=True)
  105. playlist_type_display = "Favorites"
  106. elif playlist_type.lower() in ["watching", "plan-to-watch"]:
  107. playlists = request.user.profile.playlists.filter(marked_as=playlist_type.lower())
  108. playlist_type_display = playlist_type.lower().replace("-", " ")
  109. elif playlist_type.lower() == "home": # displays cards of all playlist types
  110. return render(request, 'playlists_home.html')
  111. else:
  112. return redirect('home')
  113. return render(request, 'all_playlists.html', {"playlists": playlists,
  114. "playlist_type": playlist_type,
  115. "playlist_type_display": playlist_type_display})
  116. @login_required
  117. def order_playlist_by(request, playlist_id, order_by):
  118. playlist = request.user.profile.playlists.get(playlist_id=playlist_id)
  119. if order_by == "popularity":
  120. videos = playlist.videos.order_by("-like_count")
  121. elif order_by == "date-published":
  122. videos = playlist.videos.order_by("-published_at")
  123. elif order_by == "views":
  124. videos = playlist.videos.order_by("-view_count")
  125. elif order_by == "has-cc":
  126. videos = playlist.videos.filter(has_cc=True)
  127. elif order_by == "duration":
  128. videos = playlist.videos.order_by("-duration_in_seconds")
  129. else:
  130. return redirect('home')
  131. return HttpResponse(loader.get_template("intercooler/videos.html").render({"playlist": playlist, "videos": videos}))
  132. @login_required
  133. def order_playlists_by(request, playlist_type, order_by):
  134. if playlist_type == "" or playlist_type.lower() == "all":
  135. playlists = request.user.profile.playlists.all().order_by(f"-{order_by.replace('-', '_')}")
  136. playlist_type = "All Playlists"
  137. elif playlist_type.lower() == "favorites":
  138. playlists = request.user.profile.playlists.filter(is_favorite=True).order_by(f"-{order_by.replace('-', '_')}")
  139. playlist_type = "Favorites"
  140. elif playlist_type.lower() == "watching":
  141. playlists = request.user.profile.playlists.filter(on_watch=True).order_by(f"-{order_by.replace('-', '_')}")
  142. playlist_type = "Watching"
  143. else:
  144. return redirect('home')
  145. return render(request, 'all_playlists.html', {"playlists": playlists, "playlist_type": playlist_type})
  146. @login_required
  147. def mark_playlist_as(request, playlist_id, mark_as):
  148. playlist = request.user.profile.playlists.get(playlist_id=playlist_id)
  149. marked_as_response = ""
  150. if mark_as in ["watching", "on-hold", "plan-to-watch"]:
  151. playlist.marked_as = mark_as
  152. playlist.save()
  153. marked_as_response = f'<span class="badge bg-success text-white" >{mark_as.replace("-", " ")}</span>'
  154. elif mark_as == "none":
  155. playlist.marked_as = mark_as
  156. playlist.save()
  157. else:
  158. return render('home')
  159. return HttpResponse(marked_as_response)
  160. @login_required
  161. def playlists_home(request):
  162. return render(request, 'playlists_home.html')
  163. @login_required
  164. @require_POST
  165. def delete_videos(request):
  166. print(request.POST)
  167. return HttpResponse("Worked!")
  168. @login_required
  169. @require_POST
  170. def search_playlists(request, playlist_type):
  171. print(request.POST) # prints <QueryDict: {'search': ['aa']}>
  172. search_query = request.POST["search"]
  173. if playlist_type == "all":
  174. try:
  175. playlists = request.user.profile.playlists.all().filter(name__startswith=search_query)
  176. except:
  177. playlists = request.user.profile.playlists.all()
  178. playlist_type_display = "All Playlists"
  179. elif playlist_type == "user-owned": # YT playlists owned by user
  180. try:
  181. playlists = request.user.profile.playlists.filter(Q(name__startswith=search_query) & Q(is_user_owned=True))
  182. except:
  183. playlists = request.user.profile.playlists.filter(is_user_owned=True)
  184. playlist_type_display = "Your YouTube Playlists"
  185. elif playlist_type == "imported": # YT playlists (public) owned by others
  186. try:
  187. playlists = request.user.profile.playlists.filter(Q(name__startswith=search_query) & Q(is_user_owned=False))
  188. except:
  189. playlists = request.user.profile.playlists.filter(is_user_owned=False)
  190. playlist_type_display = "Imported Playlists"
  191. elif playlist_type == "favorites": # YT playlists (public) owned by others
  192. try:
  193. playlists = request.user.profile.playlists.filter(Q(name__startswith=search_query) & Q(is_favorite=True))
  194. except:
  195. playlists = request.user.profile.playlists.filter(is_favorite=True)
  196. playlist_type_display = "Your Favorites"
  197. elif playlist_type in ["watching", "plan-to-watch"]:
  198. try:
  199. playlists = request.user.profile.playlists.filter(
  200. Q(name__startswith=search_query) & Q(marked_as=playlist_type))
  201. except:
  202. playlists = request.user.profile.playlists.all().filter(marked_as=playlist_type)
  203. playlist_type_display = playlist_type.replace("-", " ")
  204. return HttpResponse(loader.get_template("intercooler/playlists.html")
  205. .render({"playlists": playlists,
  206. "playlist_type_display": playlist_type_display,
  207. "playlist_type": playlist_type,
  208. "search_query": search_query}))
  209. #### MANAGE VIDEOS #####
  210. def mark_video_favortie(request, playlist_id, video_id):
  211. video = request.user.profile.playlists.get(playlist_id=playlist_id).videos.get(video_id=video_id)
  212. if video.is_favorite:
  213. video.is_favorite = False
  214. video.save()
  215. return HttpResponse('<i class="far fa-heart"></i>')
  216. else:
  217. video.is_favorite = True
  218. video.save()
  219. return HttpResponse('<i class="fas fa-heart"></i>')
  220. ###########
  221. @login_required
  222. @require_POST
  223. def search_UnTube(request):
  224. print(request.POST)
  225. search_query = request.POST["search"]
  226. all_playlists = request.user.profile.playlists.all()
  227. videos = []
  228. starts_with = False
  229. contains = False
  230. if request.POST['search-settings'] == 'starts-with':
  231. playlists = request.user.profile.playlists.filter(name__startswith=search_query) if search_query != "" else []
  232. if search_query != "":
  233. for playlist in all_playlists:
  234. pl_videos = playlist.videos.filter(name__startswith=search_query)
  235. if pl_videos.count() != 0:
  236. for v in pl_videos.all():
  237. videos.append(v)
  238. starts_with = True
  239. else:
  240. playlists = request.user.profile.playlists.filter(name__contains=search_query) if search_query != "" else []
  241. if search_query != "":
  242. for playlist in all_playlists:
  243. pl_videos = playlist.videos.filter(name__contains=search_query)
  244. if pl_videos.count() != 0:
  245. for v in pl_videos.all():
  246. videos.append(v)
  247. contains = True
  248. return HttpResponse(loader.get_template("intercooler/search_untube.html")
  249. .render({"playlists": playlists,
  250. "videos": videos,
  251. "videos_count": len(videos),
  252. "search_query": search_query,
  253. "starts_with": starts_with,
  254. "contains": contains}))
  255. @login_required
  256. def manage_playlists(request):
  257. return render(request, "manage_playlists.html")
  258. @login_required
  259. def manage_view_page(request, page):
  260. if page == "import":
  261. return HttpResponse(loader.get_template("intercooler/manage_playlists_import.html")
  262. .render(
  263. {"manage_playlists_import_textarea": request.user.profile.manage_playlists_import_textarea}))
  264. elif page == "create":
  265. return HttpResponse("<br><hr><br><h2>Working on this.</h2>")
  266. elif page == "untube":
  267. return HttpResponse("<br><hr><br><h2>Coming soon. Maybe.</h2>")
  268. else:
  269. return redirect('home')
  270. @login_required
  271. @require_POST
  272. def manage_save(request, what):
  273. if what == "manage_playlists_import_textarea":
  274. request.user.profile.manage_playlists_import_textarea = request.POST["import-playlist-textarea"]
  275. request.user.save()
  276. return HttpResponse("")
  277. @login_required
  278. @require_POST
  279. def manage_import_playlists(request):
  280. playlist_links = request.POST["import-playlist-textarea"].replace(",", "").split("\n")
  281. num_playlists_already_in_db = 0
  282. num_playlists_initialized_in_db = 0
  283. num_playlists_not_found = 0
  284. new_playlists = []
  285. old_playlists = []
  286. not_found_playlists = []
  287. for playlist_link in playlist_links:
  288. if playlist_link != "":
  289. pl_id = Playlist.objects.getPlaylistId(playlist_link)
  290. if pl_id is None:
  291. num_playlists_not_found += 1
  292. continue
  293. status = Playlist.objects.initPlaylist(request.user, pl_id)
  294. if status == -1 or status == -2:
  295. print("\nNo such playlist found:", pl_id)
  296. num_playlists_not_found += 1
  297. not_found_playlists.append(playlist_link)
  298. elif status == -3:
  299. num_playlists_already_in_db += 1
  300. playlist = request.user.profile.playlists.get(playlist_id__exact=pl_id)
  301. old_playlists.append(playlist)
  302. else:
  303. print(status)
  304. playlist = request.user.profile.playlists.get(playlist_id__exact=pl_id)
  305. new_playlists.append(playlist)
  306. num_playlists_initialized_in_db += 1
  307. request.user.profile.manage_playlists_import_textarea = ""
  308. request.user.save()
  309. return HttpResponse(loader.get_template("intercooler/manage_playlists_import_results.html")
  310. .render(
  311. {"new_playlists": new_playlists,
  312. "old_playlists": old_playlists,
  313. "not_found_playlists": not_found_playlists,
  314. "num_playlists_already_in_db": num_playlists_already_in_db,
  315. "num_playlists_initialized_in_db": num_playlists_initialized_in_db,
  316. "num_playlists_not_found": num_playlists_not_found
  317. }))