views.py 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. import bleach
  2. from django.contrib.auth.decorators import login_required
  3. from django.db.models import Q
  4. from django.http import HttpResponse
  5. from django.shortcuts import render, redirect
  6. from django.template import loader
  7. from django.views.decorators.http import require_POST
  8. @login_required
  9. def search(request):
  10. if request.method == "GET":
  11. print(request.GET)
  12. if 'mode' in request.GET:
  13. mode = bleach.clean(request.GET['mode'])
  14. else:
  15. mode = "playlists"
  16. if 'type' in request.GET:
  17. item_type = bleach.clean(request.GET["type"])
  18. else:
  19. item_type = "all"
  20. if 'query' in request.GET:
  21. query = bleach.clean(request.GET["query"])
  22. else:
  23. query = ''
  24. if 'tag' in request.GET:
  25. pl_tag = bleach.clean(request.GET["tag"])
  26. else:
  27. pl_tag = ""
  28. if 'channel' in request.GET:
  29. vid_channel_name = bleach.clean(request.GET["channel"])
  30. else:
  31. vid_channel_name = ""
  32. return render(request, 'search_untube_page.html',
  33. {"playlists": request.user.playlists.all(),
  34. "mode": mode,
  35. "item_type": item_type,
  36. "query": query,
  37. "pl_tag": pl_tag,
  38. "vid_channel_name": vid_channel_name})
  39. else:
  40. return redirect('home')
  41. @login_required
  42. @require_POST
  43. def search_UnTube(request):
  44. search_query = bleach.clean(request.POST["search"])
  45. if request.POST['search-settings'] == 'playlists':
  46. playlist_type = bleach.clean(request.POST["playlistsType"])
  47. all_playlists = request.user.playlists.filter(is_in_db=True)
  48. if playlist_type == "Favorite":
  49. all_playlists = all_playlists.filter(is_favorite=True)
  50. elif playlist_type == "Watching":
  51. all_playlists = all_playlists.filter(marked_as="watching")
  52. elif playlist_type == "Plan to Watch":
  53. all_playlists = all_playlists.filter(marked_as="plan-to-watch")
  54. elif playlist_type == "Owned":
  55. all_playlists = all_playlists.filter(is_user_owned=True)
  56. elif playlist_type == "Imported":
  57. all_playlists = all_playlists.filter(is_user_owned=False)
  58. elif playlist_type == "Mix":
  59. all_playlists = all_playlists.filter(is_yt_mix=True)
  60. if 'playlist-tags' in request.POST:
  61. tags = [bleach.clean(t) for t in request.POST.getlist('playlist-tags')]
  62. for tag in tags:
  63. all_playlists = all_playlists.filter(tags__name=tag)
  64. playlists = all_playlists.filter(Q(name__istartswith=search_query) | Q(
  65. user_label__istartswith=search_query))
  66. if not playlists.exists():
  67. playlists = all_playlists.filter(Q(name__icontains=search_query) | Q(
  68. user_label__icontains=search_query))
  69. if search_query.strip() == "":
  70. playlists = all_playlists
  71. order_by = bleach.clean(request.POST['sortPlaylistsBy'])
  72. if order_by == 'recently-accessed':
  73. playlists = playlists.order_by("-updated_at")
  74. elif order_by == 'playlist-duration-in-seconds':
  75. playlists = playlists.order_by("-playlist_duration_in_seconds")
  76. elif order_by == 'video-count':
  77. playlists = playlists.order_by("-video_count")
  78. return HttpResponse(loader.get_template("intercooler/search_untube_results.html")
  79. .render({"playlists": playlists,
  80. "view_mode": "playlists",
  81. "search_query": search_query,
  82. "playlist_type": playlist_type}))
  83. else:
  84. videos_type = bleach.clean(request.POST["videosType"])
  85. all_videos = request.user.videos.filter(is_unavailable_on_yt=False)
  86. if videos_type == "Liked":
  87. all_videos = all_videos.filter(liked=True)
  88. elif videos_type == "Favorite":
  89. all_videos = all_videos.filter(is_favorite=True)
  90. elif videos_type == "Watched":
  91. all_videos = all_videos.filter(is_marked_as_watched=True)
  92. elif videos_type == "Planned to Watch":
  93. all_videos = all_videos.filter(is_planned_to_watch=True)
  94. elif videos_type == "Unavailable":
  95. all_videos = all_videos.filter(Q(is_unavailable_on_yt=False) & Q(was_deleted_on_yt=True))
  96. if 'channel-names' in request.POST:
  97. channels = [bleach.clean(name) for name in request.POST.getlist('channel-names')]
  98. all_videos = all_videos.filter(channel_name__in=channels)
  99. videos = all_videos.filter(
  100. Q(name__istartswith=search_query) | Q(user_label__istartswith=search_query))
  101. if not videos.exists():
  102. videos = all_videos.filter(Q(name__icontains=search_query) | Q(
  103. user_label__icontains=search_query))
  104. if search_query.strip() == "":
  105. videos = all_videos
  106. order_by = bleach.clean(request.POST['sortVideosBy'])
  107. if order_by == 'recently-accessed':
  108. videos = videos.order_by("-updated_at")
  109. elif order_by == 'video-duration-in-seconds':
  110. videos = videos.order_by("-duration_in_seconds")
  111. elif order_by == 'most-liked':
  112. videos = videos.order_by("-like_count")
  113. elif order_by == 'most-views':
  114. videos = videos.order_by("-view_count")
  115. elif order_by == 'date-uploaded':
  116. videos = videos.order_by("-published_at")
  117. if 'has-cc' in request.POST:
  118. videos = videos.filter(has_cc=True)
  119. if 'playlist-ids' in request.POST:
  120. playlist_ids = [bleach.clean(pl_id) for pl_id in request.POST.getlist('playlist-ids')]
  121. videos = videos.filter(playlists__playlist_id__in=playlist_ids)
  122. return HttpResponse(loader.get_template("intercooler/search_untube_results.html")
  123. .render({"videos": videos,
  124. "view_mode": "videos",
  125. "videos_type": videos_type,
  126. "search_query": search_query}))
  127. @login_required
  128. @require_POST
  129. def search_library(request, library_type):
  130. # print(request.POST) # prints <QueryDict: {'search': ['aa']}>
  131. search_query = bleach.clean(request.POST["search"])
  132. watching = False
  133. playlists = None
  134. if library_type == "all":
  135. try:
  136. playlists = request.user.playlists.all().filter(Q(is_in_db=True)).filter(Q(name__startswith=search_query) | Q(user_label__startswith=search_query))
  137. except:
  138. playlists = request.user.playlists.all().filter(is_in_db=True)
  139. elif library_type == "user-owned": # YT playlists owned by user
  140. try:
  141. playlists = request.user.playlists.filter(Q(is_user_owned=True) & Q(is_in_db=True)).filter(
  142. Q(name__startswith=search_query) | Q(user_label__startswith=search_query))
  143. except:
  144. playlists = request.user.playlists.filter(Q(is_user_owned=True) & Q(is_in_db=True))
  145. elif library_type == "imported": # YT playlists (public) owned by others
  146. try:
  147. playlists = request.user.playlists.filter(Q(is_user_owned=False) & Q(is_in_db=True)).filter(
  148. Q(name__startswith=search_query) | Q(user_label__startswith=search_query))
  149. except:
  150. playlists = request.user.playlists.filter(Q(is_user_owned=True) & Q(is_in_db=True))
  151. elif library_type == "favorites": # YT playlists (public) owned by others
  152. try:
  153. playlists = request.user.playlists.filter(Q(is_favorite=True) & Q(is_in_db=True)).filter(
  154. Q(name__startswith=search_query) | Q(user_label__startswith=search_query))
  155. except:
  156. playlists = request.user.playlists.filter(Q(is_favorite=True) & Q(is_in_db=True))
  157. elif library_type in ["watching", "plan-to-watch"]:
  158. try:
  159. playlists = request.user.playlists.filter(Q(marked_as=library_type) & Q(is_in_db=True)).filter(
  160. Q(name__startswith=search_query) | Q(user_label__startswith=search_query) )
  161. except:
  162. playlists = request.user.playlists.all().filter(Q(marked_as=library_type) & Q(is_in_db=True))
  163. if library_type == "watching":
  164. watching = True
  165. elif library_type == "yt-mix": # YT playlists owned by user
  166. try:
  167. playlists = request.user.playlists.filter(Q(is_yt_mix=True) & Q(is_in_db=True)).filter(
  168. Q(name__startswith=search_query) | Q(user_label__startswith=search_query))
  169. except:
  170. playlists = request.user.playlists.filter(Q(is_yt_mix=True) & Q(is_in_db=True))
  171. elif library_type == 'unavailable-videos':
  172. try:
  173. videos = request.user.videos.filter(Q(is_unavailable_on_yt=False) & Q(was_deleted_on_yt=True)).filter(Q(name__startswith=search_query) | Q(user_label__startswith=search_query))
  174. except:
  175. videos = request.user.videos.filter(Q(is_unavailable_on_yt=False) & Q(was_deleted_on_yt=True))
  176. return HttpResponse(loader.get_template("intercooler/video_cards.html").render({"videos": videos}))
  177. return HttpResponse(loader.get_template("intercooler/playlists.html")
  178. .render({"playlists": playlists.order_by("-updated_at"),
  179. "show_controls": True,
  180. "watching": watching}))
  181. @login_required
  182. @require_POST
  183. def search_tagged_playlists(request, tag):
  184. search_query = bleach.clean(request.POST["search"])
  185. try:
  186. playlists = request.user.playlists.all().filter(Q(is_in_db=True) & Q(tags__name=tag)).filter(
  187. Q(name__startswith=search_query) | Q(user_label__startswith=search_query))
  188. except:
  189. playlists = request.user.playlists.all().filter(Q(is_in_db=True) & Q(tags__name=tag)).order_by("-updated_at")
  190. return HttpResponse(loader.get_template("intercooler/playlists.html")
  191. .render({"playlists": playlists}))