Added rating and views to video information.
This commit is contained in:
		
							
								
								
									
										502
									
								
								.idea/workspace.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										502
									
								
								.idea/workspace.xml
									
									
									
										generated
									
									
									
								
							@@ -2,9 +2,19 @@
 | 
				
			|||||||
<project version="4">
 | 
					<project version="4">
 | 
				
			||||||
  <component name="ChangeListManager">
 | 
					  <component name="ChangeListManager">
 | 
				
			||||||
    <list default="true" id="245751b6-c863-4572-8723-8499964fe105" name="Default Changelist" comment="">
 | 
					    <list default="true" id="245751b6-c863-4572-8723-8499964fe105" name="Default Changelist" comment="">
 | 
				
			||||||
      <change beforePath="$PROJECT_DIR$/YtManagerApp/models.py" beforeDir="false" afterPath="$PROJECT_DIR$/YtManagerApp/models.py" afterDir="false" />
 | 
					      <change afterPath="$PROJECT_DIR$/YtManagerApp/templatetags/__init__.py" afterDir="false" />
 | 
				
			||||||
      <change beforePath="$PROJECT_DIR$/YtManagerApp/scheduler.py" beforeDir="false" afterPath="$PROJECT_DIR$/YtManagerApp/scheduler.py" afterDir="false" />
 | 
					      <change afterPath="$PROJECT_DIR$/YtManagerApp/templatetags/common.py" afterDir="false" />
 | 
				
			||||||
      <change beforePath="$PROJECT_DIR$/YtManagerApp/views/actions.py" beforeDir="false" afterPath="$PROJECT_DIR$/YtManagerApp/views/actions.py" afterDir="false" />
 | 
					      <change afterPath="$PROJECT_DIR$/YtManagerApp/templatetags/ratings.py" afterDir="false" />
 | 
				
			||||||
 | 
					      <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
 | 
				
			||||||
 | 
					      <change beforePath="$PROJECT_DIR$/YtManager/settings.py" beforeDir="false" afterPath="$PROJECT_DIR$/YtManager/settings.py" afterDir="false" />
 | 
				
			||||||
 | 
					      <change beforePath="$PROJECT_DIR$/YtManagerApp/management/jobs/synchronize.py" beforeDir="false" afterPath="$PROJECT_DIR$/YtManagerApp/management/jobs/synchronize.py" afterDir="false" />
 | 
				
			||||||
 | 
					      <change beforePath="$PROJECT_DIR$/YtManagerApp/management/videos.py" beforeDir="false" afterPath="$PROJECT_DIR$/YtManagerApp/management/videos.py" afterDir="false" />
 | 
				
			||||||
 | 
					      <change beforePath="$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.css" beforeDir="false" afterPath="$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.css" afterDir="false" />
 | 
				
			||||||
 | 
					      <change beforePath="$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.css.map" beforeDir="false" afterPath="$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.css.map" afterDir="false" />
 | 
				
			||||||
 | 
					      <change beforePath="$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.scss" beforeDir="false" afterPath="$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.scss" afterDir="false" />
 | 
				
			||||||
 | 
					      <change beforePath="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/index_videos.html" beforeDir="false" afterPath="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/index_videos.html" afterDir="false" />
 | 
				
			||||||
 | 
					      <change beforePath="$PROJECT_DIR$/YtManagerApp/utils/iterutils.py" beforeDir="false" afterPath="$PROJECT_DIR$/YtManagerApp/utils/iterutils.py" afterDir="false" />
 | 
				
			||||||
 | 
					      <change beforePath="$PROJECT_DIR$/YtManagerApp/utils/youtube.py" beforeDir="false" afterPath="$PROJECT_DIR$/YtManagerApp/utils/youtube.py" afterDir="false" />
 | 
				
			||||||
    </list>
 | 
					    </list>
 | 
				
			||||||
    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
 | 
					    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
 | 
				
			||||||
    <option name="SHOW_DIALOG" value="false" />
 | 
					    <option name="SHOW_DIALOG" value="false" />
 | 
				
			||||||
@@ -68,32 +78,32 @@
 | 
				
			|||||||
      </usages-collector>
 | 
					      </usages-collector>
 | 
				
			||||||
      <usages-collector id="statistics.file.extensions.edit">
 | 
					      <usages-collector id="statistics.file.extensions.edit">
 | 
				
			||||||
        <counts>
 | 
					        <counts>
 | 
				
			||||||
          <entry key="Django Console" value="254" />
 | 
					          <entry key="Django Console" value="401" />
 | 
				
			||||||
          <entry key="cell" value="32" />
 | 
					          <entry key="cell" value="42" />
 | 
				
			||||||
          <entry key="css" value="40" />
 | 
					          <entry key="css" value="40" />
 | 
				
			||||||
          <entry key="default" value="206" />
 | 
					          <entry key="default" value="206" />
 | 
				
			||||||
          <entry key="dummy" value="60" />
 | 
					          <entry key="dummy" value="60" />
 | 
				
			||||||
          <entry key="html" value="7623" />
 | 
					          <entry key="html" value="8218" />
 | 
				
			||||||
          <entry key="ini" value="2545" />
 | 
					          <entry key="ini" value="2545" />
 | 
				
			||||||
          <entry key="js" value="10149" />
 | 
					          <entry key="js" value="10149" />
 | 
				
			||||||
          <entry key="less" value="38" />
 | 
					          <entry key="less" value="38" />
 | 
				
			||||||
          <entry key="py" value="53601" />
 | 
					          <entry key="py" value="56123" />
 | 
				
			||||||
          <entry key="py@youtube-channel-manager" value="265" />
 | 
					          <entry key="py@youtube-channel-manager" value="265" />
 | 
				
			||||||
          <entry key="scss" value="1535" />
 | 
					          <entry key="scss" value="1647" />
 | 
				
			||||||
        </counts>
 | 
					        </counts>
 | 
				
			||||||
      </usages-collector>
 | 
					      </usages-collector>
 | 
				
			||||||
      <usages-collector id="statistics.file.types.edit">
 | 
					      <usages-collector id="statistics.file.types.edit">
 | 
				
			||||||
        <counts>
 | 
					        <counts>
 | 
				
			||||||
          <entry key="CSS" value="40" />
 | 
					          <entry key="CSS" value="40" />
 | 
				
			||||||
          <entry key="CommandLine" value="148" />
 | 
					          <entry key="CommandLine" value="148" />
 | 
				
			||||||
          <entry key="HTML" value="7623" />
 | 
					          <entry key="HTML" value="8218" />
 | 
				
			||||||
          <entry key="Ini" value="2545" />
 | 
					          <entry key="Ini" value="2545" />
 | 
				
			||||||
          <entry key="JavaScript" value="10149" />
 | 
					          <entry key="JavaScript" value="10149" />
 | 
				
			||||||
          <entry key="Less" value="38" />
 | 
					          <entry key="Less" value="38" />
 | 
				
			||||||
          <entry key="PLAIN_TEXT" value="383" />
 | 
					          <entry key="PLAIN_TEXT" value="383" />
 | 
				
			||||||
          <entry key="Python" value="53855" />
 | 
					          <entry key="Python" value="56524" />
 | 
				
			||||||
          <entry key="SCSS" value="1535" />
 | 
					          <entry key="SCSS" value="1647" />
 | 
				
			||||||
          <entry key="Scratch" value="32" />
 | 
					          <entry key="Scratch" value="42" />
 | 
				
			||||||
        </counts>
 | 
					        </counts>
 | 
				
			||||||
      </usages-collector>
 | 
					      </usages-collector>
 | 
				
			||||||
      <usages-collector id="statistics.file.extensions.open">
 | 
					      <usages-collector id="statistics.file.extensions.open">
 | 
				
			||||||
