More template changes

nightly
Andrew 4 years ago
parent 5efce67e50
commit a97724e461
  1. 52
      stashr/api.py
  2. 130
      stashr/static/assets/title.svg
  3. 2
      stashr/static/css/stashr.css
  4. 18
      stashr/templates/all_collections_page.html
  5. 56
      stashr/templates/all_volumes_page.html
  6. 30
      stashr/templates/base.html
  7. 9
      stashr/templates/new_releases_page.html
  8. 21
      stashr/templates/reading_list_page.html
  9. 46
      stashr/templates/scrape_page.html
  10. 20
      stashr/templates/settings_page.html
  11. 47
      stashr/templates/single_collection_page.html
  12. 81
      stashr/templates/single_volume_page.html
  13. 34
      stashr/utils.py

@ -2262,6 +2262,58 @@ def api_put_directories_edit(scrape_id):
return jsonify(create_json_return('200'))
@api.route('/scrape/directories/extend/<scrape_id>', methods=['POST'])
def api_post_directories_extend(scrape_id):
"""To Update Later
This is using docstrings for specifications.
---
tags:
- scrape
"""
user = current_user
if not user.is_authenticated:
if not request.json:
return jsonify(create_json_return('400'))
if "api_key" not in request.json:
return jsonify(create_json_return('400'))
if request.json['api_key'] == "":
return jsonify(create_json_return('100'))
user = database.session \
.query(database.Users) \
.filter(database.Users.api_key == request.json['api_key']) \
.first()
if user is None:
return jsonify(create_json_return('100'))
if user.role != 'admin':
return jsonify(create_json_return('401'))
allowed_keys = [
'search_terms'
]
for key, value in request.json['data'].items():
if key not in allowed_keys:
return jsonify(create_json_return('400'))
if "data" not in request.json:
return jsonify(create_json_return('400'))
if "search_terms" not in request.json['data']:
return jsonify(create_json_return('400'))
search_terms = request.json['data']['search_terms']
# DO THINGS HERE
utils.new_scrape_extend_matches(scrape_id, search_terms)
# tasks.extend_scrape(scrape_id)
return jsonify(create_json_return('200'))
""" --- PLUGIN UPLOAD/INSTALL --- """

