Giter Site home page Giter Site logo

signalserver's Introduction

SignalServer

SignalServer is a web app to accompany QCTools. Some early planning documentation is available in this Vision doc.

Installation

Docker

SignalServer is designed using docker in mind. Please install BOTH docker-engine and docker-compose before you start. Downloads of Docker for various OS are available at:

Linux: https://docs.docker.com/engine/installation/

OSX: https://docs.docker.com/engine/installation/mac/#/docker-for-mac

Windows: https://docs.docker.com/engine/installation/windows/

SignalServer requires docker-compose above version 1.7, please update if needed.

https://docs.docker.com/compose/install/

Once you have docker-engine and docker-compose installed and confirmed docker is running, you can install SignalServer.

For Mac Users

If you installed Docker by using Docker for Mac... there is one more step:

Create a directly where you want to mount the file volume for SignalServer. (default is /files) So create /files directly if you don't have a strong preference about it.

mkdir /files

Also make sure you give the /files directly the full permission. It may give an error if you don't give full permission.

Then you click on docker icon on the top right bar and select "preferences" and select "File Sharing" tab.

screen shot 2017-02-09 at 12 49 30 am

In the File Sharing tab, click '+' icon and select /files (the directory you created in previous step). And /files should be added to "File Sharing".

screen shot 2017-02-09 at 12 49 54 am

For Older Docker Environments

If you are running and older Mac or Windows environement with Docker Toolbox, you will need to uncomment the first 4 lines of quickstart.sh or quickstartdev.sh. These four lines needs to be uncommented:

 #docker-machine create --driver virtualbox default
 #docker-machine start default
 #docker-machine env default
 #eval "$(docker-machine env default)"

Non Docker for mac users, window users

If you are using older version of mac or windows, you still need these above four lines, so please uncomment these before you run the quickstart.

Now SignalServer is ready to be installed.

Docker Troubleshooting

If you run this script often, or if your script got stuck and don't produce any output, you may want to remove the intermediate containers/images every once in a while.

docker ps -a -q | xargs docker rm -f
docker images -a -q | xargs docker rmi -f

Installing SignalServer

From git

git clone https://github.com/bavc/signalserver.git
cd signalserver
./quickstart.sh

Environment variable

SignalServer has a capacity to accept large numbers of files. Thus, we provide an option to determine where the files are stored in your host OS.

For example, the host OS has only 8G of local storage but you mounted extra space in /data directly of your host OS. Then you could designate your file storage to be within /data directly. In this case, your file storage path is:

FILES_VOLUME_PATH=/data

You can set this value either in the .env file or you can run with ./quickstart.sh script. Default value for this value is:

FILES_VOLUME_PATH=/files

If you don't have any special arrangement for space, you can just edit the .env file with above line in the project root directly. Within the docker container, it will be stored in /var/signalserver/files directly.

Running SignalServer

Quickstart

When you have docker-engine and docker-compose installed and the .env file is created with above value, you just need to run below script.

./quickstart.sh

Then, it should tell you where the IP address of the web server docker container is running.

If you didn't set up the .env file, but you still want to store the files at the specific location, you can also run the command following way.

FILES_VOLUME_PATH=/data ./quickstart.sh

Frontend

In this point, your application is running on port of the localhost that quickstart.sh tells you. However, you may not have frontend assets loaded.

If it is the case, you need to open the frontend.sh file and change the 1st line as below. In this example, this person's SignalServer folder is located on /Users/username/signalserver/Dockerfile-frontend So in this example, the first line of the frontend.sh should be changed as below.

docker build -t signalserver-frontend -f /Users/username/signalserver/Dockerfile-frontend .

(Note the trailing ., which is significant).

Once you changed your frontend.sh to your project's Dockerfile-frontend path, save the file and run frontend.sh. After you run frontend.sh, run quickstart.sh again following the first step.

./frontend.sh
./quickstart.sh

And that should be it!

Cleanup

If doing a lot of development work and building many dockers, you may want to clean up by running docker ps -a -q | xargs docker rm -f and docker images -a -q | xargs docker rmi -f

API usage

Fileupload

Once you are running the SignalServer and you create your credential at the site, you can upload the file not only from the site, but also using the API from SignalServer. The curl command is as below.

curl -i -u "username:password" [signalserver IP]:8000/fileuploads/upload/ --upload-file [your file name]