@@ -102,131 +112,75 @@
 | 
				
			|||||||
          <entry key="css" value="4" />
 | 
					          <entry key="css" value="4" />
 | 
				
			||||||
          <entry key="default" value="2" />
 | 
					          <entry key="default" value="2" />
 | 
				
			||||||
          <entry key="gif" value="1" />
 | 
					          <entry key="gif" value="1" />
 | 
				
			||||||
          <entry key="html" value="102" />
 | 
					          <entry key="html" value="105" />
 | 
				
			||||||
          <entry key="ini" value="9" />
 | 
					          <entry key="ini" value="10" />
 | 
				
			||||||
          <entry key="js" value="28" />
 | 
					          <entry key="js" value="28" />
 | 
				
			||||||
          <entry key="less" value="1" />
 | 
					          <entry key="less" value="1" />
 | 
				
			||||||
          <entry key="py" value="298" />
 | 
					          <entry key="py" value="313" />
 | 
				
			||||||
          <entry key="rnc" value="1" />
 | 
					          <entry key="rnc" value="1" />
 | 
				
			||||||
          <entry key="scss" value="28" />
 | 
					          <entry key="scss" value="29" />
 | 
				
			||||||
          <entry key="ytmanagerapp_channel" value="3" />
 | 
					          <entry key="ytmanagerapp_channel" value="3" />
 | 
				
			||||||
          <entry key="ytmanagerapp_subscription" value="8" />
 | 
					          <entry key="ytmanagerapp_subscription" value="8" />
 | 
				
			||||||
          <entry key="ytmanagerapp_subscriptionfolder" value="4" />
 | 
					          <entry key="ytmanagerapp_subscriptionfolder" value="4" />
 | 
				
			||||||
          <entry key="ytmanagerapp_video" value="13" />
 | 
					          <entry key="ytmanagerapp_video" value="15" />
 | 
				
			||||||
        </counts>
 | 
					        </counts>
 | 
				
			||||||
      </usages-collector>
 | 
					      </usages-collector>
 | 
				
			||||||
      <usages-collector id="statistics.file.types.open">
 | 
					      <usages-collector id="statistics.file.types.open">
 | 
				
			||||||
        <counts>
 | 
					        <counts>
 | 
				
			||||||
          <entry key="CSS" value="4" />
 | 
					          <entry key="CSS" value="4" />
 | 
				
			||||||
          <entry key="Database Element" value="34" />
 | 
					          <entry key="Database Element" value="36" />
 | 
				
			||||||
          <entry key="HTML" value="102" />
 | 
					          <entry key="HTML" value="105" />
 | 
				
			||||||
          <entry key="Image" value="1" />
 | 
					          <entry key="Image" value="1" />
 | 
				
			||||||
          <entry key="Ini" value="9" />
 | 
					          <entry key="Ini" value="10" />
 | 
				
			||||||
          <entry key="JavaScript" value="28" />
 | 
					          <entry key="JavaScript" value="28" />
 | 
				
			||||||
          <entry key="Less" value="1" />
 | 
					          <entry key="Less" value="1" />
 | 
				
			||||||
          <entry key="PLAIN_TEXT" value="2" />
 | 
					          <entry key="PLAIN_TEXT" value="2" />
 | 
				
			||||||
          <entry key="Python" value="298" />
 | 
					          <entry key="Python" value="313" />
 | 
				
			||||||
          <entry key="RNG Compact" value="1" />
 | 
					          <entry key="RNG Compact" value="1" />
 | 
				
			||||||
          <entry key="SCSS" value="28" />
 | 
					          <entry key="SCSS" value="29" />
 | 
				
			||||||
        </counts>
 | 
					        </counts>
 | 
				
			||||||
      </usages-collector>
 | 
					      </usages-collector>
 | 
				
			||||||
    </session>
 | 
					    </session>
 | 
				
			||||||
  </component>
 | 
					  </component>
 | 
				
			||||||
  <component name="FileEditorManager">
 | 
					  <component name="FileEditorManager">
 | 
				
			||||||
    <splitter split-orientation="horizontal" split-proportion="0.3768394">
 | 
					    <leaf>
 | 
				
			||||||
      <split-first>
 | 
					      <file pinned="false" current-in-tab="false">
 | 
				
			||||||
        <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
 | 
					        <entry file="file://C:/Python36/Lib/site-packages/django/template/base.py">
 | 
				
			||||||
          <file pinned="false" current-in-tab="true">
 | 
					          <provider selected="true" editor-type-id="text-editor">
 | 
				
			||||||
            <entry file="file://$PROJECT_DIR$/YtManagerApp/views/actions.py">
 | 
					            <state relative-caret-position="279">
 | 
				
			||||||
              <provider selected="true" editor-type-id="text-editor">
 | 
					              <caret line="759" column="23" selection-start-line="759" selection-start-column="23" selection-end-line="759" selection-end-column="23" />
 | 
				
			||||||
                <state relative-caret-position="459">
 | 
					            </state>
 | 
				
			||||||
                  <caret line="58" lean-forward="true" selection-start-line="58" selection-end-line="58" />
 | 
					          </provider>
 | 
				
			||||||
                  <folding>
 | 
					        </entry>
 | 
				
			||||||
                    <element signature="e#0#73#0" expanded="true" />
 | 
					      </file>
 | 
				
			||||||
                    <marker date="1540074642385" expanded="true" signature="714:719" ph="..." />
 | 
					      <file pinned="false" current-in-tab="false">
 | 
				
			||||||
                  </folding>
 | 
					        <entry file="file://$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.scss">
 | 
				
			||||||
                </state>
 | 
					          <provider selected="true" editor-type-id="text-editor">
 | 
				
			||||||
              </provider>
 | 
					            <state relative-caret-position="527">
 | 
				
			||||||
            </entry>
 | 
					              <caret line="145" column="1" lean-forward="true" selection-start-line="145" selection-start-column="1" selection-end-line="145" selection-end-column="1" />
 | 
				
			||||||
          </file>
 | 
					            </state>
 | 
				
			||||||
          <file pinned="false" current-in-tab="false">
 | 
					          </provider>
 | 
				
			||||||
            <entry file="file://$PROJECT_DIR$/YtManagerApp/urls.py">
 | 
					        </entry>
 | 
				
			||||||
              <provider selected="true" editor-type-id="text-editor">
 | 
					      </file>
 | 
				
			||||||
                <state relative-caret-position="187">
 | 
					      <file pinned="false" current-in-tab="true">
 | 
				
			||||||
                  <caret line="38" column="63" selection-start-line="38" selection-start-column="63" selection-end-line="38" selection-end-column="63" />
 | 
					        <entry file="file://$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/index_videos.html">
 | 
				
			||||||
                  <folding>
 | 
					          <provider selected="true" editor-type-id="text-editor">
 | 
				
			||||||
                    <element signature="e#643#675#0" expanded="true" />
 | 
					            <state relative-caret-position="391">
 | 
				
			||||||
                  </folding>
 | 
					              <caret line="23" column="56" selection-start-line="23" selection-start-column="56" selection-end-line="23" selection-end-column="56" />
 | 
				
			||||||
                </state>
 | 
					            </state>
 | 
				
			||||||
              </provider>
 | 
					          </provider>
 | 
				
			||||||
            </entry>
 | 
					        </entry>
 | 
				
			||||||
          </file>
 | 
					      </file>
 | 
				
			||||||
          <file pinned="false" current-in-tab="false">
 | 
					      <file pinned="false" current-in-tab="false">
 | 
				
			||||||
            <entry file="das://2dac2136-d902-4d27-8789-9371934602fd/schema/main/table/ytmanagerapp_video">
 | 
					        <entry file="das://2dac2136-d902-4d27-8789-9371934602fd/schema/main/table/ytmanagerapp_video">
 | 
				
			||||||
              <provider selected="true" editor-type-id="com.intellij.database.editor.DatabaseTableFileEditorProvider">
 | 
					          <provider selected="true" editor-type-id="com.intellij.database.editor.DatabaseTableFileEditorProvider">
 | 
				
			||||||
                <state>
 | 
					            <state>
 | 
				
			||||||
                  <filtering enabled="true" />
 | 
					              <filtering enabled="true" />
 | 
				
			||||||
                </state>
 | 
					            </state>
 | 
				
			||||||
              </provider>
 | 
					          </provider>
 | 
				
			||||||
            </entry>
 | 
					        </entry>
 | 
				
			||||||
          </file>
 | 
					      </file>
 | 
				
			||||||
        </leaf>
 | 
					    </leaf>
 | 
				
			||||||
      </split-first>
 | 
					 | 
				
			||||||
      <split-second>
 | 
					 | 
				
			||||||
        <leaf>
 | 
					 | 
				
			||||||
          <file pinned="false" current-in-tab="false">
 | 
					 | 
				
			||||||
            <entry file="file://$PROJECT_DIR$/YtManagerApp/management/jobs/delete_video.py">
 | 
					 | 
				
			||||||
              <provider selected="true" editor-type-id="text-editor">
 | 
					 | 
				
			||||||
                <state relative-caret-position="68">
 | 
					 | 
				
			||||||
                  <caret line="4" selection-start-line="4" selection-end-line="4" />
 | 
					 | 
				
			||||||
                </state>
 | 
					 | 
				
			||||||
              </provider>
 | 
					 | 
				
			||||||
            </entry>
 | 
					 | 
				
			||||||
          </file>
 | 
					 | 
				
			||||||
          <file pinned="false" current-in-tab="true">
 | 
					 | 
				
			||||||
            <entry file="file://$PROJECT_DIR$/YtManagerApp/models.py">
 | 
					 | 
				
			||||||
              <provider selected="true" editor-type-id="text-editor">
 | 
					 | 
				
			||||||
                <state relative-caret-position="119">
 | 
					 | 
				
			||||||
                  <caret line="293" column="12" selection-start-line="293" selection-start-column="12" selection-end-line="293" selection-end-column="12" />
 | 
					 | 
				
			||||||
                  <folding>
 | 
					 | 
				
			||||||
                    <element signature="e#0#14#0" expanded="true" />
 | 
					 | 
				
			||||||
                    <marker date="1540074893218" expanded="true" signature="4003:4146" ph="..." />
 | 
					 | 
				
			||||||
                    <marker date="1540074893218" expanded="true" signature="6543:6986" ph="..." />
 | 
					 | 
				
			||||||
                    <marker date="1540074893218" expanded="true" signature="9532:9541" ph="..." />
 | 
					 | 
				
			||||||
                    <marker date="1540074893218" expanded="true" signature="9532:9860" ph="..." />
 | 
					 | 
				
			||||||
                    <marker date="1540074893218" expanded="true" signature="9910:10438" ph="..." />
 | 
					 | 
				
			||||||
                    <marker date="1540074893218" expanded="true" signature="10410:10438" ph="..." />
 | 
					 | 
				
			||||||
                    <marker date="1540074893218" expanded="true" signature="12057:13169" ph="..." />
 | 
					 | 
				
			||||||
                    <marker date="1540074893218" expanded="true" signature="12992:13169" ph="..." />
 | 
					 | 
				
			||||||
                  </folding>
 | 
					 | 
				
			||||||
                </state>
 | 
					 | 
				
			||||||
              </provider>
 | 
					 | 
				
			||||||
            </entry>
 | 
					 | 
				
			||||||
          </file>
 | 
					 | 
				
			||||||
          <file pinned="false" current-in-tab="false">
 | 
					 | 
				
			||||||
            <entry file="file://$PROJECT_DIR$/YtManagerApp/appconfig.py">
 | 
					 | 
				
			||||||
              <provider selected="true" editor-type-id="text-editor">
 | 
					 | 
				
			||||||
                <state relative-caret-position="136">
 | 
					 | 
				
			||||||
                  <caret line="8" selection-start-line="8" selection-end-line="8" />
 | 
					 | 
				
			||||||
                </state>
 | 
					 | 
				
			||||||
              </provider>
 | 
					 | 
				
			||||||
            </entry>
 | 
					 | 
				
			||||||
          </file>
 | 
					 | 
				
			||||||
          <file pinned="false" current-in-tab="false">
 | 
					 | 
				
			||||||
            <entry file="file://$PROJECT_DIR$/YtManagerApp/scheduler.py">
 | 
					 | 
				
			||||||
              <provider selected="true" editor-type-id="text-editor">
 | 
					 | 
				
			||||||
                <state relative-caret-position="102">
 | 
					 | 
				
			||||||
                  <caret line="6" lean-forward="true" selection-start-line="6" selection-end-line="6" />
 | 
					 | 
				
			||||||
                  <folding>
 | 
					 | 
				
			||||||
                    <element signature="e#0#14#0" expanded="true" />
 | 
					 | 
				
			||||||
                  </folding>
 | 
					 | 
				
			||||||
                </state>
 | 
					 | 
				
			||||||
              </provider>
 | 
					 | 
				
			||||||
            </entry>
 | 
					 | 
				
			||||||
          </file>
 | 
					 | 
				
			||||||
        </leaf>
 | 
					 | 
				
			||||||
      </split-second>
 | 
					 | 
				
			||||||
    </splitter>
 | 
					 | 
				
			||||||
  </component>
 | 
					  </component>
 | 
				
			||||||
  <component name="FileTemplateManagerImpl">
 | 
					  <component name="FileTemplateManagerImpl">
 | 
				
			||||||
    <option name="RECENT_TEMPLATES">
 | 
					    <option name="RECENT_TEMPLATES">
 | 
				
			||||||
@@ -293,16 +247,12 @@
 | 
				
			|||||||
  <component name="IdeDocumentHistory">
 | 
					  <component name="IdeDocumentHistory">
 | 
				
			||||||
    <option name="CHANGED_PATHS">
 | 
					    <option name="CHANGED_PATHS">
 | 
				
			||||||
      <list>
 | 
					      <list>
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/templates/registration/password_reset_confirm.html" />
 | 
					 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/templates/registration/password_reset_complete.html" />
 | 
					 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/index_unauth.html" />
 | 
					 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/index_unauthenticated.html" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/index_unauthenticated.html" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/views/auth.py" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/views/auth.py" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/dialog.html" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/dialog.html" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/views/dialog.py" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/views/dialog.py" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/views/modal.py" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/views/modal.py" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/common.js" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/common.js" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/utils/iterutils.py" />
 | 
					 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/modal_form.html" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/modal_form.html" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/folder_create_dialog.html" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/folder_create_dialog.html" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/folder_edit_dialog.html" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/folder_edit_dialog.html" />
 | 
				
			||||||
