Skip to content
This repository has been archived by the owner on Sep 4, 2020. It is now read-only.

Commit

Permalink
Organizer module, updated FS, Bootstrap CSS
Browse files Browse the repository at this point in the history
Organizer module that re-organizes files in movie folder based on selected criterion. Currently has criterions for release date and IMDb score. Renames files by their movie title.
Closes #11

Signed-off-by: Harshvardhan Pandit <coolharsh55@gmail.com>
  • Loading branch information
coolharsh55 committed Aug 17, 2015
1 parent 993605e commit 5307a4c
Show file tree
Hide file tree
Showing 10 changed files with 551 additions and 20 deletions.
11 changes: 9 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,10 @@
- Filter and sort movies using metadata
- Auto-detect torrent formatted filenames
- Export list of movies. Sort and filter based on metadata.
- Organize movie files by release date or IMDb scores.

### Planned:
- Organise movies on disk automatically by their metadata such as release year, director, genre, etc.
- More organization criterias such as director, genre, etc.
- Compare contents of two disks to create a share/lend/borrow list
- Remote storage of disk index so that it can be viewed by others

Expand Down Expand Up @@ -83,6 +84,12 @@ Crawls the hard disk looking for movies and adds them to database. The crawler i
#### Load
Downloads and updates metadata for movies in database. The loader requires internet connectivity and will not function without it. It can take a substantial amount of time based on number of movies in database. Since this is not a complete release, some times the loader module can get stuck. You can stop the module safely in such cases.

#### Export
Exports a list of movies in database to a text file that is served as a download in the browser. The exported list can be ordered by various criterions such as release date, title, IMDb score, etc.

#### Organize
Renames files by their movie titles, and re-organizes them in folder based on selected criterion. All uncategorized files are moved to _'uncategorized'_ folder, and all non-movie files are movied to _'other files'_ folder.

## More Info

### Framework - Django/py2.7
Expand All @@ -95,7 +102,7 @@ The database is stored as a local database file named **db.sqlite3** in the hdd_
Currently, this build is in early stages and there are bound to be several bugs and issues. Please help its development by filing these in the bug/issue tracker, or email me.

### Logs
The project mains verbose logs in the ```./logs/``` folder. To help me understand performance bottlenecks and fix bugs, email this folder (*zipped*) to **hdd-indexer@harshp.com** with an *appropriate* subject line.
The project maintains verbose logs in the ```./logs/``` folder. To help me understand performance bottlenecks and fix bugs, email this folder (*zipped*) to **hdd-indexer@harshp.com** with an *appropriate* subject line.

### Github Issues
Please open related issues and bugs here using *Github Issues* so that it is easy for me to keep track and resolve them via commits.
Expand Down
14 changes: 12 additions & 2 deletions hdd_indexer/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,13 @@
'class': 'logging.FileHandler',
'filename': 'logs/export.log',
'formatter': 'verbose',
}
},
'organize': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': 'logs/organize.log',
'formatter': 'verbose',
},

},
'loggers': {
Expand Down Expand Up @@ -248,6 +254,10 @@
'export': {
'handlers': ['export'],
'level': 'DEBUG',
}
},
'organize': {
'handlers': ['organize'],
'level': 'DEBUG',
},
}
}
16 changes: 14 additions & 2 deletions hdd_indexer/templates/hdd_indexer/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,19 @@ <h2 class="panel-title">
</div>
<div id="collapse-organizer" class="panel-collapse collapse" role="tabpanel" aria-labelledby="heading-settings">
<div class="panel-body">
<div class='alert alert-danger'><p>not impletemented yet</p></div>
<div class="list-group">
<h4><span id='organizer-status'></span> <i id='organizer-status-info' class='fa fa-2x fa-spinner fa-pulse'></i></h4>
</div>
<div id='organizer-organize-status' class="list-group">
<p>files evaluated<br /><span id='organizer-files-evaluated'></span></p>
</div>
<div id='ogranizer-options' class='row'>
<div class="col-xs-12 col-sm-12 col-md-6 col-lg-6"><div class='radio radio-success'><input type='radio' name='order' value='order-title' id='order-title' checked='true'><label for='order-title'>by movie release date</label></div></div>
<div class="col-xs-12 col-sm-12 col-md-6 col-lg-6"><div class='radio radio-success'><input type='radio' name='order' value='order-release' id='order-release'><label for='order-release'>by movie imdb id</label></div></div>
</div>
<div class="list-group">
<button id='organizer-switch' type="button" class="btn hvr-grow">Start Organizer</button>
</div>
</div>
</div>
</div>
Expand Down Expand Up @@ -355,13 +367,13 @@ <h2><i class="fa fa-cogs fa-f2x"></i> Settings - Movie Folder</h2>

