Last active
November 26, 2020 18:07
-
-
Save Himan10/72a6764a174cef67b3d892a1c3bfee77 to your computer and use it in GitHub Desktop.
Find songs path that are stored in local directory
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Finding tests in NoName | |
| Trying: | |
| main('My December') | |
| Expecting: | |
| /home/hi-man/Music/LinkinPark/Linkin Park - My December. Live Projekt Revolution 2002 Las Vegas._480p.mp4 | |
| /home/hi-man/Music/LinkinPark/my_december.mp4 | |
| ok | |
| Trying: | |
| main('turn-the page-metallica') | |
| Expecting: | |
| /home/hi-man/Music/LinkinPark/Metallica Turn the Page (Official Music Video)_qPOTEs_yTJo_360p.mp4 | |
| ok | |
| Trying: | |
| main('crawling linkin park') | |
| Expecting: | |
| /home/hi-man/Music/LinkinPark/Crawling (Official Video) - Linkin Park.mp4 | |
| /home/hi-man/Music/LinkinPark/Linkin Park ft Chris Cornell - Crawling_HHH.mp4 | |
| /home/hi-man/Music/LinkinPark/Linkin Park _ Under Attack (Crawling Demo).mp4 | |
| /home/hi-man/Music/LinkinPark/Linkin Park - Crawling_Where'd You Go (Ghost in the Machine Remix).mp4 | |
| ok | |
| Trying: | |
| main('beautiful now zedd') | |
| Expecting: | |
| /home/hi-man/Music/Zedd - Beautiful Now (Official Music Video) ft. Jon Bellion.mp4 | |
| ok | |
| Trying: | |
| main('snuff SLIPKNOT') | |
| Expecting: | |
| /home/hi-man/Music/LinkinPark/Slipknot - Snuff [OFFICIAL VIDEO]_LXEKuttVRIo_360p.mp4 | |
| ok | |
| Trying: | |
| main('--Interstellar Theme-- Hans Zimmer') | |
| Expecting: | |
| /home/hi-man/Music/Hans Zimmer - Interstellar Theme (Live in Prague).mp4 | |
| ok |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import os | |
| import re | |
| import doctest | |
| import cProfile | |
| from functools import partial | |
| orignalSongNames = [] | |
| def _remove_punctuations(songname): | |
| songname = re.sub(r"[\s\W_]+", "", songname) | |
| return songname.lower() | |
| def yieldOrignalNames(path): | |
| """ gonna use a generator function """ | |
| for dir_, subdir, files in os.walk(path, topdown=True): | |
| yield dir_, files | |
| def SearchLocal(user_input: str, path, AlreadySearched: dict): | |
| """ Search songs in local directory """ | |
| if path in AlreadySearched: | |
| return AlreadySearched[path] | |
| global orignalSongNames | |
| genObj = yieldOrignalNames(path) | |
| path, orignalSongNames = next(genObj) | |
| # Pause the generator at line 16 | |
| # until we send something to it or run next() | |
| temp = ", ".join( | |
| str(i) + "-" + _remove_punctuations(orignalSongNames[i]) | |
| for i in range(0, len(orignalSongNames)) | |
| ) | |
| # Find the songs | |
| user_input = re.sub(r'[^\s\w]', ' ', user_input).split() | |
| match = 0 | |
| n = len(user_input) | |
| i = 0 | |
| while i < n and match < n: | |
| pattern = r"[^,]*{0}[^,]*(?:mp[3|4]|opus|mkv|webm)".format(user_input[i]) | |
| found = re.findall(pattern, temp, re.I) # returns a list | |
| #print(found, path) | |
| if found.__sizeof__() > 40: # not an empty list | |
| i += 1 | |
| match += 1 | |
| temp = ", ".join(found) | |
| if match > n: | |
| genObj.close() | |
| break | |
| else: | |
| try: | |
| path, orignalSongNames = next(genObj) # Call for path of another dir. | |
| success, found, path = SearchLocal(' '.join(user_input), path, AlreadySearched) # Recursive call | |
| AlreadySearched[path] = success, found, path | |
| #print(success, path) | |
| if success: | |
| genObj.close() | |
| break | |
| except Exception as err: | |
| # Possible condition : We've iterated over all the paths but couldn't find any | |
| return False, None, path | |
| AlreadySearched[path] = True, found, path | |
| return True, found, path | |
| def test(): | |
| """ | |
| >>> main('My December') | |
| /home/hi-man/Music/LinkinPark/Linkin Park - My December. Live Projekt Revolution 2002 Las Vegas._480p.mp4 | |
| /home/hi-man/Music/LinkinPark/my_december.mp4 | |
| >>> main('turn-the page-metallica') | |
| /home/hi-man/Music/LinkinPark/Metallica Turn the Page (Official Music Video)_qPOTEs_yTJo_360p.mp4 | |
| >>> main('crawling linkin park') | |
| /home/hi-man/Music/LinkinPark/Crawling (Official Video) - Linkin Park.mp4 | |
| /home/hi-man/Music/LinkinPark/Linkin Park ft Chris Cornell - Crawling_HHH.mp4 | |
| /home/hi-man/Music/LinkinPark/Linkin Park _ Under Attack (Crawling Demo).mp4 | |
| /home/hi-man/Music/LinkinPark/Linkin Park - Crawling_Where'd You Go (Ghost in the Machine Remix).mp4 | |
| >>> main('beautiful now zedd') | |
| /home/hi-man/Music/Zedd - Beautiful Now (Official Music Video) ft. Jon Bellion.mp4 | |
| >>> main('snuff SLIPKNOT') | |
| /home/hi-man/Music/LinkinPark/Slipknot - Snuff [OFFICIAL VIDEO]_LXEKuttVRIo_360p.mp4 | |
| >>> main('--Interstellar Theme-- Hans Zimmer') | |
| /home/hi-man/Music/Hans Zimmer - Interstellar Theme (Live in Prague).mp4 | |
| """ | |
| def main(user_input: str): | |
| # Create a partial argument with limited args. | |
| AS = {} | |
| SearchLocalT = partial(SearchLocal, AlreadySearched = AS) | |
| path = '/home/hi-man/Music' | |
| result = SearchLocalT(user_input, path) | |
| if result[0]: | |
| for i in result[1]: | |
| print(os.path.join(result[2], orignalSongNames[int(i.lstrip().split('-')[0])])) | |
| else: | |
| return False | |
| if __name__ == "__main__": | |
| pass | |
| doctest.run_docstring_examples(test, globals(), verbose=True) |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Fixed the problem :) it now takes only 2 recursive calls to search a song (only case, if the song is not present in all the 3 directories) because I've only two sub-directories inside the main directory...
If a song present in the first sub-directory then it will take only 1 recursive call =
main(not found) -> sub-directory(found)If a song present in the main directory then no recursive call =
main(found)