@@ -316,13 +266,11 @@
 | 
				
			|||||||
        <option value="$PROJECT_DIR$/YtManagerApp/model/user_settings.py" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/model/user_settings.py" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/model/__init__.py" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/model/__init__.py" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/model/channel.py" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/model/channel.py" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/management/videos.py" />
 | 
					 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/subscription_create_modal.html" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/subscription_create_modal.html" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/management/management.py" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/management/management.py" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/modal.html" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/modal.html" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/views/controls/modal.py" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/views/controls/modal.py" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/subscription_update_modal.html" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/subscription_update_modal.html" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/utils/youtube.py" />
 | 
					 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/subscription_delete_modal.html" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/subscription_delete_modal.html" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/folder_delete_modal.html" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/folder_delete_modal.html" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/js/subscription_tree.js" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/js/subscription_tree.js" />
 | 
				
			||||||
@@ -331,19 +279,25 @@
 | 
				
			|||||||
        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/master_default.html" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/master_default.html" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/apps.py" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/apps.py" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/utils/customconfigparser.py" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/utils/customconfigparser.py" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.scss" />
 | 
					 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/views/index.py" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/views/index.py" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/js/index.js" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/js/index.js" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/js/common.js" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/js/common.js" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/management/jobs/download_video.py" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/management/jobs/download_video.py" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/urls.py" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/urls.py" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/index_videos.html" />
 | 
					 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/management/downloader.py" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/management/downloader.py" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/management/jobs/delete_video.py" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/management/jobs/delete_video.py" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/management/jobs/synchronize.py" />
 | 
					 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/views/actions.py" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/views/actions.py" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/scheduler.py" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/scheduler.py" />
 | 
				
			||||||
        <option value="$PROJECT_DIR$/YtManagerApp/models.py" />
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/models.py" />
 | 
				
			||||||
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/management/videos.py" />
 | 
				
			||||||
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/management/jobs/synchronize.py" />
 | 
				
			||||||
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/utils/iterutils.py" />
 | 
				
			||||||
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/utils/youtube.py" />
 | 
				
			||||||
 | 
					        <option value="$PROJECT_DIR$/YtManager/settings.py" />
 | 
				
			||||||
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/templatetags/common.py" />
 | 
				
			||||||
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/templatetags/ratings.py" />
 | 
				
			||||||
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.scss" />
 | 
				
			||||||
 | 
					        <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/index_videos.html" />
 | 
				
			||||||
      </list>
 | 
					      </list>
 | 
				
			||||||
    </option>
 | 
					    </option>
 | 
				
			||||||
  </component>
 | 
					  </component>
 | 
				
			||||||
@@ -359,10 +313,10 @@
 | 
				
			|||||||
    </packageJsonPaths>
 | 
					    </packageJsonPaths>
 | 
				
			||||||
  </component>
 | 
					  </component>
 | 
				
			||||||
  <component name="ProjectFrameBounds" extendedState="6">
 | 
					  <component name="ProjectFrameBounds" extendedState="6">
 | 
				
			||||||
    <option name="x" value="58" />
 | 
					    <option name="x" value="72" />
 | 
				
			||||||
    <option name="y" value="-27" />
 | 
					    <option name="y" value="-8" />
 | 
				
			||||||
    <option name="width" value="1930" />
 | 
					    <option name="width" value="1928" />
 | 
				
			||||||
    <option name="height" value="973" />
 | 
					    <option name="height" value="963" />
 | 
				
			||||||
  </component>
 | 
					  </component>
 | 
				
			||||||
  <component name="ProjectInspectionProfilesVisibleTreeState">
 | 
					  <component name="ProjectInspectionProfilesVisibleTreeState">
 | 
				
			||||||
    <entry key="Project Default">
 | 
					    <entry key="Project Default">
 | 
				
			||||||
@@ -439,19 +393,6 @@
 | 
				
			|||||||
              <item name="youtube-channel-manager" type="462c0819:PsiDirectoryNode" />
 | 
					              <item name="youtube-channel-manager" type="462c0819:PsiDirectoryNode" />
 | 
				
			||||||
              <item name="YtManagerApp" type="462c0819:PsiDirectoryNode" />
 | 
					              <item name="YtManagerApp" type="462c0819:PsiDirectoryNode" />
 | 
				
			||||||
            </path>
 | 
					            </path>
 | 
				
			||||||
            <path>
 | 
					 | 
				
			||||||
              <item name="youtube-channel-manager" type="b2602c69:ProjectViewProjectNode" />
 | 
					 | 
				
			||||||
              <item name="youtube-channel-manager" type="462c0819:PsiDirectoryNode" />
 | 
					 | 
				
			||||||
              <item name="YtManagerApp" type="462c0819:PsiDirectoryNode" />
 | 
					 | 
				
			||||||
              <item name="management" type="462c0819:PsiDirectoryNode" />
 | 
					 | 
				
			||||||
            </path>
 | 
					 | 
				
			||||||
            <path>
 | 
					 | 
				
			||||||
              <item name="youtube-channel-manager" type="b2602c69:ProjectViewProjectNode" />
 | 
					 | 
				
			||||||
              <item name="youtube-channel-manager" type="462c0819:PsiDirectoryNode" />
 | 
					 | 
				
			||||||
              <item name="YtManagerApp" type="462c0819:PsiDirectoryNode" />
 | 
					 | 
				
			||||||
              <item name="management" type="462c0819:PsiDirectoryNode" />
 | 
					 | 
				
			||||||
              <item name="jobs" type="462c0819:PsiDirectoryNode" />
 | 
					 | 
				
			||||||
            </path>
 | 
					 | 
				
			||||||
            <path>
 | 
					            <path>
 | 
				
			||||||
              <item name="youtube-channel-manager" type="b2602c69:ProjectViewProjectNode" />
 | 
					              <item name="youtube-channel-manager" type="b2602c69:ProjectViewProjectNode" />
 | 
				
			||||||
              <item name="youtube-channel-manager" type="462c0819:PsiDirectoryNode" />
 | 
					              <item name="youtube-channel-manager" type="462c0819:PsiDirectoryNode" />
 | 
				
			||||||
@@ -477,26 +418,7 @@
 | 
				
			|||||||
              <item name="youtube-channel-manager" type="b2602c69:ProjectViewProjectNode" />
 | 
					              <item name="youtube-channel-manager" type="b2602c69:ProjectViewProjectNode" />
 | 
				
			||||||
              <item name="youtube-channel-manager" type="462c0819:PsiDirectoryNode" />
 | 
					              <item name="youtube-channel-manager" type="462c0819:PsiDirectoryNode" />
 | 
				
			||||||
              <item name="YtManagerApp" type="462c0819:PsiDirectoryNode" />
 | 
					              <item name="YtManagerApp" type="462c0819:PsiDirectoryNode" />
 | 
				
			||||||
              <item name="templates" type="462c0819:PsiDirectoryNode" />
 | 
					              <item name="templatetags" type="462c0819:PsiDirectoryNode" />
 | 
				
			||||||
            </path>
 | 
					 | 
				
			||||||
            <path>
 | 
					 | 
				
			||||||
              <item name="youtube-channel-manager" type="b2602c69:ProjectViewProjectNode" />
 | 
					 | 
				
			||||||
              <item name="youtube-channel-manager" type="462c0819:PsiDirectoryNode" />
 | 
					 | 
				
			||||||
              <item name="YtManagerApp" type="462c0819:PsiDirectoryNode" />
 | 
					 | 
				
			||||||
              <item name="templates" type="462c0819:PsiDirectoryNode" />
 | 
					 | 
				
			||||||
              <item name="YtManagerApp" type="462c0819:PsiDirectoryNode" />
 | 
					 | 
				
			||||||
            </path>
 | 
					 | 
				
			||||||
            <path>
 | 
					 | 
				
			||||||
              <item name="youtube-channel-manager" type="b2602c69:ProjectViewProjectNode" />
 | 
					 | 
				
			||||||
              <item name="youtube-channel-manager" type="462c0819:PsiDirectoryNode" />
 | 
					 | 
				
			||||||
              <item name="YtManagerApp" type="462c0819:PsiDirectoryNode" />
 | 
					 | 
				
			||||||
              <item name="utils" type="462c0819:PsiDirectoryNode" />
 | 
					 | 
				
			||||||
            </path>
 | 
					 | 
				
			||||||
            <path>
 | 
					 | 
				
			||||||
              <item name="youtube-channel-manager" type="b2602c69:ProjectViewProjectNode" />
 | 
					 | 
				
			||||||
              <item name="youtube-channel-manager" type="462c0819:PsiDirectoryNode" />
 | 
					 | 
				
			||||||
              <item name="YtManagerApp" type="462c0819:PsiDirectoryNode" />
 | 
					 | 
				
			||||||
              <item name="views" type="462c0819:PsiDirectoryNode" />
 | 
					 | 
				
			||||||
            </path>
 | 
					            </path>
 | 
				
			||||||
          </expand>
 | 
					          </expand>
 | 
				
			||||||
          <select />
 | 
					          <select />
 | 
				
			||||||
@@ -514,7 +436,7 @@
 | 
				
			|||||||
    <property name="list.type.of.created.stylesheet" value="SCSS" />
 | 
					    <property name="list.type.of.created.stylesheet" value="SCSS" />
 | 
				
			||||||
    <property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
 | 
					    <property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
 | 
				
			||||||
    <property name="nodejs_npm_path_reset_for_default_project" value="true" />
 | 
					    <property name="nodejs_npm_path_reset_for_default_project" value="true" />
 | 
				
			||||||
    <property name="settings.editor.selected.configurable" value="preferences.sourceCode.SCSS" />
 | 
					    <property name="settings.editor.selected.configurable" value="preferences.keymap" />
 | 
				
			||||||
  </component>
 | 
					  </component>
 | 
				
			||||||
  <component name="RecentsManager">
 | 
					  <component name="RecentsManager">
 | 
				
			||||||
    <key name="CopyFile.RECENT_KEYS">
 | 
					    <key name="CopyFile.RECENT_KEYS">
 | 
				
			||||||