<!-- jQuery -->
<script src="{% static 'js/jquery-2.1.4.min.js' %}"></script>
<script src="{% static 'js/jquery.jWizard.min.js' %}"></script>

<!-- Bootstrap Core JavaScript -->
<script src="{% static 'js/bootstrap.min.js' %}"></script>

<script src="{% static 'js/sweetalert.min.js' %}"></script>
<script src="{% static 'js/input_alert.js' %}"></script>
<script src="{% static 'js/jquery.jWizard.min.js' %}"></script>

</body>

Expand Down
1 change: 1 addition & 0 deletions hdd_indexer/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,6 @@
url(r'^crawler/$', 'hdd_indexer.views.crawler', name='crawler'),
url(r'^loader/$', 'hdd_indexer.views.loader', name='loader'),
url(r'^export/$', 'hdd_indexer.views.export', name='export'),
url(r'^organizer/$', 'hdd_indexer.views.organizer', name='organizer'),
# TODO: replace urls in index.html and input_alert.js with {{url}}
)
67 changes: 67 additions & 0 deletions hdd_indexer/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
# if True, assigns the path to HDDRoot.path
# then we need to call HDDRoot.save() to save the path
# TODO: check if crawler/loader active and send status to homepage
# TODO: documentation for export
# TODO: documentation for organize


import json
Expand Down Expand Up @@ -47,6 +49,10 @@
from movie_metadata.models import Movie
from movie_metadata.export import export as get_export_content

from movie_metadata.organize import organizer_status
from movie_metadata.organize import start_organizer
from movie_metadata.organize import stop_organizer


@csrf_exempt
def crawler(request):
Expand Down Expand Up @@ -542,3 +548,64 @@ def export(request):
log.info('export request completed: served %s' % filename)
return response
return HttpResponse(status=405)


@csrf_exempt
def organizer(request):
"""
"""
def response(e_m=None):
"""Response for GET/POST methods on loader
returns a HTTPResponse with content type json
Args:
e_m(str): error message if any
e_m(None): if no error message
"""
if e_m:
e = True
else:
e = False
# print loader_status('SKIPPED_LIST')
payload = {
'status': organizer_status(),
'files_evaluated': organizer_status('FILES_EVALUATED'),
'error': e,
'error_message': e_m,
}
log.debug('organizer status: %s' % payload)
# print payload
return HttpResponse(
json.dumps(payload),
content_type='application/json'
)

# if request is not POST, return error
if request.method == 'GET':
# print 'GET', request.GET
if request.GET.get('status', None):
log.debug('GET: organizer status')
return response()
elif request.method == 'POST':
# print 'POST', request.POST
if request.POST.get('start', None):
log.info('POST: start organizer')
# print 'starting loader'
err_msg = start_organizer()
if err_msg:
log.error('start organizer: %s' % err_msg)
return response(err_msg)
# print 'started loader'
return response()
elif request.POST.get('stop', None):
log.info('POST: stop organizer')
err_msg = stop_organizer()
if err_msg:
log.error('stop organizer: %s' % err_msg)
return response(err_msg)
return response()

# 405: Method not allowed
log.error('405: Method not allowed')
return HttpResponse(status=405)
Loading

0 comments on commit 5307a4c

Please sign in to comment.