@ -0,0 +1,130 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="110px" height="40px" viewBox="0 0 110 40" enable-background="new 0 0 110 40" xml:space="preserve">
<g>
<path fill="#FFFFFF" d="M9.957,39.944c-1.123,0-2.055-0.126-2.797-0.376c-0.743-0.251-1.329-0.531-1.761-0.842
c-0.432-0.311-0.733-0.608-0.907-0.894c-0.171-0.285-0.259-0.469-0.259-0.557c0-0.31,0.07-0.643,0.208-0.996
c0.138-0.355,0.311-0.683,0.518-0.984c0.207-0.303,0.432-0.557,0.673-0.765c0.242-0.207,0.457-0.311,0.647-0.311
c0.241,0,0.439,0.156,0.596,0.467c0.034,0.035,0.121,0.121,0.258,0.259c0.139,0.139,0.333,0.281,0.583,0.428
c0.25,0.146,0.561,0.28,0.933,0.4c0.371,0.121,0.807,0.183,1.308,0.183c1.087,0,1.976-0.333,2.667-0.999
c0.69-0.662,1.036-1.565,1.036-2.704c0-0.795-0.187-1.503-0.557-2.124c-0.371-0.622-0.859-1.2-1.463-1.734
c-0.604-0.536-1.294-1.059-2.071-1.567c-0.776-0.509-1.571-1.04-2.382-1.593c-0.812-0.551-1.605-1.147-2.382-1.786
c-0.778-0.639-1.467-1.373-2.072-2.202c-0.604-0.828-1.092-1.764-1.462-2.809c-0.372-1.044-0.557-2.24-0.557-3.586
c0-1.157,0.199-2.322,0.595-3.496c0.397-1.173,0.945-2.291,1.645-3.354c0.7-1.062,1.523-2.054,2.473-2.978
c0.95-0.924,1.977-1.727,3.082-2.408c1.105-0.682,2.257-1.218,3.457-1.605c1.2-0.389,2.404-0.583,3.612-0.583
c1.037,0,1.969,0.164,2.797,0.492c0.829,0.329,1.529,0.79,2.099,1.386c0.57,0.595,1.009,1.312,1.32,2.148
c0.311,0.838,0.466,1.775,0.466,2.81c0,0.984-0.172,1.951-0.518,2.9c-0.345,0.95-0.803,1.848-1.373,2.693
c-0.57,0.846-1.213,1.627-1.929,2.344c-0.716,0.716-1.45,1.338-2.201,1.864c-0.751,0.527-1.48,0.937-2.188,1.23
c-0.707,0.294-1.33,0.44-1.864,0.44c-0.466,0-0.886-0.108-1.256-0.324c-0.372-0.215-0.683-0.483-0.933-0.802
c-0.25-0.319-0.444-0.656-0.583-1.009c-0.138-0.355-0.207-0.67-0.207-0.946c0-0.225,0.03-0.371,0.09-0.44
c0.061-0.068,0.146-0.1,0.258-0.091c0.113,0.009,0.255,0.035,0.428,0.078c0.172,0.043,0.371,0.064,0.595,0.064
c0.725,0,1.528-0.25,2.408-0.75s1.709-1.14,2.486-1.917c0.777-0.777,1.429-1.631,1.956-2.563c0.526-0.933,0.79-1.839,0.79-2.72
c0-0.896-0.221-1.605-0.66-2.123c-0.44-0.518-1.188-0.777-2.241-0.777c-0.656,0-1.368,0.125-2.136,0.375
c-0.769,0.251-1.541,0.601-2.318,1.049C10.086,6.289,9.334,6.833,8.61,7.471C7.884,8.11,7.246,8.813,6.694,9.582
c-0.553,0.769-0.998,1.597-1.334,2.486c-0.336,0.889-0.505,1.817-0.505,2.784c0,1.019,0.186,1.929,0.557,2.732
c0.371,0.803,0.863,1.533,1.477,2.188c0.613,0.656,1.308,1.261,2.084,1.813c0.776,0.553,1.57,1.099,2.382,1.644
c0.812,0.544,1.606,1.105,2.383,1.683c0.777,0.579,1.472,1.219,2.085,1.917c0.613,0.698,1.104,1.477,1.476,2.331
c0.372,0.854,0.557,1.834,0.557,2.938c0,1.07-0.203,2.085-0.608,3.043c-0.405,0.958-0.962,1.791-1.671,2.498
c-0.707,0.707-1.545,1.27-2.511,1.684C12.097,39.737,11.061,39.944,9.957,39.944z"/>
<path fill="#FFFFFF" d="M18.787,13.091c0.397,0.035,0.837,0.061,1.321,0.078c0.414,0.034,0.915,0.056,1.501,0.065
c0.587,0.009,1.243,0.021,1.968,0.038V4.286c0-0.379-0.03-0.682-0.09-0.906c-0.061-0.224-0.122-0.401-0.181-0.531
c-0.061-0.129-0.121-0.233-0.182-0.311c-0.061-0.078-0.09-0.159-0.09-0.246c0-0.104,0.052-0.19,0.155-0.259
c0.104-0.069,0.242-0.13,0.415-0.181c0.172-0.052,0.358-0.091,0.557-0.116c0.198-0.026,0.393-0.04,0.583-0.04
c0.881,0,1.574,0.229,2.084,0.688c0.509,0.457,0.764,1.006,0.764,1.644v9.296c1.623,0,3.336-0.017,5.141-0.052
c1.804-0.034,3.612-0.094,5.425-0.181c0.241-0.259,0.436-0.354,0.582-0.285c0.147,0.07,0.241,0.233,0.285,0.493
c0.042,0.258,0.047,0.578,0.014,0.958c-0.036,0.38-0.104,0.747-0.208,1.101c-0.104,0.354-0.247,0.66-0.427,0.919
c-0.182,0.258-0.384,0.388-0.608,0.388c-2.124,0.052-4.001,0.082-5.632,0.091c-1.631,0.008-3.155,0.013-4.571,0.013v16.807
c0,0.862,0.164,1.484,0.492,1.864c0.328,0.38,0.768,0.569,1.32,0.569c0.535,0,0.998-0.189,1.385-0.569
c0.389-0.38,0.726-0.855,1.011-1.424c0.285-0.57,0.518-1.187,0.699-1.853c0.181-0.664,0.332-1.29,0.453-1.876
c0.104-0.554,0.275-0.955,0.518-1.206c0.241-0.248,0.491-0.374,0.75-0.374c0.208,0,0.423,0.063,0.648,0.193
c0.224,0.129,0.427,0.297,0.608,0.505c0.181,0.207,0.328,0.44,0.44,0.699c0.112,0.26,0.168,0.519,0.168,0.777
c0,0.035,0,0.077,0,0.13c0,0.051-0.018,0.129-0.052,0.231c-0.224,0.882-0.53,1.806-0.919,2.772
c-0.388,0.967-0.89,1.855-1.501,2.667c-0.614,0.813-1.342,1.484-2.189,2.02c-0.846,0.534-1.838,0.802-2.978,0.802
c-0.708,0-1.36-0.106-1.955-0.323c-0.596-0.216-1.11-0.561-1.542-1.035c-0.432-0.474-0.768-1.083-1.01-1.826
c-0.242-0.742-0.362-1.64-0.362-2.692V16.768c-0.587,0-1.109-0.004-1.566-0.013c-0.458-0.009-0.842-0.021-1.152-0.039
c-0.364-0.017-0.683-0.035-0.958-0.052c-0.415,0-0.781-0.186-1.101-0.557c-0.32-0.372-0.544-0.781-0.674-1.23
c-0.129-0.448-0.146-0.859-0.051-1.23S18.407,13.091,18.787,13.091z"/>
<path fill="#FFFFFF" d="M48.178,36.008c0.534,0,0.996-0.189,1.385-0.569c0.388-0.38,0.725-0.855,1.01-1.424
c0.285-0.57,0.518-1.187,0.7-1.853c0.18-0.664,0.332-1.29,0.453-1.876c0.121-0.554,0.298-0.955,0.531-1.206
c0.233-0.248,0.487-0.374,0.764-0.374c0.208,0,0.418,0.063,0.634,0.193c0.216,0.129,0.415,0.297,0.597,0.505
c0.181,0.207,0.327,0.44,0.439,0.699c0.113,0.26,0.168,0.519,0.168,0.777c0,0.035,0,0.077,0,0.13c0,0.051-0.017,0.129-0.052,0.231
c-0.225,0.882-0.53,1.806-0.919,2.772c-0.389,0.967-0.884,1.855-1.488,2.667c-0.605,0.813-1.334,1.484-2.188,2.02
c-0.855,0.534-1.853,0.802-2.992,0.802c-0.932,0-1.743-0.198-2.434-0.595c-0.691-0.398-1.235-0.924-1.632-1.579
c-0.536,0.604-1.179,1.117-1.93,1.54c-0.75,0.423-1.626,0.634-2.627,0.634c-1.037,0-1.946-0.206-2.732-0.621
c-0.786-0.414-1.446-0.979-1.98-1.696c-0.536-0.716-0.938-1.562-1.205-2.537c-0.268-0.975-0.402-2.023-0.402-3.146
c0-2.212,0.354-4.195,1.062-5.956c0.708-1.761,1.649-3.26,2.823-4.493c1.174-1.234,2.516-2.18,4.026-2.836
c1.511-0.655,3.077-0.984,4.7-0.984c0.726,0,1.313,0.199,1.761,0.597c0.449,0.396,0.674,0.94,0.674,1.63
c0,0.449-0.047,0.764-0.143,0.946c-0.095,0.181-0.272,0.271-0.531,0.271c-0.241,0-0.491-0.017-0.75-0.052
c-0.26-0.034-0.528-0.052-0.804-0.052c-1.001,0-2.02,0.221-3.056,0.661c-1.036,0.44-1.972,1.114-2.81,2.021
c-0.837,0.906-1.524,2.054-2.058,3.442c-0.536,1.392-0.803,3.044-0.803,4.96c0,1.399,0.267,2.473,0.803,3.224
c0.534,0.752,1.268,1.127,2.2,1.127c0.726,0,1.329-0.271,1.813-0.814c0.483-0.545,0.872-1.187,1.165-1.931V25.08
c0-0.26-0.013-0.474-0.039-0.646s-0.052-0.32-0.077-0.44c-0.027-0.121-0.048-0.229-0.065-0.324
c-0.018-0.095-0.025-0.186-0.025-0.272c0-0.275,0.133-0.497,0.401-0.66c0.267-0.164,0.591-0.246,0.971-0.246
c0.88,0,1.58,0.229,2.098,0.687c0.517,0.458,0.776,1.007,0.776,1.644v8.754c0,0.294,0.035,0.582,0.104,0.867
c0.068,0.285,0.172,0.544,0.31,0.776c0.138,0.233,0.324,0.424,0.557,0.569C47.596,35.936,47.867,36.008,48.178,36.008z"/>
<path fill="#FFFFFF" d="M54.962,30.751c-0.138,0.553-0.397,0.894-0.776,1.022c-0.38,0.13-0.756,0.117-1.126-0.038
c-0.372-0.155-0.683-0.423-0.933-0.803s-0.323-0.794-0.22-1.244c0.259-1.172,0.634-2.472,1.126-3.896
c0.492-1.423,0.979-2.843,1.462-4.26c-0.258-0.396-0.465-0.798-0.621-1.204c-0.155-0.405-0.233-0.833-0.233-1.282
c0-0.448,0.168-0.919,0.505-1.411s0.742-0.945,1.217-1.359c0.474-0.415,0.966-0.755,1.476-1.023
c0.51-0.267,0.945-0.401,1.308-0.401c0.638,0,1.117,0.216,1.438,0.647c0.319,0.432,0.479,1.01,0.479,1.735
c0,0.398-0.064,0.791-0.194,1.178c-0.131,0.389-0.272,0.751-0.427,1.088c-0.157,0.336-0.299,0.626-0.428,0.867
c-0.13,0.242-0.203,0.397-0.221,0.466c0.621,1.105,1.27,2.081,1.942,2.927c0.673,0.847,1.29,1.683,1.852,2.513
c0.561,0.827,1.023,1.708,1.386,2.641c0.362,0.932,0.543,2.027,0.543,3.288c0,0.312-0.021,0.631-0.063,0.959
c-0.045,0.328-0.109,0.639-0.195,0.932c0.621-0.12,1.171-0.311,1.645-0.57c0.474-0.259,0.89-0.556,1.244-0.894
c0.352-0.336,0.646-0.702,0.878-1.101c0.235-0.396,0.428-0.811,0.585-1.241c0.188-0.503,0.379-0.864,0.569-1.09
c0.188-0.224,0.405-0.336,0.647-0.336c0.224,0,0.453,0.074,0.685,0.22c0.234,0.148,0.44,0.334,0.623,0.558
c0.182,0.225,0.327,0.457,0.439,0.699s0.168,0.458,0.168,0.647c0,0.258-0.068,0.569-0.207,0.932s-0.323,0.734-0.557,1.113
c-0.232,0.381-0.495,0.747-0.789,1.101c-0.295,0.354-0.597,0.661-0.908,0.919c-0.828,0.675-1.803,1.239-2.924,1.697
c-1.123,0.458-2.513,0.748-4.171,0.867c-0.639,0.553-1.394,1.006-2.266,1.359c-0.872,0.354-1.852,0.53-2.939,0.53
c-0.553,0-1.118-0.068-1.696-0.206s-1.129-0.315-1.657-0.531c-0.527-0.216-1.005-0.453-1.436-0.712
c-0.432-0.259-0.778-0.519-1.037-0.777c-0.656-0.621-1.078-1.246-1.268-1.877c-0.19-0.63-0.237-1.194-0.143-1.696
c0.095-0.501,0.281-0.91,0.556-1.23c0.277-0.318,0.562-0.479,0.854-0.479c0.172,0,0.445,0.074,0.816,0.22
c0.371,0.146,0.798,0.337,1.281,0.57c0.484,0.232,1.01,0.479,1.581,0.737c0.57,0.26,1.139,0.505,1.708,0.739
c0.57,0.232,1.128,0.423,1.671,0.569c0.544,0.146,1.04,0.219,1.49,0.219c0.292-0.344,0.561-0.802,0.802-1.371
c0.242-0.57,0.362-1.191,0.362-1.865c0-0.828-0.111-1.597-0.336-2.305c-0.227-0.706-0.519-1.363-0.88-1.968
c-0.364-0.603-0.774-1.17-1.231-1.695c-0.457-0.527-0.919-1.024-1.385-1.49c-0.414,1.019-0.777,2.025-1.088,3.017
C55.636,28.365,55.307,29.492,54.962,30.751z"/>
<path fill="#FFFFFF" d="M68.867,5.348c0-0.38-0.028-0.682-0.089-0.907c-0.062-0.224-0.122-0.401-0.182-0.531
c-0.063-0.129-0.121-0.233-0.182-0.311s-0.091-0.159-0.091-0.246c0-0.104,0.052-0.189,0.154-0.259
c0.105-0.068,0.244-0.129,0.416-0.181c0.17-0.052,0.357-0.091,0.558-0.117c0.197-0.026,0.391-0.039,0.581-0.039
c0.881,0,1.576,0.229,2.085,0.687c0.509,0.458,0.764,1.006,0.764,1.645V22.49c0.364-0.742,0.755-1.432,1.179-2.071
c0.424-0.638,0.879-1.195,1.372-1.67c0.492-0.476,1.02-0.847,1.579-1.114c0.563-0.268,1.17-0.402,1.826-0.402
c0.88,0,1.605,0.165,2.175,0.492c0.57,0.329,1.019,0.751,1.348,1.269c0.326,0.518,0.557,1.097,0.686,1.735
c0.131,0.64,0.194,1.261,0.194,1.863v10.981c0,0.121,0.009,0.315,0.027,0.582c0.015,0.269,0.066,0.541,0.153,0.815
c0.085,0.278,0.221,0.519,0.402,0.725c0.182,0.208,0.442,0.312,0.79,0.312c0.533,0,0.996-0.189,1.384-0.569
c0.389-0.38,0.724-0.855,1.009-1.424c0.286-0.57,0.521-1.187,0.701-1.853c0.181-0.664,0.332-1.29,0.453-1.876
c0.104-0.536,0.264-0.924,0.479-1.167c0.216-0.24,0.446-0.375,0.697-0.4c0.25-0.025,0.506,0.038,0.765,0.194
c0.26,0.155,0.484,0.357,0.675,0.607c0.189,0.251,0.332,0.531,0.428,0.843c0.095,0.311,0.105,0.604,0.038,0.879
c-0.241,0.882-0.557,1.806-0.945,2.772c-0.39,0.967-0.884,1.855-1.489,2.667c-0.604,0.813-1.33,1.484-2.177,2.02
c-0.845,0.534-1.838,0.802-2.976,0.802c-0.708,0-1.334-0.133-1.878-0.4s-1.01-0.627-1.398-1.074
c-0.39-0.448-0.682-0.976-0.882-1.58c-0.197-0.604-0.296-1.243-0.296-1.917V23.76c0-0.415-0.011-0.804-0.027-1.167
c-0.019-0.361-0.063-0.681-0.143-0.957c-0.077-0.275-0.188-0.496-0.336-0.66c-0.146-0.164-0.35-0.246-0.607-0.246
c-0.381,0-0.847,0.259-1.398,0.777c-0.554,0.519-1.097,1.191-1.633,2.02c-0.535,0.828-1.004,1.765-1.412,2.81
c-0.404,1.044-0.658,2.095-0.763,3.146v7.744c0,0.258-0.004,0.521-0.013,0.789c-0.008,0.269-0.061,0.51-0.154,0.726
c-0.096,0.216-0.243,0.397-0.442,0.542c-0.197,0.148-0.487,0.221-0.865,0.221c-0.261,0-0.541-0.028-0.843-0.091
c-0.302-0.06-0.578-0.171-0.828-0.336c-0.251-0.163-0.459-0.397-0.622-0.698c-0.164-0.303-0.247-0.704-0.247-1.205V5.348z"/>
<path fill="#FFFFFF" d="M99.943,39.503c-0.622,0-1.256-0.095-1.906-0.285c-0.645-0.188-1.233-0.517-1.759-0.981
c-0.525-0.468-0.958-1.085-1.295-1.853c-0.337-0.769-0.505-1.74-0.505-2.914c0-1.708,0.229-3.517,0.687-5.425
c0.458-1.907,1.117-4.009,1.98-6.306h-4.039H92.51c-0.017,0.518-0.047,1.175-0.09,1.968c-0.044,0.796-0.117,1.641-0.221,2.538
c-0.102,0.898-0.238,1.806-0.399,2.719c-0.166,0.916-0.367,1.762-0.609,2.539c-0.175,0.551-0.445,0.871-0.816,0.958
c-0.372,0.086-0.738,0.02-1.1-0.195c-0.362-0.215-0.658-0.53-0.881-0.944c-0.226-0.415-0.276-0.846-0.156-1.295
c0.139-0.534,0.26-1.186,0.363-1.955c0.104-0.769,0.186-1.58,0.247-2.435c0.06-0.854,0.107-1.709,0.142-2.563
c0.035-0.854,0.059-1.619,0.077-2.292c-0.655-0.362-1.2-0.824-1.63-1.386c-0.433-0.56-0.647-1.229-0.647-2.006
c0-0.362,0.07-0.695,0.217-0.997c0.147-0.302,0.342-0.562,0.584-0.777c0.241-0.215,0.527-0.38,0.854-0.492
c0.329-0.112,0.664-0.168,1.012-0.168c0.312,0,0.633,0.043,0.97,0.129c0.337,0.087,0.657,0.242,0.957,0.466
c0.305,0.225,0.574,0.518,0.816,0.88s0.44,0.812,0.596,1.347c0.433,0.052,0.8,0.09,1.101,0.116
c0.305,0.026,0.557,0.048,0.764,0.065c0.208,0.018,0.381,0.026,0.519,0.026c0.139,0,0.277,0,0.415,0h2.769
c0.156,0,0.386,0.095,0.688,0.285c0.303,0.19,0.601,0.436,0.895,0.738c0.293,0.302,0.538,0.626,0.736,0.971
c0.199,0.345,0.271,0.673,0.221,0.983c0,0.104-0.062,0.355-0.182,0.752c-0.121,0.397-0.269,0.897-0.44,1.501
c-0.174,0.605-0.361,1.3-0.568,2.085c-0.21,0.786-0.397,1.611-0.57,2.474c-0.174,0.864-0.319,1.756-0.44,2.681
c-0.121,0.923-0.182,1.824-0.182,2.706c0,0.361,0.043,0.717,0.13,1.061c0.086,0.346,0.215,0.652,0.389,0.92
c0.173,0.269,0.393,0.479,0.66,0.634c0.269,0.156,0.582,0.233,0.944,0.233c0.604,0,1.121-0.189,1.553-0.569
c0.433-0.38,0.797-0.855,1.09-1.424c0.293-0.57,0.531-1.187,0.713-1.853c0.181-0.664,0.332-1.29,0.45-1.876
c0.104-0.554,0.279-0.955,0.521-1.206c0.24-0.248,0.491-0.374,0.75-0.374c0.207,0,0.424,0.063,0.646,0.193
c0.227,0.129,0.43,0.297,0.608,0.505c0.182,0.207,0.329,0.44,0.441,0.699c0.114,0.26,0.168,0.519,0.168,0.777
c0,0.087-0.009,0.154-0.026,0.207c-0.018,0.052-0.026,0.104-0.026,0.154c-0.241,0.882-0.557,1.806-0.945,2.772
c-0.387,0.967-0.884,1.855-1.488,2.667c-0.604,0.813-1.328,1.484-2.173,2.02C102.075,39.235,101.081,39.503,99.943,39.503z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