@@ -674,12 +596,12 @@
 | 
				
			|||||||
    <frame x="-8" y="-8" width="1936" height="1056" extended-state="6" />
 | 
					    <frame x="-8" y="-8" width="1936" height="1056" extended-state="6" />
 | 
				
			||||||
    <editor active="true" />
 | 
					    <editor active="true" />
 | 
				
			||||||
    <layout>
 | 
					    <layout>
 | 
				
			||||||
      <window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.16684435" />
 | 
					      <window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.20469083" />
 | 
				
			||||||
      <window_info id="Structure" order="1" side_tool="true" weight="0.25" />
 | 
					      <window_info id="Structure" order="1" side_tool="true" weight="0.25" />
 | 
				
			||||||
      <window_info id="Favorites" order="2" side_tool="true" />
 | 
					      <window_info id="Favorites" order="2" side_tool="true" />
 | 
				
			||||||
      <window_info anchor="bottom" id="Message" order="0" />
 | 
					      <window_info anchor="bottom" id="Message" order="0" />
 | 
				
			||||||
      <window_info anchor="bottom" id="Find" order="1" sideWeight="0.4978678" weight="0.329718" />
 | 
					      <window_info anchor="bottom" id="Find" order="1" sideWeight="0.4978678" weight="0.329718" />
 | 
				
			||||||
      <window_info active="true" anchor="bottom" id="Run" order="2" sideWeight="0.5299353" visible="true" weight="0.3394794" />
 | 
					      <window_info anchor="bottom" id="Run" order="2" sideWeight="0.5299353" visible="true" weight="0.3394794" />
 | 
				
			||||||
      <window_info anchor="bottom" id="Debug" order="3" sideWeight="0.49946696" weight="0.2494577" />
 | 
					      <window_info anchor="bottom" id="Debug" order="3" sideWeight="0.49946696" weight="0.2494577" />
 | 
				
			||||||
      <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
 | 
					      <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
 | 
				
			||||||
      <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
 | 
					      <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
 | 
				
			||||||
@@ -696,7 +618,7 @@
 | 
				
			|||||||
      <window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
 | 
					      <window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
 | 
				
			||||||
      <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
 | 
					      <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
 | 
				
			||||||
      <window_info anchor="right" id="SciView" order="3" weight="0.32995737" />
 | 
					      <window_info anchor="right" id="SciView" order="3" weight="0.32995737" />
 | 
				
			||||||
      <window_info anchor="right" id="Database" order="4" weight="0.13006397" />
 | 
					      <window_info anchor="right" id="Database" order="4" visible="true" weight="0.13006397" />
 | 
				
			||||||
    </layout>
 | 
					    </layout>
 | 
				
			||||||
    <layout-to-restore>
 | 
					    <layout-to-restore>
 | 
				
			||||||
      <window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.15138593" />
 | 
					      <window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.15138593" />
 | 
				
			||||||
@@ -731,32 +653,6 @@
 | 
				
			|||||||
    <option name="myLimit" value="2678400000" />
 | 
					    <option name="myLimit" value="2678400000" />
 | 
				
			||||||
  </component>
 | 
					  </component>
 | 
				
			||||||
  <component name="editorHistoryManager">
 | 
					  <component name="editorHistoryManager">
 | 
				
			||||||
    <entry file="file://$PROJECT_DIR$/YtManagerApp/management/folders.py" />
 | 
					 | 
				
			||||||
    <entry file="file://$PROJECT_DIR$/YtManagerApp/management/management.py">
 | 
					 | 
				
			||||||
      <provider selected="true" editor-type-id="text-editor">
 | 
					 | 
				
			||||||
        <state relative-caret-position="384">
 | 
					 | 
				
			||||||
          <caret line="92" selection-start-line="92" selection-end-line="110" selection-end-column="45" />
 | 
					 | 
				
			||||||
          <folding>
 | 
					 | 
				
			||||||
            <element signature="e#0#65#0" expanded="true" />
 | 
					 | 
				
			||||||
          </folding>
 | 
					 | 
				
			||||||
        </state>
 | 
					 | 
				
			||||||
      </provider>
 | 
					 | 
				
			||||||
    </entry>
 | 
					 | 
				
			||||||
    <entry file="file://$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/subscription_create_modal.html">
 | 
					 | 
				
			||||||
      <provider selected="true" editor-type-id="text-editor">
 | 
					 | 
				
			||||||
        <state relative-caret-position="204">
 | 
					 | 
				
			||||||
          <caret line="12" lean-forward="true" selection-start-line="12" selection-end-line="12" />
 | 
					 | 
				
			||||||
        </state>
 | 
					 | 
				
			||||||
      </provider>
 | 
					 | 
				
			||||||
    </entry>
 | 
					 | 
				
			||||||
    <entry file="file://C:/Python36/Lib/site-packages/googleapiclient/errors.py">
 | 
					 | 
				
			||||||
      <provider selected="true" editor-type-id="text-editor">
 | 
					 | 
				
			||||||
        <state relative-caret-position="-1659">
 | 
					 | 
				
			||||||
          <caret line="28" column="6" selection-start-line="28" selection-start-column="6" selection-end-line="28" selection-end-column="6" />
 | 
					 | 
				
			||||||
        </state>
 | 
					 | 
				
			||||||
      </provider>
 | 
					 | 
				
			||||||
    </entry>
 | 
					 | 
				
			||||||
    <entry file="file://$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/subscription_edit_dialog.html" />
 | 
					 | 
				
			||||||
    <entry file="das://2dac2136-d902-4d27-8789-9371934602fd/schema/main/table/ytmanagerapp_subscription">
 | 
					    <entry file="das://2dac2136-d902-4d27-8789-9371934602fd/schema/main/table/ytmanagerapp_subscription">
 | 
				
			||||||
      <provider selected="true" editor-type-id="com.intellij.database.editor.DatabaseTableFileEditorProvider">
 | 
					      <provider selected="true" editor-type-id="com.intellij.database.editor.DatabaseTableFileEditorProvider">
 | 
				
			||||||
        <state>
 | 
					        <state>
 | 
				
			||||||
@@ -792,17 +688,6 @@
 | 
				
			|||||||
        </state>
 | 
					        </state>
 | 
				
			||||||
      </provider>
 | 
					      </provider>
 | 
				
			||||||
    </entry>
 | 
					    </entry>
 | 
				
			||||||
    <entry file="file://$PROJECT_DIR$/YtManagerApp/utils/youtube.py">
 | 
					 | 
				
			||||||
      <provider selected="true" editor-type-id="text-editor">
 | 
					 | 
				
			||||||
        <state relative-caret-position="765">
 | 
					 | 
				
			||||||
          <caret line="49" column="23" selection-start-line="49" selection-start-column="23" selection-end-line="49" selection-end-column="23" />
 | 
					 | 
				
			||||||
          <folding>
 | 
					 | 
				
			||||||
            <element signature="e#0#43#0" expanded="true" />
 | 
					 | 
				
			||||||
            <marker date="1539811805520" expanded="true" signature="411:557" ph="..." />
 | 
					 | 
				
			||||||
          </folding>
 | 
					 | 
				
			||||||
        </state>
 | 
					 | 
				
			||||||
      </provider>
 | 
					 | 
				
			||||||
    </entry>
 | 
					 | 
				
			||||||
    <entry file="file://$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/modal.html">
 | 
					    <entry file="file://$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/modal.html">
 | 
				
			||||||
      <provider selected="true" editor-type-id="text-editor">
 | 
					      <provider selected="true" editor-type-id="text-editor">
 | 
				
			||||||
        <state relative-caret-position="323">
 | 
					        <state relative-caret-position="323">
 | 
				
			||||||
@@ -860,16 +745,6 @@
 | 
				
			|||||||
    <entry file="file://C:/Python36/Lib/logging/__init__.py">
 | 
					    <entry file="file://C:/Python36/Lib/logging/__init__.py">
 | 
				
			||||||
      <provider selected="true" editor-type-id="text-editor" />
 | 
					      <provider selected="true" editor-type-id="text-editor" />
 | 
				
			||||||
    </entry>
 | 
					    </entry>
 | 
				
			||||||
    <entry file="file://$PROJECT_DIR$/YtManagerApp/management/videos.py">
 | 
					 | 
				
			||||||
      <provider selected="true" editor-type-id="text-editor">
 | 
					 | 
				
			||||||
        <state relative-caret-position="500">
 | 
					 | 
				
			||||||
          <caret line="55" column="37" selection-start-line="55" selection-start-column="37" selection-end-line="55" selection-end-column="37" />
 | 
					 | 
				
			||||||
          <folding>
 | 
					 | 
				
			||||||
            <element signature="e#0#71#0" expanded="true" />
 | 
					 | 
				
			||||||
          </folding>
 | 
					 | 
				
			||||||
        </state>
 | 
					 | 
				
			||||||
      </provider>
 | 
					 | 
				
			||||||
    </entry>
 | 
					 | 
				
			||||||
    <entry file="file://$PROJECT_DIR$/YtManager/urls.py">
 | 
					    <entry file="file://$PROJECT_DIR$/YtManager/urls.py">
 | 
				
			||||||
      <provider selected="true" editor-type-id="text-editor">
 | 
					      <provider selected="true" editor-type-id="text-editor">
 | 
				
			||||||
        <state relative-caret-position="391">
 | 
					        <state relative-caret-position="391">
 | 
				
			||||||
@@ -945,34 +820,6 @@
 | 
				
			|||||||
        </state>
 | 
					        </state>
 | 
				
			||||||
      </provider>
 | 
					      </provider>
 | 
				
			||||||
    </entry>
 | 
					    </entry>
 | 
				
			||||||
    <entry file="file://$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.scss">
 | 
					 | 
				
			||||||
      <provider selected="true" editor-type-id="text-editor">
 | 
					 | 
				
			||||||
        <state relative-caret-position="137">
 | 
					 | 
				
			||||||
          <caret line="111" column="29" selection-start-line="111" selection-start-column="29" selection-end-line="111" selection-end-column="29" />
 | 
					 | 
				
			||||||
        </state>
 | 
					 | 
				
			||||||
      </provider>
 | 
					 | 
				
			||||||
    </entry>
 | 
					 | 
				
			||||||
    <entry file="file://$PROJECT_DIR$/YtManagerApp/views/index.py">
 | 
					 | 
				
			||||||
      <provider selected="true" editor-type-id="text-editor">
 | 
					 | 
				
			||||||
        <state relative-caret-position="528">
 | 
					 | 
				
			||||||
          <caret line="346" lean-forward="true" selection-start-line="346" selection-end-line="346" />
 | 
					 | 
				
			||||||
          <folding>
 | 
					 | 
				
			||||||
            <element signature="e#0#42#0" expanded="true" />
 | 
					 | 
				
			||||||
            <marker date="1540023237405" expanded="true" signature="3128:3307" ph="..." />
 | 
					 | 
				
			||||||
            <marker date="1540023237405" expanded="true" signature="3339:3340" ph="..." />
 | 
					 | 
				
			||||||
            <marker date="1540023237405" expanded="true" signature="3646:3647" ph="..." />
 | 
					 | 
				
			||||||
            <marker date="1540023237405" expanded="true" signature="3646:4387" ph="..." />
 | 
					 | 
				
			||||||
            <marker date="1540023237405" expanded="true" signature="3668:4279" ph="..." />
 | 
					 | 
				
			||||||
            <marker date="1540023237405" expanded="true" signature="4432:4436" ph="..." />
 | 
					 | 
				
			||||||
            <marker date="1540023237405" expanded="true" signature="5221:6592" ph="..." />
 | 
					 | 
				
			||||||
            <marker date="1540023237405" expanded="true" signature="5465:5470" ph="..." />
 | 
					 | 
				
			||||||
            <marker date="1540023237405" expanded="true" signature="5491:5566" ph="..." />
 | 
					 | 
				
			||||||
            <marker date="1540023237405" expanded="true" signature="6640:6641" ph="..." />
 | 
					 | 
				
			||||||
            <marker date="1540023237405" expanded="true" signature="7201:7204" ph="..." />
 | 
					 | 
				
			||||||
          </folding>
 | 
					 | 
				
			||||||
        </state>
 | 
					 | 
				
			||||||
      </provider>
 | 
					 | 
				
			||||||
    </entry>
 | 
					 | 
				
			||||||
    <entry file="file://$PROJECT_DIR$/YtManagerApp/views/old_views.py">
 | 
					    <entry file="file://$PROJECT_DIR$/YtManagerApp/views/old_views.py">
 | 
				
			||||||
      <provider selected="true" editor-type-id="text-editor">
 | 
					      <provider selected="true" editor-type-id="text-editor">
 | 
				
			||||||
        <state relative-caret-position="205">
 | 
					        <state relative-caret-position="205">
 | 
				
			||||||