Example: You want to upload the filename '5A_born_digital_ffv1.qctools.xml.gz' to the server 192.168.99.100 and your username and password is user1 and password2

curl -i -u "user1:password2" 192.168.99.100:8000/fileuploads/upload/ --upload-file 5A_born_digital_ffv1.qctools.xml.gz

Check file existence

The file existence check returns true or false by given filename.

curl -i -u "username:password" [signalserver IP]:8000/fileuploads/check_exist/[your file name]

Example: You want to check the filename '5A_born_digital_ffv1.qctools.xml.gz' exist in the server or not. The server is 192.168.99.100 and your username and password is user1 and password2

curl -i -u "user1:password2" 192.168.99.100:8000/fileuploads/check_exist/5A_born_digital_ffv1.qctools.xml.gz

Delete a file from the server

The delete a file by given filename.

curl -i -u "username:password" [signalserver IP]:8000/fileuploads/delete_file/ --data "filename=[yourfilename]"

Example: You want to delete the filename '5A_born_digital_ffv1.qctools.xml.gz' from the server. The server is 192.168.99.100 and your username and password is user1 and password2

curl -i -u "user1:password2" 192.168.99.100:8000/fileuploads/delete_file/ --data="filename=5A_born_digital_ffv1.qctools.xml.gz"

Create a new group

The create group allow you to create a new group. The name needs to be unique. (It will return error message if it is not.)

curl -u "username:password" [signalserver IP]:8000/groups/create_group -data="groupname=[your groupname]"

Example: You want to create a new group named 'panda_group'. The server is 192.168.99.100 and your username and password is user1 and password2

curl -i -u "user1:password2" 192.168.99.100:8000/groups/create_group/ --data "groupname=panda_group"

Add a file to a group

The Add file allow you to add a file to a group. Both file and group needs to be exist in the server. (It will return error message if one or both of them is not.)

curl -u "username:password" [signalserver IP]:8000/groups/add_file -data="groupname=[your groupname]&filename=[your filename]"

Example: You want to add a file named 'cucumber.gocart.xml.gz' 'panda_group'. The server is 192.168.99.100 and your username and password is user1 and password2

curl -i -u "user1:password2" 192.168.99.100:8000/groups/add_file/ --data "groupname=panda_group&filename=cucumber.gocart.xml.gz"

For Developers

Congratulations for reading this far. So you want to customize or change SignalServer or contribute, here is what you need to know.

Pre-Requisite

  • Be able to install Docker, have a basic understanding of what Docker is, and be able to do basic system administration.

If you have no idea what Docker is, please review before proceeding.

Docker Video Tutorial

https://www.youtube.com/watch?v=bV5vbNK3Uhw&list=PLkA60AVN3hh_6cAz8TUGtkYbJSL2bdZ4h

Also, please go over this docker compose tutorial for Wordpress (and please actually do deploy the Wordpress site by yourself). This project depends on docker compose. So it is good to have a basic understanding.

Welcome back. Assume you watched at least some of the tutorials and followed along the all the basics and you also deployed a Wordpress site. So now you know, how you deploy web application by single bash file. I hope you enjoyed your docker journey so far.

