Difference between revisions of "License Properties"

From Creative Commons
Jump to: navigation, search
(Updated URLs to use HTTPS, where appropropriate)
 
(10 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{template:incomplete}}
+
In addition to the human readable license deeds and legal code, Creative Commons provides machine readable metadata for licenses.  This page describes how to begin with a license URI and map it to license properties.
  
In addition to the human readable license deeds and legal code, Creative Commons provides machine readable metadata for licensesThis page describes how to begin with a license URI and map it to license attributes.
+
License Properties describe the permissions, prohibitions and requirements of a license.  Permissions declare a permission given by the license, above and beyond what default copyright law allows.  Prohibitions prohibit a particular use of the work, specifically affecting the scope of the permissions provided by a permission.  Requirements describe actions required of user when making use of the permissions.
  
__TOC__
+
There are two ways to discover license properties given a license URI:
 +
* The "dumb" and easy way: [[#Inspecting the URL|Inspect the URL]].  This can be done with regular expressions or even simple string searching, but requires your code to bake in a little knowledge about CC license URI conventions, and will not work with possible future license URIs that do not follow these conventions (e.g., non-CC licenses that use CC style metadata). But this downside should be of little concern if all you want to do is discover CC licensed material and be able to remember and filter on high level properties such as whether commercial use or derviative works are prohibited.
 +
* The smart and hard way: [[#Using RDFa|Use RDFa]]. This allows you to discover properties for any license URI, including properties that may not be encoded in URI conventions. However, use of this method requires your code to use a RDFa parser.
  
== Attributes Overview ==
+
= Inspecting the URL =
  
License Attributes fall into one of three classes: permissions, prohibitions and requirements.  Permissions declare a permission given by the license, above and beyond what default copyright law allows. Prohibitions prohibit a particular use of the work, specifically affecting the scope of the permissions provided by a permission.  Requirements describe actions required of user when making use of the permissions.
+
Creative Commons license deed URLs, for version 4.0, have the following format:
  
A list of permissions, prohibitions and requirements defined by Creative Commons is available at http://creativecommons.org/ns.
+
  https://creativecommons.org/licenses/{license-properties}/{version}/
  
The machine-readable license metadata is described using [RDF]. Each type of attribute corresponds to a predicate:
+
Creative Commons license deed URLs, prior to version 4.0, have the following format:
  
* cc:permits
+
  https://creativecommons.org/licenses/{license-properties}/{version}/{jurisdiction}/
* cc:prohibits
 
* cc:requires
 
  
== Using RDFa ==
+
The jurisdiction is optional. For example:
  
[http://www.w3.org/2006/07/SWD/RDFa/ RDFa] is an editor's draft at W3 which describes a way to serialize [RDF] triples in HTML.  Creative Commons includes the appropriate RDFa When selecting a license from http://creativecommons.org/license to indicate that a page is licensed.  For example:
+
  https://creativecommons.org/licenses/by/3.0/
 +
 
 +
Is the URL for the Attribution 3.0 (Unported) license.  The license is Unported as there is no jurisdiction element present.  The Attribution 2.0 (France) license has the following URL:
 +
 
 +
  https://creativecommons.org/licenses/by/2.0/fr/
 +
 
 +
=== Mapping Individual Properties ===
 +
 
 +
The license properties portion of the URL is a sequence a letter codes separated by dashes ("-").  These map to the following license properties:
 +
 
 +
* '''by''': Attribution: Attribution is required with any reuse or redistribution, in the manner specified by the licensor.
 +
* '''nc''': [[NC|Non-Commercial]]: Commercial use is prohibited.
 +
* '''nd''': No Derivatives: Only verbatim reproduction is permitted.
 +
* '''sa''': Share-Alike: Derivative works are allowed, but must also be licensed under the same license.
 +
 
 +
=== Sample Code ===
 +
 
 +
<pre><nowiki>
 +
"""extract_simple.py
 +
 
 +
Command line sample to map a Creative Commons license URI to the properties
 +
it describes.  See http://wiki.creativecommons.org/License_Properties for
 +
details.
 +
 
 +
Example usage:
 +
 
 +
$ python extract_simple.py https://creativecommons.org/licenses/by/3.0/
 +
Attribution
 +
 
 +
$ python extract_simply.py https://creativecommons.org/licenses/by-nc/3.0/
 +
Attribution
 +
Non-Commercial
 +
 
 +
"""
 +
 
 +
import sys
 +
import urlparse
 +
 
 +
ATTRIBUTES = dict(
 +
    by = 'Attribution',
 +
    nc = 'Non-Commercial',
 +
    nd = 'No Derivatives',
 +
    sa = 'Share-Alike',
 +
    )
 +
 
 +
def parse(url):
 +
    """Return a sequence of attributes for the given license URL."""
 +
 
 +
    # get the path portion of the URL
 +
    path = urlparse.urlparse(url)[2]
 +
 
 +
    # extract the license code portion
 +
    pieces = path.split('/')
 +
    assert(pieces[1] == 'licenses')
 +
 
 +
    # split the individual codes
 +
    attribute_codes = pieces[2].split('-')
 +
 
 +
    return [ATTRIBUTES[n] for n in attribute_codes]
 +
 
 +
if __name__ == '__main__':
 +
 
 +
    print "\n".join(
 +
        parse(sys.argv[-1])
 +
        )
 +
</nowiki></pre>
 +
 
 +
=== Special Cases ===
 +
 
 +
==== Public Domain ====
 +
 
 +
  https://creativecommons.org/licenses/publicdomain/
 +
 
 +
For this URI, all of the properties above are false, but obviously the (implicit) properties of permitting distribution and derivative works are true.
 +
 
 +
==== Sampling (retired) ====
 +
 
 +
The [http://creativecommons.org/license/sampling Sampling Licenses] define specific permissions with respect to sampling a work.  The license URLs are
 +
 
 +
  https://creativecommons.org/licenses/sampling/1.0/ (retired)
 +
  https://creativecommons.org/licenses/sampling+/1.0/ (retired)
 +
  https://creativecommons.org/licenses/nc-sampling+/1.0/ (retired)
 +
 
 +
Many simple implementations may ignore these.
 +
 
 +
==== Source Code Licenses ====
 +
 
 +
Creative Commons provides metadata "wrappers" for some source code licenses.  These URLs are:
 +
 
 +
  https://creativecommons.org/licenses/MIT/
 +
  https://creativecommons.org/licenses/BSD/
 +
  https://creativecommons.org/licenses/GPL/2.0/
 +
  https://creativecommons.org/licenses/LGPL/2.1/
 +
 
 +
= Using RDFa =
 +
 
 +
[[RDFa]] is an editor's draft at W3 which describes a way to serialize [http://www.w3.org/RDF/ RDF] triples in HTML.  Creative Commons includes the appropriate RDFa When selecting a license from http://creativecommons.org/license to indicate that a page is licensed.  For example:
  
 
   &lt;a href="http://creativecommons.org/licenses/by/3.0/" '''rel="license"'''>Attribution 3.0</a>
 
   &lt;a href="http://creativecommons.org/licenses/by/3.0/" '''rel="license"'''>Attribution 3.0</a>
Line 25: Line 121:
 
The <code>rel="license"</code> attribute indicates that the link specified (the license URL in this case) has special semantic meaning.
 
The <code>rel="license"</code> attribute indicates that the link specified (the license URL in this case) has special semantic meaning.
  
With the license URI, an RDFa parser may be used to extract license attributes from the human readable deed.
+
With the license URI, an RDFa parser may be used to extract license attributes from the human readable deed. RDFa parsers are available for many languages, including Python ([[RdfaDict]], [http://rdflib.net rdflib]), Ruby ([http://code.google.com/p/ruby-rdfa/ ruby-rdfa]) and PHP ([http://www.avthasselt.sohosted.com/rdfamonkey/ RDFa Monkey]).
 +
 
 +
Passing the Attribution 3.0 Unported deed (http://creativecommons.org/licenses/by/3.0/) through an RDFa parser yields the following [http://www.w3.org/TR/rdf-concepts/#section-triples triples]:
 +
 
 +
  @prefix cc: <http://creativecommons.org/ns#> .
 +
  http://creativecommons.org/licenses/by/3.0/ cc:requires cc:Attribution .
 +
  http://creativecommons.org/licenses/by/3.0/ cc:requires cc:Notice .
 +
  http://creativecommons.org/licenses/by/3.0/ cc:permits cc:Reproduction .
 +
  http://creativecommons.org/licenses/by/3.0/ cc:permits cc:Distribution .
 +
  http://creativecommons.org/licenses/by/3.0/ cc:permits cc:DerivativeWorks .
 +
 
 +
For a complete list of Permissions, Prohibitions and Requirements defined by Creative Commons see http://creativecommons.org/ns.
 +
 
 +
== Sample Code ==
 +
 
 +
The following sample code uses [[RdfaDict]] to parse the license deed and prints the URIs for the license permissions, prohibitions and requirements.
 +
 
 +
<pre><nowiki>
 +
"""extract_rdfa.py
 +
 
 +
Command line sample to map a Creative Commons license URI to the properties
 +
it describes.  See http://wiki.creativecommons.org/License_Properties for
 +
details.
 +
 
 +
Example usage:
 +
 
 +
$ python extract_rdfa.py http://creativecommons.org/licenses/by/3.0/
 +
http://creativecommons.org/ns#Attribution
 +
http://creativecommons.org/ns#Notice
 +
http://creativecommons.org/ns#Reproduction
 +
http://creativecommons.org/ns#Distribution
 +
http://creativecommons.org/ns#DerivativeWorks
 +
 
 +
$ python extract_rdfa.py http://creativecommons.org/licenses/by-nc/3.0/
 +
http://creativecommons.org/ns#Attribution
 +
http://creativecommons.org/ns#Notice
 +
http://creativecommons.org/ns#CommercialUse
 +
http://creativecommons.org/ns#Reproduction
 +
http://creativecommons.org/ns#Distribution
 +
http://creativecommons.org/ns#DerivativeWorks
 +
 
 +
Requires rdfadict (http://python.org/pypi/rdfadict).
 +
"""
 +
 
 +
import sys
 +
import rdfadict
 +
 
 +
def parse(url):
 +
    """Return a sequence of attributes for the given license URL."""
 +
 
 +
    # parse the license deed and extract RDFa
 +
    rdf = rdfadict.RdfaParser().parseurl(url)
  
=== Additional Resources ===
+
    # return all predicates (merging requirements, prohibitions and permissions)
 +
    result = []
 +
    for predicate in rdf[url]:
 +
        for obj in rdf[url][predicate]:
 +
            result.append(obj)
  
 +
    return result
  
== "Simple" Mapping ==
+
if __name__ == '__main__':
  
If parsing the deed is not feasible, it is possible to infer attributes from the license URI.
+
    print "\n".join(
 +
        parse(sys.argv[-1])
 +
        )
 +
</nowiki></pre>
  
 
[[Category:Developer]]
 
[[Category:Developer]]
 
[[Category:Metadata]]
 
[[Category:Metadata]]

Latest revision as of 15:40, 27 May 2020

In addition to the human readable license deeds and legal code, Creative Commons provides machine readable metadata for licenses. This page describes how to begin with a license URI and map it to license properties.

License Properties describe the permissions, prohibitions and requirements of a license. Permissions declare a permission given by the license, above and beyond what default copyright law allows. Prohibitions prohibit a particular use of the work, specifically affecting the scope of the permissions provided by a permission. Requirements describe actions required of user when making use of the permissions.

There are two ways to discover license properties given a license URI:

  • The "dumb" and easy way: Inspect the URL. This can be done with regular expressions or even simple string searching, but requires your code to bake in a little knowledge about CC license URI conventions, and will not work with possible future license URIs that do not follow these conventions (e.g., non-CC licenses that use CC style metadata). But this downside should be of little concern if all you want to do is discover CC licensed material and be able to remember and filter on high level properties such as whether commercial use or derviative works are prohibited.
  • The smart and hard way: Use RDFa. This allows you to discover properties for any license URI, including properties that may not be encoded in URI conventions. However, use of this method requires your code to use a RDFa parser.

Inspecting the URL

Creative Commons license deed URLs, for version 4.0, have the following format:

 https://creativecommons.org/licenses/{license-properties}/{version}/

Creative Commons license deed URLs, prior to version 4.0, have the following format:

 https://creativecommons.org/licenses/{license-properties}/{version}/{jurisdiction}/

The jurisdiction is optional. For example:

 https://creativecommons.org/licenses/by/3.0/

Is the URL for the Attribution 3.0 (Unported) license. The license is Unported as there is no jurisdiction element present. The Attribution 2.0 (France) license has the following URL:

 https://creativecommons.org/licenses/by/2.0/fr/

Mapping Individual Properties

The license properties portion of the URL is a sequence a letter codes separated by dashes ("-"). These map to the following license properties:

  • by: Attribution: Attribution is required with any reuse or redistribution, in the manner specified by the licensor.
  • nc: Non-Commercial: Commercial use is prohibited.
  • nd: No Derivatives: Only verbatim reproduction is permitted.
  • sa: Share-Alike: Derivative works are allowed, but must also be licensed under the same license.

Sample Code

"""extract_simple.py

Command line sample to map a Creative Commons license URI to the properties
it describes.  See http://wiki.creativecommons.org/License_Properties for
details.

Example usage:

$ python extract_simple.py https://creativecommons.org/licenses/by/3.0/
Attribution

$ python extract_simply.py https://creativecommons.org/licenses/by-nc/3.0/
Attribution
Non-Commercial

"""

import sys
import urlparse

ATTRIBUTES = dict(
    by = 'Attribution',
    nc = 'Non-Commercial',
    nd = 'No Derivatives',
    sa = 'Share-Alike',
    )

def parse(url):
    """Return a sequence of attributes for the given license URL."""

    # get the path portion of the URL
    path = urlparse.urlparse(url)[2]

    # extract the license code portion
    pieces = path.split('/')
    assert(pieces[1] == 'licenses')

    # split the individual codes
    attribute_codes = pieces[2].split('-')

    return [ATTRIBUTES[n] for n in attribute_codes]

if __name__ == '__main__':

    print "\n".join(
        parse(sys.argv[-1])
        )

Special Cases

Public Domain

 https://creativecommons.org/licenses/publicdomain/

For this URI, all of the properties above are false, but obviously the (implicit) properties of permitting distribution and derivative works are true.

Sampling (retired)

The Sampling Licenses define specific permissions with respect to sampling a work. The license URLs are

 https://creativecommons.org/licenses/sampling/1.0/ (retired)
 https://creativecommons.org/licenses/sampling+/1.0/ (retired)
 https://creativecommons.org/licenses/nc-sampling+/1.0/ (retired)

Many simple implementations may ignore these.

Source Code Licenses

Creative Commons provides metadata "wrappers" for some source code licenses. These URLs are:

 https://creativecommons.org/licenses/MIT/
 https://creativecommons.org/licenses/BSD/
 https://creativecommons.org/licenses/GPL/2.0/
 https://creativecommons.org/licenses/LGPL/2.1/

Using RDFa

RDFa is an editor's draft at W3 which describes a way to serialize RDF triples in HTML. Creative Commons includes the appropriate RDFa When selecting a license from http://creativecommons.org/license to indicate that a page is licensed. For example:

 <a href="http://creativecommons.org/licenses/by/3.0/" rel="license">Attribution 3.0</a>

The rel="license" attribute indicates that the link specified (the license URL in this case) has special semantic meaning.

With the license URI, an RDFa parser may be used to extract license attributes from the human readable deed. RDFa parsers are available for many languages, including Python (RdfaDict, rdflib), Ruby (ruby-rdfa) and PHP (RDFa Monkey).

Passing the Attribution 3.0 Unported deed (http://creativecommons.org/licenses/by/3.0/) through an RDFa parser yields the following triples:

 @prefix cc: <http://creativecommons.org/ns#> .
 http://creativecommons.org/licenses/by/3.0/ cc:requires cc:Attribution .
 http://creativecommons.org/licenses/by/3.0/ cc:requires cc:Notice .
 http://creativecommons.org/licenses/by/3.0/ cc:permits cc:Reproduction .
 http://creativecommons.org/licenses/by/3.0/ cc:permits cc:Distribution .
 http://creativecommons.org/licenses/by/3.0/ cc:permits cc:DerivativeWorks .

For a complete list of Permissions, Prohibitions and Requirements defined by Creative Commons see http://creativecommons.org/ns.

Sample Code

The following sample code uses RdfaDict to parse the license deed and prints the URIs for the license permissions, prohibitions and requirements.

"""extract_rdfa.py

Command line sample to map a Creative Commons license URI to the properties
it describes.  See http://wiki.creativecommons.org/License_Properties for
details.

Example usage:

$ python extract_rdfa.py http://creativecommons.org/licenses/by/3.0/
http://creativecommons.org/ns#Attribution
http://creativecommons.org/ns#Notice
http://creativecommons.org/ns#Reproduction
http://creativecommons.org/ns#Distribution
http://creativecommons.org/ns#DerivativeWorks

$ python extract_rdfa.py http://creativecommons.org/licenses/by-nc/3.0/
http://creativecommons.org/ns#Attribution
http://creativecommons.org/ns#Notice
http://creativecommons.org/ns#CommercialUse
http://creativecommons.org/ns#Reproduction
http://creativecommons.org/ns#Distribution
http://creativecommons.org/ns#DerivativeWorks

Requires rdfadict (http://python.org/pypi/rdfadict).
"""

import sys
import rdfadict

def parse(url):
    """Return a sequence of attributes for the given license URL."""

    # parse the license deed and extract RDFa
    rdf = rdfadict.RdfaParser().parseurl(url)

    # return all predicates (merging requirements, prohibitions and permissions)
    result = []
    for predicate in rdf[url]:
        for obj in rdf[url][predicate]:
            result.append(obj)

    return result

if __name__ == '__main__':

    print "\n".join(
        parse(sys.argv[-1])
        )