@@ -1025,13 +872,6 @@
 | 
				
			|||||||
        </state>
 | 
					        </state>
 | 
				
			||||||
      </provider>
 | 
					      </provider>
 | 
				
			||||||
    </entry>
 | 
					    </entry>
 | 
				
			||||||
    <entry file="das://2dac2136-d902-4d27-8789-9371934602fd/schema/main/table/ytmanagerapp_video">
 | 
					 | 
				
			||||||
      <provider selected="true" editor-type-id="com.intellij.database.editor.DatabaseTableFileEditorProvider">
 | 
					 | 
				
			||||||
        <state>
 | 
					 | 
				
			||||||
          <filtering enabled="true" />
 | 
					 | 
				
			||||||
        </state>
 | 
					 | 
				
			||||||
      </provider>
 | 
					 | 
				
			||||||
    </entry>
 | 
					 | 
				
			||||||
    <entry file="file://C:/Python36/Lib/mimetypes.py">
 | 
					    <entry file="file://C:/Python36/Lib/mimetypes.py">
 | 
				
			||||||
      <provider selected="true" editor-type-id="text-editor">
 | 
					      <provider selected="true" editor-type-id="text-editor">
 | 
				
			||||||
        <state relative-caret-position="4879">
 | 
					        <state relative-caret-position="4879">
 | 
				
			||||||
@@ -1039,9 +879,6 @@
 | 
				
			|||||||
        </state>
 | 
					        </state>
 | 
				
			||||||
      </provider>
 | 
					      </provider>
 | 
				
			||||||
    </entry>
 | 
					    </entry>
 | 
				
			||||||
    <entry file="file://$PROJECT_DIR$/YtManager/settings.py">
 | 
					 | 
				
			||||||
      <provider selected="true" editor-type-id="text-editor" />
 | 
					 | 
				
			||||||
    </entry>
 | 
					 | 
				
			||||||
    <entry file="file://$PROJECT_DIR$/YtManagerApp/management/downloader.py">
 | 
					    <entry file="file://$PROJECT_DIR$/YtManagerApp/management/downloader.py">
 | 
				
			||||||
      <provider selected="true" editor-type-id="text-editor">
 | 
					      <provider selected="true" editor-type-id="text-editor">
 | 
				
			||||||
        <state relative-caret-position="126">
 | 
					        <state relative-caret-position="126">
 | 
				
			||||||
@@ -1064,17 +901,14 @@
 | 
				
			|||||||
        </state>
 | 
					        </state>
 | 
				
			||||||
      </provider>
 | 
					      </provider>
 | 
				
			||||||
    </entry>
 | 
					    </entry>
 | 
				
			||||||
    <entry file="file://$PROJECT_DIR$/YtManagerApp/management/jobs/synchronize.py">
 | 
					    <entry file="file://$PROJECT_DIR$/YtManagerApp/views/actions.py">
 | 
				
			||||||
      <provider selected="true" editor-type-id="text-editor">
 | 
					      <provider selected="true" editor-type-id="text-editor">
 | 
				
			||||||
        <state relative-caret-position="119">
 | 
					        <state relative-caret-position="483">
 | 
				
			||||||
          <caret line="7" selection-start-line="7" selection-end-line="7" selection-end-column="60" />
 | 
					          <caret line="58" selection-start-line="58" selection-end-line="58" />
 | 
				
			||||||
        </state>
 | 
					          <folding>
 | 
				
			||||||
      </provider>
 | 
					            <element signature="e#0#73#0" expanded="true" />
 | 
				
			||||||
    </entry>
 | 
					            <marker date="1540074642385" expanded="true" signature="714:719" ph="..." />
 | 
				
			||||||
    <entry file="file://$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/index_videos.html">
 | 
					          </folding>
 | 
				
			||||||
      <provider selected="true" editor-type-id="text-editor">
 | 
					 | 
				
			||||||
        <state relative-caret-position="17">
 | 
					 | 
				
			||||||
          <caret line="19" column="38" selection-start-line="19" selection-start-column="38" selection-end-line="19" selection-end-column="38" />
 | 
					 | 
				
			||||||
        </state>
 | 
					        </state>
 | 
				
			||||||
      </provider>
 | 
					      </provider>
 | 
				
			||||||
    </entry>
 | 
					    </entry>
 | 
				
			||||||
@@ -1088,13 +922,54 @@
 | 
				
			|||||||
        </state>
 | 
					        </state>
 | 
				
			||||||
      </provider>
 | 
					      </provider>
 | 
				
			||||||
    </entry>
 | 
					    </entry>
 | 
				
			||||||
    <entry file="file://$PROJECT_DIR$/YtManagerApp/views/actions.py">
 | 
					    <entry file="file://$PROJECT_DIR$/YtManagerApp/utils/iterutils.py">
 | 
				
			||||||
      <provider selected="true" editor-type-id="text-editor">
 | 
					      <provider selected="true" editor-type-id="text-editor">
 | 
				
			||||||
        <state relative-caret-position="459">
 | 
					        <state relative-caret-position="544">
 | 
				
			||||||
          <caret line="58" lean-forward="true" selection-start-line="58" selection-end-line="58" />
 | 
					          <caret line="32" selection-start-line="32" selection-end-line="32" />
 | 
				
			||||||
          <folding>
 | 
					          <folding>
 | 
				
			||||||
            <element signature="e#0#73#0" expanded="true" />
 | 
					            <element signature="e#0#16#0" expanded="true" />
 | 
				
			||||||
            <marker date="1540074642385" expanded="true" signature="714:719" ph="..." />
 | 
					          </folding>
 | 
				
			||||||
 | 
					        </state>
 | 
				
			||||||
 | 
					      </provider>
 | 
				
			||||||
 | 
					    </entry>
 | 
				
			||||||
 | 
					    <entry file="file://$PROJECT_DIR$/YtManagerApp/utils/youtube.py">
 | 
				
			||||||
 | 
					      <provider selected="true" editor-type-id="text-editor">
 | 
				
			||||||
 | 
					        <state relative-caret-position="187">
 | 
				
			||||||
 | 
					          <caret line="11" lean-forward="true" selection-start-line="11" selection-end-line="11" />
 | 
				
			||||||
 | 
					          <folding>
 | 
				
			||||||
 | 
					            <element signature="e#0#43#0" expanded="true" />
 | 
				
			||||||
 | 
					            <marker date="1540123481417" expanded="true" signature="487:699" ph="..." />
 | 
				
			||||||
 | 
					            <marker date="1540123481417" expanded="true" signature="3562:4080" ph="..." />
 | 
				
			||||||
 | 
					          </folding>
 | 
				
			||||||
 | 
					        </state>
 | 
				
			||||||
 | 
					      </provider>
 | 
				
			||||||
 | 
					    </entry>
 | 
				
			||||||
 | 
					    <entry file="file://$PROJECT_DIR$/YtManagerApp/management/jobs/synchronize.py">
 | 
				
			||||||
 | 
					      <provider selected="true" editor-type-id="text-editor">
 | 
				
			||||||
 | 
					        <state relative-caret-position="-855">
 | 
				
			||||||
 | 
					          <caret line="34" column="49" selection-start-line="34" selection-start-column="49" selection-end-line="34" selection-end-column="49" />
 | 
				
			||||||
 | 
					          <folding>
 | 
				
			||||||
 | 
					            <element signature="e#0#49#0" expanded="true" />
 | 
				
			||||||
 | 
					          </folding>
 | 
				
			||||||
 | 
					        </state>
 | 
				
			||||||
 | 
					      </provider>
 | 
				
			||||||
 | 
					    </entry>
 | 
				
			||||||
 | 
					    <entry file="file://$PROJECT_DIR$/YtManagerApp/management/videos.py">
 | 
				
			||||||
 | 
					      <provider selected="true" editor-type-id="text-editor">
 | 
				
			||||||
 | 
					        <state relative-caret-position="357">
 | 
				
			||||||
 | 
					          <caret line="24" column="9" lean-forward="true" selection-start-line="24" selection-start-column="9" selection-end-line="24" selection-end-column="9" />
 | 
				
			||||||
 | 
					          <folding>
 | 
				
			||||||
 | 
					            <element signature="e#0#71#0" expanded="true" />
 | 
				
			||||||
 | 
					          </folding>
 | 
				
			||||||
 | 
					        </state>
 | 
				
			||||||
 | 
					      </provider>
 | 
				
			||||||
 | 
					    </entry>
 | 
				
			||||||
 | 
					    <entry file="file://$PROJECT_DIR$/YtManagerApp/scheduler.py">
 | 
				
			||||||
 | 
					      <provider selected="true" editor-type-id="text-editor">
 | 
				
			||||||
 | 
					        <state relative-caret-position="102">
 | 
				
			||||||
 | 
					          <caret line="6" selection-start-line="6" selection-end-line="6" />
 | 
				
			||||||
 | 
					          <folding>
 | 
				
			||||||
 | 
					            <element signature="e#0#14#0" expanded="true" />
 | 
				
			||||||
          </folding>
 | 
					          </folding>
 | 
				
			||||||
        </state>
 | 
					        </state>
 | 
				
			||||||
      </provider>
 | 
					      </provider>
 | 
				
			||||||
