views.py 10.0 KB

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