@ -31,7 +31,7 @@ ul { list-style-type: none; }
.stashr-poster_wrapper { position:relative; overflow:hidden; }
.stashr-link { text-decoration: none; }
.stashr-button_container {position:fixed;bottom:10;right:10;opacity:.7;z-index:999;}
.stashr-menu_button_container {position:fixed;bottom:10;left:10;opacity:.7;z-index:999;}
.stashr-menu_button {position:fixed;bottom:0;border-top-right-radius:25%;border-bottom-right-radius:25%;z-index:999;}
.stashr-reader { background:black; }
.new-stashr-button_container { opacity:.7; }

@ -30,9 +30,12 @@ Vue.component('collections', {
props: ['collections'],
template: `
<div>
<div class="d-grid w-100 bg-mine m-0 p-0 sticky-md-top shadow">
<div class="row w-100 m-0 p-3">
<input type="text" v-model="search" class="form-control" placeholder="Search Collections..." />
<div class="d-grid w-100 bg-mine m-0 p-0 sticky-top shadow">
<div class="row d-flex flex-nowrap w-100 m-0 p-3 bg-mine">
<input type="text" v-model="search" class="form-control flex-shrink-1" placeholder="Search Collections..." />
<a class="fa-stack p-0 text-white">
<i class="fas fa-bars fa-stack-1x" data-bs-toggle="offcanvas" href="#offcanvasRight" role="button"></i>
</a>
</div>
</div>
<ul class="d-flex flex-wrap w-100 m-0 p-0 py-2 justify-content-center">
@ -42,6 +45,15 @@ Vue.component('collections', {
v-bind:key="collection.collection_id"
></collection>
</ul>
<div class="offcanvas offcanvas-end" tabindex="-1" id="offcanvasRight" aria-labelledby="offcanvasRightLabel">
<div class="offcanvas-header">
<h5 id="offcanvasRightLabel">Collections</h5>
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
</div>
</div>
</div>
`,
data() { return { search: '', } },

@ -136,53 +136,6 @@ Vue.component('volumes', {
<i class="fas fa-bars fa-stack-1x" data-bs-toggle="offcanvas" href="#offcanvasRight" role="button"></i>
</a>
</div>
<!--
<div class="row d-flex flex-wrap w-100 m-0 p-0 stashr-submenu">
<div class="d-flex flex-row flex-nowrap w-100 m-0 p-2">
<div class="d-flex flex-grow-1">
<i class="fas fa-2x fa-sort text-white mx-2"></i>
<select class="form-select" aria-label="Default select example" v-model="sorted">
<option value="volume_sort_title">Name</option>
<option value="volume_year">Year</option>
<option value="volume_total">Length</option>
<option value="progress">Progress</option>
</select>
</div>
<div class="d-flex flex-grow-1">
<i class="fas fa-2x fa-filter text-white mx-2"></i>
<select class="form-select" aria-label="Default select example" v-model="filter">
<option :value="''">All</option>
<option :value=false>Ended</option>
<option :value=true>Ongoing</option>
</select>
</div>
</div>
<div class="d-flex flex-row flex-nowrap w-100 m-0 p-2">
<div class="d-flex flex-grow-1">
<i class="fas fa-2x fa-filter text-white mx-2"></i>
<select class="form-select" aria-label="Default select example" v-model="rating">
<option :value="''">All</option>
<rating-item
v-for="rating in ratings"
v-bind:rating="rating"
v-bind:key="rating.rating_id"
></rating-item>
</select>
</div>
<div class="d-flex flex-grow-1">
<i class="fas fa-2x fa-filter text-white mx-2"></i>
<select class="form-select" aria-label="Default select example" v-model="publisher">
<option :value="''">All</option>
<publisher-item
v-for="publisher in publishers"
v-bind:publisher="publisher"
v-bind:key="publisher.publisher_id"
></publisher-item>
</select>
</div>
</div>
</div>
-->
</div>
<ul class="d-flex flex-wrap w-100 m-0 p-0 py-2 justify-content-center">
<volume-item
@ -193,7 +146,7 @@ Vue.component('volumes', {
</ul>
<div class="offcanvas offcanvas-end" tabindex="-1" id="offcanvasRight" aria-labelledby="offcanvasRightLabel">
<div class="offcanvas-header">
<h5 id="offcanvasRightLabel">Sort/Filter</h5>
<h5 id="offcanvasRightLabel">All Volumes</h5>
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
@ -248,6 +201,13 @@ Vue.component('volumes', {
></rating-item>
</select>
</div>
<hr />
<div class="text-center w-100 m-0 p-3">
<button type="button" class="btn btn-info w-100" data-bs-toggle="tooltip" data-bs-placement="top" title="Add Volume from Comicvine" onclick="location.href='{{ url_for('search_page') }}';">
<i class="fas fa-plus"></i>
Add Volume From Comicvine
</button>
</div>
</div>
</div>
</div>

@ -41,7 +41,7 @@
<div class="d-flex flex-row">
<a class="navbar-brand" href="{{ url_for('index_page') }}">
<img class="border rounded-circle" src="{{ url_for('static', filename='assets/stashr.svg') }}" width="40" height="40" />
<span class="stashr-project_title">Stashr</span>
<img src="{{ url_for('static', filename='assets/title.svg') }}" height="25" />
</a>
</div>
<hr/>
@ -60,13 +60,6 @@
Volumes
</a>
</li>
<!--
<li>
<a href="{{ url_for('all_publishers_page') }}" class="nav-link text-white{% if request.path == url_for('all_publishers_page') %} active{% endif %}">
Publishers
</a>
</li>
-->
{% if current_user.role == 'admin' %}
<li>
<a href="{{ url_for('scrape_folders_page') }}" class="nav-link text-white{% if request.path == url_for('scrape_folders_page') %} active{% endif %}">
@ -124,26 +117,17 @@
</div>
<div class="d-flex flex-column w-100 m-0 px-0 min-vh-100 overflow-auto">
<!-- v HEADER v -->
<!-- ^ HEADER ^ -->
<!-- v CONTENT v -->
{% block content %}{% endblock %}
<!-- ^ CONTENT ^ -->
<!-- v BUTTON CONTAINER v -->
<div class="stashr-button_container p-2">
</div>
<div class="stashr-menu_button_container p-2">
</div>
<div class="d-flex w-100 stashr-footer p-2 new-stashr-button_container">
<button type="button" class="btn btn-info btn-circle btn-md" data-bs-toggle="tooltip" data-bs-placement="top" title="Add Volume from Comicvine" onclick="toggleMenu()">
<i class="fas fa-ellipsis-v fa-2x"></i>
</button>
{% block button_container %}{% endblock %}
<div>
<div class="d-grid m-0 p-0 stashr-menu_button bg-dark">
<div class="row d-flex flex-nowrap m-0 p-0 py-2">
<i class="text-white fas fa-ellipsis-v fa-2x" onclick="toggleMenu()"></i>
</div>
</div>
</div>
<!-- ^ BUTTON CONTAINER ^ -->
</div>

@ -170,7 +170,7 @@ Vue.component('releases', {
</ul>
<div class="offcanvas offcanvas-end" tabindex="-1" id="offcanvasRight" aria-labelledby="offcanvasRightLabel">
<div class="offcanvas-header">
<h5 id="offcanvasRightLabel">Sort/Filter</h5>
<h5 id="offcanvasRightLabel">New Releases</h5>
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
@ -195,6 +195,13 @@ Vue.component('releases', {
<option :value="Null">Not In Library</option>
</select>
</div>
<hr />
<div class="text-center w-100 m-0 p-3">
<button type="button" class="btn btn-info w-100" data-bs-toggle="tooltip" data-bs-placement="top" title="Update New Releases" onclick="app.updateNewReleases()">
<i class="fas fa-sync-alt"></i>
Update New Releases
</button>
</div>
</div>
</div>
</div>

@ -101,8 +101,11 @@ Vue.component('issues', {
template: `
<div>
<div class="d-grid w-100 bg-mine m-0 p-0 sticky-top shadow">
<div class="row w-100 m-0 p-3">
<input type="text" v-model="search" class="form-control" placeholder="Search Reading List..." />
<div class="row d-flex flex-nowrap w-100 m-0 p-3 bg-mine">
<input type="text" v-model="search" class="form-control flex-shrink-1" placeholder="Search Reading List..." />
<a class="fa-stack p-0 text-white">
<i class="fas fa-bars fa-stack-1x" data-bs-toggle="offcanvas" href="#offcanvasRight" role="button"></i>
</a>
</div>
</div>
<ul class="d-flex flex-wrap w-100 m-0 p-0 justify-content-center" v-sortable="$options.sortOptions" @sorted='handleSorted'>
@ -112,6 +115,20 @@ Vue.component('issues', {
v-bind:key="issue.issue_id"
></issue>
</ul>
<div class="offcanvas offcanvas-end" tabindex="-1" id="offcanvasRight" aria-labelledby="offcanvasRightLabel">
<div class="offcanvas-header">
<h5 id="offcanvasRightLabel">Reading List</h5>
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<div class="text-center w-100 m-0 p-3">
<button type="button" class="btn btn-danger w-100" data-bs-toggle="tooltip" data-bs-placement="top" title="Clear Reading List" onclick="app.clearList()">
<i class="fas fa-minus"></i>
Clear Reading List
</button>
</div>
</div>
</div>
</div>
`,
data() { return { loading: true, search: '', } },

@ -66,14 +66,17 @@ Vue.component('modal', {
</div>
</div>
<div class="col-9">
<select id="selectVolume" class="form-select" aria-label="Default select example" @change='doSomething($event)' v-if='!this.individual.scrape_add'>
<candidate
v-for="item in json"
v-bind:candidate="item"
v-bind:individual="this.individual"
v-bind:key="item['id']"
></candidate>
</select>
<div v-if='!this.individual.scrape_add'>
<input type="email" class="form-control" id="exampleFormControlInput1" placeholder="name@example.com">
<select id="selectVolume" class="form-select" aria-label="Default select example" @change='doSomething($event)'>
<candidate
v-for="item in json"
v-bind:candidate="item"
v-bind:individual="this.individual"
v-bind:key="item['id']"
></candidate>
</select>
</div>
<div class='py-2'>
<h5>[[ match['name'] ]] ([[ match['start_year'] ]])</h5>
<p v-html="match['description']"></p>
@ -185,9 +188,12 @@ Vue.component('directories', {
props: ['directories'],
template: `
<div>
<div class="d-grid w-100 bg-mine m-0 p-0 sticky-md-top shadow">
<div class="row w-100 m-0 p-3">
<input type="text" v-model="search" class="form-control" placeholder="Search Folders..." />
<div class="d-grid w-100 bg-mine m-0 p-0 sticky-top shadow">
<div class="row d-flex flex-nowrap w-100 m-0 p-3 bg-mine">
<input type="text" v-model="search" class="form-control flex-shrink-1" placeholder="Search Folders..." />
<a class="fa-stack p-0 text-white">
<i class="fas fa-bars fa-stack-1x" data-bs-toggle="offcanvas" href="#offcanvasRight" role="button"></i>
</a>
</div>
</div>
<ul class="d-flex flex-wrap w-100 m-0 p-0 justify-content-center">
@ -197,6 +203,24 @@ Vue.component('directories', {
v-bind:key="directory.scrape_id"
></directory>
</ul>
<div class="offcanvas offcanvas-end" tabindex="-1" id="offcanvasRight" aria-labelledby="offcanvasRightLabel">
<div class="offcanvas-header">
<h5 id="offcanvasRightLabel">Scrape</h5>
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<div class="text-center w-100 m-0 p-3">
<button type="button" class="btn btn-info m-1 w-100" data-bs-toggle="tooltip" data-bs-placement="top" title="Add Selected Directories" onclick="app.addDirectories()">
<i class="fas fa-plus"></i>
Add Selected Directories
</button>
<button type="button" class="btn btn-info m-1 w-100" data-bs-toggle="tooltip" data-bs-placement="top" title="Rescan New Directories" onclick="app.rescanDirectories()">
<i class="fas fa-sync-alt"></i>
Refresh Directories
</button>
</div>
</div>
</div>
</div>
`,
data() { return { search: '', } },

@ -42,7 +42,7 @@
<div class="d-flex flex-row">
<a class="navbar-brand" href="{{ url_for('index_page') }}">
<img class="border rounded-circle" src="{{ url_for('static', filename='assets/stashr.svg') }}" width="40" height="40" />
<span class="stashr-project_title">Stashr</span>
<img src="{{ url_for('static', filename='assets/title.svg') }}" height="25" />
</a>
</div>
<hr/>
@ -121,18 +121,12 @@
<!-- ^ CONTENT ^ -->
<!-- v BUTTON CONTAINER v -->
<div class="stashr-button_container p-2">
</div>
<div class="stashr-menu_button_container p-2">
</div>
<div class="d-flex w-100 stashr-footer p-2 new-stashr-button_container">
<button type="button" class="btn btn-info btn-circle btn-md d-md-none" data-bs-toggle="tooltip" data-bs-placement="top" title="Add Volume from Comicvine" onclick="toggleMenu()">
<i class="fas fa-ellipsis-v fa-2x"></i>
</button>
{% block button_container %}{% endblock %}
<div>
<div class="d-grid m-0 p-0 stashr-menu_button bg-dark">
<div class="row d-flex flex-nowrap m-0 p-0 py-2">
<i class="text-white fas fa-ellipsis-v fa-2x" onclick="toggleMenu()"></i>
</div>
</div>
</div>
<!-- ^ BUTTON CONTAINER ^ -->
</div>

@ -201,6 +201,52 @@ Vue.component('collection-modals', {
Vue.component('collection-jumbo', {
props: ['collection'],
template: `
<div>
<div class="d-grid w-100 bg-mine m-0 p-0 sticky-top shadow">
<div class="row d-flex flex-nowrap w-100 m-0 p-3 bg-mine">
<div class="flex-shrink-1">
<div class="row w-100 m-0 p-0">
<div class="col-12 col-md-10 text-start">
<span role="button" data-bs-toggle="modal" data-bs-target="#modalInfo">
<span class="fs-1 text-white stashr-series_title">[[ collection.collection_name ]]</span>
<i class="fas fa-info-circle text-secondary"></i>
</span>
<h5>
<span class="badge bg-dark">
<i class="fas fa-circle" v-bind:class="statusClass"></i>
[[ statusText ]]
</span>
<span class="badge bg-dark">
<i class="fas fa-user"></i>
[[ collection.user.username ]]
</span>
</h5>
</div>
</div>
</div>
<a class="fa-stack p-0 text-white">
<i class="fas fa-bars fa-stack-1x" data-bs-toggle="offcanvas" href="#offcanvasRight" role="button"></i>
</a>
</div>
</div>
<div class="offcanvas offcanvas-end" tabindex="-1" id="offcanvasRight" aria-labelledby="offcanvasRightLabel">
<div class="offcanvas-header">
<h5 id="offcanvasRightLabel">[[ collection.collection_name ]]</h5>
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<button type="button" class="btn btn-info w-100 m-1" data-bs-toggle="modal" data-bs-target="#modalEditCollection">
<i class="fas fa-edit mx-1"></i>
Edit Collection
</button>
<button type="button" class="btn btn-info w-100 m-1" data-bs-toggle="modal" data-bs-target="#modalDeleteCollection">
<i class="fas fa-trash-alt mx-1"></i>
Delete Collection
</button>
</div>
</div>
</div>
<!--
<div class="d-grid w-100 bg-mine m-0 p-0 sticky-md-top shadow">
<div class="row w-100 m-0 p-3">
<div class="col-12 col-md-10 text-center text-md-start">
@ -240,6 +286,7 @@ Vue.component('collection-jumbo', {
</div>
</div>
</div>
-->
`,
computed: {
statusClass() {

@ -418,6 +418,86 @@ Vue.component('modals-volume', {
Vue.component('volume-jumbo', {
props: ['volume'],
template: `
<div>
<div class="d-grid w-100 bg-mine m-0 p-0 sticky-top shadow">
<div class="row d-flex flex-nowrap w-100 m-0 p-3 bg-mine">
<div class="flex-shrink-1">
<div class="row w-100 m-0 p-0">
<div class="col-12 col-md-10 text-start">
<span role="button" data-bs-toggle="modal" data-bs-target="#modalInfo">
<span class="fs-1 text-white stashr-series_title">[[ volume.volume_name ]]</span>
<i class="fas fa-info-circle text-secondary"></i>
</span>
<h5>
<span class="badge bg-dark">
<i class="fas fa-circle" v-bind:class="volumeStatus"></i>
[[ statusWord ]]
</span>
<span class="badge bg-dark">[[ volume.age_rating[0].rating_long ]]</span>
<span class="badge bg-dark">
<i class="far fa-calendar"></i>
[[ volume.volume_year ]]
</span>
<br/>
<span class="badge bg-dark">
<i class="fas fa-book"></i>
[[ publisherName ]]
</span>
<span class="badge bg-dark">
<i class="fas fa-external-link-alt"></i>
ComicVine
</span>
<br/>
<span class="badge bg-dark">Digital: [[ volume.volume_have ]]/[[ volume.volume_total ]]</span>
<span class="badge bg-dark">Physical: [[ ownedNumber ]]/[[ volume.volume_total ]]</span>
<span class="badge bg-dark">Read: [[ readNumber ]]/[[ volume.volume_total ]]</span>
<br/>
{{ emit_tep('single_volume_page_badge_row', volume_id=volume_id) }}
</h5>
</div>
</div>
</div>
<a class="fa-stack p-0 text-white">
<i class="fas fa-bars fa-stack-1x" data-bs-toggle="offcanvas" href="#offcanvasRight" role="button"></i>
</a>
</div>
</div>
<div class="offcanvas offcanvas-end" tabindex="-1" id="offcanvasRight" aria-labelledby="offcanvasRightLabel">
<div class="offcanvas-header">
<h5 id="offcanvasRightLabel">[[ volume.volume_name ]]</h5>
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
{% if (current_user.role.lower() == 'admin') or
(current_user.role.lower() == 'librarian') %}
<button type="button" class="btn btn-info w-100 m-1" data-bs-toggle="modal" data-bs-target="#modalRatingEdit">
<i class="far fa-sticky-note mx-1"></i>
Edit Rating
</button>
<button type="button" class="btn btn-info w-100 m-1" v-on:click="refreshVolume">
<i class="fas fa-sync-alt mx-1"></i>
Refresh
</button>
<button type="button" class="btn btn-info w-100 m-1" v-on:click="toggleStatus">
<span v-if="volume.volume_status">
<i class="fas fa-stop mx-1"></i>
Mark Ended
</span>
<span v-else>
<i class="fas fa-play mx-1"></i>
Mark Ongoing
</span>
</button>
<button type="button" class="btn btn-info w-100 m-1" data-bs-toggle="modal" data-bs-target="#modalRemove">
<i class="fas fa-trash-alt mx-1"></i>
Remove From Library
</button>
{% endif %}
{{ emit_tep("single_volume_page_action_dropdown", volume_id=volume_id) }}
</div>
</div>
</div>
<!--
<div class="d-grid w-100 bg-mine m-0 p-0 sticky-md-top shadow">
<div class="row w-100 m-0 p-3">
<div class="col-12 col-md-10 text-center text-md-start">
@ -490,6 +570,7 @@ Vue.component('volume-jumbo', {
</div>
</div>
</div>
-->
`,
computed: {
publisherName() {

@ -1016,7 +1016,7 @@ def new_get_scrape_candidates(item):
if str(candidate['start_year']) in item.directory_path:
scrape_candidate = candidate['id']
match_found = False
scrape_item.scrape_json = json.dumps(candidates.results)
scrape_item.scrape_candidate = scrape_candidate
scrape_item.scrape_match = match_found
@ -1025,6 +1025,11 @@ def new_get_scrape_candidates(item):
database.session.merge(scrape_item)
database.session.commit()
if not match_found:
print('extend the results')
# new_scrape_extend_matches_by_item(scrape_item)
new_scrape_extend_matches(scrape_item.scrape_id)
pass
def new_add_scraped_matches():
matched_directories = database.session \
@ -1063,16 +1068,37 @@ def new_add_scrape_match(item):
scan_volume_files(item.scrape_candidate)
def new_scrape_extend_matches(scrape_id):
def new_scrape_extend_matches_by_item(item):
candidates = cv.search(item.scrape_directory, limit=100, resources=['volume'])
# print(candidates.results)
print(len(candidates.results))
item.scrape_json = json.dumps(candidates.results)
database.session.merge(item)
database.session.commit()
def new_scrape_extend_matches(scrape_id, search_terms=None):
scrape_item = database.session \
.query(database.ScrapeItems) \
.filter(database.ScrapeItems.scrape_id == scrape_id) \
.first()
candidates = cv.search(scrape_item.scrape_directory, resources=['volume'])
if search_terms is None:
candidates = cv.search(scrape_item.scrape_directory, limit=100, resources=['volume'])
else:
candidates = cv.search(search_terms, limit=100, resources=['volume'])
print(len(candidates.results))
scrape_item.scrape_json = json.dumps(candidates.results)
database.session.merge(scrape_item)
database.session.commit()
pass
""" --------------------- (UN)INSTALL PLUGINS --------------------- """

Loading…
Cancel
Save