@@ -1106,22 +981,8 @@
 | 
				
			|||||||
        </state>
 | 
					        </state>
 | 
				
			||||||
      </provider>
 | 
					      </provider>
 | 
				
			||||||
    </entry>
 | 
					    </entry>
 | 
				
			||||||
    <entry file="file://$PROJECT_DIR$/YtManagerApp/scheduler.py">
 | 
					    <entry file="file://$PROJECT_DIR$/config/config.ini">
 | 
				
			||||||
      <provider selected="true" editor-type-id="text-editor">
 | 
					      <provider selected="true" editor-type-id="text-editor" />
 | 
				
			||||||
        <state relative-caret-position="102">
 | 
					 | 
				
			||||||
          <caret line="6" lean-forward="true" selection-start-line="6" selection-end-line="6" />
 | 
					 | 
				
			||||||
          <folding>
 | 
					 | 
				
			||||||
            <element signature="e#0#14#0" expanded="true" />
 | 
					 | 
				
			||||||
          </folding>
 | 
					 | 
				
			||||||
        </state>
 | 
					 | 
				
			||||||
      </provider>
 | 
					 | 
				
			||||||
    </entry>
 | 
					 | 
				
			||||||
    <entry file="file://$PROJECT_DIR$/YtManagerApp/management/jobs/delete_video.py">
 | 
					 | 
				
			||||||
      <provider selected="true" editor-type-id="text-editor">
 | 
					 | 
				
			||||||
        <state relative-caret-position="68">
 | 
					 | 
				
			||||||
          <caret line="4" selection-start-line="4" selection-end-line="4" />
 | 
					 | 
				
			||||||
        </state>
 | 
					 | 
				
			||||||
      </provider>
 | 
					 | 
				
			||||||
    </entry>
 | 
					    </entry>
 | 
				
			||||||
    <entry file="file://$PROJECT_DIR$/YtManagerApp/models.py">
 | 
					    <entry file="file://$PROJECT_DIR$/YtManagerApp/models.py">
 | 
				
			||||||
      <provider selected="true" editor-type-id="text-editor">
 | 
					      <provider selected="true" editor-type-id="text-editor">
 | 
				
			||||||
@@ -1141,5 +1002,82 @@
 | 
				
			|||||||
        </state>
 | 
					        </state>
 | 
				
			||||||
      </provider>
 | 
					      </provider>
 | 
				
			||||||
    </entry>
 | 
					    </entry>
 | 
				
			||||||
 | 
					    <entry file="file://$PROJECT_DIR$/YtManagerApp/management/jobs/delete_video.py">
 | 
				
			||||||
 | 
					      <provider selected="true" editor-type-id="text-editor">
 | 
				
			||||||
 | 
					        <state relative-caret-position="68">
 | 
				
			||||||
 | 
					          <caret line="4" selection-start-line="4" selection-end-line="4" />
 | 
				
			||||||
 | 
					        </state>
 | 
				
			||||||
 | 
					      </provider>
 | 
				
			||||||
 | 
					    </entry>
 | 
				
			||||||
 | 
					    <entry file="file://$PROJECT_DIR$/YtManager/settings.py">
 | 
				
			||||||
 | 
					      <provider selected="true" editor-type-id="text-editor">
 | 
				
			||||||
 | 
					        <state relative-caret-position="289">
 | 
				
			||||||
 | 
					          <caret line="44" column="1" lean-forward="true" selection-start-line="44" selection-start-column="1" selection-end-line="44" selection-end-column="1" />
 | 
				
			||||||
 | 
					        </state>
 | 
				
			||||||
 | 
					      </provider>
 | 
				
			||||||
 | 
					    </entry>
 | 
				
			||||||
 | 
					    <entry file="file://$PROJECT_DIR$/YtManagerApp/views/index.py">
 | 
				
			||||||
 | 
					      <provider selected="true" editor-type-id="text-editor">
 | 
				
			||||||
 | 
					        <state relative-caret-position="420">
 | 
				
			||||||
 | 
					          <caret line="159" column="32" lean-forward="true" selection-start-line="159" selection-start-column="32" selection-end-line="159" selection-end-column="32" />
 | 
				
			||||||
 | 
					          <folding>
 | 
				
			||||||
 | 
					            <element signature="e#0#42#0" expanded="true" />
 | 
				
			||||||
 | 
					            <marker date="1540023237405" expanded="true" signature="3128:3307" ph="..." />
 | 
				
			||||||
 | 
					            <marker date="1540023237405" expanded="true" signature="3339:3340" ph="..." />
 | 
				
			||||||
 | 
					            <marker date="1540023237405" expanded="true" signature="3646:3647" ph="..." />
 | 
				
			||||||
 | 
					            <marker date="1540023237405" expanded="true" signature="3646:4387" ph="..." />
 | 
				
			||||||
 | 
					            <marker date="1540023237405" expanded="true" signature="3668:4279" ph="..." />
 | 
				
			||||||
 | 
					            <marker date="1540023237405" expanded="true" signature="4432:4436" ph="..." />
 | 
				
			||||||
 | 
					            <marker date="1540023237405" expanded="true" signature="5221:6592" ph="..." />
 | 
				
			||||||
 | 
					            <marker date="1540023237405" expanded="true" signature="5465:5470" ph="..." />
 | 
				
			||||||
 | 
					            <marker date="1540023237405" expanded="true" signature="5491:5566" ph="..." />
 | 
				
			||||||
 | 
					            <marker date="1540023237405" expanded="true" signature="6640:6641" ph="..." />
 | 
				
			||||||
 | 
					            <marker date="1540023237405" expanded="true" signature="7201:7204" ph="..." />
 | 
				
			||||||
 | 
					          </folding>
 | 
				
			||||||
 | 
					        </state>
 | 
				
			||||||
 | 
					      </provider>
 | 
				
			||||||
 | 
					    </entry>
 | 
				
			||||||
 | 
					    <entry file="file://$PROJECT_DIR$/YtManagerApp/templatetags/common.py">
 | 
				
			||||||
 | 
					      <provider selected="true" editor-type-id="text-editor">
 | 
				
			||||||
 | 
					        <state relative-caret-position="459">
 | 
				
			||||||
 | 
					          <caret line="30" lean-forward="true" selection-start-line="30" selection-end-line="30" />
 | 
				
			||||||
 | 
					        </state>
 | 
				
			||||||
 | 
					      </provider>
 | 
				
			||||||
 | 
					    </entry>
 | 
				
			||||||
 | 
					    <entry file="das://2dac2136-d902-4d27-8789-9371934602fd/schema/main/table/ytmanagerapp_video">
 | 
				
			||||||
 | 
					      <provider selected="true" editor-type-id="com.intellij.database.editor.DatabaseTableFileEditorProvider">
 | 
				
			||||||
 | 
					        <state>
 | 
				
			||||||
 | 
					          <filtering enabled="true" />
 | 
				
			||||||
 | 
					        </state>
 | 
				
			||||||
 | 
					      </provider>
 | 
				
			||||||
 | 
					    </entry>
 | 
				
			||||||
 | 
					    <entry file="file://$PROJECT_DIR$/YtManagerApp/templatetags/ratings.py">
 | 
				
			||||||
 | 
					      <provider selected="true" editor-type-id="text-editor">
 | 
				
			||||||
 | 
					        <state relative-caret-position="187">
 | 
				
			||||||
 | 
					          <caret line="30" column="9" lean-forward="true" selection-start-line="30" selection-start-column="9" selection-end-line="30" selection-end-column="9" />
 | 
				
			||||||
 | 
					        </state>
 | 
				
			||||||
 | 
					      </provider>
 | 
				
			||||||
 | 
					    </entry>
 | 
				
			||||||
 | 
					    <entry file="file://C:/Python36/Lib/site-packages/django/template/base.py">
 | 
				
			||||||
 | 
					      <provider selected="true" editor-type-id="text-editor">
 | 
				
			||||||
 | 
					        <state relative-caret-position="279">
 | 
				
			||||||
 | 
					          <caret line="759" column="23" selection-start-line="759" selection-start-column="23" selection-end-line="759" selection-end-column="23" />
 | 
				
			||||||
 | 
					        </state>
 | 
				
			||||||
 | 
					      </provider>
 | 
				
			||||||
 | 
					    </entry>
 | 
				
			||||||
 | 
					    <entry file="file://$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.scss">
 | 
				
			||||||
 | 
					      <provider selected="true" editor-type-id="text-editor">
 | 
				
			||||||
 | 
					        <state relative-caret-position="527">
 | 
				
			||||||
 | 
					          <caret line="145" column="1" lean-forward="true" selection-start-line="145" selection-start-column="1" selection-end-line="145" selection-end-column="1" />
 | 
				
			||||||
 | 
					        </state>
 | 
				
			||||||
 | 
					      </provider>
 | 
				
			||||||
 | 
					    </entry>
 | 
				
			||||||
 | 
					    <entry file="file://$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/index_videos.html">
 | 
				
			||||||
 | 
					      <provider selected="true" editor-type-id="text-editor">
 | 
				
			||||||
 | 
					        <state relative-caret-position="391">
 | 
				
			||||||
 | 
					          <caret line="23" column="56" selection-start-line="23" selection-start-column="56" selection-end-line="23" selection-end-column="56" />
 | 
				
			||||||
 | 
					        </state>
 | 
				
			||||||
 | 
					      </provider>
 | 
				
			||||||
 | 
					    </entry>
 | 
				
			||||||
  </component>
 | 
					  </component>
 | 
				
			||||||
</project>
 | 
					</project>
 | 
				
			||||||