So let me explain SignalServer's architecture overall. There are roughly three components of this system. Froendend, backend, and queue system. I will list these below but they are all put together by docker and docker compose. So you don't have to do any configuration for each of the application.

  • Frontend - Bower Packagemement, Node Server (Bower's dependency) bootstrap, d3, jquery (all frontend asessets are installed by bower)

  • Backend - Django and Django RestFramework, Porgress (database)

  • Queue System - Celery, Rabbit MQ, Redis

When you open the docker-compose.yml file, you see this application uses 5 docker containers to put these application together. (Also, you can easily add one more worker for your queue system by changing docker-compose.yml e.g. your CPU utilization is low with one queue.)

Lastly, I recommend to use docker with it but it is not absolute requirement. You are free to choose whatever development environtment you like. Just to make sure it works with entire system at the end of the day.

Good luck and Have fun!

signalserver's People

Contributors

ablwr avatar dericed avatar fr33ky avatar kieranjol avatar metacynicv2 avatar yayoiukai avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

signalserver's Issues

localhost has frozen "file" button

When I run the localhost version, I cannot click the file button in the navigation bar. Because of this, I'm unable to do any to do any testing on the most recent version of signalserver.

store upload timestamp

I suggest storing the upload timestamp of new files supplied to the database and showing that timestamp on the file report.

supply method to edit/reapply evaluation

provide a ui so that the user may create, edit, delete, import, export evaluation criteria by selecting from a list of unique metadata keys (BRNG, TOUT, etc) and an operator such as average, count of frames greater than X (or equal to, less than, etc),

use a default value for

If running quickstart.sh without declaring FILES_VOLUME_PATH, then the output is like:

WARNING: The FILES_VOLUME_PATH variable is not set. Defaulting to a blank string.
ERROR: Cannot create container for service web: create .: "." includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed
WARNING: The FILES_VOLUME_PATH variable is not set. Defaulting to a blank string.
ERROR: Cannot create container for service web: create .: "." includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed
WARNING: The FILES_VOLUME_PATH variable is not set. Defaulting to a blank string.
ERROR: Cannot create container for service web: create .: "." includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed
WARNING: The FILES_VOLUME_PATH variable is not set. Defaulting to a blank string.
ERROR: Cannot create container for service web: create .: "." includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed
WARNING: The FILES_VOLUME_PATH variable is not set. Defaulting to a blank string.
ERROR: Cannot create container for service web: create .: "." includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed
WARNING: The FILES_VOLUME_PATH variable is not set. Defaulting to a blank string.
ERROR: Cannot create container for service web: create .: "." includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed

Could ./quickstart.sh just use /files unless the global var is already defined. That way we'd only have to define it if we want to overwrite the default value.

cannot add # when editing policy

When editing a rule in a policy, if the user had picked 'average' but then changes it to a something more specific requiring a number, that box does not appear so the user has to edit, change, save, edit again, and then add the number. It should be streamlined so it appears as needed.

Rewrite language for policy percentages or remove them all together (for now)

This is totally up for debate, especially since you guys know better than me about the functionalities of signalserver.

Try as we might the two features of policies below are near impossible for us (me) to understand, let alone use or explain.

Percentage for the Group Process reporting**
Percentage for the File Process reporting***

I am wondering if Ashley or Dave or a savvy third party can re-write the description as if they will be read by people who haven't thought about math since the 5th grade (me).

But I'm also wondering if we can take these features out for now and revisit them at a later date, perhaps after the tester workshop.

?

LICENSE.md

Repo needs an open source license declaration!

in quickstart add a check for dependency

could be more elegant

FILES_VOLUME_PATH=/files ./quickstart.sh
./quickstart.sh: line 2: docker-machine: command not found
./quickstart.sh: line 3: docker-machine: command not found
./quickstart.sh: line 4: docker-machine: command not found
./quickstart.sh: line 5: docker-machine: command not found
./quickstart.sh: line 6: docker-compose: command not found
./quickstart.sh: line 7: docker-compose: command not found
./quickstart.sh: line 11: docker-compose: command not found
./quickstart.sh: line 11: docker-compose: command not found
./quickstart.sh: line 11: docker-compose: command not found
./quickstart.sh: line 11: docker-compose: command not found

create mockup for configuration editor

Allow create, edit, delete of summarization configurations.

For each summarization allow create, edit, delete of rules of the summarization (such as average of YDIF, or count of frames with BRNG over 77). I'm reminded of the MediaConch policy editor for this.

localhost doesn't seem to be updating correctly

When I run the localhost version, I cannot click the file button in the navigation bar. Because of this, I'm unable to do any to do any testing on the most recent version of signalserver.

When I make updates in my local repo, the updates push correctly to the remote repo, but the updates are not seen in localhost:8000.

Is there a step missing in the docker instructions? Or maybe an update?

Kelly

logo

Hello! I made a logo for signalserver because it was looking a little sad without one.

screen shot 2016-12-24 at 17 34 47

error on password reset

I went to http://localhost:8000/register/ to register an account with an email. Then clicked on http://localhost:8000/password_reset/ to reset the password but get an error:

SMTPSenderRefused at /password_reset/

(530, b'5.5.1 Authentication Required. Learn more at\n5.5.1  https://support.google.com/mail/?p=WantAuthError q3sm8571800qte.0 - gsmtp', '[email protected]')

Request Method: 	POST
Request URL: 	http://localhost:8000/password_reset/
Django Version: 	1.10.5
Exception Type: 	SMTPSenderRefused
Exception Value: 	

(530, b'5.5.1 Authentication Required. Learn more at\n5.5.1  https://support.google.com/mail/?p=WantAuthError q3sm8571800qte.0 - gsmtp', '[email protected]')

Exception Location: 	/usr/local/lib/python3.4/smtplib.py in sendmail, line 783
Python Executable: 	/usr/local/bin/python
Python Version: 	3.4.5
Python Path: 	

['/usr/src/app',
 '/usr/local/lib/python34.zip',
 '/usr/local/lib/python3.4',
 '/usr/local/lib/python3.4/plat-linux',
 '/usr/local/lib/python3.4/lib-dynload',
 '/usr/local/lib/python3.4/site-packages',
 '/usr/src/app']

Server time: 	Thu, 9 Feb 2017 04:05:55 -0500

Support of tokens instead of password only

Currently the API supports only a password for credentials, and clients have to store the password on their side if they don't want to ask the user to enter the password each time they access the server.
This may be an issue if the computer of the user is compromised, as the password would be retrieved.
A best practice nowadays is to store a token instead of the password on the client side, so the password is transmitted only once and not stored on the client machine (only the token is stored, and can be revoked if the machine is compromised, without providing the password)

Related to bavc/qctools#242 (comment)

Rename policy button leads to error

The rename option raises a FieldError at /policy/rename with Cannot resolve keyword 'policy_name' into field. Choices are: filename, id, process, process_id, row, status, task_id

HTTPS support

Nowadays, communication between client and server is sensitive, and a server should accept HTTPS communications, especially if some sensitive information is transported (e.g. a password, users use to use the same password everywhere so scanning the HTTP signalserver communication would permit e.g. an attacker to access the email account of the user).

Related to bavc/qctools#242 (comment)

create mockup for file view

Show file's record, along with what summarizations have been made and the resulting output of each summarization

show info and edit ability per rule in policies

On the "Add/Delete Filter on Policies" as rules are edited some value doesn't show. For instance if saying that psnr.Y exceeds a cutoff number of 1. The '1' doesn't appear after the rule is supplied. There should be a way to view and edit existing rules of a policy (so far they can only be deleted).

Also Filter2 should only be shown contextually if average-difference is selected, else it has no meaning.

add format and stream metadata

QCTools will soon be able to push <streams> and <format> data to signalserver.

Here is an example:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created by QCTools 0.6.0 -->
<ffprobe:ffprobe xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:ffprobe='http://www.ffmpeg.org/schema/ffprobe' xsi:schemaLocation='http://www.ffmpeg.org/schema/ffprobe ffprobe.xsd'>
    <program_version version="git-2017-02-05-e57fd92" copyright="Copyright (c) 2007-2017 the FFmpeg developers" build_date="Feb  8 2017" build_time="20:52:25" compiler_ident="not available" configuration="not available"/>
    <library_versions>
        <library_version name="libavutil" major="55" minor="46" micro="100" version="3616356" ident="Lavu55.46.100"/>
        <library_version name="libavcodec" major="57" minor="75" micro="100" version="3754852" ident="Lavc57.75.100"/>
        <library_version name="libavformat" major="57" minor="66" micro="101" version="3752549" ident="Lavf57.66.101"/>
        <library_version name="libavfilter" major="6" minor="73" micro="100" version="412004" ident="Lavfi6.73.100"/>
        <library_version name="libswscale" major="4" minor="3" micro="101" version="263013" ident="SwS4.3.101"/>
    </library_versions>
    <frames>
        <frame media_type="video" stream_index="0" key_frame="1" pkt_pts="0" pkt_pts_time="0.0000000" pkt_duration_time="0.0333667" pkt_pos="36" pkt_size="337252" width="720" height="486" pix_fmt="yuv422p10le" pict_type="I">
            <tag key="lavfi.signalstats.YMIN" value="4"/>
            <tag key="lavfi.signalstats.YLOW" value="119"/>
            <tag key="lavfi.signalstats.YAVG" value="235.387"/>
            <tag key="lavfi.signalstats.YHIGH" value="460"/>
            <tag key="lavfi.signalstats.YMAX" value="861"/>
            <tag key="lavfi.signalstats.UMIN" value="368"/>
            <tag key="lavfi.signalstats.ULOW" value="471"/>
            <tag key="lavfi.signalstats.UAVG" value="500.972"/>
            <tag key="lavfi.signalstats.UHIGH" value="515"/>
            <tag key="lavfi.signalstats.UMAX" value="578"/>
            <tag key="lavfi.signalstats.VMIN" value="356"/>
            <tag key="lavfi.signalstats.VLOW" value="415"/>
            <tag key="lavfi.signalstats.VAVG" value="485.547"/>
            <tag key="lavfi.signalstats.VHIGH" value="513"/>
            <tag key="lavfi.signalstats.VMAX" value="530"/>
            <tag key="lavfi.signalstats.VDIF" value="0"/>
            <tag key="lavfi.signalstats.UDIF" value="0"/>
            <tag key="lavfi.signalstats.YDIF" value="0"/>
            <tag key="lavfi.signalstats.SATMIN" value="0"/>
            <tag key="lavfi.signalstats.SATLOW" value="2"/>
            <tag key="lavfi.signalstats.SATAVG" value="30.3061"/>
            <tag key="lavfi.signalstats.SATHIGH" value="108"/>
            <tag key="lavfi.signalstats.SATMAX" value="182"/>
            <tag key="lavfi.signalstats.HUEMED" value="44"/>
            <tag key="lavfi.signalstats.HUEAVG" value="136.591"/>
            <tag key="lavfi.signalstats.TOUT" value="0.00519547"/>
            <tag key="lavfi.signalstats.VREP" value="0"/>
            <tag key="lavfi.signalstats.BRNG" value="0.0266918"/>
            <tag key="lavfi.cropdetect.x1" value="0"/>
            <tag key="lavfi.cropdetect.x2" value="720"/>
            <tag key="lavfi.cropdetect.y1" value="0"/>
            <tag key="lavfi.cropdetect.y2" value="486"/>
            <tag key="lavfi.cropdetect.w" value="720"/>
            <tag key="lavfi.cropdetect.h" value="486"/>
            <tag key="lavfi.psnr.mse.v" value="0"/>
            <tag key="lavfi.psnr.mse.u" value="0"/>
            <tag key="lavfi.psnr.mse.y" value="0"/>
            <tag key="lavfi.psnr.psnr.v" value="0"/>
            <tag key="lavfi.psnr.psnr.u" value="0"/>
            <tag key="lavfi.psnr.psnr.y" value="0"/>
            <tag key="lavfi.ssim.All" value="0"/>
            <tag key="lavfi.ssim.V" value="0"/>
            <tag key="lavfi.ssim.U" value="0"/>
            <tag key="lavfi.ssim.Y" value="0"/>
            <tag key="lavfi.idet.single.bff" value="0"/>
            <tag key="lavfi.idet.single.tff" value="0"/>
            <tag key="lavfi.idet.single.progressive" value="0"/>
            <tag key="lavfi.idet.single.undetermined" value="0"/>
            <tag key="lavfi.idet.multiple.bff" value="0"/>
            <tag key="lavfi.idet.multiple.tff" value="0"/>
            <tag key="lavfi.idet.multiple.progressive" value="0"/>
            <tag key="lavfi.idet.multiple.undetermined" value="0"/>
            <tag key="lavfi.idet.repeated.bottom" value="0"/>
            <tag key="lavfi.idet.repeated.top" value="0"/>
            <tag key="lavfi.idet.repeated.neither" value="0"/>
            <tag key="pkt_duration_time" value="0.0333667"/>
            <tag key="pkt_size" value="337252"/>
        </frame>
        <frame media_type="video" stream_index="0" key_frame="0" pkt_pts="33.3667" pkt_pts_time="0.0333667" pkt_duration_time="0.0333667" pkt_pos="349576" pkt_size="336151" width="720" height="486" pix_fmt="yuv422p10le" pict_type="I">
            <tag key="lavfi.signalstats.YMIN" value="4"/>
            <tag key="lavfi.signalstats.YLOW" value="119"/>
            <tag key="lavfi.signalstats.YAVG" value="235.289"/>
            <tag key="lavfi.signalstats.YHIGH" value="459"/>
            <tag key="lavfi.signalstats.YMAX" value="874"/>
            <tag key="lavfi.signalstats.UMIN" value="376"/>
            <tag key="lavfi.signalstats.ULOW" value="471"/>
            <tag key="lavfi.signalstats.UAVG" value="500.745"/>
            <tag key="lavfi.signalstats.UHIGH" value="515"/>
            <tag key="lavfi.signalstats.UMAX" value="579"/>
            <tag key="lavfi.signalstats.VMIN" value="358"/>
            <tag key="lavfi.signalstats.VLOW" value="416"/>
            <tag key="lavfi.signalstats.VAVG" value="485.555"/>
            <tag key="lavfi.signalstats.VHIGH" value="513"/>
            <tag key="lavfi.signalstats.VMAX" value="539"/>
            <tag key="lavfi.signalstats.VDIF" value="2.93949"/>
            <tag key="lavfi.signalstats.UDIF" value="3.89837"/>
            <tag key="lavfi.signalstats.YDIF" value="7.6502"/>
            <tag key="lavfi.signalstats.SATMIN" value="0"/>
            <tag key="lavfi.signalstats.SATLOW" value="2"/>
            <tag key="lavfi.signalstats.SATAVG" value="30.3544"/>
            <tag key="lavfi.signalstats.SATHIGH" value="108"/>
            <tag key="lavfi.signalstats.SATMAX" value="175"/>
            <tag key="lavfi.signalstats.HUEMED" value="44"/>
            <tag key="lavfi.signalstats.HUEAVG" value="132.945"/>
            <tag key="lavfi.signalstats.TOUT" value="0.0051126"/>
            <tag key="lavfi.signalstats.VREP" value="0"/>
            <tag key="lavfi.signalstats.BRNG" value="0.0265947"/>
            <tag key="lavfi.cropdetect.x1" value="0"/>
            <tag key="lavfi.cropdetect.x2" value="720"/>
            <tag key="lavfi.cropdetect.y1" value="0"/>
            <tag key="lavfi.cropdetect.y2" value="486"/>
            <tag key="lavfi.cropdetect.w" value="720"/>
            <tag key="lavfi.cropdetect.h" value="486"/>
            <tag key="lavfi.psnr.mse.v" value="0"/>
            <tag key="lavfi.psnr.mse.u" value="0"/>
            <tag key="lavfi.psnr.mse.y" value="0"/>
            <tag key="lavfi.psnr.psnr.v" value="0"/>
            <tag key="lavfi.psnr.psnr.u" value="0"/>
            <tag key="lavfi.psnr.psnr.y" value="0"/>
            <tag key="lavfi.ssim.All" value="0"/>
            <tag key="lavfi.ssim.V" value="0"/>
            <tag key="lavfi.ssim.U" value="0"/>
            <tag key="lavfi.ssim.Y" value="0"/>
            <tag key="lavfi.idet.single.bff" value="0"/>
            <tag key="lavfi.idet.single.tff" value="0"/>
            <tag key="lavfi.idet.single.progressive" value="0"/>
            <tag key="lavfi.idet.single.undetermined" value="0"/>
            <tag key="lavfi.idet.multiple.bff" value="0"/>
            <tag key="lavfi.idet.multiple.tff" value="0"/>
            <tag key="lavfi.idet.multiple.progressive" value="0"/>
            <tag key="lavfi.idet.multiple.undetermined" value="0"/>
            <tag key="lavfi.idet.repeated.bottom" value="0"/>
            <tag key="lavfi.idet.repeated.top" value="0"/>
            <tag key="lavfi.idet.repeated.neither" value="0"/>
            <tag key="pkt_duration_time" value="0.0333667"/>
            <tag key="pkt_size" value="336151"/>
        </frame>
    </frames>
    <streams>
        <stream index="0" codec_name="ffv1" codec_long_name="FFmpeg video codec #1" codec_type="video" codec_time_base="100/2997" codec_tag_string="FFV1" codec_tag="0x31564646" width="720" height="486" coded_width="720" coded_height="486" has_b_frames="0" sample_aspect_ratio="10:11" display_aspect_ratio="400:297" pix_fmt="yuv422p10le" level="-99" field_order="bt" refs="1" r_frame_rate="2997/100" avg_frame_rate="2997/100" time_base="1/11988" start_pts="0" start_time="0.000000">
            <disposition default="1" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0" timed_thumbnails="0"/>
            <tag key="language" value="eng"/>
            <tag key="handler_name" value="DataHandler"/>
            <tag key="encoder" value="ffv1"/>
        </stream>
        <stream index="1" codec_name="pcm_s24le" codec_long_name="PCM signed 24-bit little-endian" codec_type="audio" codec_time_base="1/48000" codec_tag_string="in24" codec_tag="0x34326e69" sample_fmt="s32" sample_rate="48000" channels="2" channel_layout="stereo" bits_per_sample="24" r_frame_rate="0/0" avg_frame_rate="0/0" time_base="1/48000" start_pts="0" start_time="0.000000" bits_per_raw_sample="24">
            <disposition default="1" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0" timed_thumbnails="0"/>
            <tag key="language" value="eng"/>
            <tag key="handler_name" value="DataHandler"/>
        </stream>
    </streams>
    <format filename="/Users/davidrice/Desktop/Dave/qctools_dhc_samples/ffv1/DHC0386_Ghosting.mov_ffv1.mov" nb_streams="2" nb_programs="0" format_name="mov,mp4,m4a,3gp,3g2,mj2" format_long_name="QuickTime / MOV" start_time="0.000000" duration="10.678000" size="111637099" bit_rate="83638957" probe_score="100">
        <tag key="major_brand" value="qt  "/>
        <tag key="minor_version" value="512"/>
        <tag key="compatible_brands" value="qt  "/>
        <tag key="encoder" value="Lavf55.13.102"/>
    </format>
</ffprobe:ffprobe>

This provides much more info about the file as a whole than we had before (where it had been mostly about frames).

I think we need a design of what data to use and how to present it and then to integrate it into a file view. I suggest these values are relevant to include in display:

  • stream/@codec_name
  • stream/@codec_type
  • stream/@width (video)
  • stream/@height (video)
  • stream/@sample_aspect_ratio (video)
  • stream/@display_aspect_ratio (video)
  • stream/@pix_fmt (video)
  • stream/@field_order (video)
  • stream/@avg_frame_rate (video)
  • stream/@sample_rate (audio)
  • stream/@bits_per_raw_sample (audio)
  • stream/@channels (audio)
  • format/@filename
  • format/@format_log_name
  • format/@duration
  • format/@SiZe
  • format/@bit_rate

policy buttons

The buttons on the Policy page are a little wonky. There are two rename buttons, and they surround the rename field in an odd way. But I'm thinking it's better to just list the policies and their descriptions with an edit button. When they click through to edit, then they can rename, reset, or delete. Kinda like:

Dancing Banana | Flags files with high BRNG metrics | edit
Dave's Party House | Flags files with high saturation levels | edit
Kelly's TOUT Obsession | Self-explanatory | edit

And maybe also include a dropdown menu of all the groups so

Dancing Banana | Flags files with high BRNG metrics | edit | group to process

Thoughts? Bueller?

add permissions check on FILES_VOLUME_PATH

Initially my FILES_VOLUME_PATH values was set to drwxr-xr-x and signalserver produced many errors on upload. I changed to drwxrwxrwx and it worked, but I suggest adding a check somewhere for a minimal permissions on the FILES_VOLUME_PATH

add section on docker maintenance

Suggest adding a section to readme on cleanup and maintenace of docker:

from debugging earlier we used.

docker ps -a -q | xargs docker rm -f
docker images -a -q | wc -l
docker images -a -q | xargs docker rmi -f

create mockup for table view

Show file records in table to allow comparative evaluation.
Sortable per column.
Columns are defined by the applied summarization.

create group at point of upload

creating a group is a multi-step process: upload individual files, search for individual files that you just uploaded, create group

suggesting a more simplified approach:

choose to upload either a directory or individual files (as in MediaConch)
at the prompt, choose if you want to create a new group or add to an existing group

possibly the name of the directory can default as the new group name

Running locally with ./quickstart throws repeating error

Here is the warning and error:

WARNING: The FILES_VOLUME_PATH variable is not set. Defaulting to a blank string.
Creating volume "signalserver_dbdata" with default driver
Creating volume "signalserver_files" with default driver
ERROR: create .: volume name invalid: "." includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed

extra base.html file

Hey @yayoiukai

I see fileuploads/templates/base.html and it doesn't seem to be called anywhere -- seems to be the same as the higher-level base.html. Can I remove it?

sometimes toolbar options don't dropdown

I'm not certain in which cases this happens, but I still find instances where the dropdown lists for "Files" and "Account" don't actually drop down, which makes navigation a lot harder.

dynamically add filters to policy test config based on incoming qctools data

Presently the dropdowns list frame data from lavfi.cropdetect, lavfi,rebur128, etc, but when new qctools is uploading with new values, the list doesn't update, so it is not possible to make a configuration for metadata from qctools with new values. The filter dropdown on "Add/Delete Filter on Policies" should either update according to supplied data or have some place where the lavfi terms may be registered.

write text for the About page

There's a link to the About page, but it has no where to go. Kelly can you draft some text for an "About" page for SignalServer.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.