@@ -41,6 +41,7 @@ INSTALLED_APPS = [
 | 
				
			|||||||
    'django.contrib.sessions',
 | 
					    'django.contrib.sessions',
 | 
				
			||||||
    'django.contrib.messages',
 | 
					    'django.contrib.messages',
 | 
				
			||||||
    'django.contrib.staticfiles',
 | 
					    'django.contrib.staticfiles',
 | 
				
			||||||
 | 
					    'django.contrib.humanize'
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MIDDLEWARE = [
 | 
					MIDDLEWARE = [
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,10 +21,15 @@ def __check_new_videos_sub(subscription: Subscription, yt_api: YoutubeAPI):
 | 
				
			|||||||
        results = Video.objects.filter(video_id=video.getVideoId(), subscription=subscription)
 | 
					        results = Video.objects.filter(video_id=video.getVideoId(), subscription=subscription)
 | 
				
			||||||
        if len(results) == 0:
 | 
					        if len(results) == 0:
 | 
				
			||||||
            log.info('New video for subscription %s: %s %s"', subscription, video.getVideoId(), video.getTitle())
 | 
					            log.info('New video for subscription %s: %s %s"', subscription, video.getVideoId(), video.getTitle())
 | 
				
			||||||
            create_video(video, subscription)
 | 
					            db_video = create_video(video, subscription)
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            # TODO... update view count, rating etc
 | 
					            db_video = results.first()
 | 
				
			||||||
            pass
 | 
					
 | 
				
			||||||
 | 
					        # Update video stats - rating and view count
 | 
				
			||||||
 | 
					        stats = yt_api.get_single_video_stats(db_video.video_id)
 | 
				
			||||||
 | 
					        db_video.rating = stats.get_like_count() / (stats.get_like_count() + stats.get_dislike_count())
 | 
				
			||||||
 | 
					        db_video.views = stats.get_view_count()
 | 
				
			||||||
 | 
					        db_video.save()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def __detect_deleted(subscription: Subscription):
 | 
					def __detect_deleted(subscription: Subscription):
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,6 +19,7 @@ def create_video(yt_video: YoutubePlaylistItem, subscription: Subscription):
 | 
				
			|||||||
    video.icon_default = yt_video.getDefaultThumbnailUrl()
 | 
					    video.icon_default = yt_video.getDefaultThumbnailUrl()
 | 
				
			||||||
    video.icon_best = yt_video.getBestThumbnailUrl()
 | 
					    video.icon_best = yt_video.getBestThumbnailUrl()
 | 
				
			||||||
    video.save()
 | 
					    video.save()
 | 
				
			||||||
 | 
					    return video
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_videos(user: User,
 | 
					def get_videos(user: User,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -92,6 +92,8 @@
 | 
				
			|||||||
  margin-right: -0.25rem; }
 | 
					  margin-right: -0.25rem; }
 | 
				
			||||||
  .video-gallery .card .card-more:hover {
 | 
					  .video-gallery .card .card-more:hover {
 | 
				
			||||||
    text-decoration: none; }
 | 
					    text-decoration: none; }
 | 
				
			||||||
 | 
					.video-gallery .card .progress {
 | 
				
			||||||
 | 
					  width: 100px; }
 | 
				
			||||||
.video-gallery .video-icon-yes {
 | 
					.video-gallery .video-icon-yes {
 | 
				
			||||||
  color: #007bff; }
 | 
					  color: #007bff; }
 | 
				
			||||||
.video-gallery .video-icon-no {
 | 
					.video-gallery .video-icon-no {
 | 
				
			||||||
@@ -110,4 +112,8 @@
 | 
				
			|||||||
  .modal-field-error ul {
 | 
					  .modal-field-error ul {
 | 
				
			||||||
    margin: 0; }
 | 
					    margin: 0; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.star-rating {
 | 
				
			||||||
 | 
					  display: inline-block;
 | 
				
			||||||
 | 
					  margin-bottom: 0.5rem; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*# sourceMappingURL=style.css.map */
 | 
					/*# sourceMappingURL=style.css.map */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
"version": 3,
 | 
					"version": 3,
 | 
				
			||||||
"mappings": "AAEA,OAAQ;EACJ,QAAQ,EAAE,KAAK;EACf,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,CAAC;EACR,MAAM,EAAE,CAAC;EACT,MAAM,EAAE,IAAI;EACZ,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,SAAS;EAClB,OAAO,EAAE,IAAI;EACb,aAAa,EAAE,MAAM;EACrB,SAAS,EAAE,IAAI;;AAqBnB,uBAAuB;AACvB,kBAAmB;EAlBf,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAa;EACpB,MAAM,EAAE,IAAa;EAErB,wBAAQ;IACJ,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,KAAK;IACd,KAAK,EAAE,IAAa;IACpB,MAAM,EAAE,IAAa;IACrB,MAAM,EAAE,GAAG;IACX,aAAa,EAAE,GAAG;IAClB,MAAM,EAAE,iBAAkC;IAC1C,YAAY,EAAE,uCAAmD;IACjE,SAAS,EAAE,sCAAsC;;AASzD,wBAAyB;EAtBrB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAa;EACpB,MAAM,EAAE,IAAa;EAErB,8BAAQ;IACJ,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,KAAK;IACd,KAAK,EAAE,IAAa;IACpB,MAAM,EAAE,IAAa;IACrB,MAAM,EAAE,GAAG;IACX,aAAa,EAAE,GAAG;IAClB,MAAM,EAAE,mBAAkC;IAC1C,YAAY,EAAE,uCAAmD;IACjE,SAAS,EAAE,sCAAsC;;AAazD,4BAOC;EANG,EAAG;IACC,SAAS,EAAE,YAAY;EAE3B,IAAK;IACD,SAAS,EAAE,cAAc;AAIjC,gCAAiC;EAC7B,QAAQ,EAAE,KAAK;EACf,GAAG,EAAE,GAAG;EACR,IAAI,EAAE,GAAG;EACT,UAAU,EAAE,KAAK;EACjB,WAAW,EAAE,KAAK;;AAGtB,cAAe;EACX,QAAQ,EAAE,KAAK;EAAE,oCAAoC;EACrD,OAAO,EAAE,IAAI;EAAE,uBAAuB;EACtC,KAAK,EAAE,IAAI;EAAE,uCAAuC;EACpD,MAAM,EAAE,IAAI;EAAE,wCAAwC;EACtD,GAAG,EAAE,CAAC;EACN,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,CAAC;EACR,MAAM,EAAE,CAAC;EACT,gBAAgB,EAAE,kBAAe;EAAE,mCAAmC;EACtE,OAAO,EAAE,CAAC;EAAE,qFAAqF;EACjG,MAAM,EAAE,OAAO;EAAE,4BAA4B;;AAI7C,4BAAc;EACV,OAAO,EAAE,MAAM;EACf,aAAa,EAAE,KAAK;AAGpB,+BAAW;EACP,OAAO,EAAE,MAAM;AAEnB,+BAAW;EACP,SAAS,EAAE,IAAI;EACf,aAAa,EAAE,KAAK;AAExB,gCAAY;EACR,SAAS,EAAE,IAAI;EACf,aAAa,EAAE,KAAK;EAEpB,uCAAO;IACH,SAAS,EAAE,GAAG;AAGtB,iCAAa;EACT,OAAO,EAAE,YAAY;AAGzB,+BAAW;EACP,YAAY,EAAE,QAAQ;EACtB,qCAAQ;IACJ,eAAe,EAAE,IAAI;AASjC,8BAAgB;EACZ,KAAK,EA/GE,OAAO;AAiHlB,6BAAe;EACX,KAAK,EAAE,OAAO;;AAItB,WAAY;EACR,SAAS,EAAE,KAAK;EAChB,MAAM,EAAE,MAAM;;AAId,2BAAe;EACX,OAAO,EAAE,IAAI;;AAIrB,kBAAmB;EACf,MAAM,EAAE,QAAQ;EAChB,OAAO,EAAE,QAAQ;EAEjB,qBAAG;IACC,MAAM,EAAE,CAAC",
 | 
					"mappings": "AAEA,OAAQ;EACJ,QAAQ,EAAE,KAAK;EACf,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,CAAC;EACR,MAAM,EAAE,CAAC;EACT,MAAM,EAAE,IAAI;EACZ,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,SAAS;EAClB,OAAO,EAAE,IAAI;EACb,aAAa,EAAE,MAAM;EACrB,SAAS,EAAE,IAAI;;AAqBnB,uBAAuB;AACvB,kBAAmB;EAlBf,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAa;EACpB,MAAM,EAAE,IAAa;EAErB,wBAAQ;IACJ,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,KAAK;IACd,KAAK,EAAE,IAAa;IACpB,MAAM,EAAE,IAAa;IACrB,MAAM,EAAE,GAAG;IACX,aAAa,EAAE,GAAG;IAClB,MAAM,EAAE,iBAAkC;IAC1C,YAAY,EAAE,uCAAmD;IACjE,SAAS,EAAE,sCAAsC;;AASzD,wBAAyB;EAtBrB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAa;EACpB,MAAM,EAAE,IAAa;EAErB,8BAAQ;IACJ,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,KAAK;IACd,KAAK,EAAE,IAAa;IACpB,MAAM,EAAE,IAAa;IACrB,MAAM,EAAE,GAAG;IACX,aAAa,EAAE,GAAG;IAClB,MAAM,EAAE,mBAAkC;IAC1C,YAAY,EAAE,uCAAmD;IACjE,SAAS,EAAE,sCAAsC;;AAazD,4BAOC;EANG,EAAG;IACC,SAAS,EAAE,YAAY;EAE3B,IAAK;IACD,SAAS,EAAE,cAAc;AAIjC,gCAAiC;EAC7B,QAAQ,EAAE,KAAK;EACf,GAAG,EAAE,GAAG;EACR,IAAI,EAAE,GAAG;EACT,UAAU,EAAE,KAAK;EACjB,WAAW,EAAE,KAAK;;AAGtB,cAAe;EACX,QAAQ,EAAE,KAAK;EAAE,oCAAoC;EACrD,OAAO,EAAE,IAAI;EAAE,uBAAuB;EACtC,KAAK,EAAE,IAAI;EAAE,uCAAuC;EACpD,MAAM,EAAE,IAAI;EAAE,wCAAwC;EACtD,GAAG,EAAE,CAAC;EACN,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,CAAC;EACR,MAAM,EAAE,CAAC;EACT,gBAAgB,EAAE,kBAAe;EAAE,mCAAmC;EACtE,OAAO,EAAE,CAAC;EAAE,qFAAqF;EACjG,MAAM,EAAE,OAAO;EAAE,4BAA4B;;AAI7C,4BAAc;EACV,OAAO,EAAE,MAAM;EACf,aAAa,EAAE,KAAK;AAGpB,+BAAW;EACP,OAAO,EAAE,MAAM;AAEnB,+BAAW;EACP,SAAS,EAAE,IAAI;EACf,aAAa,EAAE,KAAK;AAExB,gCAAY;EACR,SAAS,EAAE,IAAI;EACf,aAAa,EAAE,KAAK;EAEpB,uCAAO;IACH,SAAS,EAAE,GAAG;AAGtB,iCAAa;EACT,OAAO,EAAE,YAAY;AAGzB,+BAAW;EACP,YAAY,EAAE,QAAQ;EACtB,qCAAQ;IACJ,eAAe,EAAE,IAAI;AAO7B,8BAAU;EACN,KAAK,EAAE,KAAK;AAKpB,8BAAgB;EACZ,KAAK,EAnHE,OAAO;AAqHlB,6BAAe;EACX,KAAK,EAAE,OAAO;;AAItB,WAAY;EACR,SAAS,EAAE,KAAK;EAChB,MAAM,EAAE,MAAM;;AAId,2BAAe;EACX,OAAO,EAAE,IAAI;;AAIrB,kBAAmB;EACf,MAAM,EAAE,QAAQ;EAChB,OAAO,EAAE,QAAQ;EAEjB,qBAAG;IACC,MAAM,EAAE,CAAC;;AAIjB,YAAa;EACT,OAAO,EAAE,YAAY;EACrB,aAAa,EAAE,MAAM",
 | 
				
			||||||
"sources": ["style.scss"],
 | 
					"sources": ["style.scss"],
 | 
				
			||||||
"names": [],
 | 
					"names": [],
 | 
				
			||||||
"file": "style.css"
 | 
					"file": "style.css"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -104,8 +104,12 @@ $accent-color: #007bff;
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        .card-img-top {
 | 
					        .card-img-top {
 | 
				
			||||||
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .progress {
 | 
				
			||||||
 | 
					            width: 100px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    .video-icon-yes {
 | 
					    .video-icon-yes {
 | 
				
			||||||
@@ -134,5 +138,9 @@ $accent-color: #007bff;
 | 
				
			|||||||
    ul {
 | 
					    ul {
 | 
				
			||||||
        margin: 0;
 | 
					        margin: 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.star-rating {
 | 
				
			||||||
 | 
					    display: inline-block;
 | 
				
			||||||
 | 
					    margin-bottom: 0.5rem;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -1,3 +1,6 @@
 | 
				
			|||||||
 | 
					{% load humanize %}
 | 
				
			||||||
 | 
					{% load ratings %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<div class="video-gallery container-fluid">
 | 
					<div class="video-gallery container-fluid">
 | 
				
			||||||
    <div class="row">
 | 
					    <div class="row">
 | 
				
			||||||
        {% for video in videos %}
 | 
					        {% for video in videos %}
 | 
				
			||||||
@@ -11,6 +14,11 @@
 | 
				
			|||||||
                            {% endif %}
 | 
					                            {% endif %}
 | 
				
			||||||
                            {{ video.name }}
 | 
					                            {{ video.name }}
 | 
				
			||||||
                        </h5>
 | 
					                        </h5>
 | 
				
			||||||
 | 
					                        <p class="card-text small text-muted">
 | 
				
			||||||
 | 
					                            <span>{{ video.views | intcomma }} views</span>
 | 
				
			||||||
 | 
					                            <span>•</span>
 | 
				
			||||||
 | 
					                            <span>{{ video.publish_date | naturaltime }}</span>
 | 
				
			||||||
 | 
					                        </p>
 | 
				
			||||||
                        <p class="card-text">{{ video.description | truncatechars:120 }}</p>
 | 
					                        <p class="card-text">{{ video.description | truncatechars:120 }}</p>
 | 
				
			||||||
                    </div>
 | 
					                    </div>
 | 
				
			||||||
                    <div class="card-footer dropdown show">
 | 
					                    <div class="card-footer dropdown show">
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										0
									
								
								YtManagerApp/templatetags/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								YtManagerApp/templatetags/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										30
									
								
								YtManagerApp/templatetags/common.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								YtManagerApp/templatetags/common.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
				
			|||||||
 | 
					from django import template
 | 
				
			||||||
 | 
					register = template.Library()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class SetVarNode(template.Node):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __init__(self, var_name, var_value):
 | 
				
			||||||
 | 
					        self.var_name = var_name
 | 
				
			||||||
 | 
					        self.var_value = var_value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def render(self, context):
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            value = template.Variable(self.var_value).resolve(context)
 | 
				
			||||||
 | 
					        except template.VariableDoesNotExist:
 | 
				
			||||||
 | 
					            value = ""
 | 
				
			||||||
 | 
					        context[self.var_name] = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return u""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@register.tag(name='set')
 | 
				
			||||||
 | 
					def set_var(parser, token):
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    {% set some_var = '123' %}
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    parts = token.split_contents()
 | 
				
			||||||
 | 
					    if len(parts) < 4:
 | 
				
			||||||
 | 
					        raise template.TemplateSyntaxError("'set' tag must be of the form: {% set <var_name> = <var_value> %}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return SetVarNode(parts[1], parts[3])
 | 
				
			||||||
							
								
								
									
										61
									
								
								YtManagerApp/templatetags/ratings.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								YtManagerApp/templatetags/ratings.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,61 @@
 | 
				
			|||||||
 | 
					from django import template
 | 
				
			||||||
 | 
					register = template.Library()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FULL_STAR_CLASS = "typcn-star-full-outline"
 | 
				
			||||||
 | 
					HALF_STAR_CLASS = "typcn-star-half-outline"
 | 
				
			||||||
 | 
					EMPTY_STAR_CLASS = "typcn-star-outline"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class StarRatingNode(template.Node):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __init__(self, rating_percent, max_stars="5"):
 | 
				
			||||||
 | 
					        self.rating = rating_percent
 | 
				
			||||||
 | 
					        self.max_stars = max_stars
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def render(self, context):
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            rating = template.Variable(self.rating).resolve(context)
 | 
				
			||||||
 | 
					        except template.VariableDoesNotExist:
 | 
				
			||||||
 | 
					            rating = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            max_stars = template.Variable(self.max_stars).resolve(context)
 | 
				
			||||||
 | 
					        except template.VariableDoesNotExist:
 | 
				
			||||||
 | 
					            max_stars = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        total_halves = (max_stars - 1) * rating * 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        html = [
 | 
				
			||||||
 | 
					            f'<div class="star-rating" title="{ 1 + (total_halves / 2):.2f} stars">'
 | 
				
			||||||
 | 
					            f'<span class="typcn {FULL_STAR_CLASS}"></span>'
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for i in range(max_stars - 1):
 | 
				
			||||||
 | 
					            if total_halves >= 2 * i + 2:
 | 
				
			||||||
 | 
					                cls = FULL_STAR_CLASS
 | 
				
			||||||
 | 
					            elif total_halves >= 2 * i + 1:
 | 
				
			||||||
 | 
					                cls = HALF_STAR_CLASS
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                cls = EMPTY_STAR_CLASS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            html.append(f'<span class="typcn {cls}"></span>')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        html.append("</div>")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return u"".join(html)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@register.tag(name='starrating')
 | 
				
			||||||
 | 
					def star_rating_tag(parser, token):
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    {% rating percent [max_stars=5]%}
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    parts = token.split_contents()
 | 
				
			||||||
 | 
					    if len(parts) <= 1:
 | 
				
			||||||
 | 
					        raise template.TemplateSyntaxError("'set' tag must be of the form: {% rating <value_percent> [<max_stars>=5] %}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if len(parts) <= 2:
 | 
				
			||||||
 | 
					        return StarRatingNode(parts[1])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return StarRatingNode(parts[1], parts[2])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1,3 +1,7 @@
 | 
				
			|||||||
 | 
					import itertools
 | 
				
			||||||
 | 
					from typing import Iterable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def first_true(*args, default=False, pred=None):
 | 
					def first_true(*args, default=False, pred=None):
 | 
				
			||||||
    """Returns the first true value in the iterable.
 | 
					    """Returns the first true value in the iterable.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -10,3 +14,19 @@ def first_true(*args, default=False, pred=None):
 | 
				
			|||||||
    # first_true([a,b,c], x) --> a or b or c or x
 | 
					    # first_true([a,b,c], x) --> a or b or c or x
 | 
				
			||||||
    # first_true([a,b], x, f) --> a if f(a) else b if f(b) else x
 | 
					    # first_true([a,b], x, f) --> a if f(a) else b if f(b) else x
 | 
				
			||||||
    return next(filter(pred, args), default)
 | 
					    return next(filter(pred, args), default)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def as_chunks(iterable: Iterable, chunk_size: int):
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    Iterates an iterable in chunks of chunk_size elements.
 | 
				
			||||||
 | 
					    :param iterable: An iterable containing items to iterate.
 | 
				
			||||||
 | 
					    :param chunk_size: Chunk size
 | 
				
			||||||
 | 
					    :return: Returns a generator which will yield chunks of size chunk_size
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it = iter(iterable)
 | 
				
			||||||
 | 
					    while True:
 | 
				
			||||||
 | 
					        chunk = tuple(itertools.islice(it, chunk_size))
 | 
				
			||||||
 | 
					        if not chunk:
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					        yield chunk
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,10 +3,13 @@ from googleapiclient.errors import Error as APIError
 | 
				
			|||||||
from google_auth_oauthlib.flow import InstalledAppFlow
 | 
					from google_auth_oauthlib.flow import InstalledAppFlow
 | 
				
			||||||
from django.conf import settings
 | 
					from django.conf import settings
 | 
				
			||||||
import re
 | 
					import re
 | 
				
			||||||
 | 
					from YtManagerApp.utils.iterutils import as_chunks
 | 
				
			||||||
 | 
					
 | 
				
			||||||
API_SERVICE_NAME = 'youtube'
 | 
					API_SERVICE_NAME = 'youtube'
 | 
				
			||||||
API_VERSION = 'v3'
 | 
					API_VERSION = 'v3'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					YOUTUBE_LIST_LIMIT = 50
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class YoutubeException(Exception):
 | 
					class YoutubeException(Exception):
 | 
				
			||||||
    pass
 | 
					    pass
 | 
				
			||||||
@@ -28,6 +31,10 @@ class YoutubePlaylistNotFoundException(YoutubeException):
 | 
				
			|||||||
    pass
 | 
					    pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class YoutubeVideoNotFoundException(YoutubeException):
 | 
				
			||||||
 | 
					    pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class YoutubeChannelInfo(object):
 | 
					class YoutubeChannelInfo(object):
 | 
				
			||||||
    def __init__(self, result_dict):
 | 
					    def __init__(self, result_dict):
 | 
				
			||||||
        self.__id = result_dict['id']
 | 
					        self.__id = result_dict['id']
 | 
				
			||||||
@@ -130,6 +137,27 @@ class YoutubePlaylistItem(object):
 | 
				
			|||||||
        return self.__snippet['position']
 | 
					        return self.__snippet['position']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class YoutubeVideoStatistics(object):
 | 
				
			||||||
 | 
					    def __init__(self, result_dict):
 | 
				
			||||||
 | 
					        self.id = result_dict['id']
 | 
				
			||||||
 | 
					        self.stats = result_dict['statistics']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_view_count(self):
 | 
				
			||||||
 | 
					        return int(self.stats['viewCount'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_like_count(self):
 | 
				
			||||||
 | 
					        return int(self.stats['likeCount'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_dislike_count(self):
 | 
				
			||||||
 | 
					        return int(self.stats['dislikeCount'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_favorite_count(self):
 | 
				
			||||||
 | 
					        return int(self.stats['favoriteCount'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_comment_count(self):
 | 
				
			||||||
 | 
					        return int(self.stats['commentCount'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class YoutubeAPI(object):
 | 
					class YoutubeAPI(object):
 | 
				
			||||||
    def __init__(self, service):
 | 
					    def __init__(self, service):
 | 
				
			||||||
        self.service = service
 | 
					        self.service = service
 | 
				
			||||||
@@ -230,6 +258,26 @@ class YoutubeAPI(object):
 | 
				
			|||||||
            else:
 | 
					            else:
 | 
				
			||||||
                last_page = True
 | 
					                last_page = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_single_video_stats(self, video_id) -> YoutubeVideoStatistics:
 | 
				
			||||||
 | 
					        result = list(self.get_video_stats([video_id]))
 | 
				
			||||||
 | 
					        if len(result) < 1:
 | 
				
			||||||
 | 
					            raise YoutubeVideoNotFoundException('Could not find video with id ' + video_id + '!')
 | 
				
			||||||
 | 
					        return result[0]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_video_stats(self, video_id_list):
 | 
				
			||||||
 | 
					        for chunk in as_chunks(video_id_list, YOUTUBE_LIST_LIMIT):
 | 
				
			||||||
 | 
					            kwargs = {
 | 
				
			||||||
 | 
					                "part": "statistics",
 | 
				
			||||||
 | 
					                "maxResults": YOUTUBE_LIST_LIMIT,
 | 
				
			||||||
 | 
					                "id": ','.join(chunk)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            result = self.service.videos()\
 | 
				
			||||||
 | 
					                .list(**kwargs)\
 | 
				
			||||||
 | 
					                .execute()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            for item in result['items']:
 | 
				
			||||||
 | 
					                yield YoutubeVideoStatistics(item)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # @staticmethod
 | 
					    # @staticmethod
 | 
				
			||||||
    # def build_oauth() -> 'YoutubeAPI':
 | 
					    # def build_oauth() -> 'YoutubeAPI':
 | 
				
			||||||
    #     flow =
 | 
					    #     flow =
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user